diff --git a/.env-dist b/.env-dist index 6b329dc..b960b66 100644 --- a/.env-dist +++ b/.env-dist @@ -6,5 +6,3 @@ UNIFI_SSL_VERIFY = True UNIFI_SITE_ID = 'yourSiteID' WLAN_SSID = 'your WLAN-SSID' WLAN_PASSWORD = 'your WLAN Passwort' -LOGO_FILE = /app/custom/logo.png -WIFI_ICON = /app/custom/wifi-icon.png \ No newline at end of file diff --git a/.gitignore b/.gitignore index 368ed78..c5846d1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .env +.env-morz script/__pycache__/ diff --git a/Dockerfile b/Dockerfile index 7060a93..efcf15e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,10 @@ WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt + COPY script/* /app/script-dist/ +COPY script/templates/* /app/script-dist/templates/ +COPY script/static/* /app/script-dist/static/ COPY entrypoint.sh /app/ RUN chmod +x /app/entrypoint.sh diff --git a/README.md b/README.md index 50ca7bb..496c1b7 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,13 @@ # voucher.morz.de ## **Überblick** -Dieses Projekt stellt eine Flask-basierte Anwendung bereit, die WLAN-Voucher generiert und QR-Codes für den einfachen Zugang erstellt. Die Anwendung ist als Docker-Image verpackt und kann in einer Container-Umgebung betrieben werden. +Dieses Projekt stellt eine Flask-basierte Anwendung bereit, die mittels Unifi-API WLAN-Voucher generiert und QR-Codes für den einfachen Zugang erstellt, um sie dann großflächig auf dem Bildschirm anzuzeigen. +Damit ist es z.B. für Lehrkräfte möglich, Schülern und Schülerinnen einen zeitlich begrenzten WLAN-Zugang freizugeben, ohne dass die Geräte das Netz dauerhaft belasten. --- ## **Voraussetzungen** -- Docker und Docker Compose müssen installiert sein. +- Ein Server mit Docker und Docker Compose müssen installiert sein. - Ein funktionierender UniFi-Controller, der über die API erreichbar ist. - Ein Reverse Proxy (z. B. Nginx oder Traefik) für die Weiterleitung und HTTPS-Unterstützung. @@ -14,110 +15,113 @@ Dieses Projekt stellt eine Flask-basierte Anwendung bereit, die WLAN-Voucher gen ## **Installation** -### 1. **Repository klonen** -Klonen Sie das Repository: +### mit docker compose + +- Verzeichnis erstellen und docker-compose.yml erzeugen mit folgendem Inhalt: +``` +name: linuxmuster-voucher + +services: + linuxmuster-voucher: + image: git.az-it.net/az/linuxmuster-voucher:latest + container_name: linuxmuster-voucher + ports: + - 42425:42425 + volumes: + # Eigenes Logo einbinden - MUSS ein PNG sein + # - ./.png:/app/script/static/logo.png:ro + + working_dir: /app/script + env_file: + - .env + restart: unless-stopped +``` +- falls der Port 42425 schon belegt ist (sehr unwahrscheinlich), einen freien aussuchen. +- .env Datei erzeugen und mit folgendem (angepassten) Inhalt füllen +``` +UNIFI_HOST = 'unifi.deineSchule.de' +UNIFI_USERNAME = 'admin' +UNIFI_PASSWORD = 'yourPassword' +UNIFI_PORT = 443 +UNIFI_SSL_VERIFY = True +UNIFI_SITE_ID = 'yourSiteID' +WLAN_SSID = 'your WLAN-SSID' +WLAN_PASSWORD = 'your WLAN Passwort' +``` +Es wird dringend empfohlen, vernünftige SSL-Zertifikate zu verwenden. Das ist auch nicht so kompliziert umzusetzen. Wenn du noch keine Ahnung hast, wie du es bewerkstelligen sollst, schau dir mal [DNSRoboCert](https://github.com/adferrand/dnsrobocert) an. + +- starten mit ```docker compose up -d``` +Nach wenigen Augenblicken ist die Anwendung am Start und kann (wenn die Firewall das zulässt) schon unsicher auf http://dein.docker.server:42425 erreicht werden. +- Reverse-Proxy einrichten (z.B. für nginx wäre es eine Config mit solchem Inhalt) +``` +server { + + listen [::]:443 ssl; + listen 443 ssl; + server_name voucher.deine-schule.tld ; + add_header Strict-Transport-Security "max-age=15768000; includeSubDomains"; + ssl_certificate /etc/letsencrypt/live/deine-schule.tld/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/deube.schule.tld/privkey.pem; + ssl_session_cache builtin:1000 shared:SSL:50m; + ssl_protocols TLSv1.2; + ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; + ssl_prefer_server_ciphers on; + + access_log /var/log/nginx/access.log ; + + location / { + 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_pass http://127.0.0.1:42425; + proxy_read_timeout 90; + } + } +``` +Damit wäre der Voucher-Generator (ungeschützt) unter der Domain erreichbar. + +Wenn du den Generator per MDM als Web-App an die Endgeräte ausrollst, kannst du durch *security by obscurity* einen zufälligen Missbrauch verhindern, indem du die Seite nicht auf / auslieferst, sondern mit einem Pseudo-Zufalls-URI. Dazu würdest du in der nginx-config +``` location / { ``` +durch ``` location /afskjhsh98zafuihjkancs98 ``` ersetzen. Der Voucher-Generator wäre dann unter https://voucher.deine-schule.de/afskjhsh98zafuihjkancs98/ erreichbar. + +Wenn du dann noch mit der Firewall einschränkst, dass diese Seite nur aus dem Schul-WLAN erreichbar ist, bist du schon recht sicher - denn wer den URI kennt, muss dann, um ihn nutzen zu können schon Zugriff haben. +Sollte man dann irgendwann mitbekommen, dass die Adresse die Runde macht, ändert man einfach irgend ein Zeichen im Location-Block. + +Ich selbst nutze das System hinter einem Passwortschutz mit Keycloak, das ist aber nicht *mal schnell* eingerichtet, weshalb ich hier eine niederschwelligere Version bereitstelle. + + +### alternativ: selber bauen +- Repo clonen und .env erstellen ```bash -git clone -cd voucher.morz.de - -### 2. .env-Datei konfigurieren -Erstellen Sie eine .env-Datei im Projektverzeichnis oder passen Sie die vorhandene Datei an. Diese Datei enthält die Konfigurationsparameter für die Anwendung. - -Beispiel .env: - -``` -UNIFI_HOST=wlan.morz.de -UNIFI_USERNAME=admin -UNIFI_PASSWORD=afoilka9Z -UNIFI_PORT=443 -UNIFI_SSL_VERIFY=True -UNIFI_SITE_ID=qfasa90u -WLAN_SSID=BZZ-Gast -WLAN_PASSWORD=Gast-Guest-522 -DEBUG=False +git clone https://git.az-it.net/linuxmuster-voucher.git +cd linuxmuster-voucher +cp .env-dist .env ``` +- .env anpassen (s.o.) -### 3. **Docker-Image bauen** -Bauen Sie das Docker-Image: +- **Docker-Image bauen** ```bash docker compose build ``` -### 4. **Container starten** -Starten Sie den Container: +- **Container starten** ```bash docker compose up -d ``` Die Anwendung ist unter `http://:42425` erreichbar. ---- - -## **Reverse Proxy einrichten** - -Um die Anwendung über HTTPS und eine benutzerfreundliche URL bereitzustellen, richten Sie einen Reverse Proxy ein. Hier ist ein Beispiel für die Konfiguration mit **Nginx**. - -### Beispiel Nginx-Konfiguration: -```nginx -server { - listen 80; - server_name voucher.morz.de; - - location / { - proxy_pass http://127.0.0.1:42425; - 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; - } - - # Optional: Weiterleitung auf HTTPS - return 301 https://$host$request_uri; -} - -server { - listen 443 ssl; - server_name voucher.morz.de; - - ssl_certificate /etc/letsencrypt/live/voucher.morz.de/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/voucher.morz.de/privkey.pem; - - location / { - proxy_pass http://127.0.0.1:42425; - 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; - } -} -``` - -### Schritte: -1. Installieren Sie Nginx: - ```bash - sudo apt update - sudo apt install nginx - ``` - -2. Konfigurieren Sie die oben genannte Datei unter `/etc/nginx/sites-available/voucher.morz.de` und aktivieren Sie sie: - ```bash - sudo ln -s /etc/nginx/sites-available/voucher.morz.de /etc/nginx/sites-enabled/ - sudo nginx -t - sudo systemctl reload nginx - ``` - -3. Optional: Installieren Sie ein SSL-Zertifikat mit **Let's Encrypt**: - ```bash - sudo apt install certbot python3-certbot-nginx - sudo certbot --nginx -d voucher.morz.de - ``` - ---- ## **Verwendung** ### 1. **Startseite** -Rufen Sie die Startseite unter `http://voucher.morz.de` (oder der konfigurierten URL) auf. Hier können Sie Voucher für 45 oder 90 Minuten erstellen. +Rufe die Startseite unter `https://voucher.deine-schule.tld` (die im Reverseproxy konfigurierte URL) auf. + + + + + ### 2. **Voucher erstellen** - Klicken Sie auf einen der Buttons, um einen Voucher zu erstellen. diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..19561b4 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,22 @@ +name: linuxmuster-voucher + +services: + linuxmuster-voucher: + build: + context: . + dockerfile: Dockerfile + image: git.az-it.net/az/linuxmuster-voucher:latest + container_name: linuxmuster-voucher + ports: + - 42425:42425 + volumes: + - ./script:/app/script + # - ./lmn-logo.png:/app/script/static/logo.png:ro + + working_dir: /app/script + environment: + - DEV=false + - PYTHONUNBUFFERED=1 + env_file: + - .env + #restart: unless-stopped diff --git a/docker-compose.yml b/docker-compose.yml index 19561b4..ee319ee 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,21 +2,15 @@ name: linuxmuster-voucher services: linuxmuster-voucher: - build: - context: . - dockerfile: Dockerfile image: git.az-it.net/az/linuxmuster-voucher:latest container_name: linuxmuster-voucher ports: - 42425:42425 - volumes: - - ./script:/app/script - # - ./lmn-logo.png:/app/script/static/logo.png:ro + # volumes: + # Eigenes Logo einbinden - MUSS ein PNG sein + # - ./.png:/app/script/static/logo.png:ro working_dir: /app/script - environment: - - DEV=false - - PYTHONUNBUFFERED=1 env_file: - .env - #restart: unless-stopped + restart: unless-stopped diff --git a/script/screenshots/startseite.png b/script/screenshots/startseite.png new file mode 100644 index 0000000..fa08f5f Binary files /dev/null and b/script/screenshots/startseite.png differ