RAGCORE_ENV=development RAGCORE_LOG_LEVEL=INFO RAGCORE_SECRET_KEY=replace-with-at-least-32-random-characters RAGCORE_DATABASE_URL=postgresql+psycopg://ragcore:ragcore@postgres:5432/ragcore RAGCORE_QDRANT_URL=http://qdrant:6333 RAGCORE_QDRANT_API_KEY=replace-with-at-least-32-random-characters # For a disposable acceptance stack set RAGCORE_ENV=rc. RC applies the same # strong-secret, HTTPS, proxy and absolute-storage checks as production. # Configure only the SHA-256 digest; the cutover CLI prompts operators for the # separate high-entropy token without echoing it or putting it in argv. # Bind it to one configured operator UUID so the evidence actor cannot be # self-asserted independently of the credential. # RAGCORE_EMBEDDING_CUTOVER_OPERATOR_ID= # RAGCORE_EMBEDDING_CUTOVER_OPERATOR_TOKEN_SHA256= RAGCORE_OLLAMA_URL=http://ollama:11434 # M6 operator-only shadow migration. The file is mounted read-only into the app # container; never put the credential value in this env file. RAGCORE_MODELFORGE_BASE_URL=http://modelforge:8000 RAGCORE_MODELFORGE_CREDENTIAL_FILE=/run/secrets/ragcore/modelforge_embedding_credential RAGCORE_MODELFORGE_EMBEDDING_CAPABILITY=rag.embedding@1 # Optional initial selection route for a ModelForge profile. # The active route is persisted with its profile and Qdrant collection; changing # this value after first selection bootstrap does not remap runtime traffic. # RAGCORE_MODELFORGE_EMBEDDING_EXPERIMENT_ROUTE=rc-canary-2026-09 RAGCORE_MODELFORGE_SECRET_ROOT=./.state/secrets RAGCORE_BLOB_ROOT=/var/lib/ragcore/blobs RAGCORE_PARSED_ROOT=/var/lib/ragcore/parsed RAGCORE_TEMP_ROOT=/var/lib/ragcore/tmp # The explicit allowlist of server-side paths a Folder or Git source may read. # Comma-separated absolute paths, as seen *inside the worker container*; every # entry must also be mounted there (see compose.yaml's `worker` volumes). # # Empty means no filesystem-backed source can be created or synced at all. # That is the deliberate default: without an allowlist, anyone who may create # a source could point the worker at /etc, /app or a database volume. There is # no implicit default root, least of all "/". # # Mount the content read-only and keep the allowlist as narrow as the corpus: # RAGCORE_SOURCE_ROOTS=/mnt/rag-sources # # The read-only mount is a security invariant, not a suggestion: it is what # makes the remaining window between path validation, stat and open harmless. # # This list is deployment-wide, with no per-workspace mapping, so a path inside # it may well be another tenant's corpus. That is why only PLATFORM_ADMIN holds # FILESYSTEM_SOURCE_MANAGE and may configure Folder / local-Git sources; see # docs/07_SECURITY/SECURITY_CONTROLS.md, "Filesystem-backed sources". RAGCORE_SOURCE_ROOTS= # How many jobs one worker process handles at once. The queue hands each loop # a different job (FOR UPDATE SKIP LOCKED), and the model-call budget still # bounds what they can all do to Ollama, so raising this speeds up ingestion # without stampeding the model server. Every loop holds one database # connection while it works; the pool is sized from this number. Default 1. RAGCORE_WORKER_CONCURRENCY=1 # How often the worker looks for sources whose sync interval has elapsed. This # is the resolution of the schedule, not the schedule: each source syncs on its # own interval, and a source without one (the default) never syncs on a timer. RAGCORE_SYNC_SCHEDULER_INTERVAL_SECONDS=60 # Shared by app and worker so both see the same active embedding profile. RAGCORE_MODEL_STATE_ROOT=/var/lib/ragcore/models RAGCORE_PUBLIC_BASE_URL=http://localhost:8088 # Comma-separated direct proxy IPs/CIDRs allowed to set X-Forwarded-*. # Required in production; wildcard, 0.0.0.0/0 and ::/0 are rejected. # Prefer the proxy's static IP (documented example: 172.30.50.2). A CIDR trusts # every address in it, including its Docker gateway, and is only safe when every # possible peer in that range is an authorized reverse proxy. RAGCORE_TRUSTED_PROXY_IPS= RAGCORE_API_TOKEN_PEPPER=replace-with-independent-random-pepper RAGCORE_OIDC_ISSUER=https://auth.example.test/application/o/ragcore/ RAGCORE_OIDC_CLIENT_ID=ragcore RAGCORE_OIDC_CLIENT_SECRET=replace-with-at-least-32-random-characters # JSON object mapping Authentik group names to RAGCore roles; unmapped groups # grant nothing (deny-by-default). Example: {"ragcore-admins": "platform_admin"} RAGCORE_OIDC_GROUP_ROLES={} # Unset (commented out, not blank -- an empty value fails UUID parsing) # means OIDC/SSO is disabled and /auth/* fails closed (503); RAGCore is # single-workspace-per-deployment for OIDC in V1, so this must be the id of # the one real workspace OIDC logins are scoped to. # RAGCORE_OIDC_WORKSPACE_ID=00000000-0000-0000-0000-000000000000 # Optional first-boot-only bootstrap: registers and activates this embedding # model if (and only if) no embedding profile is active yet -- never # overwrites an existing one. Both must be set together; the model must # already be pulled in the deployed Ollama instance (RAGCORE_OLLAMA_URL). # RAGCORE_BOOTSTRAP_EMBEDDING_PROVIDER=ollama # RAGCORE_BOOTSTRAP_EMBEDDING_MODEL=nomic-embed-text:1.5 # Optional: OpenTelemetry tracing/metrics export. The app and worker both # start cleanly with this unset/false -- no collector is required. When # enabled, both export OTLP/HTTP to /v1/traces and /v1/metrics. # RAGCORE_OTEL_ENABLED=true # RAGCORE_OTEL_EXPORTER_ENDPOINT=http://otel-collector:4318 POSTGRES_USER=ragcore POSTGRES_PASSWORD=ragcore POSTGRES_DB=ragcore QDRANT_API_KEY=replace-me RAGCORE_HOST_PORT=8088 # The read-only MCP adapter's own service (see compose.yaml's `mcp` service). RAGCORE_MCP_HOST_PORT=8090 # Local host access for Alembic and integration tests; containers use postgres:5432. RAGCORE_POSTGRES_HOST_PORT=15432 # Production: set these to direct SSD/NVMe pool paths, not /mnt/user. RAGCORE_STATE_ROOT=./.state # Host directory mounted read-only into the worker at /mnt/rag-sources, # where RAGCORE_SOURCE_ROOTS then permits it. Mounting without allowlisting # reads nothing; allowlisting without mounting fails to resolve. RAGCORE_SOURCE_MOUNT=./.state/sources