2026-03-05 15:25:52 -06:00
<p align="center">
2026-03-14 18:31:39 -05:00
<img src="https://raw.githubusercontent.com/vxaboveground/Overlord/refs/heads/main/Overlord-Server/public/assets/overlord.png" alt="Overlord" />
2026-03-05 15:25:52 -06:00
</p>
2026-03-05 00:04:26 -06:00
# Overlord
# [TELEGRAM SERVER JOIN NOW NO EXCUSES WE GIVE SUPPORT AND IT'S FUN](https://t.me/WindowsBatch)
Hello, I made this project for fun.
2026-05-03 01:55:57 +01:00
It is written using a combination of Typescript + Node.JS for tue server and GOLang for the client. <br>
Connections are done via encrypted websockets to connect to the server from the client. <br>
You need to use docker to get this to run easier/for quicker deployment. <br>
2026-03-10 10:02:50 -05:00
---
2026-03-07 11:35:31 +00:00
2026-03-10 10:02:50 -05:00
- [Quick Start (Docker) ](#quick-start-docker )
- [Docker Install By OS ](#docker-install-by-os )
- [No Docker (.bat / .sh) ](#no-docker-bat--sh )
- [Production Package Scripts ](#production-package-scripts )
- [Docker Notes (TLS, reverse proxy, cache) ](#docker-notes-tls-reverse-proxy-cache )
2026-03-07 11:35:31 +00:00
2026-03-10 10:02:50 -05:00
---
2026-03-07 11:35:31 +00:00
2026-03-10 10:02:50 -05:00
## Quick Start (Docker)
2026-03-07 11:35:31 +00:00
2026-03-10 10:02:50 -05:00
If you just want it running fast, use this.
2026-03-07 11:35:31 +00:00
2026-04-13 13:38:13 -05:00
> **⚠️ The compose file below is for Linux ONLY.** If you are on **Windows** or **macOS**, use `docker-compose.windows.yml` instead. See [Docker Install By OS](#docker-install-by-os) for the correct commands.
2026-05-03 01:55:57 +01:00
<details>
<summary>Installation instructions for Linux</summary>
2026-03-10 10:02:50 -05:00
1. Create a `docker-compose.yml` file and paste this:
2026-03-05 00:04:26 -06:00
2026-03-10 10:02:50 -05:00
```yaml
services :
overlord-server :
2026-04-22 13:38:34 -05:00
image : ${DOCKER_IMAGE:-ghcr.io/vxaboveground/overlord:latest}
2026-03-10 10:02:50 -05:00
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
2026-04-22 13:38:34 -05:00
network_mode : host
2026-03-10 10:02:50 -05:00
environment :
2026-04-22 13:38:34 -05:00
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}
2026-03-10 10:02:50 -05:00
volumes :
- overlord-data:/app/data
- overlord-certs:/app/certs
- overlord-client-build-cache:/app/client-build-cache
2026-04-22 13:38:34 -05:00
- overlord-plugins:/app/plugins
2026-03-10 10:02:50 -05:00
restart : unless-stopped
2026-04-22 13:38:34 -05:00
init : true
security_opt :
- no -new-privileges:true
2026-03-10 10:02:50 -05:00
healthcheck :
2026-03-13 15:37:18 -05:00
test : [ "CMD-SHELL" , "curl -f ${OVERLORD_HEALTHCHECK_URL:-https://localhost:5173/health} >/dev/null 2>&1 || exit 1" ]
2026-03-10 10:02:50 -05:00
interval : 30s
timeout : 10s
retries : 3
start_period : 40s
2026-03-05 00:04:26 -06:00
2026-03-10 10:02:50 -05:00
volumes :
overlord-data :
overlord-certs :
overlord-client-build-cache :
2026-04-22 13:38:34 -05:00
overlord-plugins :
2026-03-05 00:04:26 -06:00
```
2026-03-10 10:02:50 -05:00
2. Start it:
2026-03-05 00:04:26 -06:00
```sh
2026-03-08 03:07:23 -05:00
docker compose up -d
```
2026-03-10 10:02:50 -05:00
3. Open the panel:
2026-03-08 03:07:23 -05:00
2026-03-10 10:02:50 -05:00
```text
https://localhost:5173
2026-03-08 03:07:23 -05:00
```
2026-03-10 10:02:50 -05:00
4. Update later:
2026-03-08 03:07:23 -05:00
2026-03-10 10:02:50 -05:00
```sh
docker compose pull
docker compose up -d
```
2026-03-08 03:07:23 -05:00
2026-03-10 10:02:50 -05:00
5. Stop:
2026-03-08 03:07:23 -05:00
2026-03-10 10:02:50 -05:00
```sh
docker compose down
```
2026-03-08 03:07:23 -05:00
2026-03-10 10:02:50 -05:00
First startup generates secrets and stores them in `data/save.json` (inside container: `/app/data/save.json` ).
Keep that file private and backed up.
2026-03-08 03:07:23 -05:00
2026-03-10 10:02:50 -05:00
Default bootstrap login is `admin` / `admin` unless you set `OVERLORD_USER` and `OVERLORD_PASS` .
2026-03-07 15:14:00 -06:00
2026-05-03 01:55:57 +01:00
</details>
2026-03-10 10:02:50 -05:00
## Docker Install By OS
2026-03-07 15:14:00 -06:00
2026-03-10 10:02:50 -05:00
### Windows
2026-03-07 15:14:00 -06:00
2026-05-03 01:55:57 +01:00
<details>
<summary>Installation instructions for Windows</summary>
<br>
2026-03-10 10:02:50 -05:00
Install Docker Desktop (includes Docker Compose):
2026-03-07 15:14:00 -06:00
2026-03-10 10:02:50 -05:00
- https://docs.docker.com/desktop/setup/install/windows-install/
2026-03-07 15:14:00 -06:00
2026-03-10 10:02:50 -05:00
or with winget:
2026-03-07 15:14:00 -06:00
2026-03-10 10:02:50 -05:00
```powershell
winget install -e - -id Docker . DockerDesktop
```
2026-03-05 00:04:26 -06:00
2026-03-10 10:02:50 -05:00
After install, start Docker Desktop once, then verify:
2026-03-07 16:19:04 -06:00
2026-03-10 10:02:50 -05:00
```powershell
docker - -version
docker compose version
```
2026-03-07 16:19:04 -06:00
2026-04-04 20:42:54 -05:00
> **Windows users:** use `docker-compose.windows.yml` instead of the default `docker-compose.yml`. The Windows compose file is pre-configured for Docker Desktop on Windows (no `network_mode: host`, correct volume paths, etc.).
Clone the repo or download the files, then run:
```powershell
docker compose -f docker-compose . windows . yml up -d
```
To rebuild after an update:
```powershell
docker compose -f docker-compose . windows . yml up - -build -d
```
2026-03-10 10:02:50 -05:00
### Linux (Debian, official apt repo method)
2026-03-07 16:19:04 -06:00
2026-03-10 10:02:50 -05:00
Official docs:
2026-03-07 16:19:04 -06:00
2026-03-10 10:02:50 -05:00
- https://docs.docker.com/engine/install/debian/
2026-03-07 16:19:04 -06:00
2026-03-10 10:02:50 -05:00
Set up Docker's apt repository:
2026-03-07 16:19:04 -06:00
2026-03-10 10:02:50 -05:00
```bash
# 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
2026-03-07 16:19:04 -06:00
2026-03-10 10:02:50 -05:00
# 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
2026-03-05 00:04:26 -06:00
2026-03-10 10:02:50 -05:00
sudo apt update
```
If you use a derivative distro (for example Kali), you may need to replace:
```bash
( . /etc/os-release && echo " $VERSION_CODENAME " )
```
with the matching Debian codename (for example `bookworm` ).
Install latest Docker packages:
```bash
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
Verify service status:
```bash
sudo systemctl status docker
```
If your system does not auto-start Docker:
```bash
sudo systemctl start docker
```
Optional (run Docker without sudo):
```bash
sudo usermod -aG docker $USER
newgrp docker
```
Verify CLI:
```bash
docker --version
docker compose version
```
2026-05-03 01:55:57 +01:00
</details>
2026-03-10 10:02:50 -05:00
### macOS
2026-05-03 01:55:57 +01:00
<details>
<summary>Installation instructions for Mac</summary>
<br>
2026-03-10 10:02:50 -05:00
Install Docker Desktop:
- https://docs.docker.com/desktop/setup/install/mac-install/
or with Homebrew:
```bash
brew install --cask docker
```
Start Docker Desktop once, then verify:
```bash
docker --version
docker compose version
```
2026-04-13 13:38:13 -05:00
> **macOS users:** use `docker-compose.windows.yml` instead of the default `docker-compose.yml`. The Windows/macOS compose file is pre-configured for Docker Desktop (no `network_mode: host`, correct volume paths, etc.).
Clone the repo or download the files, then run:
```bash
docker compose -f docker-compose.windows.yml up -d
```
To rebuild after an update:
```bash
docker compose -f docker-compose.windows.yml up --build -d
```
2026-05-03 01:55:57 +01:00
</details>
2026-03-10 10:02:50 -05:00
## No Docker (.bat / .sh)
2026-05-03 01:55:57 +01:00
<details>
<summary>If you do not want Docker, use the included scripts.</summary>
<br>
2026-03-10 10:02:50 -05:00
Prerequisites for local (non-Docker) runs:
- Bun in PATH
- Go 1.21+ in PATH
2026-05-03 01:55:57 +01:00
</details>
<hr>
2026-03-10 10:02:50 -05:00
### Windows
2026-05-03 01:55:57 +01:00
<details>
<summary>Script instructions for Windows</summary>
<br>
2026-03-10 10:02:50 -05:00
Development mode (starts server + client):
```bat
start-dev.bat
```
Production mode (build + run server executable):
```bat
start-prod.bat
```
2026-05-03 01:55:57 +01:00
Build client binaries (adds client builds to the build queue):
2026-03-10 10:02:50 -05:00
```bat
build-clients.bat
```
2026-05-03 01:55:57 +01:00
</details>
<hr>
2026-03-10 10:02:50 -05:00
### Linux / macOS
2026-05-03 01:55:57 +01:00
<details>
<summary>Installation instructions for Linux / Mac</summary>
<br>
2026-03-10 10:02:50 -05:00
Make scripts executable once:
```bash
chmod +x start-dev.sh start-dev-server.sh start-dev-client.sh start-prod.sh build-prod-package.sh
```
Development mode (starts server in background + client in foreground):
```bash
./start-dev.sh
```
Only server:
```bash
./start-dev.sh server
```
Only client:
```bash
./start-dev.sh client
```
Production mode:
```bash
./start-prod.sh
```
2026-05-03 01:55:57 +01:00
</details>
2026-03-10 10:02:50 -05:00
## Production Package Scripts
Build a production-ready package where the server can still build client binaries at runtime.
Windows:
2026-03-05 00:04:26 -06:00
```bat
build-prod-package.bat
```
Linux/macOS:
```bash
./build-prod-package.sh
```
2026-03-10 10:02:50 -05:00
Package output:
2026-03-05 00:04:26 -06:00
2026-03-10 10:02:50 -05:00
- Windows script: `release`
- Linux/macOS script: `release/prod-package`
## Docker Notes (TLS, reverse proxy, cache)
2026-05-03 01:55:57 +01:00
<p>Here we will store some notes for you to read depending on what it is. Configs, work arounds etc.</p>
<hr>
2026-03-10 10:02:50 -05:00
### BuildKit cache for faster rebuilds
`docker-compose.yml` includes `build.cache_from` and `build.cache_to` using `.docker-cache/buildx` .
Rebuild:
```sh
docker compose up --build -d
2026-03-05 00:04:26 -06:00
```
2026-05-03 01:55:57 +01:00
<hr>
2026-03-10 10:02:50 -05:00
### Runtime client build cache
2026-03-05 00:04:26 -06:00
2026-03-10 10:02:50 -05:00
The compose setup uses a persistent volume for runtime client builds:
2026-03-05 00:04:26 -06:00
2026-03-10 10:02:50 -05:00
- volume: `overlord-client-build-cache`
- mount: `/app/client-build-cache`
- env: `OVERLORD_CLIENT_BUILD_CACHE_DIR` (default `/app/client-build-cache` )
2026-05-03 01:55:57 +01:00
<hr>
2026-03-10 10:02:50 -05:00
### Certbot TLS
To use certbot certificates in production Docker:
2026-05-03 01:55:57 +01:00
#### Set:
OVERLORD_TLS_CERTBOT_ENABLED=true
#### Set:
OVERLORD_TLS_CERTBOT_DOMAIN=your-domain.com
2026-03-10 10:02:50 -05:00
- Mount letsencrypt into container read-only (example: `/etc/letsencrypt:/etc/letsencrypt:ro` )
2026-05-03 01:55:57 +01:00
#### Default cert paths:
cert: /etc/letsencrypt/live/<domain>/fullchain.pem
key: /etc/letsencrypt/live/<domain>/privkey.pem
ca: /etc/letsencrypt/live/<domain>/chain.pem
2026-03-10 10:02:50 -05:00
2026-05-03 01:55:57 +01:00
#### Override with:
OVERLORD_TLS_CERTBOT_LIVE_PATH
OVERLORD_TLS_CERTBOT_CERT_FILE
OVERLORD_TLS_CERTBOT_KEY_FILE
OVERLORD_TLS_CERTBOT_CA_FILE
2026-03-10 10:02:50 -05:00
2026-05-03 01:55:57 +01:00
<hr>
2026-03-10 10:02:50 -05:00
### Reverse proxy TLS offload (Render, etc.)
2026-05-03 01:55:57 +01:00
#### If your platform terminates TLS before traffic reaches Overlord, set:
OVERLORD_TLS_OFFLOAD=true
OVERLORD_HEALTHCHECK_URL=http://localhost:5173/health
OVERLORD_PUBLISH_HOST=127.0.0.1
(recommended for local proxies like ngrok)
2026-03-10 10:02:50 -05:00
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/health` inside the container
- do not expose internal container HTTP port directly to the internet
2026-03-13 15:37:18 -05:00
2026-05-03 01:55:57 +01:00
<hr>
2026-03-13 15:37:18 -05:00
For ngrok/local reverse proxy use, a common setup is:
```sh
OVERLORD_TLS_OFFLOAD = true
OVERLORD_HEALTHCHECK_URL = http://localhost:5173/health
OVERLORD_PUBLISH_HOST = 127.0.0.1
```
Then point ngrok at local HTTP:
```sh
ngrok http http://127.0.0.1:5173
```
2026-05-03 01:55:57 +01:00
<hr>
2026-03-13 15:37:18 -05:00
Notes:
- Keep `HOST=0.0.0.0` inside the container. Limiting exposure should be done with publish binding (`OVERLORD_PUBLISH_HOST` ), not server bind host.
- If your `.env` secret/password includes `$` , escape as `$$` to avoid Docker Compose variable-expansion warnings.