# ✅ Deployment Checklist

Diese Checkliste führt dich Schritt-für-Schritt durch das erste Deployment.

## 📋 Pre-Deployment

### 1. Lokale Umgebung

- [ ] Terraform >= 1.9.0 installiert
- [ ] Azure CLI >= 2.0 installiert
- [ ] kubectl >= 1.28 installiert
- [ ] Docker >= 20.10 installiert
- [ ] PHP >= 8.2 installiert (für Laravel-Befehle)

**Prüfen:**
```bash
terraform version
az version
kubectl version
docker version
php -v
```

### 2. Azure Zugriff

- [ ] Azure Account vorhanden
- [ ] Subscription ID bekannt: `77677a80-2dea-493d-9867-f1c961b80fb3`
- [ ] Zugriff auf Resource Group: `trusted_ai_demo_rg`
- [ ] Zugriff auf AKS Cluster: `trai_k8s_cluster`

**Prüfen:**
```bash
az login
az account set --subscription "77677a80-2dea-493d-9867-f1c961b80fb3"
az account show
az aks show --resource-group trusted_ai_demo_rg --name trai_k8s_cluster
```

## 🔧 Setup

### 3. Azure Container Registry

- [ ] ACR erstellt oder vorhanden
- [ ] ACR Name: `mylaravelregistry` (oder eigener Name)
- [ ] AKS hat Pull-Berechtigung für ACR

**Erstellen:**
```bash
# ACR erstellen (falls noch nicht vorhanden)
az acr create \
  --resource-group trusted_ai_demo_rg \
  --name mylaravelregistry \
  --sku Basic \
  --location germanywestcentral

# AKS Zugriff geben
az aks update \
  --resource-group trusted_ai_demo_rg \
  --name trai_k8s_cluster \
  --attach-acr mylaravelregistry

# Login
az acr login --name mylaravelregistry
```

### 4. Docker Image

- [ ] Docker Image gebaut
- [ ] Docker Image zu ACR gepusht
- [ ] Image Tag notiert

**Bauen & Pushen:**
```bash
cd /Users/sebastianfrohlich/Herd/frontend

# Bauen
docker build -t mylaravelregistry.azurecr.io/laravel-app:v1.0.0 .

# Pushen
docker push mylaravelregistry.azurecr.io/laravel-app:v1.0.0

# Image Tag notieren:
IMAGE_TAG="mylaravelregistry.azurecr.io/laravel-app:v1.0.0"
```

### 5. Laravel Konfiguration

- [ ] APP_KEY generiert
- [ ] APP_KEY notiert

**Generieren:**
```bash
cd /Users/sebastianfrohlich/Herd/frontend
php artisan key:generate --show

# Output: base64:xyz...
# Notieren für terraform.tfvars
```

### 6. Backup-Dateien

- [ ] Database Backup vorhanden
- [ ] Backup-Pfad notiert

**Prüfen:**
```bash
ls -lh /Users/sebastianfrohlich/Herd/frontend/backups/

# Wähle ein Backup, z.B.:
BACKUP_FILE="../backups/backup_backend_20251203_101741.dump"
```

## ⚙️ Terraform Konfiguration

### 7. terraform.tfvars erstellen

- [ ] `terraform.tfvars` aus Example kopiert
- [ ] Alle erforderlichen Werte eingetragen

**Erstellen:**
```bash
cd /Users/sebastianfrohlich/Herd/frontend/terraform
cp terraform.tfvars.example terraform.tfvars
nano terraform.tfvars
```

**Erforderliche Werte:**

```hcl
# ✅ Docker Image
docker_image = "mylaravelregistry.azurecr.io/laravel-app:v1.0.0"

# ✅ Laravel APP_KEY
app_key = "base64:YOUR_GENERATED_KEY_HERE"

# ✅ PostgreSQL Admin Password (sicher wählen!)
postgresql_admin_password = "YourVerySecurePassword123!"

# ✅ Alert Email
alert_email_address = "your-email@example.com"

# ✅ Database Restore (beim ersten Deployment)
db_restore_enabled = true
db_backup_file_path = "../backups/backup_backend_20251203_101741.dump"
```

**Optionale Werte:**

```hcl
# Für Custom Domain
ingress_host = "app.yourdomain.com"

# Für SSL/TLS (benötigt Domain)
ssl_enabled = true
ssl_issuer_email = "admin@yourdomain.com"

# Ressourcen anpassen
app_replicas = 2
postgresql_sku_name = "B_Standard_B1ms"
```

### 8. Konfiguration validieren

- [ ] terraform.tfvars Syntax korrekt
- [ ] Alle Secrets/Passwörter sicher
- [ ] Backup-Pfad korrekt

**Prüfen:**
```bash
cd terraform

# Terraform init
terraform init

# Validate
terraform validate

# Sollte ausgeben: Success! The configuration is valid.
```

## 🚀 Deployment

### 9. Deployment ausführen

**Option A: Automatisches Script (Empfohlen)**

- [ ] Deploy-Script ausgeführt

```bash
cd /Users/sebastianfrohlich/Herd/frontend/terraform
./scripts/deploy.sh
```

Das Script führt automatisch aus:
1. ✅ Prerequisite Check
2. ✅ Azure Login Status
3. ✅ terraform.tfvars Check
4. ✅ Docker Image Check
5. ✅ APP_KEY Check
6. ✅ terraform init
7. ✅ terraform validate
8. ✅ terraform plan
9. ✅ terraform apply (nach Bestätigung)
10. ✅ kubectl konfigurieren
11. ✅ Pod Status prüfen

**Option B: Manuell**

- [ ] Terraform Plan erstellt
- [ ] Plan überprüft
- [ ] Terraform Apply ausgeführt

```bash
cd terraform

# Plan
terraform plan -out=tfplan

# Plan überprüfen
# Sollte Resources anzeigen: +XX to add, ~0 to change, -0 to destroy

# Apply
terraform apply tfplan

# Outputs anzeigen
terraform output
terraform output deployment_instructions
```

### 10. kubectl konfigurieren

- [ ] kubectl Credentials abgerufen
- [ ] Cluster-Zugriff getestet

```bash
az aks get-credentials \
  --resource-group trusted_ai_demo_rg \
  --name trai_k8s_cluster \
  --overwrite-existing

# Testen
kubectl get nodes
kubectl get namespaces
```

## 🔄 Database Restore

### 11. Datenbank wiederherstellen

**Option A: Automatisches Script (Empfohlen)**

- [ ] Restore-Script ausgeführt
- [ ] Job Status geprüft

```bash
cd /Users/sebastianfrohlich/Herd/frontend/terraform
./scripts/restore-db.sh

# Script fragt nach:
# - Welches Backup-File?
# - Bestätigung: yes
# Zeigt dann Logs und Status
```

**Option B: Via Terraform**

- [ ] `db_restore_enabled = true` in terraform.tfvars
- [ ] `terraform apply` ausgeführt

```bash
# In terraform.tfvars:
db_restore_enabled = true
db_backup_file_path = "../backups/backup_backend_20251203_101741.dump"

# Apply
terraform apply

# Job Status prüfen
kubectl get jobs -n laravel-app
kubectl logs -n laravel-app -l job-type=database-restore -f
```

## ✅ Post-Deployment Checks

### 12. Infrastruktur Status

- [ ] Pods sind running
- [ ] Service ist erreichbar
- [ ] Ingress hat External IP
- [ ] Database ist connected

**Prüfen:**
```bash
# Pods
kubectl get pods -n laravel-app
# Sollte: 2/2 Running anzeigen

# Service
kubectl get svc -n laravel-app

# Ingress
kubectl get svc ingress-nginx-controller -n ingress-nginx
# Sollte: EXTERNAL-IP anzeigen (dauert 5-10 Min)

# Database
kubectl get secret laravel-app-db-credentials -n laravel-app
```

### 13. Application Health

- [ ] Application ist erreichbar
- [ ] HTTP Status 200 oder 302
- [ ] Keine Fehler in Logs

**Prüfen:**
```bash
# URL abrufen
terraform output app_url

# Beispiel Output: http://20.79.123.456

# Im Browser öffnen oder:
curl -I http://20.79.123.456

# Sollte: HTTP/1.1 200 OK oder 302 Found

# Logs prüfen
kubectl logs -n laravel-app -l app=laravel-app -f

# Sollte: Keine Errors zeigen
```

### 14. Database Connectivity

- [ ] Database Restore Job completed
- [ ] Laravel kann auf DB zugreifen

**Prüfen:**
```bash
# Restore Job Status
kubectl get jobs -n laravel-app
# Sollte: db-restore-* mit COMPLETIONS 1/1

# Job Logs
kubectl logs -n laravel-app -l job-type=database-restore

# Sollte: "Database restore completed successfully!" enthalten

# Laravel Migrations Status (in Pod)
POD_NAME=$(kubectl get pods -n laravel-app -l app=laravel-app -o jsonpath='{.items[0].metadata.name}')
kubectl exec -it -n laravel-app $POD_NAME -- php artisan migrate:status

# Sollte: Migration table anzeigen
```

## 🎯 Finalisierung

### 15. Monitoring Setup

- [ ] Azure Monitor funktioniert
- [ ] Alert Rules aktiv
- [ ] Email Alerts konfiguriert

**Prüfen:**
```bash
# Azure Portal öffnen
open https://portal.azure.com

# Gehe zu:
# 1. Resource Group: trusted_ai_demo_rg
# 2. AKS Cluster: trai_k8s_cluster
# 3. Monitoring > Insights

# Alert Rules prüfen:
az monitor metrics alert list \
  --resource-group trusted_ai_demo_rg
```

### 16. Dokumentation

- [ ] LoadBalancer IP notiert
- [ ] Database Connection String notiert
- [ ] Terraform Outputs gespeichert

**Notieren:**
```bash
# Alle Outputs anzeigen
terraform output

# Spezifische Outputs
terraform output app_url
terraform output postgresql_server_fqdn
terraform output postgresql_connection_string

# In Passwort-Manager oder sicheren Ort speichern!
```

### 17. Cleanup & Security

- [ ] Sensitive Dateien nicht committed (terraform.tfvars)
- [ ] Passwörter sicher gespeichert
- [ ] .gitignore überprüft

**Prüfen:**
```bash
# Git Status
git status

# Sollte NICHT enthalten:
# - terraform.tfvars
# - *.tfstate
# - kubeconfig

# Falls vorhanden:
git rm --cached terraform/terraform.tfvars
git rm --cached terraform/*.tfstate
```

## 🚦 Success Criteria

Deployment ist erfolgreich wenn:

- ✅ `kubectl get pods -n laravel-app` zeigt 2/2 Running
- ✅ `terraform output app_url` zeigt eine URL
- ✅ URL im Browser ist erreichbar
- ✅ Database Restore Job ist completed
- ✅ Keine Fehler in Pod Logs
- ✅ Ingress hat External IP

## 🎉 Fertig!

Deine Laravel-Anwendung läuft jetzt auf Azure Kubernetes Service!

### Nächste Schritte:

1. **Testen**: Funktionalität der Anwendung testen
2. **Monitoring**: Azure Monitor regelmäßig prüfen
3. **Backups**: PostgreSQL Backup-Strategy überprüfen
4. **Domain**: Custom Domain konfigurieren (optional)
5. **SSL**: Let's Encrypt aktivieren (optional)
6. **CI/CD**: GitHub Actions einrichten (optional)

### Wichtige Commands:

```bash
# Status prüfen
kubectl get all -n laravel-app

# Logs anzeigen
kubectl logs -n laravel-app -l app=laravel-app -f

# Shell in Pod
kubectl exec -it -n laravel-app <pod-name> -- /bin/sh

# Port-forward für lokalen Zugriff
kubectl port-forward -n laravel-app svc/laravel-app 8080:80

# Terraform Outputs
terraform output deployment_instructions
```

## 📞 Support

Bei Problemen:

1. **Troubleshooting Guide**: [README.md#troubleshooting](README.md#troubleshooting)
2. **Kubernetes Events**: `kubectl get events -n laravel-app --sort-by='.lastTimestamp'`
3. **Pod Logs**: `kubectl logs -n laravel-app <pod-name>`
4. **Terraform State**: `terraform show`

---

**Deployment Time**: ~30 Minuten
**Status**: ✅ Ready for Production
