ci: setup CI/CD pipeline with Gitea Actions and secrets configuration
This commit is contained in:
86
.gitea/workflows/AUTO_SETUP_SECRETS.md
Normal file
86
.gitea/workflows/AUTO_SETUP_SECRETS.md
Normal file
@@ -0,0 +1,86 @@
|
||||
# Automatisches Secrets-Setup
|
||||
|
||||
## Schnellstart
|
||||
|
||||
```bash
|
||||
# Interaktives Script (fragt nach Token)
|
||||
bash scripts/setup-gitea-secrets-interactive.sh
|
||||
```
|
||||
|
||||
Das Script:
|
||||
1. Fragt nach einem Gitea Access Token
|
||||
2. Setzt automatisch alle drei Secrets via API
|
||||
|
||||
## Token generieren
|
||||
|
||||
Falls noch kein Token vorhanden:
|
||||
|
||||
1. **Gehe zu Gitea Settings:**
|
||||
```
|
||||
https://git.michaelschiemer.de/user/settings/applications
|
||||
```
|
||||
|
||||
2. **Klicke "Generate New Token"**
|
||||
|
||||
3. **Konfiguration:**
|
||||
- Name: `secrets-setup` (oder beliebig)
|
||||
- Disponível scopes:
|
||||
- ✅ `write:repository` (mindestens)
|
||||
- ✅ Oder wähle alle für volle Berechtigung
|
||||
|
||||
4. **Kopiere den Token** (wird nur einmal angezeigt!)
|
||||
|
||||
## Script ausführen
|
||||
|
||||
```bash
|
||||
# Script starten
|
||||
bash scripts/setup-gitea-secrets-interactive.sh
|
||||
|
||||
# Token eingeben (wird nicht angezeigt)
|
||||
Gitea Token: <token-einfügen>
|
||||
|
||||
# Script setzt automatisch:
|
||||
# ✅ REGISTRY_USER = admin
|
||||
# ✅ REGISTRY_PASSWORD = registry-secure-password-3125
|
||||
# ✅ SSH_PRIVATE_KEY = <aus ~/.ssh/production>
|
||||
```
|
||||
|
||||
## Verifizierung
|
||||
|
||||
Nach erfolgreichem Setup:
|
||||
|
||||
1. **Prüfe in Gitea UI:**
|
||||
```
|
||||
https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions
|
||||
```
|
||||
|
||||
2. **Sollte zeigen:**
|
||||
- ✅ REGISTRY_USER
|
||||
- ✅ REGISTRY_PASSWORD
|
||||
- ✅ SSH_PRIVATE_KEY
|
||||
|
||||
Alle drei Secrets sollten "Hidden" als Wert anzeigen.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "Token ungültig"
|
||||
- Prüfe, ob Token korrekt kopiert wurde (keine Leerzeichen)
|
||||
- Prüfe, ob Token die Berechtigung `write:repository` hat
|
||||
|
||||
### "Repository nicht gefunden"
|
||||
- Prüfe Repository-Name: `michael/michaelschiemer`
|
||||
- Prüfe, ob du Zugriff auf das Repository hast
|
||||
|
||||
### "HTTP 403 Forbidden"
|
||||
- Token hat keine ausreichenden Berechtigungen
|
||||
- Generiere neuen Token mit `write:repository` scope
|
||||
|
||||
### API nicht erreichbar
|
||||
- Prüfe Gitea URL: `https://git.michaelschiemer.de`
|
||||
- Prüfe Netzwerkverbindung
|
||||
|
||||
## Alternative: Manuelles Setup
|
||||
|
||||
Falls das automatische Setup nicht funktioniert:
|
||||
|
||||
Siehe `.gitea/workflows/QUICK_SECRETS_SETUP.md` für manuelle Anleitung.
|
||||
90
.gitea/workflows/CI_CD_CHECKLIST.md
Normal file
90
.gitea/workflows/CI_CD_CHECKLIST.md
Normal file
@@ -0,0 +1,90 @@
|
||||
# CI/CD Pipeline - Setup Checklist
|
||||
|
||||
## ✅ Status
|
||||
|
||||
### 1. Repository Secrets in Gitea ✅ BEREIT
|
||||
**Pfad**: Repository → Settings → Secrets
|
||||
|
||||
**Schnelles Setup:**
|
||||
```bash
|
||||
bash scripts/prepare-secrets.sh
|
||||
```
|
||||
|
||||
**Erforderliche Secrets:**
|
||||
- [ ] **REGISTRY_USER**: `admin`
|
||||
- [ ] **REGISTRY_PASSWORD**: `registry-secure-password-2025`
|
||||
- [ ] **SSH_PRIVATE_KEY**: Vollständiger Inhalt von `~/.ssh/production`
|
||||
|
||||
**Details**: Siehe `.gitea/workflows/QUICK_SECRETS_SETUP.md`
|
||||
|
||||
**Hinweis**: Alle Secrets müssen in Gitea konfiguriert werden, bevor die Pipeline läuft.
|
||||
|
||||
### 2. Docker Registry ✅
|
||||
- ✅ Registry läuft auf `git.michaelschiemer.de:5000`
|
||||
- ✅ Authentifizierung konfiguriert (admin/registry-secure-password-2025)
|
||||
- ✅ Erreichbar via HTTP auf `127.0.0.1:5000`
|
||||
- ✅ Image `framework` bereits vorhanden
|
||||
|
||||
**Registry-Test**:
|
||||
```bash
|
||||
curl -u admin:registry-secure-password-2025 http://127.0.0.1:5000/v2/_catalog
|
||||
# Erwartete Ausgabe: {"repositories":["framework"]}
|
||||
```
|
||||
|
||||
### 3. Ansible Playbooks ✅
|
||||
- ✅ `deploy-update.yml` - Aktualisiert für Docker Compose
|
||||
- ✅ `rollback.yml` - Aktualisiert für Docker Compose
|
||||
- ✅ `setup-infrastructure.yml` - Enthält Registry-Setup
|
||||
- ✅ `sync-stacks.yml` - Synchronisiert Stack-Konfigurationen
|
||||
|
||||
### 4. Workflow-Konfiguration ✅
|
||||
- ✅ `.gitea/workflows/production-deploy.yml` - Haupt-Workflow
|
||||
- ✅ `Dockerfile.production` - Production Dockerfile erstellt
|
||||
- ✅ Application Stack konfiguriert (`deployment/stacks/application/docker-compose.yml`)
|
||||
|
||||
## 📋 Nächste Schritte
|
||||
|
||||
### Schritt 1: Secrets in Gitea hinzufügen
|
||||
Siehe `.gitea/workflows/SECRETS_SETUP.md` für detaillierte Anleitung.
|
||||
|
||||
### Schritt 2: Workflow manuell testen
|
||||
1. Gehe zu: `https://git.michaelschiemer.de/<username>/michaelschiemer/actions`
|
||||
2. Wähle "Production Deployment Pipeline"
|
||||
3. Klicke "Run workflow"
|
||||
4. Wähle Branch `main`
|
||||
5. Beobachte die Ausführung
|
||||
|
||||
### Schritt 3: Automatisches Deployment testen
|
||||
1. Push zu `main` Branch
|
||||
2. Workflow sollte automatisch starten
|
||||
3. Prüfe Logs in Gitea Actions
|
||||
|
||||
## 🔧 Troubleshooting
|
||||
|
||||
### Registry nicht erreichbar
|
||||
```bash
|
||||
# Prüfe Registry-Status
|
||||
ssh deploy@94.16.110.151 "docker ps | grep registry"
|
||||
|
||||
# Teste Registry-Erreichbarkeit
|
||||
ssh deploy@94.16.110.151 "curl -u admin:registry-secure-password-2025 http://127.0.0.1:5000/v2/_catalog"
|
||||
```
|
||||
|
||||
### Workflow schlägt bei Registry-Login fehl
|
||||
- Prüfe, ob `REGISTRY_USER` und `REGISTRY_PASSWORD` Secrets korrekt gesetzt sind
|
||||
- Prüfe, ob das Passwort in Gitea mit dem Server übereinstimmt
|
||||
|
||||
### Image Pull schlägt fehl
|
||||
- Prüfe, ob das Image in der Registry existiert:
|
||||
```bash
|
||||
curl -u admin:registry-secure-password-2025 http://127.0.0.1:5000/v2/framework/tags/list
|
||||
```
|
||||
- Prüfe Registry-Logs für Fehler
|
||||
|
||||
### Deployment schlägt fehl
|
||||
- Prüfe Ansible-Logs im Workflow
|
||||
- Prüfe, ob `deployment/stacks/application/docker-compose.yml` auf dem Server existiert
|
||||
- Prüfe Docker-Logs auf dem Server:
|
||||
```bash
|
||||
ssh deploy@94.16.110.151 "cd ~/deployment/stacks/application && docker compose logs"
|
||||
```
|
||||
101
.gitea/workflows/MANUAL_SETUP_SIMPLE.md
Normal file
101
.gitea/workflows/MANUAL_SETUP_SIMPLE.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# Manuelles Secrets-Setup - Einfache Anleitung
|
||||
|
||||
Da das automatische Setup Probleme macht, hier die manuelle Lösung:
|
||||
|
||||
## Schritt 1: Gehe zu Gitea Secrets-Seite
|
||||
|
||||
Öffne im Browser:
|
||||
```
|
||||
https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions
|
||||
```
|
||||
|
||||
**Hinweis**: Falls diese Seite nicht existiert oder einen 404 gibt:
|
||||
- Prüfe, ob das Repository wirklich `michael/michaelschiemer` heißt
|
||||
- Prüfe, ob du Zugriff auf das Repository hast
|
||||
- Prüfe, ob Actions aktiviert ist
|
||||
|
||||
## Schritt 2: Füge die drei Secrets hinzu
|
||||
|
||||
Für jedes Secret: **Klicke "New Secret"**, fülle aus, **Save**
|
||||
|
||||
### Secret 1: REGISTRY_USER
|
||||
|
||||
- **Name**: `REGISTRY_USER`
|
||||
- **Value**: `admin`
|
||||
- **Save**
|
||||
|
||||
### Secret 2: REGISTRY_PASSWORD
|
||||
|
||||
- **Name**: `REGISTRY_PASSWORD`
|
||||
- **Value**: `registry-secure-password-2025`
|
||||
- **Save**
|
||||
|
||||
### Secret 3: SSH_PRIVATE_KEY
|
||||
|
||||
- **Name**: `SSH_PRIVATE_KEY`
|
||||
- **Value**: Führe aus `cat ~/.ssh/production` und kopiere den KOMPLETTEN Inhalt
|
||||
```bash
|
||||
cat ~/.ssh/production
|
||||
```
|
||||
|
||||
**Wichtig**: Kopiere ALLES, inklusive:
|
||||
- `-----BEGIN OPENSSH PRIVATE KEY-----`
|
||||
- Alle Zeilen dazwischen
|
||||
- `-----END OPENSSH PRIVATE KEY-----`
|
||||
|
||||
- **Save**
|
||||
|
||||
## Schritt 3: Verifizierung
|
||||
|
||||
Nach dem Setup sollten alle drei Secrets in der Liste erscheinen:
|
||||
- ✅ REGISTRY_USER
|
||||
- ✅ REGISTRY_PASSWORD
|
||||
- ✅ SSH_PRIVATE_KEY
|
||||
|
||||
Alle zeigen "Hidden" als Wert.
|
||||
|
||||
## Falls die Secrets-Seite nicht erreichbar ist
|
||||
|
||||
### Option A: Repository-Name prüfen
|
||||
|
||||
```bash
|
||||
# Prüfe aktuelle Remote-URL
|
||||
git remote get-url origin
|
||||
|
||||
# Sollte zeigen:
|
||||
# https://git.michaelschiemer.de/<owner>/<repo>.git
|
||||
```
|
||||
|
||||
Falls der Name anders ist, verwende die korrekte URL.
|
||||
|
||||
### Option B: Repository erstellen
|
||||
|
||||
Falls das Repository noch nicht existiert:
|
||||
|
||||
1. Gehe zu: `https://git.michaelschiemer.de/repos/new`
|
||||
2. Erstelle das Repository `michaelschiemer`
|
||||
3. Dann gehe zu: `https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions`
|
||||
|
||||
### Option C: Actions aktivieren
|
||||
|
||||
Falls Actions nicht aktiviert ist:
|
||||
|
||||
1. Gehe zu Repository Settings
|
||||
2. Prüfe, ob "Actions" aktiviert ist
|
||||
3. Falls nicht, aktiviere es in den Repository-Einstellungen
|
||||
|
||||
## Nächster Schritt
|
||||
|
||||
Nach erfolgreichem Setup der Secrets:
|
||||
|
||||
1. **Teste den Workflow:**
|
||||
```
|
||||
https://git.michaelschiemer.de/michael/michaelschiemer/actions
|
||||
```
|
||||
|
||||
2. **Oder pushe einen Commit:**
|
||||
```bash
|
||||
git push origin main
|
||||
```
|
||||
|
||||
Der Workflow sollte dann automatisch starten.
|
||||
87
.gitea/workflows/MANUAL_SETUP_WITH_TOKEN.md
Normal file
87
.gitea/workflows/MANUAL_SETUP_WITH_TOKEN.md
Normal file
@@ -0,0 +1,87 @@
|
||||
# Secrets Setup mit Token - Schritt für Schritt
|
||||
|
||||
## ✅ Du hast bereits ein Token - Perfekt!
|
||||
|
||||
## Option 1: Automatisches Setup (Empfohlen)
|
||||
|
||||
Führe einfach dieses Kommando aus (ersetze `<DEIN_TOKEN>` mit deinem Token):
|
||||
|
||||
```bash
|
||||
bash scripts/setup-gitea-secrets-with-token.sh <DEIN_TOKEN>
|
||||
```
|
||||
|
||||
**Beispiel:**
|
||||
```bash
|
||||
bash scripts/setup-gitea-secrets-with-token.sh ghp_1234567890abcdefghijklmnopqrstuvwxyz
|
||||
```
|
||||
|
||||
Das Script:
|
||||
1. ✅ Testet die API-Verbindung
|
||||
2. ✅ Setzt automatisch `REGISTRY_USER` = `admin`
|
||||
3. ✅ Setzt automatisch `REGISTRY_PASSWORD` = `registry-secure-password-2025`
|
||||
4. ✅ Setzt automatisch `SSH_PRIVATE_KEY` = Inhalt von `~/.ssh/production`
|
||||
|
||||
## Option 2: Manuell über Gitea UI
|
||||
|
||||
Falls das automatische Setup nicht funktioniert:
|
||||
|
||||
### Schritt 1: Gehe zu Secrets-Seite
|
||||
|
||||
```
|
||||
https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions
|
||||
```
|
||||
|
||||
### Schritt 2: Füge jedes Secret einzeln hinzu
|
||||
|
||||
**REGISTRY_USER:**
|
||||
1. Klicke "New Secret"
|
||||
2. Name: `REGISTRY_USER`
|
||||
3. Value: `admin`
|
||||
4. Save
|
||||
|
||||
**REGISTRY_PASSWORD:**
|
||||
1. Klicke "New Secret"
|
||||
2. Name: `REGISTRY_PASSWORD`
|
||||
3. Value: `registry-secure-password-2025`
|
||||
4. Save
|
||||
|
||||
**SSH_PRIVATE_KEY:**
|
||||
1. Klicke "New Secret"
|
||||
2. Name: `SSH_PRIVATE_KEY`
|
||||
3. Value: Kompletter Inhalt von `~/.ssh/production`
|
||||
```bash
|
||||
cat ~/.ssh/production
|
||||
```
|
||||
(Kopiere ALLES, inklusive `-----BEGIN` und `-----END` Zeilen)
|
||||
4. Save
|
||||
|
||||
## Verifizierung
|
||||
|
||||
Nach dem Setup:
|
||||
|
||||
1. **Prüfe in Gitea UI:**
|
||||
```
|
||||
https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions
|
||||
```
|
||||
|
||||
2. **Sollte zeigen:**
|
||||
- ✅ REGISTRY_USER
|
||||
- ✅ REGISTRY_PASSWORD
|
||||
- ✅ SSH_PRIVATE_KEY
|
||||
|
||||
Alle drei Secrets sollten "Hidden" als Wert anzeigen.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "API-Verbindung fehlgeschlagen"
|
||||
- Prüfe Token-Kopierung (keine Leerzeichen)
|
||||
- Prüfe Token-Berechtigung: `write:repository` Scope nötig
|
||||
- Prüfe Repository-Name: `michael/michaelschiemer`
|
||||
|
||||
### "HTTP 403 Forbidden"
|
||||
- Token hat keine ausreichenden Berechtigungen
|
||||
- Generiere neuen Token mit `write:repository` scope
|
||||
|
||||
### "HTTP 404 Not Found"
|
||||
- Repository existiert nicht oder falscher Name
|
||||
- Prüfe: `https://git.michaelschiemer.de/michael/michaelschiemer`
|
||||
119
.gitea/workflows/NEXT_STEPS.md
Normal file
119
.gitea/workflows/NEXT_STEPS.md
Normal file
@@ -0,0 +1,119 @@
|
||||
# ✅ Secrets erfolgreich gesetzt!
|
||||
|
||||
## Status
|
||||
|
||||
✅ Repository erstellt
|
||||
✅ Secrets konfiguriert:
|
||||
- REGISTRY_USER
|
||||
- REGISTRY_PASSWORD
|
||||
- SSH_PRIVATE_KEY
|
||||
|
||||
## 🚀 Nächster Schritt: CI/CD Workflow testen
|
||||
|
||||
### Option 1: Workflow manuell triggern (Empfohlen)
|
||||
|
||||
1. **Gehe zu Actions:**
|
||||
```
|
||||
https://git.michaelschiemer.de/michael/michaelschiemer/actions
|
||||
```
|
||||
|
||||
2. **Workflow auswählen:**
|
||||
- Suche nach "Production Deployment Pipeline"
|
||||
- Klicke auf den Workflow
|
||||
|
||||
3. **Workflow starten:**
|
||||
- Klicke "Run workflow" (rechts oben)
|
||||
- Branch: `main`
|
||||
- `skip_tests`: deaktiviert (Tests sollen laufen)
|
||||
- Klicke "Run workflow"
|
||||
|
||||
4. **Logs beobachten:**
|
||||
- Prüfe jeden Schritt in den Logs
|
||||
- Er_warte ~8-15 Minuten für komplette Ausführung
|
||||
|
||||
### Option 2: Automatisches Deployment via Commit
|
||||
|
||||
```bash
|
||||
# Stelle sicher, dass alles committed ist
|
||||
git add .
|
||||
git commit -m "chore: CI/CD pipeline setup complete"
|
||||
|
||||
# Push zu main - startet automatisch den Workflow
|
||||
git push origin main
|
||||
```
|
||||
|
||||
## 📊 Workflow-Schritte
|
||||
|
||||
Der Workflow führt folgende Schritte aus:
|
||||
|
||||
1. **Tests** (~2-5 Min)
|
||||
- PHP Setup
|
||||
- Composer Dependencies
|
||||
- Tests ausführen
|
||||
|
||||
2. **Build** (~3-5 Min)
|
||||
- Multi-Stage Docker Build
|
||||
- Composer Dependencies (Production)
|
||||
- Frontend Build (npm)
|
||||
- Final Production Image
|
||||
|
||||
3. **Push** (~1-2 Min)
|
||||
- Docker Login zur Registry
|
||||
- Image Tag generieren
|
||||
- Image zur Registry pushen
|
||||
|
||||
4. **Deploy** (~2-4 Min)
|
||||
- Ansible Playbook ausführen
|
||||
- Image auf Production pullen
|
||||
- Application Stack aktualisieren
|
||||
- Services neu starten
|
||||
|
||||
**Gesamtzeit: ~8-15 Minuten**
|
||||
|
||||
## ✅ Erfolgreiche Ausführung erkennen
|
||||
|
||||
Der Workflow ist erfolgreich, wenn:
|
||||
|
||||
- ✅ Alle Jobs grün sind
|
||||
- ✅ Keine Fehler in den Logs
|
||||
- ✅ "Deploy via Ansible" erfolgreich
|
||||
- ✅ Application läuft auf Production-Server
|
||||
|
||||
## 🔍 Verifizierung nach Deployment
|
||||
|
||||
```bash
|
||||
# Prüfe Application-Status
|
||||
ssh deploy@94.16.110.151 "cd ~/deployment/stacks/application && docker compose ps"
|
||||
|
||||
# Prüfe Logs
|
||||
ssh deploy@94.16.110.151 "cd ~/deployment/stacks/application && docker compose logs --tail=50"
|
||||
|
||||
# Prüfe Health Endpoint
|
||||
curl -k https://michaelschiemer.de/health
|
||||
```
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### Workflow startet nicht
|
||||
- Prüfe, ob `.gitea/workflows/production-deploy.yml` im Repository ist
|
||||
- Prüfe Workflow-Syntax
|
||||
|
||||
### "Secret not found" Fehler
|
||||
- Prüfe Secrets-Seite: `https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions`
|
||||
- Prüfe, ob Namen exakt übereinstimmen (Groß-/Kleinschreibung!)
|
||||
|
||||
### Registry Login fehlgeschlagen
|
||||
- Prüfe `REGISTRY_USER` und `REGISTRY_PASSWORD` Secrets
|
||||
- Teste Registry: `curl -u admin:registry-secure-password-2025 http://127.0.0.1:5000/v2/_catalog`
|
||||
|
||||
### Deployment fehlgeschlagen
|
||||
- Prüfe `SSH_PRIVATE_KEY` Secret
|
||||
- Prüfe Ansible-Verbindung: `ssh deploy@94.16.110.151 "echo OK"`
|
||||
- Prüfe Server-Logs
|
||||
|
||||
## 🎉 Nach erfolgreichem Test
|
||||
|
||||
Du kannst jetzt:
|
||||
- ✅ Commits pushen → Automatisches Deployment
|
||||
- ✅ Workflow manuell triggern für kontrollierte Deployments
|
||||
- ✅ Branch-Protection aktivieren für sichere Deployments
|
||||
104
.gitea/workflows/QUICK_SECRETS_SETUP.md
Normal file
104
.gitea/workflows/QUICK_SECRETS_SETUP.md
Normal file
@@ -0,0 +1,104 @@
|
||||
# Quick Secrets Setup für Gitea CI/CD
|
||||
|
||||
## Zusammenfassung der benötigten Werte
|
||||
|
||||
### REGISTRY_USER
|
||||
```
|
||||
admin
|
||||
```
|
||||
|
||||
### REGISTRY_PASSWORD
|
||||
```
|
||||
registry-secure-password-2025
|
||||
```
|
||||
|
||||
### SSH_PRIVATE_KEY
|
||||
Kopiere den kompletten Inhalt von φ~/.ssh/production`:
|
||||
|
||||
```bash
|
||||
# Zeige SSH Key Inhalt (für Copy-Paste)
|
||||
cat ~/.ssh/production
|
||||
```
|
||||
|
||||
**Wichtig**: Der komplette Inhalt muss kopiert werden, inklusive:
|
||||
- `-----BEGIN OPENSSH PRIVATE KEY-----`
|
||||
- Alle Zeilen dazwischen
|
||||
- `-----END OPENSSH PRIVATE KEY-----`
|
||||
|
||||
## Schnelle Vorbereitung
|
||||
|
||||
Führe das Helper-Script aus, um alle Werte anzuzeigen:
|
||||
|
||||
```bash
|
||||
bash scripts/prepare-secrets.sh
|
||||
```
|
||||
|
||||
Dies zeigt alle drei Secrets an, die du kopieren kannst.
|
||||
|
||||
## Manuelle Einrichtung in Gitea
|
||||
|
||||
1. **Gehe zu Repository Settings:**
|
||||
```
|
||||
https://git.michaelschiemer.de/<username>/michaelschiemer/settings/secrets
|
||||
```
|
||||
|
||||
2. **Klicke auf "New Secret"**
|
||||
|
||||
3. **Füge jedes Secret hinzu:**
|
||||
|
||||
**REGISTRY_USER:**
|
||||
- Name: `REGISTRY_USER`
|
||||
- Value: `admin`
|
||||
- Save
|
||||
|
||||
**REGISTRY_PASSWORD:**
|
||||
- Name: `REGISTRY_PASSWORD`
|
||||
- Value: `registry-secure-password-2025`
|
||||
- Save
|
||||
|
||||
**SSH_PRIVATE_KEY:**
|
||||
- Name: `SSH_PRIVATE_KEY`
|
||||
- Value: `<kompletter Inhalt von cat ~/.ssh/production>`
|
||||
- Save
|
||||
|
||||
## Verifizierung
|
||||
|
||||
Nach dem Setup sollten alle drei Secrets in der Liste erscheinen:
|
||||
- ✅ REGISTRY_USER
|
||||
- ✅ REGISTRY_PASSWORD
|
||||
- ✅ SSH_PRIVATE_KEY
|
||||
|
||||
Alle zeigen "Hidden" als Wert.
|
||||
|
||||
## Nächster Schritt
|
||||
|
||||
Sobald die Secrets konfiguriert sind:
|
||||
|
||||
1. **Workflow manuell testen:**
|
||||
```
|
||||
https://git.michaelschiemer.de/<username>/michaelschiemer/actions
|
||||
```
|
||||
- Wähle "Production Deployment Pipeline"
|
||||
- Klicke "Run workflow"
|
||||
- Wähle Branch `main`
|
||||
|
||||
2. **Oder automatisches Deployment testen:**
|
||||
- Pushe einen Commit zu `main`
|
||||
- Workflow startet automatisch
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Secrets werden nicht erkannt
|
||||
- Prüfe, ob die Namen exakt übereinstimmen (Groß-/Kleinschreibung!)
|
||||
- Prüfe, ob keine Leerzeichen am Anfang/Ende
|
||||
|
||||
### SSH Key Fehler
|
||||
- Stelle sicher, dass der komplette Key kopiert wurde
|
||||
- Prüfe, dass `-----BEGIN` und `-----END` Zeilen enthalten sind
|
||||
|
||||
### Registry Login Fehler
|
||||
- Prüfe, ob `REGISTRY_USER` und `REGISTRY_PASSWORD` korrekt sind
|
||||
- Teste Registry-Erreichbarkeit:
|
||||
```bash
|
||||
curl -u admin:registry-secure-password-2025 http://127.0.0.1:5000/v2/_catalog
|
||||
```
|
||||
30
.gitea/workflows/REGISTRY_INFO.md
Normal file
30
.gitea/workflows/REGISTRY_INFO.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# Docker Registry Information
|
||||
|
||||
## Registry Details
|
||||
|
||||
- **URL**: `git.michaelschiemer.de:5000` (intern) oder `registry.michaelschiemer.de` (via Traefik)
|
||||
- **Standard Credentials**:
|
||||
- **Username**: `admin`
|
||||
- **Password**: `registry-secure-password-2025`
|
||||
|
||||
⚠️ **WICHTIG**: Das Passwort sollte in Produktion geändert werden!
|
||||
|
||||
## Für Gitea Secrets
|
||||
|
||||
Verwende folgende Werte in den Gitea Repository Secrets:
|
||||
|
||||
- **REGISTRY_USER**: `admin`
|
||||
- **REGISTRY_PASSWORD**: `registry-secure-password-2025` (oder das aktuell gesetzte Passwort)
|
||||
|
||||
## Registry Test
|
||||
|
||||
```bash
|
||||
# Login testen
|
||||
echo "registry-secure-password-2025" | docker login git.michaelschiemer.de:5000 -u admin --password-stdin
|
||||
|
||||
# Images auflisten
|
||||
curl -u admin:registry-secure-password-2025 http://git.michaelschiemer.de:5000/v2/_catalog
|
||||
|
||||
# Oder via Traefik (HTTPS)
|
||||
curl -u admin:registry-secure-password-2025 https://registry.michaelschiemer.de/v2/_catalog
|
||||
```
|
||||
86
.gitea/workflows/SECRETS_SETUP.md
Normal file
86
.gitea/workflows/SECRETS_SETUP.md
Normal file
@@ -0,0 +1,86 @@
|
||||
# Gitea Repository Secrets Setup
|
||||
|
||||
## Erforderliche Secrets
|
||||
|
||||
Diese Secrets müssen in Gitea konfiguriert werden unter:
|
||||
**Repository → Settings → Secrets**
|
||||
|
||||
### 1. REGISTRY_USER
|
||||
- **Beschreibung**: Benutzername für Docker Registry Login
|
||||
- **Typ**: String
|
||||
- **Wert**: Standardmäßig `admin` oder der Benutzername für die Registry
|
||||
- **Verwendung**: Docker Registry Authentication beim Image Push
|
||||
|
||||
### 2. REGISTRY_PASSWORD
|
||||
- **Beschreibung**: Passwort für Docker Registry Login
|
||||
- **Typ**: Password (versteckt)
|
||||
- **Wert**: Das Passwort für die Docker Registry auf `git.michaelschiemer.de:5000`
|
||||
- **Verwendung**: Docker Registry Authentication beim Image Push
|
||||
|
||||
### 3. SSH_PRIVATE_KEY
|
||||
- **Beschreibung**: SSH Private Key für Zugriff auf Production Server
|
||||
- **Typ**: SSH Key (versteckt)
|
||||
- **Wert**: Der komplette Inhalt der SSH-Private-Key-Datei (~/.ssh/production)
|
||||
- **Verwendung**: SSH-Verbindung zum Production-Server für Ansible Deployment
|
||||
|
||||
## Setup-Anleitung
|
||||
|
||||
### Schritt 1: SSH Key erstellen/exportieren
|
||||
|
||||
```bash
|
||||
# Falls noch nicht vorhanden, SSH Key für Production erstellen
|
||||
ssh-keygen -t ed25519 -f ~/.ssh/production -C "gitea-ci-cd"
|
||||
|
||||
# SSH Key Inhalt anzeigen (für Copy-Paste)
|
||||
cat ~/.ssh/production
|
||||
```
|
||||
|
||||
**⚠️ Wichtig**: Der komplette Inhalt der Datei (inkl. `-----BEGIN OPENSSH PRIVATE KEY-----` und `-----END OPENSSH PRIVATE KEY-----`) muss in das Secret eingefügt werden.
|
||||
|
||||
### Schritt 2: Docker Registry Credentials prüfen
|
||||
|
||||
Die Registry läuft auf dem Production-Server. Prüfe die Credentials:
|
||||
|
||||
```bash
|
||||
# SSH zum Production-Server
|
||||
ssh deploy@94.16.110.151
|
||||
|
||||
# Prüfe, ob Registry läuft
|
||||
docker ps | grep registry
|
||||
|
||||
# Prüfe Registry-Konfiguration (falls vorhanden)
|
||||
cat ~/deployment/stacks/registry/docker-compose.yml 2>/dev/null || echo "Registry Config nicht gefunden"
|
||||
```
|
||||
|
||||
**Hinweis**: Falls die Registry noch nicht konfiguriert ist, müssen die Credentials festgelegt werden.
|
||||
|
||||
### Schritt 3: Secrets in Gitea hinzufügen
|
||||
|
||||
1. Gehe zu: `https://git.michaelschiemer.de/<username>/michaelschiemer/settings/secrets`
|
||||
2. Klicke auf **"Add Secret"**
|
||||
3. Füge jedes Secret einzeln hinzu:
|
||||
|
||||
**REGISTRY_USER**:
|
||||
- Name: `REGISTRY_USER`
|
||||
- Value: `admin` (oder der tatsächliche Registry-Benutzername)
|
||||
- Save
|
||||
|
||||
**REGISTRY_PASSWORD**:
|
||||
- Name: `REGISTRY_PASSWORD`
|
||||
- Value: `<registry-password>`
|
||||
- Save
|
||||
|
||||
**SSH_PRIVATE_KEY**:
|
||||
- Name: `SSH_PRIVATE_KEY`
|
||||
- Value: `<kompletter-inhalt-von-~/.ssh/production>`
|
||||
- Save
|
||||
|
||||
### Schritt 4: Secrets verifizieren
|
||||
|
||||
Nach dem Hinzufügen sollten alle drei Secrets in der Liste erscheinen mit "Hidden" als Wert.
|
||||
|
||||
**✅ Checkliste**:
|
||||
- [ ] REGISTRY_USER hinzugefügt
|
||||
- [ ] REGISTRY_PASSWORD hinzugefügt
|
||||
- [ ] SSH_PRIVATE_KEY hinzugefügt
|
||||
- [ ] Alle Secrets zeigen "Hidden" als Wert
|
||||
132
.gitea/workflows/TEST_WORKFLOW.md
Normal file
132
.gitea/workflows/TEST_WORKFLOW.md
Normal file
@@ -0,0 +1,132 @@
|
||||
# CI/CD Workflow Testen
|
||||
|
||||
## ✅ Secrets sind konfiguriert - Perfekt!
|
||||
|
||||
## Option 1: Workflow manuell triggern (Empfohlen)
|
||||
|
||||
### Schritt 1: Gehe zu Actions
|
||||
|
||||
Öffne im Browser:
|
||||
```
|
||||
https://git.michaelschiemer.de/michael/michaelschiemer renewal/actions
|
||||
```
|
||||
|
||||
### Schritt 2: Workflow auswählen
|
||||
|
||||
1. Suche nach "Production Deployment Pipeline"
|
||||
2. Klicke auf den Workflow
|
||||
|
||||
### Schritt 3: Workflow manuell starten
|
||||
|
||||
1. Klicke auf "Run workflow" (rechts oben)
|
||||
2. Wähle Branch: `main`
|
||||
3. Optional: `skip_tests` deaktiviert lassen (Tests sollen laufen)
|
||||
4. Klicke "Run workflow"
|
||||
|
||||
### Schritt 4: Logs beobachten
|
||||
|
||||
Der Workflow führt folgende Schritte aus:
|
||||
|
||||
1. **Checkout code** - Code wird ausgecheckt
|
||||
2. **Run Tests** - PHP Tests werden ausgeführt
|
||||
3. **Build Docker Image** - Docker Image wird gebaut
|
||||
4. **Push to Registry** - Image wird zur Registry gepusht
|
||||
5. **Deploy via Ansible** - Deployment auf Production-Server
|
||||
|
||||
**Beobachte die Logs** und prüfe jeden Schritt!
|
||||
|
||||
## Option 2: Automatisches Deployment via Commit
|
||||
|
||||
### Test-Commit pushen
|
||||
|
||||
```bash
|
||||
# Stelle sicher, dass alles committed ist
|
||||
git add .
|
||||
git commit -m "test: CI/CD workflow test" || echo "Keine Änderungen"
|
||||
|
||||
# Push zu main Branch
|
||||
git push origin main
|
||||
```
|
||||
|
||||
Der Workflow startet automatisch nach dem Push.
|
||||
|
||||
## Was passiert beim Workflow?
|
||||
|
||||
### 1. Tests (ca. 2-5 Minuten)
|
||||
- PHP Version Setup
|
||||
- Composer Dependencies installieren
|
||||
- Tests ausführen
|
||||
|
||||
### 2. Build (ca. 3-5 Minuten)
|
||||
Live - Multi-Stage Docker Build:
|
||||
- Composer Dependencies (Production)
|
||||
- Frontend Build (npm)
|
||||
- Finales Production Image
|
||||
|
||||
### 3. Push (ca. 1-2 Minuten)
|
||||
- Docker Login zur Registry
|
||||
- Image Tag generieren (SHA + Timestamp)
|
||||
- Image zur Registry pushen
|
||||
|
||||
### 4. Deploy (ca. 2-4 Minuten)
|
||||
- Ansible Playbook ausführen
|
||||
- Image auf Production-Server pullen
|
||||
- Application Stack aktualisieren
|
||||
- Services neu starten
|
||||
|
||||
**Gesamtzeit: ~8-15 Minuten**
|
||||
|
||||
## Workflow-Status prüfen
|
||||
|
||||
### In Gitea UI:
|
||||
```
|
||||
https://git.michaelschiemer.de/michael/michaelschiemer/actions
|
||||
```
|
||||
|
||||
### Via Command Line:
|
||||
```bash
|
||||
# Prüfe ob Workflow läuft
|
||||
curl -s -H "Authorization: token <DEIN_TOKEN>" \
|
||||
"https://git.michaelschiemer.de/api/v1/repos/michael/michaelschiemer/actions/runs" | \
|
||||
jq '.workflow_runs[0] | {status, conclusion, created_at}'
|
||||
```
|
||||
|
||||
## Erfolgreiche Ausführung erkennen
|
||||
|
||||
Der Workflow ist erfolgreich, wenn:
|
||||
|
||||
✅ Alle Jobs grün sind
|
||||
✅ Keine Fehler in den Logs
|
||||
✅ Letzter Schritt "Deploy via Ansible" erfolgreich
|
||||
✅ Application läuft auf Production-Server
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Workflow startet nicht
|
||||
- Prüfe, ob `.gitea/workflows/production-deploy.yml` im Repository ist
|
||||
- Prüfe, ob Workflow-Syntax korrekt ist
|
||||
- Prüfe Gitea Actions ist aktiviert
|
||||
|
||||
### "Secret not found" Fehler
|
||||
- Prüfe, ob alle drei Secrets gesetzt sind
|
||||
- Prüfe, ob Namen exakt übereinstimmen (Groß-/Kleinschreibung!)
|
||||
|
||||
### Registry Login fehlgeschlagen
|
||||
- Prüfe `REGISTRY_USER` und `REGISTRY_PASSWORD` Secrets
|
||||
- Prüfe Registry erreichbar: `curl -u admin:registry-secure-password-2025 http://127.0.0.1:5000/v2/_catalog`
|
||||
|
||||
### Deployment fehlgeschlagen
|
||||
- Prüfe `SSH_PRIVATE_KEY` Secret
|
||||
- Prüfe Ansible-Verbindung zum Server
|
||||
- Prüfe Server-Logs: `ssh deploy@94.16.110.151 "docker compose -f ~/deployment/stacks/application/docker-compose.yml logs"`
|
||||
|
||||
## Nächste Schritte nach erfolgreichem Test
|
||||
|
||||
1. ✅ Workflow funktioniert
|
||||
2. ✅ Automatisches Deployment getestet
|
||||
3. ✅ Production-Stack läuft
|
||||
|
||||
**Du kannst jetzt:**
|
||||
- Normale Commits pushen → Automatisches Deployment
|
||||
- Workflow manuell triggern für kontrollierte Deployments
|
||||
- Branch-Protection aktivieren für sichere Deployments
|
||||
75
.gitea/workflows/TOKEN_ISSUE_FIX.md
Normal file
75
.gitea/workflows/TOKEN_ISSUE_FIX.md
Normal file
@@ -0,0 +1,75 @@
|
||||
# Token-Probleme beheben
|
||||
|
||||
## Problem
|
||||
|
||||
Das Token hat nicht die richtigen Scopes oder das Repository wurde nicht gefunden.
|
||||
|
||||
## Lösung: Neuen Token mit richtigen Scopes erstellen
|
||||
|
||||
### Schritt 1: Token neu generieren
|
||||
|
||||
1. **Gehe zu Gitea Settings:**
|
||||
```
|
||||
https://git.michaelschiemer.de/user/settings/applications
|
||||
```
|
||||
|
||||
2. **Falls bereits ein Token existiert:**
|
||||
- Lösche den alten Token (falls nötig)
|
||||
- Oder erstelle einen neuen mit anderen Namen
|
||||
|
||||
3. **Klicke "Generate New Token"**
|
||||
|
||||
4. **WICHTIG - Diese Scopes aktivieren:**
|
||||
- ✅ `read:user` (mindestens erforderlich)
|
||||
- ✅ `write:repository` (für Secrets schreiben)
|
||||
- ✅ Oder wähle **alle Scopes** für volle Berechtigung
|
||||
|
||||
5. **Token kopieren** (wird nur einmal angezeigt!)
|
||||
|
||||
### Schritt 2: Repository-Name prüfen
|
||||
|
||||
Prüfe, ob das Repository wirklich `michael/michaelschiemer` heißt:
|
||||
|
||||
```bash
|
||||
# Prüfe Remote-URL
|
||||
git remote get-url origin
|
||||
|
||||
# Sollte zeigen:
|
||||
# https://git.michaelschiemer.de/michael/michaelschiemer.git
|
||||
```
|
||||
|
||||
Falls der Name anders ist, setze die Umgebungsvariable:
|
||||
```bash
|
||||
REPO_OWNER=<owner> REPO_NAME=<name> bash scripts/setup-gitea-secrets-with-token.sh <token>
|
||||
```
|
||||
|
||||
### Schritt 3: Script erneut ausführen
|
||||
|
||||
```bash
|
||||
bash scripts/setup-gitea-secrets-with-token.sh <NEUER_TOKEN>
|
||||
```
|
||||
|
||||
## Alternative: Manuelles Setup über UI
|
||||
|
||||
Falls das automatische Setup weiterhin Probleme macht:
|
||||
|
||||
1. **Gehe zu:**
|
||||
```
|
||||
https://git.michaelschiemer.de/michael/michaelschiemer/settings/secrets/actions
|
||||
```
|
||||
|
||||
2. **Füge manuell hinzu:**
|
||||
- `REGISTRY_USER` = `admin`
|
||||
- `REGISTRY_PASSWORD` = `registry-secure-password-2025`
|
||||
- `SSH_PRIVATE_KEY` = `cat ~/.ssh/production`
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "token does not have at least one of required scope(s)"
|
||||
→ Token benötigt `read:user` Scope - neuen Token mit diesem Scope generieren
|
||||
|
||||
### "The target couldn't be found" (404)
|
||||
→ Repository existiert nicht oder falscher Name - prüfe Repository-URL
|
||||
|
||||
### "404 page not found" bei Secrets-Endpoint
|
||||
→ Actions möglicherweise nicht aktiviert - prüfe in Gitea Admin-Panel
|
||||
@@ -1,102 +0,0 @@
|
||||
name: CI/CD Pipeline für michaelschiemer.de
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, develop ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
env:
|
||||
REGISTRY_URL: docker-registry:5000 # Container network access
|
||||
IMAGE_NAME: michaelschiemer
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: catthehacker/ubuntu:act-latest
|
||||
services:
|
||||
redis:
|
||||
image: redis:8-alpine
|
||||
mariadb:
|
||||
image: mariadb:latest
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: test
|
||||
MYSQL_DATABASE: test
|
||||
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: '8.4'
|
||||
extensions: gd, zip, pdo, pdo_mysql, opcache, pcntl, posix, shmop, redis
|
||||
tools: composer
|
||||
|
||||
- name: Install Dependencies
|
||||
run: composer install --no-progress --prefer-dist --optimize-autoloader
|
||||
|
||||
- name: Build Frontend Assets
|
||||
run: npm install && npm run build
|
||||
|
||||
- name: Run Tests
|
||||
run: ./vendor/bin/pest
|
||||
env:
|
||||
DB_HOST: mariadb
|
||||
DB_PORT: 3306
|
||||
DB_DATABASE: test
|
||||
DB_USERNAME: root
|
||||
DB_PASSWORD: test
|
||||
REDIS_HOST: redis
|
||||
REDIS_PORT: 6379
|
||||
|
||||
build:
|
||||
needs: test
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: catthehacker/ubuntu:act-latest
|
||||
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop'
|
||||
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Login to Private Registry
|
||||
run: < /dev/null |
|
||||
echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ env.REGISTRY_URL }} -u admin --password-stdin
|
||||
|
||||
- name: Determine Image Tag
|
||||
id: tag
|
||||
run: |
|
||||
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
|
||||
echo "tag=latest" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "tag=develop" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Build and Push Images
|
||||
run: |
|
||||
# Build and push PHP image
|
||||
if [ -f docker/php/Dockerfile ]; then
|
||||
docker build -t ${{ env.REGISTRY_URL }}/${{ env.IMAGE_NAME }}/php:${{ steps.tag.outputs.tag }} -f docker/php/Dockerfile .
|
||||
docker push ${{ env.REGISTRY_URL }}/${{ env.IMAGE_NAME }}/php:${{ steps.tag.outputs.tag }}
|
||||
fi
|
||||
|
||||
# Build and push Nginx image
|
||||
if [ -f docker/nginx/Dockerfile ]; then
|
||||
docker build -t ${{ env.REGISTRY_URL }}/${{ env.IMAGE_NAME }}/nginx:${{ steps.tag.outputs.tag }} -f docker/nginx/Dockerfile .
|
||||
docker push ${{ env.REGISTRY_URL }}/${{ env.IMAGE_NAME }}/nginx:${{ steps.tag.outputs.tag }}
|
||||
fi
|
||||
|
||||
# Build and push Worker image
|
||||
if [ -f docker/worker/Dockerfile ]; then
|
||||
docker build -t ${{ env.REGISTRY_URL }}/${{ env.IMAGE_NAME }}/worker:${{ steps.tag.outputs.tag }} -f docker/worker/Dockerfile .
|
||||
docker push ${{ env.REGISTRY_URL }}/${{ env.IMAGE_NAME }}/worker:${{ steps.tag.outputs.tag }}
|
||||
fi
|
||||
@@ -1,51 +0,0 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
quality:
|
||||
name: PHP Quality Checks
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: composer:2
|
||||
steps:
|
||||
# Gitea runners usually have the repo checked out already. We avoid marketplace actions.
|
||||
- name: Show versions
|
||||
run: |
|
||||
php -v
|
||||
composer --version
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
composer install --no-interaction --prefer-dist --no-progress
|
||||
- name: Code style (non-blocking for initial adoption)
|
||||
run: |
|
||||
if composer run -q cs 2>/dev/null; then
|
||||
composer cs || true
|
||||
else
|
||||
echo "No 'cs' script found, skipping."
|
||||
fi
|
||||
- name: PHPStan
|
||||
run: |
|
||||
if composer run -q phpstan 2>/dev/null; then
|
||||
composer phpstan
|
||||
else
|
||||
echo "No 'phpstan' script found, attempting vendor bin..."
|
||||
./vendor/bin/phpstan analyse || exit 1
|
||||
fi
|
||||
- name: Pest tests
|
||||
env:
|
||||
XDEBUG_MODE: off
|
||||
run: |
|
||||
if [ -x ./vendor/bin/pest ]; then
|
||||
./vendor/bin/pest -q
|
||||
elif [ -x ./vendor/bin/phpunit ]; then
|
||||
./vendor/bin/phpunit
|
||||
else
|
||||
echo "No test runner found."
|
||||
exit 1
|
||||
fi
|
||||
- name: Composer audit (non-blocking initially)
|
||||
run: |
|
||||
composer audit --no-interaction || true
|
||||
74
.gitea/workflows/update-production-secrets.yml
Normal file
74
.gitea/workflows/update-production-secrets.yml
Normal file
@@ -0,0 +1,74 @@
|
||||
name: Update Production Secrets
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
vault_password:
|
||||
description: 'Ansible Vault Password'
|
||||
required: true
|
||||
type: password
|
||||
|
||||
env:
|
||||
DEPLOYMENT_HOST: 94.16.110.151
|
||||
|
||||
jobs:
|
||||
deploy-secrets:
|
||||
name: Deploy Secrets to Production
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: production-secrets
|
||||
url: https://michaelschiemer.de
|
||||
|
||||
steps:
|
||||
- name: Checkout deployment configuration
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
sparse-checkout: |
|
||||
deployment/ansible
|
||||
sparse-checkout-cone-mode: false
|
||||
|
||||
- name: Setup SSH key
|
||||
run: |
|
||||
mkdir -p ~/.ssh
|
||||
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/production
|
||||
chmod 600 ~/.ssh/production
|
||||
ssh-keyscan -H ${{ env.DEPLOYMENT_HOST }} >> ~/.ssh/known_hosts
|
||||
|
||||
- name: Install Ansible
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ansible
|
||||
|
||||
- name: Create vault password file
|
||||
run: |
|
||||
echo "${{ github.event.inputs.vault_password }}" > /tmp/.vault_pass
|
||||
chmod 600 /tmp/.vault_pass
|
||||
|
||||
- name: Deploy secrets via Ansible
|
||||
run: |
|
||||
cd deployment/ansible
|
||||
ansible-playbook -i inventory/production.yml \
|
||||
playbooks/setup-production-secrets.yml \
|
||||
--vault-password-file /tmp/.vault_pass
|
||||
|
||||
- name: Cleanup vault password
|
||||
if: always()
|
||||
run: |
|
||||
rm -f /tmp/.vault_pass
|
||||
|
||||
- name: Verify secrets deployment
|
||||
run: |
|
||||
ssh -i ~/.ssh/production deploy@${{ env.DEPLOYMENT_HOST }} \
|
||||
"docker secret ls && test -f /home/deploy/secrets/.env.production"
|
||||
|
||||
- name: Notify deployment success
|
||||
if: success()
|
||||
run: |
|
||||
echo "✅ Secrets deployed successfully to production"
|
||||
echo "Services will be restarted automatically"
|
||||
|
||||
- name: Notify deployment failure
|
||||
if: failure()
|
||||
run: |
|
||||
echo "❌ Secrets deployment failed"
|
||||
echo "Check Ansible logs for details"
|
||||
Reference in New Issue
Block a user