mirror of
https://github.com/colanode/colanode.git
synced 2026-02-24 11:59:53 +01:00
Colanode Server (apps/server)
Colanode server is the authoritative sync, auth, and realtime layer for the local-first collaboration stack. Clients keep a local SQLite cache and sync mutation batches to this server; the server validates, persists, and broadcasts changes over WebSocket.
Architecture overview
- Runtime: Fastify + Zod validation, WebSocket support, Redis-backed event bus, BullMQ jobs, Kysely/Postgres persistence.
- Data model: Nodes, documents, collaborations, reactions, interactions, and tombstones are revisioned streams with merge-safe CRDT updates.
- Sync: Clients push mutation batches; server writes to Postgres and emits events. WebSocket synchronizers stream incremental changes per entity type using revision cursors.
- Storage: File data is stored via pluggable providers (file system, S3, GCS, Azure). TUS handles resumable uploads.
- Security: Token-per-device authentication, rate limiting (IP + device + email), workspace authorization gates.
Requirements
- Node.js 20+ (tests require this due to Vitest v4).
- Postgres with the pgvector extension.
- Redis (or compatible).
- Docker is recommended for local dev and required for Testcontainers-based tests.
Quick start (local dev)
From the repo root:
npm install
docker compose -f hosting/docker/docker-compose.yaml up -d
From apps/server:
cp .env.example .env
npm run dev
Configuration
The server reads configuration from a JSON file, or falls back to schema defaults in apps/server/src/lib/config/.
CONFIGpoints to the config JSON file.apps/server/config.example.jsonis the recommended template.- Values can reference
env://VAR_NAMEorfile://path/to/secretfor secrets. postgres.urlis required and defaults toenv://POSTGRES_URL.
Code map
apps/server/src/api: HTTP + WebSocket routes and plugins.apps/server/src/data: database + redis clients and migrations.apps/server/src/synchronizers: WebSocket sync streams by entity type.apps/server/src/jobs: background jobs and handlers.apps/server/src/services: email, jobs, and other infrastructure services.apps/server/src/lib: shared server logic and helpers.
Tests
From apps/server:
npm run test
Notes:
- Tests use Testcontainers for Postgres (pgvector) and Redis. Docker must be running.
- Fastify route tests use
fastify.inject()(no network ports). - Shared test helpers live in
apps/server/test/helpers.