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.
-
Gunicorn. Running gunicorn - gunicorn 23.0.0 documentation. URL: https://docs.gunicorn.org/en/latest/run.html. ↩
-
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. ↩