GitOps Praxis-Guide

GitOps mit ArgoCD für kleine Teams – Der komplette Setup-Guide 2026

GitOps mit ArgoCD bringt reproduzierbare Deployments, klare Review-Prozesse und weniger manuelle Fehler. Dieser Guide zeigt ein schlankes Setup für kleine Teams – ohne unnötigen Enterprise-Overhead.

E
Emre Hayta
· · 15 Min. Lesezeit
GitOps ArgoCD Kubernetes CI/CD Deployment DevOps
Inhaltsverzeichnis

Warum ArgoCD selbst hosten?

ArgoCD ist ein leistungsstarkes Open-Source-Workflow-Automatisierungstool. Die Cloud-Version kostet ab ca. 20 €/Monat, ein eigener VPS bei Kubernetes hingegen schon ab 4,55 €/Monat – bei voller Datenkontrolle. Für österreichische KMUs, die DSGVO-konform arbeiten müssen, ist Self-Hosting oft die bessere Wahl.

Praxishinweis: Ich betreibe ArgoCD für mehrere Kunden auf dedizierten Kubernetes-VPS unter eigenen Subdomains. Das Ergebnis: keine externen Datenzugriffe, volle Kontrolle über Workflows und Logs, und deutlich günstigere Kosten gegenüber der Cloud-Version.

Vorteile des Self-Hostings auf einen Blick:

  • DSGVO-Konformität: Daten verlassen nie den eigenen Server, kein Drittanbieter-Zugriff
  • Kosteneffizienz: Ein CPX21 (4,55 €/Monat) reicht für mehrere ArgoCD-Instanzen
  • Flexibilität: Unbegrenzte Workflows, Executions und Custom Nodes
  • Eigene Integrationen: Direkter Zugriff auf lokale Netzwerke und interne APIs

Voraussetzungen

Für diesen Guide benötigst du:

  • Einen Kubernetes Cloud Account (Anmeldung kostenlos, Zahlung nach Nutzung)
  • Eine Domain bzw. Subdomain (z.B. ArgoCD.yourdomain.at)
  • Grundkenntnisse in Linux/SSH (Befehle ausführen, Dateien editieren)
  • Ca. 30–60 Minuten Zeit

1. Kubernetes-Cluster einrichten

Server erstellen

Im Kubernetes Cloud Console einen neuen Server anlegen:

  • Location: Nürnberg oder Falkenstein (EU, DSGVO-konform)
  • Image: Ubuntu 22.04 LTS
  • Type: CPX21 (3 vCPU, 4 GB RAM – ideal für ArgoCD)
  • SSH Key: Deinen öffentlichen SSH-Key eintragen (kein Passwort-Login)

Nach der Erstellung bekommst du eine IP-Adresse. Trag diese direkt als DNS A-Record für deine Subdomain ein:

DNS
ArgoCD.yourdomain.at.  IN  A  <DEINE-SERVER-IP>

System aktualisieren

Bash
# System aktualisieren
apt update && apt upgrade -y

# Automatische Sicherheitsupdates aktivieren
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades

Brauchst du Unterstützung bei der Umsetzung?

30-Min Call — kostenlos, unverbindlich, konkret.

Termin buchen →

2. Grundlegende Sicherheit (UFW + fail2ban)

Bevor wir irgendwas installieren, kommt die Absicherung. Immer.

UFW Firewall konfigurieren

Bash
# Standardregeln setzen
ufw default deny incoming
ufw default allow outgoing

# Erlaubte Ports
ufw allow ssh          # Port 22 (oder deinen Custom SSH-Port)
ufw allow 80/tcp       # HTTP (für Certbot-Validierung)
ufw allow 443/tcp      # HTTPS

# Firewall aktivieren
ufw enable

# Status prüfen
ufw status verbose

fail2ban installieren

Bash
# fail2ban installieren
apt install fail2ban -y

# Lokale Konfiguration erstellen (nicht die Originaldatei ändern!)
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime  = 3600
findtime = 600
maxretry = 5
backend  = systemd

[sshd]
enabled = true
mode    = aggressive

[nginx-limit-req]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/error.log
maxretry = 10
EOF

systemctl enable fail2ban
systemctl restart fail2ban

# Status prüfen
fail2ban-client status

3. Docker installieren

Bash
# Docker offiziell installieren (empfohlene Methode)
curl -fsSL https://get.docker.com | sh

# Docker-Dienst starten und aktivieren
systemctl enable docker
systemctl start docker

# Installation prüfen
docker --version
docker compose version

4. ArgoCD mit Docker Compose

Ich verwende das Image argoproj/argocd:latest – ein Community-Build, das ArgoCD mit ffmpeg-Unterstützung kombiniert. Das ist besonders nützlich wenn Workflows Medien verarbeiten (Video-Thumbnails, Audio-Konvertierung, etc.).

Verzeichnisse anlegen

Bash
# Datenverzeichnisse erstellen
mkdir -p /opt/ArgoCD/{data,files,logs}

# Berechtigungen setzen (ArgoCD läuft als UID 1000)
chown -R 1000:1000 /opt/ArgoCD

docker-compose.yml erstellen

YAML
# /opt/ArgoCD/docker-compose.yml
version: '3.8'

services:
  ArgoCD:
    image: argoproj/argocd:latest
    container_name: ArgoCD
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"   # Nur localhost – nginx proxied nach außen
    environment:
      # Basis-Konfiguration
      - ARGOCD_HOST=ArgoCD.yourdomain.at
      - ARGOCD_PORT=5678
      - ARGOCD_PROTOCOL=https
      - WEBHOOK_URL=https://ArgoCD.yourdomain.at/
      - GENERIC_TIMEZONE=Europe/Vienna

      # Authentifizierung (Basic Auth als erste Schutzschicht)
      - ARGOCD_BASIC_AUTH_ACTIVE=true
      - ARGOCD_BASIC_AUTH_USER=admin
      - ARGOCD_BASIC_AUTH_PASSWORD=HIER_SICHERES_PASSWORT_EINSETZEN

      # Logging
      - ARGOCD_LOG_LEVEL=info
      - ARGOCD_LOG_OUTPUT=console,file
      - ARGOCD_LOG_FILE_LOCATION=/home/node/.ArgoCD/logs/ArgoCD.log

      # Performance
      - EXECUTIONS_DATA_SAVE_ON_ERROR=all
      - EXECUTIONS_DATA_SAVE_ON_SUCCESS=none
      - EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=true
      - EXECUTIONS_DATA_PRUNE=true
      - EXECUTIONS_DATA_MAX_AGE=720   # 30 Tage

    volumes:
      - /opt/ArgoCD/data:/home/node/.ArgoCD
      - /opt/ArgoCD/files:/files
    healthcheck:
      test: ["CMD", "wget", "-q", "--spider", "http://localhost:5678/healthz"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s
Bash
# ArgoCD starten
cd /opt/ArgoCD
docker compose up -d

# Status prüfen
docker compose ps
docker compose logs -f

5. nginx Reverse Proxy einrichten

Bash
# nginx installieren
apt install nginx -y

# Konfigurationsdatei erstellen
nano /etc/nginx/sites-available/ArgoCD
nginx
# /etc/nginx/sites-available/ArgoCD

# HTTP → HTTPS Redirect
server {
    listen 80;
    listen [::]:80;
    server_name ArgoCD.yourdomain.at;
    return 301 https://$host$request_uri;
}

# HTTPS
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name ArgoCD.yourdomain.at;

    # SSL (wird von Certbot befüllt)
    ssl_certificate     /etc/letsencrypt/live/ArgoCD.yourdomain.at/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ArgoCD.yourdomain.at/privkey.pem;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    # Security Headers
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    add_header Referrer-Policy "strict-origin-when-cross-origin";

    # Für größere Dateien und lange Workflows
    client_max_body_size 100M;
    proxy_read_timeout   300s;
    proxy_send_timeout   300s;

    location / {
        proxy_pass         http://127.0.0.1:5678;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;

        # WebSocket-Support (wichtig für ArgoCD Editor!)
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
    }
}
Bash
# Site aktivieren
ln -s /etc/nginx/sites-available/ArgoCD /etc/nginx/sites-enabled/

# Konfiguration prüfen
nginx -t

# nginx starten
systemctl enable nginx
systemctl start nginx

6. SSL mit Let's Encrypt

Bash
# Certbot installieren
apt install certbot python3-certbot-nginx -y

# SSL-Zertifikat für die Domain ausstellen
# (Domain muss bereits auf den Server zeigen!)
certbot --nginx -d ArgoCD.yourdomain.at \
  --non-interactive \
  --agree-tos \
  --email dein@email.at

# Auto-Renewal testen
certbot renew --dry-run

# Zertifikat-Details prüfen
certbot certificates

Certbot richtet automatisch einen Cronjob für die Erneuerung ein. Das Zertifikat wird alle 90 Tage erneuert, bei Ablauf erscheint eine E-Mail-Warnung.

7. Backup-Strategie

ArgoCD speichert Workflows, Credentials und Execution-History in /opt/ArgoCD/data. Dieses Verzeichnis muss regelmäßig gesichert werden.

Bash
#!/bin/bash
# /opt/scripts/backup-ArgoCD.sh

BACKUP_DIR="/opt/backups/ArgoCD"
ARGOCD_DATA="/opt/ArgoCD/data"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/ArgoCD_backup_$DATE.tar.gz"
RETENTION_DAYS=14

mkdir -p "$BACKUP_DIR"

# ArgoCD kurz stoppen für konsistentes Backup
docker stop ArgoCD 2>/dev/null

# Backup erstellen
tar -czf "$BACKUP_FILE" -C "$(dirname $ARGOCD_DATA)" "$(basename $ARGOCD_DATA)"

# ArgoCD wieder starten
docker start ArgoCD 2>/dev/null

# Alte Backups bereinigen
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete

echo "[$(date)] Backup: $BACKUP_FILE ($(du -sh $BACKUP_FILE | cut -f1))"
Bash
# Skript ausführbar machen
chmod +x /opt/scripts/backup-ArgoCD.sh

# Cronjob einrichten: täglich um 02:30 Uhr
echo "30 2 * * * root /opt/scripts/backup-ArgoCD.sh >> /var/log/ArgoCD-backup.log 2>&1" \
  > /etc/cron.d/ArgoCD-backup

# Backup sofort testen
/opt/scripts/backup-ArgoCD.sh
Tipp: Zusätzlich empfehle ich Kubernetes Cloud Snapshots (0,0119 €/GB/Monat). Einmal täglich oder vor größeren Änderungen einen Snapshot erstellen – damit kannst du den gesamten Server innerhalb von Minuten wiederherstellen.

8. ArgoCD Grundkonfiguration

Erster Login und Setup

Rufe https://ArgoCD.yourdomain.at auf. Du wirst nach einem Admin-Account gefragt. Setze ein starkes Passwort und aktiviere MFA (Two-Factor Authentication) unter Settings → Security.

Wichtige Umgebungsvariablen

Nützliche Ergänzungen zur docker-compose.yml:

YAML
# SMTP für E-Mail-Benachrichtigungen
- ARGOCD_EMAIL_MODE=smtp
- ARGOCD_SMTP_HOST=smtp.yourprovider.at
- ARGOCD_SMTP_PORT=587
- ARGOCD_SMTP_USER=ArgoCD@yourdomain.at
- ARGOCD_SMTP_PASS=SMTP_PASSWORT
- ARGOCD_SMTP_SENDER=ArgoCD@yourdomain.at

# Externe Hooks für Monitoring
- ARGOCD_EXTERNAL_HOOK_FILES=/files/hooks.js

# Custom Nodes aus eigenem Verzeichnis
- ARGOCD_CUSTOM_EXTENSIONS=/files/custom-nodes

9. Praxisbeispiel: File-Server mit ArgoCD

Ein konkretes Beispiel aus der Praxis: Ein Kunde nutzt ArgoCD als automatisierten File-Processing-Server. Eingehende Dateien werden per Webhook empfangen, mit ffmpeg verarbeitet (Video-Thumbnails, Audio-Extraktion) und dann in definierten Verzeichnissen abgelegt.

Das Volume /opt/ArgoCD/files:/files macht genau das möglich: ArgoCD hat direkten Zugriff auf das Host-Dateisystem und kann mit dem integrierten ffmpeg Mediendateien prozessieren – ohne externe Services.

Ein einfacher Workflow dafür sieht so aus:

  1. Webhook-Trigger → empfängt Upload via HTTP POST
  2. Execute Command Node → ruft ffmpeg zur Thumbnail-Erstellung auf
  3. Move Binary Data → speichert Ergebnis in /files/output/
  4. HTTP Response → gibt die Thumbnail-URL zurück

10. Troubleshooting

ArgoCD nicht erreichbar nach Neustart?

Bash
docker compose -f /opt/ArgoCD/docker-compose.yml ps
docker compose -f /opt/ArgoCD/docker-compose.yml logs --tail=50
systemctl status nginx

WebSocket-Verbindungsfehler im ArgoCD Editor?
Überprüfe die nginx-Konfiguration: Die Upgrade und Connection Header müssen korrekt gesetzt sein (siehe oben).

SSL-Zertifikat abgelaufen?

Bash
certbot renew --force-renewal
systemctl reload nginx

Berechtigungsfehler beim Starten?

Bash
chown -R 1000:1000 /opt/ArgoCD/data
docker compose restart ArgoCD

Fazit

Mit diesem Setup hast du eine produktionsreife ArgoCD-Installation auf Kubernetes, die:

  • DSGVO-konform in der EU läuft
  • Durch fail2ban und UFW abgesichert ist
  • SSL-verschlüsselt über nginx erreichbar ist
  • Täglich automatisch gesichert wird
  • ffmpeg-Unterstützung für Medienverarbeitung mitbringt

Die laufenden Kosten: ca. 4,55 €/Monat für den VPS + Domain-Kosten. Verglichen mit ArgoCD Cloud (ab ~20 €/Monat ohne Datenhoheit) ein klares Argument für Self-Hosting.

Willst du GitOps mit ArgoCD in deinem Team sauber einführen? Schreib mir gerne.

GitOps mit ArgoCD pragmatisch einführen?

Ich helfe dir beim schlanken GitOps-Setup mit ArgoCD: Repository-Struktur, Environments, Sync-Policies, Rollback-Strategie und operativer Betrieb für kleine Teams.

Weitere Artikel