Bereitstellung byteTuto auf EC2
Deployment-Kette
git pushaufmain→.github/workflows/deploy.yml- Job test :
docker build,nginx -t, Smoke-Test (/healthz, Startseite, 404, CSP-Header). - Job publish : Multi-Arch-Image (amd64 + arm64) wird auf
ghcr.io/bytetuto/website:<sha7>und:latestgepusht. - Job deploy : SSH auf EC2, schreibt
/opt/bytetuto/.env, kopiertdocker-compose.yml+deploy/*.sh, führtdeploy/deploy.shaus. deploy.sh: pull,up -d, wartet auf/healthz(max. 40 s). Fehlschlag → automatisches Rollback auf das Image von.last_image.
PRs führen nur den Test-Job aus.
Secrets / Variablen GitHub (Settings → Secrets and variables → Actions)
- Secrets :
EC2_HOST,EC2_USER(ec2-user oder ubuntu),EC2_SSH_KEY(vollständiger privater Schlüssel),EC2_KNOWN_HOSTS(empfohlen: Ausgabe vonssh-keyscan -H <ip>). - Variablen :
DOMAIN(z.B. bytetuto.com),LETSENCRYPT_EMAIL. - GitHub-Umgebung
production(kann manuelle Genehmigung erfordern).
Nützliche Befehle (auf der EC2, in /opt/bytetuto)
- Status :
docker compose ps· Logs :docker compose logs -f web - Health :
curl -fsS http://127.0.0.1/healthz - Eine bestimmte Version erneut bereitstellen :
IMAGE=ghcr.io/bytetuto/website:<sha7> bash deploy/deploy.sh - Manuelles Rollback :
deploy.shmit dem alten Tag erneut ausführen (sichtbar im Tab Packages von GitHub). - HTTPS (einmalig, nach DNS OK) :
bash deploy/init-ssl.sh(zuerst mitSTAGING=1testen). - Erneuerung : cron
/etc/cron.d/bytetuto-certbot(2×/Tag), Log incertbot-renew.log.
Wie nginx HTTP oder HTTPS wählt
nginx/40-bytetuto-ssl.sh wird beim Start des Containers ausgeführt:
Zertifikat für $DOMAIN vorhanden → https.conf.template, sonst → http.conf.template.
Nach init-ssl.sh genügt ein einfaches docker compose restart web.
Schnelldiagnose
| Symptom | Ursache |
|---|---|
Job deploy : Permission denied (publickey) | EC2_SSH_KEY / EC2_USER falsch |
docker: permission denied | Benutzer ist nicht in der Docker-Gruppe → nach ec2-setup.sh neu anmelden |
pull access denied | GHCR-Paket privat und Anmeldung fehlgeschlagen, oder Paket öffentlich machen |
| Timeout HTTP von außen | Security Group: Ports 80/443 nicht geöffnet |
| certbot schlägt fehl | DNS noch nicht propagiert, oder Port 80 geschlossen |
exec format error | Architektur: Prüfen, ob das Image wirklich Multi-Arch ist |
Regeln
- Niemals
.env, SSH-Schlüssel odercertbot/lesen oder anzeigen. - Vor
git push,ssh,scpoder Änderungen andeploy/und dem Workflow um Bestätigung fragen.