Configuration¶
Standblatt reads environment variables only.
| Variable | Default | Description |
|---|---|---|
DATABASE_URL |
required | PostgreSQL URL, e.g. postgres://user:pass@host:5432/db?sslmode=require |
STANDBLATT_LISTEN |
:8080 |
listen address of the app |
STANDBLATT_METRICS_LISTEN |
:9090 |
Prometheus /metrics on a separate listener, so it is never reachable through the ingress. Empty: no metrics |
STANDBLATT_LOG_LEVEL |
info |
debug, info, warn, error; JSON lines on stderr |
STANDBLATT_TRUST_PROXY |
false |
take the client address from X-Forwarded-For (only behind your own ingress); used for login rate limits |
STANDBLATT_ADMIN_TOKEN |
empty | token for the admin panel, at least 32 characters. Empty: the admin panel is disabled |
STANDBLATT_PUBLIC_URL |
empty | base of the links in mails, e.g. https://app.standblatt.ch. Empty: scheme and host of the request |
STANDBLATT_SMTP_HOST |
empty | mail server. Empty: mails are only logged |
STANDBLATT_SMTP_PORT |
587 |
465 uses implicit TLS, other ports STARTTLS when the server offers it |
STANDBLATT_SMTP_USER, STANDBLATT_SMTP_PASSWORD |
empty | login at the mail server, if it needs one |
STANDBLATT_SMTP_FROM |
Standblatt <noreply@standblatt.ch> |
sender of mails |
STANDBLATT_SIGNUP |
false |
anyone can create an account for My training |
STANDBLATT_BILLING |
false |
My training needs a trial, a subscription or a club seat; see Billing. Off: everything is free |
STANDBLATT_TRIAL_DAYS |
30 |
length of the free trial of new accounts |
STANDBLATT_PRICE_LABEL |
empty | price shown to users, e.g. CHF 4.– / month; display only |
STANDBLATT_STRIPE_SECRET_KEY |
empty | Stripe secret key; with the price ID it enables online payment |
STANDBLATT_STRIPE_PRICE_ID |
empty | the monthly Stripe price of the subscription |
STANDBLATT_STRIPE_WEBHOOK_SECRET |
empty | signing secret of the Stripe webhook /api/billing/stripe |
STANDBLATT_MATOMO_URL, STANDBLATT_MATOMO_SITE_ID |
empty | web analytics with Matomo: base URL of the instance (e.g. https://analytics.example.org/) and the numeric site ID; set both or neither. The app reports page views without cookies, with record IDs replaced by :id and without query strings; kiosk displays are not counted |
Generate the admin token with openssl rand -base64 32 and keep it in a secret store.
Stateless
Sessions, login rate limits, maintenance mode, print jobs and realtime events all live in PostgreSQL. Any number of replicas can run behind a load balancer without sticky sessions.