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-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