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.
Built for developers who need a real tool, not a toy dashboard.
The dashboard connects to lightweight Go workers running on your servers.
The easiest way to run DeviOpps is with Docker Compose. All dependencies are bundled.
git clone https://github.com/your-org/DeviOpps.git
cd DeviOpps
cp .env.example .env
nano .env
JWT_SECRET and
SSH_ENCRYPTION_SECRET before going to
production.
docker compose up -d
The dashboard is now running at
http://localhost:3000
You need Node.js 20+, pnpm, and a running PostgreSQL instance.
# 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
Workers are small Go binaries you run on each server you want to manage. They connect back to the dashboard and execute scripts locally.
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
init command walks you through configuration
and writes a .env file automatically. You'll need
your Project ID from the dashboard.
./dist/worker init
init.
./dist/worker
pm2 so it restarts automatically on
failure.
[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
Both the dashboard and the worker are configured through environment variables.
.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 |
.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 |
.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