Github|...

Deployment

Deploying Spooky requires running the Spooky Sidecar (SSP) alongside your SurrealDB instance. For production deployments, the Scheduler coordinates multiple SSP instances.

Architecture

  1. SurrealDB: Your persistent data store.
  2. Spooky SSP (Sidecar): A backend service that monitors SurrealDB for changes and maintains materialized views.
  3. Scheduler (optional): Central coordinator for distributed deployments with multiple SSPs. Maintains a RocksDB snapshot replica and WAL.
  4. Client: Connects directly to SurrealDB.

Single Node (Development)

The simplest setup for development and testing. No scheduler needed.

yaml
version: '3.8'
services:
surrealdb:
  image: surrealdb/surrealdb:latest
  command: start --user root --pass root file://data.db
  ports:
    - "8000:8000"
  volumes:
    - ./data:/data

spooky-ssp:
  image: ghcr.io/spooky-org/sidecar:latest
  environment:
    - SURREALDB_ADDR=surrealdb:8000
    - SURREALDB_USER=root
    - SURREALDB_PASS=root
    - SURREALDB_NS=test
    - SURREALDB_DB=test
    - LISTEN_ADDR=0.0.0.0:8667
    - SPOOKY_AUTH_SECRET=your-secret-token
  ports:
    - "8667:8667"
  depends_on:
    - surrealdb

Distributed (Production)

For production with high availability and horizontal scaling, use a Scheduler with multiple SSP instances.

yaml
version: '3.8'
services:
surrealdb:
  image: surrealdb/surrealdb:latest
  command: start --user root --pass root file://data.db
  ports:
    - "8000:8000"
  volumes:
    - surreal-data:/data

scheduler:
  image: ghcr.io/spooky-org/scheduler:latest
  environment:
    - SPOOKY_SCHEDULER_DB_URL=surrealdb:8000/rpc
    - SPOOKY_SCHEDULER_DB_NAMESPACE=test
    - SPOOKY_SCHEDULER_DB_DATABASE=test
    - SPOOKY_SCHEDULER_DB_USERNAME=root
    - SPOOKY_SCHEDULER_DB_PASSWORD=root
    - SPOOKY_SCHEDULER_INGEST_HOST=0.0.0.0
    - SPOOKY_SCHEDULER_INGEST_PORT=9667
    - SPOOKY_SCHEDULER_REPLICA_DB_PATH=./data/replica
    - SPOOKY_SCHEDULER_WAL_PATH=./data/event_wal.log
    - SPOOKY_SCHEDULER_LOAD_BALANCE=least_queries
  ports:
    - "9667:9667"
  volumes:
    - scheduler-data:/app/data
  depends_on:
    - surrealdb

ssp-1:
  image: ghcr.io/spooky-org/sidecar:latest
  environment:
    - SSP_ID=ssp-01
    - SURREALDB_ADDR=surrealdb:8000
    - SURREALDB_USER=root
    - SURREALDB_PASS=root
    - SURREALDB_NS=test
    - SURREALDB_DB=test
    - LISTEN_ADDR=0.0.0.0:8667
    - SPOOKY_AUTH_SECRET=your-secret-token
    - SCHEDULER_URL=http://scheduler:9667
    - HEARTBEAT_INTERVAL_MS=5000
  ports:
    - "8667:8667"
  depends_on:
    - surrealdb
    - scheduler

ssp-2:
  image: ghcr.io/spooky-org/sidecar:latest
  environment:
    - SSP_ID=ssp-02
    - SURREALDB_ADDR=surrealdb:8000
    - SURREALDB_USER=root
    - SURREALDB_PASS=root
    - SURREALDB_NS=test
    - SURREALDB_DB=test
    - LISTEN_ADDR=0.0.0.0:8667
    - SPOOKY_AUTH_SECRET=your-secret-token
    - SCHEDULER_URL=http://scheduler:9667
    - HEARTBEAT_INTERVAL_MS=5000
  ports:
    - "8668:8667"
  depends_on:
    - surrealdb
    - scheduler

volumes:
surreal-data:
scheduler-data:

Environment Variables

SSP (Sidecar)

VariableDescriptionDefault
LISTEN_ADDRAddress and port for the SSP HTTP server0.0.0.0:8667
SPOOKY_AUTH_SECRETBearer token for authenticating SSP API requests(required)
SURREALDB_ADDRSurrealDB host and port127.0.0.1:8000
SURREALDB_USERSurrealDB usernameroot
SURREALDB_PASSSurrealDB passwordroot
SURREALDB_NSSurrealDB namespacetest
SURREALDB_DBSurrealDB databasetest
SCHEDULER_URLScheduler URL (enables distributed mode)(unset)
SSP_IDUnique SSP identifierssp-<uuid>
ADVERTISE_ADDRExternally reachable address for this SSP(unset)
HEARTBEAT_INTERVAL_MSHeartbeat interval in ms5000
SPOOKY_CONFIG_PATHPath to spooky.yml for job configspooky.yml
TTL_CLEANUP_INTERVAL_SECSView TTL cleanup interval60

Scheduler

VariableDescriptionDefault
SCHEDULER_IDUnique scheduler identifierscheduler-<uuid>
SPOOKY_SCHEDULER_INGEST_HOSTHTTP server bind host0.0.0.0
SPOOKY_SCHEDULER_INGEST_PORTHTTP server bind port9667
SPOOKY_SCHEDULER_DB_URLSurrealDB connection URLlocalhost:8000/rpc
SPOOKY_SCHEDULER_DB_NAMESPACESurrealDB namespacespooky
SPOOKY_SCHEDULER_DB_DATABASESurrealDB databasespooky
SPOOKY_SCHEDULER_DB_USERNAMESurrealDB usernameroot
SPOOKY_SCHEDULER_DB_PASSWORDSurrealDB passwordroot
SPOOKY_SCHEDULER_REPLICA_DB_PATHRocksDB snapshot replica path./data/replica
SPOOKY_SCHEDULER_WAL_PATHWrite-ahead log path./data/event_wal.log
SPOOKY_SCHEDULER_LOAD_BALANCELoad balancing strategyleast_queries
SPOOKY_SCHEDULER_HEARTBEAT_INTERVAL_MSExpected heartbeat interval5000
SPOOKY_SCHEDULER_HEARTBEAT_TIMEOUT_MSHeartbeat timeout before stale15000
SPOOKY_SCHEDULER_BOOTSTRAP_TIMEOUT_SECSBootstrap timeout120
SPOOKY_SCHEDULER_SSP_POLL_INTERVAL_MSSSP health poll interval during bootstrap3000
SPOOKY_SCHEDULER_MAX_BUFFER_PER_SSPMax buffered messages per SSP10000
SPOOKY_SCHEDULER_SNAPSHOT_UPDATE_INTERVAL_SECSSnapshot update interval300