Ves al contingut
Tornar al blog

Allotjar Django en un VPS: Gunicorn, Nginx i posada en producció

Desplega un projecte Python i Django en un VPS Linux amb entorn virtual, Gunicorn, systemd i Nginx; revisa la seguretat, els fitxers estàtics i les còpies.

  • allotjament Django
  • Python VPS
  • Gunicorn
  • Nginx

Si una eina d’IA ha generat un projecte Django, la previsualització pública no és el servidor de producció. Un lloc Django dinàmic necessita Python i un servidor d’aplicacions; un VPS et dona accés al sistema operatiu per instal·lar-los i mantenir-los. És un desplegament autogestionat: tu actualitzes el sistema, configures els serveis, protegeixes els secrets i prepares les còpies de seguretat.

Aquesta guia utilitza Debian o Ubuntu, Gunicorn per a un projecte WSGI i Nginx al davant. És una plantilla, no un desplegament provat contra el teu repositori. Substitueix djangoapp, myproject, el domini i els camins pels valors del projecte. Si només funciona amb ASGI, necessita workers o configura els fitxers estàtics i pujats d’una altra manera, adapta el servidor.

1. Revisa el projecte abans de triar servidor

Localitza manage.py, requirements.txt o pyproject.toml, i el mòdul WSGI/ASGI. Executa l’app en local i apunta les versions de Python i la base de dades que necessita. Revisa als ajustos generats per IA DEBUG, SECRET_KEY, ALLOWED_HOSTS, els orígens CSRF de confiança, les URL de base de dades, les claus API, els fitxers pujats i les tasques en segon pla. No pugis .env ni secrets de producció a Git.

runserver de Django és per desenvolupar, no per a producció. Django recomana un servidor WSGI o ASGI de producció i la seva llista vigent inclou manage.py check --deploy. Si el projecte només genera fitxers estàtics, pot encaixar en un hosting estàtic; aquest recorregut amb VPS és per a una app que necessita executar Django a cada petició.

2. Prepara un VPS Linux i un usuari de servei

Tria un VPS Hostbrid amb una imatge Debian o Ubuntu compatible amb la versió de Python del projecte. Connecta’t per SSH, instal·la les actualitzacions i obre només els ports necessaris. Instal·la els paquets del sistema i crea un compte separat per al servei, en lloc d’executar Django com a root:

sudo apt update
sudo apt install git python3-venv nginx
sudo adduser --system --group --home /srv/djangoapp djangoapp

Clona el repositori a /srv/djangoapp/current com aquest usuari. Si el repositori és privat, utilitza una clau de desplegament de només lectura i no desis la clau privada dins del projecte. Crea un entorn virtual i instal·la les versions declarades per l’app:

sudo -u djangoapp python3 -m venv /srv/djangoapp/venv
sudo -u djangoapp /srv/djangoapp/venv/bin/pip install -r /srv/djangoapp/current/requirements.txt

Comprova que Gunicorn estigui declarat com a dependència del projecte i tingui la versió fixada. No instal·lis paquets globalment per a aquesta aplicació.

3. Configura producció i prepara l’app

Desa les variables de producció en un fitxer controlat per root i llegible pel compte del servei, no a Git. Fes servir els noms de variable que la configuració realment llegeix. Genera una clau secreta única; desactiva DEBUG; limita ALLOWED_HOSTS als teus dominis; configura els orígens CSRF i HTTPS; i facilita les credencials de base de dades sense pujar-les al repositori.

Executa aquestes ordres amb el mateix mòdul de configuració de producció i les mateixes variables d’entorn que farà servir el servei. Si no, la comprovació pot revisar els valors de desenvolupament en lloc de la configuració real.

Abans de modificar una base de dades en ús, fes-ne una còpia i confirma com restaurar-la. Després, activa l’entorn, aplica migracions, recopila fitxers estàtics i executa les comprovacions de desplegament de Django amb els ajustos de producció:

cd /srv/djangoapp/current
sudo -u djangoapp /srv/djangoapp/venv/bin/python manage.py migrate
sudo -u djangoapp /srv/djangoapp/venv/bin/python manage.py collectstatic --noinput
sudo -u djangoapp /srv/djangoapp/venv/bin/python manage.py check --deploy

collectstatic requereix que configuris STATIC_ROOT. Mantén els fitxers pujats pels usuaris separats dels estàtics; defineix-ne els permisos i les còpies, i tracta les pujades com a fitxers no fiables.

4. Executa Gunicorn com a servei de systemd

Prova primer el punt d’entrada WSGI des del directori del projecte. Substitueix myproject.wsgi:application pel mòdul que conté l’objecte WSGI application de la teva app:

cd /srv/djangoapp/current
sudo -u djangoapp /srv/djangoapp/venv/bin/gunicorn --bind 127.0.0.1:8000 myproject.wsgi:application

Quan funcioni, executa’l amb systemd perquè arrenqui amb el VPS i es pugui reiniciar si falla. Aquesta unitat mínima utilitza el camí WSGI del projecte i carrega el fitxer d’entorn protegit:

[Unit]
Description=Django application
After=network.target

[Service]
User=djangoapp
Group=djangoapp
WorkingDirectory=/srv/djangoapp/current
EnvironmentFile=/etc/djangoapp.env
ExecStart=/srv/djangoapp/venv/bin/gunicorn --bind 127.0.0.1:8000 myproject.wsgi:application
Restart=on-failure

[Install]
WantedBy=multi-user.target

Desa-la a /etc/systemd/system/djangoapp.service; executa sudo systemctl daemon-reload, sudo systemctl enable --now djangoapp i comprova sudo systemctl status djangoapp i journalctl -u djangoapp. Ajusta els workers i la memòria després de mesurar els recursos del VPS i la càrrega de l’app.

5. Posa Nginx i HTTPS al davant

Per a un projecte amb STATIC_URL igual a /static/ i STATIC_ROOT a /srv/djangoapp/current/staticfiles, una configuració inicial de Nginx pot ser:

server {
    listen 80;
    server_name exemple.cat www.exemple.cat;

    location /static/ {
        alias /srv/djangoapp/current/staticfiles/;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
    }
}

Desa el lloc al directori de configuració de Nginx de la distribució, activa’l i executa sudo nginx -t abans de recarregar Nginx. Deixa Gunicorn escoltant a loopback perquè no quedi exposat a Internet. Apunta el domini a l’adreça del VPS, permet els ports 80/443, emet un certificat amb el mètode compatible amb la distribució i força HTTPS abans d’acceptar inicis de sessió o dades sensibles. Aquest bloc HTTP és el punt de partida del proxy, no una configuració HTTPS completa.

Si Django és darrere d’un proxy, configura els ajustos de proxy segur només per al camí de proxy que controles. Prova la portada, l’accés d’administració, una ruta interna, els estàtics, els formularis i les integracions API. Després de reiniciar, revisa els logs i confirma que no hi apareguin secrets.

Abans d’obrir el lloc

Executa la llista de desplegament de Django amb els ajustos de producció, verifica les còpies de la base de dades i dels fitxers pujats, i prova una restauració. Consulta també Django amb Gunicorn i el mòdul proxy de Nginx. Aquestes comprovacions no configuren ni monitoritzen el VPS per tu.

Aquest recorregut és per a una app Python el procés de la qual vols administrar. Si el projecte fa servir Flask, consulta la guia de Flask amb Gunicorn i Nginx. Hostbrid proporciona el VPS i l’accés root; tu instal·les i operes Django, la base de dades, Nginx, HTTPS, actualitzacions i còpies de seguretat. Compara les opcions VPS i els preus actuals amb les necessitats de memòria, CPU i emmagatzematge de l’app.

Gestiona els teus webs, servidors i correu.

És gratis i triga un minut.

Mínim 8 caràcters. Ni només números ni una contrasenya comuna.

T’enviarem un correu per confirmar el compte.