Guía de despliegue (checklist)

Resumen ordenado desde Oracle Cloud hasta HTTPS en producción. Los endpoints /health (JSON) y esta página (/guia-despliegue) las sirve la misma API. Sustituye TU_IP_PUBLICA, TU_CLAVE.key, dominios y contraseñas por los tuyos.

1. Oracle Cloud (consola web)

2. Mac — primera conexión SSH

chmod 400 ~/Downloads/TU_CLAVE.key
ssh -i ~/Downloads/TU_CLAVE.key ubuntu@TU_IP_PUBLICA

3. VM — código del proyecto

Git (en la VM):

sudo apt-get update -y && sudo apt-get install -y git
cd ~
git clone URL_DE_TU_REPO Padron_Politico-DELEGADOS
cd ~/Padron_Politico-DELEGADOS

Rsync (en el Mac, no en la VM):

rsync -avz -e "ssh -i $HOME/Downloads/TU_CLAVE.key" \
  --exclude '.venv' --exclude '__pycache__' --exclude '.git' \
  "$HOME/Downloads/Padron_Politico-DELEGADOS/" \
  ubuntu@TU_IP_PUBLICA:~/Padron_Politico-DELEGADOS/

No copies el carpeta .venv desde Mac: créala en Linux con python3 -m venv .venv.

4. VM — script de aprovisionamiento

cd ~/Padron_Politico-DELEGADOS
export APP_ROOT="$HOME/Padron_Politico-DELEGADOS"
export MYSQL_APP_PASSWORD='TU_CLAVE_MYSQL_APP'
sudo -E bash deploy/ubuntu-oracle-free.sh

Instala MySQL, importa sql/mysql_demo.sql, crea .env.oracle, servicio padron-api (uvicorn en 127.0.0.1:8000) y sitio Nginx en el puerto 80.

5. VM — iptables (si desde fuera no entra el 80/443)

Muchas imágenes terminan INPUT con REJECT. Añade ACCEPT para 80 y 443 antes de esa regla (ajusta el número de línea N):

sudo iptables -L INPUT -n --line-numbers
sudo iptables -I INPUT N -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT N -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
sudo apt-get install -y iptables-persistent
sudo netfilter-persistent save

6. VM — MySQL padron@127.0.0.1

Con MYSQL_HOST=127.0.0.1 la app usa TCP; hace falta usuario para ese host, no solo @localhost:

sudo mysql -e "CREATE USER IF NOT EXISTS 'padron'@'127.0.0.1' IDENTIFIED BY 'MISMA_CLAVE_QUE_ENV';"
sudo mysql -e "GRANT ALL PRIVILEGES ON padron_demo.* TO 'padron'@'127.0.0.1'; FLUSH PRIVILEGES;"

7. VM — .env.oracle y cryptography

nano ~/Padron_Politico-DELEGADOS/.env.oracle
# Valores ASCII; sin comillas tipográficas “curvas” en la contraseña.

cd ~/Padron_Politico-DELEGADOS
.venv/bin/pip install 'cryptography>=42.0.0'
sudo systemctl restart padron-api

MySQL 8 usa caching_sha2_password; PyMySQL necesita el paquete cryptography.

8. Comprobar

curl -s http://127.0.0.1:8000/health
curl -s http://127.0.0.1/health
# Desde el Mac (sustituye IP):
curl -4 -s http://TU_IP_PUBLICA/health

En /health, mysql_ok: true indica conexión real a MySQL, no solo el flag mysql.

9. Dominio + HTTPS (Let’s Encrypt)

chmod +x ~/Padron_Politico-DELEGADOS/deploy/setup-letsencrypt.sh
export DOMAIN=tu-subdominio.duckdns.org
export LE_EMAIL=tu@correo.com
sudo -E bash ~/Padron_Politico-DELEGADOS/deploy/setup-letsencrypt.sh

curl -sS "https://tu-subdominio.duckdns.org/health"

Los móviles suelen forzar HTTPS; con certificado y https://tu-dominio/ evitas el problema de “no carga” con la IP en HTTP.

10. Recordatorios