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.