Repository navigation
Self host with Dokploy
Run Dossier on a Dokploy server: an application from the published image, next to a Dokploy PostgreSQL database. Dokploy's Traefik serves it over HTTPS, and each update only takes over once the new version is healthy. These steps are for Dokploy 0.30.
- A Dokploy server. To start one, see Dokploy's installation guide.
- 4 GB of memory is safer: Dokploy itself needs 2 GB, and Dossier about 1 GB. The server needs an Intel or AMD processor (x86-64), since the image isn't built for ARM. A local model needs much more: see Get a VPS in the README.
-
A domain name, such as
dossier.example.com, with a DNSArecord pointing at the server.
In your project, choose Create Service → Database → PostgreSQL and fill in:
-
Name:
dossier-db -
Database Name:
dossier -
Database User:
dossier - Database Password: leave it empty, and Dokploy makes a random one. If you type your own, use only letters and digits: the connection address below doesn't escape other characters.
-
Docker image:
postgres:18, the default.
Create it, then press Deploy on its page. Under its internal credentials, copy the Internal Connection URL, postgresql://dossier:…@…:5432/dossier, for step 3. Leave its external port empty, so it isn't reachable from outside.
Choose Create Service → Application, named dossier. In its General tab, pick the Docker provider, enter ghcr.io/aientech/dossier:latest as the Docker Image (or a version, such as ghcr.io/aientech/dossier:v1.6.0, to upgrade only when you choose) and save. The image is public, so the registry fields stay empty.
Dossier takes a hash of the password you'll sign in with, never the password itself. On the server, or anywhere with Docker, run this and type your password twice; it prints one line that starts with argon2id::
docker run --rm -it ghcr.io/aientech/dossier hash-passwordIn the Environment tab, enter these and save:
DATABASE_URL=<the Internal Connection URL from step 1>
DOSSIER_SECRET=<32 or more random characters>
DOSSIER_PASSWORD=<the line hash-password printed>
TZ=<your time zone, such as Europe/Berlin>
openssl rand -base64 32 makes a secret. Every variable, TZ included, is in Environment variables in the README.
In the Advanced tab:
-
Volumes: press Add Volume, choose Volume Mount, and enter the volume name
dossier-dataand the mount path/data. Nightly backups and zipped PDFs go there. -
Resources: set Memory Limit to
1073741824(1 GB, in bytes), which leaves room for the Chromium that prints PDFs. - Replicas: leave it at 1. Dossier runs its nightly backups, AI tasks and PDF printing inside its own process, so a second copy would do some of it twice.
- Run Command: leave it empty. It replaces Dossier's own start command, which applies the database migrations.
You don't need to change the Swarm settings. Dokploy starts the new version before it stops the old one, sends it traffic only once the image's health check passes, and goes back to the old one if it doesn't come up (for example when a migration fails).
In the Domains tab, press Add Domain and enter:
-
Host: your domain, such as
dossier.example.com -
Path:
/ -
Container Port:
3000 - HTTPS: on, with Let's Encrypt as the certificate provider
Traefik sets the headers Dossier relies on (X-Forwarded-Proto, and the visitor's address added to X-Forwarded-For), so leave Ports in the Advanced tab empty: requests that skip Traefik could set those headers themselves.
Press Deploy in the General tab. On every start, Dossier applies the database migrations and loads its built-in themes before it serves; the Logs tab shows each step.
Open your domain and sign in. Then pick an AI model in Settings → AI provider (see Choosing an AI provider) and, if you like, a job source in Settings → Job search (see Choosing a job source).
With a local model, your profile and documents never leave your server. Ollama can run as a second application:
-
Create Service → Application, named
ollama. Note its App Name, which Dokploy fills in when you create it: other services reach it by that name. -
General: the Docker provider, with the image
ollama/ollama:0.34.4. -
Advanced: a volume mount
ollama-modelsat/root/.ollama, so models survive updates, and a Memory Limit of8589934592(8 GB, forqwen2.5:7b). Give it no domain. -
Deploy it, then press Open Terminal in its General tab and pull a model:
ollama pull qwen2.5:7b
-
In Dossier, open Settings → AI provider → Local model, set the server address to
http://<the Ollama App Name>:11434, pick the model and press Test connection.
Which model to pick, and how fast it is: Local model with Ollama.
-
Change a setting: edit it in the Environment tab, save, then press Deploy.
-
Upgrade: take an export and a database dump first (see Back up), then press Deploy: Dokploy pulls the image again, so
latestbrings the newest release. If you pinned a version, change the Docker Image to the new one first. See Upgrading. -
Back up: export from Settings → Your data, and take database dumps. Dokploy can dump the database on a schedule to S3-compatible storage, in its Backups tab. To take one by hand, find the containers with
docker ps --format '{{.Names}}'on the server (each name starts with its service's App Name), then:docker exec <the database's container> pg_dump -U dossier -Fc dossier > dossier.dump docker cp <Dossier's container>:/data/backups ./backups
To restore a dump, press Stop on Dossier's General tab, load the dump, then press Deploy:
docker exec -i <the database's container> pg_restore --clean --if-exists -U dossier -d dossier < dossier.dump
More in Backups and restore.
-
Something's wrong: the Logs tab, and Troubleshooting.
On your own computer
On a server
In the README