CI/CD: Forgejo-Pipeline für automatisierten Build + Deploy auf den VPS #14
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Die Hugo-Site (
MT-R/poc-hugo-sveltia) soll bei jedem Push aufmainautomatisch gebaut und auf den VPS deployed werden.Ziel
.forgejo/workflows/deploy.yml) im Repopoc-hugo-sveltia: Hugo (extended, gepinnte Version) bautpublic/, danach Deploy auf den VPS (NixOS, CX33).just import-commentsbzw. Datenschritte, soweit sie im CI reproduzierbar sind (Kommentare liegen als committetesdata/comments.jsonvor → kein DB-Zugriff im CI nötig).Rahmen / Vorsicht
Ergebnis in diesem Issue festhalten: gewählter Deploy-Weg + Begründung, Workflow-Datei(en), was noch manuell einzurichten ist (Runner, Secrets).
Bearbeitung: Subagent (Deploy-Epic 1–3, Modell Opus), zunächst nur Entwurf/Plan — kein Live-Deploy ohne Review.
Entwurf fertig (nur Workflow + Plan, kein Live-Deploy)
Gewählter Deploy-Weg + Begründung
Push-Deploy: Hugo-Build im CI →
rsyncüber SSH auf das VPS-Zielverzeichnis/docker/mt-rad.de/site(das der nginx-Container aus #15 ausliefert). Einfach, keine zusätzliche Infrastruktur (kein Pull-Agent/Webhook auf dem VPS).nix develop --command hugo --minify). Damit ist die CI-Hugo-Version exakt an local gepinnt — Single Source of Truth istflake.lock(nixpkgs-25.05 → Hugo v0.147.3 extended, lokal verifiziert). Kein separater Versions-Pin, der divergieren kann.rsync/sshkommen ebenfalls aus nixpkgs (nix shell) → keine Annahmen übers Runner-Image.data/comments.jsonist committet →import-commentsentfällt in der Pipeline.mtrad-deploy(deklarativ im NixOS-Modul, nur SSH-Key) statt root — least privilege, Schreibrecht nur auf das Site-Verzeichnis.Artefakte
MT-R/poc-hugo-sveltia, Branchfeat/ci-deploy(Worktree, nicht gemergt):.forgejo/workflows/deploy.yml(neu) — Triggerpush: main+workflow_dispatch,concurrency-Guard.hugo.toml:baseURL→https://mt-rad.de/.static/admin/config.yml:site_url→https://mt-rad.de(gehört fachlich zu #16).Manuell einzurichten (nur benennen — nichts angelegt)
Forgejo-Actions-Secrets (Repo
MT-R/poc-hugo-sveltiaoder OrgMT-R):VPS_DEPLOY_SSH_KEY— privater ed25519-Key. Erzeugen:ssh-keygen -t ed25519 -C mtrad-ci -f mtrad-ci. Public-Teil → ins NixOS-Modulmt-rad-site.nix(Usermtrad-deploy, ersetzt Platzhalter), Private-Teil → dieses Secret.VPS_SSH_KNOWN_HOSTS— Host-Key-Pinning gegen MITM:ssh-keyscan 91.99.145.19.Runner: poc-hugo-sveltia hat Actions aktiviert (
has_actions: true). Es gibt Runner-Aktivität auf der Instanz, aber ob ein Runner mit Labelubuntu-latestfür die OrgMT-Rverfügbar/registriert ist, muss verifiziert werden — ggf. per Org-Runner registrieren (get_runner_registration_token). Der Runner mussnixinstallieren dürfen (root im Container; catthehacker-Images können das). Alternative, falls nix-in-CI unerwünscht: gepinnte Hugo-extended-Binary direkt laden — habe ich zugunsten derflake.lock-Single-Source verworfen, ist aber ein 3-Zeilen-Swap.Reihenfolge
Secrets + Runner + Deploy-User (#15) müssen stehen, bevor der erste Push deployt. rsync braucht kein DNS (direkt auf die IP) → CI kann vor dem DNS-Cutover deployen (Reihenfolge siehe #15).
Risiken
colmena applyvon #15 → CI-Deploy schlägt vorher fehl (erwartbar).--deletebei rsync: räumt Fremd-Dateien im Zielverzeichnis weg — gewollt, aber das Verzeichnis darf nur der CI gehören (ist so).Stand: Workflows liegen bereit (Branch
feat/ci-deployinpoc-hugo-sveltia)Zwei Forgejo-Actions-Workflows unter
.forgejo/workflows/:deploy.yml— Build & Deploy (Push aufmain, täglich per Cron, manuell)flake.lock, Single Source of Truth für die Hugo-Version), danachrsync --delete --checksumüber SSH nach/docker/mt-rad.de/site(VPS, siehe #15).--buildFuture. Die Republish-Artikel tragen Zukunfts-Daten (Redaktionsplan, Start Ende August, ~1,5/Woche); der nächtliche Rebuild veröffentlicht jeden Artikel an dem Tag, an dem sein Datum erreicht ist — ohne dass jemand committen muss. Ein reiner Push-Trigger täte das nicht.ci.yml— MR-Check (bei jedem Pull Request gegenmain)--buildFuture --panicOnWarning, kein Deploy, keine Secrets → läuft auch für Fork-Beiträge gefahrlos und blockiert kaputte Merges. Baut bewusst alles inkl. noch nicht fälliger Artikel, damit Fehler vor dem Merge auffallen. Lokal gegen beide Branches verifiziert (grün).Noch manuell einzurichten (Voraussetzung, damit es scharf wird)
ubuntu-latestfür die Org MT-R registrieren, der die Nix-Installation ausführen darf (root im Container).VPS_DEPLOY_SSH_KEY(privater ed25519-Deploy-Key; öffentlicher Teil im NixOS-Modul, Usermtrad-deploy) undVPS_SSH_KNOWN_HOSTS(ssh-keyscan -p 22 91.99.145.19).Der MR-Check läuft schon ohne Secrets — sobald der Runner steht. Der Deploy wird erst nach Punkt 2 scharf. Gewählter Deploy-Weg = Push-Deploy per rsync über Deploy-Key (kein Pull-Agent auf dem VPS nötig, kein DB-Zugriff im CI, da
data/comments.jsoncommittet ist).