Warum Go der ideale Kandidat für die Produktion ist, aber das Deployment trotzdem alles entscheidet
\n\nSie 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\nDas 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\nGo-Deployment auf dem VPS: Ein Klassiker, der nie alt wird
\n\nEin 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\nWas 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
Beispiel: Deployment eines Go-Servers mit Systemd
\n\nAngenommen, Sie haben eine einfache Anwendung main.go, die auf Port 8080 lauscht. Kompilieren Sie sie auf Ihrem Rechner für die Zielarchitektur:
GOOS=linux GOARCH=amd64 go build -o app main.go\n\nKopieren Sie die Binärdatei auf den Server:
\n\nscp app user@your-server:/opt/app/\n\nErstellen Sie eine systemd-Unit in /etc/systemd/system/app.service:
[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\nStarten und aktivieren Sie den Autostart:
\n\nsudo systemctl daemon-reload\nsudo systemctl enable --now app\n\nJetzt läuft Ihre Go-Anwendung als Daemon. Fügen Sie Nginx für das Proxying von Port 80 hinzu:
\n\nserver {\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\nVorteile von VPS: Volle Kontrolle, niedrige Kosten (ab $5/Monat), Transparenz. Nachteile: Manuelle Updates, kein Autoscaling, Sicherheit muss selbst konfiguriert werden.
\n\nDocker für Go: Containerisierung, die das Leben vereinfacht
\n\nWenn 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\nDockerfile für eine Go-Anwendung
\n\nHier 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\nBauen und starten:
\n\ndocker build -t go-app .\ndocker run -d -p 8080:8080 --name go-app go-app\n\nDocker Compose für eine vollständige Umgebung
\n\nWenn die Anwendung eine Datenbank oder Redis benötigt, verwenden Sie docker-compose.yml:
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