Einleitung: Von der Entwicklung zum Production-Server mit Go
Sie haben eine leistungsstarke Webanwendung in Go (Golang) geschrieben. Kompilierung in eine einzelne Binärdatei, statische Typisierung, integrierte Netzwerkfunktionen – das alles verschafft einen Vorsprung gegenüber Node.js oder Python. Aber „es funktioniert auf meinem Rechner“ ist kein Argument für die Produktion. Die fortgeschrittene Bereitstellung einer Go-Anwendung auf einer VPS ist mehr als nur das Kopieren von Dateien per SSH. Es umfasst die Einrichtung einer CI/CD-Pipeline, Containerisierung, Reverse Proxy, automatische Zertifikatserneuerung, Monitoring und Graceful Shutdown.
In diesem Artikel behandeln wir ein vollständiges Production-Ready-Szenario für eine Golang-Anwendung auf Ubuntu 22.04 LTS. Sie erfahren, wie Sie einen Docker-Build einrichten, einen Zero-Downtime-Deploy über GitHub Actions organisieren, Nginx mit SSL anbinden und das Monitoring von Prometheus-Metriken konfigurieren.
1. VPS-Vorbereitung und Umgebungseinrichtung
Angenommen, Sie haben eine VPS (DigitalOcean, Hetzner, Timeweb) mit Ubuntu 22.04. Zuerst aktualisieren wir das System und installieren die grundlegenden Werkzeuge:
ssh root@your_server_ipapt update && apt upgrade -yapt install -y git curl htop net-tools ufwWir erstellen einen Benutzer deploy mit sudo-Rechten (ohne Passwort, nur per SSH-Key):
adduser deployusermod -aG sudo deploymkdir /home/deploy/.sshcp ~/.ssh/authorized_keys /home/deploy/.ssh/chown -R deploy:deploy /home/deploy/.sshchmod 700 /home/deploy/.ssh && chmod 600 /home/deploy/.ssh/authorized_keysWir konfigurieren die UFW-Firewall:
ufw allow OpenSSHufw allow 80/tcpufw allow 443/tcpufw enableWichtig: Deaktivieren Sie den Root-Login in /etc/ssh/sshd_config (PermitRootLogin no) und starten Sie SSH neu (systemctl restart sshd).
1.1 Installation von Docker und Docker Compose
Für eine Go-Anwendung ist die Containerisierung der De-facto-Standard. Wir installieren Docker gemäß der offiziellen Anleitung:
curl -fsSL https://get.docker.com -o get-docker.shsh get-docker.shusermod -aG docker deployÜberprüfen Sie die Version: docker --version. Als nächstes installieren wir Docker Compose v2 (Plugin):
apt install -y docker-compose-plugin2. CI/CD-Pipeline mit GitHub Actions und Docker
Fortgeschrittene Bereitstellung bedeutet Automatisierung. Wir verwenden GitHub Actions, um das Image zu erstellen und es per SSH an den Server zu senden, gefolgt vom Start des neuen Containers.
Projektstruktur in Go:
myapp/├── main.go├── go.mod├── Dockerfile├── docker-compose.yml└── .github/workflows/deploy.ymlDockerfile (Multi-stage build):
FROM golang:1.22-alpine AS builderWORKDIR /appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/myapp .
FROM alpine:latestRUN apk --no-cache add ca-certificates tzdataWORKDIR /root/COPY --from=builder /app/myapp .EXPOSE 8080CMD ["./myapp"]docker-compose.yml (für Production):
version: '3.8'services: app: image: ghcr.io/your_username/myapp:latest restart: always ports: - "127.0.0.1:8080:8080" environment: - DB_URL=postgres://user:pass@db:5432/mydb depends_on: - db db: image: postgres:16-alpine restart: always environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass volumes: - pg_data:/var/lib/postgresql/datavolumes: pg_data:GitHub Actions Workflow (.github/workflows/deploy.yml):
name: Deploy Go Appon: push: branches: [ main ]jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io