Hello, I made this project for fun.
It is written using a combination of Typescript + Node.JS for the server and GOLang for the client.
Connections are done via encrypted websockets to connect to the server from the client.
You need to use docker to get this to run easier/for quicker deployment.
- Quick Start (Docker)
- Docker Install By OS
- No Docker (.bat / .sh)
- Production Package Scripts
- Docker Notes (TLS, reverse proxy, cache)
If you just want it running fast, use this.
⚠️ The compose file below is for Linux ONLY. If you are on Windows or macOS, usedocker-compose.windows.ymlinstead. See Docker Install By OS for the correct commands.
Installation instructions for Linux
- Create a
docker-compose.ymlfile and paste this:
services:
overlord-server:
image: ${DOCKER_IMAGE:-ghcr.io/vxaboveground/overlord:latest}
build:
context: .
dockerfile: Dockerfile
cache_from:
- type=local,src=.docker-cache/buildx
cache_to:
- type=local,dest=.docker-cache/buildx,mode=max
container_name: overlord-server
network_mode: host
environment:
PORT: ${PORT:-5173}
HOST: ${HOST:-0.0.0.0}
OVERLORD_USER: ${OVERLORD_USER:-admin}
OVERLORD_PASS: ${OVERLORD_PASS:-}
JWT_SECRET: ${JWT_SECRET:-}
OVERLORD_AGENT_TOKEN: ${OVERLORD_AGENT_TOKEN:-}
NODE_ENV: ${NODE_ENV:-production}
OVERLORD_TLS_CERT: ${OVERLORD_TLS_CERT:-/app/certs/server.crt}
OVERLORD_TLS_KEY: ${OVERLORD_TLS_KEY:-/app/certs/server.key}
OVERLORD_TLS_CA: ${OVERLORD_TLS_CA:-}
OVERLORD_TLS_OFFLOAD: ${OVERLORD_TLS_OFFLOAD:-false}
OVERLORD_AUTH_COOKIE_SECURE: ${OVERLORD_AUTH_COOKIE_SECURE:-auto}
OVERLORD_TLS_CERTBOT_ENABLED: ${OVERLORD_TLS_CERTBOT_ENABLED:-false}
OVERLORD_TLS_CERTBOT_LIVE_PATH: ${OVERLORD_TLS_CERTBOT_LIVE_PATH:-/etc/letsencrypt/live}
OVERLORD_TLS_CERTBOT_DOMAIN: ${OVERLORD_TLS_CERTBOT_DOMAIN:-}
OVERLORD_TLS_CERTBOT_CERT_FILE: ${OVERLORD_TLS_CERTBOT_CERT_FILE:-fullchain.pem}
OVERLORD_TLS_CERTBOT_KEY_FILE: ${OVERLORD_TLS_CERTBOT_KEY_FILE:-privkey.pem}
OVERLORD_TLS_CERTBOT_CA_FILE: ${OVERLORD_TLS_CERTBOT_CA_FILE:-chain.pem}
OVERLORD_CLIENT_BUILD_CACHE_DIR: ${OVERLORD_CLIENT_BUILD_CACHE_DIR:-/app/client-build-cache}
OVERLORD_FILE_UPLOAD_INTENT_TTL_MS: ${OVERLORD_FILE_UPLOAD_INTENT_TTL_MS:-1800000}
OVERLORD_FILE_UPLOAD_PULL_TTL_MS: ${OVERLORD_FILE_UPLOAD_PULL_TTL_MS:-1800000}
volumes:
- overlord-data:/app/data
- overlord-certs:/app/certs
- overlord-client-build-cache:/app/client-build-cache
- overlord-plugins:/app/plugins
restart: unless-stopped
init: true
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD-SHELL", "curl -f ${OVERLORD_HEALTHCHECK_URL:-https://localhost:5173/health} >/dev/null 2>&1 || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
volumes:
overlord-data:
overlord-certs:
overlord-client-build-cache:
overlord-plugins:- Start it:
docker compose up -d- Open the panel:
https://localhost:5173
- Update later:
docker compose pull
docker compose up -d- Stop:
docker compose downFirst startup generates secrets and stores them in data/save.json (inside container: /app/data/save.json).
Keep that file private and backed up.
Default bootstrap login is admin / admin unless you set OVERLORD_USER and OVERLORD_PASS.
Installation instructions for Windows
Install Docker Desktop (includes Docker Compose):
or with winget:
winget install -e --id Docker.DockerDesktopAfter install, start Docker Desktop once, then verify:
docker --version
docker compose versionWindows users: use
docker-compose.windows.ymlinstead of the defaultdocker-compose.yml. The Windows compose file is pre-configured for Docker Desktop on Windows (nonetwork_mode: host, correct volume paths, etc.).
Clone the repo or download the files, then run:
docker compose -f docker-compose.windows.yml up -dTo rebuild after an update:
docker compose -f docker-compose.windows.yml up --build -dOfficial docs:
Set up Docker's apt repository:
# Add Docker's official GPG key:
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt updateIf you use a derivative distro (for example Kali), you may need to replace:
(. /etc/os-release && echo "$VERSION_CODENAME")with the matching Debian codename (for example bookworm).
Install latest Docker packages:
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginVerify service status:
sudo systemctl status dockerIf your system does not auto-start Docker:
sudo systemctl start dockerOptional (run Docker without sudo):
sudo usermod -aG docker $USER
newgrp dockerVerify CLI:
docker --version
docker compose versionInstallation instructions for Mac
Install Docker Desktop:
or with Homebrew:
brew install --cask dockerStart Docker Desktop once, then verify:
docker --version
docker compose versionmacOS users: use
docker-compose.windows.ymlinstead of the defaultdocker-compose.yml. The Windows/macOS compose file is pre-configured for Docker Desktop (nonetwork_mode: host, correct volume paths, etc.).
Clone the repo or download the files, then run:
docker compose -f docker-compose.windows.yml up -dTo rebuild after an update:
docker compose -f docker-compose.windows.yml up --build -dIf you do not want Docker, use the included scripts.
Prerequisites for local (non-Docker) runs:
- Bun in PATH
- Go 1.21+ in PATH
Script instructions for Windows
Development mode (starts server + client):
start-dev.batProduction mode (build + run server executable):
start-prod.batBuild client binaries (adds client builds to the build queue):
build-clients.batInstallation instructions for Linux / Mac
Make scripts executable once:
chmod +x start-dev.sh start-dev-server.sh start-dev-client.sh start-prod.sh build-prod-package.shDevelopment mode (starts server in background + client in foreground):
./start-dev.shOnly server:
./start-dev.sh serverOnly client:
./start-dev.sh clientProduction mode:
./start-prod.shBuild a production-ready package where the server can still build client binaries at runtime.
Windows:
build-prod-package.batLinux/macOS:
./build-prod-package.shPackage output:
- Windows script:
release - Linux/macOS script:
release/prod-package
Here we will store some notes for you to read depending on what it is. Configs, work arounds etc.
docker-compose.yml includes build.cache_from and build.cache_to using .docker-cache/buildx.
Rebuild:
docker compose up --build -dThe compose setup uses a persistent volume for runtime client builds:
- volume:
overlord-client-build-cache - mount:
/app/client-build-cache - env:
OVERLORD_CLIENT_BUILD_CACHE_DIR(default/app/client-build-cache)
To use certbot certificates in production Docker:
OVERLORD_TLS_CERTBOT_ENABLED=true
OVERLORD_TLS_CERTBOT_DOMAIN=your-domain.com
- Mount letsencrypt into container read-only (example:
/etc/letsencrypt:/etc/letsencrypt:ro)
cert: /etc/letsencrypt/live/<domain>/fullchain.pem
key: /etc/letsencrypt/live/<domain>/privkey.pem
ca: /etc/letsencrypt/live/<domain>/chain.pem
OVERLORD_TLS_CERTBOT_LIVE_PATH
OVERLORD_TLS_CERTBOT_CERT_FILE
OVERLORD_TLS_CERTBOT_KEY_FILE
OVERLORD_TLS_CERTBOT_CA_FILE
OVERLORD_TLS_OFFLOAD=true
OVERLORD_HEALTHCHECK_URL=http://localhost:5173/health
OVERLORD_PUBLISH_HOST=127.0.0.1
(recommended for local proxies like ngrok)
When enabled:
- container serves internal HTTP on
0.0.0.0:$PORT - external URL remains
https://...through your platform proxy - health checks should use
http://localhost:$PORT/healthinside the container - do not expose internal container HTTP port directly to the internet
For ngrok/local reverse proxy use, a common setup is:
OVERLORD_TLS_OFFLOAD=true
OVERLORD_HEALTHCHECK_URL=http://localhost:5173/health
OVERLORD_PUBLISH_HOST=127.0.0.1Then point ngrok at local HTTP:
ngrok http http://127.0.0.1:5173Notes:
- Keep
HOST=0.0.0.0inside the container. Limiting exposure should be done with publish binding (OVERLORD_PUBLISH_HOST), not server bind host. - If your
.envsecret/password includes$, escape as$$to avoid Docker Compose variable-expansion warnings.
