7.8 KiB
7.8 KiB
Deployment Setup für SKAMP API
Diese Anleitung beschreibt das vollständige Setup für das automatische Deployment der Spring Boot Applikation auf einen Remote Server.
Übersicht
Bei einem Push auf den main Branch wird automatisch:
- Die Spring Boot Applikation gebaut
- Ein Docker Image erstellt
- Das Image in die Gitea Container Registry gepusht
- Das Image auf dem Remote Server deployed
Voraussetzungen
Auf dem Deployment-Server
-
Docker installiert (Version 20.10+)
curl -fsSL https://get.docker.com | sh -
Keine weiteren Dateien notwendig
- Der Workflow deployed direkt via
docker run - Keine compose.yml oder .env Dateien auf dem Server erforderlich
- Alle Konfiguration erfolgt über Gitea Secrets
- Der Workflow deployed direkt via
Gitea Configuration
Im Gitea Repository müssen folgende Variables und Secrets angelegt werden:
Repository Settings > Actions > Variables
| Variable Name | Beschreibung | Beispiel |
|---|---|---|
REGISTRY_URL |
Gitea Container Registry URL | gitea.moz-tech.de |
NAMESPACE |
Organisation/Benutzer | murat |
REPO_NAME |
Repository Name | skamp |
Repository Settings > Actions > Secrets
| Secret Name | Beschreibung | Beispiel |
|---|---|---|
CI_GITEA_USER |
Gitea Benutzername | murat |
CI_GITEA_TOKEN |
Gitea Access Token | ghp_xxxxxxxxxxxx |
SSH_HOST |
Server IP/Hostname | 123.456.789.0 |
SSH_USERNAME |
SSH Benutzername | deploy |
SSH_PRIVATE_KEY |
SSH Private Key | -----BEGIN RSA PRIVATE KEY-----... |
SSH_PORT |
SSH Port | 22 |
APP_PORT |
Anwendungs-Port | 8080 |
SPRING_PROFILES_ACTIVE |
Spring Profil | prod |
POSTGRES_HOST |
PostgreSQL Host | db.example.com |
POSTGRES_PORT |
PostgreSQL Port | 5432 |
POSTGRES_DB |
Datenbank Name | skamp |
POSTGRES_USER |
Datenbank User | skamp |
POSTGRES_PASSWORD |
Datenbank Passwort | IhrSicheresPasswort123! |
HIBERNATE_DDL_AUTO |
Hibernate DDL | update |
KEYCLOAK_ISSUER_URI |
Keycloak Issuer URI | https://keycloak.example.com/realms/skamp |
CORS_ALLOWED_ORIGINS |
Erlaubte CORS Origins | https://frontend.example.com |
MINIO_ENDPOINT |
MinIO/S3 Endpoint | https://s3.example.com |
MINIO_ACCESS_KEY |
MinIO Access Key | your_access_key |
MINIO_SECRET_KEY |
MinIO Secret Key | your_secret_key |
JAVA_OPTS |
Java Optionen | -Xmx1024m -Xms512m |
Gitea Token erstellen
- Gitea → Einstellungen → Anwendungen → Access Tokens
- Token Name:
deployment-token - Berechtigungen:
read:packages,write:packages - Token generieren und als
CI_GITEA_TOKENSecret speichern
SSH Key erstellen
# Auf deinem lokalen Rechner
ssh-keygen -t ed25519 -C "deployment-key" -f ~/.ssh/skamp_deploy
# Public Key auf den Server kopieren
ssh-copy-id -i ~/.ssh/skamp_deploy.pub user@server
# Private Key als Secret speichern
cat ~/.ssh/skamp_deploy
Erstes Deployment
Das erste Deployment erfolgt automatisch beim Push auf main. Der Workflow:
- Baut die Spring Boot 3 Applikation mit Maven
- Erstellt ein Docker Image
- Pusht das Image zur Gitea Registry
- Loggt sich per SSH auf dem Server ein
- Pulled das Image
- Startet den Container mit allen Environment-Variablen
Alternativ kannst du das erste Deployment manuell testen:
# Auf dem Server
# Login zur Container Registry
docker login gitea.moz-tech.de -u murat
# Pull Image (ersetze IMAGE_TAG mit einem Commit-SHA oder 'latest')
docker pull gitea.moz-tech.de/murat/skamp:latest
# Starte Container
docker run -d \
--name skamp-app \
--restart unless-stopped \
-p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=prod \
-e SPRING_DATASOURCE_URL=jdbc:postgresql://db.example.com:5432/skamp \
-e SPRING_DATASOURCE_USERNAME=skamp \
-e SPRING_DATASOURCE_PASSWORD=IhrPasswort \
-e SPRING_JPA_HIBERNATE_DDL_AUTO=update \
-e KEYCLOAK_ISSUER_URI=https://keycloak.example.com/realms/skamp \
-e CORS_ALLOWED_ORIGINS=https://frontend.example.com \
-e S3_ACCESS_KEY=your_access_key \
-e S3_SECRET_KEY=your_secret_key \
-e S3_ENDPOINT=https://s3.example.com \
-e JAVA_OPTS="-Xmx1024m -Xms512m" \
gitea.moz-tech.de/murat/skamp:latest
# Prüfe Status
docker ps --filter name=skamp-app
docker logs -f skamp-app
Workflow Trigger
Das Deployment wird automatisch ausgelöst durch:
git add .
git commit -m "Deploy: Update application"
git push origin main
Monitoring
Logs anzeigen
# Auf dem Server
# Container Logs live anzeigen
docker logs -f skamp-app
# Letzte 100 Zeilen
docker logs --tail 100 skamp-app
# Mit Timestamps
docker logs -f --timestamps skamp-app
Container Status
# Status prüfen
docker ps --filter name=skamp-app
# Detaillierte Informationen
docker inspect skamp-app
# Resource-Nutzung
docker stats skamp-app
Health Check
# HTTP Health Check
curl http://localhost:8080/actuator/health
# Container Health Status
docker inspect --format='{{.State.Health.Status}}' skamp-app
Troubleshooting
Workflow schlägt fehl
- Build Error: Prüfe die Java Version und Maven Dependencies in
pom.xml - Registry Login Error: Prüfe
CI_GITEA_TOKENSecret - SSH Error: Prüfe SSH Secrets (
SSH_HOST,SSH_USERNAME,SSH_PRIVATE_KEY,SSH_PORT) - Deployment Error: Prüfe Server-Logs mit
docker logs skamp-app
Container startet nicht
# Prüfe Logs
docker logs skamp-app
# Prüfe Container-Details
docker inspect skamp-app
# Container neu starten
docker restart skamp-app
# Container mit neuen Einstellungen starten
docker stop skamp-app
docker rm skamp-app
# Dann docker run erneut ausführen (siehe Deployment-Sektion)
Datenbank-Verbindungsfehler
# 1. Prüfe ob PostgreSQL erreichbar ist
docker exec skamp-app ping -c 3 $POSTGRES_HOST
# 2. Prüfe Verbindung zur Datenbank
docker exec -it skamp-app sh -c "apt update && apt install -y postgresql-client"
docker exec -it skamp-app psql -h $POSTGRES_HOST -U $POSTGRES_USER -d $POSTGRES_DB
# 3. Prüfe Environment-Variablen im Container
docker exec skamp-app env | grep SPRING_DATASOURCE
Port-Konflikte
# Prüfe ob Port bereits belegt ist
sudo netstat -tlnp | grep :8080
# oder
sudo lsof -i :8080
# Anderen Port verwenden (z.B. 8081)
docker stop skamp-app
docker rm skamp-app
# Dann docker run mit -p 8081:8080 statt -p 8080:8080
Updates
Automatisches Update
Jeder Push auf main löst ein automatisches Update aus.
Manuelles Update auf spezifische Version
# Auf dem Server
# Stoppe aktuellen Container
docker stop skamp-app
docker rm skamp-app
# Pull spezifische Version (ersetze COMMIT_SHA)
docker pull gitea.moz-tech.de/murat/skamp:COMMIT_SHA
# Starte Container mit neuer Version
docker run -d \
--name skamp-app \
--restart unless-stopped \
-p 8080:8080 \
-e ... (alle Environment-Variablen) \
gitea.moz-tech.de/murat/skamp:COMMIT_SHA
Rollback zu vorheriger Version
# Prüfe verfügbare Images
docker images | grep skamp
# Stoppe aktuellen Container
docker stop skamp-app
docker rm skamp-app
# Starte mit älterer Version
docker run -d \
--name skamp-app \
--restart unless-stopped \
-p 8080:8080 \
-e ... (alle Environment-Variablen) \
gitea.moz-tech.de/murat/skamp:OLD_COMMIT_SHA
Security Best Practices
- Secrets niemals committen - Nutze
.gitignorefür.env - Starke Passwörter - Generiere sichere Passwörter für DB und S3
- SSH Key Rotation - Rotiere SSH Keys regelmäßig
- Firewall - Beschränke Zugriff auf notwendige Ports
- Updates - Halte Docker und Images aktuell
- Monitoring - Implementiere Monitoring und Alerting
Weitere Informationen
- Gitea Actions: https://docs.gitea.com/usage/actions/overview
- Docker Compose: https://docs.docker.com/compose/
- Spring Boot: https://spring.io/projects/spring-boot