Bereitstellung einer Go-Anwendung auf VPS: Schritt-für-Schritt-Anleitung von A bis Z

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

Einleitung: Warum Go und VPS das ideale Paar für Ihr Projekt sind

\n\n

Go (Golang) ist eine kompilierte Sprache, die für Leistung und Einfachheit entwickelt wurde. Ihr Hauptvorteil bei der Bereitstellung ist die statische Kompilierung. Sie müssen keinen Interpreter oder eine virtuelle Maschine auf dem Server installieren. Sie laden einfach eine einzige Binärdatei hoch und führen sie aus. Dies macht die Bereitstellung einer Go-Anwendung auf einem VPS unglaublich schnell und zuverlässig.

\n\n

In dieser Anleitung gehen wir den gesamten Weg: vom Schreiben eines einfachen HTTP-Servers in Go bis zu seinem Betrieb auf einem echten VPS-Server mit Ubuntu 22.04. Wir richten systemd für den automatischen Start ein, Nginx als Reverse-Proxy und Let's Encrypt für HTTPS. Alle Codebeispiele sind einsatzbereit.

\n\n

1. Vorbereitung des VPS und Schreiben der Go-Anwendung

\n\n

1.1. Ersteinrichtung des Servers

\n\n

Nach dem Kauf eines VPS (z. B. bei DigitalOcean, Timeweb oder Hetzner) verbinden Sie sich per SSH:

\n\n
ssh root@Ihre_Server_IP
\n\n

Führen Sie die grundlegende Sicherheitseinrichtung durch:

\n\n
apt update && apt upgrade -y\nadduser deployer\nusermod -aG sudo deployer\n# Deaktivieren Sie die Root-Anmeldung in /etc/ssh/sshd_config\n# PermitRootLogin no\nsystemctl restart sshd
\n\n

Stellen Sie sicher, dass die Ports 80 und 443 in der Firewall (UFW) geöffnet sind:

\n\n
ufw allow 22\nufw allow 80\nufw allow 443\nufw enable
\n\n

1.2. Einfache Go-Anwendung für die Bereitstellung

\n\n

Erstellen Sie auf Ihrem lokalen Rechner eine Datei main.go:

\n\n
package main\n\nimport (\n\t"fmt"\n\t"log"\n\t"net/http"\n\t"os"\n)\n\nfunc main() {\n\tport := os.Getenv("PORT")\n\tif port == "" {\n\t\tport = "8080"\n\t}\n\n\thttp.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {\n\t\tfmt.Fprintf(w, "Hallo von Go! Der Server läuft auf Port %s", port)\n\t})\n\n\thttp.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {\n\t\tw.WriteHeader(http.StatusOK)\n\t\tw.Write([]byte("OK"))\n\t})\n\n\tlog.Printf("Starte Server auf :%s", port)\n\tlog.Fatal(http.ListenAndServe(":"+port, nil))\n}
\n\n

Testen Sie lokal:

\n\n
go run main.go
\n\n

Öffnen Sie den Browser unter http://localhost:8080. Wenn Sie die Begrüßung sehen, funktioniert alles.

\n\n

2. Kompilieren und Hochladen der Binärdatei auf den Server

\n\n

2.1. Cross-Kompilierung für Linux

\n\n

Führen Sie auf Ihrem lokalen Rechner (auch wenn Sie Windows oder macOS verwenden) Folgendes aus:

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

Das Flag -o myapp legt den Namen der Ausgabedatei fest. Die Umgebungsvariablen GOOS und GOARCH geben die Zielarchitektur an (64-Bit-Linux).

\n\n

Nach der Kompilierung erhalten Sie eine Binärdatei myapp mit einer Größe von etwa 10–15 MB.

\n\n

2.2. Hochladen auf den VPS

\n\n

Verwenden Sie scp, um die Datei zu kopieren:

\n\n
scp myapp deployer@Ihre_Server_IP:/home/deployer/myapp
\n\n

Oder, wenn Sie rsync verwenden:

\n\n
rsync -avz myapp deployer@Ihre_Server_IP:/home/deployer/myapp
\n\n

Verschieben Sie die Binärdatei auf dem Server in ein Systemverzeichnis und machen Sie sie ausführbar:

\n\n
sudo mv /home/deployer/myapp /usr/local/bin/myapp\nsudo chmod +x /usr/local/bin/myapp
\n\n

3. Einrichtung von systemd und automatischem Start

\n\n

3.1. Erstellen der Service-Datei

\n\n

Systemd verwaltet unsere Anwendung: Start beim Systemstart, Neustart bei Abstürzen und Protokollierung.

\n\n

Erstellen Sie die Datei /etc/systemd/system/myapp.service:

\n\n
sudo nano /etc/systemd/system/myapp.service
\n\n

Fügen Sie die folgende Konfiguration ein:

\n\n
[Unit]\nDescription=Go Application Server\nAfter=network.target\n\n[Service]\nType=simple\nUser=deployer\nGroup=deployer\nWorkingDirectory=/usr/local/bin\nExecStart=/usr/local/bin/myapp\nRestart=always\nRestartSec=5\nEnvironment=PORT=8080\nEnvironment=GIN_MO                

Blogs

Buchempfehlungen