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.
Versionen
Abschnitt betitelt „Versionen“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.
Der Server
Abschnitt betitelt „Der Server“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.


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.
Templates
Abschnitt betitelt „Templates“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.
Debuggen mit Delve
Abschnitt betitelt „Debuggen mit Delve“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.
Aktionen, Tests und Worker
Abschnitt betitelt „Aktionen, Tests und Worker“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.