00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

Deploy in Produzione

Il deploy di un’applicazione Django in produzione richiede una serie di configurazioni specifiche per garantire sicurezza, prestazioni e stabilita. In questa guida vedremo come preparare il progetto per la produzione utilizzando Gunicorn, Nginx e le impostazioni di sicurezza raccomandate.

Checklist di Produzione

Django include un comando per verificare le impostazioni di sicurezza:

python manage.py check --deploy

Questo comando segnala potenziali problemi nella configurazione di produzione.

Impostazioni Fondamentali

# settings.py (produzione)
import os

DEBUG = False

ALLOWED_HOSTS = ["miosito.com", "www.miosito.com"]

SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY")

Non usare mai DEBUG = True in produzione: espone informazioni sensibili e consuma piu risorse.

Variabili d’Ambiente

Usa variabili d’ambiente per le configurazioni sensibili. Il pacchetto django-environ semplifica la gestione:

pip install django-environ
# settings.py
import environ

env = environ.Env()
environ.Env.read_env(BASE_DIR / ".env")

SECRET_KEY = env("DJANGO_SECRET_KEY")
DEBUG = env.bool("DJANGO_DEBUG", default=False)
ALLOWED_HOSTS = env.list("DJANGO_ALLOWED_HOSTS", default=[])

DATABASES = {
    "default": env.db("DATABASE_URL"),
}

File .env di esempio:

DJANGO_SECRET_KEY=la-tua-chiave-segreta-molto-lunga
DJANGO_DEBUG=False
DJANGO_ALLOWED_HOSTS=miosito.com,www.miosito.com
DATABASE_URL=postgres://utente:password@localhost:5432/mio_database

Configurazione del Database

In produzione, usa PostgreSQL invece di SQLite:

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": os.environ.get("DB_NAME"),
        "USER": os.environ.get("DB_USER"),
        "PASSWORD": os.environ.get("DB_PASSWORD"),
        "HOST": os.environ.get("DB_HOST", "localhost"),
        "PORT": os.environ.get("DB_PORT", "5432"),
    }
}

File Statici con WhiteNoise

WhiteNoise permette a Django di servire i file statici direttamente, senza bisogno di Nginx per gli static:

pip install whitenoise
# settings.py
MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "whitenoise.middleware.WhiteNoiseMiddleware",  # Subito dopo SecurityMiddleware
    # ...
]

STATIC_URL = "/static/"
STATIC_ROOT = BASE_DIR / "staticfiles"
STORAGES = {
    "staticfiles": {
        "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
    },
}

Raccogli tutti i file statici:

python manage.py collectstatic --noinput

WSGI con Gunicorn

Gunicorn e il server WSGI consigliato per Django in produzione:

pip install gunicorn

Avvia l’applicazione:

gunicorn mio_progetto.wsgi:application --bind 0.0.0.0:8000 --workers 3

Il numero di worker consigliato e (2 * CPU) + 1.

ASGI con Uvicorn

Per applicazioni asincrone, usa Uvicorn come server ASGI:

pip install uvicorn
uvicorn mio_progetto.asgi:application --host 0.0.0.0 --port 8000 --workers 3

Configurazione Nginx

Nginx funziona come reverse proxy davanti a Gunicorn:

server {
    listen 80;
    server_name miosito.com www.miosito.com;

    location /static/ {
        alias /percorso/progetto/staticfiles/;
        expires 30d;
    }

    location /media/ {
        alias /percorso/progetto/media/;
        expires 30d;
    }

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

Impostazioni di Sicurezza

# settings.py (produzione)

# HTTPS
SECURE_SSL_REDIRECT = True
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")

# Cookie sicuri
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

# Protezione HSTS
SECURE_HSTS_SECONDS = 31536000  # 1 anno
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True

# Altre protezioni
SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = "DENY"

Service Systemd

Crea un servizio systemd per avviare Gunicorn automaticamente:

# /etc/systemd/system/django-app.service
[Unit]
Description=Django Application (Gunicorn)
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/percorso/progetto
ExecStart=/percorso/venv/bin/gunicorn mio_progetto.wsgi:application --bind 127.0.0.1:8000 --workers 3
Restart=always
EnvironmentFile=/percorso/progetto/.env

[Install]
WantedBy=multi-user.target

Abilita e avvia il servizio:

sudo systemctl enable django-app
sudo systemctl start django-app

Conclusione

Il deploy di Django in produzione richiede attenzione a sicurezza, prestazioni e affidabilita. Usa DEBUG=False, configura ALLOWED_HOSTS, proteggi le credenziali con variabili d’ambiente e attiva tutte le impostazioni di sicurezza HTTPS. Con Gunicorn come server WSGI, Nginx come reverse proxy e WhiteNoise per i file statici, avrai una configurazione solida e pronta per gestire il traffico reale.