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

The easiest way to run DeviOpps is with Docker Compose. All dependencies are bundled.

1
Clone the repository
Get the source code onto your server or local machine.
bash
git clone https://github.com/your-org/DeviOpps.git
cd DeviOpps
2
Configure environment variables
Copy the example env file and fill in your values.
bash
cp .env.example .env
nano .env
⚠️ Make sure to set a strong JWT_SECRET and SSH_ENCRYPTION_SECRET before going to production.
3
Start with Docker Compose
This spins up the app and a PostgreSQL database in one command.
bash
docker compose up -d

The dashboard is now running at http://localhost:3000

4
Create your account
Open the dashboard in your browser and register. The first registered user becomes the admin.
Run without Docker

You need Node.js 20+, pnpm, and a running PostgreSQL instance.

bash
# Install dependencies
pnpm install

# Run database migrations
pnpm dlx prisma migrate deploy

# Start in development mode
pnpm dev

# Or build and serve for production
pnpm prod
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
Build the worker binary
You need Go 1.21+ installed on the target machine.
bash
git clone https://github.com/your-org/deviopps-worker.git
cd deviopps-worker

# Build the binary
make build

# The binary is placed in dist/worker
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
./dist/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
./dist/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/DeviOpps-worker
ExecStart=/opt/DeviOpps-worker/dist/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
JWT_SECRET Secret for signing auth tokens Required
SSH_ENCRYPTION_SECRET Key used to encrypt stored SSH credentials Required
PORT 3000 HTTP port the server listens on Optional
NODE_ENV development Set to production for production builds Optional
Worker .env

Generated automatically by ./dist/worker init. You can also write it by hand.

Variable Default Description
PROJECT_ID Project ID from the dashboard Required
WORKER_ID Unique ID for this worker (auto-generated) Required
WORKER_NAME hostname Human-readable name shown in the dashboard Required
WORKER_TOKEN Auth token (auto-generated, register in dashboard) Required
WORKER_HOST IP or hostname of this server (for display) Required
CLOUD_URL ws://localhost:3000/api/workers/socket WebSocket URL of the dashboard Optional
HEARTBEAT_INTERVAL_MS 15000 How often the worker pings the dashboard (ms) Optional
LOG_LINE_MAX_BYTES 65536 Maximum bytes per log line 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