All checks were successful
CD / Build and push images (push) Successful in 3m51s
CI / Lint, typecheck, test (push) Successful in 4m5s
CD / Deploy to Test (push) Successful in 11s
CI / Build container images (push) Has been skipped
CD / Smoke tests against Test (push) Successful in 1m11s
CD / Promote to Int (push) Successful in 12s
CI / Auth e2e pack (push) Successful in 5m52s
CI / Import/export fidelity gate (push) Successful in 47s
The operator-level extra beside the admin-configured Nextcloud target (#103), unblocked now that the ONE→BASEL tunnel is stable again. - sidecar: optional mirror step (mirror.ts) driven purely by env — BACKUP_MIRROR_TARGET (rsync-over-ssh), BACKUP_MIRROR_SSH_KEY (private key on the secrets volume, never in image or repo), BACKUP_MIRROR_SSH_PORT. Runs after the prune of every successful run, so --delete aligns the remote retention with the local one (the newest-complete-set guarantee carries over). Only set files travel (db-*.dump, files-*.tar.gz); status files and bundles stay local. Host key pinned via accept-new into .mirror_known_hosts on the backups volume; fixed remote modes (dirs 750, files 640, symbolic --chmod — octal needs rsync ≥ 3, macOS dev machines ship 2.6.9). rsync + openssh-client added to the sidecar image. - status: additive `mirror` block in status.json (outcome, transferred count, lastSuccessAt carried across failures) — shown on the admin backup card; failures alert via a new backupMirrorFailed mail (de+en) while the local run still counts as succeeded. - deploy/backup-basel.md: complete BASEL-side walkthrough — dedicated user dorfteich-backup with a /home/ home and a bash login shell, explicitly avoiding the Debian backup-user (UID 34) pitfalls (nologin shell rejects rsync sessions, /var/backups home), key placement through the api container onto the secrets volume, .env values, on-demand verification. - tests: rsync-arg/stats-parsing units plus an integration suite against the real rsync binary (local target; skips where rsync is absent) — transfer, idempotent re-run (0 files), retention alignment, failure path carrying lastSuccessAt. Verified live against the real BASEL host from a native sidecar run: initial transfer, host-key pinning, retention alignment after a local prune, idempotency, and the failure path (surfaced in status.json while the local run stayed green). BASEL side provisioned per the doc. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EwZ4jR4KFAPvpjWevfUGX1
102 lines
4.7 KiB
Plaintext
102 lines
4.7 KiB
Plaintext
# Dorfteich stage configuration. Copy to `.env` (mode 600, never in git)
|
|
# next to docker-compose.yml and adjust the values.
|
|
|
|
# --- required ---------------------------------------------------------------
|
|
# PostgreSQL password for the `dorfteich` database user.
|
|
POSTGRES_PASSWORD=change-me
|
|
|
|
# Secret that signs/verifies the short-lived collaboration tokens (issue #34).
|
|
# The api and collab services share this one value; use a long random string
|
|
# (e.g. `openssl rand -base64 32`). Min length 16.
|
|
COLLAB_TOKEN_SECRET=change-me-to-a-long-random-string
|
|
|
|
# --- images -----------------------------------------------------------------
|
|
# Image name prefix. Stages pull from the Gitea registry, e.g.
|
|
# gitea.101010.cloud/stwaidele/dorfteich — local builds use the default.
|
|
IMAGE_PREFIX=dorfteich
|
|
# Image tag to run: a git SHA, `test`, `int`, or a release tag like v1.2.0.
|
|
TAG=latest
|
|
|
|
# --- ports (localhost only; the host reverse proxy routes to these) ---------
|
|
# Suggested per stage on the shared host (ONE): test 8100/8101/8102,
|
|
# int 8110/8111/8112, prod 8120/8121/8122 (web/api/collab).
|
|
WEB_PORT=8100
|
|
API_PORT=8101
|
|
# collab (Hocuspocus) WebSocket server; the proxy routes /collab here.
|
|
COLLAB_PORT=8102
|
|
|
|
# --- behavior ----------------------------------------------------------------
|
|
# pino log level: fatal|error|warn|info|debug|trace
|
|
LOG_LEVEL=info
|
|
|
|
# Compose project name; set per stage (dorfteich-test, dorfteich-int, …).
|
|
COMPOSE_PROJECT_NAME=dorfteich
|
|
|
|
# --- public URL + mail --------------------------------------------------------
|
|
# Public base URL of the stage (scheme + host). E-mail links and the CSRF
|
|
# origin check are derived from it — it must match what browsers use.
|
|
APP_BASE_URL=https://test.dorfteich.cloud
|
|
|
|
# SMTP relay for outgoing mail (verification, password reset). Optional:
|
|
# leave everything unset and configure the relay in the browser during the
|
|
# first-run setup wizard instead (stored on the `secrets` volume, issue #80).
|
|
# Values set here always win over wizard-stored ones.
|
|
SMTP_HOST=mail.example.com
|
|
SMTP_PORT=465
|
|
SMTP_SECURE=true
|
|
SMTP_USER=wiki@example.com
|
|
SMTP_PASS=change-me
|
|
SMTP_FROM=Dorfteich <wiki@example.com>
|
|
|
|
# --- optional TLS ingress (`caddy` profile, issue #88) -------------------------
|
|
# Only when you have no reverse proxy of your own: start with
|
|
# `docker compose --profile caddy up -d`. Caddy terminates TLS for DOMAIN
|
|
# via Let's Encrypt (80+443 must be reachable from the internet; keep
|
|
# APP_BASE_URL=https://<DOMAIN> in sync). The `localhost` default issues
|
|
# an internal-CA certificate instead — good for smoke tests only.
|
|
#DOMAIN=wiki.example.com
|
|
# Published ports; change only when 80/443 are taken on the host.
|
|
#CADDY_HTTP_PORT=80
|
|
#CADDY_HTTPS_PORT=443
|
|
|
|
# --- backups (ADR 0015, issue #83) --------------------------------------------
|
|
# The backup sidecar dumps the database and archives the uploads/plugins
|
|
# volumes nightly onto the `backups` volume; restore via
|
|
# deploy/backup/restore.sh <backup-id>. All values optional.
|
|
# Daily run time HH:MM in TZ (default 03:00; set TZ for stage-local time,
|
|
# e.g. TZ=Europe/Berlin — unset means UTC).
|
|
#TZ=Europe/Berlin
|
|
#BACKUP_TIME=03:00
|
|
# Local retention in days: 30 (default) for Prod, 7 for Test/Int (ADR 0015).
|
|
# A Site Admin can override this in the admin UI (issue #103) — the saved
|
|
# setting then wins over this value.
|
|
#BACKUP_RETENTION_DAYS=30
|
|
# Off-host copies to a Nextcloud (issue #103) are configured entirely in the
|
|
# admin UI (Admin -> System -> Backups) — no env values needed here.
|
|
# Failure alert: recipient (unset = no mail, failures only in the logs and
|
|
# status.json), mail language (de|en), and the label used in the subject
|
|
# (defaults to the compose project name).
|
|
#BACKUP_MAIL_TO=ops@example.com
|
|
#BACKUP_MAIL_LOCALE=en
|
|
#BACKUP_INSTANCE_LABEL=dorfteich-test
|
|
# Optional rsync mirror of the backup sets to a private host (issue #84):
|
|
# rsync-over-ssh target plus the private key file INSIDE the container —
|
|
# put the key on the secrets volume (docker compose cp), never in the repo.
|
|
# Full setup walkthrough: deploy/backup-basel.md. Unset = no mirror.
|
|
#BACKUP_MIRROR_TARGET=dorfteich-backup@172.30.1.10:/home/RAID/BACKUPS/dorfteich-prod/
|
|
#BACKUP_MIRROR_SSH_KEY=/data/secrets/backup_mirror_ed25519
|
|
#BACKUP_MIRROR_SSH_PORT=22
|
|
|
|
# --- first-run setup (optional pre-seeding, issue #80) ------------------------
|
|
# A fresh (empty) database makes the instance require the browser setup
|
|
# wizard. Automated deploys can skip it entirely by pre-seeding the Site
|
|
# Admin here; the wizard then completes and locks itself at first boot.
|
|
# All three SETUP_ADMIN_* values are required for pre-seeding to trigger.
|
|
#SETUP_ADMIN_USERNAME=admin
|
|
#SETUP_ADMIN_EMAIL=admin@example.com
|
|
#SETUP_ADMIN_PASSWORD=change-me-please
|
|
#SETUP_ADMIN_DISPLAY_NAME=Admin
|
|
#SETUP_INSTANCE_NAME=Dorfteich
|
|
#SETUP_DEFAULT_LOCALE=en
|
|
#SETUP_REGISTRATION_MODE=open
|