Saltar a contenido

Despliegue en Heroku

El Sistema A3 está desplegado en Heroku, una plataforma cloud que facilita el deployment y escalado de aplicaciones web. Esta guía explica cómo hacer deploy del sistema.

Requisitos Previos

  • Tener el proyecto funcionando localmente
  • Cuenta en Heroku
  • Heroku CLI instalado
  • Git configurado

Instalación de Heroku CLI

Windows

Descarga e instala desde: https://devcenter.heroku.com/articles/heroku-cli

macOS

brew tap heroku/brew && brew install heroku

Linux (Ubuntu/Debian)

curl https://cli-assets.heroku.com/install.sh | sh

Verificar Instalación

heroku --version
# Debe mostrar: heroku/8.x.x ...

Configuración Inicial

1. Login en Heroku

heroku login

Esto abrirá tu navegador para autenticarte.

2. Agregar el Remote de Heroku

Si ya existe la app aterceros en Heroku:

heroku git:remote -a aterceros

3. Verificar Remotes de Git

git remote -v

Deberías ver:

heroku  https://git.heroku.com/aterceros.git (fetch)
heroku  https://git.heroku.com/aterceros.git (push)
origin  https://github.com/A-Terceros-Inmobiliaria/sistema-a3.git (fetch)
origin  https://github.com/A-Terceros-Inmobiliaria/sistema-a3.git (push)

Hacer Deploy

Desde la Rama Master

git push heroku master

Desde Otra Rama

Si estás trabajando en una rama diferente:

git push heroku nombre-de-rama:master

Importante

Heroku siempre hace deploy de la rama que empujas como master. El comando anterior empuja tu rama local a la rama master de Heroku.

Ver el Progreso

Durante el deploy verás:

Enumerating objects: 50, done.
Counting objects: 100% (50/50), done.
...
remote: -----> Building on the Heroku-20 stack
remote: -----> Using buildpack: heroku/python
remote: -----> Python app detected
remote: -----> Installing python-3.11.0
remote: -----> Installing pip 22.3.1, setuptools 65.5.1 and wheel 0.38.4
remote: -----> Installing dependencies with pip
...
remote: -----> Discovering process types
remote:        Procfile declares types -> web, release
remote: -----> Compressing...
remote: -----> Launching...
remote:        Released v123
remote:        https://aterceros.herokuapp.com/ deployed to Heroku

Configuración de Variables de Entorno

En Heroku, las variables de entorno se configuran como Config Vars:

Método 1: Desde la Web

  1. Ve a dashboard.heroku.com
  2. Selecciona tu app aterceros
  3. Ve a Settings → Config Vars
  4. Agrega las variables necesarias

Método 2: Desde CLI

# Ver variables actuales
heroku config --app aterceros

# Agregar una variable
heroku config:set VARIABLE_NAME=valor --app aterceros

# Ejemplo:
heroku config:set DEBUG=False --app aterceros
heroku config:set AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE --app aterceros

Variables Necesarias

# Django
SECRET_KEY=tu-secret-key-generada
DEBUG=False
ALLOWED_HOSTS=aterceros.herokuapp.com,www.sistemaa3.com

# Base de datos (auto-configurada por Heroku)
DATABASE_URL=postgres://...  # Heroku lo crea automáticamente

# AWS S3
USE_S3=True
AWS_ACCESS_KEY_ID=tu_access_key
AWS_SECRET_ACCESS_KEY=tu_secret_key
AWS_STORAGE_BUCKET_NAME=nombre-bucket
AWS_S3_REGION_NAME=us-east-1

# SAP API
SAP_API_URL=http://atercerosb1.ddns.net
SAP_API_USERNAME=usuario
SAP_API_PASSWORD=password

# Web Push
VAPID_PUBLIC_KEY=tu_public_key
VAPID_PRIVATE_KEY=tu_private_key
VAPID_ADMIN_EMAIL=admin@aterceros.com

Heroku Scheduler

Heroku Scheduler permite ejecutar tareas programadas (cron jobs).

1. Activar el Add-on

heroku addons:create scheduler:standard --app aterceros

O desde el dashboard web: Add-ons → Heroku Scheduler

2. Configurar Jobs

# Abrir el dashboard de Scheduler
heroku addons:open scheduler --app aterceros

En el dashboard:

  1. Click en "Create job"
  2. Schedule: Daily (o la frecuencia que necesites)
  3. Time: 02:00 UTC (ajusta según tu zona horaria)
  4. Command:
    python manage.py generar_instancias_recurrentes
    

Zona Horaria

Heroku Scheduler opera en UTC. Calcula el horario según tu zona: - UTC 02:00 = 8:00 PM CST (México) - UTC 08:00 = 2:00 AM CST (México)

Jobs Comunes

# Generar instancias recurrentes de tareas
python manage.py generar_instancias_recurrentes

# Limpiar sesiones expiradas
python manage.py clearsessions

# Limpiar notificaciones antiguas
python manage.py limpiar_notificaciones_viejas

Gestión de la Base de Datos

Ver Información de la BD

heroku pg:info --app aterceros

Backups

# Crear backup manual
heroku pg:backups:capture --app aterceros

# Ver backups disponibles
heroku pg:backups --app aterceros

# Descargar último backup
heroku pg:backups:download --app aterceros

# Programar backups automáticos
heroku pg:backups:schedule DATABASE_URL --at '02:00 America/Mexico_City' --app aterceros

Restaurar Backup

# Restaurar desde un backup de Heroku
heroku pg:backups:restore b101 DATABASE_URL --app aterceros

# Restaurar desde archivo local
heroku pg:push sistema_a3 DATABASE_URL --app aterceros

Ejecutar Migraciones

# Ejecutar en Heroku
heroku run python manage.py migrate --app aterceros

# Crear superusuario
heroku run python manage.py createsuperuser --app aterceros

Logs y Monitoreo

Ver Logs en Tiempo Real

heroku logs --tail --app aterceros

Ver Logs Específicos

# Últimas 100 líneas
heroku logs -n 100 --app aterceros

# Filtrar por tipo
heroku logs --source app --app aterceros
heroku logs --source heroku --app aterceros

Ejecutar Comandos

# Abrir shell de Django
heroku run python manage.py shell --app aterceros

# Abrir shell de PostgreSQL
heroku pg:psql --app aterceros

# Ejecutar comando custom
heroku run python manage.py custom_command --app aterceros

Archivos Importantes para Heroku

Procfile

Define los procesos que Heroku ejecuta:

release: python manage.py migrate
web: gunicorn a3ceros.wsgi --log-file -
  • release: Se ejecuta antes de cada deploy (migraciones)
  • web: Proceso web principal con Gunicorn

runtime.txt

Especifica la versión de Python:

python-3.11.0

requirements.txt

Todas las dependencias del proyecto. Heroku instala automáticamente todo lo que esté aquí.

Dominios Personalizados

Agregar Dominio

heroku domains:add www.sistemaa3.com --app aterceros

Ver Dominios

heroku domains --app aterceros

Configurar DNS

En tu proveedor de DNS, crea un registro CNAME:

CNAME www.sistemaa3.com → aterceros.herokuapp.com

Escalado

Ver Dynos Actuales

heroku ps --app aterceros

Escalar Dynos

# Escalar a 2 dynos web
heroku ps:scale web=2 --app aterceros

# Reducir a 1 dyno
heroku ps:scale web=1 --app aterceros

Costo

Los dynos adicionales tienen costo. Consulta los planes de Heroku.

Rollback

Si algo sale mal después de un deploy:

# Ver releases
heroku releases --app aterceros

# Hacer rollback a la versión anterior
heroku rollback --app aterceros

# Rollback a una versión específica
heroku rollback v122 --app aterceros

CI/CD con GitHub

Para deploys automáticos desde GitHub:

  1. Ve a tu app en Heroku Dashboard
  2. Deploy → Deployment method → GitHub
  3. Conecta tu repositorio
  4. Habilita "Automatic deploys" para la rama deseada
  5. (Opcional) Habilita "Wait for CI to pass"

Problemas Comunes

Error: "Application Error"

Solución: Revisa los logs:

heroku logs --tail --app aterceros

Usualmente es por: - Variables de entorno faltantes - Error en migraciones - Dependencias incorrectas

Error: "No web processes running"

Solución:

heroku ps:scale web=1 --app aterceros

Error: "Slug size too large"

Solución: El slug size máximo es 500MB. Optimiza: - Elimina archivos innecesarios - Usa .slugignore para excluir archivos - Optimiza dependencias

Timeout en Deploy

Solución: Si el deploy tarda mucho:

# Aumentar timeout del buildpack
heroku config:set BUILDPACK_TIMEOUT=600 --app aterceros

Mejores Prácticas

  1. Siempre prueba localmente antes de hacer deploy
  2. Usa branches para features nuevas
  3. Revisa los logs después de cada deploy
  4. Configura backups automáticos de la BD
  5. Usa staging environment para pruebas previas a producción
  6. Nunca commitees secretos al repositorio
  7. Documenta cambios en las config vars

Recursos


¿Deploy exitoso? Verifica que todo funcione en https://aterceros.herokuapp.com/ o tu dominio personalizado.