continued the kita-planer

This commit is contained in:
t.indorf
2026-05-08 14:32:14 +02:00
parent b686e714ff
commit 7aff691803
85 changed files with 9434 additions and 588 deletions
+55
View File
@@ -0,0 +1,55 @@
# Kita-Planer Deployment
Dieses Verzeichnis enthaelt die ausfuellbaren Vorlagen fuer das Production-Deployment.
## Dateien
- `production.env.example`: Vorlage fuer alle benoetigten Environment Variables.
- `production-checklist.md`: Checkliste fuer Domain, Datenbank, Auth, Mail, Uploads und Rechtliches.
- `../Dockerfile`: Container-Build fuer Coolify oder andere Docker-Hosts.
- `../docker-compose.coolify.yml`: Compose-Vorlage fuer Coolify mit required Environment Variables.
## Empfohlener Ablauf mit Coolify und Gitea
1. Repository in deine Gitea-Instanz pushen.
2. In Coolify eine neue Application aus diesem Gitea-Repository anlegen.
3. Als Build Pack `Docker Compose` waehlen.
4. Als Compose-Datei `docker-compose.coolify.yml` eintragen.
5. Die bestehende Coolify-Postgres-Datenbank ueber ihre interne `DATABASE_URL` verbinden.
6. Environment Variables aus `production.env.example` in Coolify eintragen.
7. Domain auf den `app`-Service mit internem Port `3000` zeigen lassen.
8. Deploy starten.
Beim Container-Start fuehrt `scripts/start-production.sh` automatisch aus:
```bash
npx prisma db push
```
Coolify erkennt Variablen aus `docker-compose.coolify.yml` und zeigt required Variablen
wie `DATABASE_URL`, `AUTH_SECRET`, `AUTH_URL`, `NEXTAUTH_URL`, `NEXT_PUBLIC_SITE_URL`,
`RESEND_API_KEY`, `EMAIL_FROM` und `ADMIN_EMAIL` in der UI an.
## Welche Coolify-Postgres-URL?
Wenn die App und die Postgres-DB im selben Coolify-Projekt/Netzwerk laufen, nimm
die interne Datenbank-URL aus Coolify, nicht die oeffentliche externe URL. Das ist
stabiler und vermeidet unnoetigen Traffic ueber den Host.
Das Format bleibt:
```txt
postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=public
```
## Wichtige Hinweise
- Das aktuelle Projekt nutzt noch `prisma db push` statt versionierter Prisma-Migrationen.
Fuer den ersten MVP-Deploy ist das praktikabel, fuer laengerfristigen Betrieb sollten
Migrationen eingefuehrt werden.
- `UPLOAD_DIR` muss persistent sein. Die Coolify-Compose-Datei mountet dafuer ein
Docker-Volume nach `/app/uploads`.
- `NEXT_PUBLIC_SITE_URL` muss die echte Domain enthalten, damit OpenGraph-Bilder in
WhatsApp, LinkedIn und Co. korrekt als absolute URL aufgeloest werden.
- `NEXT_PUBLIC_SITE_URL` wird auch als Build-Arg an Docker uebergeben. In Coolify sollte
diese Variable deshalb fuer Build und Runtime verfuegbar sein.
+60
View File
@@ -0,0 +1,60 @@
# Production Checklist
## 1. Domain & Basis-URLs
- [ ] Produktionsdomain festlegen: `https://[deine-domain.de]`
- [ ] `NEXT_PUBLIC_SITE_URL` auf die Produktionsdomain setzen
- [ ] `AUTH_URL` und `NEXTAUTH_URL` auf die Produktionsdomain setzen
- [ ] Nach Deployment die WhatsApp-/LinkedIn-Vorschau mit der finalen URL testen
## 2. Datenbank
- [ ] Interne `DATABASE_URL` der bestehenden Coolify-Postgres-DB kopieren
- [ ] `DATABASE_URL` in der Coolify-App eintragen
- [ ] Beim ersten App-Start wird das Schema automatisch mit `npx prisma db push --skip-generate` angewendet
- [ ] Fuer spaetere Releases idealerweise Prisma-Migrationen einfuehren
## 3. Auth & Sicherheit
- [ ] `AUTH_SECRET` neu generieren: `openssl rand -base64 32`
- [ ] Keine `.env`-Dateien mit echten Secrets committen
- [ ] Dashboard ist per Metadata auf `noindex,nofollow` gesetzt
- [ ] Produktionsdomain auf HTTPS betreiben
## 4. Mail
- [ ] Eigene Versanddomain bei Resend verifizieren
- [ ] `RESEND_API_KEY` fuer Produktion setzen
- [ ] `EMAIL_FROM` auf eine verifizierte Absenderadresse setzen
- [ ] `ADMIN_EMAIL` fuer Kontaktformular setzen
- [ ] Kontaktformular und Einladung/E-Mail-Flows einmal in Produktion testen
## 5. Uploads
- [ ] Coolify-Volume `kita_planer_uploads` fuer `/app/uploads` verwenden
- [ ] Sicherstellen, dass Uploads nicht aus Versehen oeffentlich ausgeliefert werden
- [ ] Backup-Strategie fuer Uploads klaeren
## 6. Rechtliches
- [ ] Platzhalter im Impressum ersetzen
- [ ] Platzhalter in der Datenschutzerklaerung ersetzen
- [ ] Hosting-Anbieter und Mail-Anbieter in Datenschutztext eintragen
- [ ] Rechtliche Texte vor Livegang pruefen lassen
## 7. Build & Smoke Test
- [ ] Dependencies installieren: `npm ci`
- [ ] Production Build erstellen: `npm run build:prod`
- [ ] App starten: `npm run start:prod`
- [ ] Startseite, Login, Dashboard und Kontaktformular testen
## 8. Coolify
- [ ] Code nach Gitea pushen
- [ ] In Coolify eine Application aus dem Gitea-Repository anlegen
- [ ] Build Pack `Docker Compose` waehlen
- [ ] Compose-Datei `docker-compose.coolify.yml` verwenden
- [ ] Environment Variables in Coolify eintragen, nicht ins Repo committen
- [ ] Domain auf den `app`-Service und Container-Port `3000` routen
- [ ] Upload-Volume `kita_planer_uploads` bleibt zwischen Deployments erhalten
+34
View File
@@ -0,0 +1,34 @@
# =====================================================================
# Kita-Planer · Production Environment Template
# ---------------------------------------------------------------------
# Werte in der Hosting-Plattform als Environment Variables eintragen
# oder lokal als `.env.production` / Server-Env verwenden.
# Keine echten Secrets committen.
# =====================================================================
# PostgreSQL
# In Coolify am besten die interne URL deiner bestehenden Postgres-DB verwenden.
# Beispiel: postgresql://USER:PASSWORD@HOST:5432/kita_planer?schema=public
DATABASE_URL="postgresql://[USER]:[PASSWORD]@[HOST]:[PORT]/[DATABASE]?schema=public"
# Auth.js / NextAuth
# Generieren mit: openssl rand -base64 32
AUTH_SECRET="[GENERATE_ME]"
# Oeffentliche Produktions-URL, ohne Slash am Ende.
# Beide Werte setzen, weil bestehender Code und Auth-Tooling beide Namen kennen.
AUTH_URL="https://[deine-domain.de]"
NEXTAUTH_URL="https://[deine-domain.de]"
NEXT_PUBLIC_SITE_URL="https://[deine-domain.de]"
# Mailversand via Resend
RESEND_API_KEY="re_[PRODUCTION_API_KEY]"
EMAIL_FROM="Kita-Planer <[absender@deine-domain.de]>"
ADMIN_EMAIL="[kontakt@deine-domain.de]"
# Persistenter Upload-Speicher fuer Anhaenge vom Schwarzen Brett.
# Muss auf dem Server dauerhaft erhalten bleiben und darf nicht im Repo liegen.
UPLOAD_DIR="/var/lib/kita-planer/uploads/announcements"
# Optional: Nur bewusst fuer initiales Demo-Seeding in Produktion setzen.
# ALLOW_DATABASE_SEED="true"