Installation¶
Diese Anleitung beschreibt die Installation des Vogelschlagmelders auf einem Linux-Server – wahlweise mit Docker (empfohlen) oder als manuelle Installation ohne Docker.
Installation mit Docker¶
Voraussetzungen¶
Ein Linux-Server (z. B. Debian, Ubuntu) mit root- oder sudo-Zugang
Eine öffentliche IP-Adresse oder eine Domain, unter der der Dienst erreichbar sein soll
Docker und Docker Compose müssen installiert sein
Docker installieren¶
Falls Docker noch nicht installiert ist, sollte es über die offizielle Anleitung von Docker installiert werden. Die Installationsschritte unterscheiden sich je nach Linux-Distribution:
Nach der Installation den aktuellen Benutzer zur docker-Gruppe hinzufügen und prüfen, ob Docker läuft:
# Aktuellen Benutzer zur docker-Gruppe hinzufügen (Neuanmeldung nötig)
sudo usermod -aG docker $USER
Hinweis
Nach dem Hinzufügen zur docker-Gruppe muss man sich neu anmelden (oder newgrp docker ausführen), damit die Gruppenrechte greifen.
Anschließend prüfen, ob Docker korrekt installiert ist:
docker --version
docker compose version
DNS einrichten¶
Damit der Vogelschlagmelder unter einer eigenen Adresse erreichbar ist, muss ein A-Record beim DNS-Anbieter angelegt werden.
Beispiel: Der Melder soll unter vogelschlag.storchennest.test erreichbar sein und der Server hat die IP 203.0.113.42.
Beim DNS-Anbieter (z. B. Hetzner DNS, INWX, Cloudflare) wird folgender Eintrag angelegt:
Typ |
Name |
Wert |
TTL |
|---|---|---|---|
A |
vogelschlag.storchennest.test |
203.0.113.42 |
3600 |
Hinweis
Die DNS-Änderung kann je nach Anbieter einige Minuten bis Stunden dauern, bis sie weltweit verfügbar ist. Mit dig vogelschlag.storchennest.test oder nslookup vogelschlag.storchennest.test lässt sich der Eintrag prüfen.
Arbeitsordner anlegen¶
Der Vogelschlagmelder wird unter /srv/docker/ betrieben. Dort wird ein eigener Ordner angelegt:
sudo mkdir -p /srv/docker/vogelschlagmelder
sudo chown $USER:$USER /srv/docker/vogelschlagmelder
cd /srv/docker/vogelschlagmelder
Durch chown erhält der aktuelle Benutzer Schreibrechte auf den Ordner, sodass im weiteren Verlauf Dateien ohne sudo angelegt werden können.
Umgebungsvariablen konfigurieren (.env)¶
Die Zugangsdaten und Einstellungen werden über eine .env-Datei konfiguriert. Als Vorlage dient die Datei .env.example aus dem Repository:
# .env-Datei anlegen
nano .env
Inhalt der .env-Datei:
# ==================== Zugangsdaten ====================
# WICHTIG: Verwende sichere, einzigartige Passwörter!
# Passwörter müssen mindestens 8 Zeichen lang sein.
ADMIN_USER=admin
ADMIN_PASSWORD=CHANGEME_sicheres_passwort_hier
MELDEZENTRALE_USER=meldezentrale
MELDEZENTRALE_PASSWORD=CHANGEME_sicheres_passwort_hier
# ==================== SMTP (E-Mail) ====================
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=
SMTP_PASSWORD=
SMTP_FROM=alerts@example.com
SMTP_STARTTLS=true
# Optionale Absender-Anpassung
FROM_EMAIL=
FROM_NAME=
# ==================== Sicherheit ====================
# Produktionsmodus: Aktiviert Secure-Cookies (erfordert HTTPS)
PRODUCTION_MODE=true
# CSRF-Secret: Zufälliger Wert, z. B. generiert mit:
# python3 -c "import secrets; print(secrets.token_hex(32))"
CSRF_SECRET=CHANGEME_zufaelliger_wert_hier
# Schlüssel für die Verschlüsselung von SMTP-Passwort und Matrix-Token in
# der Datenbank. Ebenfalls ein zufälliger Wert – aber ein anderer als das
# CSRF_SECRET, sonst macht ein Wechsel des einen die Zugangsdaten unlesbar.
SETTINGS_SECRET=CHANGEME_zufaelliger_wert_hier
# Öffentlich erreichbare Adresse dieser Installation. Pflicht, sobald
# PRODUCTION_MODE=true gesetzt ist. Aus diesem Wert werden die Links in
# E-Mails und Matrix-Nachrichten gebildet.
PUBLIC_BASE_URL=https://vogelschlag.storchennest.test
# Weitere erlaubte Host-Header, kommagetrennt. Nur nötig, wenn die
# Anwendung unter mehreren Namen erreichbar sein soll.
ALLOWED_HOSTS=
# ==================== Optionale Einstellungen ====================
# SMTP-Zugangsdaten über die Adminoberfläche änderbar machen. Solange sie
# unverschlüsselt in der Datenbank liegen, besser bei false belassen.
ALLOW_SMTP_OVERRIDE=false
# API-Dokumentation unter /docs und /redoc freigeben. Sie legt alle Routen
# samt Parametern offen und gehört nicht in den Produktivbetrieb.
ENABLE_API_DOCS=false
# Spamschutz des Meldeformulars: Rechenaufgabe im Browser des Absenders
# (leer = Standard 18, 0 = abgeschaltet). Höhere Werte kosten mehr Zeit.
POW_DIFFICULTY=
# Gleichzeitig laufende Bildverarbeitungen (leer = Standard 2). Begrenzt
# die Speicherspitze bei mehreren Uploads zur selben Zeit.
IMAGE_WORKERS=
# Reverse-Proxys, deren Weiterleitungs-Header ausgewertet werden dürfen.
# Leer lassen: Der Standard deckt Loopback und private Netze ab und passt
# damit für Traefik im selben Docker-Netz.
TRUSTED_PROXIES=
# Domains, die das Meldeformular als iFrame einbetten dürfen
# (kommagetrennt, leer = alle). Die Liste in der Adminoberfläche hat Vorrang.
WIDGET_ALLOWED_DOMAINS=
# ==================== Let's Encrypt ====================
# E-Mail-Adresse für Let's Encrypt Zertifikatsbenachrichtigungen
LETSENCRYPT_EMAIL=admin@storchennest.test
Wichtig
Alle CHANGEME_-Werte müssen vor dem Produktiveinsatz durch sichere, einzigartige Werte ersetzt werden. CSRF_SECRET und SETTINGS_SECRET sollten lange, zufällige Hex-Strings sein – und zwei verschiedene:
python3 -c "import secrets; print(secrets.token_hex(32))"
Ohne CSRF_SECRET, SETTINGS_SECRET, ADMIN_PASSWORD und MELDEZENTRALE_PASSWORD startet der Container nicht. Fehlt bei PRODUCTION_MODE=true die PUBLIC_BASE_URL, bricht die Anwendung beim Start ebenfalls ab.
Das SETTINGS_SECRET gehört gesondert gesichert, getrennt vom Ordner ./data: Genau darin liegt sein Nutzen, denn eine Kopie der Datenbank allein enthält den Schlüssel dann nicht. Geht er verloren, müssen SMTP-Passwort und Matrix-Token in der Adminoberfläche neu eingetragen werden; alle übrigen Daten bleiben unberührt.
### Docker Compose einrichten
Das Setup besteht aus zwei Diensten:
- **Traefik** – ein Reverse-Proxy, der automatisch HTTPS-Zertifikate über Let's Encrypt bezieht
- **Vogelschlagmelder** – die eigentliche Anwendung
Traefik leitet eingehende Anfragen auf Port 80 (HTTP) und 443 (HTTPS) an den Vogelschlagmelder weiter und kümmert sich vollautomatisch um die Zertifikatsverlängerung.
Im Arbeitsordner wird die Datei `docker-compose.yaml` angelegt:
```bash
nano docker-compose.yaml
Inhalt:
services:
# =========================================================================
# Traefik – Reverse Proxy & Let's Encrypt
# =========================================================================
traefik:
image: traefik:v3.6
container_name: traefik
restart: unless-stopped
command:
# Entrypoints
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
# HTTP → HTTPS Redirect
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
# Let's Encrypt
- "--certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL}"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
# Docker Provider
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
# Logging
- "--log.level=WARN"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./volumes/traefik/letsencrypt:/letsencrypt
networks:
- web
# =========================================================================
# Vogelschlagmelder
# =========================================================================
vogelschlagmelder:
build:
context: https://codeberg.org/nabu-jena/Vogelschlagmelder.git#main:app
dockerfile: Dockerfile
container_name: vogelschlagmelder
restart: unless-stopped
environment:
# Credentials und Einstellungen aus der .env-Datei
- ADMIN_USER=${ADMIN_USER:?ADMIN_USER muss gesetzt werden}
- ADMIN_PASSWORD=${ADMIN_PASSWORD:?ADMIN_PASSWORD muss gesetzt werden}
- MELDEZENTRALE_USER=${MELDEZENTRALE_USER:?MELDEZENTRALE_USER muss gesetzt werden}
- MELDEZENTRALE_PASSWORD=${MELDEZENTRALE_PASSWORD:?MELDEZENTRALE_PASSWORD muss gesetzt werden}
- SMTP_HOST=${SMTP_HOST:-smtp.example.com}
- SMTP_PORT=${SMTP_PORT:-587}
- SMTP_USER=${SMTP_USER:-}
- SMTP_PASSWORD=${SMTP_PASSWORD:-}
- SMTP_FROM=${SMTP_FROM:-}
- SMTP_STARTTLS=${SMTP_STARTTLS:-true}
- ALLOW_SMTP_OVERRIDE=${ALLOW_SMTP_OVERRIDE:-false}
- FROM_EMAIL=${FROM_EMAIL:-}
- FROM_NAME=${FROM_NAME:-}
# Sicherheitseinstellungen
- PRODUCTION_MODE=${PRODUCTION_MODE:-true}
- PUBLIC_BASE_URL=${PUBLIC_BASE_URL:-}
- CSRF_SECRET=${CSRF_SECRET:?CSRF_SECRET muss gesetzt werden}
- SETTINGS_SECRET=${SETTINGS_SECRET:?SETTINGS_SECRET muss gesetzt werden}
- ALLOWED_HOSTS=${ALLOWED_HOSTS:-}
- ENABLE_API_DOCS=${ENABLE_API_DOCS:-false}
- TRUSTED_PROXIES=${TRUSTED_PROXIES:-}
- POW_DIFFICULTY=${POW_DIFFICULTY:-}
- IMAGE_WORKERS=${IMAGE_WORKERS:-}
- WIDGET_ALLOWED_DOMAINS=${WIDGET_ALLOWED_DOMAINS:-}
volumes:
- ./data:/app/data
# ---------- Container-Härtung ----------
# Speicher- und CPU-Obergrenze: Ohne Limit trifft der OOM-Killer bei
# einer Lastspitze den Host statt den Container.
mem_limit: 1g
memswap_limit: 1g
cpus: 2.0
# Keine neuen Privilegien, alle Capabilities ablegen. Die verbliebenen
# braucht der Entrypoint, um auf den Non-Root-User zu wechseln.
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
cap_add:
- CHOWN
- SETUID
- SETGID
- DAC_OVERRIDE
# Wurzel-Dateisystem schreibgeschützt. Beschreibbar bleiben nur das
# Datenverzeichnis und /tmp, wohin große Uploads ausgelagert werden.
read_only: true
tmpfs:
- /tmp:size=256m
logging:
driver: json-file
options:
max-size: "10m"
max-file: "5"
labels:
- "traefik.enable=true"
- "traefik.http.routers.vogelschlagmelder.rule=Host(`vogelschlag.storchennest.test`)"
- "traefik.http.routers.vogelschlagmelder.entrypoints=websecure"
- "traefik.http.routers.vogelschlagmelder.tls.certresolver=letsencrypt"
- "traefik.http.services.vogelschlagmelder.loadbalancer.server.port=8000"
networks:
- web
networks:
web:
name: web
driver: bridge
Wichtig
Die Domain in der Zeile Host(\vogelschlag.storchennest.test`)` muss durch die eigene Domain ersetzt werden – also die, für die der DNS-A-Record angelegt wurde.
Erläuterungen:
Traefik (Reverse Proxy)¶
entrypoints– Traefik lauscht auf Port 80 (HTTP) und Port 443 (HTTPS). Alle HTTP-Anfragen werden automatisch auf HTTPS umgeleitet.certificatesresolvers– Let’s Encrypt stellt automatisch ein gültiges TLS-Zertifikat für die konfigurierte Domain aus. Die HTTP-Challenge prüft dabei, ob die Domain auf diesen Server zeigt (daher muss der DNS-A-Record vorher gesetzt sein)./var/run/docker.sock– Traefik erkennt über den Docker-Socket automatisch, welche Container als Webdienste erreichbar sein sollen (gesteuert über Labels)../volumes/traefik/letsencrypt– Hier werden die Zertifikate gespeichert, damit sie bei einem Neustart nicht erneut angefordert werden müssen.
Vogelschlagmelder¶
build.context– Das Docker-Image wird direkt aus dem Git-Repository auf Codeberg gebaut. Es wird kein manuelles Klonen benötigt.labels– Über die Traefik-Labels wird festgelegt, unter welcher Domain der Melder erreichbar ist und dass Let’s Encrypt ein Zertifikat ausstellen soll.volumes– Die Datenbank und hochgeladene Dateien werden im lokalen Ordner./datagespeichert und bleiben bei Container-Neustarts erhalten.Kein
ports-Eintrag – Der Vogelschlagmelder wird nicht direkt exponiert, sondern ist nur über Traefik erreichbar. Das erhöht die Sicherheit.PUBLIC_BASE_URL– Muss dieselbe Domain enthalten wie die Traefik-RegelHost(...)weiter oben. Aus diesem Wert werden die Links in Benachrichtigungen gebildet, und er bestimmt mit, welche Host-Header die Anwendung überhaupt annimmt.TRUSTED_PROXIES– Kann leer bleiben. Der Standard deckt Loopback und die privaten Netzbereiche ab, in denen Traefik im Docker-Netz läuft. Ohne diese Einstellung sähen für die Anwendung alle Anfragen so aus, als kämen sie von Traefik – die Begrenzung der Anmeldeversuche und der Meldungen würde dann für alle Besucher gemeinsam statt pro Absender greifen.Container-Härtung – Speicher- und CPU-Grenze, schreibgeschütztes Wurzel-Dateisystem, abgelegte Capabilities und begrenzte Logdateien. Der Container braucht keine weitergehenden Rechte; die Grenzen sorgen dafür, dass eine Lastspitze oder ein Fehler im Container bleibt und nicht den ganzen Server mitnimmt.
Datenverzeichnis anlegen¶
Vor dem ersten Start muss das Datenverzeichnis manuell angelegt werden. Der Container läuft aus Sicherheitsgründen als Non-Root-User (UID 1001). Das gemountete Volume muss für diesen User beschreibbar sein:
mkdir -p data/uploads
chown -R 1001:1001 data
Warum ist das nötig?
Wird ./data per Volume in den Container gemountet, überschreibt das die im Docker-Image vorbereiteten Verzeichnisse. Existiert ./data auf dem Host noch nicht, wird es vom Docker-Daemon als root angelegt – der Container-User appuser (UID 1001) hat dann keine Schreibrechte.
Starten und Prüfen¶
# Image bauen und alle Container starten
docker compose up -d --build
# Logs prüfen
docker compose logs -f
Nach dem Start passiert Folgendes automatisch:
Traefik startet und lauscht auf Port 80 und 443
Let’s Encrypt stellt ein TLS-Zertifikat für die konfigurierte Domain aus
Der Vogelschlagmelder wird gebaut und gestartet
Der Vogelschlagmelder ist anschließend unter https://vogelschlag.storchennest.test erreichbar.
Hinweis
Beim allerersten Start kann es 1–2 Minuten dauern, bis das Let’s Encrypt Zertifikat ausgestellt ist. In dieser Zeit zeigt der Browser ggf. eine Zertifikatswarnung.
Prüfen, ob alle Container laufen:
docker compose ps
Es sollten zwei Container mit dem Status Up angezeigt werden: traefik und vogelschlagmelder.
Aktualisieren¶
Um den Vogelschlagmelder auf die neueste Version zu aktualisieren:
cd /srv/docker/vogelschlagmelder
# Neues Image bauen und Container neu starten
docker compose up -d --build
Traefik muss dabei nicht neu gestartet werden – nur der Vogelschlagmelder-Container wird aktualisiert.
Datenbank-Migrationen werden automatisch beim Anwendungsstart durchgeführt.
Vor dem Aktualisieren den Changelog lesen
Einzelne Versionen bringen neue Pflichtvariablen mit. Mit Version 1.4.0 sind
PUBLIC_BASE_URL und SETTINGS_SECRET dazugekommen; fehlen sie in der
.env, startet der Container nach dem Update nicht mehr. Auch die
docker-compose.yaml muss dann in der oben gezeigten Fassung vorliegen.
Vor jedem Update eine Sicherung des Ordners ./data anlegen – und bei
Versionen, die Daten umstellen, diese Sicherung aufbewahren, bis der neue
Stand geprüft ist. Ein Zurückspielen der Vorversion ist sonst nicht
verlustfrei möglich.
Installation ohne Docker¶
Alternativ kann der Vogelschlagmelder auch direkt ohne Docker betrieben werden – z. B. für Entwicklungszwecke oder auf Systemen, auf denen Docker nicht verfügbar ist.
Voraussetzungen¶
Ein Linux-Server (z. B. Debian, Ubuntu) mit root- oder sudo-Zugang
Python 3.11 oder höher
Git zum Klonen des Repositories
Systempakete installieren¶
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3 python3-venv python3-pip git
Repository klonen¶
Das Repository wird in ein Arbeitsverzeichnis geklont:
sudo mkdir -p /srv/vogelschlagmelder
sudo chown $USER:$USER /srv/vogelschlagmelder
cd /srv/vogelschlagmelder
git clone https://codeberg.org/nabu-jena/Vogelschlagmelder.git .
Durch chown erhält der aktuelle Benutzer Schreibrechte auf den Ordner, damit git clone und weitere Schritte ohne sudo funktionieren.
Python-Umgebung einrichten¶
Im Anwendungsverzeichnis wird eine virtuelle Python-Umgebung erstellt und die Abhängigkeiten installiert:
cd /srv/vogelschlagmelder/app
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
Datenverzeichnis anlegen¶
Die Anwendung speichert ihre SQLite-Datenbank und hochgeladene Dateien im Ordner data. Dieser muss eine Ebene über dem app-Verzeichnis liegen:
mkdir -p /srv/vogelschlagmelder/data/uploads
Umgebungsvariablen konfigurieren¶
Die Zugangsdaten und Einstellungen werden über Umgebungsvariablen gesetzt. Dafür wird eine .env-Datei im Anwendungsverzeichnis angelegt:
nano /srv/vogelschlagmelder/app/.env
Inhalt:
# ==================== Zugangsdaten ====================
ADMIN_USER=admin
ADMIN_PASSWORD=CHANGEME_sicheres_passwort_hier
MELDEZENTRALE_USER=meldezentrale
MELDEZENTRALE_PASSWORD=CHANGEME_sicheres_passwort_hier
# ==================== SMTP (E-Mail) ====================
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=
SMTP_PASSWORD=
SMTP_FROM=alerts@example.com
SMTP_STARTTLS=true
FROM_EMAIL=
FROM_NAME=
# ==================== Sicherheit ====================
# Produktionsmodus: Aktiviert Secure-Cookies (erfordert HTTPS)
PRODUCTION_MODE=false
# CSRF-Secret: Zufälliger Wert, z. B. generiert mit:
# python3 -c "import secrets; print(secrets.token_hex(32))"
CSRF_SECRET=CHANGEME_zufaelliger_wert_hier
# Schlüssel für die Verschlüsselung von SMTP-Passwort und Matrix-Token in
# der Datenbank. Ein weiterer zufälliger Wert – aber ein anderer als das
# CSRF_SECRET, sonst macht ein Wechsel des einen die Zugangsdaten unlesbar.
SETTINGS_SECRET=CHANGEME_zufaelliger_wert_hier
# Öffentlich erreichbare Adresse dieser Installation. Pflicht, sobald
# PRODUCTION_MODE=true gesetzt ist; ohne die Angabe startet die Anwendung
# dann nicht. Aus diesem Wert werden die Links in Benachrichtigungen gebildet.
PUBLIC_BASE_URL=
# Weitere erlaubte Host-Header, kommagetrennt. Nur nötig, wenn die
# Anwendung unter mehreren Namen erreichbar sein soll.
ALLOWED_HOSTS=
# Domains, welcher erlaubt sind, iFrames einzubetten
# leer lassen für keine Einschränkung
WIDGET_ALLOWED_DOMAINS=storchennest.test
# ==================== Optionale Einstellungen ====================
# SMTP-Zugangsdaten über die Adminoberfläche änderbar machen.
ALLOW_SMTP_OVERRIDE=false
# API-Dokumentation unter /docs und /redoc freigeben. Sie legt alle Routen
# samt Parametern offen und gehört nicht in den Produktivbetrieb.
ENABLE_API_DOCS=false
# Spamschutz des Meldeformulars: Rechenaufgabe im Browser des Absenders
# (leer = Standard 18, 0 = abgeschaltet).
POW_DIFFICULTY=
# Gleichzeitig laufende Bildverarbeitungen (leer = Standard 2).
IMAGE_WORKERS=
# Reverse-Proxys, deren Weiterleitungs-Header ausgewertet werden dürfen.
# Leer lassen: Der Standard deckt Loopback ab und passt damit für einen
# nginx auf demselben Server.
TRUSTED_PROXIES=
Die Umgebungsvariablen können dann geladen werden:
export $(grep -v '^#' /srv/vogelschlagmelder/app/.env | xargs)
Wichtig
Alle CHANGEME_-Werte müssen vor dem Produktiveinsatz durch sichere, einzigartige Werte ersetzt werden. CSRF_SECRET und SETTINGS_SECRET sollten zwei verschiedene, lange Zufallswerte sein:
python3 -c "import secrets; print(secrets.token_hex(32))"
Für den Produktivbetrieb mit HTTPS muss PRODUCTION_MODE auf true gesetzt werden. Damit wird PUBLIC_BASE_URL zur Pflicht – ohne die Angabe startet die Anwendung nicht mehr.
Anders als beim Betrieb mit Docker Compose erzwingt hier niemand das SETTINGS_SECRET: Fehlt es, startet die Anwendung trotzdem, legt SMTP-Passwort und Matrix-Token aber weiterhin im Klartext in der Datenbank ab und schreibt lediglich eine Warnung ins Log. Für den Produktivbetrieb ist der Wert deshalb zu setzen und getrennt vom Datenverzeichnis zu sichern.
### Anwendung starten
Der Vogelschlagmelder wird über **uvicorn** gestartet:
```bash
cd /srv/vogelschlagmelder/app
source venv/bin/activate
export $(grep -v '^#' .env | xargs)
uvicorn main:app --host 0.0.0.0 --port 8000
Die Anwendung ist anschließend unter http://<Server-IP>:8000 erreichbar.
Beim ersten Start werden automatisch die Datenbank und alle benötigten Tabellen angelegt.
Hinweis
Für den Produktivbetrieb sollte ein Reverse-Proxy (z. B. Nginx oder Caddy) vorgeschaltet werden, der HTTPS terminiert. Außerdem empfiehlt es sich, die Anwendung über einen Prozessmanager wie systemd als Dienst einzurichten.
Als systemd-Dienst einrichten¶
Damit der Vogelschlagmelder automatisch beim Serverstart ausgeführt wird, kann eine systemd-Unit-Datei angelegt werden:
sudo nano /etc/systemd/system/vogelschlagmelder.service
Inhalt:
[Unit]
Description=Vogelschlagmelder
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/srv/vogelschlagmelder/app
EnvironmentFile=/srv/vogelschlagmelder/app/.env
ExecStart=/srv/vogelschlagmelder/app/venv/bin/uvicorn main:app --host 0.0.0.0 --port 8000
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Anschließend den Dienst aktivieren und starten:
# Berechtigungen setzen
sudo chown -R www-data:www-data /srv/vogelschlagmelder
# Dienst aktivieren und starten
sudo systemctl daemon-reload
sudo systemctl enable --now vogelschlagmelder
# Status prüfen
sudo systemctl status vogelschlagmelder
Aktualisieren¶
Um den Vogelschlagmelder auf die neueste Version zu aktualisieren:
cd /srv/vogelschlagmelder
git pull
# Abhängigkeiten aktualisieren
source app/venv/bin/activate
pip install -r app/requirements.txt
# Dienst neu starten
sudo systemctl restart vogelschlagmelder
Datenbank-Migrationen werden automatisch beim Anwendungsstart durchgeführt.