operation docker installation

This commit is contained in:
Julian Krauser 2025-02-16 14:10:55 +01:00
parent 7646a1a96f
commit d162f2f0fa
7 changed files with 162 additions and 2 deletions

View file

@ -1,6 +1,6 @@
ff-admin-server: ff-admin-server:
image: docker.registry.jk-effects.cloud/ehrenamt/ff-admin/server:<version> image: docker.registry.jk-effects.cloud/ehrenamt/ff-admin/server:<version>
container_name: ff_member_administration_server container_name: ff_admin_server
restart: unless-stopped restart: unless-stopped
ports: ports:
- "5000:5000" - "5000:5000"

View file

@ -238,6 +238,7 @@ Folgende Werte können zu einem Container konfiguriert werden:
) )
💥: Ein Fehlen dieser Variable verhindert das Starten der Anwendung! 💥: Ein Fehlen dieser Variable verhindert das Starten der Anwendung!
🚨: Bei Verwendung von SQLite sind diese Variablen nicht notwendig! 🚨: Bei Verwendung von SQLite sind diese Variablen nicht notwendig!
\ \
\ \

Binary file not shown.

View file

@ -0,0 +1,16 @@
ff-operation-app:
image: docker.registry.jk-effects.cloud/ehrenamt/ff-operation/app:<version>
container_name: ff_operation
restart: unless-stopped
ports:
- "80:80"
environment:
- SERVERADDRESS=<backend_url>
- APPNAMEOVERWRITE=<appname>
- IMPRINTLINK=<imprint link>
- PRIVACYLINK=<privacy link>
- CUSTOMLOGINMESSAGE=<betrieben von xy>
volumes:
- <volume|local path>/favicon.ico:/usr/share/nginx/html/favicon.ico
- <volume|local path>/favicon.png:/usr/share/nginx/html/favicon.png
- <volume|local path>/Logo.png:/usr/share/nginx/html/Logo.png

View file

@ -0,0 +1,36 @@
ff-operation-server:
image: docker.registry.jk-effects.cloud/ehrenamt/ff-operation/server:<version>
container_name: ff_operation_server
restart: unless-stopped
ports:
- "5000:5000"
environment:
- DB_TYPE=<database type>
- DB_HOST=<database host>
- DB_PORT=<database port>
- DB_NAME=<database name>
- DB_USERNAME=<database username>
- DB_PASSWORD=<database password>
- JWT_SECRET=<jwt secret>
- JWT_EXPIRATION=<jwt expiration>
- REFRESH_EXPIRATION=<refresh expiration>
- PWA_REFRESH_EXPIRATION=<pwa refresh expiration>
- MAIL_USERNAME=<mailadress|username>
- MAIL_PASSWORD=<mail password>
- MAIL_HOST=<mail server url>
- MAIL_PORT=<port>
- MAIL_SECURE=<boolean>
- CLUB_NAME=<club name>
- CLUB_WEBSITE=<club website>
- BACKUP_INTERVAL=<backup interval>
- BACKUP_COPIES=<backup parallel copies>
- BACKUP_AUTO_RESTORE=<boolean>
- USE_SECURITY_STRICT_LIMIT=<boolean>
- SECURITY_STRICT_LIMIT_WINDOW=<time window>
- SECURITY_STRICT_LIMIT_REQUEST_COUNT=<strict_request_count>
- USE_SECURITY_LIMIT=<boolean>
- SECURITY_LIMIT_WINDOW=<time window>
- SECURITY_LIMIT_REQUEST_COUNT=<request_count>
- TRUST_PROXY=<proxy config>
volumes:
- <volume|local path>:/app/files

View file

@ -16,6 +16,53 @@ Die Docker-Images sind versioniert. Der `<tag>` des Images kann entweder `latest
== Docker-Compose == Docker-Compose
*App*
#code_file(
path: "../operation/code/app-compose.yml",
) <app-compose>
Die Verwendung der Werte des Typs Environment werden unter dem Punkt Konfiguration (@config) erklärt.
Alle Environment Werte sind Optional und haben Standard-Werte.
Ist ein Wert optional und hat keinen Fallback, so wird in der Anwendung nichts angezeigt.
\
\
Die Volumes dienen zur erweiterten Personalisierung der App mit eigenem Logo der Feuerwehr oder des Vereins. Hiervon betroffen ist das Icon im Browser-Tab, jede Anzeige des FF Operation Logos innerhalb der App und das Icon, wenn die WebApp auf einem Gerät installiert wird.
\
\
Die Konfiguration der Volumes ist optional, falls Sie die Standard-Logos verwenden wollen.
\
\
Ein Teil der Logos haben eine Anforderung an die Auflösung:
#table(
columns: (1fr, 1fr, 1fr),
inset: 5pt,
table.header(
[*Icon*], [*Auflösung*], [*Anzeigeort*]
),
"favicon.ico", "48x48 px", "Browser-Tab Icon",
"favicon.png", "512x512 px", "WebApp Icon zur Installation",
"Logo.png", "beliebig", "Innerhalb der Anwendung",
)
Die Dateien müssen exakt gleich geschrieben sein. Achten Sie deshalb auf Schreibfehler und Groß-/Kleinschreibung.
#pagebreak()
*Server*
#code_file(
path: "../operation/code/server-compose.yml",
) <server-compose>
Die Verwendung der Werte des Typs Environment werden unter dem Punkt Konfiguration (@config) erklärt.
Environment Werte können optional sein oder haben Standard-Werte.
Das Fehlen einer geforderten Variable oder die falsche Angabe eines Variablen-Werts verhindert das Starten des der Anwendung.
\
\
Innerhalb dem Ordner, der dem Volume zugeordnet ist, werden Backups und Ausdrucke der geschriebenen Protokolle und Newsletter abgelegt.
\
\
*Datenbank* *Datenbank*
Als Datenbank können MySQL, Postgres und SQLite verwendet werden. Postgres wird für den Produktiven Einsatz empfohlen. Als Datenbank können MySQL, Postgres und SQLite verwendet werden. Postgres wird für den Produktiven Einsatz empfohlen.
@ -114,7 +161,7 @@ npm run start
Folgende Werte können zu einem Container konfiguriert werden: Folgende Werte können zu einem Container konfiguriert werden:
#table( #table(
columns: (35%, 1fr, 10%, auto), columns: (35%, 1fr, 13%, auto),
inset: 5pt, inset: 5pt,
table.header( table.header(
[*Variable*], [*Zweck*], [*Fallback*], [*optional*] [*Variable*], [*Zweck*], [*Fallback*], [*optional*]
@ -123,6 +170,52 @@ Folgende Werte können zu einem Container konfiguriert werden:
if x == 3 { center } if x == 3 { center }
else { left } else { left }
), ),
table.cell(colspan: 4)[⬇️ App-Variablen],
"SERVERADDRESS", "URL, über welche das Backend erreicht werden kann. Die URL muss mit http:// oder https:// starten und darf keinen Pfad beinhalten. Wenn das Backend auf der gleichen URL wie die App läuft, kann diese Variable weggelassen werden.", "", "✅",
"APPNAMEOVERWRITE", "Anzeige eines anderen Namens als FF Operation.", "FF Operation", "✅",
"IMPRINTLINK", "Link zum Impressum des Betreibers.", "", "✅",
"PRIVACYLINK", "Link zur Datenschutzerklärung des Betreibers.", "", "✅",
"CUSTOMLOGINMESSAGE", "Nachricht auf der Login-Seite.\n(Bsp.: betrieben von xy)", "", "✅",
"", "", "", "",
table.cell(colspan: 4)[⬇️ Server-Variablen],
"DB_TYPE", "Folgende Datenbanktypen sind verfügbar: mysql, sqlite, postgres", "mysql", "✅",
"DB_HOST", "URL zur Datenbank oder Dateipfad zur SQLite-Datenbank", "", "💥",
"DB_PORT", "Port der Datenbank", "3306", "🚨",
"DB_NAME", "Name der Datenbank in welcher die Tabellen erstellt werden.", "", "🚨",
"DB_USERNAME", "Nutzername für Zugang zu Datenbank", "", "🚨",
"DB_PASSWORD", "Passwort zum Zugang zur Datenbank", "", "🚨",
"JWT_SECRET", "Zufällige Zeichenkette zur Validierung der Session-Tokens.", "", "💥",
"JWT_EXPIRATION", "Gültigkeitsdauer eines Session-Tokens.\nFormat: [0-9]*(y|d|h|m|s)", "15m", "✅",
"REFRESH_EXPIRATION", "Gültigkeitsdauer eines Logins nach letzter Nutzung der App im Browser \nFormat: [0-9]*(y|d|h|m|s)", "1d", "✅",
"PWA_REFRESH_EXPIRATION", "Gültigkeitsdauer eines Logins nach letzter Nutzung der installierten App\nFormat: [0-9]*(y|d|h|m|s)", "5d", "✅",
"MAIL_USERNAME", "Nutzername oder Mailadresse", "", "💥",
"MAIL_PASSWORD", "Passwort zum Nutzernamen oder der Mailadresse", "", "💥",
"MAIL_HOST", "URL des Mailservers", "", "💥",
"MAIL_PORT", "Port des Mailservers für Versand (SMTP).\nPorts sind 25, 465, 587", "587", "✅",
"MAIL_SECURE", "Soll eine Secure Verbindung aufgebaut werden. Muss true sein bei Port 465.", "false", "✅",
"CLUB_NAME", "Wird für TOTP Titel verwendet.", "FF Operation", "✅",
"CLUB_WEBSITE", "", "", "✅",
"BACKUP_INTERVAL", "Wie viele Tage Abstand sollen zwischen Backups liegen? (min. 1)", "1", "✅",
"BACKUP_COPIES", "Wie viele parallele Kopien von Backups sollen parallel Verfügbar sein? (min. 1)", "7", "✅",
"BACKUP_AUTO_RESTORE", "Soll das neueste Backup bei Server-Start automatisch geladen werden, wenn die Datenbank als leer erkannt wird?", "true", "✅",
"USE_SECURITY_STRICT_LIMIT","Soll ein Anfrage-Limit für Login, Reset und Co gesetzt werden? \nIn diesem Fall ist der Nutzer nicht angemeldet, sondern versucht es.","true","✅",
"SECURITY_STRICT_LIMIT _WINDOW","Über welches Zeitfenster soll das Limit angewandt werden? \nFormat: [0-9]*(y|d|h|m|s)","15m","✅",
"SECURITY_STRICT_LIMIT _REQUEST_COUNT","Wie viele fehlerhafte Anfragen müssen gesendet werden, bis das Limit aktiviert ist?","15","✅",
"USE_SECURITY_LIMIT","Soll ein Anfrage-Limit für Anfragen innerhalb der App gesetzt werden? \nIn diesem Fall ist der Nutzer angemeldet.","true","✅",
"SECURITY_LIMIT_WINDOW","Über welches Zeitfenster soll das Limit angewandt werden? \nFormat: [0-9]*(y|d|h|m|s)","1m","✅",
"SECURITY_LIMIT_REQUEST _COUNT","Wie viele fehlerhafte Anfragen müssen gesendet werden, bis das Limit aktiviert ist?","500","✅",
"TRUST_PROXY",[
Wird der Server hinter einem Proxy betrieben und Rate-Limit verwendet?
Ist dieser Wert nicht gesetzt, wird davon ausgegangen, dass kein Proxy verwendet wird.
\
\
Folgende Werte können gesetzt werden:\
true / false\
Anzahl der Proxies: [0-9]\*\
IP-Adresse des Proxy: ip\
IP-Adressen der Proxy: ip1,ip2,...
],"","✅",
"", "", "", "",
table.cell(colspan: 4)[⬇️ Database-Variablen], table.cell(colspan: 4)[⬇️ Database-Variablen],
"MYSQL_DATABASE", "Name der Datenbank, die bei Erstellung direkt angelegt wird.", "", "💥", "MYSQL_DATABASE", "Name der Datenbank, die bei Erstellung direkt angelegt wird.", "", "💥",
"MYSQL_USER", "Benutzername des Users, der bei Erstellung direkt angelegt wird.", "", "✅", "MYSQL_USER", "Benutzername des Users, der bei Erstellung direkt angelegt wird.", "", "✅",
@ -135,11 +228,14 @@ Folgende Werte können zu einem Container konfiguriert werden:
) )
💥: Ein Fehlen dieser Variable verhindert das Starten der Anwendung! 💥: Ein Fehlen dieser Variable verhindert das Starten der Anwendung!
🚨: Bei Verwendung von SQLite sind diese Variablen nicht notwendig! 🚨: Bei Verwendung von SQLite sind diese Variablen nicht notwendig!
\ \
\ \
*Hinweis:* Eine fehlerhafte Konfiguration der optionalen oder geforderten Variable verhindert das Starten der Anwendung. *Hinweis:* Eine fehlerhafte Konfiguration der optionalen oder geforderten Variable verhindert das Starten der Anwendung.
*Hinweis:* Eine Änderung der Datenbank übernimmt die Daten nur automatisch in die neue Datenbank, wenn `BACKUP_AUTO_RESTORE` aktiviert ist und ein Backup angelegt ist. Es werden dann die Daten des gefundenen Backups in die neue Datenbank eingefügt.
== Update der Version == Update der Version
Um eine Version auf eine Neuere zu aktualisieren, muss meist nur der Docker-Tag oder das Repo ersetzt werden. Um eine Version auf eine Neuere zu aktualisieren, muss meist nur der Docker-Tag oder das Repo ersetzt werden.
@ -163,3 +259,13 @@ Dies vereinfacht auch den Wechsel zwischen Datenbanken, da nur eine neue Verbind
== WebApp == WebApp
FF Operation ist als WebApp verfügbar. Dadurch lässt sich die Anwendung auf einem Smartphone oder Desktop über den Browser installieren. FF Operation ist als WebApp verfügbar. Dadurch lässt sich die Anwendung auf einem Smartphone oder Desktop über den Browser installieren.
== Einrichtung
Um die Anwendung nutzen zu können, kann ein erster Administrator-Account wie folgt erstellt werden:
1. *Admin Benutzer erstellen*: Erstellen Sie einen Admin Benutzer unter dem Pfad /setup, um auf die Mitgliederverwaltung Zugriff zu erhalten. Nach der Erstellung des ersten Benutzers wird der Pfad automatisch geblockt.
2. *Rollen und Berechtigungen*: Unter `Benutzer > Rollen` können die Rollen und Berechtigungen für die Benutzer erstellt und angepasst werden.
3. *Nutzer einladen*: Unter `Benutzer > Benutzer` können weitere Nutzer eingeladen werden. Diese erhalten dann eine E-Mail mit einem Link, um ein TOTP zu erhalten.

View file

@ -178,6 +178,7 @@ Folgende Werte können zu einem Container konfiguriert werden:
) )
💥: Ein Fehlen dieser Variable verhindert das Starten der Anwendung! 💥: Ein Fehlen dieser Variable verhindert das Starten der Anwendung!
🚨: Bei Verwendung von SQLite sind diese Variablen nicht notwendig! 🚨: Bei Verwendung von SQLite sind diese Variablen nicht notwendig!
\ \
\ \