diff --git a/.env.example b/.env.example index ea72059..396c5b5 100644 --- a/.env.example +++ b/.env.example @@ -8,3 +8,9 @@ PDF_TO_ICS_IMAGE=git.file-archive.de/webfarben/pdf_to_ics:v1.2.2 # Optional: App-interne Basic Auth (leer = deaktiviert) WEB_AUTH_USER= WEB_AUTH_PASSWORD= + +# Optional: Matomo Tracking +# Beispiel: MATOMO_URL=https://matomo.example.de +# Beispiel: MATOMO_SITE_ID=5 +MATOMO_URL= +MATOMO_SITE_ID= diff --git a/WEB_README.md b/WEB_README.md index 72ce439..b01ccd5 100644 --- a/WEB_README.md +++ b/WEB_README.md @@ -75,6 +75,23 @@ WEB_AUTH_PASSWORD=BitteSicheresPasswortSetzen Für öffentliches Deployment zusätzlich Reverse Proxy + HTTPS verwenden. +## Matomo (optional) + +Für Zugriffsstatistiken kannst du Matomo direkt aktivieren: + +```dotenv +MATOMO_URL=https://matomo.example.de +MATOMO_SITE_ID=5 +``` + +Dann neu deployen: + +```bash +./update.sh +``` + +Wenn beide Variablen gesetzt sind, trackt die App Seitenaufrufe auf Landing/App sowie ein Event für den ICS-Download. + ## Schlanker Server-Checkout (Sparse) ```bash diff --git a/docker-compose.deploy.yml b/docker-compose.deploy.yml index 59b9bdd..8177762 100644 --- a/docker-compose.deploy.yml +++ b/docker-compose.deploy.yml @@ -17,6 +17,9 @@ services: # Optional aktivieren für App-Login: - WEB_AUTH_USER=${WEB_AUTH_USER:-} - WEB_AUTH_PASSWORD=${WEB_AUTH_PASSWORD:-} + # Optional Matomo-Tracking: + - MATOMO_URL=${MATOMO_URL:-} + - MATOMO_SITE_ID=${MATOMO_SITE_ID:-} healthcheck: test: ["CMD", "python3", "-c", "import http.client,sys;c=http.client.HTTPConnection('127.0.0.1',8000,timeout=5);c.request('GET','/');r=c.getresponse();sys.exit(0 if r.status in (200,401) else 1)"] interval: 30s diff --git a/web/app.py b/web/app.py index 93b9453..6709dfb 100644 --- a/web/app.py +++ b/web/app.py @@ -29,6 +29,22 @@ app.mount("/static", StaticFiles(directory=str(Path(__file__).parent / "static") security = HTTPBasic() +def get_matomo_context(): + matomo_url = (os.getenv("MATOMO_URL") or "").strip().rstrip("/") + matomo_site_id = (os.getenv("MATOMO_SITE_ID") or "").strip() + + if not matomo_url or not matomo_site_id: + return { + "matomo_url": None, + "matomo_site_id": None, + } + + return { + "matomo_url": matomo_url, + "matomo_site_id": matomo_site_id, + } + + def require_auth(credentials: HTTPBasicCredentials = Depends(security)): expected_user = os.getenv("WEB_AUTH_USER") expected_password = os.getenv("WEB_AUTH_PASSWORD") @@ -48,22 +64,28 @@ def require_auth(credentials: HTTPBasicCredentials = Depends(security)): @app.get("/", response_class=HTMLResponse) def landing(request: Request): + context = { + "request": request, + } + context.update(get_matomo_context()) + return templates.TemplateResponse( "landing.html", - { - "request": request, - }, + context, ) @app.get("/app", response_class=HTMLResponse) def index(request: Request, _: None = Depends(require_auth)): + context = { + "request": request, + "error": None, + } + context.update(get_matomo_context()) + return templates.TemplateResponse( "index.html", - { - "request": request, - "error": None, - }, + context, ) diff --git a/web/templates/index.html b/web/templates/index.html index 5c56b17..7ba760f 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -159,6 +159,22 @@ to { transform: rotate(360deg); } } + {% if matomo_url and matomo_site_id %} + + {% endif %}