Implantação do byteTuto na EC2
Cadeia de implantação
git pushemmain→.github/workflows/deploy.yml- Job test:
docker build,nginx -t, teste de fumaça (/healthz, página inicial, 404, cabeçalho CSP). - Job publish: imagem multi-arq (amd64 + arm64) enviada para
ghcr.io/bytetuto/website:<sha7>e:latest. - Job deploy: SSH para EC2, escreve
/opt/bytetuto/.env, copiadocker-compose.yml+deploy/*.sh, executadeploy/deploy.sh. deploy.sh: pull,up -d, aguarda/healthz(40 s máx). Falha → rollback automático para a imagem de.last_image.
PRs executam apenas o job test.
Segredos / variáveis do GitHub (Settings → Secrets and variables → Actions)
- Segredos:
EC2_HOST,EC2_USER(ec2-user ou ubuntu),EC2_SSH_KEY(chave privada completa),EC2_KNOWN_HOSTS(recomendado: saída dessh-keyscan -H <ip>). - Variáveis:
DOMAIN(ex. bytetuto.com),LETSENCRYPT_EMAIL. - Ambiente GitHub
production(pode exigir aprovação manual).
Comandos úteis (na EC2, em /opt/bytetuto)
- Estado:
docker compose ps· logs:docker compose logs -f web - Saúde:
curl -fsS http://127.0.0.1/healthz - Reimplantar uma versão específica:
IMAGE=ghcr.io/bytetuto/website:<sha7> bash deploy/deploy.sh - Rollback manual: execute novamente
deploy.shcom a tag antiga (visível na aba Packages do GitHub). - HTTPS (uma vez, após DNS OK):
bash deploy/init-ssl.sh(teste primeiro comSTAGING=1). - Renovação: cron
/etc/cron.d/bytetuto-certbot(2×/dia), log emcertbot-renew.log.
Como o nginx escolhe HTTP ou HTTPS
nginx/40-bytetuto-ssl.sh é executado na inicialização do contêiner:
certificado presente para $DOMAIN → https.conf.template, senão → http.conf.template.
Após init-ssl.sh, basta um docker compose restart web.
Diagnóstico rápido
| Sintoma | Pista |
|---|---|
Job deploy: Permission denied (publickey) | EC2_SSH_KEY / EC2_USER incorretos |
docker: permission denied | o usuário não está no grupo docker → reconectar após ec2-setup.sh |
pull access denied | pacote GHCR privado e login falhou, ou tornar o pacote público |
| Timeout HTTP do exterior | Security Group: portas 80/443 não abertas |
| certbot falha | DNS ainda não propagado, ou porta 80 fechada |
exec format error | arquitetura: verificar se a imagem é multi-arquitetura |
Regras
- Nunca ler nem exibir
.env, chaves SSH oucertbot/. - Pedir confirmação antes de
git push,ssh,scpou qualquer modificação emdeploy/e no workflow.