Questa è una vecchia versione del documento!
Indice
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

