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:
ArgoCD.yourdomain.at. IN A <DEINE-SERVER-IP>
System aktualisieren
# 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.
2. Grundlegende Sicherheit (UFW + fail2ban)
Bevor wir irgendwas installieren, kommt die Absicherung. Immer.
UFW Firewall konfigurieren
# 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
# 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
# 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
# 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
# /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
# ArgoCD starten
cd /opt/ArgoCD
docker compose up -d
# Status prüfen
docker compose ps
docker compose logs -f
5. nginx Reverse Proxy einrichten
# nginx installieren
apt install nginx -y
# Konfigurationsdatei erstellen
nano /etc/nginx/sites-available/ArgoCD
# /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";
}
}
# 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
# 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.
#!/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))"
# 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:
# 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:
- Webhook-Trigger → empfängt Upload via HTTP POST
- Execute Command Node → ruft
ffmpegzur Thumbnail-Erstellung auf - Move Binary Data → speichert Ergebnis in
/files/output/ - HTTP Response → gibt die Thumbnail-URL zurück
10. Troubleshooting
ArgoCD nicht erreichbar nach Neustart?
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?
certbot renew --force-renewal
systemctl reload nginx
Berechtigungsfehler beim Starten?
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.