Live log streams
WebSocket tails with pause, reconnect, time ranges, and multi-container merge.
Self-hosted Docker log viewer · container monitoring · apt & dnf
DockBeacon
Self-hosted Docker and PM2 logs without SaaS. Stream and merge container logs, follow PM2 apps on the same host, watch CPU and memory, and manage Compose stacks from one browser tab — instead of juggling SSH, docker logs, and pm2 logs.
curl -fsSL https://dock-beacon.web.app/install.sh -o install.sh sudo bash install.sh
curl -fsSL https://govindsingh9447.github.io/docker-log-viewer-packages/install-apt.sh | sudo bash sudo apt-get install docker-log-viewer
curl -fsSL https://govindsingh9447.github.io/docker-log-viewer-packages/install-yum.sh | sudo bash sudo dnf install docker-log-viewer
Then open http://<host>:9447. The apt and dnf tabs only add the repo. Install details
Built for people who run real Docker hosts — not another cloud dashboard.
WebSocket tails with pause, reconnect, time ranges, and multi-container merge.
Toggle compact or indented JSON with bright syntax colors — regex search too.
Merge agents into one view. Group prod hosts and follow them together.
Live stats beside the logs, with simple history sparklines.
Compose lifecycle, env edits, and viewer / operator / admin roles.
On hosts that already run PM2, Logs gains a Docker / PM2 switch. Stream stdout and stderr. Operators and admins can start, stop, or restart an app. Viewers cannot.
One click shows the selected server's CPU, memory, and disk: total, used, and free. Works for every agent too.
Know when a container exits, turns unhealthy, crash-loops, or nears its memory limit, when a PM2 app errors or keeps restarting, and when a host runs hot or an agent goes quiet. Sent to Slack, Teams, Discord, or any webhook.
What changed and when: starts, stops, crashes, health changes, and who restarted or redeployed what, for a container or a whole stack. Kept 14 days.
Why is it unhealthy? One click reads the health check, exit codes, restarts, memory, recent errors, and disk, and explains the likely cause in plain words.
systemd unit included. Open http://<host>:9447 with no TLS setup. Flip APP_MODE between standalone and agent.
docker logs?It’s perfect — until your third SSH tab, second host, and first “wait, which terminal was prod?” moment.
docker stats
Not competing with Loki or ELK on analytics — see where this fits.
Multi-host log aggregation without standing up a centralized log-storage platform. Same package on every host — flip APP_MODE.
Use this when you need to see what is happening across Docker hosts right now, without building a full observability stack.
| Tool | Best for |
|---|---|
docker logs | Quick troubleshooting on one container |
| Dozzle | Lightweight real-time container logs |
| Portainer | Full container management UI |
| DockBeacon | Live multi-host operations: Docker logs + PM2 logs + metrics + host status + Compose + RBAC. Installed as a systemd service with apt or dnf, no container needed |
| Loki | Centralized log storage and query |
| ELK / OpenSearch | Large-scale log analytics and search |
| Datadog | Full SaaS observability |
If this is reachable on a production network, a stolen session is more than log access — operators can restart containers and edit Compose / .env. Treat it like a host admin tool.
Login required. Passwords stored as bcrypt hashes. Sessions are HMAC-signed cookies: HttpOnly, SameSite=Lax, Secure via COOKIE_SECURE=auto (honors X-Forwarded-Proto), 24h TTL. Optional OIDC SSO. Login rate-limited. APIs also accept X-Auth-Token, Bearer, or HTTP Basic.
viewer — logs, switch hostsoperator — container inspect, start / stop / restart containers and PM2 apps, Compose lifecycle, env edits, reveal secretsadmin — operators plus user management, alert settings, and audit tailSign in once on the control plane. Agents trust that session when AUTH_SECRET matches. Agents still require CORS_ORIGINS (fail closed when unset). There is no second login when you switch hosts.
Lab listens on LISTEN_ADDR=0.0.0.0:9447 by default. Production: LISTEN_ADDR=127.0.0.1 and terminate TLS on Nginx/ALB. No in-process TLS.
Packaged unit runs as docker-log-viewer in group docker (not root). Socket access is still full Engine power — optionally put docker-socket-proxy in front and set DOCKER_HOST.
Stack env keys matching password / token / key names are masked until revealed. Container inspect is for operators and admins, with env secrets masked until revealed. Writes stay under PROJECTS_DIR.
Only admins change alert rules and channels, and every change is audited. Webhook URLs are stored server-side (0600) and never sent back to the browser, only a short hint. Slack, Teams, and Discord must use https://. Messages carry names and states, never log lines or env values.
Double-submit CSRF (dlv_csrf + X-CSRF-Token) on mutating cookie-auth requests. WebSocket Origin checked against CORS_ORIGINS. Password changes require the current password.
Privileged actions append JSON audit lines (AUDIT_LOG_PATH, also journal). Admins can GET /api/audit. Package repos are GPG-signed when GPG_PRIVATE_KEY is configured in release CI; otherwise SHA256SUMS + inspect-then-install.
Roles table, service hardening, production checklist, and how to report a vulnerability: Read the full security page →
Same binary everywhere: HTTP on :9447. Lower environments open that URL directly. Production adds TLS at Nginx / ALB in front.
LISTEN_ADDR=127.0.0.1 in production. Agents should not be reachable from the public internet — only from the control plane.127.0.0.1:9447. Enable WebSocket upgrade for /wslogs and /ws/project/watch. Set COOKIE_SECURE=auto.docker-log-viewer (not root), group docker. Config: /etc/docker-log-viewer/docker-log-viewer.env. Data: /var/lib/docker-log-viewer/.AUTH_USER/AUTH_PASS only on first boot, or configure OIDC. Back up /var/lib/docker-log-viewer/. Optional: docker-socket-proxy to shrink Engine API surface.Step-by-step Nginx snippet and RBAC details: User guide → Production.
apt or dnf, configure once, enable systemd.
Run on each server (control plane and every agent). Your settings in /etc/docker-log-viewer/docker-log-viewer.env are kept.
sudo apt-get update && sudo apt-get install -y --only-upgrade \ -o Dpkg::Options::=--force-confold docker-log-viewer sudo systemctl enable --now docker-log-viewer sudo systemctl restart docker-log-viewer
sudo yum update -y docker-log-viewer sudo systemctl enable --now docker-log-viewer sudo systemctl restart docker-log-viewer
curl -fsSL https://dock-beacon.web.app/install.sh -o install.sh && sudo bash install.sh
systemctl status docker-log-viewer --no-pager curl -s http://127.0.0.1:9447/api/info
Asked about docker-log-viewer.env during apt upgrade? Press N (keep your version). The --force-confold flag above answers it for you.
502 or "site can't be reached" after upgrading from v0.6.4 or older? Those packages stopped and disabled the service while upgrading. Run sudo systemctl enable --now docker-log-viewer. From v0.6.5 on, upgrades restart it automatically.
PM2 tab empty after upgrade? sudo apt-get install -y acl (or sudo yum install -y acl), then sudo /usr/lib/docker-log-viewer/pm2-grant-access.
Latest notes on this package feed. How to upgrade.
Ubuntu, Debian, Amazon Linux, RHEL, Rocky, Fedora. Detects apt, dnf, or yum.
curl -fsSL https://dock-beacon.web.app/install.sh -o install.sh less install.sh sudo bash install.sh
Adds the repo, installs or upgrades docker-log-viewer, then asks: standalone (web UI) or agent (API for a control plane), server name, port, direct or behind nginx, and an optional URL prefix such as /dockbeacon.
Agents also ask for the control plane URL and its signing secret. It writes the env file (keeping a backup), grants PM2 access when PM2 runs, starts the service, checks it answers, and prints the URL, the first admin password, and an nginx block when needed.
Re-run it to upgrade; current settings are the defaults.
curl -fsSL https://dock-beacon.web.app/install.sh -o install.sh sudo DLV_YES=1 DLV_MODE=agent DLV_SERVER_NAME=worker-1 \ DLV_CONTROL_URL=https://logs.example.com \ DLV_AUTH_SECRET='<control plane secret>' bash install.sh
Quick install adds the repo. Inspect the script first on production hosts.
curl -fsSL https://govindsingh9447.github.io/docker-log-viewer-packages/install-apt.sh | sudo bash sudo apt-get install docker-log-viewer
curl -fsSL https://govindsingh9447.github.io/docker-log-viewer-packages/install-apt.sh -o install-apt.sh less install-apt.sh sudo bash install-apt.sh sudo apt-get install docker-log-viewer
echo 'deb [trusted=yes] https://govindsingh9447.github.io/docker-log-viewer-packages/apt stable main' | sudo tee /etc/apt/sources.list.d/docker-log-viewer.list sudo apt-get update sudo apt-get install docker-log-viewer
curl -fsSL https://govindsingh9447.github.io/docker-log-viewer-packages/install-yum.sh | sudo bash sudo dnf install docker-log-viewer
curl -fsSL https://govindsingh9447.github.io/docker-log-viewer-packages/install-yum.sh -o install-yum.sh less install-yum.sh sudo bash install-yum.sh sudo dnf install docker-log-viewer
sudo tee /etc/yum.repos.d/docker-log-viewer.repo <<'EOF' [docker-log-viewer] name=DockBeacon baseurl=https://govindsingh9447.github.io/docker-log-viewer-packages/yum enabled=1 gpgcheck=0 EOF sudo dnf install docker-log-viewer
Packages are GPG-signed when the release pipeline has GPG_PRIVATE_KEY configured (install scripts use signed-by / gpgcheck=1).
Always verify SHA256SUMS.txt. Public key: KEY.gpg (present on signed publishes).
Config survives upgrades (noreplace).
sudo nano /etc/docker-log-viewer/docker-log-viewer.env # APP_MODE=standalone # or agent # SERVER_NAME=my-host # PROJECTS_DIR=/home/ubuntu/backend # PORT=9447 sudo systemctl enable --now docker-log-viewer # lab / staging: http://<host>:9447 # production: https://logs.example.com → proxy → 127.0.0.1:9447
Private source. This site hosts packages.
Collaborators with repo access can also use gh release download.
Common questions about DockBeacon as a Docker log viewer and container monitoring tool.
DockBeacon is a lightweight self-hosted Docker log viewer and container monitoring tool. It streams live logs from many containers, shows CPU and memory metrics, and manages Compose stacks from one browser tab — without a SaaS account.
Install DockBeacon with apt or dnf, open the web UI on port 9447, select containers, and start a live stream. Filter by regex or log level, and optionally merge logs across hosts with agents.
Yes. DockBeacon checks every host every 30 seconds and alerts when a container is unhealthy, exits unexpectedly, crash-loops, or nears its memory limit, when a PM2 app errors or restart-loops, when host CPU, memory, or disk stays high, or when Docker or an agent goes down. Alerts go to Slack, Microsoft Teams, Discord, or a generic JSON webhook. See the alerts guide.
No. DockBeacon is for live operations — what is happening on your Docker hosts right now. Loki and ELK are better for long-term log storage and analytics.
Yes. Run a standalone UI on one host and optional agents on others, then switch hosts or merge container logs and metrics in one console. One login covers every agent that shares AUTH_SECRET.
Yes, on a host that already runs PM2. Logs shows a Docker / PM2 switch. Stdout and stderr stream in the same pane. Operators and admins can start, stop, or restart an app that is already in the list. Viewers can only read logs. DockBeacon does not start a PM2 daemon. After install, run sudo apt-get install acl and sudo /usr/lib/docker-log-viewer/pm2-grant-access so the service user can read those logs.
One install. No SaaS account. Logs stay on your network.
Install DockBeacon