- scripts/bootstrap-admin.ts: legt ersten Plattform-Admin + Mandant via provisionTenant(isPlatformAdmin) an; idempotent, per Env gesteuert. Ersetzt in Prod den Demo-Seed. tsx-@/-Auflösung lokal verifiziert. - docker-compose.coolify.yml: migrate-Job führt bei BOOTSTRAP_ADMIN=true das Skript nach der Migration aus; BOOTSTRAP_*-Vars durchgereicht. - .env.prod.example: Prod-Env-Referenz (HTTPS, kein Demo-Seed, Bootstrap-Vars). - docs/DEPLOY-PROD-CONTABO.md: Runbook (VPS-Härtung/Swap, Coolify+Gitea, DNS/TLS app.certvia.de, Deploy, Bootstrap, Backups, Go-Live-Checkliste). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
5.0 KiB
5.0 KiB
Deployment: Produktivserver (Contabo-VPS via Coolify)
Zielumgebung: öffentlicher Contabo-VPS, eigene Coolify-Instanz, Git (Gitea) auf demselben VPS, Domain app.certvia.de mit echtem Let's-Encrypt-TLS. Ergänzt
docs/DEPLOY-COOLIFY.md(Testserver). Deploy-Datei:docker-compose.coolify.yml.
Unterschiede zum Testserver
| Aspekt | Test (intern) | Produktiv (Contabo) |
|---|---|---|
| Erreichbarkeit | intern, HTTP, sslip.io | öffentlich, HTTPS, app.certvia.de |
| Git-Quelle | internes Gitea | Gitea auf dem VPS (Release-Push) |
| Erst-Admin | Demo-Seed (RUN_DEMO_SEED=true) |
Bootstrap-Admin (BOOTSTRAP_ADMIN=true), kein Demo-Seed |
| Secrets | Testwerte | frische, starke Secrets |
| Backups | optional | Pflicht (pg_dump + Restore-Test) |
| Branch | dev |
main |
Phase 1 — VPS-Grundlage
- Contabo-VPS bereitstellen — ≥ 8 GB RAM empfohlen (Next-Build ~1 GB + Stack). Bei weniger RAM zwingend Swap:
fallocate -l 4G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile echo '/swapfile none swap sw 0 0' >> /etc/fstab free -h - Grundhärtung: System aktualisieren, SSH-Key-Login (Passwort-Login aus), unattended-upgrades.
- Firewall (ufw): nur benötigte Ports offen —
80,443, SSH, sowie der Gitea-SSH-Port (s. Phase 2). - Coolify installieren (offizielles Installskript) — eigene, unabhängige Instanz.
Phase 2 — Gitea auf dem VPS
- Gitea als Coolify-Ressource (One-Click/Compose) aufsetzen, eigene Subdomain (z. B.
git.certvia.de), TLS via Coolify. - Repo
ISMS-Toolin diesem Gitea anlegen. - Lokal ein zweites Remote hinzufügen und beim Release
maindorthin pushen:(Das ist der bewusste „Release-Push" — Prod deployt nur, was hier landet.)git remote add prod https://git.certvia.de/<org>/ISMS-Tool.git git push prod main
Phase 3 — DNS & Domain
- Bei eurem DNS für
certvia.deeinen A-Recordapp.certvia.de→ Contabo-IP anlegen (ebensogit.certvia.de). - Coolify vergibt/prüft danach automatisch das Let's-Encrypt-Zertifikat (VPS ist öffentlich erreichbar).
Phase 4 — App-Ressource (Prod) in Coolify
- + New Resource → Git-Quelle = das VPS-Gitea (Deploy-Key), Repo
ISMS-Tool, Branchmain. - Build Pack: Docker Compose, Compose Location:
docker-compose.coolify.yml. - Domain beim Service
app=https://app.certvia.de:3000(Port 3000), Schema https. - Environment-Variablen aus
.env.prod.examplesetzen (Runtime-Variablen). Kritisch:- Alle Secrets frisch (
AUTH_SECRETneu:openssl rand -base64 32; neue DB-/MinIO-Passwörter). AUTH_URL=https://app.certvia.de(exakt die App-Domain).RUN_DEMO_SEED=false(bzw. weglassen).- Bootstrap (erster Deploy):
BOOTSTRAP_ADMIN=true+BOOTSTRAP_ADMIN_EMAIL/PASSWORD/NAME+BOOTSTRAP_TENANT_NAME/SLUG.
- Alle Secrets frisch (
- Persistent Storage prüfen — v. a.
pgdata(sonst Datenverlust bei Redeploy).
Phase 5 — Erster Deploy & Bootstrap
- Deploy. Ablauf:
postgres(healthy) →migrate(migriert und legt viaBOOTSTRAP_ADMIN=trueden Erst-Admin an) →app. - In den
migrate-Logs prüfen:>> Bootstrap-Admin läuft…→✔ Bootstrap fertig: Mandant … + Plattform-Admin … angelegt. - Login unter
https://app.certvia.demit denBOOTSTRAP_ADMIN_*-Zugangsdaten → Passwort sofort ändern. - Optional danach
BOOTSTRAP_ADMINauffalse(das Skript ist idempotent, es schadet aber nicht, es an zu lassen).
Phase 6 — Backups & Betrieb (vor „echtem" Go-Live)
- Postgres-Backups: regelmäßiger
pg_dump(oder Coolify-DB-Backup nach S3) + Restore-Test dokumentieren.pgdataist das kritische Volume. - MinIO-Backup, sobald Datei-/Logo-Upload aktiv ist.
- Monitoring/Alerting: App-Healthcheck ist im Compose vorhanden; zusätzlich Uptime-Check auf
https://app.certvia.deund Log-Aggregation einrichten. - Updates: Betriebssystem/Coolify/Images regelmäßig aktualisieren.
Phase 7 — Auto-Deploy (optional)
- Gitea-Webhook (VPS-Gitea → Coolify) mit Branch-Filter
main. Da Gitea und Coolify auf demselben Host sind, ggf.GITEA__webhook__ALLOWED_HOST_LISTweit genug setzen (vgl. Testserver-Erfahrung).
Release-Fluss (Zusammenfassung)
Feature-Branch → dev # Entwicklung, Auto-Deploy Testserver
dev → main # Release-Merge (nach Test-Freigabe)
git push prod main # Release-Push ins VPS-Gitea → Prod-Deploy
Sicherheits-Checkliste Go-Live
- Frische, starke Secrets (nicht aus Test übernommen)
RUN_DEMO_SEEDaus, keine Demo-Daten in Prod- Bootstrap-Admin-Passwort nach erstem Login geändert
- HTTPS erzwungen, gültiges Zertifikat
pgdatapersistent + Backup + Restore-Test- Firewall aktiv, SSH gehärtet
- Gitea-Repo privat, Zugriff nur für das Team