Sign inSign up

nickcrew/synapse-fleet

By nickcrew

Updated 5 months ago

Command-plane and fleet management for Synapse WAF

Image
Security
0

156

nickcrew/synapse-fleet repository overview

Synapse Fleet

Multi-tenant fleet intelligence hub and management control plane for distributed Synapse WAF sensors. Centralized threat correlation, impossible travel detection, historical hunting, and collaborative incident response.

Renamed from Signal Horizon. This image was previously published as nickcrew/horizon. The old image is deprecated and no longer receives updates. See the migration note at the bottom of this page.

Part of the Edge Protection platform alongside Synapse WAF.

Quick Start

Synapse Fleet requires PostgreSQL as its source of truth:

# Start PostgreSQL
docker run -d --name postgres \
  -e POSTGRES_DB=synapse_fleet \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=postgres \
  -p 5432:5432 \
  postgres:15-alpine

# Start Synapse Fleet
docker run -p 3100:3100 \
  -e DATABASE_URL=postgresql://postgres:[email protected]:5432/synapse_fleet \
  nickcrew/synapse-fleet
  • API: localhost:3100
  • WebSocket (sensors): ws://localhost:3100/ws/sensors
  • WebSocket (dashboard): ws://localhost:3100/ws/dashboard

Configuration

VariableDefaultDescription
PORT3100API server port
HOST0.0.0.0Bind address
NODE_ENVdevelopmentEnvironment (production recommended)
DATABASE_URLPostgreSQL connection string (required)
LOG_LEVELinfoLogging level
WebSocket
VariableDefaultDescription
WS_SENSOR_PATH/ws/sensorsSensor connection endpoint
WS_DASHBOARD_PATH/ws/dashboardDashboard connection endpoint
WS_HEARTBEAT_INTERVAL_MS30000Heartbeat interval
WS_MAX_SENSOR_CONNECTIONS1000Max sensor connections
WS_MAX_DASHBOARD_CONNECTIONS100Max dashboard connections
Signal Processing
VariableDefaultDescription
SIGNAL_BATCH_SIZE100Signals per batch
SIGNAL_BATCH_TIMEOUT_MS5000Max batch wait time
BLOCKLIST_PUSH_DELAY_MS50Blocklist propagation delay
BLOCKLIST_CACHE_SIZE100000Max cached blocklist entries
Security
VariableDefaultDescription
API_KEY_HEADERX-API-KeyHeader for API authentication
CONFIG_ENCRYPTION_KEYEncryption key for stored configs
TELEMETRY_JWT_SECRETJWT secret for telemetry auth
CORS_ORIGINSComma-separated allowed origins
Optional Services
VariableDefaultDescription
REDIS_URLRedis connection string (recommended for production)
CLICKHOUSE_ENABLEDfalseEnable ClickHouse for historical analytics
CLICKHOUSE_HOSTlocalhostClickHouse host
CLICKHOUSE_HTTP_PORT8123ClickHouse HTTP port
CLICKHOUSE_DBsynapse_fleetClickHouse database
CLICKHOUSE_USERdefaultClickHouse user
CLICKHOUSE_PASSWORDClickHouse password

Key Features

  • Fleet Management — centralized command and control for distributed Synapse sensors
  • Threat Intelligence — real-time campaign correlation across tenants
  • Impossible Travel Detection — geographic anomaly detection for credential compromise
  • Historical Hunting — time-window routing between PostgreSQL and ClickHouse
  • War Room — collaborative incident response workspace

Dependencies

ServiceRequiredPurpose
PostgreSQL 15+YesSource of truth for tenants, configs, signals
Redis 7+RecommendedQueue, distributed state, pub/sub
ClickHouse 23+OptionalHistorical analytics and long-term signal storage

Using with Synapse WAF

Synapse WAF sensors connect to Synapse Fleet via WebSocket to stream detection signals and receive blocklist updates. Configure Synapse's telemetry section to point at the fleet hub:

# In Synapse config.yaml
telemetry:
  enabled: true
  endpoint: "http://synapse-fleet:3100/telemetry"
  api_key: "your-api-key"
  batch_size: 100
  flush_interval: 10s

Full Platform (Compose)

Run Synapse Fleet with Synapse WAF, PostgreSQL, and optional ClickHouse:

services:
  synapse-fleet:
    image: nickcrew/synapse-fleet:latest
    ports:
      - "3100:3100"
    environment:
      NODE_ENV: production
      DATABASE_URL: postgresql://postgres:postgres@postgres:5432/synapse_fleet
      CLICKHOUSE_ENABLED: "true"
      CLICKHOUSE_HOST: clickhouse
      REDIS_URL: redis://redis:6379
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - edge
    restart: unless-stopped

  synapse:
    image: nickcrew/synapse-waf:latest
    ports:
      - "6190:6190"
      - "6191:6191"
    volumes:
      - ./config.yaml:/app/config.yaml:ro
    networks:
      - edge
    restart: unless-stopped

  postgres:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: synapse_fleet
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5
    networks:
      - edge

  clickhouse:
    image: clickhouse/clickhouse-server:23.8
    volumes:
      - clickhouse_data:/var/lib/clickhouse
    networks:
      - edge

  redis:
    image: redis:7-alpine
    networks:
      - edge

networks:
  edge:

volumes:
  postgres_data:
  clickhouse_data:
docker compose up -d
ServiceURL
Synapse Fleet APIlocalhost:3100
Synapse Proxylocalhost:6190
Synapse Adminlocalhost:6191

Also available on npm

npm install -g @atlascrew/synapse-fleet
synapse-fleet start

Migrating from nickcrew/horizon

Signal Horizon has been renamed to Synapse Fleet. The Docker image nickcrew/horizon is deprecated and will not receive new builds. Existing tags remain pullable, but new releases (bug fixes, features, security patches) are only published under nickcrew/synapse-fleet.

To migrate:

  • Replace nickcrew/horizon with nickcrew/synapse-fleet in compose files, Kubernetes manifests, and pull commands.
  • Environment variables (HORIZON_*, DATABASE_URL, etc.) and the on-wire protocol are unchanged — no data migration required.
  • The internal behaviour, API, and storage layout are identical. This is a pure name change.

See ADR-0003 for the full rename scope.

Tag summary

Content type

Image

Digest

sha256:eae2d2f1b

Size

367.8 MB

Last updated

5 months ago

docker pull nickcrew/synapse-fleet:0.1.0