# Django Deployment: Anleitung für DA Server (Linux)
Nginx ist bereits vorinstalliert und SSL-Zertifikate (Let's Encrypt) sind für deine Domain bereits eingerichtet. Standardmäßig werden unter deiner URL die HTML-Dateien aus dem Verzeichnis `/var/www/html/` angezeigt. Um die URL auf deine Django-App (localhost:8000) weiterzuleiten und HTTPS zu aktivieren, bearbeite bitte die Nginx-Config unter dem Pfad `/etc/nginx/sites-available/default`.
## Platzhalter-Übersicht
Ersetze folgende Platzhalter mit deinen eigenen Werten:
- `<your-server-url>` - Deine Server-IP-Adresse
- `<your-port>` - Dein SSH-Port
- `<your-username>` - Dein GitHub-Benutzername
- `<your-repository>` - Name deines GitHub-Repositories
- `<your-domain.com>` - Deine Domain
- `<your-project-name>` - Name deines Projekts (für Logs/Supervisor)
- `<your-django-app>` - Name deiner Django-App (der Ordner mit settings.py)
## 1. SSH-Zugriff über Mac-Terminal
```bash
ssh root@<your-server-url> -p <your-port>
```
- Beim ersten Verbinden nach dem **Host Key Fingerprint** gefragt → mit `yes` bestätigen.
- Passwort eingeben → du bist nun als `root` eingeloggt.
- Bereits installierte Pakete prüfen:
```bash
apt list --installed
```
> Hinweis: sudo ist nicht nötig, da du als root eingeloggt bist.
>
## 2. Neuen User erstellen
```bash
# Neuen User mit Namen, z.B django anlegen (Name ist beliebig)
adduser django --disabled-password --gecos ""
# Wichtige Berechtigung für Nginx setzen!
# Das Home-Verzeichnis muss für den Webserver (Nginx) durchquerbar sein,
# damit dieser später auf die Static Files im Unterordner zugreifen kann.
# Wir geben "Anderen" (u.a. dem Nginx-Prozess) Lese- und Ausführungsrechte (755).
chmod 755 /home/django/
```
## 3. Git installieren
Pakete aktualisieren und Git installieren (dafür bleibst du auf root)
```bash
apt-get update
apt-get install git python3-venv
```
## 4. SSH-Key für GitHub generieren
```bash
# Ins Verzeichnis des Users django wechseln
su - django
# SSH-Key erzeugen, um Zugriff auf GitHub zu erhalten:
ssh-keygen # Enter mehrfach drücken, keine Passphrase nötig
cd .ssh
cat id_rsa.pub # Public Key kopieren
```
- Public Key bei GitHub hinterlegen: **Settings → SSH keys → New SSH key**
- Verbindung testen:
```bash
ssh -T git@github.com
```
## 5. Projekt von GitHub klonen
- Neuen Ordner für Projekte erstellen:
```bash
# Zurück zum Startverzeichnis des User django wechseln
cd
# Neuen Ordner erstellen
mkdir -p /home/django/projects
```
- Projekt per SSH klonen:
```bash
cd /home/django/projects
git clone git@github.com:<your-username>/<your-repository>.git
cd <your-repository>
```
## 6. Projekt einrichten
```bash
# Virtuelle Umgebung im Projektordner erstellen
python3 -m venv venv
source venv/bin/activate
# Abhängigkeiten installieren
pip install -r requirements.txt
pip install gunicorn
# Datenbank-Migrationen ausführen
python manage.py migrate
# Superuser anlegen
python manage.py createsuperuser
```
## 7. Django Projekt anpassen
settings.py anpassen:
```bash
cd /home/django/projects/<your-repository>/<your-django-app>
nano settings.py
```
Hier musst du deine URL (IP oder die eigene Domain) unter ALLOWED_HOSTS hinzufügen:
```python
DEBUG = False
ALLOWED_HOSTS = ['<your-domain.com>']
# Static Files Konfiguration
STATIC_URL = '/static/'
STATIC_ROOT = '/home/django/projects/<your-repository>/staticfiles'
# Optional: Media Files für Uploads
MEDIA_URL = '/media/'
MEDIA_ROOT = '/home/django/projects/<your-repository>/media'
```
## 8. Static Files sammeln
```bash
cd /home/django/projects/<your-repository>
source venv/bin/activate
python manage.py collectstatic --noinput
```
Dieser Befehl kopiert alle statischen Dateien (CSS, JS, etc.) aus deinen Apps in den `staticfiles` Ordner, von wo Nginx sie direkt ausliefert.
Server neu starten:
```bash
# Zurück zu root wechseln
exit
# Server neu starten
service nginx restart
```
**Wichtig:** Nach jedem Update deiner Static Files (z.B. CSS-Änderungen) musst du `python manage.py collectstatic` erneut ausführen, damit die Änderungen live gehen.
## 9. Nginx konfigurieren
```bash
# Zurück zu root wechseln (falls noch nicht geschehen)
exit
# Nginx ist bereits vorinstalliert und muss nur noch konfiguriert werden:
nano /etc/nginx/sites-enabled/default
```
In der bereits vorinstallierten Datei die folgenden Blöcke anpassen (ergänzen bzw. auskommentieren):
```bash
server {
listen 80;
server_name <your-domain.com>;
# For SSL certificate creation and renewal
location /.well-known/acme-challenge/ {
root /var/www/html;
allow all;
}
# Redirect all HTTP to HTTPS
location / {
return 301 https://<your-domain.com>$request_uri;
}
}
server {
listen 443 ssl http2;
server_name <your-domain.com>;
# SSL/TLS configs
ssl_certificate /etc/letsencrypt/live/<your-domain.com>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<your-domain.com>/privkey.pem;
# Legacy / PHP / WordPress style locations (not used for Django)
# location / {
# try_files $uri $uri/ /index.php?$query_string;
# }
# SSL certificate renewal (handled via HTTP, no need to serve via HTTPS)
# location /.well-known/acme-challenge/ {
# root /var/www/html;
# allow all;
# }
# Serve static files directly
location /static/ {
alias /home/django/projects/<your-repository>/staticfiles/;
expires 30d;
add_header Cache-Control "public, immutable";
}
# Optional: Serve media files (uploads) directly
location /media/ {
alias /home/django/projects/<your-repository>/media/;
expires 30d;
}
# Proxy all other requests to Django/Gunicorn
location / {
include proxy_params;
proxy_pass http://127.0.0.1:8000;
}
# Optional error pages (not necessary with Django/Gunicorn)
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# root /var/www/html/example.com/;
# }
# PHP processing (not needed for Django)
# location ~ \.php$ {
# root /var/www/html/example.com/;
# fastcgi_pass 127.0.0.1:9001;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# include fastcgi_params;
# include /etc/nginx/fastcgi_params;
# }
}
```
## 10. Supervisor einrichten
Logverzeichnisse anlegen:
```bash
cd /var/log/
mkdir <your-project-name>
cd <your-project-name>
touch gunicorn.log
touch gunicorn.err.log
```
Installation:
```bash
apt-get install supervisor
```
Konfigurationsdatei öffnen:
```bash
nano /etc/supervisor/conf.d/<your-project-name>-gunicorn.conf
```
Konfiguration hinterlegen:
```bash
[program:<your-project-name>_gunicorn]
user=django
directory=/home/django/projects/<your-repository>
command=/home/django/projects/<your-repository>/.venv/bin/gunicorn <your-django-app>.wsgi:application --bind 127.0.0.1:8000 --workers 3
autostart=true
autorestart=true
stdout_logfile=/var/log/<your-project-name>/gunicorn.log
stderr_logfile=/var/log/<your-project-name>/gunicorn.err.log
```
Log-Berechtigungen anpassen:
```bash
chown -R django:django /var/log/<your-project-name>
```
Supervisor und Nginx starten:
```bash
supervisorctl reread
supervisorctl update
supervisorctl restart <your-project-name>_gunicorn
nginx -t # Konfiguration testen
service nginx restart
```
Bei Problemen kann man Supervisor auch komplett neu starten:
```bash
service supervisor start
service supervisor status
```