Docker Compose¶
Two Compose files cover the non-Dokploy cases:
| File | Image | When |
|---|---|---|
docker-compose.prebuilt.yml |
Pulled from GHCR | Default, fastest |
docker-compose.yml |
Built locally from docker/Dockerfile |
Forks, custom builds, pinned upstream ref |
Both read every setting from .env through ${VAR} interpolation,
bind the API to 127.0.0.1:8000, and declare two named volumes
(jeff-models, jeff-data).
Prebuilt image¶
git clone https://github.com/tommasomarchionni/jeff-docker.git
cd jeff-docker
cp .env.example .env
sed -i "s/^JEFF_API_KEYS=.*/JEFF_API_KEYS=$(openssl rand -hex 32)/" .env
docker compose -f docker-compose.prebuilt.yml up -d --wait
--wait returns once the container is healthy (first start includes the
model download, so it can take several minutes).
Build from source¶
docker compose up -d --build --wait
Pin the upstream revision for reproducible builds:
JEFF_REF=<commit-sha> docker compose build --no-cache
Exposing it on the network¶
By default only the host itself can reach Jeff. Options, from safest:
- Reverse proxy with TLS (Caddy, Traefik, Nginx Proxy Manager) on the
same host → keep
JEFF_BIND=127.0.0.1and proxy to127.0.0.1:8000. -
Shared Docker network with your other containers → remove
ports:and callhttp://jeff:8000from them:services: jeff: networks: [backend] networks: backend: external: true -
LAN only →
JEFF_BIND=0.0.0.0plus a host firewall rule allowing only your subnet. Never forward the port on your router.
Caddy example¶
jeff.example.com {
reverse_proxy 127.0.0.1:8000
}
Running multiple instances¶
Give each instance its own name, volumes and port:
JEFF_CONTAINER_NAME=jeff-base
JEFF_VOLUME_PREFIX=jeff-base
JEFF_HOST_PORT=8001
JEFF_MODEL_ID=knowledgator/gliformer-base-v1
JEFF_MODEL_PATH=/models/gliformer-base-v1
JEFF_NOUL_MODE=single
docker compose -p jeff-base --env-file .env.base -f docker-compose.prebuilt.yml up -d
Overriding without editing the files¶
Create compose.override.yml (picked up automatically with
docker-compose.yml, or pass it with -f):
services:
jeff:
environment:
JEFF_THREADS: "4"
labels:
com.centurylinklabs.watchtower.enable: "false"
Lifecycle¶
| Action | Command |
|---|---|
| Status / health | docker compose ps |
| Logs | docker compose logs -f jeff |
| Restart | docker compose restart jeff |
Apply .env changes |
docker compose up -d (recreates the container) |
| Update image | docker compose pull && docker compose up -d |
| Stop, keep model | docker compose down |
| Stop, delete model | docker compose down -v |