Dockerfile angepasst für templates

This commit is contained in:
Jesko Anschütz 2025-05-05 10:22:18 +02:00
parent 344da0bb48
commit 1d436836d7
7 changed files with 123 additions and 101 deletions

View file

@ -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

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
.env
.env-morz
script/__pycache__/

View file

@ -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

182
README.md
View file

@ -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
# - ./<dein Logo>.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 <repository-url>
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://<server-ip>: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.

22
docker-compose.dev.yml Normal file
View file

@ -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

View file

@ -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
# - ./<dein Logo>.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB