Voeg self-hosted Umami analytics + UptimeRobot uptime dashboard toe

Co-authored-by: Junie <junie@jetbrains.com>
This commit is contained in:
2026-07-25 19:59:40 +02:00
co-authored by Junie
parent da2a6e03ea
commit 08b489e305
15 changed files with 405 additions and 29 deletions
@@ -0,0 +1,57 @@
# Voorbeeldconfiguratie voor de nginx reverse proxy op de reverse-proxy-Pi
# (dezelfde Pi als reverse-proxy-nginx.conf.example) om het zelf-gehoste
# Umami-analyticsdashboard bereikbaar te maken via analytics.slpsoftware.nl.
#
# Umami zelf draait als podman-container op de webserver-Pi (Pi Main,
# 192.168.1.103:3000 — zie ../umami/podman-compose.yml.example) en heeft dus
# GEEN eigen nginx-configuratie op die Pi nodig; Umami serveert zijn eigen
# dashboard + tracking-script rechtstreeks via die poort.
#
# Kopieer dit bestand handmatig naar bijvoorbeeld
# /etc/nginx/sites-available/slpsoftware-analytics.conf op de reverse-proxy-Pi,
# maak een symlink in sites-enabled, en herlaad nginx.
#
# SSL-certificaat: net als voor test.slpsoftware.nl wordt dit aangevraagd met
# certbot (Let's Encrypt), bijvoorbeeld:
# sudo certbot --nginx -d analytics.slpsoftware.nl
# Zorg dat het DNS-record voor analytics.slpsoftware.nl al naar het publieke
# IP van deze Pi wijst voordat je certbot draait.
# HTTP: alleen gebruikt voor de Let's Encrypt ACME-challenge en om door te
# verwijzen naar HTTPS. Na het draaien van certbot ziet dit block er zo uit.
server {
listen 80;
listen [::]:80;
server_name analytics.slpsoftware.nl;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS: het daadwerkelijke reverse-proxy-verkeer naar Umami op de webserver-Pi.
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name analytics.slpsoftware.nl;
ssl_certificate /etc/letsencrypt/live/analytics.slpsoftware.nl/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/analytics.slpsoftware.nl/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://192.168.1.103:3000;
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;
}
}
@@ -0,0 +1,10 @@
# Kopieer dit bestand naar `.env` naast podman-compose.yml op de Pi (NIET committen —
# bevat straks echte wachtwoorden/secrets).
# Willekeurig, sterk wachtwoord voor de Umami PostgreSQL-database.
# Genereren met bv.: openssl rand -base64 32
POSTGRES_PASSWORD=
# Willekeurige, sterke random string die Umami gebruikt om sessies te ondertekenen.
# Genereren met bv.: openssl rand -base64 32
APP_SECRET=
@@ -0,0 +1,55 @@
# Voorbeeld podman-compose bestand om Umami (self-hosted analytics) te draaien
# op de webserver-Pi (Pi Main, 192.168.1.103), naast de al draaiende nginx die
# de website zelf serveert.
#
# Vereist: podman + podman-compose (`pip3 install --user podman-compose`) op de Pi.
#
# Gebruik:
# 1. Kopieer dit bestand naar bv. ~/umami/podman-compose.yml op de Pi.
# 2. Kopieer .env.example naast dit bestand naar .env en vul een echte
# POSTGRES_PASSWORD en APP_SECRET in (zie .env.example voor hoe je die genereert).
# 3. cd ~/umami && podman-compose up -d
# 4. Zie umami-setup.md voor het instellen van auto-start na reboot (systemd)
# en het aanmaken van een website in de Umami-UI om het website-ID te krijgen.
services:
umami:
image: docker.umami.is/umami-software/umami:postgresql-latest
# Alleen op het interne (LAN) IP van deze Pi binden, niet op 0.0.0.0 — zelfde
# aanpak als webserver-nginx.conf.example, zodat deze poort niet per ongeluk
# vanaf buiten het netwerk bereikbaar is. De reverse-proxy-Pi stuurt
# analytics.slpsoftware.nl door naar 192.168.1.103:3000 (zie
# ../nginx/analytics-nginx.conf.example).
ports:
- "192.168.1.103:3000:3000"
environment:
DATABASE_URL: postgresql://umami:${POSTGRES_PASSWORD}@db:5432/umami
DATABASE_TYPE: postgresql
APP_SECRET: ${APP_SECRET}
depends_on:
db:
condition: service_healthy
restart: always
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:3000/api/heartbeat"]
interval: 10s
timeout: 5s
retries: 5
db:
image: docker.io/postgres:15-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- umami-db-data:/var/lib/postgresql/data
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U umami -d umami"]
interval: 10s
timeout: 5s
retries: 5
volumes:
umami-db-data: