Same defect as webfinger, and the typo case makes it concrete. A first deploy
with monitroing.example.com never gets an ACME certificate. The operator spots
it and re-runs with the correct hostname -- .env still holds the typo, so
Caddy still has only that site block, still fails ACME, and the endpoint still
does not work, while the script exits 0 printing
"URL: https://monitoring.example.com".
The two sources disagree and nothing compares them: validation greps .env for
non-empty (a typo passes), while the confirmation prompt and the DEPLOYED
banner expand this shell's variable. Interactively the prompted value is not
exported, so compose produces a byte-identical config and does not even
recreate the container -- nothing happens at all.
Fixed with the same idiom as webfinger and d654299.
Verified: a corrected BESZEL_DOMAIN lands in .env and is logged; a re-run
passing nothing leaves .env untouched.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
beszel
Beszel monitoring hub behind Caddy. Agents push metrics to the hub; OIDC sign-in is configured in the admin UI after first deploy.
Required .env values
| Variable | Notes |
|---|---|
BESZEL_DOMAIN |
Public hostname (e.g. monitoring.example.com). |
ACME_EMAIL |
Let's Encrypt registration email. |
USER_CREATION |
true lets OIDC auto-create accounts on first login. |
See .env.example for image tags.
Deploy
./automations.sh # Deploy on this host → deploy: beszel
Or build + run the self-contained artifact:
./build.sh
scp deploy.sh root@host:
ssh root@host 'bash deploy.sh'
# non-interactive:
# BESZEL_DOMAIN=monitoring.example.com ACME_EMAIL=me@example.com SKIP_PROMPTS=1 bash deploy.sh
Unattended provisioning: cloud-init.yml.
Notes
- No Anubis PoW gate here — it would break agent connections.
- For OIDC login, point Beszel at your pocket-id in the admin UI.
- DNS for
BESZEL_DOMAINmust resolve to the host and 80/443 be reachable before deploy.