# Purpose: the settings compose.yaml, its overrides and caddy.conf read. Copy this file to # .env beside compose.yaml and fill in the lines that are empty. Nothing here is a # secret except WEBUI_SECRET_KEY, which you generate rather than copy. # Platform: all (Track M reads CHAT_HOST, LAN_IP, WEBUI_SECRET_KEY and the WEBUI_ADMIN_ lines) # Minimum memory: 8 GB # Assumes: `cp env-example.txt .env` and then an editor. Docker Compose reads .env from # the directory you run it in. Values are literal: no ~, no $HOME, no quotes. # Which Compose files every `docker compose` command in this directory uses, joined by # colons. Pick the line for your track and engine; leave the others commented out. # Track S or N, Ollama: #COMPOSE_FILE=compose.yaml:compose-nvidia.yaml # Track X, Ollama: #COMPOSE_FILE=compose.yaml:compose-amd.yaml # Track S or N, llama-server: #COMPOSE_FILE=compose.yaml:compose-nvidia.yaml:compose-llama-server.yaml # Track X, llama-server: #COMPOSE_FILE=compose.yaml:compose-amd.yaml:compose-llama-server.yaml # The name you will type into a browser. Anything under .home.arpa is reserved by RFC 8375 # for names that mean something inside one home network and nothing outside it. CHAT_HOST=chat.home.arpa # This machine's address on your home network, and nothing else. Find it with # `ip -4 -brief addr show scope global` on Linux or `ipconfig getifaddr en0` on macOS. # Compose refuses to start while this is empty. LAN_IP= # Generate with: openssl rand -hex 32 # Signs login tokens. Changing it logs everyone out; losing it is not fatal. WEBUI_SECRET_KEY= # The administrator, created on the front-end's first start before it accepts any # connection. The address is only a login name; nothing is sent to it. Generate a # temporary password with `openssl rand -base64 18`, change it in the web interface # after the first sign-in, then delete the WEBUI_ADMIN_PASSWORD line (task 7). WEBUI_ADMIN_NAME=Admin WEBUI_ADMIN_EMAIL= WEBUI_ADMIN_PASSWORD= # Context length the engine allocates per conversation slot, in tokens. The reality check # after this lab is how you choose your own number. OLLAMA_CONTEXT_LENGTH=8192 # Conversations the engine processes at the same time. On Ollama each one gets its own # OLLAMA_CONTEXT_LENGTH of key-value cache, so 2 costs twice the cache memory of 1. # On the llama-server path (compose-llama-server.yaml) the context is divided among the # slots instead, so memory stays the same and each slot gets # OLLAMA_CONTEXT_LENGTH / OLLAMA_NUM_PARALLEL tokens. OLLAMA_NUM_PARALLEL=1 # How long a model stays in memory after the last request (Ollama only; llama-server # keeps its one model loaded for as long as it runs). The Ollama default is 5m. OLLAMA_KEEP_ALIVE=30m # llama-server only (compose-llama-server.yaml). Image tags checked on 2026-09-13; the # b10868 images were built on 2026-09-09. Pick one: # Track S (arm64, CUDA 13): ghcr.io/ggml-org/llama.cpp:server-cuda13-b10868 # Track N, driver supports CUDA 13: ghcr.io/ggml-org/llama.cpp:server-cuda13-b10868 # Track N, driver supports CUDA 12 only: ghcr.io/ggml-org/llama.cpp:server-cuda-b10868 # Track X, Vulkan (the course default): ghcr.io/ggml-org/llama.cpp:server-vulkan-b10868 LLAMA_SERVER_IMAGE= # Absolute path of your model library, for example /home/you/models MODELS_DIR= # Path of the GGUF file inside MODELS_DIR LLAMA_MODEL_FILE=unsloth/Qwen3-4B-GGUF/Qwen3-4B-Q4_K_M.gguf # The model name the front-end will list LLAMA_MODEL_ALIAS=qwen3-4b