====== Rilascio di un Progetto Django su Ubuntu con Apache ====== * Le informazioni riportate in questa guida danno per scontato che sia stata seguita la guida [[linux:webserver:ampp_server_24.04|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 /www/django/<#djangoprj>/staticfiles> Require all granted Options -Indexes # File media Django Alias /<#djangoprj>/media /home/<#webmaster>/www/django/<#djangoprj>/media /www/django/<#djangoprj>/media> Require all granted Options -Indexes # 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 ===== 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. \\ Quindi prima di testare riavviare 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>**.