Self-hosted status page with built-in uptime monitors, auto incidents, custom branding and admin.
422
A self-hosted status page with built-in uptime monitoring. One container gives you a public status page and a password-protected admin where you add the URLs to watch. No database and no other services are needed.
2xx response counts as up.docker run -d \
--name shorynow-status \
-p 3000:3000 \
-v shorynow-status-data:/app/data \
--restart unless-stopped \
shorynow/shorynow-status:latest
admin / admin.Within about 30 seconds the monitor appears on the status page, and its history starts building.
Keep the
-v ...:/app/datavolume. It holds your account, monitors, history and branding. Without it, everything is lost when the container is removed.
services:
status:
image: shorynow/shorynow-status:1
container_name: shorynow-status
restart: unless-stopped
ports:
- "3000:3000"
environment:
# Optional: your own first login instead of admin / admin (only used on the very first start).
ADMIN_USERNAME: admin
ADMIN_PASSWORD: change-me-to-something-long
volumes:
- status-data:/app/data
volumes:
status-data:
docker compose up -d
| Variable | Default | Description |
|---|---|---|
ADMIN_USERNAME | admin | Admin username created on first start. |
ADMIN_PASSWORD | admin | Admin password created on first start. If you set it, no "default password" reminder is shown. |
PORT | 3000 | Port the server listens on inside the container. |
ADMIN_USERNAME and ADMIN_PASSWORD are read only when the data volume is empty. After that, the account in the volume is used, and you change it in Admin > Account.
Everything else is set in the admin and saved in the volume.
Each monitor is an HTTP(S) URL the container requests on a schedule.
| Setting | Notes |
|---|---|
| Name | Shown in the admin. |
| Health URL | Full http:// or https:// URL. Any 2xx response = up. Redirects count as down, so point it at the final URL. |
| Check every | 10 to 3600 seconds (default 60). |
| Timeout | 500 to 30000 ms (default 5000). No answer in time = down. |
| Show on the public status page | Off = the monitor is visible only in the admin. |
| Name on the public page | Optional public name, e.g. "Customer API" for an internal api-prod-eu-1. |
| Basic auth | Optional username and password for URLs behind HTTP basic auth. The password is never sent back to the browser. |
In the admin you can also pause or resume checks, show or hide a monitor on the page, edit it, or delete it with its history. Changing a monitor's URL starts its history fresh.
History kept: each check for 24 hours (the 90-minute view), hourly totals for 96 hours (the 90-hour view), daily totals for 90 days (the 90-day view), and incidents for 90 days. The page lists the last 7 days of incidents.
In Admin > Branding:
Put the container behind a proxy that terminates HTTPS, especially if the admin is reachable from the internet. The admin's session cookie is marked Secure when the proxy sends X-Forwarded-Proto: https.
Caddy
status.example.com {
reverse_proxy 127.0.0.1:3000
}
nginx
server {
listen 443 ssl;
server_name status.example.com;
# ssl_certificate / ssl_certificate_key ...
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
When a proxy is in front, publish the port on loopback only: -p 127.0.0.1:3000:3000.
Everything lives in the volume mounted at /app/data:
| File | Contents |
|---|---|
monitors.json | Your monitors |
beats.json, hourly.json, daily.json | Check history |
incidents.json | Incidents |
branding.json, brand-logo.* | Page name and logo |
admin.json | Admin account (password stored as a salted scrypt hash) |
Back up:
docker run --rm -v shorynow-status-data:/data -v "$PWD":/backup alpine \
tar czf /backup/shorynow-status-backup.tar.gz -C /data .
Restore (stop the container first):
docker run --rm -v shorynow-status-data:/data -v "$PWD":/backup alpine \
sh -c "tar xzf /backup/shorynow-status-backup.tar.gz -C /data && chown -R 1000:1000 /data"
docker pull shorynow/shorynow-status:1
docker rm -f shorynow-status
docker run -d --name shorynow-status -p 3000:3000 \
-v shorynow-status-data:/app/data --restart unless-stopped \
shorynow/shorynow-status:1
With Compose: docker compose pull && docker compose up -d. Your data stays in the volume.
| Tag | Meaning |
|---|---|
latest | Newest release |
1 | Newest 1.x.x release. Recommended: you get fixes and features without breaking changes. |
1.0 | Newest 1.0.x release (fixes only) |
1.0.0 | Exactly this release |
Platform: linux/amd64.
admin / admin password, or set ADMIN_PASSWORD, before the admin is reachable by others.node, uid 1000) and has a built-in health check./api/status endpoint expose only public names, up/down history and incidents, never monitor URLs or errors.Powered by ShoryNow.
Content type
Image
Digest
sha256:3f7139639…
Size
70.5 MB
Last updated
2 days ago
docker pull shorynow/shorynow-status