Faktenkompass: UI-Rebrand, Admin-Assistent und Produktions-Setup.
Modernisiert die öffentliche Oberfläche mit Inter, Dark Mode und Live-Suche, ergänzt KI-gestützte Entwürfe im Admin mit Nachweis-Uploads und dokumentiert Daphne/Nginx für den Serverbetrieb. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -80,6 +80,163 @@ export DB_PORT=5432
|
||||
|
||||
Installieren Sie zusätzlich `psycopg2-binary` und führen Sie `migrate` erneut aus.
|
||||
|
||||
## Produktion (Daphne + Nginx)
|
||||
|
||||
Für den Serverbetrieb wird [Daphne](https://github.com/django/daphne) als ASGI-Server empfohlen. Nginx dient als Reverse Proxy und liefert statische Dateien sowie Uploads aus.
|
||||
|
||||
### 1. Umgebungsvariablen
|
||||
|
||||
Legen Sie z. B. `/etc/faktenkompass.env` an:
|
||||
|
||||
```bash
|
||||
DJANGO_SETTINGS_MODULE=faktenkompass.settings
|
||||
DJANGO_DEBUG=False
|
||||
DJANGO_SECRET_KEY=lange-zufaellige-zeichenkette
|
||||
ALLOWED_HOSTS=faktenkompass.example.com,www.faktenkompass.example.com
|
||||
|
||||
DB_ENGINE=django.db.backends.postgresql
|
||||
DB_NAME=faktenkompass
|
||||
DB_USER=faktenkompass
|
||||
DB_PASSWORD=geheim
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=5432
|
||||
|
||||
OPENAI_API_KEY=sk-...
|
||||
```
|
||||
|
||||
Optional in `faktenkompass/settings.py` für HTTPS hinter Nginx ergänzen:
|
||||
|
||||
```python
|
||||
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
|
||||
CSRF_TRUSTED_ORIGINS = ['https://faktenkompass.example.com']
|
||||
```
|
||||
|
||||
`SECRET_KEY`, `DEBUG` und `ALLOWED_HOSTS` sollten in der Produktion aus Umgebungsvariablen gelesen werden.
|
||||
|
||||
### 2. Deployment vorbereiten
|
||||
|
||||
```bash
|
||||
cd /pfad/zu/ArgumentAtlas
|
||||
source .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
|
||||
python manage.py migrate
|
||||
python manage.py collectstatic --noinput
|
||||
python manage.py createsuperuser # falls noch nicht vorhanden
|
||||
```
|
||||
|
||||
Stellen Sie sicher, dass der Prozessnutzer Schreibrechte für `media/` und die Datenbank hat.
|
||||
|
||||
### 3. Daphne manuell testen
|
||||
|
||||
```bash
|
||||
set -a && source /etc/faktenkompass.env && set +a
|
||||
daphne -b 127.0.0.1 -p 8001 faktenkompass.asgi:application
|
||||
```
|
||||
|
||||
Die App lauscht dann nur lokal auf Port `8001` – der öffentliche Zugriff erfolgt über Nginx.
|
||||
|
||||
### 4. systemd-Dienst
|
||||
|
||||
Datei `/etc/systemd/system/faktenkompass.service`:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Faktenkompass (Daphne ASGI)
|
||||
After=network.target postgresql.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=www-data
|
||||
Group=www-data
|
||||
WorkingDirectory=/pfad/zu/ArgumentAtlas
|
||||
EnvironmentFile=/etc/faktenkompass.env
|
||||
ExecStart=/pfad/zu/ArgumentAtlas/.venv/bin/daphne \
|
||||
-b 127.0.0.1 \
|
||||
-p 8001 \
|
||||
--access-log /var/log/faktenkompass/access.log \
|
||||
--proxy-headers \
|
||||
faktenkompass.asgi:application
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Log-Verzeichnis anlegen und Dienst aktivieren:
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /var/log/faktenkompass
|
||||
sudo chown www-data:www-data /var/log/faktenkompass
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable --now faktenkompass
|
||||
sudo systemctl status faktenkompass
|
||||
```
|
||||
|
||||
`--proxy-headers` setzt voraus, dass Nginx die Header `X-Forwarded-For`, `X-Forwarded-Proto` und `Host` korrekt weitergibt.
|
||||
|
||||
### 5. Nginx-Konfiguration
|
||||
|
||||
Datei `/etc/nginx/sites-available/faktenkompass`:
|
||||
|
||||
```nginx
|
||||
upstream faktenkompass {
|
||||
server 127.0.0.1:8001;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name faktenkompass.example.com;
|
||||
|
||||
client_max_body_size 25M;
|
||||
|
||||
location /static/ {
|
||||
alias /pfad/zu/ArgumentAtlas/staticfiles/;
|
||||
expires 30d;
|
||||
access_log off;
|
||||
}
|
||||
|
||||
location /media/ {
|
||||
alias /pfad/zu/ArgumentAtlas/media/;
|
||||
expires 7d;
|
||||
access_log off;
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_pass http://faktenkompass;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_redirect off;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Aktivieren und testen:
|
||||
|
||||
```bash
|
||||
sudo ln -s /etc/nginx/sites-available/faktenkompass /etc/nginx/sites-enabled/
|
||||
sudo nginx -t
|
||||
sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
Für HTTPS: Certbot/Let's Encrypt verwenden (`certbot --nginx`).
|
||||
|
||||
### 6. Updates einspielen
|
||||
|
||||
```bash
|
||||
cd /pfad/zu/ArgumentAtlas
|
||||
source .venv/bin/activate
|
||||
git pull
|
||||
pip install -r requirements.txt
|
||||
python manage.py migrate
|
||||
python manage.py collectstatic --noinput
|
||||
sudo systemctl restart faktenkompass
|
||||
```
|
||||
|
||||
## Projektstruktur
|
||||
|
||||
```
|
||||
@@ -123,6 +280,32 @@ Optional: Titel, Bildunterschrift und Reihenfolge. Hochgeladene Dateien erschein
|
||||
|
||||
Dateien werden unter `media/evidence/` gespeichert. In der Produktion muss der Webserver Medien-Dateien ausliefern (z. B. über Nginx).
|
||||
|
||||
### Fakten-Assistent (KI im Admin)
|
||||
|
||||
Der Assistent hilft beim Anlegen neuer Behauptungen per ChatGPT. **Nichts wird automatisch veröffentlicht** – jeder Entwurf muss zuerst geprüft werden.
|
||||
|
||||
**Einrichtung:**
|
||||
|
||||
```bash
|
||||
export OPENAI_API_KEY=sk-...
|
||||
# optional: OPENAI_MODEL=gpt-4o-mini, OPENAI_MODEL_VISION=gpt-4o
|
||||
```
|
||||
|
||||
**Nutzung:**
|
||||
|
||||
1. Admin öffnen → **Fakten-Assistent** (Startseite oder unter Fakten-Entwürfe)
|
||||
2. Artikel-URL, Beschreibung und/oder Bild/PDF eingeben
|
||||
3. **Entwurf generieren** – die KI schlägt Kategorie, Behauptung, Quellen und Gegenargumente vor
|
||||
4. Entwurf prüfen, bearbeiten, ggf. **KI erneut fragen**
|
||||
5. Erst mit **Veröffentlichen** wird der Eintrag live geschaltet
|
||||
|
||||
**Sicherheit:**
|
||||
|
||||
- Nur für eingeloggte Staff-Nutzer
|
||||
- Artikel-URLs: SSRF-Schutz (keine internen/privaten Adressen)
|
||||
- API-Schlüssel nur serverseitig (Umgebungsvariable), nie im Frontend
|
||||
- Hochgeladene Dateien werden erst nach Freigabe als Nachweis verknüpft
|
||||
|
||||
## Lizenz
|
||||
|
||||
Projekt für den internen Gebrauch / Bildungszwecke.
|
||||
|
||||
Reference in New Issue
Block a user