Zum Inhalt springen

Go

Starte im Assistenten mit einer Go-Vorlage oder wähl Go-Anwendung für ein leeres Projekt oder ein Repository, oder nimm Go im Bereich Laufzeit zu einem bestehenden Projekt dazu. Der Container envoryx-<projekt>-go läuft mit ghcr.io/envoryx/envoryx-go:<version>: dem offiziellen Image golang:<version>-bookworm plus drei Werkzeugen - air für Live-Reload, Delve zum Debuggen und gotestsum für lesbare Testergebnisse.

Er läuft als PUID:PGID, mit deinem Projekt unter /var/www/html und einem Home-Verzeichnis unter /home/envoryx. GOPATH zeigt auf /home/envoryx/go - was du mit go install installierst, bleibt also erhalten und liegt im PATH. Modul- und Build-Cache liegen im Paket-Cache des Projekts, ein Modul wird also einmal pro Projekt heruntergeladen und nicht bei jedem Build. Schaltest du dort das Teilen ein, laden alle deine Projekte ein Modul nur einmal herunter.

Standard ist 1.27, außerdem gibt es 1.26 - das sind die beiden Releases, die das Go-Team jeweils unterstützt.

Verlangt die go-Zeile in deiner go.mod ein neueres Go, als das Projekt hat, scheitert der Build mit einer Meldung, die dir nicht verrät, dass die Lösung nur eine Auswahlliste entfernt ist. Deshalb prüft Envoryx das für dich: Projektliste und Projektseite zeigen eine Warnung mit beiden Versionen. Wähl im Bereich Laufzeit die neuere Version oder senk die Zeile in der go.mod.

Schalte Server bauen und starten ein und sag Envoryx, welches Main-Package gebaut werden soll: . für das Wurzelverzeichnis des Moduls oder einen Pfad wie ./cmd/server. Der Container baut es, startet es als Hauptprozess, startet es bei einem Absturz neu und veröffentlicht es auf einem eigenen Host-Port. Dein Code liest den Port aus $PORT (standardmäßig 8080); HOST ist 0.0.0.0. Schaltest du den Server aus und wieder ein, behält er diesen Port, ein Lesezeichen darauf bleibt also gültig.

Die Karte Go im Bereich Laufzeit mit der Version, dem eingeschalteten Server, dem Modus, dem Main-Package, dem Port und der Option für DelveDie Karte Go im Bereich Laufzeit mit der Version, dem eingeschalteten Server, dem Modus, dem Main-Package, dem Port und der Option für Delve

Im Modus Entwicklung beobachtet air deinen Code. Du speicherst eine .go-Datei, und ein paar Sekunden später läuft die neue Version - ganz ohne Neustart-Knopf. air schaut allerdings nur auf .go-, .tpl-, .tmpl- und .html-Dateien, nicht auf go.mod und go.sum. Nach einem go get im Terminal behält der Server seinen alten Build, bis du wieder eine .go-Datei speicherst (ein bloßes touch reicht nicht). Produktions-Build baut einmal beim Containerstart und führt dann nur noch das Binary aus; nach einer Änderung startest du das Projekt neu.

Die Binaries landen in /tmp/envoryx-go im Container, nie in deinem Projektordner. Aus Versehen committest du also nichts. Bringst du eine eigene .air.toml mit, ersetzt sie die air-Einstellungen von Envoryx komplett. GIN_MODE folgt dem Modus, debug oder release, was Gin von selbst aufgreift.

Ohne PHP und ohne Python-Server ist der Go-Server die Anwendung: https://<projekt>.<basis> und jede zusätzliche Domain landen direkt bei ihm, der Port des Webserver-Containers bleibt zu, und Direktzugriff ist der Go-Host-Port. Neben PHP oder einem Python-Server hat er einfach seinen eigenen Host-Port - praktisch für eine API neben der eigentlichen Anwendung.

Solange das Projekt keine go.mod hat, gibt es nichts zu bauen. Der Container wartet dann und schreibt das ins Log (envoryx: waiting for go.mod …). Nimm ein Template, klon ein Repository oder führ go mod init im Go-Terminal aus, und es geht los.

Es gibt drei: Go (net/http) nur mit der Standardbibliothek, Gin und Echo. Jedes führt go mod init app aus und schreibt eine main.go mit einer Startroute und einem Health Check unter /healthz, die auf $HOST:$PORT lauscht. Die main.go von Gin vertraut X-Forwarded-For aus den privaten Adressbereichen, die Docker-Netze benutzen, damit c.ClientIP() die Adresse des Browsers liefert und nicht die des Proxys.

Mit Delve debuggen baut den Server ohne Optimierungen, startet ihn unter einem headless Delve auf Port 2345 und legt diesen Port auf einen Host-Port. Du kannst weiter am Code arbeiten, während du debuggst, mit einem Haken: Baut air neu, startet es auch Delve neu, und die Debug-Sitzung deiner IDE endet (GoLand meldet “Debugger disconnected unexpectedly”). Verbinde dich einfach wieder, dann greifen die gesetzten Breakpoints wie vorher.

Host und Port zum Verbinden stehen im Bereich IDE. In GoLand ist das eine Go Remote-Konfiguration (Run → Edit Configurations). In VS Code nimmst du type: go, request: attach und mode: remote, dazu ein substitutePath von deinem lokalen Ordner auf /var/www/html.

Ohne Server wird nur der Port veröffentlicht. Das ist für einen Delve, den du selbst im Go-Terminal startest, zum Beispiel dlv test --headless --listen=:2345 ./pkg/..., um durch einen Test zu steppen.

Mit einer eigenen .air.toml muss deren build.full_bin das Binary selbst unter dlv exec starten - das kann Envoryx dann nicht für dich übernehmen.

Im Bereich Aktionen gibt es go version, go build ./..., go vet ./..., gofmt -l ., go mod tidy, go mod download und go generate ./.... Der Bereich Tests führt go test ./... über gotestsum aus, sodass ein Fehler pro Test erscheint statt als Textwand - siehe Aktionen und Tests.

Für alles, was neben dem Server laufen soll, etwa ein Queue-Consumer, baut der Worker Go-Programm ein Package und startet das Binary. Mehr unter Worker und Cron-Jobs.