- Replace stale Streamlit Dockerfile with self-contained release build (uvicorn/FastAPI; Streamlit removed in #104) - cf-orch BSL client installed via BuildKit secret in release CI; community builds skip it gracefully and fall back to local backends - compose.yml api build now uses single-repo context (context: .) so self-hosters can build without sibling repo setup - Add image: tags to api + web services in compose.yml and compose.demo.yml so docker compose pull works for pre-built images - Enable Docker push in release.yml: api + web to GHCR on v* tags (was disabled pending BSL registry policy — cf-agents#3 resolved) - cloud image (compose.cloud.yml / Dockerfile.cfcore) unchanged: never published, built on Heimdall with sibling repos available - .dockerignore: add plain_text_resume.yaml and adzuna.yaml
70 lines
2.3 KiB
YAML
70 lines
2.3 KiB
YAML
# compose.demo.yml — Public demo stack for demo.circuitforge.tech/peregrine
|
|
#
|
|
# Runs a fully isolated, neutered Peregrine instance:
|
|
# - DEMO_MODE=true: blocks all LLM inference in llm_router.py
|
|
# - demo/config/: pre-seeded demo user profile, all backends disabled
|
|
# - demo/data/: isolated SQLite DB (no personal job data)
|
|
# - No personal documents mounted
|
|
# - Port 8504 (separate from the personal instance on 8502)
|
|
#
|
|
# Usage:
|
|
# docker compose -f compose.demo.yml --project-name peregrine-demo up -d
|
|
# docker compose -f compose.demo.yml --project-name peregrine-demo down
|
|
#
|
|
# Caddy demo.circuitforge.tech/peregrine* → host port 8504
|
|
|
|
services:
|
|
|
|
api:
|
|
image: ghcr.io/circuitforgellc/peregrine:latest
|
|
build: .
|
|
command: >
|
|
bash -c "uvicorn dev_api:app --host 0.0.0.0 --port 8601"
|
|
volumes:
|
|
- ./demo/config:/app/config
|
|
- ./demo:/app/demo:ro # seed.sql lives here; read-only
|
|
# /app/data is tmpfs — ephemeral, resets on every container start
|
|
tmpfs:
|
|
- /app/data
|
|
environment:
|
|
- DEMO_MODE=true
|
|
- STAGING_DB=/app/data/staging.db
|
|
- DEMO_SEED_FILE=/app/demo/seed.sql
|
|
- DOCS_DIR=/tmp/demo-docs
|
|
- PYTHONUNBUFFERED=1
|
|
- PYTHONLOGGING=WARNING
|
|
# No API keys — inference is blocked by DEMO_MODE before any key is needed
|
|
depends_on:
|
|
searxng:
|
|
condition: service_healthy
|
|
extra_hosts:
|
|
- "host.docker.internal:host-gateway"
|
|
restart: unless-stopped
|
|
# No host port — nginx proxies /api/ → api:8601 internally
|
|
|
|
web:
|
|
# Built with VITE_BASE_PATH=/peregrine/ — not the same as the published
|
|
# peregrine-web:latest image (which uses base path /). Always build locally.
|
|
build:
|
|
context: .
|
|
dockerfile: docker/web/Dockerfile
|
|
args:
|
|
VITE_BASE_PATH: /peregrine/
|
|
ports:
|
|
- "8504:80" # demo.circuitforge.tech/peregrine* → host:8504
|
|
depends_on:
|
|
- api
|
|
restart: unless-stopped
|
|
|
|
searxng:
|
|
image: searxng/searxng:latest
|
|
volumes:
|
|
- ./docker/searxng:/etc/searxng:ro
|
|
healthcheck:
|
|
test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 3
|
|
restart: unless-stopped
|
|
# No host port published — internal only; demo app uses it for job description enrichment
|
|
# (non-AI scraping is allowed; only LLM inference is blocked)
|