2025/01/08 | AI
with openai

Buscar

Web django en Ubuntu Server con Nginx y Gunicorn

Descripción de la imagen

(publicación en edición...)

Introducción al Deploy de un Proyecto Django desde GitHub en un VPS

El despliegue de un proyecto Django en un servidor VPS es una tarea crucial para llevar una aplicación web desde el desarrollo local hasta la producción. Este proceso garantiza que tu aplicación esté accesible en Internet con un servidor web robusto, configuraciones adecuadas y una conexión segura mediante SSL. Aquí, partimos de un flujo basado en Git para simplificar la transferencia del código fuente desde tu entorno de desarrollo local hacia el servidor de producción.

En este tutorial, cubriremos los pasos esenciales para realizar el despliegue:

  1. Subida del proyecto a GitHub: Realizaremos un git push desde el entorno local con un archivo .gitignore que excluya archivos sensibles como settings.py y db.sqlite3. Esto evita que datos confidenciales viajen al repositorio.

  2. Descarga en el VPS: Usaremos git pull en el VPS para clonar el proyecto desde el repositorio remoto.

  3. Configuración inicial en el VPS:

    • Crearemos un archivo settings.py específico para producción, adecuado para el entorno del servidor.
    • Generaremos la base de datos db.sqlite3 y aplicaremos las migraciones necesarias para el funcionamiento de la aplicación.
  4. Configuración de Gunicorn y Nginx:

    • Configuraremos Gunicorn como servidor de aplicaciones para manejar las solicitudes de Django.
    • Configuraremos Nginx como servidor proxy inverso para gestionar las conexiones HTTP.
  5. Pruebas del despliegue:

    • Verificaremos que la aplicación esté funcionando correctamente mediante pruebas locales en el VPS.
  6. Implementación de Certbot para SSL:

    • Usaremos Certbot para instalar un certificado SSL de Let's Encrypt y habilitar conexiones seguras (HTTPS).

Este flujo no solo asegura que tu aplicación se despliegue correctamente, sino que también implementa buenas prácticas de seguridad al separar configuraciones sensibles y establecer una conexión segura con el servidor. A continuación, detallaremos cada paso para lograr el despliegue exitoso de tu proyecto Django.

 

/etc/systemd/system/retegi.service

[Unit]
Description=gunicorn daemon
Requires=retegi.socket
After=network.target

[Service]
User=root
Group=root
WorkingDirectory=/var/www/retegi/retegi
ExecStart=/var/www/retegi/env/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/retegi.sock \
          retegi.wsgi:application

[Install]
WantedBy=multi-user.target

/etc/systemd/system/retegi.socket

[Unit]
Description=gunicorn socket for retegi.eus

[Socket]
ListenStream=/run/retegi.sock

[Install]
WantedBy=sockets.target


 

/etc/nginx/sites-available/retegi.eus

server {
    location / {
        proxy_pass http://unix:/run/retegi.sock;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    #listen 80;
        server_name www.retegi.eus retegi.eus;

        location /media/ {
                alias /var/www/retegi/retegi/media/;
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
        location /static/ {
                alias /var/www/retegi/retegi/staticfiles/;
        }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/retegi.eus/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/retegi.eus/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
        #server_name www.retegi.eus retegi.eus;
    listen 80;
    return 404; # managed by Certbot

}
server {
    if ($host = www.retegi.eus) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = retegi.eus) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

        server_name www.retegi.eus retegi.eus;
    listen 80;
    return 404; # managed by Certbot
}

/etc/nginx/sites-enables/retegi.eus

server {
    location / {
        proxy_pass http://unix:/run/retegi.sock;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    #listen 80;
        server_name www.retegi.eus retegi.eus;

        location /media/ {
                alias /var/www/retegi/retegi/media/;
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
        location /static/ {
                alias /var/www/retegi/retegi/staticfiles/;
        }
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/retegi.eus/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/retegi.eus/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
        #server_name www.retegi.eus retegi.eus;
    listen 80;
    return 404; # managed by Certbot
}
server {
    if ($host = www.retegi.eus) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = retegi.eus) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name www.retegi.eus retegi.eus;
    listen 80;
    return 404; # managed by Certbot
}

Notifica al gestor de servicios systemd que recargue su configuración y reinicie sus tablas internas de unidades y servicios:

sudo systemctl daemon-reload

Comprobar sintaxis de nginx:

sudo nginx -t

Ver estado de nginx:

sudo systemctl status nginx

Ver estado de servicio:

sudo systemctl status retegi.service

 

 

 

 

 

Comentarios