← Generador PDF /health Modelo de datos Swagger
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.
0.0.0.0/0 (o el origen que necesites).chmod 400 ~/Downloads/TU_CLAVE.key ssh -i ~/Downloads/TU_CLAVE.key ubuntu@TU_IP_PUBLICA
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.
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.
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
padron@127.0.0.1Con 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;"
.env.oracle y cryptographynano ~/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.
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.
dig +short tudominio.duckdns.org A (desde el Mac).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.
rsync con -e "ssh -i ..." se ejecuta en el Mac.sudo systemctl restart padron-api.