GEO-GLEINIG – Installation für https://geo-gleinig.de (Apache 2) ================================================================= WAS DAS IST ----------- Ein kleines Python-Programm, das die Seiten (Startseite, Törn-Briefing, Sprechfunk, Einweisung, Manöver) nur an Geräte ausliefert, die einen persönlichen Key aktiviert haben. Ein Key wird beim ersten Gebrauch an ein Gerät gebunden (Standard: 1 Gerät pro Key). Es wird nur Python benutzt, nichts muss nachinstalliert werden (kein pip, keine Datenbank-Software). Das Programm läuft im Hintergrund, Apache leitet alle Anfragen für geo-gleinig.de an dieses Programm weiter. Die Seiten sind danach direkt unter https://geo-gleinig.de/ erreichbar. ORDNER ------ Alles liegt in /var/www/geo-gleinig.de (dein Standardordner): lizenzserver.py das Programm geschuetzt/ die fünf Seiten (nur mit Key abrufbar) public/ Icons, manifest.json, sw.js daten/ Datenbank und Zugriffsprotokoll (entsteht bei Schritt 2) Wichtig: Apache liefert aus diesem Ordner nichts direkt aus, alles läuft über das Programm. VORAUSSETZUNGEN --------------- - Linux-Server mit Apache 2.4, HTTPS für geo-gleinig.de läuft schon - Root- oder sudo-Zugriff per SSH - Python 3.8 oder neuer. Prüfen mit: python3 --version - Befehle sind für Debian/Ubuntu geschrieben (Apache-Benutzer: www-data). Bei anderen Systemen heißt er evtl. apache. INSTALLATION ============ SCHRITT 1: Alte Dateien weg, neue Dateien hin a) Alte, ungeschützte Seiten aus /var/www/geo-gleinig.de löschen (index.html, vorbereitung.html, sprechfunk.html, einweisung.html, manoever.html, alte sw.js, manifest.json, icon-*.png). Sonst bleiben sie als Kopie liegen. b) Inhalt der ZIP direkt in diesen Ordner entpacken (per SFTP/WinSCP, oder auf dem Server): sudo apt install unzip (falls unzip fehlt) sudo unzip geo-gleinig-lizenzserver.zip -d /var/www/geo-gleinig.de c) Danach muss es geben: /var/www/geo-gleinig.de/lizenzserver.py /var/www/geo-gleinig.de/geschuetzt/index.html (usw.) SCHRITT 2: Rechte setzen und Datenbank anlegen (einmalig) sudo chown -R www-data:www-data /var/www/geo-gleinig.de cd /var/www/geo-gleinig.de sudo -u www-data python3 lizenzserver.py init Ausgabe: "Datenbank angelegt: ..." SCHRITT 3: Programm als Dienst einrichten (startet automatisch beim Serverstart) sudo cp /var/www/geo-gleinig.de/geo-gleinig.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now geo-gleinig Prüfen: systemctl status geo-gleinig (muss "active (running)" zeigen) curl -s http://127.0.0.1:8000/ | head -3 (muss HTML ausgeben) SCHRITT 4: Apache einrichten a) Module aktivieren (schadet nicht, wenn sie schon aktiv sind): sudo a2enmod proxy proxy_http headers b) Konfigurationsdatei deiner HTTPS-Seite öffnen (meist in /etc/apache2/sites-available/, Datei mit und ServerName geo-gleinig.de). Die Zeilen aus der Datei apache-vhost.conf in diesen -Block einfügen (alles außer den Kommentarzeilen oben). Hast du auch einen -Block, der nur auf https umleitet, bleibt der unverändert. c) Prüfen und neu laden: sudo apache2ctl configtest (muss "Syntax OK" zeigen) sudo systemctl reload apache2 SCHRITT 5: Ersten Key erzeugen und testen cd /var/www/geo-gleinig.de sudo -u www-data python3 lizenzserver.py neu "Mein Handy" Der Key sieht aus wie ABCD-EFGH-JKLM-NPQR und wird NUR JETZT angezeigt. Notieren! Dann https://geo-gleinig.de öffnen (am besten in einem privaten Fenster), Key eingeben, "Aktivieren". Der Key ist jetzt an dieses Gerät gebunden. Ein zweites Gerät wird mit demselben Key abgelehnt. Fertig. ADMIN-SEITE (Lizenzen im Browser verwalten) =========================================== Auf dem Dashboard erscheint die Kachel "Lizenzen" nur, wenn du mit dem Admin-Key angemeldet bist (Standard: Lizenz Nr. 3). Dort kannst du Keys erzeugen, sperren, entsperren, zurücksetzen, löschen und das Zugriffsprotokoll ansehen. Alle anderen Keys bekommen weder die Kachel noch die Seite; jede Anfrage wird auf dem Server geprüft (Seite admin.html, Schnittstelle api/admin). Den Admin-Key selbst kann man dort nicht sperren/löschen/zurücksetzen (Schutz vor Aussperren), das geht nur per Kommandozeile. Ablaufdatum: Beim Erzeugen (Unbegrenzt, 1 Woche, 1 Monat, 3/6 Monate, 1 Jahr oder eigenes Datum) und später pro Key über den Knopf "Ablauf" (Kalender, +1 Monat/+1 Jahr usw. ab dem bisherigen Ablauf, oder wieder unbegrenzt). Der Key gilt bis einschließlich des gewählten Tages. Danach kommt man nicht mehr rein (auch bereits aktivierte Geräte); verlängerst du das Datum, funktioniert er sofort wieder. Alte Datenbanken werden automatisch ergänzt, nichts zu tun. Kommandozeile: lizenz neu "Anna" --tage 365 | lizenz neu "Anna" --bis 2027-06-30 | lizenz ablauf 5 2027-12-31 | lizenz ablauf 5 aus Key anklicken: In der Liste "Alle Keys" ist jeder Eintrag anklickbar (Name oder Zeile). Es öffnet sich eine Detailansicht mit - allen IP-Adressen, mit denen dieser Key benutzt wurde (zuletzt, erstmals, Anzahl Aufrufe), dazu die aktivierten Geräte - der Möglichkeit, die erlaubte Geräte-Anzahl nachträglich zu ändern (1 bis 100). Bereits aktivierte Geräte behalten den Zugang; ein niedrigerer Wert verhindert nur neue Aktivierungen. Zu viele Geräte? Zusätzlich "Zurücksetzen" in der Liste. Die IP-Liste wird ab diesem Update geführt; beim ersten Start werden die bisherigen Einträge aus zugriffe.log automatisch übernommen. Demo-Key: Beim Erzeugen unter "Gültigkeit" die Option "Demo: 30 Min. ab erster Nutzung" wählen. Die 30 Minuten beginnen erst, wenn der Key das erste Mal eingegeben wird. Danach kommt man nicht mehr rein (eine bereits geöffnete Seite läuft bis zum nächsten Laden weiter). Demo-Keys sind nie offline nutzbar. Dauer ändern: in daten/config.json "demo_minuten": 15 (gilt für neu erzeugte Demo-Keys). Kommandozeile: lizenz neu "Demo" --demo Kommandozeile zusätzlich: lizenz geraete 5 3 (Key 5 darf 3 Geräte) | lizenz ips 5 (IP-Adressen von Key 5) Andere Lizenz als Admin: in daten/config.json "admin_license": 5 ergänzen, dann sudo systemctl restart geo-gleinig. Nach dem Update: neue lizenzserver.py + geschuetzt/admin.html hochladen und den Dienst neu starten (sudo systemctl restart geo-gleinig). Die Datenbank wird beim Start automatisch ergänzt. TÄGLICHE VERWALTUNG =================== Tipp: Kurzbefehl anlegen, dann ist alles kürzer (gilt bis zum Ausloggen, dauerhaft in ~/.bashrc eintragen): alias lizenz='cd /var/www/geo-gleinig.de && sudo -u www-data python3 lizenzserver.py' lizenz neu "Anna" neuen Key erzeugen lizenz neu "Familie" --geraete 3 ein Key für bis zu 3 Geräte lizenz neu "Gäste" --anzahl 5 fünf Keys auf einmal (Gäste 1 bis Gäste 5) lizenz liste alle Keys, Status (frei/benutzt/gesperrt), letzte Nutzung lizenz sperren 3 Key Nr. 3 sofort sperren (die Nummer steht in "liste") lizenz entsperren 3 wieder freigeben lizenz reset 3 Geräte-Bindung löschen, z.B. bei neuem Handy oder wenn jemand seine Browserdaten gelöscht hat; der Key kann dann einmal neu aktiviert werden lizenz loeschen 3 Key endgültig löschen lizenz log 100 letzte 100 Zeilen des Zugriffsprotokolls lizenz pruefen Rechte und Dateien prüfen (bei Fehlern) ZUGRIFFSPROTOKOLL (IP-Adressen) ------------------------------- Datei: /var/www/geo-gleinig.de/daten/zugriffe.log (normale Textdatei) Jede Zeile: Zeit | IP | Ereignis | Name des Keys Ereignisse: AKTIVIERT (erste Nutzung eines Keys), LOGIN, SEITE (Seite aufgerufen), ABGELEHNT (falscher/gesperrter/schon benutzter Key), KEIN-ZUGRIFF, GESPERRT-ZU-OFT Tipp: Wechselt die IP eines Keys ständig zwischen fremden Ländern oder Anbietern, wurde evtl. ein Gerät kopiert: Key sperren und neuen ausgeben. Live mitlesen: tail -f /var/www/geo-gleinig.de/daten/zugriffe.log SEITEN ÄNDERN ------------- Die Seiten liegen in /var/www/geo-gleinig.de/geschuetzt/. Datei austauschen, fertig. Ein Neustart ist nicht nötig, die Dateien werden bei jedem Aufruf frisch gelesen. Nach dem Austausch Rechte prüfen: sudo chown www-data:www-data /var/www/geo-gleinig.de/geschuetzt/* (Die Dateien dort sind die Versionen ohne eigene Anmeldung, nicht die alten mit Passwort.) IMPRESSUM, DATENSCHUTZ, HAFTUNGSAUSSCHLUSS ------------------------------------------- Die drei Seiten (impressum.html, datenschutz.html, haftungsausschluss.html) sind ohne Key öffentlich erreichbar, so muss es bei einem Impressum sein. Links dazu stehen auf dem Login-Bild und unten auf jeder Seite. Die Angaben (Name, Anschrift, Hoster, Aufbewahrung der Protokolle usw.) trägst du als Admin auf der Seite "Lizenzen" im Bereich "Rechtliches" ein und speicherst sie. Sie liegen in daten/rechtliches.json, die Seiten sind danach sofort aktuell. Fehlt eine Pflichtangabe, steht auf der Seite eine gelbe Markierung "noch ausfüllen". Update einspielen: lizenzserver.py, rechtliches.py (neu, gleicher Ordner wie lizenzserver.py) und geschuetzt/admin.html hochladen, dann: sudo systemctl restart geo-gleinig Die Texte sind eine Vorlage und keine Rechtsberatung. Bitte einmal prüfen lassen. Das Zugriffsprotokoll löscht das Programm nicht selbst, halte dich an die Aufbewahrungszeit, die du im Formular angibst. SICHERUNG --------- Den Ordner /var/www/geo-gleinig.de/daten regelmäßig kopieren (Datenbank und Protokoll). Aus der Datenbank sind die Keys nicht wieder auslesbar, es sind nur Hashes gespeichert. Gehen Keys verloren: neue erzeugen und die alten sperren. SO SCHÜTZT ES ------------- - Ohne gültigen Key liefert der Server keinen Inhalt aus, auch nicht verschlüsselt. - Ein Key gilt für ein Gerät (oder die Anzahl, die du mit --geraete festlegst). - Das Gerät wird sich gemerkt: Nach der ersten Aktivierung öffnet sich die Seite direkt, ohne Login-Bild. Der Browser behält die Anmeldung bis zu 400 Tage (Cookie plus Browser-Speicher, wird bei jeder Nutzung verlängert). Löscht jemand nur eines von beiden, füllt sich das andere automatisch wieder auf. - Es wird nur ein Hash des Keys gespeichert. - Pro IP sind 10 Fehlversuche je 10 Minuten erlaubt, danach wird gesperrt. - Die IP im Protokoll lässt sich nicht von außen fälschen (es zählt die IP, die Apache einträgt). - Zusätzlich sperrt Apache den Ordner für den direkten Dateizugriff (Sicherheitsnetz). GRENZEN (ehrlich gesagt) ------------------------ - Wer das Browserprofil eines aktivierten Geräts kopiert, kann dieses Gerät klonen. Das fällt im Protokoll an auffälligen IPs auf, dann sperren. - Wer Zugang hat, kann Inhalte per Screenshot weitergeben. - Offline-Nutzung ist nur zeitlich begrenzt möglich (siehe OFFLINE-MODUS unten). Wer die Geräteuhr zurückstellt, verlängert die Frist, das Gerät bleibt aber an den Key gebunden und die Lizenz wird beim nächsten Netz geprüft. - "Abmelden" in der Seite blendet nur wieder die Key-Eingabe ein. Das Gerät bleibt an den Key gebunden, derselbe Key funktioniert dort weiter. Ohne Abmelden kommt das Login-Bild nie wieder. OFFLINE-MODUS ============= Auf dem Dashboard gibt es neben der Darstellung (Hell/Dunkel/Schwarz) den Schalter "Offline". Einschalten (einmal mit Internet): Alle fünf Seiten werden auf dem Gerät gespeichert, dazu Karten-Bibliothek und Schriften. Danach laden die Seiten direkt vom Gerät, ohne Internet und ohne Datenverbrauch. Kartenkacheln, die man einmal gesehen hat, und die zuletzt geladenen Wetter- und Warndaten bleiben ebenfalls auf dem Gerät (unten erscheint dann "Wetterdaten vom ..."), das DWD-Radar braucht immer Internet. Lizenz: Sobald das Gerät wieder Netz hat, prüft die Seite im Hintergrund die Lizenz (auch im Offline-Modus, beim Öffnen, beim Zurückkehren in die App und alle 15 Minuten). Ist der Key gesperrt, abgelaufen oder zurückgesetzt, werden die gespeicherten Seiten sofort vom Gerät gelöscht und das Login erscheint. Im Zugriffsprotokoll steht dafür PRUEFUNG. Frist: Ohne erfolgreiche Lizenzprüfung sind die Seiten 14 Tage offline nutzbar, längstens bis zum Ablaufdatum des Keys. Danach kommt der Hinweis, kurz mit dem Internet zu verbinden. Ändern in daten/config.json: "offline_tage": 30 (0 = Offline aus), dann sudo systemctl restart geo-gleinig. Aktualisieren: Haben sich Seiten auf dem Server geändert, holt jedes Gerät sie beim nächsten normalen Aufruf mit Internet (Offline-Modus aus) oder durch Aus- und wieder Einschalten des Schalters. Automatisches Backup: Auch bei ausgeschaltetem Schalter sichert jedes Gerät, sobald es online eine Seite geöffnet hat, alle Seiten im Hintergrund auf dem Gerät (alle 5 Minuten, solange die App offen ist; im Zugriffsprotokoll als SEITE-Zeilen sichtbar, jeweils fünf pro Backup). Fällt das Netz später weg, öffnet die App automatisch die gespeicherte Kopie (nach etwa 4 Sekunden Wartezeit bei schlechtem Netz, sofort ohne Netz). Wetterdaten: gesichert wird der Stand, den das Törn-Briefing zuletzt geladen hat. Vor dem Ablegen das Briefing einmal mit dem Törn-Gebiet öffnen. Abmelden löscht die gespeicherten Seiten vom Gerät. Update einspielen: lizenzserver.py, geschuetzt/index.html, public/sw.js, public/offline.js hochladen, sudo systemctl restart geo-gleinig (Geräte laden den neuen Service Worker beim nächsten Besuch selbst). PROBLEME ======== "Fehler beim Aktivieren" oder "Datenbank nicht beschreibbar" beim Eingeben des Keys Fast immer sind es Dateirechte. Der Dienst läuft als www-data und muss in den Ordner schreiben dürfen: sudo chown -R www-data:www-data /var/www/geo-gleinig.de sudo systemctl restart geo-gleinig Das Programm prüft sich auch selbst und sagt, was fehlt: cd /var/www/geo-gleinig.de && sudo -u www-data python3 lizenzserver.py pruefen Weitere Hinweise liefert: journalctl -u geo-gleinig -n 30 --no-pager Steht dort "(HTTP 502)" oder "(HTTP 503)": das Programm läuft nicht oder stürzt ab (siehe oben). Steht dort "(HTTP 403)" oder "(HTTP 404)" ohne weiteren Text: Apache-Konfiguration prüfen. "503 Service Unavailable" im Browser Das Programm läuft nicht. systemctl status geo-gleinig und journalctl -u geo-gleinig -n 30 Neu starten: sudo systemctl restart geo-gleinig "403 Forbidden" im Browser Die Proxy-Zeilen (ProxyPass / ...) fehlen oder stehen im falschen -Block, dann greift das Sicherheitsnetz. Konfiguration prüfen, dann: sudo apache2ctl configtest && sudo systemctl reload apache2 Apache-Fehlerprotokoll: /var/log/apache2/error.log Im Protokoll steht überall 127.0.0.1 statt der echten IP Das Programm läuft ohne --proxy. Prüfen: systemctl cat geo-gleinig (in der ExecStart-Zeile muss --proxy stehen) "Permission denied" bei lizenz-Befehlen Befehle immer als www-data ausführen (sudo -u www-data ...), und: sudo chown -R www-data:www-data /var/www/geo-gleinig.de Port 8000 ist schon belegt In geo-gleinig.service die Zahl hinter --port ändern (z.B. 8123) und in der Apache-Konfiguration dieselbe Zahl eintragen. Dann: sudo systemctl daemon-reload && sudo systemctl restart geo-gleinig und sudo systemctl reload apache2 Zertifikat lässt sich nicht erneuern Die Zeile "ProxyPass /.well-known/ !" und der -Block in der Apache-Konfiguration müssen vorhanden sein. Jemand hat seinen Key nicht mehr / Handy gewechselt / Browserdaten gelöscht lizenz reset und den Key erneut eingeben lassen. Bei verlorenem Key: neuen erzeugen. Alles wieder entfernen sudo systemctl disable --now geo-gleinig sudo rm /etc/systemd/system/geo-gleinig.service Proxy- und Directory-Zeilen aus der Apache-Konfiguration löschen, dann sudo systemctl reload apache2 Programm und Daten in /var/www/geo-gleinig.de löschen