Sign inSign up

shorynow/shorynow-status

By shorynow

•Updated 2 days ago

Self-hosted status page with built-in uptime monitors, auto incidents, custom branding and admin.

Image
Monitoring & observability
1

422

shorynow/shorynow-status repository overview

⁠ShoryNow Status

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.

  • Public status page: uptime bars for the last 90 days, 90 hours or 90 minutes, current state per service, and an incident history.
  • Built-in monitors: the container checks your URLs on a schedule. Any 2xx response counts as up.
  • Automatic incidents: opened after two failed checks in a row, and resolved on the next successful one.
  • Your branding: set the page name and upload your logo from the admin.
  • Private by default: only monitors you mark public appear on the page, by a public name. Their URLs, response times and error messages are never shown.
  • Light and dark mode.

⁠Quick start

docker run -d \
  --name shorynow-status \
  -p 3000:3000 \
  -v shorynow-status-data:/app/data \
  --restart unless-stopped \
  shorynow/shorynow-status:latest
  1. Open http://localhost:3000⁠. The status page is empty until you add a monitor.
  2. Click Log in, or go to http://localhost:3000/admin⁠.
  3. Sign in with admin / admin.
  4. Click Add monitor: enter a name and a health URL, and tick Show on the public status page.
  5. Open Branding to set your page name and logo.
  6. Open Account to change the default password. The admin shows a reminder until you do.

Within about 30 seconds the monitor appears on the status page, and its history starts building.

Keep the -v ...:/app/data volume. It holds your account, monitors, history and branding. Without it, everything is lost when the container is removed.


⁠Docker Compose

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

⁠Configuration

VariableDefaultDescription
ADMIN_USERNAMEadminAdmin username created on first start.
ADMIN_PASSWORDadminAdmin password created on first start. If you set it, no "default password" reminder is shown.
PORT3000Port 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.


⁠Monitors

Each monitor is an HTTP(S) URL the container requests on a schedule.

SettingNotes
NameShown in the admin.
Health URLFull http:// or https:// URL. Any 2xx response = up. Redirects count as down, so point it at the final URL.
Check every10 to 3600 seconds (default 60).
Timeout500 to 30000 ms (default 5000). No answer in time = down.
Show on the public status pageOff = the monitor is visible only in the admin.
Name on the public pageOptional public name, e.g. "Customer API" for an internal api-prod-eu-1.
Basic authOptional 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.


⁠Branding

In Admin > Branding:

  • Page name: shown at the top of the page and in the admin. The default is "Status".
  • Logo: PNG, JPG, WebP, GIF or SVG, up to 512 KB. It's shown next to the page name and next to each service. A square image works best.

⁠Running behind a reverse proxy (HTTPS)

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.


⁠Data and backups

Everything lives in the volume mounted at /app/data:

FileContents
monitors.jsonYour monitors
beats.json, hourly.json, daily.jsonCheck history
incidents.jsonIncidents
branding.json, brand-logo.*Page name and logo
admin.jsonAdmin 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"

⁠Upgrading

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.


⁠Tags

TagMeaning
latestNewest release
1Newest 1.x.x release. Recommended: you get fixes and features without breaking changes.
1.0Newest 1.0.x release (fixes only)
1.0.0Exactly this release

Platform: linux/amd64.


⁠Security notes

  • Change the default admin / admin password, or set ADMIN_PASSWORD, before the admin is reachable by others.
  • Serve the admin over HTTPS (see the reverse-proxy section above).
  • After 5 wrong passwords from one address, sign-in is blocked for that address for 5 minutes.
  • Sessions last 12 hours. Changing the password signs out every other session.
  • The container runs as a non-root user (node, uid 1000) and has a built-in health check.
  • The public page and its /api/status endpoint expose only public names, up/down history and incidents, never monitor URLs or errors.

Powered by ShoryNow.

Tag summary

Content type

Image

Digest

sha256:3f7139639…

Size

70.5 MB

Last updated

2 days ago

docker pull shorynow/shorynow-status