Run the media backup as uid 10001 and add the deploy runbook
CI / ci (push) Successful in 1m35s
CI / ci (pull_request) Successful in 1m34s

Address review of 9ac3342:

- The media backup now runs as the host user mealquest (10001) with no
  capabilities. systemd bind-mounts the data volume read-only at
  /run/mealquest-data and passes the NAS key as a credential; the script
  changes into media, refuses it if the physical path differs (symlink)
  and rsyncs "./", so the path cannot be swapped under it. ssh pins the
  NAS host keys from /etc/mealquest/known_hosts (deploy/known_hosts).
- A missing media directory now fails the job. The deploy step creates it.
- deploy/RUNBOOK.md records the Traefik route (task 0c1dc172), backup
  setup, the restore procedure (stop, move db/-wal/-shm aside, restore,
  count check, start) and the 2026-10-05 drill with ltx -level all.

Task: d2f2e87e-5114-4ef1-93ab-360ffb5c009e

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-05 19:28:36 -04:00
co-authored by Claude Opus 5.5
parent 9ac3342664
commit 765740b921
5 changed files with 370 additions and 28 deletions
+2 -4
View File
@@ -56,10 +56,8 @@ services:
# the app's own user (owner of the volume) with a read-only root
# filesystem, no privilege escalation and no Linux capabilities.
#
# Restore (app stopped; --no-deps so the app does not start and create a
# fresh database first):
# docker compose -f deploy/compose.yaml run --rm --no-deps litestream \
# restore -config /etc/litestream.yml -o /data/mealquest.db /data/mealquest.db
# Restore: follow "Restore the database" in deploy/RUNBOOK.md (stop the
# stack, move the database with its -wal and -shm aside, restore, check).
litestream:
image: litestream/litestream:0.5.17
user: "10001:10001"