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>
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
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
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
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
sudo nano /etc/systemd/system/daphne-<#djangoprj>.service
[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
sudo systemctl daemon-reload sudo systemctl start daphne-<#djangoprj> sudo systemctl enable daphne-<#djangoprj> sudo systemctl status daphne-<#djangoprj>
sudo cp /etc/apache2/sites-available/010-miosito.com.conf /etc/apache2/sites-available/010-miosito.com.conf.backup
sudo nano /etc/apache2/sites-available/010-miosito.com.conf
# ===== 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>
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
sudo systemctl cat daphne-<#djangoprj>.service
sudo systemctl status daphne-<#djangoprj>.service -l
sudo journalctl -u daphne-<#djangoprj>.service -n 50 --no-pagerPer capire quale file settings.py viene caricato li> sudo journalctl -u daphne-<#djangoprj>.service -n 100 –no-pager </cli>
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
Per testare aprire un bowser e puntare a http://[miosito.com]/<#djangoprj>.