# Deployment Secrets Configuration Diese Dokumentation beschreibt die erforderlichen Secrets für den automatischen Deployment-Workflow in Gitea. ## Erforderliche Secrets und Variablen in Gitea ### Gitea Variables (nicht-sensitive Daten) Navigiere zu: **Repository Settings → Variables → Actions** Diese Werte sind nicht sensitiv und können als Variables gespeichert werden: | Variable Name | Beschreibung | Beispiel | |------------|--------------|----------| | `REGISTRY_URL` | URL der Container Registry | `gitea.moz-tech.de` | | `NAMESPACE` | Namespace/Organisation in der Registry | `murat` | | `REPO_NAME` | Repository Name für Docker Image | `skamp` | ### Gitea Secrets (sensitive Daten) Navigiere zu: **Repository Settings → Secrets → Actions** Diese Werte sind sensitiv und müssen als Secrets gespeichert werden: #### Container Registry Secrets | Secret Name | Beschreibung | Beispiel | |------------|--------------|----------| | `CI_GITEA_USER` | Gitea Benutzername für Registry Login | `murat` | | `CI_GITEA_TOKEN` | Gitea Access Token mit Registry-Rechten | `74a7738116bfb99497a7781291efc5766901f497` | #### SSH Server Secrets | Secret Name | Beschreibung | Beispiel | |------------|--------------|----------| | `SSH_HOST` | Hostname oder IP des Deployment-Servers | `server.example.com` | | `SSH_USERNAME` | SSH Benutzername | `deploy` | | `SSH_PRIVATE_KEY` | SSH Private Key (kompletter Inhalt) | `-----BEGIN OPENSSH PRIVATE KEY-----...` | | `SSH_PORT` | SSH Port (optional, Standard: 22) | `22` | | `DEPLOY_PATH` | Pfad zum Deployment-Verzeichnis auf dem Server | `/opt/skamp/docker` | ### Application Secrets | Secret Name | Beschreibung | Beispiel | |------------|--------------|----------| | `APP_PORT` | Port für die Anwendung | `8082` | | `SPRING_PROFILES_ACTIVE` | Spring Boot Profil | `prod` | | `APPLICATION_NAME` | Name der Anwendung | `skamp-api` | | `CORS_ALLOWED_ORIGINS` | Erlaubte CORS Origins | `https://app.example.com` | ### PostgreSQL Secrets | Secret Name | Beschreibung | Beispiel | |------------|--------------|----------| | `POSTGRES_HOST` | PostgreSQL Hostname | `postgres` oder `db.example.com` | | `POSTGRES_PORT` | PostgreSQL Port | `5432` | | `POSTGRES_DB` | Datenbank Name | `skamp` | | `POSTGRES_USER` | Datenbank Benutzername | `skamp_user` | | `POSTGRES_PASSWORD` | Datenbank Passwort | `secure_password_here` | | `HIBERNATE_DDL_AUTO` | Hibernate DDL Modus | `update` oder `validate` | ### Keycloak Secrets | Secret Name | Beschreibung | Beispiel | |------------|--------------|----------| | `KEYCLOAK_URL` | Keycloak Server URL | `https://auth.moz-tech.de/` | | `KEYCLOAK_REALM` | Keycloak Realm | `enerport` | | `KEYCLOAK_ISSUER_URI` | Keycloak Issuer URI | `https://auth.moz-tech.de/realms/enerport` | ### MinIO (S3) Secrets | Secret Name | Beschreibung | Beispiel | |------------|--------------|----------| | `MINIO_ENDPOINT` | MinIO Endpoint URL | `http://minio:9000` | | `MINIO_ACCESS_KEY` | MinIO Access Key | `minioadmin` | | `MINIO_SECRET_KEY` | MinIO Secret Key | `minioadmin123` | ### AWS S3 Secrets (Optional) | Secret Name | Beschreibung | Beispiel | |------------|--------------|----------| | `AWS_ACCESS_KEY_ID` | AWS Access Key ID | `AKIAIOSFODNN7EXAMPLE` | | `AWS_SECRET_ACCESS_KEY` | AWS Secret Access Key | `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY` | | `AWS_S3_BUCKET_NAME` | AWS S3 Bucket Name | `my-bucket` | | `AWS_S3_REGION` | AWS S3 Region | `eu-central-1` | | `AWS_S3_ENDPOINT` | AWS S3 Endpoint (optional) | `https://s3.eu-central-1.amazonaws.com` | ### Additional Configuration Secrets | Secret Name | Beschreibung | Beispiel | |------------|--------------|----------| | `JAVA_OPTS` | Java JVM Optionen | `-Xmx512m -Xms256m` | ## Workflow Ablauf Der Workflow wird bei jedem Push auf den `main` Branch ausgelöst: 1. **Checkout Code** - Lädt den Repository-Code 2. **Login to Container Registry** - Authentifiziert sich bei der Gitea Registry 3. **Extract metadata** - Erstellt Image-Tags (commit SHA + latest) 4. **Build and Push Docker Image** - Baut das Docker Image mit Multi-Stage Build (Maven Build + Runtime Image) und pusht es zur Registry 5. **Deploy to Remote Server** - Verbindet per SSH zum Server, erstellt .env Datei aus Secrets und deployed die Anwendung **Hinweis:** Der Maven Build erfolgt im Docker Multi-Stage Build (siehe Dockerfile), daher ist kein separater Maven-Build-Step im Workflow erforderlich. ## Server-Vorbereitung Auf dem Deployment-Server müssen folgende Voraussetzungen erfüllt sein: 1. **Docker und Docker Compose installiert** ```bash docker --version docker compose version ``` 2. **Deployment-Verzeichnis eingerichtet** ```bash mkdir -p /opt/skamp/docker cd /opt/skamp/docker ``` 3. **Docker Compose Konfiguration** - `compose.yml` - Die Docker Compose Konfiguration - `.env` - Umgebungsvariablen für das Deployment 4. **SSH-Zugriff konfiguriert** - SSH Public Key des CI/CD Servers muss auf dem Deployment-Server hinterlegt sein - SSH Private Key muss als Secret `SSH_PRIVATE_KEY` in Gitea hinterlegt sein ## Image Tagging Der Workflow erstellt zwei Image-Tags: - `${REGISTRY_URL}/${NAMESPACE}/${REPO_NAME}:${COMMIT_SHA}` - Spezifischer Commit - `${REGISTRY_URL}/${NAMESPACE}/${REPO_NAME}:latest` - Immer die neueste Version ## Deployment auf dem Server Das Deployment-Script auf dem Server: 1. Navigiert zum Deployment-Verzeichnis 2. Authentifiziert sich bei der Container Registry 3. Setzt die IMAGE_TAG Umgebungsvariable auf den Commit SHA 4. Pullt das neueste Image 5. Startet die Services neu mit `docker compose up -d` 6. Räumt alte Images auf (älter als 7 Tage) 7. Zeigt laufende Container an ## Troubleshooting ### Problem: Login zur Registry schlägt fehl - Überprüfe CI_GITEA_TOKEN hat die richtigen Berechtigungen - Stelle sicher, dass REGISTRY_URL korrekt ist (ohne `https://`) ### Problem: SSH-Verbindung schlägt fehl - Überprüfe SSH_HOST, SSH_USERNAME und SSH_PORT - Stelle sicher, dass SSH_PRIVATE_KEY korrekt formatiert ist (mit Zeilenumbrüchen) - Prüfe, ob der Public Key auf dem Server hinterlegt ist ### Problem: Docker Compose startet nicht - Überprüfe, ob die .env Datei auf dem Server existiert und korrekt ist - Stelle sicher, dass compose.yml im DEPLOY_PATH vorhanden ist - Prüfe die Logs mit `docker compose logs` ## Manuelles Deployment Falls ein manuelles Deployment erforderlich ist: ```bash # Auf dem Server cd /opt/skamp/docker # Login zur Registry echo "YOUR_TOKEN" | docker login gitea.moz-tech.de -u murat --password-stdin # Image pullen und starten docker compose pull docker compose up -d # Logs prüfen docker compose logs -f app