Runbook de operaciones: SSH, git pull seguro y despliegue en producción
Este runbook recoge los procedimientos que hay que seguir para operar el servidor sin perder cambios ni romper el stack. Está basado en incidencias reales ocurridas durante el despliegue inicial.
SSH multi-cuenta en GitHub
El problema original: git push por HTTPS devolvía 403 y SSH autenticaba con la cuenta incorrecta porque había varias claves configuradas sin IdentitiesOnly yes.
La solución: un alias en ~/.ssh/config que fuerza la clave correcta:
Host github-kfra
HostName github.com
User git
IdentityFile ~/.ssh/fra_general
IdentitiesOnly yes
AddKeysToAgent yes
UseKeychain yes
# Verificación
ssh -T git@github-kfra
# Hi fraenigmiaes! You've successfully authenticated...
# Uso habitual
git remote set-url origin git@github-kfra:fraenigmiaes/K_FRA.git
git push origin main
Git pull seguro cuando hay cambios locales en el servidor
Cuando el servidor tiene ajustes manuales sobre archivos que también cambiaron en el repo, git pull falla. La secuencia segura:
cd /root/K_FRA
# 1. Guardar los cambios locales
git stash push -m "server-local-before-pull" 01-infra.yml 02-data.yml 03-app.yml
# 2. Actualizar
git pull --ff-only
# 3. Comparar: si el diff está vacío, el stash ya no aporta nada
git diff stash@{0} -- 01-infra.yml 02-data.yml 03-app.yml
# 4. Descartar si coincide
git stash drop stash@{0}
Secuencia de despliegue
cd /root/K_FRA
# Stack principal (infra + data + app + ops)
make prod ENV_FILE=.env.prod
# Superset — debe arrancarse aparte
docker compose --env-file .env.prod -f 04-bi.yml up -d
make prod no incluye 04-bi.yml. Si se arranca Superset antes que el resto del stack, puede aparecer un segundo Traefik que intente ocupar el puerto 80 y falle con Bind for 0.0.0.0:80 failed: port is already allocated. La solución es bajarlo primero y luego seguir la secuencia correcta.
Verificación del estado del stack
# Estado general
docker ps --format 'table {{.Names}} {{.Status}} {{.Ports}}'
# Certificados TLS
docker exec infra-traefik-1 sh -lc 'wc -c /letsencrypt/acme.json'
# Fizzy SMTP
docker exec app-fizzy-1 env | grep -E '^SMTP_|^MAILER_'
# Logs de Authentik
docker logs --tail=100 infra-authentik-server-1