# Inkwell: the app and its Postgres database, from the published image. # # cp .env.example .env # then set POSTGRES_PASSWORD # docker compose up -d # # Upgrade: `docker compose pull && docker compose up -d`. Migrations run at start. # Back up first from Settings → Backups; a bare pg_dump misses the attachments, # which live in the inkwell-data volume. services: db: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-inkwell} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env — see .env.example} POSTGRES_DB: ${POSTGRES_DB:-inkwell} volumes: - inkwell-db:/var/lib/postgresql/data # Not published to the host; `docker compose exec db psql -U inkwell` reaches it. logging: &logging driver: json-file options: max-size: "10m" max-file: "3" app: # latest follows main, dev follows dev, a commit sha pins one build. image: git.fabledsword.com/bvandeusen/inkwell:${INKWELL_TAG:-latest} restart: unless-stopped depends_on: - db environment: INKWELL_DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-inkwell}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB:-inkwell} volumes: # Uploaded attachments; without this mount they are lost when the container is recreated. - inkwell-data:/var/inkwell # Optional: the folder scheduled backups are written to (Settings → Backups). # - /mnt/backups/inkwell:/backups # Behind a reverse proxy in Docker, delete `ports:`; behind one on the host, set # INKWELL_BIND=127.0.0.1. See docs/public-hosting.md. ports: - "${INKWELL_BIND:-0.0.0.0}:${INKWELL_PORT:-5000}:5000" logging: *logging volumes: # Overridable so an install from before the rename keeps its volumes (.env.example). inkwell-db: name: ${INKWELL_DB_VOLUME:-inkwell-db} inkwell-data: name: ${INKWELL_DATA_VOLUME:-inkwell-data}