GutscheinNest
Private Gutscheinverwaltung für einen Haushalt (Next.js + SQLite + Prisma). Gemeinsamer Bestand, Anmeldung per Passwort oder SSO (OIDC), Erinnerungen per Mail/Telegram.
Rollen: Der erste Nutzer ist Admin (wird beim Start aus APP_USER/APP_PASSWORD_HASH angelegt). Admins verwalten Nutzer, Einladungen und Einstellungen; alle Mitglieder verwalten gemeinsam Gutscheine.
Öffentlich betreiben (Docker + Caddy + HTTPS)
Voraussetzungen auf dem Server: Docker mit Compose-Plugin, eine Domain mit A/AAAA-Record auf die Server-IP, offene Ports 80/443 (plus SSH für dich). Port 3000 wird nicht geöffnet — die App ist nur im internen Compose-Netz erreichbar.
cp .env.example .env # Pflicht: DOMAIN (z. B. gutscheine.example.de), APP_URL=https://<DOMAIN>, APP_USER, APP_PASSWORD_HASH, SESSION_SECRET, SETTINGS_ENCRYPTION_KEY, CRON_SECRET
docker compose up -d --build
Caddy holt und erneuert das Let's-Encrypt-Zertifikat automatisch und leitet HTTP auf HTTPS um. APP_URL muss exakt die öffentliche Adresse sein (wichtig für OIDC-Redirects: in Authentik als Redirect-URI https://<DOMAIN>/api/auth/oidc/callback eintragen; der Reminder-Scheduler nutzt intern APP_INTERNAL_URL).
Prüfen:
https://<DOMAIN>/loginlädt mit gültigem Zertifikat,http://leitet auf HTTPS um.- Vom Server aus: Port 3000 ist geschlossen (kein
curl http://localhost:3000möglich). - 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).
Entwicklung
npm ci
npx prisma generate
npm run dev # http://localhost:3001
npm test
npm run build
Mitglieder einladen
Admins laden unter Einstellungen → Nutzer per E-Mail ein (Link 7 Tage gültig). Eingeladene richten ein Passwort ein oder melden sich per SSO an, sofern die OIDC-E-Mail zur Einladung passt. Mit ALLOW_PASSWORD_LOGIN=false brauchen Mitglieder SSO; der Admin behält zusätzlich den Passwort-Notfallzugang.
Update
git pull
docker compose up --build -d
Backup
Die SQLite-Datei liegt im Volume gutschein-data unter /data/gutscheine.db:
docker cp gutscheintracker-app-1:/data/gutscheine.db ./gutscheine-backup.db
# oder Volume direkt kopieren
docker run --rm -v gutschein-data:/data -v "$PWD":/backup alpine cp /data/gutscheine.db /backup/gutscheine-backup.db