4.6 KiB
🌐 Web-Version (MVP)
Diese Variante stellt den PDF-zu-ICS-Konverter im Browser bereit, damit die Nutzung auch auf mobilen Geräten möglich ist.
Starten
Linux/macOS
./start_web.sh
Windows
Doppelklick auf start_web.cmd
Danach im Browser öffnen:
- Lokal:
http://localhost:8000 - Im Netzwerk (z. B. Smartphone):
http://<IP-des-Rechners>:8000
Funktionen
- PDF-Datei hochladen
- Optional Ruhetage ausschließen
- Optional Urlaub ausschließen
- ICS-Datei direkt herunterladen
Hinweise für mobile Nutzung
- Smartphone und Server müssen im gleichen Netzwerk sein (lokaler Betrieb)
- Bei Internet-Betrieb sollte HTTPS und ein Reverse Proxy (z. B. Nginx) genutzt werden
- Hochgeladene Dateien werden nur temporär verarbeitet
Technischer Aufbau
web/app.py– FastAPI-Backend + Upload/Download-Endpunkteweb/templates/index.html– mobile Web-Oberflächeweb/requirements-web.txt– Web-spezifische Abhängigkeiten
Produktion (Kurz)
Beispiel mit Uvicorn direkt:
.venv/bin/python -m uvicorn web.app:app --host 0.0.0.0 --port 8000
Optional mit App-Auth (zusätzliche Schutzschicht):
WEB_AUTH_USER=kalender WEB_AUTH_PASSWORD='StarkesPasswort' \
.venv/bin/python -m uvicorn web.app:app --host 0.0.0.0 --port 8000
Empfohlen für Internet-Betrieb:
- Uvicorn hinter Nginx
- HTTPS aktivieren
- Upload-Größenlimit setzen
- Zugriff absichern (z. B. Basic Auth oder Login)
App-Auth (optional, zusätzlich zu Nginx)
Wenn WEB_AUTH_USER und WEB_AUTH_PASSWORD gesetzt sind, schützt die App alle Endpunkte per HTTP Basic Auth.
Linux/macOS Beispiel:
export WEB_AUTH_USER=kalender
export WEB_AUTH_PASSWORD='StarkesPasswort'
./start_web.sh
Windows (PowerShell) Beispiel:
$env:WEB_AUTH_USER='kalender'
$env:WEB_AUTH_PASSWORD='StarkesPasswort'
./start_web.cmd
Hinweis: Für öffentlich erreichbare Server weiterhin Nginx + HTTPS verwenden.
Öffentliches Deployment (HTTPS)
Beispiel für Ubuntu-Server mit Domain ics.example.de.
1) App als Service starten
/etc/systemd/system/pdf-to-ics-web.service
[Unit]
Description=PDF to ICS Web
After=network.target
[Service]
User=www-data
WorkingDirectory=/opt/pdf_to_ics
ExecStart=/opt/pdf_to_ics/.venv/bin/python -m uvicorn web.app:app --host 127.0.0.1 --port 8000
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
Aktivieren:
sudo systemctl daemon-reload
sudo systemctl enable --now pdf-to-ics-web
sudo systemctl status pdf-to-ics-web
2) Nginx als Reverse Proxy
/etc/nginx/sites-available/pdf-to-ics
server {
listen 80;
server_name ics.example.de;
client_max_body_size 10M;
auth_basic "Geschuetzter Bereich";
auth_basic_user_file /etc/nginx/.htpasswd-pdf-to-ics;
location / {
proxy_pass http://127.0.0.1:8000;
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;
}
}
Aktivieren:
sudo ln -s /etc/nginx/sites-available/pdf-to-ics /etc/nginx/sites-enabled/pdf-to-ics
sudo nginx -t
sudo systemctl reload nginx
2b) Basic Auth einrichten (empfohlen)
sudo apt-get update
sudo apt-get install -y apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd-pdf-to-ics kalender
sudo nginx -t
sudo systemctl reload nginx
Weitere Nutzer hinzufügen (ohne -c):
sudo htpasswd /etc/nginx/.htpasswd-pdf-to-ics weiterer_user
Schnelltest:
curl -I https://ics.example.de
Erwartung: zuerst 401 Unauthorized, mit Login im Browser dann Zugriff.
2c) IP-Whitelist (optional, zusätzlich)
Wenn nur bestimmte Netze zugreifen sollen, kann Nginx den Zugriff auf IP-Bereiche begrenzen.
Beispiel (lokales Netz + einzelne feste IP):
location / {
allow 192.168.178.0/24;
allow 203.0.113.10;
deny all;
proxy_pass http://127.0.0.1:8000;
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;
}
Danach prüfen und neu laden:
sudo nginx -t
sudo systemctl reload nginx
Kombiniert mit Basic Auth ist das eine robuste Mindestabsicherung.
3) HTTPS mit Let's Encrypt
sudo apt-get update
sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d ics.example.de
Test der Erneuerung:
sudo certbot renew --dry-run
4) Mindest-Sicherheit
- Zugriffe absichern (mindestens Basic Auth)
- Optional zusätzlich per IP-Whitelist einschränken
- Upload-Limit klein halten (
client_max_body_size) - Server und Pakete regelmäßig aktualisieren