1
Deployment
opencode edited this page 2026-10-20 20:10:15 +02:00

Deployment

Deployment von GutscheinNest auf einem Server mit Docker, Caddy und HTTPS.

Voraussetzungen

  • Docker mit Compose-Plugin auf dem Zielserver
  • Domain mit A/AAAA-Record auf die Server-IP
  • Offene Ports 80/443 (plus SSH für die Verwaltung)
  • Port 3000 wird nicht geöffnet: Die App ist nur im internen Compose-Netz erreichbar, nach außen geht es ausschließlich über den Caddy-Reverse-Proxy (HTTPS).

Dateien auf dem Zielserver

Benötigt werden nur drei Dateien (kein Quellcode, kein lokaler Build):

  • docker-compose.deploy.yml
  • Caddyfile
  • .env (aus .env.example kopiert und ausgefüllt)

.env ausfüllen (Pflichtwerte)

Variable Beispiel Wozu
DOMAIN gutscheine.example.de Öffentliche Domain für Caddy/TLS
APP_URL https://gutscheine.example.de Exakte öffentliche Adresse (OIDC-Redirects, Einladungs-Links)
APP_USER / APP_PASSWORD_HASH haushalt / bcrypt-Hash Erster Server-Admin
SESSION_SECRET / SETTINGS_ENCRYPTION_KEY / CRON_SECRET je 32+ Zufallszeichen Sessions, Verschlüsselung, Cron-Schutz

Optional: SMTP_* (Mail), TELEGRAM_BOT_TOKEN (Telegram), ALLOW_PASSWORD_LOGIN, TZ.

Den bcrypt-Hash für das Admin-Passwort erzeugt z. B.:

node -e "console.log(require('bcryptjs').hashSync('sicheres-passwort', 10))"

Starten

docker login gitea.lokcal.de -u <gitea-benutzer>
docker compose -f docker-compose.deploy.yml pull
docker compose -f docker-compose.deploy.yml up -d

Verwendet wird das öffentliche Image gitea.lokcal.de/loki/gutscheintracker:latest, das bei jedem Push auf main per Gitea-Action frisch gebaut wird (nach Tests, Typcheck und Build). Für reproduzierbare Deployments einen Digest pinnen (in Gitea unter → Pakete → container/gutscheintracker).

Prüfen

  • https://<DOMAIN>/login lädt mit gültigem Zertifikat, http:// leitet auf HTTPS um.
  • docker exec <container> id → uid=10001(app) (rootless).
  • Einladungs-Links und Cron-Läufe funktionieren (Test-Mail in den Einstellungen).

Lokal testen geht mit derselben Datei: DOMAIN=localhost in .env (dann ohne TLS, Caddy macht automatisch HTTP).

Update

docker compose -f docker-compose.deploy.yml pull
docker compose -f docker-compose.deploy.yml up -d

Weiter: SSO mit Authentik, Backup und Restore, Fehlerbehebung