Skip to main content

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:

SESSION_SECRET   CREDS_KEY   CREDS_IV   JWT_SECRET   JWT_REFRESH_SECRET
MEILI_MASTER_KEY   MONGO_ROOT_USERNAME   MONGO_ROOT_PASSWORD
GARAGE_RPC_SECRET   GARAGE_ADMIN_TOKEN   MINIO_ACCESS_KEY   MINIO_SECRET_KEY

You can fill blanks by hand, or regenerate them:

intelliask secrets gen            # fill only EMPTY values
intelliask secrets rotate         # regenerate ALL (fresh installs only)

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:

# config/.env (pre-set)
REGISTRY=registry.intelliask.mt/

To pull from your own registry instead, point REGISTRY at your mirror:

# config/.env
REGISTRY=registry.example.com/intelliask/

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/:

# config/intelliask.compose.yml
services:
  intelliask:
    # was: image: ${REGISTRY:-}${INTELLIASK_IMAGE:-}
    image: registry.example.com/intelliask/intelliask:v0.8.7

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:

intelliask update intelliask                     # pull the tag already in .env
intelliask update --version v0.9.0 intelliask    # set the tag, then pull + recreate

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:

intelliask restart intelliask

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 fileServiceImageHost port
intelliask.compose.ymlintelliaskintelliask3080
codeapi.compose.ymlcodeapi-apicodeapi-apiinternal
codeapi.compose.ymlcodeapi-service-workercodeapi-workerinternal
codeapi.compose.ymlcodeapi-file-servercodeapi-file-serverinternal
codeapi.compose.ymlcodeapi-tool-call-servercodeapi-tool-call-serverinternal
codeapi.compose.ymlcodeapi-egress-gatewaycodeapi-egress-gatewayinternal
codeapi.compose.ymlcodeapi-sandbox-runnercodeapi-sandbox-runnerinternal
codeapi.compose.ymlredisredis:7-alpineinternal
mongodb.compose.ymlmongodbmongointernal
meilisearch.compose.ymlmeilisearchmeilisearchinternal
rag.compose.ymlrag-apiintelliask-rag-apiinternal
rag.compose.ymlvectordb (optional)pgvectorinternal
codeapi.compose.ymlgarage (optional)garageinternal
exporter.compose.ymlexporter (optional)metrics-exporter9100
proxy.compose.ymlproxy (optional)caddy443 / 80

Operational notes

  • MongoDB runs with authentication; the root user is bootstrapped from MONGO_ROOT_USERNAME / MONGO_ROOT_PASSWORD on the first start with an empty data volume. Never expose Mongo outside the Compose network.
  • Code Interpreter (codeapi) is six services plus a bundled redis. The codeapi-sandbox-runner runs privileged to execute untrusted user code and needs host cgroup v2 and the language-runtime package tree under ${STORAGE_ROOT}/code-interpreter-packages before 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.yaml are 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:

intelliask module list                 # show every module and its state
intelliask module disable exporter     # stop + skip a module
intelliask module enable  exporter     # re-enable it
intelliask module disable garage --no-apply   # change .env only; apply later with `up`

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.

ModuleEffect when disabled
exporterNo Prometheus metrics exporter.
codeapiNo Code Interpreter (the Run Code feature is unavailable).
garageNo bundled S3 store — point the Code Interpreter at an external S3 with MINIO_ENDPOINT / MINIO_PORT.
ragNo RAG API — Chat-with-Files is unavailable. Disabled by default; needs an embeddings provider before enabling.
vectordbNo bundled pgvector database — point the RAG API at an external vector DB with DB_HOST / DB_PORT.
proxyNo 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.yml OR add to COMPOSE_FILE — Two ways to customize:
    • Place a docker-compose.override.yml in the same directory (Docker Compose auto-merges it)
    • OR create your own custom.compose.yml and add it to COMPOSE_FILE in config/.env

See Environment Variables > Docker Override for examples of substituting services and the official Docker Compose documentation for advanced orchestration patterns.

Last updated on