Upstream repo: https://github.com/paperless-ngx/paperless-ngx
Paperless-ngx is a community-supported document management system: scan, index, and archive all your documents. This StartOS package bundles the official upstream image with a sidecar Redis broker, manages the admin account through a set/reset password action, and exposes the web UI as a StartOS interface.
| Property | Value |
|---|---|
| Paperless image | ghcr.io/paperless-ngx/paperless-ngx:2.20.15 |
| Redis image | redis:8-alpine |
| Architectures | x86_64, aarch64 |
| Entrypoint | Upstream /init (s6-overlay supervises web, worker, schedule) |
| Web port | 8000 (internal) |
| Database | SQLite (default — no external DB dependency) |
A single main volume holds all persistent state, with these subpaths mounted into the Paperless container:
| Subpath | Mountpoint | Purpose |
|---|---|---|
data |
/usr/src/paperless/data |
SQLite DB, search index, classifier model |
media |
/usr/src/paperless/media |
Stored documents and thumbnails |
consume |
/usr/src/paperless/consume |
Watched folder (not user-reachable yet — see Limitations) |
export |
/usr/src/paperless/export |
Document exporter output |
store.json |
(read by package code) | Generated secret key + admin password set via action |
Redis runs in an ephemeral subcontainer with persistence disabled — task state is regenerated on restart.
- Install the package. The install hook (
seedStore) generates a randomPAPERLESS_SECRET_KEYintostore.json; no admin password exists yet. - The init watcher (
watchCredentials) surfaces a critical task pointing at the Set Admin Password action whenever no password is stored. - Start the service. On first boot the container runs migrations and creates the database — but no superuser (the upstream env-based
manage_superuserpath is unused; it is create-only and cannot rotate, see below). - Run Set Admin Password. The action spins up a temporary subcontainer, creates-or-updates the
adminsuperuser viamanage.py shell(set_password), stores the password instore.json(which clears the task), and displays the credentials. Re-running it any time rotates the password — the same action covers first-set and reset.
| Action ID | What it does |
|---|---|
set-admin-password |
Generate and apply a new password for the admin superuser; first-set and reset. Errors with guidance if run before the database has been initialized (first start). |
A single ui interface (Web UI) binds the internal port 8000 over HTTP. StartOS handles TLS termination via its reverse proxy.
PAPERLESS_ALLOWED_HOSTS=* and PAPERLESS_CSRF_TRUSTED_ORIGINS / PAPERLESS_CORS_ALLOWED_HOSTS are computed from the interface's hostnames so login works across LAN, Tor, and clearnet.
| Daemon | Check |
|---|---|
redis |
TCP listen on port 6379 |
paperless |
TCP listen on port 8000 (120 s grace) |
The paperless daemon requires: ['redis'], so the broker is up before the web app starts.
- The package uses SQLite, not PostgreSQL. Suitable for personal archives; large libraries should consider Postgres (not yet packaged here).
- Redis runs as an in-package sidecar, not as a separate StartOS service.
- Gotenberg and Tika (optional document preprocessors for non-PDF formats) are not bundled.
- The watched
consume/folder is mounted but there is no user-facing way to place files in it on StartOS yet (no SMB/file-manager access to service volumes). Document ingestion happens via web upload, the API, or Paperless-ngx's built-in mail fetcher. A File Browser dependency mount (the jellyfin/audiobookshelf pattern) is the candidate future integration — seeTODO.md.
The main volume is included in StartOS backups, which covers documents, the search index, the database, and generated credentials.