Skip to content

Self host with Dokploy

Alien edited this page Oct 18, 2026 · 1 revision

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.

What you need

  • 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 DNS A record pointing at the server.

1. Create the database

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.

2. Create the application

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.

3. Set the environment

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-password

In 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.

4. Storage and memory

In the Advanced tab:

  • Volumes: press Add Volume, choose Volume Mount, and enter the volume name dossier-data and 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).

5. Add the domain

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.

6. Deploy

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).

Optional: Ollama for a local model

With a local model, your profile and documents never leave your server. Ollama can run as a second application:

  1. Create Service → Application, named ollama. Note its App Name, which Dokploy fills in when you create it: other services reach it by that name.

  2. General: the Docker provider, with the image ollama/ollama:0.34.4.

  3. Advanced: a volume mount ollama-models at /root/.ollama, so models survive updates, and a Memory Limit of 8589934592 (8 GB, for qwen2.5:7b). Give it no domain.

  4. Deploy it, then press Open Terminal in its General tab and pull a model:

    ollama pull qwen2.5:7b
  5. 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.

Day to day

  • 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 latest brings 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.