Chap is a self-hosted deployment platform inspired by Coolify, designed to give you full control over your applications, databases, and services on your own infrastructure.
- π Git-based Deployments - Connect GitHub, GitLab, or Bitbucket repositories and deploy on every push
- π Auto Deployments - Webhook-triggered deployments with rollback support
- π¦ Docker Native - All applications run in containers for consistency and isolation
- π₯οΈ Multi-Server Support - Connect and manage multiple servers from a single dashboard
- π₯ Team Collaboration - Role-based access control with team workspaces
- π Real-time Monitoring - Live logs and container metrics
- π― One-Click Services - Deploy databases and popular services instantly
- π Secure by Design - Environment variables, secrets management, and encrypted SSH keys
Chap consists of two components that run on separate servers:
| Component | Where it runs | What it does |
|---|---|---|
| chap-server | One central server | Web UI, API, database, WebSocket hub |
| chap-node | Each deployment server | Docker management, builds, deployments |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BROWSER CLIENT β
β (Dashboard / Live Logs UI) β ββββ
βββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ β
β HTTP / HTTPS β
βΌ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β CENTRAL SERVER β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β Chap Server β β β
β β Apache / PHP ββββΊ MySQL β β β
β β (auth, state, UI API, metadata) β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
βββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ β
β WebSocket (port 8081) β
ββββββββββββββββββββββΌβββββββββββββββββββββββββ β
β β β β
βΌ βΌ βΌ β
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β SERVER A β β SERVER B β β SERVER C β β
β ββββββββββββββ β β ββββββββββββββ β β ββββββββββββββ β β
β β Chap Node β β β β Chap Node β β β β Chap Node β β β
β β + Docker β β β β + Docker β β β β + Docker β β β
β ββββββββββββββ β β ββββββββββββββ β β ββββββββββββββ β β
β Your apps here β β Your apps here β β Your apps here β β
ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β² β² β² β
βββββ Optional Direct WebSocket (logs) βββββ΄βββββββββββββββββββ
- Docker and Docker Compose installed on all servers
- Network connectivity between server and nodes (port 8081 on central server)
Run this on your central server (where you want the dashboard):
# Clone the repository
git clone https://github.com/MJDaws0n/chap.git
cd chap
# Remove the node (if not running node on this server)
rm -r node
rm docker-compose.node.yml
# Remove development file (can create confusion)
rm docker-compose.yml
# Copy and edit environment file
cp .env.example .env
nano .env # Edit with your settings
# Start the server
docker compose -f docker-compose.server.yml up -dAccess the dashboard at http://your-server:8080
Default login:
- Email:
max@chap.dev - Password:
password
Run this on each server where you want to deploy applications.
Note: You only run ONE node per host. Each node connects back to your central Chap server.
# Clone the repository
git clone https://github.com/MJDaws0n/chap.git
cd chap
# Remove the server (web inferface not needed)
rm -r node
rm docker-compose.server.yml
# Remove development file (can create confusion)
rm docker-compose.yml
# Create environment file from the example (in node folder) and edit it
cp node/.env.example .env
nano .env # set NODE_ID, NODE_TOKEN and CHAP_SERVER_URL (see notes below)
# Start the node
docker compose -f docker-compose.node.yml up -dNote: when setting CHAP_SERVER_URL for a node, include the WebSocket scheme. Use wss:// if your Chap server is served over HTTPS (TLS), or ws:// for non-HTTPS setups. See the "Live Logging (WebSocket)" section below for certificate and reverse-proxy details.
- Log in to your Chap dashboard
- Go to Nodes β Add Node
- Create a name for your node and copy the
NODE_TOKEN - Use these in your node's environment variables
For local development (runs server + node on same machine):
git clone https://github.com/MJDaws0n/chap.git
cd chap
cp .env.example .env
docker compose up -dThis starts everything locally at http://localhost:8080
| File | Purpose | When to use |
|---|---|---|
docker-compose.yml |
Development | Local testing (server + node together) |
docker-compose.server.yml |
Production server | Your central/main server |
docker-compose.node.yml |
Production node | Each deployment server |
- Create a Project to organize your applications
- Create an Environment (e.g., production, staging)
- Add a new Application
- Connect your Git repository
- Configure build settings (Dockerfile, build commands)
- Select which Node to deploy to
- Click Deploy
- Go to Templates
- Browse available services (PostgreSQL, MySQL, Redis, etc.)
- Click Deploy and select a Node
- Configure and launch
# Login and get token
curl -X POST https://your-chap-server/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "your@email.com", "password": "your-password"}'
# Trigger deployment
curl -X POST https://your-chap-server/api/v1/applications/{id}/deploy \
-H "Authorization: Bearer YOUR_TOKEN"| Variable | Description | Default |
|---|---|---|
APP_URL |
Public URL of your Chap server | http://localhost:8080 |
APP_SECRET |
Encryption key (min 32 chars) | (required) |
DB_PASSWORD |
MySQL password | (required) |
GITHUB_CLIENT_ID |
For GitHub OAuth | (optional) |
GITHUB_CLIENT_SECRET |
For GitHub OAuth | (optional) |
| Variable | Description | Default |
|---|---|---|
NODE_ID |
Unique name for this node | (required) |
NODE_TOKEN |
Auth token from dashboard | (required) |
CHAP_SERVER_URL |
WebSocket URL to server | (required) |
CHAP_DATA_DIR |
Storage path | /data |
Chap supports optional live logging using a direct WebSocket connection from the browser to the node agent (WS/WSS). If you want the Live Logs page to work, this WebSocket must be configured.
- Node URL scheme: When creating a node, set
CHAP_SERVER_URLto include the scheme: usewss://your-chap-server:8081for HTTPS servers, orws://your-chap-server:8081for non-HTTPS servers. - Browser β node logs socket: Configure the node agent's browser WebSocket (WS/WSS) and set each node's
logs_websocket_urlto point at it (e.g.wss://your-node-host:6002). - Certificates & TLS: If your dashboard is served over HTTPS, browsers require a secure WebSocket (
wss://) with a valid certificate for the logs socket. Terminate TLS at a reverse proxy (recommended) or configure the node agent to serve WSS directly. - Mixed-content warning: If the dashboard uses HTTPS but the logs socket uses
ws://, modern browsers will block it as mixed content.
MIT License - see LICENSE
Created by Max
Inspired by Coolify