Deployment und Freigabe
DiGeKo benötigt keine bestimmte Hostingplattform. App und CMS sind getrennte Node.js-Dienste und können auf einer VM, in Containern oder auf einer Application Platform betrieben werden.
Voraussetzungen für eine eigene Produktion
- zwei HTTPS-Adressen: eine für die öffentliche App und eine für das CMS
- Node.js 24 und pnpm für die App
- Node.js 20 bis 22 und npm für das CMS
- eine MySQL-Datenbank
- einen S3-kompatiblen Medienspeicher; lokaler Upload ist im
NODE_ENV=productionabsichtlich gesperrt - einen vollständig konfigurierten TTS-Anbieter
- einen SMTP-Dienst mit verifizierter Absenderadresse für transaktionale CMS-E-Mails
- bei aktivierten Bildvorschlägen einen vollständig konfigurierten Bildanbieter und einen eigenen privaten Vorschlags-Bucket
- persistente Backups von Datenbank und Medien
App bereitstellen
- App-Repository klonen und den gewünschten Commit oder Tag auschecken.
- mindestens
NEXT_PUBLIC_CMS_URLundNEXT_PUBLIC_INFO_CATEGORY_DOCUMENT_IDsetzen; Preview-Variablen nur bei Bedarf ergänzen. Bei aktivierter Vorschau mussAPP_ORIGINden öffentlichen Origin der App enthalten. pnpm install --frozen-lockfileundpnpm buildausführen.- den Build mit
pnpm starthinter einem HTTPS-Reverse-Proxy starten.
Öffentliche NEXT_PUBLIC_*-Werte werden in den Build eingebettet. Nach einer
Änderung ist deshalb ein neuer App-Build erforderlich.
CMS bereitstellen
- CMS-Repository klonen und den gewünschten Commit oder Tag auschecken.
- Strapi-Secrets, MySQL, S3, SMTP, Preview, TTS und optional Bildvorschläge über Umgebungsvariablen konfigurieren.
npm ci,npm run buildund anschließendnpm run startausführen.- optional den veröffentlichten Ausgangsdatenstand in eine frische Instanz importieren.
- Healthcheck, CMS-Anmeldung, transaktionale E-Mails, Preview, Medienupload, TTS, aktivierte Bildvorschläge und App-Abruf prüfen.
Transaktionale CMS-E-Mails
Das CMS versendet über Strapis E-Mail-Plugin zwei Arten administrativer Nachrichten:
- Strapis Funktion „Passwort vergessen“ sendet den Link zum Zurücksetzen des Admin-Passworts.
- Beim Anlegen eines noch nicht aktiven Admins sendet das CMS automatisch den persönlichen Registrierungslink.
Der von Strapi angezeigte, kopierbare Registrierungslink bleibt als Fallback erhalten. Ein fehlgeschlagener Versand löscht weder den Admin noch dessen Token; das Serverlog nennt nur einen technischen Fehlercode. Ein eigener Resend-Endpunkt ist nicht Bestandteil des CMS. Er würde zusätzliche Missbrauchsbegrenzung und Auditierung benötigen.
PUBLIC_URL muss auf die von den Empfänger:innen erreichbare CMS-Origin ohne
/admin zeigen. SMTP-Verbindung, Absender und Zugangsdaten werden über die
CMS-Umgebungsvariablen
gesetzt. Direkte TLS-Verbindungen verwenden üblicherweise Port 465 mit
SMTP_SECURE=true; bei STARTTLS sind Port und SMTP_SECURE nach den Angaben
des Providers zu wählen.
Für die Zustellbarkeit sind außerhalb des CMS mindestens folgende Punkte zu prüfen. Mailprovider können diese Einträge für ihre eigenen Mailserver bereits verwalten; vorhandene Einträge werden nicht ungeprüft überschrieben:
- Absenderadresse oder Absenderdomain beim Mailprovider verifizieren;
- kontrollieren, dass der vorhandene SPF-Eintrag den verwendeten SMTP-Server autorisiert; pro Domain darf nur ein SPF-Eintrag existieren;
- kontrollieren, dass DKIM für den SMTP-Anbieter aktiv ist und der zugehörige öffentliche Schlüssel im DNS erreichbar ist;
- die vorhandene DMARC-Policy prüfen und erst nach erfolgreicher Abnahme gezielt verschärfen.
Nach einer Änderung an SMTP, DNS oder öffentlicher CMS-URL umfasst die Staging-Abnahme:
- unter Settings → Email feature → Configuration eine Testmail senden;
- abgemeldet „Passwort vergessen“ ausführen und Zustellung sowie Reset-Linkziel prüfen;
- einen noch nicht aktiven Admin einladen und Zustellung sowie Registrierungs-Linkziel prüfen;
- den kopierbaren Link als Fallback kontrollieren;
- mit absichtlich ungültiger SMTP-Konfiguration in einer Testumgebung prüfen, dass nur ein technischer Fehlercode protokolliert wird und der Link erhalten bleibt.
Zugangsdaten gehören ausschließlich in geschützte Laufzeit-Secrets. Sie dürfen weder committed, als Container-Build-Argument verwendet noch durch ein öffentliches Variablenpräfix in das Admin-Bundle übernommen werden.
Docs bereitstellen
- Docs-Repository klonen und den gewünschten Commit oder Tag auschecken.
NEXT_PUBLIC_DOCS_ENVundNEXT_PUBLIC_SITE_URLpassend zur Zielumgebung setzen.pnpm install --frozen-lockfileundpnpm buildausführen.- den Standalone-Build mit
pnpm starthinter einem HTTPS-Reverse-Proxy starten. - direkten Seitenaufruf, Navigation, Suche und Robots-Metadaten prüfen.
Umgebungsvariablen nachschlagen →
Öffentlichen Datenexport importieren →
Versionen und Kompatibilität →
Projektbetrieb mit Coolify
Die offiziellen DiGeKo-Umgebungen werden derzeit durch Coolify aus den
jeweiligen GitLab-Repositories gebaut. Die Docs-Ressourcen verwenden den
Build Pack Nixpacks. Nixpacks erkennt die package.json-Scripts und
erzeugt den Buildcontainer; ein Dockerfile im Repository ist dafür nicht
erforderlich. Ein Wechsel zum Dockerfile-Build-Pack wäre eine bewusste,
separate Betriebsentscheidung.
Konkrete Staging-Adressen, Deployment-Auslöser, Ressourcenkennungen, Konfigurationswerte und Eskalationskontakte stehen ausschließlich im internen Betriebshandbuch. Sie sind für Mitwirkende und für den Betrieb einer eigenen Installation nicht erforderlich.
GitLab CI prüft den Quellstand. Coolify steuert Build, Runtime-Variablen und Deployment der freigegebenen Branches.
Rollen
- Mitentwickler:innen liefern kleine, prüfbare Merge Requests, führen die relevanten Tests aus und dokumentieren Auswirkungen auf App, CMS und Docs.
- Maintainer:innen/Projektverantwortliche prüfen Merge Request und CI, nehmen das Ergebnis auf
Staging ab, entscheiden über die Freigabe nach
main, beobachten das Deployment und führen die nachgelagerte Smoke-Prüfung durch. Bei einem Fehler entscheiden sie über Abbruch, erneutes Deployment oder Rollback.
Konkrete Personen, Vertretungen und Kontaktwege werden nur im internen Betriebshandbuch gepflegt.
Reguläre Freigabe
- Mitentwickler:innen stellen abgeschlossene Änderungen im Status Abnahme
mit einem Merge Request nach
devbereit. - Maintainer:innen nehmen sie ab, mergen nach
devund verschieben die Issues nach Release. - App, CMS und Docs auf Staging bauen und die integrierten automatischen und manuellen Prüfungen durchführen.
- Zum vorgesehenen Release-Zeitpunkt Merge Requests von
devnachmainerstellen. - Bei gekoppelten Änderungen zuerst CMS, dann App, zuletzt Docs deployen.
- Produktions-Smoke-Test durchführen und veröffentlichte Issues schließen.
- Projekt-Release mit den tatsächlich eingesetzten Komponentenständen dokumentieren.
Das öffentliche Versionsmodell und die Auswahl gemeinsam getesteter Komponenten- und Datenstände stehen unter Versionen und Kompatibilität.
Docs werden zuletzt veröffentlicht, damit digeko.de keine noch nicht
produktive Funktion beschreibt.
Zusammenspiel von App und CMS
App und CMS bilden je Zielumgebung ein festes Paar. Die App lädt veröffentlichte
Inhalte aus dem über CMS_URL beziehungsweise NEXT_PUBLIC_CMS_URL
zugeordneten CMS. Für die Vorschau verweist das CMS über
PREVIEW_FRONTEND_URL zurück auf die zugehörige App. Der serverseitige
APP_ORIGIN der App muss diesem öffentlichen Origin entsprechen.
Konfigurationen von Staging und Produktion dürfen nicht miteinander gekreuzt
werden.
Content Preview und Sicherheitsgrenze →
Healthcheck und Smoke-Prüfung
Ein technischer Healthcheck prüft ohne Anmeldung, ob der jeweilige Prozess über HTTPS erreichbar ist und mit dem erwarteten erfolgreichen HTTP-Status oder einer vorgesehenen Weiterleitung antwortet. Er ersetzt keine fachliche Smoke-Prüfung.
Nach jedem Deployment werden mindestens diese Punkte geprüft:
| System | Kurze Smoke-Prüfung |
|---|---|
| App | Startseite öffnen, Kategorie und Story aufrufen, Sprache wechseln und kontrollieren, ob Inhalte, vollflächige Icons und Medien geladen werden. |
| CMS | Admin-Anmeldung öffnen; öffentliche Inhalte, geschützte Entwürfe und berechtigte TTS- und Bildstatusabfragen prüfen. Bei E-Mail-Änderungen zusätzlich Testmail, Passwort-Reset und Einladung prüfen. |
| Preview | Einen gespeicherten Entwurf aus dem zugehörigen CMS in der App öffnen und die Vorschau wieder verlassen. |
| Docs | Startseite und einen direkten Unterseiten-Link öffnen sowie Navigation und Suche stichprobenartig prüfen. |
Bei Änderungen an Medien, TTS, Datenmodell oder Deploymentkonfiguration werden die betroffenen Pfade zusätzlich geprüft. Wiederkehrende Laufzeitfehler in den Logs, fehlerhafte Abhängigkeiten oder nicht passende Komponentenstände machen das Deployment nicht freigabefähig.
Bei Änderungen am TTS-Zugriffsschutz wird außerdem geprüft, dass eine
Admin-UI-Aktion mit passender Content-Manager-Berechtigung funktioniert und
dieselbe Route ohne Admin-Session 401 sowie mit fehlender Berechtigung 403
liefert. Weder Reverse Proxy noch Netzwerksegmentierung dürfen dabei die
anwendungsseitige Session- und RBAC-Prüfung ersetzen.
Bei aktivierten Bildvorschlägen umfasst die Staging-Prüfung mindestens je einen
deutschen und englischen Auftrag: Vorschläge erzeugen, abbrechen oder erneut
starten, vergleichen, Alternativtext prüfen, genau einen Vorschlag übernehmen,
den Entwurf speichern und die Darstellung in der App kontrollieren. Nicht
ausgewählte Vorschläge dürfen nicht in der Media Library erscheinen. Vor einem
Shutdown wird kontrolliert, dass ein laufender Job beim nächsten Start wieder
aufgenommen wird. Bei fal.ai muss dabei dieselbe gespeicherte Provider-Request-ID
weiterverwendet werden, damit kein zweiter kostenpflichtiger Auftrag entsteht.
Das mit AI_IMAGE_RATE_LIMIT_MAX konfigurierte Limit für verändernde
Bildanfragen wird ebenfalls geprüft. Es gilt je Route, Client-IP und
CMS-Instanz innerhalb von 60 Sekunden; mehrere Instanzen benötigen für ein
globales Limit zusätzlich eine gemeinsame Begrenzung am Reverse Proxy.
IMAGE_GENERATION_ENABLED=false ist der betriebliche Abschaltweg ohne
Codeänderung. Providerpreise werden nicht fest im CMS hinterlegt. Eine
angezeigte Kostenschätzung muss vor der Produktionsfreigabe gegen die aktuelle
Abrechnung des Betreibers geprüft werden; sie ist weder Rechnung noch Budget.
Branch-Schutz
main und dev werden gegen direkte Pushes und Force Push geschützt. Änderungen
laufen über Merge Requests und benötigen eine grüne relevante CI. Produktion
wird ausschließlich aus main, Staging ausschließlich aus dev gebaut.
Hotfix
Ein Produktions-Hotfix zweigt von main ab, wird nach Prüfung dorthin
zurückgeführt und anschließend auch nach dev übernommen. Betroffene
Dokumentation folgt demselben Weg.
Rollback
Ein Code-Rollback verwendet den letzten nachweislich funktionierenden Commit, Tag oder dokumentierten Release-Stand:
- fehlerhaften Stand und beobachtete Auswirkungen festhalten;
- letzten funktionierenden Stand mit unveränderter Zielkonfiguration erneut bauen und bereitstellen;
- bei gekoppelten Änderungen die Reihenfolge CMS, App und zuletzt Docs beachten;
- Healthcheck und Smoke-Prüfung vollständig wiederholen;
- Korrektur anschließend wieder in die regulären Branches übernehmen.
Ein Code-Rollback setzt weder Inhalte noch Datenbank, Medien oder Konfigurationszustände zurück. Schema- und Datenänderungen benötigen deshalb vor der Freigabe einen getrennten Rückweg. Die konkrete Sicherung und Wiederherstellung der offiziellen Umgebungen ist Teil des internen Betriebshandbuchs und wird nicht öffentlich beschrieben.