Files
skamp/DEPLOYMENT_SECRETS.md
2025-11-04 12:29:32 +01:00

182 lines
6.5 KiB
Markdown

# 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