Docker & Deploy

Docker (quickest)

docker run -d \
  --name cntrlnode \
  -p 7474:7474 \
  ghcr.io/meetpatell07/cntrlnode:latest

Verify:

curl http://localhost:7474/health
# {"status":"ok","version":"0.1.0-alpha"}

Docker Compose (with PostgreSQL)

# docker-compose.yml
services:
  cntrlnode:
    image: ghcr.io/meetpatell07/cntrlnode:latest
    restart: unless-stopped
    ports:
      - "7474:7474"
    environment:
      CNTRLNODE_STORAGE: postgres
      CNTRLNODE_DB_URL: postgres://cntrlnode:secret@db:5432/cntrlnode
      CNTRLNODE_AUTH_ENABLED: "true"
      CNTRLNODE_API_KEYS: "${CNTRLNODE_API_KEYS}"
      CNTRLNODE_OLLAMA_HOST: ollama:11434
    depends_on:
      db:
        condition: service_healthy

  db:
    image: pgvector/pgvector:pg16
    restart: unless-stopped
    environment:
      POSTGRES_DB: cntrlnode
      POSTGRES_USER: cntrlnode
      POSTGRES_PASSWORD: secret
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U cntrlnode"]
      interval: 5s
      retries: 10

  ollama:
    image: ollama/ollama
    restart: unless-stopped
    volumes:
      - ollama_data:/root/.ollama

volumes:
  pgdata:
  ollama_data:
docker compose up -d

# Pull the embedding model (first time only)
docker compose exec ollama ollama pull nomic-embed-text

Binary (no Docker)

Download from GitHub Releases:

# macOS (Apple Silicon)
curl -L https://github.com/meetpatell07/cntrlnode/releases/latest/download/cntrlnode-darwin-arm64 \
  -o /usr/local/bin/cntrlnode && chmod +x /usr/local/bin/cntrlnode

# Linux (x86_64)
curl -L https://github.com/meetpatell07/cntrlnode/releases/latest/download/cntrlnode-linux-amd64 \
  -o /usr/local/bin/cntrlnode && chmod +x /usr/local/bin/cntrlnode

# Start
cntrlnode start

systemd (Linux production)

# /etc/systemd/system/cntrlnode.service
[Unit]
Description=CntrlNode runtime
After=network.target postgresql.service

[Service]
Type=simple
User=cntrlnode
ExecStart=/usr/local/bin/cntrlnode start
Restart=on-failure
RestartSec=5s
EnvironmentFile=/etc/cntrlnode/env

[Install]
WantedBy=multi-user.target
sudo systemctl enable --now cntrlnode
sudo journalctl -u cntrlnode -f

Fly.io

# fly.toml
app = "my-cntrlnode"
primary_region = "iad"

[build]
  image = "ghcr.io/meetpatell07/cntrlnode:latest"

[[services]]
  internal_port = 7474
  protocol = "tcp"

  [[services.ports]]
    port = 443
    handlers = ["tls", "http"]

[env]
  CNTRLNODE_PORT = "7474"
  CNTRLNODE_STORAGE = "postgres"
flyctl launch --no-deploy
flyctl secrets set CNTRLNODE_API_KEYS=your-key CNTRLNODE_DB_URL=postgres://...
flyctl postgres create --name cntrlnode-db
flyctl postgres attach cntrlnode-db
flyctl deploy

Railway

  1. New project → Deploy from Docker image → ghcr.io/meetpatell07/cntrlnode:latest
  2. Add a PostgreSQL database service
  3. Set environment variables: CNTRLNODE_STORAGE=postgres, CNTRLNODE_DB_URL=${{Postgres.DATABASE_URL}}, CNTRLNODE_AUTH_ENABLED=true, CNTRLNODE_API_KEYS=your-key
  4. Expose port 7474

Health check

All platforms: configure health checks against GET /health.

Path:     /health
Interval: 30s
Timeout:  5s
Expected: {"status":"ok"}