Self-hosted · Simple & Easy

Your servers,
under control

A lightweight server management dashboard. Deploy scripts, schedule cron jobs, stream real-time logs, and manage remote servers — all from one place.

Everything you need to run servers

Built for developers who need a real tool, not a toy dashboard.

🖥️
Server Management
Add and manage multiple remote servers. Store SSH keys securely, ping health checks.
📜
Script Library
Write reusable shell scripts. Run deployments, migrations, cache clears on demand.
Cron Scheduling
Schedule scripts with cron expressions. Enable or disable jobs instantly from the UI.
📡
Real-time Log Streaming
Watch script execution output stream live over WebSocket — no refresh needed.
🤖
Go Workers
Lightweight Go agents run on your servers and execute commands locally over a secure WebSocket channel.
🔒
Secure by Design
SSH keys encrypted at rest. Token-based worker auth. Secrets never leave the server.
How it works

The dashboard connects to lightweight Go workers running on your servers.

You
Browser
React dashboard
Dashboard
DeviOpps
Fastify + PostgreSQL
→ WebSocket →
Your Server
Worker
Go binary
ℹ️ Workers connect outbound to the dashboard over WebSocket. No inbound ports need to be opened on your servers.
Deploy the dashboard

One command pulls the image, starts PostgreSQL, and runs the dashboard. Requires Docker.

1
Run the installer
The installer pulls zayantmishra/devi-opps from Docker Hub, starts a PostgreSQL container, and also downloads the worker binary for your platform — all in one go.
bash
curl -fsSL https://raw.githubusercontent.com/zgyant/devi-opps-worker/refs/heads/main/install.sh | sh

Dashboard at http://localhost:3000  ·  Worker binary at ~/.devi-ops/worker

2
Create your account
Open the dashboard in your browser and register. The first registered user becomes the admin.
Set up a worker

Workers are small Go binaries you run on each server you want to manage. They connect back to the dashboard and execute scripts locally.

1
Download the worker binary
Run this on the machine you want to manage. Auto-detects your OS and architecture and saves the binary as ./worker.
bash
curl -fsSL https://raw.githubusercontent.com/zgyant/devi-opps-worker/refs/heads/main/install.sh | sh
Or grab a specific binary from the devi-opps-worker repository. Supported: Linux, macOS, Windows × amd64 / arm64.
2
Run the interactive setup
The init command walks you through configuration and writes a .env file automatically. You'll need your Project ID from the dashboard.
bash
./worker init
# Example interactive output
DeviOpps worker — setup
─────────────────────────
Server URL [http://localhost:3000]: https://dashboard.example.com
Project ID: proj_abc123
Worker name [my-server]: prod-web-1
Worker host/IP: 192.168.1.10
.env written
Worker ID : b3f2-...
Worker Token : a9c1-...
3
Register the worker in the dashboard
Go to Workers in the dashboard sidebar and add a new worker. Enter the Worker ID and Worker Token printed by init.
4
Start the worker
Run the binary on your server. It connects to the dashboard and stays connected.
bash
./worker
💡 For production, run the worker as a systemd service or with pm2 so it restarts automatically on failure.
Systemd service example
/etc/systemd/system/DeviOpps-worker.service
[Unit]
Description=DeviOpps worker
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/devi-ops-worker
ExecStart=/opt/devi-ops-worker/worker
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
Environment variables

Both the dashboard and the worker are configured through environment variables.

Dashboard .env
Variable Default Description
DATABASE_URL PostgreSQL connection string Required
PORT 3000 HTTP port the server listens on Optional
HOST localhost Bind address — set to 0.0.0.0 to accept external connections Optional
NODE_ENV development Set to production for production builds Optional
Worker .env
💡 Running ./worker init generates and writes all of these automatically. Only set them by hand if you're scripting a deployment and want to skip the interactive setup.
Variable Default Description
PROJECT_ID Project ID from the dashboard (Settings → Project) Required
WORKER_ID Unique ID for this worker — generated by init Required
WORKER_TOKEN Auth token — generated by init, register it in the dashboard Required
CLOUD_URL ws://localhost:3000/api/workers/socket WebSocket URL of your dashboard — change this to point at your server Required
WORKER_NAME hostname Display name shown in the dashboard Optional
WORKER_HOST "" IP or hostname of this server (display only) Optional
Example worker .env
.env
# Generated by `worker init`

PROJECT_ID=proj_abc123
WORKER_ID=b3f27a10-e4c2-4f8d-9b1e-2a3f0c6d8e9f
WORKER_NAME=prod-web-1
WORKER_TOKEN=a9c1d2e3f4b5c6d7e8f9a0b1c2d3e4f5
WORKER_HOST=192.168.1.10
CLOUD_URL=wss://dashboard.example.com/api/workers/socket
HEARTBEAT_INTERVAL_MS=15000
LOG_LINE_MAX_BYTES=65536