Halo Sobat Online! Pernah tidak, struk belanja menumpuk di laci, faktur tercecer di berbagai folder, dan waktu butuh satu lembar dokumen penting kita harus membongkar semuanya? Menaruh Paperless-ngx di VPS adalah jalan keluarnya: setiap hasil scan diubah menjadi arsip digital yang teksnya bisa dicari, diberi label otomatis, dan bisa dibuka dari HP kapan saja. Yang kita perlukan cuma Docker Compose dan beberapa menit untuk menyalakannya.
Analogi gampangnya begini: bayangkan kita punya lemari arsip yang bisa bicara. Kita menyodorkan kertasnya, lemari itu membaca isinya, menempelkan label (tanggal, jenis dokumen, pengirim), lalu menyimpannya rapi. Ketika kita bertanya “mana faktur bulan Maret?”, jawabannya muncul dalam hitungan detik — bukan setelah mengaduk satu dus penuh kertas.
Kenapa Paperless-ngx di VPS Cocok Jadi Arsip Digital Pribadi?
- OCR dan pencarian teks penuh. Paperless-ngx memakai OCRmyPDF dan Tesseract supaya PDF hasil scan punya lapisan teks. Artinya kita bisa mencari isi dokumen, bukan cuma nama filenya.
- Klasifikasi otomatis. Setelah beberapa dokumen masuk, sistem belajar mencocokkan koresponden, jenis dokumen, dan tag — dokumen baru langsung diberi label yang mirip dengan yang lama.
- Satu tempat untuk semuanya. Struk, faktur, kontrak, dan surat pajak tersimpan dalam satu antarmuka web, lengkap dengan pratinjau PDF.
- VPS selalu menyala dan penyimpanannya lega. Kita tidak bergantung pada laptop yang kadang mati, dan kapasitas disk VPS jauh lebih mudah ditambah daripada memori HP.
- Gratis dan open-source. Tidak ada batas jumlah dokumen dan tidak ada langganan bulanan.
Yang Perlu Disiapkan
- VPS Linux — Ubuntu 22.04/24.04 atau Debian 12. OCR itu pekerjaan yang rakus CPU, jadi minimal 2 vCPU dan 4 GB RAM supaya proses scan tidak menggantung. Disk 20 GB sudah cukup untuk ribuan halaman.
- Docker dan Docker Compose yang sudah terpasang. Cek dengan
docker --versiondandocker compose version. - Akses root atau sudo ke VPS tersebut.
- Opsional tapi sangat disarankan: satu subdomain (misalnya
arsip.domainku.com) supaya panelnya bisa diakses lewat HTTPS.
Langkah 1: Unduh Berkas Docker Compose Resmi
Paperless-ngx menyediakan berkas bawaan di repositori resminya. Kita unduh varian PostgreSQL karena lebih stabil untuk koleksi dokumen yang besar:
sudo mkdir -p /opt/paperless && cd /opt/paperless
sudo curl -LO https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/docker-compose.postgres.yml
sudo mv docker-compose.postgres.yml docker-compose.yml
sudo curl -LO https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/docker-compose.env
sudo curl -LO https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/.env
Tiga berkas itu punya tugas masing-masing:
docker-compose.yml— mendefinisikan tiga container:webserver(aplikasi Paperless-ngx),db(PostgreSQL 18), danbroker(Valkey 9, otaknya antrean tugas).docker-compose.env— isi konfigurasi aplikasi..env— nama proyek Compose, yang memengaruhi nama volume.
Perhatikan baris ports: "8000:8000" pada service webserver. Port itu yang nanti kita lindungi di belakang reverse proxy.
Langkah 2: Isi Konfigurasi di docker-compose.env
Buka berkasnya, lalu sesuaikan bagian berikut:
USERMAP_UID=1000
USERMAP_GID=1000
PAPERLESS_SECRET_KEY=ganti-dengan-kunci-acak-panjang
PAPERLESS_TIME_ZONE=Asia/Jakarta
PAPERLESS_OCR_LANGUAGES=ind
PAPERLESS_OCR_LANGUAGE=ind
PAPERLESS_URL=https://arsip.domainku.com
PAPERLESS_ADMIN_USER=admin
PAPERLESS_ADMIN_PASSWORD=ganti-dengan-password-kuat
Penjelasan singkat tiap baris:
USERMAP_UIDdanUSERMAP_GID— samakan dengan hasilid -udanid -gdi VPS supaya folderconsumebisa ditulis oleh user kita maupun container.PAPERLESS_SECRET_KEY— kunci untuk menandatangani sesi login. Buat yang acak, misalnya denganopenssl rand -hex 32.PAPERLESS_TIME_ZONE— biar tanggal dokumen mengikuti waktu kita, bukan UTC.PAPERLESS_ADMIN_USERdanPAPERLESS_ADMIN_PASSWORD— kalau diisi, superuser dibuat otomatis saat container pertama kali jalan, jadi kita tidak perlu menyentuh terminal lagi.
Mengaktifkan OCR Bahasa Indonesia
Tesseract memakai kode bahasa tiga huruf, dan Bahasa Indonesia kodenya ind. Ada satu jebakan yang sering bikin dokumen berbahasa Indonesia hasilnya berantakan: image container secara bawaan hanya membawa paket Inggris, Jerman, Italia, Spanyol, dan Prancis.
Karena itu PAPERLESS_OCR_LANGUAGES=ind wajib diisi di samping PAPERLESS_OCR_LANGUAGE=ind. Baris pertama menyuruh container memasang paket bahasanya, baris kedua menentukan bahasa yang dipakai saat OCR. Kalau hanya mengisi PAPERLESS_OCR_LANGUAGE, OCR-nya akan gagal karena paketnya tidak ada. Boleh juga digabung, misalnya ind+eng, tapi ingat: makin banyak bahasa, makin boros CPU.
Satu hal lagi soal keamanan: berkas ini menyimpan password, jadi batasi izinnya dengan sudo chmod 600 docker-compose.env.
Langkah 3: Nyalakan Container
Sekarang saatnya menjalankan semuanya:
cd /opt/paperless
sudo docker compose pull
sudo docker compose up -d
sudo docker compose logs -f webserver
Saat pertama kali jalan, container akan mengunduh paket bahasa Indonesia dulu, jadi prosesnya lebih lama dari biasanya. Tunggu sampai log berhenti di baris kesiapan, lalu keluar dari log dengan Ctrl+C (container-nya tetap hidup).
Cek statusnya:
sudo docker compose ps
Buka http://IP-VPS:8000 di browser. Karena PAPERLESS_ADMIN_USER sudah diisi, kita bisa langsung login — kalau tidak, halaman pertama akan meminta kita membuat akun superuser lewat antarmuka web.
Langkah 4: Masukkan Dokumen Pertama
Di dalam folder /opt/paperless ada direktori consume. Semua berkas yang muncul di sana (PDF, JPG, atau PNG) diproses otomatis:
cp ~/scan/struk-januari.pdf /opt/paperless/consume/
Beberapa detik kemudian, dokumen itu muncul di antarmuka web dengan teks yang sudah bisa dicari. Beberapa catatan praktis:
- Hasil olahan disimpan di folder
media, sedangkan data aplikasi ada di volume Dockerdatadanpgdata. - Kalau folder
consumeditaruh di NFS (yang tidak mendukung inotify), setPAPERLESS_CONSUMER_POLLING=truesupaya Paperless-ngx memantau folder dengan cara polling. - Selain folder consume, dokumen bisa masuk lewat email, API unggah (
/api/documents/post_document/), dan aplikasi klien pihak ketiga yang memakai API resmi tersebut.
Langkah 5: Jangan Biarkan Port 8000 Terbuka
Arsip dokumen itu isinya sensitif. Sebelum diakses dari luar rumah, taruh webserver di balik reverse proxy dengan HTTPS, lalu isi PAPERLESS_URL sesuai domain yang dipakai. Terakhir, tutup port 8000 di firewall:
sudo ufw deny 8000
Kalau hanya untuk keluarga sendiri, alternatif paling aman adalah mengaksesnya lewat VPN atau tunnel tanpa membuka port sama sekali.
Merawat Arsip: Backup dan Update
Backup aplikasi cukup satu perintah, karena document exporter menyalin dokumen, thumbnail, metadata, dan isi basis data sekaligus:
sudo docker compose exec -T webserver document_exporter ../export
Hasilnya ada di folder export dan bersifat inkremental, jadi aman dijalankan rutin. Untuk PostgreSQL, kita bisa menambah cadangan logis:
sudo docker compose exec -T db pg_dump -U paperless -d paperless -Fc > paperless.dump
Dua catatan penting: ekspor dari satu versi tidak bisa diimpor ke versi Paperless-ngx yang berbeda, dan API token tidak ikut tersalin sehingga harus dibuat ulang setelah restore. Untuk update, urutannya selalu backup dulu, baru:
sudo docker compose pull && sudo docker compose up -d
Kalau VPS-nya pas-pasan, ada beberapa setelan penghemat yang berguna: PAPERLESS_OCR_PAGES=1 (hanya halaman pertama yang di-OCR) dan PAPERLESS_WEBSERVER_WORKERS=1.
Kesimpulan
Merapikan dokumen tidak lagi berarti membeli lemari besi baru atau berlangganan penyimpanan awan. Dengan Paperless-ngx di VPS, tumpukan kertas berubah jadi arsip digital yang bisa dicari, diberi label otomatis, dan sepenuhnya milik kita sendiri — tanpa biaya bulanan.
Mulailah dari yang kecil: pasang lewat Docker Compose, masukkan 10 dokumen terpenting, dan rasakan sendiri bedanya saat mencari satu struk di antara ratusan. Selamat mencoba, dan semoga arsip digitalmu makin rapi setiap hari!

