Deploy MergeWatch to any Linux server with Docker.
If you have a Linux server — whether a cloud VPS from DigitalOcean, Hetzner, Linode, or a physical machine in your data center — you can run MergeWatch with Docker Compose. This gives you full control over the deployment with minimal dependencies.
This guide covers running MergeWatch and Postgres as Docker containers, setting up a reverse proxy with TLS using nginx or Caddy, and configuring the GitHub App webhook to point at your domain.
docker --version # 20.10+docker compose version # 2.0+
2
Open port 443
Ensure your firewall allows inbound HTTPS traffic on port 443. If you use ufw:
sudo ufw allow 443/tcp
3
Point a domain at your server
Create a DNS A record pointing your domain (e.g. mergewatch.example.com) to your server’s public IP address. A domain is required for TLS certificates.
4
Gather your GitHub App credentials
Variable
Description
GITHUB_APP_ID
Numeric App ID from the GitHub App settings page
GITHUB_PRIVATE_KEY
PEM-formatted private key generated for the App
GITHUB_WEBHOOK_SECRET
Secret used to validate incoming webhook payloads
5
Choose an LLM provider
Set LLM_PROVIDER to your preferred provider. For the default Anthropic provider, you also need ANTHROPIC_API_KEY.
By default, the docker-compose.yml above runs PostgreSQL as a container alongside MergeWatch. Data is persisted to a Docker volume (pgdata).
If you prefer an external managed database, remove the postgres service from docker-compose.yml and set DATABASE_URL in your .env file to the external connection string.
Caddy automatically provisions and renews TLS certificates from Let’s Encrypt. With nginx, use certbot to obtain certificates: sudo certbot --nginx -d mergewatch.example.com