2025/01/08 | AI
with openai
 
                  
                  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:
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.
Descarga en el VPS: Usaremos git pull en el VPS para clonar el proyecto desde el repositorio remoto.
Configuración inicial en el VPS:
settings.py específico para producción, adecuado para el entorno del servidor.db.sqlite3 y aplicaremos las migraciones necesarias para el funcionamiento de la aplicación.Configuración de Gunicorn y Nginx:
Pruebas del despliegue:
Implementación de Certbot para SSL:
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-reloadComprobar sintaxis de nginx:
sudo nginx -tVer estado de nginx:
sudo systemctl status nginxVer estado de servicio:
sudo systemctl status retegi.service