### macOS
Installation instructions for Mac
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
```
> **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
```
## No Docker (.bat / .sh)
If you do not want Docker, use the included scripts.
Prerequisites for local (non-Docker) runs:
- Bun in PATH
- Go 1.21+ in PATH
### Windows
Script instructions for Windows
Development mode (starts server + client):
```bat
start-dev.bat
```
Production mode (build + run server executable):
```bat
start-prod.bat
```
Build client binaries (adds client builds to the build queue):
```bat
build-clients.bat
```
### Linux / macOS
Installation instructions for Linux / Mac
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
```
## Production Package Scripts
Build a production-ready package where the server can still build client binaries at runtime.
Windows:
```bat
build-prod-package.bat
```
Linux/macOS:
```bash
./build-prod-package.sh
```
Package output:
- Windows script: `release`
- Linux/macOS script: `release/prod-package`
## Docker Notes (TLS, reverse proxy, cache)
Here we will store some notes for you to read depending on what it is. Configs, work arounds etc.
### 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
```
### Runtime client build cache
The 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`)
### Certbot TLS
To use certbot certificates in production Docker:
#### Set:
OVERLORD_TLS_CERTBOT_ENABLED=true
#### Set:
OVERLORD_TLS_CERTBOT_DOMAIN=your-domain.com
- Mount letsencrypt into container read-only (example: `/etc/letsencrypt:/etc/letsencrypt:ro`)
#### Default cert paths:
cert: /etc/letsencrypt/live//fullchain.pem
key: /etc/letsencrypt/live//privkey.pem
ca: /etc/letsencrypt/live//chain.pem
#### Override with:
OVERLORD_TLS_CERTBOT_LIVE_PATH
OVERLORD_TLS_CERTBOT_CERT_FILE
OVERLORD_TLS_CERTBOT_KEY_FILE
OVERLORD_TLS_CERTBOT_CA_FILE
### Reverse proxy TLS offload (Render, etc.)
#### 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)
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
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
```
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.