Deployment

Guía de despliegue de servicios

Flujo de Deployment

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│   Commit     │ --> │  CI (GitHub  │ --> │  CD (Webhook │
│   a main     │     │   Actions)   │     │   + Pull)    │
└──────────────┘     └──────────────┘     └──────────────┘
                            │                    │
                            v                    v
                     ┌──────────────┐     ┌──────────────┐
                     │   Tests +    │     │  systemctl   │
                     │   Linting    │     │   restart    │
                     └──────────────┘     └──────────────┘

Métodos de Deploy

1. Manual (SSH)

ssh vps-deploy
cd /srv/projects/PROYECTO
git pull origin main
sudo systemctl restart PROYECTO.service

2. Automatizado (GitHub Actions)

El CD pipeline: 1. Push a main con cambios en app/** o deploy/** 2. GitHub Action envía webhook al servidor 3. El servidor hace git pull y reinicia el servicio

Secrets requeridos: - DEPLOY_HOOK_URL - URL del webhook - DEPLOY_TOKEN - Token de autenticación

Crear Nuevo Servicio

Opción A: Scaffold Automatizado

python /srv/projects/infra-tools/new_project.py \
  --slug mi-proyecto \
  --port 8105 \
  --domain mi-proyecto.illanes00.cl \
  --register-monitor

Opción B: Manual

  1. Crear estructura:
mkdir -p /srv/projects/mi-proyecto
cd /srv/projects/mi-proyecto
python3 -m venv venv
  1. Crear systemd service:
# /etc/systemd/system/mi-proyecto.service
[Unit]
Description=Mi Proyecto
After=network-online.target

[Service]
Type=simple
User=illanes00
WorkingDirectory=/srv/projects/mi-proyecto
EnvironmentFile=-/srv/projects/mi-proyecto/.env
ExecStart=/srv/projects/mi-proyecto/venv/bin/python run.py
Restart=on-failure

[Install]
WantedBy=multi-user.target
  1. Habilitar y arrancar:
sudo systemctl daemon-reload
sudo systemctl enable --now mi-proyecto.service
  1. Configurar Caddy:
# /srv/projects/mi-proyecto/deploy/caddy.caddy
mi-proyecto.illanes00.cl {
    import tls_cf
    reverse_proxy localhost:8105
    encode gzip
}

Verificar Deployment

# Estado del servicio
systemctl status mi-proyecto.service

# Logs en tiempo real
journalctl -u mi-proyecto.service -f -n 50

# Verificar endpoint
curl -s http://localhost:8105/healthz

Rollback

# Ver commits anteriores
git log --oneline -10

# Volver a versión anterior
git checkout <commit-sha>
sudo systemctl restart mi-proyecto.service

# O volver a main después
git checkout main

Más Información