Paperless-ngx: dokumentų skaitmeninimas

Kas tas Paperless-ngx ir kodėl verta domėtis?

Jei tavo namuose ar biure dar tebeguli krūvos popierinių sąskaitų, sutarčių, medicininių pažymų ir kitokių dokumentų – šis straipsnis kaip tik tau. Paperless-ngx yra atvirojo kodo dokumentų valdymo sistema, kuri leidžia nuskaityti, indeksuoti, ieškoti ir tvarkyti visus dokumentus vienoje vietoje. Ir visa tai – visiškai nemokamai, savo serveryje, be jokių debesų paslaugų prenumeratų.

Projektas gimė iš senesnio paperless projekto, kurį vėliau perėmė paperless-ng komanda, o dabar aktyviai palaikomas paperless-ngx bendruomenės. Tai ne koks nors šalutinis hobio projektas – repozitorijoje GitHub šiuo metu yra daugiau nei 20 000 žvaigždučių, o naujiniai išleidžiami reguliariai. Žmonės rimtai naudoja šį įrankį.

Pagrindinė idėja paprasta: tu nuskaitai dokumentą, sistema automatiškai atpažįsta tekstą (OCR), priskiria žymas, nustatoma data, ir viskas tampa ieškoma. Vietoj to, kad ieškotum 2021 metų vasario mėnesio elektros sąskaitos kokiame nors segtuve, tiesiog įrašai paieškos laukelyje „elektra 2021” ir sistema akimirksniu randa tai, ko reikia.

Techninė pusė: kaip tai veikia po gaubtu

Paperless-ngx veikia kaip web aplikacija, kurią gali paleisti savo serveryje ar net Raspberry Pi. Viduje naudojama Django (Python) kaip backend, Celery užduočių eilėms, Redis kaip tarpinė saugykla ir PostgreSQL arba SQLite duomenų bazei. Frontend parašytas Angular pagrindu.

Vienas svarbiausių komponentų – Tesseract OCR variklis, kuris atlieka tekstų atpažinimą. Paperless-ngx palaiko daugybę kalbų, įskaitant lietuvių, tad lietuviški dokumentai atpažįstami gana gerai, nors kartais su specifiniais šriftais gali kilti problemų.

Dokumentų apdorojimo pipeline’as atrodo maždaug taip:

  • Dokumentas patenka į stebimą aplanką (consume directory)
  • Sistema aptinka naują failą ir sukuria apdorojimo užduotį
  • Atliekamas OCR, jei dokumentas yra vaizdas arba neskanuotas PDF
  • Taikomi atitikimo taisyklės (correspondent, document type, tags)
  • Dokumentas išsaugomas duomenų bazėje ir faile
  • Originalus failas ištrinamas iš consume aplanko

Svarbu paminėti, kad sistema išsaugo originalų failą atskirai nuo apdoroto. Tai reiškia, kad net jei OCR suklydė ar kažkas nutiko su metaduomenimis, originalas visada lieka nepaliestais. Tai labai protingas sprendimas.

Diegimas su Docker – paprasčiausias kelias

Rekomenduojamas ir paprasčiausias būdas paleisti Paperless-ngx yra per Docker Compose. Oficialus repozitorijus pateikia paruoštus konfigūracijos failus, tad pradedantiesiems nereikia gilintis į Python virtualias aplinkas ar sistemines priklausomybes.

Pirmiausia reikia atsisiųsti docker-compose failą:

curl -O https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/docker-compose.postgres.yml
curl -O https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/.env.example
mv .env.example .env

Tada reikia pakoreguoti .env failą. Svarbiausi parametrai:

  • PAPERLESS_SECRET_KEY – ilgas atsitiktinis tekstas saugumui
  • PAPERLESS_TIME_ZONE – pvz., Europe/Vilnius
  • PAPERLESS_OCR_LANGUAGE – pvz., lit+eng lietuvių ir anglų kalboms
  • PAPERLESS_URL – tavo serverio adresas, pvz., https://docs.manonamai.lt

Po konfigūracijos paleidimas trivialus:

docker compose up -d

Pirmą kartą sistema atsisiųs visus reikalingus Docker image’us – tai gali užtrukti kelias minutes. Po paleidimo reikia sukurti administratoriaus paskyrą:

docker compose exec webserver createsuperuser

Ir viskas – sistema prieinama per naršyklę adresu http://localhost:8000. Jei diegei namų serveryje, verta sukonfigūruoti reverse proxy (nginx arba Caddy) ir HTTPS sertifikatą per Let’s Encrypt.

Dokumentų importavimas ir automatizavimas

Vienas didžiausių Paperless-ngx privalumų – lankstūs importavimo būdai. Galima naudoti kelis metodus priklausomai nuo situacijos.

Consume aplankas yra paprasčiausias būdas. Bet koks failas, nukopijuotas į šį aplanką, automatiškai apdorojamas. Galima sukonfigūruoti, kad tinklo skaitytuvas tiesiogiai siųstų failus į šį aplanką per SMB arba FTP. Daugelis biuro skaitytuvų palaiko tokią funkciją.

Web upload – tiesiog vilk ir mesk failus į naršyklės sąsają. Veikia su PDF, PNG, JPG, TIFF ir kitais formatais. Galima įkelti kelis failus vienu metu.

Email importavimas – viena iš naudingesnių funkcijų. Galima sukonfigūruoti, kad sistema stebėtų tam tikrą el. pašto dėžutę ir automatiškai importuotų priedus. Pavyzdžiui, jei bankas siunčia sąskaitas el. paštu – galima sukurti atskirą el. pašto adresą, nukreipti ten visas sąskaitas, ir jos automatiškai atsidurs sistemoje.

Konfigūruojant el. pašto importavimą, galima nustatyti filtrus pagal siuntėją, temą ar priedų pavadinimus. Taip pat galima nurodyti, ką daryti su el. laiškais po importavimo – ištrinti, pažymėti kaip perskaitytus ar palikti nepaliestus.

API importavimas – Paperless-ngx turi REST API, tad galima integruoti su bet kokia kita sistema. Pavyzdžiui, galima parašyti paprastą skriptą, kuris kiekvieną naktį tikrina tam tikrą aplanką ir importuoja naujus failus su specifiniais metaduomenimis.

Žymų sistema ir automatinis klasifikavimas

Čia prasideda tikrasis Paperless-ngx magija. Sistema leidžia sukurti tris pagrindinius klasifikavimo elementus: Correspondents (siuntėjai/gavėjai), Document Types (dokumentų tipai) ir Tags (žymos). Kiekvienas dokumentas gali turėti vieną siuntėją, vieną tipą ir daug žymų.

Tačiau rankinis klasifikavimas greitai tampa nuobodus. Todėl Paperless-ngx turi du automatizavimo mechanizmus:

Matching rules – taisyklės, pagrįstos teksto atitikimu. Galima nurodyti, kad jei dokumento tekste yra žodis „Lietuvos Energija”, automatiškai priskirti siuntėją „Lietuvos Energija” ir žymą „Komunalinės paslaugos”. Atitikimas gali būti tikslus, dalinis, reguliariosios išraiškos pagrindu arba fuzzy (apytikslis).

Machine learning klasifikavimas – sistema gali mokytis iš tavo ankstesnių klasifikavimo sprendimų. Kai suklasifikuoji pakankamai dokumentų rankiniu būdu, sistema pradeda automatiškai siūlyti arba net priskirti klasifikavimą naujiems dokumentams. Tai ypač naudinga, kai turi daug panašių dokumentų iš tų pačių siuntėjų.

Praktinis patarimas: pradžioje sukurk aiškią žymų hierarchiją. Pavyzdžiui:

  • Finansai → Sąskaitos, Banko išrašai, Mokesčiai
  • Medicina → Receptai, Pažymos, Tyrimų rezultatai
  • Nekilnojamas turtas → Sutartys, Draudimas, Komunalinės
  • Darbas → Darbo sutartis, Atostogų prašymai, Pažymos

Nereikia kurti per daug smulkių žymų iš karto – geriau pradėti nuo platesnių kategorijų ir smulkinti, kai pamatai realų poreikį.

Paieška ir dokumentų peržiūra

Paperless-ngx naudoja Whoosh arba Elasticsearch (pasirenkama) pilno teksto paieškai. Standartinė Whoosh paieška daugumai namų vartotojų visiškai pakanka, tačiau jei turi tūkstančius dokumentų ir nori greitesnės paieškos, verta perjungti į Elasticsearch.

Paieška palaiko:

  • Paprastą tekstinę paiešką
  • Loginius operatorius (AND, OR, NOT)
  • Paiešką pagal laukus (correspondent:Sodra)
  • Datos filtrus (created:[2023-01-01 TO 2023-12-31])
  • Pakaitos simbolius (sąskait* ras ir „sąskaita”, ir „sąskaitos”)

Dokumentų peržiūros sąsaja yra tikrai patogi. PDF dokumentai rodomi tiesiai naršyklėje su OCR teksto sluoksniu, tad galima pažymėti ir kopijuoti tekstą net iš nuskanuotų dokumentų. Tai labai naudinga, kai reikia greitai nukopijuoti sąskaitos numerį ar sumą.

Taip pat galima sukurti Saved Views – išsaugotas paieškos užklausas su specifiniais filtrais. Pavyzdžiui, galima sukurti rodinį „Šių metų sąskaitos” arba „Neklasifikuoti dokumentai”, kuris visada rodo atitinkamus dokumentus.

Saugumas ir atsarginės kopijos

Kadangi Paperless-ngx saugo potencialiai jautrius dokumentus, saugumas yra kritiškai svarbus. Keletas esminių rekomendacijų:

Niekada nepalik sistemos atvirai internete be HTTPS ir stipraus slaptažodžio. Jei nori prieigos iš išorės, geriausia naudoti VPN (pvz., WireGuard) arba bent jau dviejų faktorių autentifikaciją. Paperless-ngx palaiko TOTP (Google Authenticator tipo) 2FA.

Atsarginių kopijų strategija turėtų apimti du komponentus:

  1. Duomenų bazė – reguliariai eksportuok su document_exporter komanda. Tai sukuria JSON failą su visais metaduomenimis.
  2. Medijos aplankas – čia saugomi visi originalūs ir apdoroti failai. Šį aplanką reikia įtraukti į įprastą backup strategiją.

Praktiškai galima naudoti tokį skriptą, kuris kasdien sukuria backup:

#!/bin/bash
DATE=$(date +%Y%m%d)
docker compose exec webserver document_exporter /tmp/export
docker cp paperless-webserver-1:/tmp/export /backup/paperless-$DATE
tar -czf /backup/paperless-$DATE.tar.gz /backup/paperless-$DATE
rm -rf /backup/paperless-$DATE

Dar vienas svarbus dalykas – šifravimas. Jei serveris yra fiziškai prieinamas kitiems žmonėms, verta apsvarstyti disko šifravimą (LUKS Linux sistemose). Pats Paperless-ngx failų šifravimo neatlieka.

Nuo popierių krūvos iki skaitmeninio archyvo – ar verta?

Po kelių metų naudojimo galima drąsiai pasakyti – taip, verta. Bet reikia būti sąžiningam: pradžia reikalauja investicijų. Pirmąsias kelias savaites teks nuskaityti visus senus dokumentus, sukurti klasifikavimo sistemą, sukonfigūruoti automatines taisykles. Tai nėra greitas procesas.

Tačiau kai sistema veikia ir dokumentai teka automatiškai – tai tikras malonumas. Elektros sąskaita atėjo el. paštu? Sistema automatiškai ją importuoja, priskiria siuntėją „Ignitis”, žymą „Sąskaitos” ir tipą „Komunalinės paslaugos”. Reikia pateikti banko išrašą draudimo kompanijai? Paieška, atsisiuntimas, išsiuntimas – 30 sekundžių.

Ypač vertinga tai, kad sistema yra self-hosted. Tavo dokumentai nesiunčiami į jokius trečiųjų šalių serverius, nėra prenumeratos mokesčių, nėra rizikos, kad paslauga bus uždaryta. Viskas tavo rankose.

Žinoma, yra ir trūkumų. Mobiliosios programėlės nėra oficialios (yra trečiųjų šalių sprendimai kaip Paperless Mobile), OCR kartais klysta su sudėtingais šriftais ar blogos kokybės nuskaitymais, o pradinė konfigūracija gali atrodyti sudėtinga žmonėms, neturintiems techninės patirties su Docker.

Jei esi IT entuziastas, turintis namų serverį ar net paprastą Raspberry Pi 4 – Paperless-ngx yra vienas tų projektų, kuriuos įdiegęs greitai pradedi stebėtis, kaip anksčiau gyvenai be jo. O jei dar neturi namų serverio, bet domina savarankiškai valdomos paslaugos – Paperless-ngx gali būti puiki priežastis pradėti.

Daugiau

PM2.5 matavimas namuose: oro kokybės jutikliai