DevPanel
Guides
Advanced15 min read

Multi-server Setup

Connect multiple remote servers to DevPanel and deploy services across your entire infrastructure from one dashboard.

Overview

DevPanel uses a hub-and-spoke model. Your local DevPanel installation (the hub) communicates with lightweight agent containers running on each remote server (spokes).

DevPanel (hub) :33000 / :33001

↓ HTTP

Server A agent :33002 → Docker

Server B agent :33002 → Docker

Server C agent :33002 → Docker

Step 1: Add a remote server in DevPanel

  1. 1Go to Servers → New Server.
  2. 2Enter the server's name and public IP or hostname.
  3. 3Click Create — a server token is generated.
  4. 4Copy the server token (shown once — save it now).

Step 2: Start the agent on the remote server

SSH into your remote server and run:

remote server — bash
docker run -d \
  --name devpanel-agent \
  --restart unless-stopped \
  -p 33002:33002 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e API_URL=http://<your-devpanel-ip>:33001 \
  -e SERVER_TOKEN=<token-from-step-1> \
  ghcr.io/nnvanhao/devpanel-agent:latest

Replace <your-devpanel-ip> with the IP of the machine running DevPanel.

Step 3: Verify the connection

Back in DevPanel, the server status changes from pending to online within 30 seconds once the agent starts and registers.

Step 4: Deploy to specific servers

When creating a new service, use the server selector to choose which server the service deploys to. You can run different services on different servers — all from one dashboard.

Firewall requirements

PortDirectionPurpose
33001Remote → DevPanelAgent registers and receives commands
33002DevPanel → RemoteAPI sends Docker commands to agent

Tips

  • Use a private network (e.g. Tailscale, WireGuard) between DevPanel and agents for better security.
  • Name servers descriptively — e.g. 'prod-us-east', 'staging-eu' — to avoid confusion when deploying.
  • The agent container auto-restarts on crash and re-registers with DevPanel automatically.
  • Deleting a server from DevPanel stops tracking it but does NOT stop the agent container — stop it manually if needed.