Zum Hauptinhalt springen

Deployment

In diesem Abschnitt wird beschrieben, wie GENTRAIN sowohl intern als auch von externen Organisationen (z. B. Forschungsinstitute oder Gesundheitsbehörden) bereitgestellt werden kann. Er erläutert den Bereitstellungs-Workflow, die Umgebungsvariablen, Secrets und die Automatisierung mittels GitHub Actions.


🏗️ 1. Überblick über den Deployment-Prozess

GENTRAIN unterstützt zwei Hauptmodi für die Bereitstellung:

ModusAnwendungsfallTooling
DevelopmentLokales Testen oder Anpassendocker-compose.dev.yaml
ProductionStabile Instanz für Organisationendocker-compose.prod.yaml + Caddy

Das Repository enthält Beispiele und Vorlagen zur Unterstützung der Einrichtung:

  • .env.example — zeigt erforderliche und optionale Umgebungsvariablen.
  • Caddyfile.example — Beispielkonfiguration für den Reverse Proxy Caddy, einschließlich TLS und Routing zur API und zum Frontend.
  • .github/workflows/prod_deployment.yml — Produktionsworkflow (GitHub Actions CI/CD), der in der Hauptbereitstellung verwendet wird und an eigene Server angepasst werden kann.

⚙️ 2. Voraussetzungen

Folgende Abhängigkeiten müssen vor der Bereitstellung installiert sein:

  • Docker (≥ 20.x)
  • Docker Compose (plugin ≥ v2)
  • Git

🧩 3. Lokale Entwicklungsumgebung

Führe GENTRAIN lokal aus. Im Abschnitt Getting Started finden Sie eine ausführliche Anleitung.

# Start Redis, Postgres, and API
docker compose -f docker-compose.dev.yaml up -d

# Start Frontend, Admin, and Docs (in separate terminals)
npm run dev

Alternativ können Sie das bereitgestellte Skript verwenden:

sh dev.sh

🚀 4. Produktionsbereitstellung

Die Produktionsbereitstellung nutzt Caddy als Reverse Proxy mit HTTPS-Unterstützung. Permanente Docker-Volumes speichern Datenbanken, Uploads und gebaute statische Dateien.

Schritt 1 — Repository klonen

git clone https://github.com/DiltheyLab/GENTRAIN.git
cd GENTRAIN

Schritt 2 — Umgebungsvariablen konfigurieren

Wenn Sie keinen Workflow für das Deployment verwenden, legen Sie die Variablen, die in dem Abschnitt Erklärung der Variablen und Secrets beschrieben sind, manuell an:

cp .env.example .env

Bearbeiten Sie die .env mit den richtigen Hostnamen, Secrets und Pfaden.

Schritt 3 — Caddy konfigurieren

Verwenden Sie Caddyfile.example als Vorlage für die HTTPS- und Routing-Konfiguration:

  • Frontend wird unter der Hauptdomaine bereitgestellt
  • Für die API, die Dokumentation und das Admin-Panel werden entsprechende Subdomains definiert und geroutet.
  • Automatische TLS-Zertifikate über Let’s Encrypt werden unterstützt

Schritt 4 — Redis konfigurieren

Verwenden Sie /backend/redis/redis.conf.prod.example als Vorlage für die Konfiguration:

cp /backend/redis/redis.conf.prod.example /backend/redis/redis.conf.prod

Anschließend müssen Sie lediglich ein Password für den default-User setzen. Die anzupassenden Stellen sind in der Beispiel-Konfigurationsdatei mit insert_password_for_default_user markiert. Beachten Sie dass auch innerhalb der übergreifenden .env-Datei ein entsprechender Eintrag gesetzt sein muss um eine Redis-Verbindung herzustellen (REDIS_PASSWORD).

Schritt 5 — Stack starten

docker compose -f docker-compose.prod.yaml up -d --build

⚙️ 5. Automatisierte Bereitstellung mit GitHub Actions

Das Repository enthält einen Produktions-Workflow unter .github/workflows/prod_deployment.yml.

Dieser Workflow automatisiert:

  1. Das Bauen von Frontend und Dokumentation
  2. Die SSH-Verbindung zum Produktionsserver
  3. Das Erzeugen der .env-Datei aus GitHub Variablen und Secrets
  4. Erstellung eines Datenbank-Backups (es werden nur die letzten 5 Datenbank-Backups gespeichert)
  5. Das sichere Neustarten der Docker-Container
  6. Slack-Benachrichtigungen bei Erfolg oder Fehler

::: Datenbank-Backup

Das erstellte Datenbank-Backup kann wiefolgt angewendet werden:

docker exec -i gentrain-db psql -U gentrain -d test < db_dumps/<db_dump>.sql

Es kann jederzeit ein manuelles Datenbank-Backup erstellt werden:

docker exec -t gentrain-db pg_dump -d gentrain -U gentrain > db_dumps/`date +%Y-%m-%d"_"%H_%M_%S`.sql

:::

Organisationen können denselben Workflow nutzen, indem sie:

  • Das Repository forken oder privat spiegeln
  • Eigene GitHub Actions Variablen und Secrets hinzufügen
  • Einen Branch prod für Produktionsupdates definieren

🔧 6. Erklärung der Variablen und Secrets

Der Workflow generiert die .env-Datei dynamisch auf dem Server anhand von GitHub Variablen (vars) und Secrets (secrets).

Im Folgenden werden alle wichtigen Parameter erläutert.

🔹 Allgemein / Verbindung

NameTypBeschreibung
SSH_HOSTVariableHostname oder IP des Produktionsservers (verwendet von appleboy/ssh-action).
SSH_USERVariableBenutzername für die SSH-Verbindung (z. B. ubuntu, gentrain).
SSH_PRIVATE_KEYSecretPrivater SSH-Schlüssel zur Authentifizierung (niemals ins Repo committen).
GENTRAIN_DIRVariablePfad auf dem Server, in dem GENTRAIN installiert ist (z. B. /opt/gentrain).
PRODUCTION_BRANCHVariableGit-Branch, der für die Produktion verwendet wird (z. B. prod).
GENTRAIN_PASSWORDSecretSudo-Passwort auf dem Server, um Docker mit Root-Rechten neu zu starten.

🔹 Anwendung / API-Konfiguration

NameTypBeschreibung
VITE_API_HOSTVariableÖffentlicher API-Endpunkt (z. B. https://api.deinedomain.org). Wird im Frontend-Build verwendet.
VITE_APP_URLVariableBasis-URL der Anwendung (für Weiterleitungen und Links).
APP_ENV or PROD_APP_ENVVariableLegt die Laufzeitumgebung fest (z. B. production).
API_DATA_DIRECTORYVariablePfad, in dem die API Dateien und Pathogen-Daten speichert.

🔹 Datenbank und Redis

NameTypBeschreibung
DATABASE_DRIVERVariableDatenbanktreiber (in der Regel postgres).
DATABASE_HOSTVariableHostname des PostgreSQL-Dienstes (Containername oder externer Host).
DATABASE_PORTVariablePort des PostgreSQL-Dienstes (Standard: 5432).
DATABASE_NAMEVariableName der GENTRAIN-Datenbank.
DATABASE_USERVariableBenutzername für den Datenbankzugriff.
DATABASE_PASSWORDSecretPasswort für die Datenbankauthentifizierung.
REDIS_HOSTVariableHostname des Redis-Dienstes.
REDIS_PORTVariablePort des Redis-Dienstes (Standard: 6379).
REDIS_USERNAMEVariableOptionaler Redis-Benutzername.
REDIS_PASSWORDSecretPasswort für die Redis-Authentifizierung (falls aktiviert).

🔹 Admin-Panel

NameTypBeschreibung
ADMIN_PANEL_PORTVariablePort, auf dem das Admin-Interface läuft (z. B. 5540).
ADMIN_PANEL_URLVariableÖffentliche oder interne URL für den Admin-Zugang.
DEFAULT_ADMIN_USERNAMEVariableStandard-Admin-Benutzername (bei der ersten Einrichtung).
DEFAULT_ADMIN_PASSWORDSecretStandard-Admin-Passwort (sollte nach dem ersten Login geändert werden).

🔹Sicherheit und Sitzungen

NameTypBeschreibung
SESSION_SECRETSecretWird zur Verschlüsselung von Sitzungen genutzt.
COOKIE_SECRETSecretWird zum Signieren sicherer Cookies verwendet.

🔹 Benachrichtigungen

NameTypBeschreibung
SLACK_WEBHOOK_URLVariableWebhook-URL für Slack-Benachrichtigungen über den Status der Bereitstellung.

🧱 7. Beispiel: Generierung der .env im Workflow

Während des GitHub Actions-Laufs werden die Umgebungsvariablen per SSH gesetzt:

- name: Generate environment variables
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ vars.SSH_HOST }}
username: ${{ vars.SSH_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd ${{ vars.GENTRAIN_DIR }}
rm -f .env
touch .env
echo -e "VITE_API_HOST=${{vars.VITE_API_HOST}}" >> .env
...

So wird sichergestellt, dass die .env-Datei auf dem Server immer den aktuellen GitHub-Variablen entspricht.


💾 8. Persistente Volumes

Im Produktions-Compose sind benannte Docker-Volumes definiert:

VolumeBeschreibung
postgres_dataPostgreSQL-Datenbankdaten (sollte gesichert werden).
api_dataPathogen-Schemata, Beispieldatensätze
frontend_files, docs_filesGebaute Frontend- und Dokumentationsdateien.
caddy_config, caddy_dataCaddy-Konfiguration, Zertifikate und Logs.

Backup-Beispiel:

docker exec -t gentrain-db pg_dumpall -c -U ${DATABASE_USER} > backup.sql
cp -r ./api_data ./backup_api_data_$(date +%F)

🧯 9. Rollback

Falls eine Bereitstellung fehlschlägt:

docker compose -f docker-compose.prod.yaml down
git checkout <previous-tag>
docker compose -f docker-compose.prod.yaml up -d --build

Datenbank wiederherstellen (falls erforderlich):

psql -U $DATABASE_USER -d $DATABASE_NAME -f backup.sql

🧠 10. Sicherheitsrichtlinien

  • Secrets in GitHub regelmäßig rotieren
  • SSH-Zugriff auf vertrauenswürdige IPs beschränken
  • HTTPS mit automatischer Erneuerung über Caddy verwenden
  • Keine Klartext-Passwörter in .env-Dateien speichern
  • Admin-Panel bei öffentlichem Zugriff mit Basic Auth absichern

📁 11. Wichtige Dateien im Repository

DateiZweck
.env.exampleBeispielkonfiguration für benötigte Umgebungsvariablen
Caddyfile.exampleBeispielkonfiguration für HTTPS-Reverse-Proxy
docker-compose.dev.yamlEntwicklungsumgebung
docker-compose.prod.yamlProduktionsumgebung
.github/workflows/prod_deployment.ymlProduktions-CI/CD-Workflow
.github/workflows/dev_deployment.ymlEntwicklungs-CI/CD-Workflow
init-entrypoint.shInitialisiert Volumes und Benutzerrechte für Produktionscontainer