Ariel Costas

Cómo desplegar una aplicación Django en Linux

Desplegar una aplicación Django es sencillo en principio, aunque puede volverse una idea a la hora de pelearse con Linux, ya que hay muchas cosas que configurar y que pueden fallar.

Este tutorial supone que usas Ubuntu. Si usas otra distro, las rutas igual son distintas o algo. NOTA: NO UTILIZAR EL USUARIO ROOT.

Instalar todo

Ejecutar en una línea de comandos.

sudo apt install git python3 python-is-python3 python3-pip nginx certbot python3-certbot-nginx

A continuación, clonar el proyecto de Django (desde donde lo tengas). Por ejemplo:

git clone https://RUTAALREPOSITORIO/mirepositorio.git djangoapp
sudo cp -R djangoapp/ /opt/
sudo chown -R MIUSUARIO /opt/djangoapp

Importante cambiar la RUTAALREPOSITORIO (a, por ejemplo, una URL de GitHub) y MIUSUARIO al nombre de tu usuario Linux. Una vez hecho esto, instalamos las dependencias con pip:

cd /opt/djangoapp
pip install -r requirements.txt

NOTA: Si no tienes un archivo requirements.txt en tu proyecto, genéralo desde PyCharm incluyendo las dependencias que usa el proyecto.

Servidor WSGI (para Django) con Gunicorn

Instalamos gunicorn desde pip:

pip install gunicorn

Y añadimos la siguiente línea a nuestro archivo ~/.bashrc:

PATH="/home/MIUSUARIO/.local/bin/gunicorn:$PATH"

Una vez hecho esto, cerramos y abrimos la shell para tener el PATH bien. Una vez hecho esto, ejecutamos lo siguiente para comprobar si se ejecuta bien el proyecto:

cd /opt/djangoapp
gunicorn djangoProject.wsgi

En djangoProject (en el segundo comando) hay que poner el nombre del módulo que tiene el settings.py y el wsgi.py.

Añadir el servicio del sistema

Para que el programa se ejecute todo el tiempo y no solo cuando lo ejecutas a mano, hay que añadir un servicio del sistema. Para esto, con root, creamos el siguiente archivo: /etc/systemd/system/django.service.

[Unit]
Description=Aplicacion de Django
After=network.target

[Service]
User=MIUSUARIO
Group=MIUSUARIO
RuntimeDirectory=gunicorn
WorkingDirectory=/opt/djangoapp
ExecStart=/home/MIUSUARIO/.local/bin/gunicorn djangoProject.wsgi
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

Aquí hay que tener en cuenta lo de cambiar MIUSUARIO en tres ocasiones y el nombre djangoProject por el del proyecto (como lo ejecutamos antes desde la terminal). Ahora, para activarlo ejecutamos:

sudo systemctl daemon-reload
sudo systemctl enable --now django

Para comprobar el estado y los logs de la aplicación podemos usar:

  • sudo systemctl status django
  • sudo journalctl -xeu django

Generar los archivos estáticos y base de datos

Ahora volvemos a la ruta de la aplicación Django y generaremos una carpeta con todos los archivos estáticos. Para esto, hacemos:

cd /opt/djangoapp
python3 manage.py migrate

También tenemos que localizar la ruta de los archivos estáticos, generalmente es el directorio static dentro del proyecto base de Django.

Configurar servidor web con NGINX

Editamos el archivo /etc/nginx/sites-enabled/default, borrando todo el contenido y pegando lo siguiente:

server {
        listen 80;
        listen [::]:80;
        server_name EXAMPLE.COM;

        location /static {
                alias /opt/djangoapp/staticfiles;
                try_files $uri $uri/ =404;
        }

        location / {
                proxy_pass http://127.0.0.1:8000;
        }
}

Hay que sustituir el dominio por el que se va a utilizar. En el caso de Azure, si se genera un "DNS Name", suele ser algo estilo LOQUELELLAMES.REGION.cloudapp.azure.com. Si no se tiene ninguno, hay que borrar la línea completamente.

Comprobamos la configuración y la recargamos con los siguientes comandos:

sudo nginx -t
sudo nginx -s reload

Certificado HTTPS con Certbot

Podemos generar un certificado HTTPS con Certbot usando sudo certbot --nginx -d MIDOMINIO.COM con tu dominio. Aceptamos que redirija y demás, y dejamos que haga sus cosas. Si funciona bien, debería funcionar HTTPS para la aplicación.

Thoughts? Leave a comment