Configuration & Secrets
Everything is driven from config/.env — secrets, the image registry, image tags, storage, resource limits, the bundled Garage S3 store, and the service map.
Every setting lives in config/.env — the compose files contain no hardcoded
configuration, only ${VARIABLE} references. This page covers the values you'll
touch most.
config/.env — the single source of truth
config/.env holds all configuration and secrets. COMPOSE_FILE in it lists
every *.compose.yml that makes up the stack, which is how one docker compose up
brings them all up together. Which services actually run is decided by Docker
Compose profiles, not by editing that list: every service carries a profile
named after its module, and COMPOSE_PROFILES selects the active ones. The
intelliask binary rewrites COMPOSE_PROFILES on every command from your enabled
modules — see Optional modules.
After editing .env, apply changes with intelliask up (or up <service>
for one service).
Secrets
The secrets command (run automatically during provisioning) fills any blank
secret with a strong value. The managed secrets include:
You can fill blanks by hand, or regenerate them:
Don't rotate secrets on a live stack
Existing data volumes (Mongo/Postgres/Garage) keep the credentials they were
initialised with. Regenerating secrets with secrets rotate (or provision --rotate-secrets) on an already-initialised stack breaks access. Only do it on a
brand-new install, or wipe data first with intelliask down --volumes.
Image registry
Every image is referenced as ${REGISTRY:-}${<SERVICE>_IMAGE}, so the stack is
registry-agnostic. config/.env ships pointed at the public IntelliAsk registry,
which serves all images — the main app, the six codeapi-* code interpreter
images, and the supporting services — for anonymous pull, so no login is needed:
To pull from your own registry instead, point REGISTRY at your mirror:
If that registry needs auth, docker login registry.example.com on the host once and
pass --skip-login to provision. To switch one service rather than the whole
stack, edit that service's image line directly in its compose file under config/:
Updating an image
Push the new build under a new immutable tag, then let update pull + recreate that
one service. Either bump the matching <SERVICE>_IMAGE in config/.env first, or
pass the tag inline with --version:
Storage
All service data is bind-mounted under config/storage/ (one subfolder per service)
so it can be inspected and backed up directly on the host. Change the location with
STORAGE_ROOT in config/.env. Provisioning pre-creates the writable
subdirectories (uploads-chat, public-images, code-interpreter-packages,
license, license-state, …) with uid/gid 1000 ownership so the app can write to
them.
Resource limits
Every service has a CPU/memory ceiling from config/.env
(<SERVICE>_CPUS / <SERVICE>_MEMORY), with a matching fallback in each compose
file. The defaults are sized for a 4 GiB / 2 vCPU host (memory ceilings total
~3.3 GiB). Raise them per host as needed, then intelliask up to apply.
Check live usage with docker stats --no-stream.
Object storage (Garage S3)
The bundled garage service is a lightweight (~25 MB) self-hosted, S3-compatible
store used by the Code Interpreter. On first start, intelliask garage
(run automatically by provision) creates the cluster layout, the MINIO_BUCKET, and
a deterministic access key (MINIO_ACCESS_KEY / MINIO_SECRET_KEY). It is idempotent and
the S3 API stays internal-only (garage:3900).
Change the default S3 / Garage credentials
MINIO_ACCESS_KEY must be GK + 24 hex and MINIO_SECRET_KEY 64 hex for Garage to
accept the import. Change them — and GARAGE_RPC_SECRET / GARAGE_ADMIN_TOKEN —
before real use. To use an external S3 store instead, disable the bundled Garage
(intelliask module disable garage) and point MINIO_ENDPOINT /
MINIO_PORT at that host.
IntelliAsk runtime config
Application-level configuration (endpoints, agents, MCP servers, UI options) lives
in config/intelliask.yaml, mounted into the IntelliAsk container. Edit it
there and restart the app:
To add AI providers, see Custom Endpoints.
Per-component configuration
The tables below are the cross-stack overview. For a single service's own settings, config files, and independent update steps, see its page under Components — e.g. Code Interpreter or the Prometheus Exporter.
The service map
| Compose file | Service | Image | Host port |
|---|---|---|---|
intelliask.compose.yml | intelliask | intelliask | 3080 |
codeapi.compose.yml | codeapi-api | codeapi-api | internal |
codeapi.compose.yml | codeapi-service-worker | codeapi-worker | internal |
codeapi.compose.yml | codeapi-file-server | codeapi-file-server | internal |
codeapi.compose.yml | codeapi-tool-call-server | codeapi-tool-call-server | internal |
codeapi.compose.yml | codeapi-egress-gateway | codeapi-egress-gateway | internal |
codeapi.compose.yml | codeapi-sandbox-runner | codeapi-sandbox-runner | internal |
codeapi.compose.yml | redis | redis:7-alpine | internal |
mongodb.compose.yml | mongodb | mongo | internal |
meilisearch.compose.yml | meilisearch | meilisearch | internal |
rag.compose.yml | rag-api | intelliask-rag-api | internal |
rag.compose.yml | vectordb (optional) | pgvector | internal |
codeapi.compose.yml | garage (optional) | garage | internal |
exporter.compose.yml | exporter (optional) | metrics-exporter | 9100 |
proxy.compose.yml | proxy (optional) | caddy | 443 / 80 |
Operational notes
- MongoDB runs with authentication; the root user is bootstrapped from
MONGO_ROOT_USERNAME/MONGO_ROOT_PASSWORDon the first start with an empty data volume. Never expose Mongo outside the Compose network. - Code Interpreter (
codeapi) is six services plus a bundledredis. Thecodeapi-sandbox-runnerrunsprivilegedto execute untrusted user code and needs host cgroup v2 and the language-runtime package tree under${STORAGE_ROOT}/code-interpreter-packagesbefore the Run Code feature works. See Code Interpreter. - Exporter scrapes MongoDB and exposes Prometheus metrics on host port
9100. - External MCP servers referenced in
intelliask.yamlare reached over the network and are not part of this stack.
Optional modules
Some services are optional modules you can turn off when a deployment doesn't
need them, or when you want to point the stack at an external equivalent instead of
the bundled one. Toggle them with intelliask module:
Disabling a module drops its Compose profile from COMPOSE_PROFILES, so up,
start, status, update and friends skip its containers entirely. The choice is
recorded in DISABLED_MODULES in config/.env and survives restarts.
| Module | Effect when disabled |
|---|---|
exporter | No Prometheus metrics exporter. |
codeapi | No Code Interpreter (the Run Code feature is unavailable). |
garage | No bundled S3 store — point the Code Interpreter at an external S3 with MINIO_ENDPOINT / MINIO_PORT. |
rag | No RAG API — Chat-with-Files is unavailable. Disabled by default; needs an embeddings provider before enabling. |
vectordb | No bundled pgvector database — point the RAG API at an external vector DB with DB_HOST / DB_PORT. |
proxy | No reverse proxy — driven by PROXY_ENABLED; see Reverse Proxy. |
Core services (mongodb, meilisearch, intelliask) cannot be disabled — the app
depends on them.
RAG is disabled by default
Unlike the other optional modules, rag ships off: rag-api crash-loops
without a configured embeddings provider. Set one up (see
RAG API) and then intelliask module enable rag.
intelliask provision also offers to enable it interactively.
Alternative Deployment (Advanced)
For advanced users
The recommended approach is using the intelliask binary as described above. It handles provisioning, secrets, updates, and day-to-day operations without requiring Docker Compose expertise.
For advanced users who prefer manual control, you can deploy using the compose files directly with docker compose commands. This approach:
- Requires Docker Compose knowledge — You manage service orchestration, environment variables, secrets, and updates manually
- Enables full customization — Substitute any bundled service with your own infrastructure:
- Use your own S3 bucket instead of the bundled Garage
- Connect to a managed Redis, PostgreSQL (pgvector), or MongoDB instance
- Front with your own reverse proxy instead of the bundled Caddy
- Customize resource limits, networks, volumes, or add sidecars
- Override via
docker-compose.override.ymlOR add toCOMPOSE_FILE— Two ways to customize:- Place a
docker-compose.override.ymlin the same directory (Docker Compose auto-merges it) - OR create your own
custom.compose.ymland add it toCOMPOSE_FILEinconfig/.env
- Place a
See Environment Variables > Docker Override for examples of substituting services and the official Docker Compose documentation for advanced orchestration patterns.
Last updated on