Files
AFC-Demo/terraform/GITHUB_ACTIONS_SETUP.md
T
cbazzaandClaude Opus 4.5 fddc78618e
Build and Deploy to Synology NAS / test (push) Failing after 15m0s
Build and Deploy to Synology NAS / build (push) Has been cancelled
Build and Deploy to Synology NAS / deploy (push) Has been cancelled
Build and Deploy to Synology NAS / notify (push) Has been cancelled
feat: add Azure AKS deployment infrastructure with Terraform
- Add Terraform configuration for AKS cluster deployment
- Add Kubernetes manifests for Laravel app (deployment, services, secrets)
- Add PostgreSQL on Kubernetes with multi-schema support
- Add Nginx Ingress Controller configuration
- Add GitHub Actions workflow for Azure deployment
- Add HTTP Basic Authentication for production
- Add database restore functionality via Kubernetes jobs
- Update Dockerfile and nginx config for production
- Update database.php for multi-schema connections
- Add deployment documentation and quickstart guides

Deployed version: 1.0.7 at http://72.144.113.194/

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 09:43:08 +01:00

411 lines
9.7 KiB
Markdown

# GitHub Actions CI/CD Setup
Diese Anleitung zeigt, wie du die automatische Deployment-Pipeline mit GitHub Actions einrichtest.
## 📋 Übersicht
Die Pipeline führt automatisch folgende Schritte aus:
1. **Build & Push**: Docker Image bauen und zu Azure Container Registry pushen
2. **Terraform Deploy**: Infrastruktur mit Terraform deployen
3. **Smoke Tests**: Basis-Tests nach Deployment ausführen
4. **Notifications**: Status-Benachrichtigungen
## 🔐 Erforderliche GitHub Secrets
Gehe zu deinem GitHub Repository → Settings → Secrets and variables → Actions → New repository secret
### Azure Credentials
```bash
# Azure Service Principal erstellen
az ad sp create-for-rbac \
--name "github-actions-laravel-app" \
--role contributor \
--scopes /subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/trusted_ai_demo_rg \
--sdk-auth
# Output sieht so aus:
{
"clientId": "xxx",
"clientSecret": "xxx",
"subscriptionId": "77677a80-2dea-493d-9867-f1c961b80fb3",
"tenantId": "xxx",
"activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
"resourceManagerEndpointUrl": "https://management.azure.com/",
"activeDirectoryGraphResourceId": "https://graph.windows.net/",
"sqlManagementEndpointUrl": "https://management.core.windows.net:8443/",
"galleryEndpointUrl": "https://gallery.azure.com/",
"managementEndpointUrl": "https://management.core.windows.net/"
}
```
**Secret Name**: `AZURE_CREDENTIALS`
**Secret Value**: Der gesamte JSON Output von oben
### Azure Container Registry
```bash
# ACR Credentials abrufen
az acr credential show --name mylaravelregistry
# Output:
{
"passwords": [
{
"name": "password",
"value": "xxx"
},
{
"name": "password2",
"value": "yyy"
}
],
"username": "mylaravelregistry"
}
```
**Secret Name**: `ACR_USERNAME`
**Secret Value**: `mylaravelregistry`
**Secret Name**: `ACR_PASSWORD`
**Secret Value**: Der Wert von `password` (oder `password2`)
### Azure Subscription
**Secret Name**: `AZURE_SUBSCRIPTION_ID`
**Secret Value**: `77677a80-2dea-493d-9867-f1c961b80fb3`
### Laravel Application
**Secret Name**: `LARAVEL_APP_KEY`
**Secret Value**: Generiere mit `php artisan key:generate --show`
**Beispiel**: `base64:abcdefgh12345...`
### PostgreSQL Database
**Secret Name**: `POSTGRESQL_ADMIN_USERNAME`
**Secret Value**: `pgadmin`
**Secret Name**: `POSTGRESQL_ADMIN_PASSWORD`
**Secret Value**: Dein sicheres PostgreSQL Passwort
### Ingress & SSL
**Secret Name**: `INGRESS_HOST`
**Secret Value**: Deine Domain (z.B. `app.yourdomain.com`) oder leer lassen für IP-Zugriff
**Secret Name**: `SSL_ISSUER_EMAIL`
**Secret Value**: Email für Let's Encrypt (z.B. `admin@yourdomain.com`)
### Monitoring
**Secret Name**: `ALERT_EMAIL`
**Secret Value**: Email für Azure Alerts
## 📝 Secrets Checkliste
- [ ] `AZURE_CREDENTIALS` (JSON von Service Principal)
- [ ] `ACR_USERNAME` (mylaravelregistry)
- [ ] `ACR_PASSWORD` (ACR password)
- [ ] `AZURE_SUBSCRIPTION_ID` (77677a80-2dea-493d-9867-f1c961b80fb3)
- [ ] `LARAVEL_APP_KEY` (base64:...)
- [ ] `POSTGRESQL_ADMIN_USERNAME` (pgadmin)
- [ ] `POSTGRESQL_ADMIN_PASSWORD` (sicheres Passwort)
- [ ] `INGRESS_HOST` (optional: deine Domain)
- [ ] `SSL_ISSUER_EMAIL` (optional: für SSL)
- [ ] `ALERT_EMAIL` (deine Email)
## 🚀 Workflow Trigger
### Automatisch bei Push
Die Pipeline wird automatisch ausgeführt bei Push auf:
- `main` Branch (Staging Deployment)
- `production` Branch (Production Deployment)
```bash
# Code ändern und committen
git add .
git commit -m "Update feature"
# Push zu main für Staging
git push origin main
# Push zu production für Production
git push origin production
```
### Manuell über GitHub UI
1. Gehe zu deinem Repository auf GitHub
2. Klicke auf "Actions" Tab
3. Wähle "Deploy to Azure AKS" Workflow
4. Klicke auf "Run workflow"
5. Wähle Environment (staging/production)
6. Klicke auf "Run workflow"
### Manuell über GitHub CLI
```bash
# Installiere gh CLI (falls noch nicht vorhanden)
brew install gh # macOS
# oder: https://cli.github.com/
# Login
gh auth login
# Workflow manuell triggern
gh workflow run deploy-azure.yml \
--ref main \
--field environment=staging
# Workflow Status prüfen
gh run list --workflow=deploy-azure.yml
# Logs anzeigen
gh run view --log
```
## 🔧 Workflow Konfiguration anpassen
Die Workflow-Datei liegt in [.github/workflows/deploy-azure.yml](../.github/workflows/deploy-azure.yml).
### Environment-spezifische Settings
Im Workflow werden verschiedene Settings basierend auf dem Environment gesetzt:
**Staging:**
- `app_debug = true`
- `app_replicas = 2`
- `postgresql_sku_name = "B_Standard_B1ms"` (Basic)
- `postgresql_storage_mb = 32768` (32 GB)
- `ssl_enabled = false`
**Production:**
- `app_debug = false`
- `app_replicas = 3`
- `postgresql_sku_name = "GP_Standard_D2s_v3"` (General Purpose)
- `postgresql_storage_mb = 131072` (128 GB)
- `ssl_enabled = true`
### Weitere Trigger hinzufügen
```yaml
on:
push:
branches:
- main
- production
pull_request:
branches:
- main
schedule:
- cron: '0 2 * * 0' # Jeden Sonntag um 2 Uhr
workflow_dispatch:
# ... existing inputs
```
## 📊 Workflow Monitoring
### In GitHub UI
1. Gehe zu "Actions" Tab in deinem Repository
2. Siehst alle Workflow-Runs
3. Klicke auf einen Run für Details
4. Siehst Logs für jeden Job/Step
### Via GitHub CLI
```bash
# Aktuelle Runs anzeigen
gh run list --workflow=deploy-azure.yml
# Spezifischen Run anzeigen
gh run view <run-id>
# Logs anzeigen
gh run view <run-id> --log
# Run erneut starten
gh run rerun <run-id>
# Run abbrechen
gh run cancel <run-id>
```
## 🐛 Troubleshooting
### Pipeline schlägt bei "Build and Push" fehl
**Problem**: ACR Authentication fehlgeschlagen
**Lösung**:
```bash
# Prüfe ACR Credentials
az acr credential show --name mylaravelregistry
# Update GitHub Secrets mit neuen Credentials
```
### Pipeline schlägt bei "Terraform Deploy" fehl
**Problem**: Azure Credentials ungültig
**Lösung**:
```bash
# Service Principal neu erstellen
az ad sp create-for-rbac \
--name "github-actions-laravel-app" \
--role contributor \
--scopes /subscriptions/77677a80-2dea-493d-9867-f1c961b80fb3/resourceGroups/trusted_ai_demo_rg \
--sdk-auth
# AZURE_CREDENTIALS Secret updaten
```
**Problem**: Terraform State Lock
**Lösung**:
```bash
# State Lock manuell entfernen
cd terraform
terraform force-unlock <lock-id>
```
### Pipeline schlägt bei "Smoke Tests" fehl
**Problem**: Pods nicht ready
**Lösung**:
```bash
# kubectl credentials abrufen
az aks get-credentials \
--resource-group trusted_ai_demo_rg \
--name trai_k8s_cluster
# Pod Status prüfen
kubectl get pods -n laravel-app
kubectl describe pod <pod-name> -n laravel-app
kubectl logs <pod-name> -n laravel-app
```
## 🔒 Sicherheit
### Service Principal Permissions
Der Service Principal benötigt folgende Berechtigungen:
- Contributor auf Resource Group
- AcrPush auf Container Registry (optional, wenn über ACR credentials)
```bash
# Berechtigungen prüfen
az role assignment list \
--assignee <service-principal-client-id> \
--resource-group trusted_ai_demo_rg
```
### Secrets Rotation
Rotiere Secrets regelmäßig:
```bash
# Neues ACR Password generieren
az acr credential renew \
--name mylaravelregistry \
--password-name password
# Service Principal Secret erneuern
az ad sp credential reset \
--id <service-principal-object-id>
```
## 🚦 Branch Protection Rules
Empfohlene Branch Protection Rules für `main` und `production`:
1. Gehe zu Repository → Settings → Branches
2. Füge Branch Protection Rule hinzu für `main` und `production`
3. Aktiviere:
- ✅ Require status checks to pass before merging
- ✅ Require branches to be up to date before merging
- ✅ Require deployments to succeed before merging
- ✅ Require conversation resolution before merging
- ✅ Include administrators
## 📈 Deployment Environments
GitHub Environments für bessere Kontrolle:
1. Gehe zu Repository → Settings → Environments
2. Erstelle zwei Environments: `staging` und `production`
3. Für `production`:
- ✅ Required reviewers: Füge Reviewer hinzu
- ✅ Wait timer: 5 minutes
- ✅ Deployment branches: Only `production` branch
## 🔄 CI/CD Best Practices
### 1. Feature Branch Workflow
```bash
# Feature branch erstellen
git checkout -b feature/new-feature
# Änderungen committen
git add .
git commit -m "Add new feature"
# Push und Pull Request erstellen
git push origin feature/new-feature
# Nach Review: Merge in main (automatisches Staging Deployment)
# Dann: Merge in production (automatisches Production Deployment)
```
### 2. Semantic Versioning
Verwende Git Tags für Releases:
```bash
# Tag erstellen
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0
# Workflow wird Docker Image mit diesem Tag bauen
```
### 3. Rollback Strategy
```bash
# Bei Problemen: Zu vorheriger Version zurück
gh workflow run deploy-azure.yml \
--ref <previous-commit-sha> \
--field environment=production
# Oder: Kubernetes Rollback
kubectl rollout undo deployment/laravel-app -n laravel-app
```
## 📚 Weitere Ressourcen
- [GitHub Actions Documentation](https://docs.github.com/en/actions)
- [Azure DevOps Documentation](https://docs.microsoft.com/en-us/azure/devops/)
- [Terraform Cloud](https://www.terraform.io/cloud) - Alternative für Terraform State Management
## 🎯 Nächste Schritte
Nach Setup der CI/CD Pipeline:
1. [ ] Teste Pipeline mit Dummy-Commit
2. [ ] Erstelle Feature Branch und PR
3. [ ] Richte Branch Protection Rules ein
4. [ ] Konfiguriere GitHub Environments
5. [ ] Dokumentiere Team-Workflow
6. [ ] Teste Rollback-Prozess
7. [ ] Richte Slack/Teams Notifications ein (optional)
---
**Support**: Bei Problemen prüfe GitHub Actions Logs und Terraform State