Go in die Produktion: VPS, Docker oder Cloud – die beste Deployment-Methode wählen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum Go der ideale Kandidat für die Produktion ist, aber das Deployment trotzdem alles entscheidet

\n\n

Sie haben ein Backend in Go geschrieben. Es fliegt: Kompilierung in eine einzige Binärdatei, minimaler Speicherverbrauch, Goroutinen, die keine Last scheuen. Aber es gibt einen Haken: Selbst der schnellste Code ist nutzlos, wenn er als tote Last auf dem lokalen Rechner liegt. Früher oder später stellt sich die Frage: Wie bringt man dieses Wunderwerk der Ingenieurskunst in die Produktion?

\n\n

Das Deployment von Go-Anwendungen ist keine Rocket Science, aber man kann leicht in Fallen tappen. In diesem Artikel betrachten wir drei Hauptwege: den klassischen VPS, die Containerisierung mit Docker und Cloud-Plattformen. Sie erfahren, welcher Ansatz sich für Ihre Aufgabe eignet, und erhalten fertige Skripte für den Start.

\n\n

Go-Deployment auf dem VPS: Ein Klassiker, der nie alt wird

\n\n

Ein virtueller privater Server (VPS) ist Ihr persönlicher Root-Zugang. Volle Kontrolle, keine Plattformbeschränkungen, aber die Verantwortung für alles liegt bei Ihnen. Für eine Go-Anwendung ist dies oft die optimale Wahl: Die Binärdatei wiegt 10–20 MB, startet in Millisekunden und erfordert keine komplexe Orchestrierung.

\n\n

Was Sie für das Go-Deployment auf dem VPS benötigen

\n\n
    \n
  • Server mit Linux (Ubuntu 22.04 / Debian 11 – Klassiker)
  • \n
  • SSH-Zugang
  • \n
  • Go (optional, wenn Sie auf dem Server kompilieren)
  • \n
  • Systemd zur Prozessverwaltung
  • \n
  • Nginx oder Caddy als Reverse Proxy
  • \n
\n\n

Beispiel: Deployment eines Go-Servers mit Systemd

\n\n

Angenommen, Sie haben eine einfache Anwendung main.go, die auf Port 8080 lauscht. Kompilieren Sie sie auf Ihrem Rechner für die Zielarchitektur:

\n\n
GOOS=linux GOARCH=amd64 go build -o app main.go
\n\n

Kopieren Sie die Binärdatei auf den Server:

\n\n
scp app user@your-server:/opt/app/
\n\n

Erstellen Sie eine systemd-Unit in /etc/systemd/system/app.service:

\n\n
[Unit]\nDescription=Go App\nAfter=network.target\n\n[Service]\nExecStart=/opt/app/app\nWorkingDirectory=/opt/app\nRestart=always\nUser=www-data\nGroup=www-data\nEnvironment=PORT=8080\n\n[Install]\nWantedBy=multi-user.target
\n\n

Starten und aktivieren Sie den Autostart:

\n\n
sudo systemctl daemon-reload\nsudo systemctl enable --now app
\n\n

Jetzt läuft Ihre Go-Anwendung als Daemon. Fügen Sie Nginx für das Proxying von Port 80 hinzu:

\n\n
server {\n    listen 80;\n    server_name yourdomain.com;\n\n    location / {\n        proxy_pass http://127.0.0.1:8080;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}
\n\n

Vorteile von VPS: Volle Kontrolle, niedrige Kosten (ab $5/Monat), Transparenz. Nachteile: Manuelle Updates, kein Autoscaling, Sicherheit muss selbst konfiguriert werden.

\n\n

Docker für Go: Containerisierung, die das Leben vereinfacht

\n\n

Wenn Sie im Team arbeiten oder Microservices planen, ist Docker Ihre Wahl. Go und Docker sind ein ideales Paar: Multi-Stage-Builds erzeugen Images mit einer Größe von 5–15 MB, und die statische Kompilierung ermöglicht den Verzicht auf ein Basis-Image.

\n\n

Dockerfile für eine Go-Anwendung

\n\n

Hier ist ein minimales, aber production-ready Dockerfile:

\n\n
# Stage 1: Build\nFROM golang:1.22-alpine AS builder\nWORKDIR /app\nCOPY go.mod go.sum ./\nRUN go mod download\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux go build -o app .\n\n# Stage 2: Minimales Image\nFROM alpine:latest\nRUN apk --no-cache add ca-certificates\nWORKDIR /root/\nCOPY --from=builder /app/app .\nEXPOSE 8080\nCMD ["./app"]
\n\n

Bauen und starten:

\n\n
docker build -t go-app .\ndocker run -d -p 8080:8080 --name go-app go-app
\n\n

Docker Compose für eine vollständige Umgebung

\n\n

Wenn die Anwendung eine Datenbank oder Redis benötigt, verwenden Sie docker-compose.yml:

\n\n
version: '3.8'\nservices:\n  app:\n    build: .\n    ports:\n      - "8080:8080"\n    environment:\n      - DB_HOST=db\n      - DB_PORT=5432\n    depends_on:\n      - db\n  db:\n    image: postgres                

Blogs

Buchempfehlungen