// docs

Self-hosting guide

One app container, Postgres, your data on your machine. Compose file, volumes and backups, upgrades, and putting Teasynaer behind a reverse proxy.

Teasynaer runs as the app container plus a Postgres 16 database, wired together by a single compose file. No SaaS, no seats, no telemetry — evidence and the database live in volumes you own.

The compose file

# docker-compose.yml
services:
  teasynaer:
    image: git.allotmentology.tech/allotment-technology-ltd/teasynaer:latest
    restart: unless-stopped
    ports: ["8080:8080"]
    environment:
      DATABASE_URL: postgres://teasynaer:teasynaer@db:5432/teasynaer
      TEASYNAER_ADMIN_PASSWORD: ${TEASYNAER_ADMIN_PASSWORD:?set it in .env}
      TRACKER_CREDENTIALS_KEY: ${TRACKER_CREDENTIALS_KEY:-}   # openssl rand -hex 32
    depends_on:
      db:
        condition: service_healthy
    volumes: ["evidence:/data/evidence"]
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: teasynaer
      POSTGRES_PASSWORD: teasynaer
      POSTGRES_DB: teasynaer
    volumes: ["db-data:/var/lib/postgresql/data"]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U teasynaer"]
      interval: 5s
      timeout: 5s
      retries: 10
volumes:
  db-data:
  evidence:

The repository ships the full file — change the Postgres credentials from the defaults for anything beyond a laptop. The database is deliberately not published to the host; only the app's 8080 is exposed.

Volumes & backups

Two volumes hold your state: db-data (Postgres) and evidence (the captured bundles under /data/evidence). Back them up as a consistent pair — evidence first, then the database — with the scripts/backup.sh / scripts/restore.sh helpers documented in the repo's docs/runbooks/backup-restore.md runbook.

Upgrades

Pull a newer image tag and docker compose up again. Migrations run forward automatically at container start; the entrypoint fails loudly rather than serving a half-migrated app. Releases are semver-tagged with a CHANGELOG and a documented, forward-only upgrade path.

Auth & reverse proxy

Teasynaer authenticates with a built-in local-admin account (scrypt hashing, DB-backed opaque sessions, login rate-limiting and lockout, forced first-login password change, CSRF and SSRF guards). You can put it behind your own reverse proxy for TLS; set TEASYNAER_PUBLIC_URL so absolute redirects resolve. OIDC and trusted reverse-proxy (forwarded-header) auth are on the roadmap, not shipped yet — today the local-admin account is the only sign-in path.

← All docs