Déploiement byteTuto sur EC2
Chaîne de déploiement
git pushsurmain→.github/workflows/deploy.yml- Job test :
docker build,nginx -t, test de fumée (/healthz, page d'accueil, 404, en-tête CSP). - Job publish : image multi-arch (amd64 + arm64) poussée sur
ghcr.io/bytetuto/website:<sha7>et:latest. - Job deploy : SSH vers EC2, écrit
/opt/bytetuto/.env, copiedocker-compose.yml+deploy/*.sh, lancedeploy/deploy.sh. deploy.sh: pull,up -d, attend/healthz(40 s max). Échec → retour automatique à l'image de.last_image.
Les PR ne font que le job test.
Secrets / variables GitHub (Settings → Secrets and variables → Actions)
- Secrets :
EC2_HOST,EC2_USER(ec2-user ou ubuntu),EC2_SSH_KEY(clé privée complète),EC2_KNOWN_HOSTS(recommandé : sortie dessh-keyscan -H <ip>). - Variables :
DOMAIN(ex. bytetuto.com),LETSENCRYPT_EMAIL. - Environnement GitHub
production(peut exiger une approbation manuelle).
Commandes utiles (sur l'EC2, dans /opt/bytetuto)
- État :
docker compose ps· logs :docker compose logs -f web - Santé :
curl -fsS http://127.0.0.1/healthz - Redéployer une version précise :
IMAGE=ghcr.io/bytetuto/website:<sha7> bash deploy/deploy.sh - Retour arrière manuel : relancer
deploy.shavec l'ancien tag (visible dans l'onglet Packages de GitHub). - HTTPS (une fois, après DNS OK) :
bash deploy/init-ssl.sh(tester d'abord avecSTAGING=1). - Renouvellement : cron
/etc/cron.d/bytetuto-certbot(2×/jour), log danscertbot-renew.log.
Comment nginx choisit HTTP ou HTTPS
nginx/40-bytetuto-ssl.sh s'exécute au démarrage du conteneur :
certificat présent pour $DOMAIN → https.conf.template, sinon → http.conf.template.
Après init-ssl.sh, un simple docker compose restart web suffit.
Diagnostic rapide
| Symptôme | Piste |
|---|---|
Job deploy : Permission denied (publickey) | EC2_SSH_KEY / EC2_USER incorrects |
docker: permission denied | l'utilisateur n'est pas dans le groupe docker → se reconnecter après ec2-setup.sh |
pull access denied | package GHCR privé et login raté, ou rendre le package public |
| Timeout HTTP depuis l'extérieur | Security Group : ports 80/443 non ouverts |
| certbot échoue | DNS pas encore propagé, ou port 80 fermé |
exec format error | architecture : vérifier que l'image est bien multi-arch |
Règles
- Ne jamais lire ni afficher
.env, les clés SSH oucertbot/. - Demander confirmation avant
git push,ssh,scpou toute modification dedeploy/et du workflow.