Skip to main content
Docker is the recommended way to run Reacher in production. It handles dependencies, provides automatic restarts, and isolates the process cleanly.

Prerequisites

  • Docker installed on your host machine
  • .env file configured with your credentials (copy from .env.example)
  • reacher.config.yaml configured (copy from reacher.config.example.yaml)
Generate a strong MCP_SECRET before you start: openssl rand -hex 32
Docker Compose is the simplest path for most deployments. It builds the image, maps ports, loads your .env, and restarts automatically on crash or reboot.
1

Clone the repository

2

Configure environment and config files

Edit both files with your credentials. At minimum, set:
3

Start the service

Docker Compose will build the image and start the container in the background.
4

Verify it is running

You should see {"status":"ok",...} from the health check endpoint.

docker-compose.yml

This is the full Compose file included in the repository:
docker-compose.yml

Manual docker run

If you prefer to manage the container directly without Compose:
1

Build the image

2

Run the container

The flags do the following:
  • -d — run in the background (detached)
  • -p 3000:3000 — map host port 3000 to container port 3000
  • --env-file .env — inject all variables from your .env file
  • --restart unless-stopped — restart automatically on crash or host reboot
  • --name reacher — give the container a stable name for log and management commands

Checking logs

For Docker Compose deployments, use the service name:

Health check

The /health endpoint returns the current server status. It requires the same token as the /mcp endpoint:
Docker runs its own built-in health check every 30 seconds against this endpoint. You can inspect it with:

Updating to a new version

1

Pull the latest code

2

Rebuild and restart

Dockerfile reference

The included Dockerfile produces a minimal production image:
Dockerfile
Key details:
  • Base image: node:22-alpine — small Alpine-based Node 22 image
  • openssh-client: required for the ssh_exec tool to reach Tailscale devices
  • npm install --omit=dev: installs only production dependencies to keep the image lean
  • Built-in health check: polls the server’s HTTP port every 30 seconds