Skip to main content
Arct Cloud provides the unmanaged Linux VPS for this deployment. Paperless-ngx is not preinstalled or managed by Arct Cloud, and you are responsible for the application, document privacy, backups, security, and updates.
Paperless-ngx stores potentially sensitive documents. Keep its application port private, require HTTPS, use strong account credentials, and maintain encrypted off-server backups.

Choose a Plan

Paperless-ngx does not publish a single minimum VPS size. OCR speed and memory use vary with document length, image resolution, language packs, concurrent workers, and optional services. These are Arct recommendations rather than upstream requirements. Review current resources on the Arct Cloud pricing page and leave capacity for originals, archived PDFs, thumbnails, the database, Redis, and exports.

Before You Begin

Prepare the following:
  • A fresh Ubuntu 24.04 server
  • A domain or subdomain such as documents.example.com
  • An A record pointing that hostname to the server’s public IPv4 address
  • Docker Engine with the Docker Compose plugin, installed from the official Docker repository
  • A reverse proxy such as Caddy or Nginx
Paperless-ngx supports several installation routes. This guide uses the project’s official PostgreSQL Compose template and manual Compose flow so the port, database password, and application secret can be secured before any container starts.

Install Paperless-ngx

1

Deploy and Connect

2

Allow the Ubuntu User to Run Docker

After installing Docker Engine and the Compose plugin from Docker’s official Ubuntu repository, add the default Ubuntu user to the Docker group:
Reconnect so the group membership takes effect, then verify Docker and Compose work without sudo:
The docker group grants effective root access through privileged containers and host mounts. Add only trusted administrator accounts.
3

Download the Official Compose Templates

Create the application directory and download the three files from Paperless-ngx’s official PostgreSQL Compose example:
Review these files and compare their URLs with the current official setup documentation before continuing.
4

Secure the Template Before First Start

Patch the official template while it is still offline. This binds Paperless to loopback, replaces the template PostgreSQL password, and passes the same password to the webserver:
Generate separate database and application secrets, configure the public URL, and lock both environment files to the current user:
Validate the security-critical changes before pulling or starting anything:
Do not run docker compose up unless every validation above succeeds. The upstream template’s unmodified 8000:8000 mapping publishes the first-login screen on every network interface.
5

Start the Private Stack and Create the Superuser

Only after the loopback and secret checks pass, start the stack and create the initial superuser from the server terminal:
From a second terminal on your local computer, tunnel to the loopback-only service:
Open http://127.0.0.1:8000, sign in with the superuser, and verify the private installation. Stop the tunnel with Ctrl+C after the check.
6

Enable HTTPS

Install Caddy using its official Debian and Ubuntu instructions, then add this block to /etc/caddy/Caddyfile:
7

Verify and Harden the Account

Open https://documents.example.com and sign in with the superuser created privately. Create a non-superuser account for routine document work, restrict user permissions, and keep the superuser for administration only.

Firewall and OCR Controls

Allow SSH before enabling UFW:
Do not expose Paperless port 8000, PostgreSQL, or Redis publicly. For limited servers, reduce concurrent workers, avoid unnecessary OCR language packs, keep PAPERLESS_OCR_MODE at its default, and consider limiting OCR pages or image-cleaning work according to the upstream low-resource guidance.

Back Up and Restore

Pause new document consumption before exporting. The official exporter includes documents, thumbnails, metadata, settings, and database content in the Compose export directory. Keep that directory mode 0700 and require it to be empty so old plaintext exports are not mixed into a new recovery set:
Encrypt the export and deployment configuration before it leaves the VPS. The example below uses an age recipient public key; keep the matching private identity off the Paperless server:
Copy only the .age file to off-server storage and compare its SHA-256 hash at the destination. After the remote copy is verified, remove the short-lived local plaintext, local encrypted staging file, metadata file, and exporter output:
Unlinking files cannot guarantee physical erasure on SSD storage, so use encrypted storage and keep plaintext retention as short as possible. API tokens are not included and must be created again after a restore. Exports are version-specific; the encrypted archive includes the exact webserver image metadata and the protected Compose environment files used for that backup. Restore with the official document_importer into an empty installation running a compatible version. Review the backup and restore documentation and test the full procedure before relying on it.

Update Safely

Read the release notes and any referenced migration guide. Stop consumption, create an off-server export, then update the Compose deployment:
Container startup applies database migrations. Do not interrupt migrations or attempt a downgrade against a migrated database; restore a compatible pre-update backup instead.

Troubleshooting

Official Resources

Paperless-ngx Setup

Official installation routes, Compose templates, and low-resource guidance.

Paperless-ngx on GitHub

Source code, releases, issues, and security policy.
Paperless-ngx is developed independently of Arct Cloud. Arct Cloud is an independent infrastructure provider and is not affiliated with, sponsored by, or endorsed by the Paperless-ngx project.