Questa è una vecchia versione del documento!


Rilascio di un Progetto Django su Ubuntu con Apache

  • Le informazioni riportate in questa guida danno per scontato che sia stata seguita la guida AMPP Server
  • Come per la guida di cui sopra valgono le convenzioni sui nomi delle variabili usati nella presente guida

1. Configurare il backend Web

1.1. Configurazione Progetto

1.1.1. Installazione software per l'utente "WebMaster" e creazione Cartelle che ospiteranno il progetto

Loggarsi come utente <#WebMaster>

su - <#webmaster>

Installazione del nuovo gestore di pacchetto uv

curl -LsSf https://astral.sh/uv/install.sh | sh

Settaggio della variabile necessaria per usare uv

source $HOME/.local/bin/env

Creare la seguente struttura di cartelle

mkdir -p /home/<#webmaster>/www/django/<#djangoprj>

Copiare il progetto django nella cartella <#djangoprj> usando SCP o clonando il progetto da github/gitlab.

Spostarsi nella cartella del progetto

cd /home/<#webmaster>/www/django/<#djangoprj>

1.1.2. Ambiente Virtuale e Librerie

Creazione virtual environment con UV

Se il progetto contiene giá un file pyproject.toml usare

uv sync

Se contiene solo il file requirements.txt usare

uv venv .venv
uv pip install -r requirements.txt

Una volta installati tutti i pacchetti necessari aggiungere i seguenti

uv pip install daphne
uv pip install channels  # Se usi WebSocket
uv pip install gunicorn  # Opzionale, alternativa a Daphne
Creazione virtual environment con VENV/PIP

Se siete tradizionalisti e preferite usare i vecchi strumenti

python3 -m venv .venv
source venv/bin/activate

pip install --upgrade pip
pip install -r requirements.txt
pip install daphne
pip install channels  # Se usi WebSocket
pip install gunicorn  # Opzionale, alternativa a Daphne

1.1.3. Modifiche a ''settings.py''

Il file settings richiede alcune modifiche post deploy per il corretto funzionamento.

nano /home/<#webmaster>/www/django/<#djangoprj>/<#djangoprj>/settings.py

Quello seguente é un esempio di settings.py per mostrare i punti da modificare

# /home/<#webmaster>/www/django/<#djangoprj>/<#djangoprj>/settings.py

import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'tua-chiave-segreta-super-sicura'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = [
    'miosito.com',
    'www.miosito.com',
    'your-server-ip',  # Aggiungi l'IP del server
]

# Application definition
INSTALLED_APPS = [
    'daphne',  # Per ASGI - metti per primo!
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # ... tue app
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = '<#djangoprj>.urls'

# IMPORTANTE: Configura per sottocartella
FORCE_SCRIPT_NAME = '/<#djangoprj>'  # Necessario per miosito.com/<#djangoprj>

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# ASGI
ASGI_APPLICATION = 'myproject.asgi.application'

# Database (esempio con SQLite)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db' / 'db.sqlite3',
    }
}

# Static files (CSS, JavaScript, Images)
STATIC_URL = '/<#djangoprj>/static/'  # Per sottocartella
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

# Media files
MEDIA_URL = '/<#djangoprj>/media/'  # Per sottocartella
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# CSRF trusted origins (importante!)
CSRF_TRUSTED_ORIGINS = [
    'http://miosito.com',
    'https://miosito.com',
]

# Configurazione per sottocartella
USE_X_FORWARDED_HOST = True

1.1.4. Ultimi ritocchi al progetto

Preparazione il DB

uv run manage.py makemigrations
uv run manage.py migrate

Creiamo / aggiorniamo la cartella staticfiles

uv run manage.py collectstatic --noinput

Tornare all'utente precedente

exit

2.1. Configurare Daphne con Systemd

2.1.1. Creare il service file

sudo nano /etc/systemd/system/daphne-<#djangoprj>.service

2.1.2. Contenuto del service file

[Unit]
Description=Daphne ASGI Server per <#djangoprj>
After=network.target

[Service]
Type=simple
User=<#webmaster>
Group=<#webmaster>
WorkingDirectory=/home/<#webmaster>/www/django/<#djangoprj>
Environment="PATH=/home/<#webmaster>/www/django/<#djangoprj>/venv/bin"
Environment="DJANGO_SETTINGS_MODULE=<#djangoprj>.settings"

ExecStart=/home/<#webmaster>/www/django/<#djangoprj>/.venv/bin/daphne \
    -b 127.0.0.1 \
    -p 8001 \
    --proxy-headers \
    --access-log - \
    <#djangoprj>.asgi:application

Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

2.1.3 Avviare il servizio

sudo systemctl daemon-reload
sudo systemctl start daphne-<#djangoprj>
sudo systemctl enable daphne-<#djangoprj>
sudo systemctl status daphne-<#djangoprj>

3.1 Configurare Apache

3.1.1 Backup della configurazione esistente

sudo cp /etc/apache2/sites-available/010-miosito.com.conf /etc/apache2/sites-available/010-miosito.com.conf.backup

3.1.2. Modificare 010-miosito.com.conf

sudo nano /etc/apache2/sites-available/010-miosito.com.conf

3.1.3. Configurazione da aggiungere

    # ===== CONFIGURAZIONE DJANGO - SOTTOCARTELLA =====

    # File statici Django
    Alias /<#djangoprj>/static /home/<#webmaster>/www/django/<#djangoprj>/staticfiles
    <Directory /home/<#webmaster>/www/django/<#djangoprj>/staticfiles>
        Require all granted
        Options -Indexes
    </Directory>

    # File media Django
    Alias /<#djangoprj>/media /home/<#webmaster>/www/django/<#djangoprj>/media
    <Directory /home/<#webmaster>/www/django/<#djangoprj>/media>
        Require all granted
        Options -Indexes
    </Directory>

    # Proxy per Django (sottocartella)
    ProxyPreserveHost On

    # Non fare proxy di static e media
    ProxyPass /<#djangoprj>/static !
    ProxyPass /<#djangoprj>/media !

    # WebSocket per Django (se necessario)
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} ^websocket$ [NC]
    RewriteCond %{HTTP:Connection} ^upgrade$ [NC]
    RewriteRule ^/<#djangoprj>/(.*)$ ws://127.0.0.1:8001/$1 [P,L]

    # Proxy HTTP per Django
    ProxyPass /<#djangoprj> http://127.0.0.1:8001/<#djangoprj>
    ProxyPassReverse /<#djangoprj> http://127.0.0.1:8001/<#djangoprj>

4.1 Impostare i Permessi

Dare ownership all'utente webmaster ed al gruppo www-data

sudo chown -R <#webmaster>:www-data /home/<#webmaster>/www/django
sudo chown -R <#webmaster>:www-data /home/<#webmaster>/www/django/<#djangoprj>/staticfiles/
sudo chown -R <#webmaster>:www-data /home/<#webmaster>/www/django/<#djangoprj>/media/

Permessi corretti

sudo chmod -R 755 /home/<#webmaster>/www/django/<#djangoprj>
sudo chmod -R 775 /home/<#webmaster>/www/django/<#djangoprj>/media
sudo chmod -R 775 /home/<#webmaster>/www/django/<#djangoprj>/db # Se usi SQLite
sudo chmod 644 /home/<#webmaster>/www/django/<#djangoprj>/db/db.sqlite3  # Se usi SQLite

Permettere ad Apache di leggere i file

sudo chmod 755 /home/<#webmaster>
sudo chmod 755 /home/<#webmaster>/www

Ricaricare la configurazione

sudo systemctl restart apache2

2. Controlli

2.1. Controlla il file di servizio

sudo systemctl cat daphne-<#djangoprj>.service

2.2. Verifica lo status dettagliato

sudo systemctl status daphne-<#djangoprj>.service -l

2.3. Controlla i log completi

sudo journalctl -u daphne-<#djangoprj>.service -n 50 --no-pager

Per capire quale file settings.py viene caricato li> sudo journalctl -u daphne-<#djangoprj>.service -n 100 –no-pager </cli>

3. Test

3.1. Riavviare il servizio Dafne

Il file settings.py viene caricato all'avvio del servizio, qualsiasi variazione non viene presa in considerazione se non riavviando il servizio.

sudo systemctl restart daphne-<#djangoprj>.service

3.2. Test di Accesso

Per testare aprire un bowser e puntare a http://[miosito.com]/<#djangoprj>.

python/django/how_to_deploy_on_apache_ubuntu.1763783783.txt.gz · Ultima modifica: 2025/11/22 03:56 da apressato
Torna su
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0