CodeJackRabbit server: deployment and operations
What production requires
- Public DNS and TLS for
api.codejackrabbit.com, or your own public host. - A container or Node host reachable over HTTPS and WSS on port 443.
- Durable storage: Supabase Postgres via
CJR_DATABASE_URL(recommended; runnpm run db:migratefirst), or a persistent writable data directory with backups for the JSON store and task workspaces. - Long random API keys in
CJR_API_KEYS, withCJR_REQUIRE_AUTH=1. - Optional LLM credentials on the server only.
- Optional GitHub App, GitHub OAuth, GitLab and Bitbucket credentials.
The server starts with none of the optional integrations. Missing credentials are reported in endpoint behavior and health data where relevant; unrelated local/static reviews still work.
Docker
cd infra
Copy-Item .env.example .env
# Fill in secrets. Never commit .env.
docker compose up -d --build
curl http://127.0.0.1:8787/health
Mount persistent storage at the data directory used by the process in real deployments. With CJR_DATABASE_URL set, product data lives in Supabase Postgres and the data directory only holds task workspaces; without it, back up CJR_DATA_DIR (the JSON store). The supplied compose file can also start a local Postgres for development. Put Caddy or another TLS reverse proxy in front of port 8787, then verify /health from outside.
Node deployment
$env:CJR_API_KEYS = "replace-with-a-long-random-key"
$env:CJR_REQUIRE_AUTH = "1"
$env:CJR_DATA_DIR = "D:\CodeJackRabbitData"
$env:CJR_DATABASE_URL = "postgresql://..." # Supabase Postgres
npm run db:migrate
npm run server
Environment
Core: HOST, PORT, CJR_DATA_DIR, CJR_DATABASE_URL / DATABASE_URL, CJR_REQUIRE_AUTH, CJR_API_KEYS, CJR_RATE_LIMIT_PER_HOUR, CJR_ORGS, CJR_PUBLIC_URL, CJR_RELEASE_VERSION, CJR_RELEASE_ASSET_BASE.
LLM: CJR_LLM_PROVIDER, CJR_LLM_MODEL, OPENAI_API_KEY, ANTHROPIC_API_KEY, GOOGLE_API_KEY / GEMINI_API_KEY, OLLAMA_HOST, plus CJR_LLM_BASE_URL and CJR_LLM_API_KEY. The LLM server is specified in configuration and the model is detected from it unless pinned — see LLM providers. A repository can name its own provider/base URL/model under tools.llm; keys stay in the server environment.
GitHub App/OAuth: CJR_GITHUB_WEBHOOK_SECRET, CJR_GITHUB_TOKEN, CJR_GITHUB_APP_ID, private-key variables, app slug, and OAuth client variables documented in GitHub reviewer.
Knowledge providers: Jira base/email/token, Linear API key/base and web search URL/key, plus GitLab and Bitbucket variables.
Management API
All require an API key or OAuth access token when auth is configured: organizations, users and seats, roles and permissions, repositories, learnings, metrics, reports and audit logs under /v1. Organization selection uses the x-codejackrabbit-organization header and scopes usage records. Reports are generated from stored reviews and tasks; they are not seeded sample data.
Operations
Health is GET /health; it reports the storage backend (supabase-postgres, json or memory), readiness and the last persist error. Logs are process stdout. Back up the Supabase project (or the data directory in JSON mode) and task workspaces. Rotate API keys by adding the new key, deploying clients, then removing the old key. Rate limiting is in-memory per process; the Postgres adapter is single-writer, so run one server process per database or place a shared limiter and coordination in front for multi-instance production.
Remaining production hardening
Multi-instance availability, shared quotas and large-scale retention require coordinating multiple writers on the Postgres store plus R2 object storage for large payloads; those are production scale decisions, not hidden placeholders.