Despliegue de byteTuto en EC2
Cadena de despliegue
git pushamain→.github/workflows/deploy.yml- Job test:
docker build,nginx -t, prueba de humo (/healthz, página principal, 404, cabecera CSP). - Job publish: imagen multi-arquitectura (amd64 + arm64) subida a
ghcr.io/bytetuto/website:<sha7>y:latest. - Job deploy: SSH a EC2, escribe
/opt/bytetuto/.env, copiadocker-compose.yml+deploy/*.sh, ejecutadeploy/deploy.sh. deploy.sh: pull,up -d, espera/healthz(máx. 40 s). Falla → retroceso automático a la imagen de.last_image.
Las PR solo ejecutan el job test.
Secretos / variables de GitHub (Settings → Secrets and variables → Actions)
- Secretos:
EC2_HOST,EC2_USER(ec2-user o ubuntu),EC2_SSH_KEY(llave privada completa),EC2_KNOWN_HOSTS(recomendado: salida dessh-keyscan -H <ip>). - Variables:
DOMAIN(ej. bytetuto.com),LETSENCRYPT_EMAIL. - Entorno de GitHub
production(puede requerir aprobación manual).
Comandos útiles (en la EC2, en /opt/bytetuto)
- Estado:
docker compose ps· logs:docker compose logs -f web - Salud:
curl -fsS http://127.0.0.1/healthz - Redesplegar una versión específica:
IMAGE=ghcr.io/bytetuto/website:<sha7> bash deploy/deploy.sh - Retroceso manual: volver a ejecutar
deploy.shcon el tag anterior (visible en la pestaña Packages de GitHub). - HTTPS (una vez, después de que DNS esté listo):
bash deploy/init-ssl.sh(probar primero conSTAGING=1). - Renovación: cron
/etc/cron.d/bytetuto-certbot(2 veces/día), log encertbot-renew.log.
Cómo nginx elige HTTP o HTTPS
nginx/40-bytetuto-ssl.sh se ejecuta al iniciar el contenedor:
si el certificado para $DOMAIN existe → https.conf.template, si no → http.conf.template.
Después de init-ssl.sh, un simple docker compose restart web es suficiente.
Diagnóstico rápido
| Síntoma | Pista |
|---|---|
Job deploy: Permission denied (publickey) | EC2_SSH_KEY / EC2_USER incorrectos |
docker: permission denied | el usuario no está en el grupo docker → reconectar tras ec2-setup.sh |
pull access denied | paquete GHCR privado y login fallido, o hacer el paquete público |
| Timeout HTTP desde fuera | Security Group: puertos 80/443 no abiertos |
| certbot falla | DNS aún no propagado, o puerto 80 cerrado |
exec format error | arquitectura: verificar que la imagen sea multi-arquitectura |
Reglas
- Nunca leer ni mostrar
.env, las llaves SSH ocertbot/. - Pedir confirmación antes de
git push,ssh,scpo cualquier modificación dedeploy/y del workflow.