7.2. SOURCE Configuration Guide¶
This guide explains the SOURCE-based configuration system that makes Atlas flexible and modular.
1. Interactive Setup Wizard¶
The easiest way to configure SOURCE variables is the interactive setup wizard. Run ./start.sh with no arguments to launch it. The wizard walks you through each service, shows available options with contextual hints, and validates dependencies in real time. See the Interactive Setup Wizard Guide for details.
2. Understanding SOURCE Variables¶
SOURCE variables control how each service is deployed — whether in a Docker container, using a localhost installation, or disabling the service entirely. (The legacy external and api source values were retired earlier in 2026; see the LLM_PROVIDER_SOURCE migration note below.)
2.1. CLI source flags persist to .env (consumer-wrapper trap)¶
Every --<service>-source flag (--comfyui-source, --llm-provider-source, --ray-source, …) is written into .env as an explicit override on every start — the flag is persisted, not applied for that run only. This is convenient for one-off reconfiguration but a trap for wrapper scripts: a wrapper that passes a defaulted source flag (e.g. --comfyui-source "${COMFYUI_SOURCE:-container-cpu}") silently rewrites a hand-configured .env value back to the default on every restart.
To make that visible, the bootstrapper prints a warning whenever a CLI source flag would change an existing non-empty .env value — on the standard log stream in the --no-tui flow and in the TUI log pane alike:
⚠ COMFYUI_SOURCE: managed-localhost-mps → container-cpu (overridden by --comfyui-source; persisted to .env)
A flag equal to the value already in .env is silent (no noise), as is first-time assignment of an empty/unset variable. Guidance for wrappers: do not pass a source flag when .env already carries the intended value — omit the flag and let .env be the source of truth, or only pass it when you genuinely intend to change the persisted configuration.
3. SOURCE Values Reference¶
A SOURCE value is the *_SOURCE env var setting that picks how a given service is deployed — container (Docker), a localhost/managed-localhost variant (host process), or disabled (excluded from compose); some services expose additional named variants (GPU/CPU flavors, provider choices, etc.). The full generated list of every *_SOURCE variable, its default, and its valid options lives in SOURCE Values; the full env var catalog (including non-SOURCE vars) is in Environment Variables.
The
litellm-initcontainer is mandatory and has no SOURCE toggle — it always runs when the stack starts.litellm-initprovisions the dedicatedlitellmPostgres database and rendersvolumes/litellm/config.yamlfrom the YAML model catalogs (services/ollama/models.yaml,services/litellm/models.yaml) + the wizard's*_USER_MODELSenv vars, viamodel_resolver. No separate catalog-init container is involved in LLM model selection.
3.1. Services Supporting Localhost¶
These services can run on your host machine instead of in containers:
| Service | SOURCE Variable | Localhost Option | Benefits |
|---|---|---|---|
| Ollama (LiteLLM upstream) | LLM_PROVIDER_SOURCE |
ollama-localhost |
Faster, uses existing models, less memory. LiteLLM still fronts the upstream. |
| ComfyUI | COMFYUI_SOURCE |
localhost |
Direct access, custom setups, faster |
| Weaviate | WEAVIATE_SOURCE |
localhost |
Custom configuration, performance |
| Neo4j | NEO4J_GRAPH_DB_SOURCE |
localhost |
Use an existing graph database |
| OpenClaw | OPENCLAW_SOURCE |
localhost |
Native performance, existing config |
| Hermes Agent | HERMES_SOURCE |
localhost |
Operate your real machine (shell, browser, microphone); host-installed Hermes |
| LightRAG | LIGHTRAG_SOURCE |
localhost |
Use a host-installed LightRAG process |
| STT Provider | STT_PROVIDER_SOURCE |
parakeet-localhost, whisper-cpp-localhost |
Run STT natively (best on Apple Silicon — Metal+ANE for whisper.cpp, MLX for Parakeet) |
| TEI Reranker | TEI_RERANKER_SOURCE |
localhost |
Use a host-installed TEI reranker process |
| TTS Provider | TTS_PROVIDER_SOURCE |
chatterbox-localhost |
Run Chatterbox voice cloning natively (macOS MPS / Linux) |
| Document Processor | DOC_PROCESSOR_SOURCE |
docling-localhost |
Use a host Docling service |
| Apache Tika | TIKA_SOURCE |
tika-localhost |
Use a host Tika server for long-tail fallback extraction |
| Blender MCP | BLENDER_MCP_SOURCE |
localhost, managed-localhost |
Use a host-installed Blender MCP add-on/server without exposing it through Kong. managed-localhost runs an Atlas-provisioned headless Blender + MCP bridge — see services/blender-mcp/README.md. |
3.2. Container-Only or Stack-Managed Services¶
Container-only and stack-managed services should normally be left at their defaults unless you are intentionally reducing the stack or debugging a specific component. Init-service SOURCE variables (the *_INIT_SOURCE selectors) are usually managed by the startup flow and should not be the first knob users change.
3.3. Feature Flags (Non-SOURCE)¶
Some features within services are controlled by feature flags rather than SOURCE variables:
| Feature | Variable | Options | Notes |
|---|---|---|---|
| LangMem Memory | LANGMEM_ENABLED |
true, false |
Persistent conversation memory embedded in the Backend service. |
3.4. Wizard Model Selections (Non-SOURCE)¶
The interactive wizard's per-provider multiselects persist as comma-separated env vars in .env. On each docker compose up:
litellm-initcallsmodel_resolver.active_models(env)— which readsservices/ollama/models.yaml,services/litellm/models.yaml, and the*_USER_MODELSvars below — to rendervolumes/litellm/config.yaml. No DB query involved.ollama-pullpre-pulls Ollama models (container sources only) using the same resolved active set. Forollama-localhost, the bootstrapper pulls the same declared union onto the host daemon at every start (#757) — present tags skip, missing ones stream, per-tag failures warn without aborting.
| Variable | Set by | Default | Notes |
|---|---|---|---|
OLLAMA_USER_MODELS |
Single unified Ollama models multiselect (source-aware; localhost rows are badged [pulled] / [library]). |
Default-active baseline (qwen3.8:latest, qwen3-embedding:0.6b, nomic-embed-text). | Consumed by model_resolver for every Ollama source. Pulled by ollama-pull for container sources; for ollama-localhost the bootstrapper pulls the declared set onto the host daemon at start (#757). |
OLLAMA_CUSTOM_MODELS |
Ollama "additional models to pull" free-text step. | Empty. | Comma-separated. Pulled by ollama-pull for container sources; for ollama-localhost the bootstrapper pulls them onto the host daemon at start (#757). |
OPENAI_USER_MODELS |
OpenAI multiselect (live /v1/models fetch). |
Curated default-active intersection (gpt-5, gpt-5-mini, text-embedding-3-large) when key valid. | Requires OPENAI_API_KEY. |
ANTHROPIC_USER_MODELS |
Anthropic multiselect (live /v1/models fetch). |
Curated default-active intersection (claude-opus-4-7, claude-sonnet-4-6) when key valid. | Requires ANTHROPIC_API_KEY. |
OPENROUTER_USER_MODELS |
OpenRouter multiselect (live /api/v1/models fetch). |
openrouter/auto when reachable. |
Requires OPENROUTER_API_KEY. |
4. Detailed SOURCE Configurations¶
4.1. LLM access (LiteLLM gateway + Ollama upstream + cloud toggles)¶
LLM access in this stack is split between LiteLLM (the always-on OpenAI-compatible gateway every consumer reads) and four configurable upstreams behind it: an Ollama engine plus three cloud providers. See LiteLLM Gateway for the consumer-facing surface; the variables below pick what LiteLLM forwards to.
4.1.1. LLM_PROVIDER_SOURCE — Ollama upstream (single-select)¶
4.1.1.1. ollama-container-cpu (Default)¶
LLM_PROVIDER_SOURCE=ollama-container-cpu
4.1.1.2. ollama-container-gpu¶
LLM_PROVIDER_SOURCE=ollama-container-gpu
4.1.1.3. ollama-localhost¶
LLM_PROVIDER_SOURCE=ollama-localhost
Setup for localhost:
# Install Ollama
curl -fsSL https://ollama.com/install.sh | sh
# Start Ollama service — the only required step
ollama serve &
# Optional pre-warm — Atlas pulls the declared tags automatically at start (#757)
ollama pull qwen3.8:latest
ollama pull qwen3-embedding:0.6b
4.1.1.4. none¶
LLM_PROVIDER_SOURCE=none
CLOUD_OPENAI_SOURCE, CLOUD_ANTHROPIC_SOURCE, CLOUD_OPENROUTER_SOURCE must be enabled. The bootstrapper refuses to start when LLM_PROVIDER_SOURCE=none AND every cloud source is disabled.
The legacy values LLM_PROVIDER_SOURCE=api and LLM_PROVIDER_SOURCE=disabled have been removed — use none together with the per-provider cloud toggles below instead.
4.1.2. CLOUD_OPENAI_SOURCE / CLOUD_ANTHROPIC_SOURCE / CLOUD_OPENROUTER_SOURCE (multi-toggle)¶
Each cloud provider is an independent enabled / disabled switch — turn on as many as you want simultaneously. Consumers request model IDs against LITELLM_BASE_URL; LiteLLM routes per-provider based on the active model set that model_resolver computes from the YAML catalogs + env on each docker compose up.
CLOUD_OPENAI_SOURCE=enabled # requires OPENAI_API_KEY
CLOUD_ANTHROPIC_SOURCE=enabled # requires ANTHROPIC_API_KEY
CLOUD_OPENROUTER_SOURCE=enabled # requires OPENROUTER_API_KEY
4.1.3. Per-provider activation rules (applied by model_resolver on every docker compose up)¶
| Provider state | *_USER_MODELS env var |
Result |
|---|---|---|
disabled OR no API key |
(any) | Zero active entries for that provider — LiteLLM routes nothing to it. |
enabled + key |
non-empty CSV | Exactly those models are active (catalog entries + synthesized entries for unknown names). |
enabled + key |
empty | The curated default_active=True set from the YAML catalog (e.g. gpt-5 + gpt-5-mini + text-embedding-3-large for OpenAI) so the provider is usable out of the box. |
Bootstrapper safety net — source_validator.enforce_runtime_invariants() flips CLOUD_*_SOURCE=enabled back to disabled when the matching API key is empty and prints a warning. This protects against the "looks ready in .env, errors at first request" failure mode.
- Use case: Mix-and-match local + cloud, or run cloud-only with
LLM_PROVIDER_SOURCE=none - Pros: One URL/key for every consumer; provider failover and spend logging handled by LiteLLM
- Cons: API costs and per-provider quota considerations
- Requirements: The provider's API key must be present in
.env
4.2. COMFYUI_SOURCE¶
4.2.1. container-cpu (Default)¶
COMFYUI_SOURCE=container-cpu
4.2.2. container-gpu¶
COMFYUI_SOURCE=container-gpu
4.2.3. localhost¶
COMFYUI_SOURCE=localhost
COMFYUI_LOCALHOST_PORT (default 8000; override to e.g. 8188 if your installation uses another port). The URL is derived as http://host.docker.internal:${COMFYUI_LOCALHOST_PORT} at compose-render time.
Setup for localhost:
# Clone ComfyUI
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
# Install dependencies
pip install -r requirements.txt
# Start ComfyUI on the stack default localhost port
python main.py --port 8000
# If your local ComfyUI uses the common native/default port 8188 instead, set:
# COMFYUI_LOCALHOST_PORT=8188
# (URL is derived as http://host.docker.internal:8188 at compose-render time.)
4.2.4. disabled¶
COMFYUI_SOURCE=disabled
4.2.5. FAL_SOURCE — cloud media provider¶
FAL_SOURCE=enabled
FAL_API_KEY=<your-fal-key>
FAL_MODEL=fal-ai/flux/dev
FAL_API_KEY when FAL_SOURCE=enabled; no key required when FAL_SOURCE=disabled.
- Behavior: POST /comfyui/generate uses FAL when enabled, for backward compatibility with existing Open WebUI and n8n callers. POST /media/generate is the provider-neutral route for FAL image and image-to-3D generation (TRELLIS, Hunyuan3D, Tripo, Rodin); the full request/response contract is served at the backend's /docs (Swagger) endpoint.
4.3. WEAVIATE_SOURCE¶
4.3.1. container (Default)¶
WEAVIATE_SOURCE=container
WEAVIATE_URL=http://weaviate:8080
The default stack also enables the optional CLIP vectorizer service. Text vectorization talks to LiteLLM via the text2vec-openai module — the OpenAI-compatible URL points at LITELLM_BASE_URL and OPENAI_APIKEY is set to LITELLM_MASTER_KEY. The default module list also keeps text2vec-ollama and generative-ollama enabled for back-compat with schemas created before the LiteLLM-fronted setup.
MULTI2VEC_CLIP_SOURCE=container-cpu
WEAVIATE_ENABLE_MODULES=text2vec-openai,text2vec-ollama,multi2vec-clip,generative-openai,generative-ollama
CLIP_INFERENCE_API=http://multi2vec-clip:8080
MULTI2VEC_CLIP_SIGLIP2_IMAGE=semitechnologies/multi2vec-clip:google-siglip2-so400m-patch16-512-1.5.1
If MULTI2VEC_CLIP_SOURCE=disabled, remove multi2vec-clip from WEAVIATE_ENABLE_MODULES (leaving text2vec-openai,text2vec-ollama,generative-openai,generative-ollama) and set CLIP_INFERENCE_API= so Weaviate does not advertise a disabled inference endpoint.
MULTI2VEC_CLIP_SIGLIP2_IMAGE is a documented opt-in alternative to the default MULTI2VEC_CLIP_IMAGE. Switching it is a breaking change for existing collections — the default ViT-B/32 image emits 512-d vectors versus 1152-d for SigLIP 2 — so a swap requires recreating or revectorizing/reindexing every collection that uses multi2vec-clip. See the multi2vec-clip service README for the full migration steps.
4.3.2. localhost¶
WEAVIATE_SOURCE=localhost
4.3.3. disabled¶
WEAVIATE_SOURCE=disabled
4.4. MINIO_SOURCE¶
4.4.1. container (Default)¶
MINIO_SOURCE=container
MINIO_ENDPOINT=http://minio:9000
MINIO_PUBLIC_ENDPOINT=http://localhost:63020
http://localhost:63021 (S3 API on :63020)
- Cons: Container resource usage
- Requirements: None
Consumer code is not auto-wired in the current release — credentials and bucket names are in .env so each consumer integration can opt in via env-only changes in a follow-up PR.
4.4.2. disabled¶
MINIO_SOURCE=disabled
4.5. OPENCLAW_SOURCE¶
4.5.1. container¶
OPENCLAW_SOURCE=container
4.5.2. localhost¶
OPENCLAW_SOURCE=localhost
npm install -g openclaw, running openclaw gateway
Setup for localhost:
# Install OpenClaw
npm install -g openclaw
# Run onboarding
openclaw onboard
# Start the gateway on the stack default localhost port
openclaw gateway --port 63065
# If your local OpenClaw uses its native/default port 18789 instead, set:
# OPENCLAW_LOCALHOST_PORT=18789
# (URL is derived as http://host.docker.internal:18789 at compose-render time.)
4.5.3. disabled (Default)¶
OPENCLAW_SOURCE=disabled
4.6. HERMES_SOURCE¶
The programmable AI agent runtime by Nous Research. Hermes reasons over the LiteLLM gateway and exposes an OpenAI-compatible API; litellm-init auto-registers hermes-agent as a model in the gateway when HERMES_SOURCE != disabled, so Open WebUI / n8n / backend / jupyterhub / openclaw all see Hermes for free.
See Hermes Agent for the full service doc.
4.6.1. container (Default)¶
HERMES_SOURCE=container
HERMES_DEFAULT_MODEL must reference a model with ≥64K context window (stock Ollama context defaults are VRAM-dependent (4k/32k/256k) and usually below 64K — set OLLAMA_CONTEXT_LENGTH=65536 on the Ollama server, or /set parameter num_ctx 65536 + /save <model> inside ollama run; or use a cloud model)
4.6.2. localhost¶
HERMES_SOURCE=localhost
HERMES_ENDPOINT (auto-set to http://host.docker.internal:<port>)
- Requirements: Host-installed Hermes (curl -fsSL https://hermes-agent.nousresearch.com/install.sh | sh), then hermes gateway run
Setup for localhost:
# Install Hermes on the host
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | sh
# Start the gateway on the stack default localhost port
hermes gateway run
# If your local Hermes uses a different port, set:
# HERMES_LOCALHOST_PORT=<your-port>
# (URL is derived as http://host.docker.internal:<your-port> at compose-render time.)
4.6.3. disabled¶
HERMES_SOURCE=disabled
litellm-init automatically omits the hermes-agent row from the model_list when disabled
4.7. LIGHTRAG_SOURCE¶
LightRAG runs out-of-process as either an in-stack container or a host-installed process.
container— Pullsghcr.io/hkuds/lightrag:v1.5.4and runs it onbackend-network. Storage backends are adapted from existing services (Supabase pgvector, Neo4j, Redis); when any of those isdisabled, LightRAG falls back to in-process file backends.localhost— Expects an existing LightRAG running on the host atLIGHTRAG_LOCALHOST_PORT(default 63068). Backend-network consumers reach it viahost.docker.internal.disabled—LIGHTRAG_ENDPOINTempties; hermes/n8n/backend skip the LightRAG capability; LiteLLM'smodel_listomits thelightragentry.
Role-specific LLM overrides are optional and preserve the single-model fallback when left empty:
LIGHTRAG_LLM_MODEL=qwen3.8:latest
LIGHTRAG_EXTRACT_LLM_MODEL=mistral-small3.2:24b
LIGHTRAG_KEYWORD_LLM_MODEL=mistral-small3.2:24b
LIGHTRAG_QUERY_LLM_MODEL=qwen3.8:latest
LIGHTRAG_QUERY_ENABLE_RERANK=false
LIGHTRAG_QUERY_TOP_K=10
LIGHTRAG_QUERY_CHUNK_TOP_K=5
LIGHTRAG_QUERY_MAX_TOTAL_TOKENS=12000
Use EXTRACT and KEYWORD for high-volume structured extraction work and QUERY for final answer generation. For local Ollama deployments, a cheaper non-reasoning extraction model usually keeps indexing responsive while allowing query answering to use the project-selected stronger model. Empty role-specific values inherit the base LLM_MODEL, so existing deployments do not need to set these variables.
The LIGHTRAG_QUERY_* knobs map to LightRAG's native query defaults and must stay set to concrete numbers (LightRAG parses them as integers and rejects empty strings). LIGHTRAG_QUERY_ENABLE_RERANK defaults to false because LightRAG's built-in rerank clients are not wire-compatible with TEI's /rerank route — leave it off unless routing through a compatible adapter. See the LightRAG service README for the full query-parameter reference.
4.8. RAY_SOURCE¶
Ray is the stack's distributed-compute substrate (head + worker containers, infra category). Consumers reach it via RAY_ADDRESS set per source by the bootstrapper's _generate_ray_config() hook. See Ray service README for the full configuration reference.
4.8.1. disabled (Default)¶
RAY_SOURCE=disabled
/api/ray/* returns 503 and JupyterHub notebooks calling ray.init() error cleanly
- Pros: Zero footprint
- Cons: No parallel job submission
- Requirements: None
4.8.2. ray-container-cpu¶
RAY_SOURCE=ray-container-cpu
RAY_WORKER_COUNT=2 # number of ray-worker replicas; 0 = head-only
ray.localhost, REST job-submission API, client server reachable from host Python via ray://localhost:${RAY_CLIENT_PORT}
- Cons: CPU-only — slow for heavy ML workloads. shm_size: 8gb required (compose handles this; rootless Docker may not honor it)
- Requirements: ~2-3 GB image disk + ~1 GB RAM per worker
4.8.3. ray-container-gpu¶
RAY_SOURCE=ray-container-gpu
RAY_WORKER_COUNT=2
4.9. PROMETHEUS_SOURCE¶
Prometheus is the stack's metrics scraper + TSDB, bundled with node-exporter (host metrics) and cAdvisor (container metrics) as one co-lifecycled family. The bootstrapper's _generate_prometheus_config() hook also scales the postgres-exporter (in services/supabase/) and redis-exporter (in services/redis/) sidecars from this same source. See Prometheus service README for scrape targets and configuration details.
4.9.1. disabled (Default)¶
PROMETHEUS_SOURCE=disabled
container
- Requirements: None
4.9.2. container¶
PROMETHEUS_SOURCE=container
PROMETHEUS_RETENTION_DAYS=7 # 1..365 — wizard prompts inline on the source step
jupyter/datascience-notebook with no /metrics; the third-party Hermes image likewise has no /metrics endpoint)
- Pros: 15 pre-configured scrape jobs, recording-rules folder ready to extend, Kong-aliased UI at prometheus.localhost
- Cons: cAdvisor polls every container every 5s and node-exporter polls /proc continuously — non-trivial overhead on a laptop
- Requirements: ~500 MB image disk + retention-day-dependent disk for the TSDB volume
4.10. GRAFANA_SOURCE¶
Grafana is the user-facing dashboards + unified alerting UI on top of Prometheus. The Prometheus datasource is pre-provisioned (URL interpolated from ${PROMETHEUS_ENDPOINT} at boot) plus 7 starter dashboards (stack overview, LiteLLM, Kong, Postgres+Redis, containers+host, n8n, app-tier). See Grafana service README for the dashboard catalog and admin-password lifecycle.
4.10.1. disabled (Default)¶
GRAFANA_SOURCE=disabled
container if you only want raw metrics via Prom's own UI
- Pros: Zero footprint
- Cons: No dashboards
- Requirements: None
4.10.2. container¶
GRAFANA_SOURCE=container
GRAFANA_ADMIN_USERNAME=admin # override only if you want a different login
GRAFANA_ADMIN_PASSWORD=... # auto-generated on first bootstrap; persisted to .env
grafana.localhost
- Pros: Admin login + datasource provisioning happen automatically; sign-up disabled; anonymous-read off by default
- Cons: When PROMETHEUS_SOURCE=disabled, every panel shows "datasource unreachable" — pair with --prometheus-source container for a working setup
- Requirements: ~300 MB image disk + small named volume for SQLite
4.11. SPARK_SOURCE¶
Spark is a standalone Apache Spark cluster (master + N workers + history server + dedicated spark-connect gRPC sidecar + one-shot spark-init) sitting in the data band. It exposes a Spark Connect endpoint on :15002 via the sidecar for in-stack thin clients. JupyterHub receives SPARK_REMOTE=sc://spark-connect:15002 for PySpark Connect notebooks, while Zeppelin is seeded for the stock standalone Spark interpreter path (spark.master=spark://spark-master:7077) because Zeppelin's launcher uses spark-submit. Backend wiring remains a future service-level integration. The local Spark image also bakes iceberg-spark-runtime-4.1_2.13:1.11.0 plus iceberg-aws-bundle:1.11.0 and preconfigures a lakehouse Iceberg REST catalog at http://iceberg-rest:8181, including MinIO S3FileIO endpoint, scoped Iceberg service-account credentials, path-style access, and client.region=us-east-1; this catalog is active when ICEBERG_REST_SOURCE=container and inert for ML-only Spark users who leave Iceberg REST disabled. JupyterHub also carries boto3, s3fs, pyiceberg[s3fs], pyarrow, and duckdb with MinIO and Iceberg REST env so Python notebooks can list buckets, load the REST catalog, and query Arrow data locally. See Spark service README, JupyterHub service README, and Zeppelin service README for the client paths.
4.11.1. disabled (Default)¶
SPARK_SOURCE=disabled
pyspark will fail
- Requirements: None
4.11.2. container¶
SPARK_SOURCE=container
SPARK_WORKER_COUNT=2 # number of spark-worker replicas; 1..8 — wizard prompts inline
spark.localhost + spark-history.localhost, Spark Connect on :15002, default lakehouse Iceberg REST catalog when iceberg-rest is enabled.
- Cons: Each worker reserves CPU + RAM (defaults to 1 core / 1 GB); heavy on laptops above 2 workers
- Containers: spark-master, spark-worker-1..N, spark-history, spark-connect (gRPC Connect sidecar), spark-init (one-shot — creates the spark-history MinIO bucket)
- Requirements: ~3 GB image disk + ~1 GB RAM per worker
4.12. TEI_RERANKER_SOURCE¶
Cross-encoder reranker inference server (default model mixedbread-ai/mxbai-rerank-base-v1). Exposes TEI's /rerank endpoint for consumers that send TEI-compatible request bodies.
container-cpu—ghcr.io/huggingface/text-embeddings-inference:cpu-1.9. Runs anywhere; ~150 ms per pair latency.container-gpu—:1.9image with NVIDIA reservation. ~15 ms per pair on RTX-class GPU.localhost— Existing TEI process on host atTEI_RERANKER_LOCALHOST_PORT(default 63049).disabled—TEI_RERANKER_ENDPOINTempties. LightRAG'sRERANK_BINDINGis emitted asnullin all stock SOURCE combinations so LightRAG disables reranking instead of crashing on an empty binding; direct LightRAG-to-TEI reranking requires an adapter because the request bodies differ.
4.13. ZEPPELIN_SOURCE¶
Zeppelin is the Spark-first notebook UI. zeppelin-init pre-configures the stock Spark interpreter against the in-cluster standalone master (spark.master=spark://spark-master:7077) plus MinIO S3A and the Iceberg REST lakehouse catalog; Spark Connect remains the JupyterHub/direct-client path. The JDBC interpreter ships with Supabase Postgres credentials in env vars but requires a one-time UI-driven postgres profile setup (see Zeppelin service README §4). Hard-gated on Spark — ZEPPELIN_SOURCE=container with SPARK_SOURCE=disabled errors out at bootstrap.
4.13.1. disabled (Default)¶
ZEPPELIN_SOURCE=disabled
4.13.2. container¶
ZEPPELIN_SOURCE=container
SPARK_SOURCE=container # REQUIRED — Zeppelin hard-fails without Spark
http://127.0.0.1:${ZEPPELIN_PORT}, and persistent notebooks in a named volume. JDBC interpreter ships with credentials in env but needs a one-time UI setup.
- Cons: Adds ~1.5 GB image disk + ~512 MB RAM
- Containers: zeppelin, zeppelin-init (one-shot — seeds and restarts the Spark interpreter when Atlas-owned settings drift)
- Requirements: SPARK_SOURCE=container
4.14. JENKINS_SOURCE¶
Jenkins is the optional Maven Spark app builder for the data-eng track. Atlas provides the Jenkins controller, JCasC configuration, Maven runtime, MinIO mc client, and generated admin login. Downstream projects provide repositories, Jenkinsfiles, seed jobs, and project credentials. Hard-gated on MinIO — JENKINS_SOURCE=container with MINIO_SOURCE=disabled errors out at bootstrap because publishing to the jars bucket is part of the service contract.
4.14.1. disabled (Default)¶
JENKINS_SOURCE=disabled
4.14.2. container¶
JENKINS_SOURCE=container
MINIO_SOURCE=container # REQUIRED — Jenkins publishes artifacts to MinIO
JENKINS_ADMIN_PASSWORD=... # auto-generated on first bootstrap; persisted to .env
mvn -q package and mc cp target/*.jar to s3a://jars/<app>/<version>/app.jar
- Pros: JCasC-managed admin user, Kong-aliased UI at jenkins.localhost, Maven + MinIO client baked into the image, persistent Jenkins home
- Cons: Adds controller image/build time and a persistent volume; Atlas intentionally ships no downstream project jobs
- Containers: jenkins
- Requirements: MINIO_SOURCE=container
4.15. AIRFLOW_SOURCE¶
Airflow is a code-defined DAG orchestrator running LocalExecutor (no Celery / Redis broker — the metadata DB is Supabase Postgres). The image bundles apache-airflow-providers-openai (LiteLLM-wired) — LangChain support runs via langchain-openai + PythonOperator; there is no apache-airflow-providers-langchain package on PyPI. It also installs Java 17, exposes PySpark's spark-submit, and carries S3A/Iceberg jars so SparkSubmitOperator can submit a JAR from s3a://jars/... to spark://spark-master:7077. The documented lakehouse path uses deploy_mode="cluster" so the driver runs on Atlas Spark workers while Airflow acts as the submit client. airflow-init seeds Connection objects per sibling source: postgres_supabase, litellm_default, and redis_default (always-on — required deps and locked-source services), spark_default (gated on SPARK_SOURCE=container, seeded for cluster SparkSubmit), minio_default (gated on MINIO_SOURCE=container), weaviate_default (gated on WEAVIATE_SOURCE=container), neo4j_default (gated on NEO4J_GRAPH_DB_SOURCE=container). DAG tasks should keep using hooks/operators such as S3Hook(aws_conn_id="minio_default") and SparkSubmitOperator(conn_id="spark_default"); standalone docker exec ... python ... probes are outside a task execution context and can see AirflowNotFoundException from BaseHook.get_connection(...) even when the CLI shows the Connection row. For those probes, read the metadata DB with airflow.settings.Session + airflow.models.Connection instead. See Airflow service README §4 for the full seeded Connections matrix, the example DAG, and the lakehouse_spark_submit_smoke validation DAG.
4.15.1. disabled (Default)¶
AIRFLOW_SOURCE=disabled
4.15.2. container¶
AIRFLOW_SOURCE=container
# Username is hardcoded `admin` — there is no AIRFLOW_ADMIN_USERNAME knob.
AIRFLOW_ADMIN_PASSWORD=... # auto-generated on first bootstrap; persisted to .env
AIRFLOW_FERNET_KEY=... # auto-generated; encrypts Connections + Variables at rest
AIRFLOW_SECRET_KEY=... # auto-generated; AIRFLOW__API__SECRET_KEY signs inter-process payloads (DagFileProcessor→scheduler RPC, deferrable triggers, multi-scheduler JWTs) in Airflow 3.x
AIRFLOW_DB_USER=airflow # Postgres role on supabase-db
AIRFLOW_DB_PASSWORD=... # auto-generated
airflow.localhost, REST API under the same alias at /api/v2/, 7 Connections auto-seeded (postgres_supabase / litellm_default / redis_default always; spark_default / minio_default / weaviate_default / neo4j_default gated on the matching sibling being container-sourced), manual lakehouse_spark_submit_smoke DAG submits a validation JAR from s3a://jars/ and records Spark History when Spark + MinIO + Iceberg REST are enabled
- Cons: ~2 GB image disk + ~1.5 GB RAM for the webserver + scheduler + dag-processor combo
- Containers: airflow-init (one-shot), airflow-webserver, airflow-scheduler, airflow-dag-processor (Airflow 3.x REQUIRES a standalone DAG processor — the scheduler no longer parses DAGs in-process)
- Requirements: Supabase Postgres reachable (always-on)
4.16. MCP_SERVERS_SOURCE¶
Curated MCP Servers expose Atlas' first Model Context Protocol tool surface. The first slice is intentionally narrow: read-only Postgres queries, Neo4j schema/read Cypher, and SearXNG web search over Streamable HTTP at /mcp. Open WebUI and Hermes should consume it directly where possible; LiteLLM MCP Gateway remains an explicit opt-in path for model-facing tools under LiteLLM policy.
4.16.1. disabled (Default)¶
MCP_SERVERS_SOURCE=disabled
4.16.2. container¶
MCP_SERVERS_SOURCE=container
NEO4J_GRAPH_DB_SOURCE=container # REQUIRED
SEARXNG_SOURCE=container # REQUIRED
mcp.localhost.
- Cons: Tool output is untrusted and may include sensitive local data; clients need explicit operator consent and credentials.
- Requirements: NEO4J_GRAPH_DB_SOURCE=container and SEARXNG_SOURCE=container.
4.17. CRAWL4AI_SOURCE¶
Crawl4AI is Atlas' optional browser-backed extraction API. When enabled, Atlas runs the upstream Docker server on port 11235, publishes crawl4ai.localhost, generates CRAWL4AI_API_TOKEN, and exposes CRAWL4AI_ENDPOINT=http://crawl4ai:11235 to Local Deep Researcher and n8n.
4.17.1. disabled (Default)¶
CRAWL4AI_SOURCE=disabled
LOCAL_DEEP_RESEARCHER_FULL_PAGE_MODE=disabled
LOCAL_DEEP_RESEARCHER_FULL_PAGE_MODE=builtin is selected.
- Requirements: None.
4.17.2. container¶
CRAWL4AI_SOURCE=container
LOCAL_DEEP_RESEARCHER_FULL_PAGE_MODE=crawl4ai # optional consumer mode
CRAWL4AI_API_TOKEN=... # auto-generated on first bootstrap
crawl4ai.localhost, bearer-token protected API, n8n HTTP Request compatibility, Local Deep Researcher full-page adapter.
- Cons: Adds a Playwright/Chromium-based container; crawling arbitrary internal URLs remains disabled unless CRAWL4AI_ALLOW_INTERNAL_URLS=true is deliberately set.
- Containers: crawl4ai.
- Requirements: None for the service itself. LOCAL_DEEP_RESEARCHER_FULL_PAGE_MODE=crawl4ai requires CRAWL4AI_SOURCE=container and fails early otherwise.
4.18. TIKA_SOURCE¶
Apache Tika is Atlas' optional fallback text extractor for long-tail document formats. When enabled, Atlas exposes TIKA_ENDPOINT to the Backend and n8n. The Backend keeps Docling first for supported/unknown formats and uses Tika only for explicit unsupported-format responses or known long-tail formats such as EML, MSG, RTF, ODT, ODS, ODP, ZIP, TAR, GZIP, and BZIP2.
4.18.1. disabled (Default)¶
TIKA_SOURCE=disabled
4.18.2. container¶
TIKA_SOURCE=container
TIKA_ENDPOINT=http://tika:9998 # auto-managed
tika.localhost, direct host port via TIKA_PORT, backend/n8n env wiring, bounded backend size and timeout controls.
- Cons: Plain-text-only degraded extraction; no malware scanning or archive quarantine in v1.
- Containers: tika.
- Requirements: None.
4.18.3. tika-localhost¶
TIKA_SOURCE=tika-localhost
TIKA_LOCALHOST_PORT=9998
tika.localhost through host.docker.internal.
- Cons: Operator must keep the host Tika process patched and running.
- Requirements: Host Tika server listening on TIKA_LOCALHOST_PORT.
4.19. LANGFUSE_SOURCE¶
Langfuse is Atlas' optional LLM observability surface. When enabled, Atlas runs Langfuse web, worker, and ClickHouse containers; provisions a dedicated Supabase Postgres database plus Langfuse object-store credentials; and wires LiteLLM with Langfuse tracing keys so OpenAI-compatible requests through LiteLLM produce traces, latency, and cost records. It appears in the AI and ML tracks (gen-ai-rag, gen-ai-eng, gen-ai-creative, ml-eng, all) and stays out of the data-engineering track unless a future data-quality/eval workflow needs it directly.
4.19.1. disabled (Default)¶
LANGFUSE_SOURCE=disabled
4.19.2. container¶
LANGFUSE_SOURCE=container
MINIO_SOURCE=container # REQUIRED — Langfuse uses S3-compatible blob storage
LANGFUSE_PUBLIC_KEY=... # auto-generated on first bootstrap
LANGFUSE_SECRET_KEY=... # auto-generated on first bootstrap
langfuse.localhost, generated first-run credentials, dedicated ClickHouse analytics store, dedicated Supabase Postgres database, dedicated MinIO bucket and service account, automatic LiteLLM success_callback tracing.
- Cons: Adds a stateful ClickHouse volume plus web/worker containers; only LiteLLM-routed calls are traced in the first slice.
- Containers: langfuse-init (one-shot), langfuse-web, langfuse-worker, langfuse-clickhouse.
- Requirements: Supabase Postgres and Redis are always-on; MINIO_SOURCE=container is required.
4.20. MLFLOW_SOURCE¶
MLflow is Atlas' optional experiment tracking and artifact registry surface for the ML Engineering track. When enabled, Atlas runs a tracking server backed by a dedicated Supabase Postgres database and a scoped MinIO artifact bucket. JupyterHub receives MLFLOW_TRACKING_URI=http://mlflow:5000 so notebooks can log runs, metrics, parameters, and artifacts without direct MinIO credentials.
4.20.1. disabled (Default)¶
MLFLOW_SOURCE=disabled
4.20.2. container¶
MLFLOW_SOURCE=container
MINIO_SOURCE=container # REQUIRED — MLflow stores run artifacts in MinIO
MLFLOW_TRACKING_URI=... # auto-managed as http://mlflow:5000
mlflow.localhost, Postgres-backed run metadata, MinIO-backed artifact persistence, generated DB and MinIO credentials, notebook-friendly tracking URI.
- Cons: Adds an app container plus one-shot DB init; model promotion automations and serving are out of scope for the first slice.
- Containers: mlflow-init (one-shot), mlflow.
- Requirements: Supabase Postgres is always-on; MINIO_SOURCE=container is required.
4.21. LABEL_STUDIO_SOURCE¶
Label Studio is Atlas' optional dataset review and annotation surface for the ML Engineering track. When enabled, Atlas runs Label Studio CE with a dedicated Supabase Postgres database and a scoped MinIO bucket for S3-compatible media/upload storage. JupyterHub receives LABEL_STUDIO_URL, LABEL_STUDIO_API_URL, and LABEL_STUDIO_API_KEY so notebooks can create projects, push tasks, export annotations, and then hand reviewed outputs to MLflow or Weaviate.
4.21.1. disabled (Default)¶
LABEL_STUDIO_SOURCE=disabled
4.21.2. container¶
LABEL_STUDIO_SOURCE=container
MINIO_SOURCE=container # REQUIRED — Label Studio stores media/uploads in MinIO
LABEL_STUDIO_API_URL=... # auto-managed as http://label-studio:8080
label-studio.localhost, Postgres-backed app metadata, MinIO-backed media storage, generated admin/API credentials, notebook-friendly SDK path.
- Cons: Adds an app container plus one-shot DB init; Label Studio CE has its own auth model, so broad multi-user usage should wait for SSO/permissions work.
- Containers: label-studio-init (one-shot), label-studio.
- Requirements: Supabase Postgres is always-on; MINIO_SOURCE=container is required.
4.22. VERBA_SOURCE¶
Verba is Atlas' optional Weaviate RAG demo UI for the RAG track. It is useful as a visible sample ingest/query path over Atlas Weaviate and LiteLLM, but upstream Verba is archived and discontinued, so Atlas keeps it disabled by default and documents it as a reference UI rather than a maintained strategic runtime.
4.22.1. disabled (Default)¶
VERBA_SOURCE=disabled
4.22.2. container¶
VERBA_SOURCE=container
WEAVIATE_SOURCE=container # REQUIRED — localhost Weaviate is also supported
VERBA_ENDPOINT=... # auto-managed as http://verba:8000
VERBA_Document.
- Pros: Kong-aliased UI at verba.localhost, isolated Verba-owned Weaviate classes, LiteLLM OpenAI-compatible generator/embedding wiring, and an explicit sample workflow for RAG demos.
- Cons: Upstream is archived/discontinued, single-user, and latest-only on Docker Hub; Atlas pins the observed image digest and does not treat Verba as a secure multi-user product surface.
- Containers: verba.
- Requirements: LiteLLM is always-on; WEAVIATE_SOURCE must be container or localhost. Docling is optional and documented as a manual pre-processing path, not a hard dependency.
5. Configuration Patterns¶
5.1. Development Setup¶
Best for local development with minimal resources:
./start.sh --llm-provider-source ollama-localhost \
--comfyui-source localhost \
--weaviate-source container \
--n8n-source disabled \
--searxng-source disabled
5.2. Production Setup¶
Best for production with full features:
./start.sh --llm-provider-source ollama-container-gpu \
--comfyui-source container-gpu \
--weaviate-source container \
--n8n-source container \
--searxng-source container
5.3. Minimal Setup¶
Best for testing or resource-constrained environments:
./start.sh --llm-provider-source none \
--cloud-openai-source enabled \
--comfyui-source disabled \
--weaviate-source disabled \
--n8n-source disabled \
--searxng-source disabled
Make sure OPENAI_API_KEY (or whichever cloud key matches your enabled CLOUD_*_SOURCE) is set in .env.
5.4. Mixed Setup¶
Combine different approaches for optimal performance:
# Local LLM, containerized GPU image generation and data services, no search.
./start.sh --llm-provider-source ollama-localhost \
--comfyui-source container-gpu \
--weaviate-source container \
--n8n-source container \
--searxng-source disabled
6. Environment File vs CLI Overrides¶
6.1. Using .env File¶
Persistent configuration for regular use:
# Edit .env file
BASE_PORT=63000
LLM_PROVIDER_SOURCE=ollama-localhost
COMFYUI_SOURCE=container-gpu
N8N_SOURCE=container
# Start with file configuration
./start.sh
BASE_PORT is the preferred way to move the whole stack to another port range. Individual *_PORT variables are advanced overrides; normal users should change BASE_PORT manually or run ./start.sh --base-port <port>.
6.2. Using CLI Overrides¶
Temporary configuration for testing:
# Override without changing .env
./start.sh --llm-provider-source ollama-localhost --comfyui-source disabled
# Next run uses .env settings again
./start.sh
7. Service Dependencies¶
Understanding which services depend on others:
7.1. Core Dependencies¶
- Open WebUI / Backend / n8n / JupyterHub / Local Deep Researcher / OpenClaw → All read
LITELLM_BASE_URL+LITELLM_API_KEYfor LLM access. LiteLLM is always-on; the actual upstream is whateverLLM_PROVIDER_SOURCEand theCLOUD_*_SOURCEtoggles select. - Backend API → Depends on database services (PostgreSQL, Redis)
- n8n workflows → Often use Weaviate for vector operations
7.2. Optional Dependencies¶
- ComfyUI → Independent, can be disabled without affecting other services
- SearxNG → Independent privacy search
- Weaviate → Optional unless needed for semantic search
8. Troubleshooting SOURCE Configurations¶
8.1. Common Issues¶
Service won't start with localhost SOURCE:
# Check if service is running locally
curl http://localhost:11434/api/tags # Ollama (LiteLLM upstream when LLM_PROVIDER_SOURCE=ollama-localhost)
curl http://localhost:63040/health/liveliness # LiteLLM gateway (always-on)
curl http://localhost:8000/ # ComfyUI default localhost URL
curl http://localhost:8188/ # ComfyUI if you overrode COMFYUI_LOCALHOST_PORT to 8188
# Check service logs
docker logs ${PROJECT_NAME}-backend -f
Port conflicts:
# Use different base port
./start.sh --base-port 64000
# Check port usage (Open WebUI default; substitute your conflicting port)
lsof -i :63096
Kong routing not working:
# Kong config is dynamically generated at every startup — to debug routes,
# inspect the generator + the KONG_* env vars it consumes:
cat bootstrapper/utils/kong_config_generator.py
env | grep ^KONG_
# Verify hosts file
./start.sh --setup-hosts
8.2. Debug Commands¶
# Check active SOURCE values
env | grep -E "(OLLAMA|COMFYUI|N8N|WEAVIATE)_SOURCE"
# Test service connectivity (LLM goes via LiteLLM, not Ollama directly)
docker exec ${PROJECT_NAME}-backend curl http://${PROJECT_NAME}-litellm:4000/health/liveliness
docker exec ${PROJECT_NAME}-litellm curl http://${PROJECT_NAME}-ollama:11434/api/tags
docker exec ${PROJECT_NAME}-kong-api-gateway curl http://${PROJECT_NAME}-comfyui:18188/
# Monitor resource usage
docker stats
9. Deployment profile (--profile prod)¶
The deployment profile is now a declarative bundle defined in bootstrapper/profiles.yml (#755). Two platform bundles ship — default and prod (dev is accepted everywhere as an alias for default) — and each declares three fields:
sources— per-service source selections, each either a concrete option id (e.g.prodselectsprometheus: container+grafana: container) or the host-adaptiveautosentinel (#753).env— profile-managed values (e.g.prod'sLOG_MAX_SIZE=10m/LOG_MAX_FILE=3), applied only when the variable is unset or empty — an operator-set value is kept.host_bind_ip— the published-port interface prefix:prodasserts127.0.0.1:(ports reachable only from the host, with the public edge fronting Kong);defaultleaves ports on0.0.0.0.
./start.sh --profile prod (or the wizard's profile step) applies the bundle. The active profile is tracked via the ATLAS_PROFILE_APPLIED marker, and a profile switch first resets the prior profile's asserted sources to their service defaults, so transitions leave no source residue. An explicit --<svc>-source CLI flag passed on the current run always wins over the profile's selection. Consumers may pin profile: and override individual fields via profile_overrides: in atlas.consumer.yml — see reusing-atlas.md §6.1 for the consumer view. Per-service resource limits (*_MEMORY_LIMIT / *_CPU_LIMIT) remain always-on .env defaults, independent of the profile.
For more troubleshooting help, see ../quick-start/troubleshooting.md.