Despliegue en EC2

Para desplegar una aplicación Django en una instancia de Amazon EC2, puedes seguir los siguientes pasos:

Configurar una instancia EC2

Inicia una instancia EC2:

  • Ve a la consola de EC2 y lanza una nueva instancia. Elige una AMI de Amazon Linux 2 o Ubuntu (preferido por su compatibilidad con Django).
  • Configura el tipo de instancia (puedes empezar con una instancia t2.micro si es para pruebas).
  • Crea y descarga un nuevo par de claves (o usa uno existente).
  • Configura las reglas de seguridad para abrir los puertos necesarios:
    • Puerto 22 para SSH.
    • Puerto 80 para HTTP.
    • Puerto 443 para HTTPS (opcional si usas SSL).
  • Lanza la instancia.

Conéctate a la instancia: Usa SSH para conectarte a tu instancia:

ssh -i /path/to/your-key.pem ec2-user@<your-ec2-public-ip>  # For Amazon Linux
ssh -i /path/to/your-key.pem ubuntu@<your-ec2-public-ip>     # For Ubuntu

Instalar dependencias

Actualiza el sistema:

sudo apt update && sudo apt upgrade -y  # For Ubuntu

Instala Python, pip y virtualenv:

sudo apt install python3-pip python3-dev libpq-dev nginx curl -y
sudo pip3 install virtualenv

Instala PostgreSQL (opcional, si usas PostgreSQL):

sudo apt install postgresql postgresql-contrib -y

Configura PostgreSQL (opcional):

Crea una base de datos y usuario para tu aplicación Django:

sudo -u postgres psql
CREATE DATABASE mydb;
CREATE USER myuser WITH PASSWORD 'mypassword';
ALTER ROLE myuser SET client_encoding TO 'utf8';
ALTER ROLE myuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
\q

Configurar Django

Clona tu proyecto Django o crea uno nuevo.

git clone <your-repo-url>
cd <your-project-directory>

Configura un entorno virtual:

virtualenv venv
source venv/bin/activate

Instala las dependencias del proyecto:

pip install -r requirements.txt

Configura las variables de entorno:

Asegúrate de configurar las variables de entorno en tu archivo settings.py como:

DEBUG = False
ALLOWED_HOSTS = ['<your-ec2-public-ip>', 'your-domain.com']

Configura la base de datos (si usas PostgreSQL) en settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '',
    }
}

Recoge los archivos estáticos:

python manage.py collectstatic

Migra la base de datos:

python manage.py migrate

Configurar Gunicorn 1 2

Instala Gunicorn:

pip install gunicorn

Prueba Gunicorn para tu aplicación:

gunicorn --workers 3 <your_project_name>.wsgi:application

Configura Gunicorn como un servicio de systemd:

Crea el archivo /etc/systemd/system/your-deployment.service:

sudo nano /etc/systemd/system/your-deployment.service

Añade la configuración del servicio:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/<your-project-directory>
ExecStart=/home/ubuntu/<your-project-directory>/venv/bin/gunicorn --workers 3 --bind :8080 <your_project_name>.wsgi:application
# EnvironmentFile=/home/ubuntu/<your-project-directory>/.env

[Install]
WantedBy=multi-user.target

Inicia y habilita el servicio Gunicorn:

sudo systemctl enable your-deployment.service
sudo systemctl start your-deployment.service

(opcional) Editar your-deployment.service

Despues de editar recargamos los servicios

sudo systemctl daemon-reload

Reiniciar el servicio

sudo systemctl restart your-deployment.service

Visualizar el estado

sudo systemctl status your-deployment.service

Para habilitar el servicio en cada reinicio

sudo systemctl enable your-deployment.service

Para deshabilitar el servicio en cada reinicio

sudo systemctl disable your-deployment.service

Configurar Nginx

Configura Nginx para servir tu aplicación:

Crea un archivo de configuración en /etc/nginx/sites-available/:

sudo nano /etc/nginx/sites-available/<your-project-name>

Añade esta configuración:

server {
    listen 80;
    server_name <your-ec2-public-ip> your-domain.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/ubuntu/<your-project-directory>;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/<your-project-directory>/gunicorn.sock;
    }
}

Habilita la configuración y reinicia Nginx:

sudo ln -s /etc/nginx/sites-available/<your-project-name> /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

Configurar el cortafuegos

Configura UFW para permitir conexiones SSH, HTTP y HTTPS:

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

(Opcional) Configurar SSL con Let's Encrypt

Instala Certbot:

sudo apt install certbot python3-certbot-nginx -y

Genera un certificado SSL:

sudo certbot --nginx -d your-domain.com

Verifica la renovación automática:

sudo certbot renew --dry-run

Finalización

Con esto, tu aplicación Django debería estar disponible en tu dominio o dirección IP pública de EC2. Asegúrate de monitorear el rendimiento y la seguridad a medida que amplíes la aplicación.


  1. Gunicorn. Running gunicorn - gunicorn 23.0.0 documentation. URL: https://docs.gunicorn.org/en/latest/run.html

  2. Jimmy Tron. Demystifying django deployment with gunicorn and ubuntu service daemons. URL: https://medium.com/@otienojames9/demystifying-django-deployment-with-gunicorn-and-ubuntu-service-daemons-a951900d8871