Adds a fully neutered public demo for menagerie.circuitforge.tech/peregrine that shows the Peregrine UI without exposing any personal data or real LLM inference. scripts/llm_router.py: - Block all inference when DEMO_MODE env var is set (1/true/yes) - Raises RuntimeError with a user-friendly "public demo" message app/app.py: - IS_DEMO constant from DEMO_MODE env var - Wizard gate bypassed in demo mode (demo/config/user.yaml pre-seeds a fake profile) - Demo banner in sidebar: explains read-only status + links to circuitforge.tech compose.menagerie.yml (new): - Separate Docker Compose project (peregrine-demo) on host port 8504 - Mounts demo/config/ and demo/data/ — isolated from personal instance - DEMO_MODE=true, no API keys, no /docs mount - Project name: peregrine-demo (run alongside personal instance) demo/config/user.yaml: - Generic "Demo User" profile, wizard_complete=true, no real personal info demo/config/llm.yaml: - All backends disabled (belt-and-suspenders alongside DEMO_MODE block) demo/data/.gitkeep: - staging.db is auto-created on first run, gitignored via demo/data/*.db .gitignore: add demo/data/*.db Caddy routes menagerie.circuitforge.tech/peregrine* → 8504 (demo instance). Personal Peregrine remains on 8502, unchanged.
52 lines
1.7 KiB
YAML
52 lines
1.7 KiB
YAML
# compose.menagerie.yml — Public demo stack for menagerie.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 8503 (separate from the personal instance on 8502)
|
|
#
|
|
# Usage:
|
|
# docker compose -f compose.menagerie.yml --project-name peregrine-demo up -d
|
|
# docker compose -f compose.menagerie.yml --project-name peregrine-demo down
|
|
#
|
|
# Caddy menagerie.circuitforge.tech/peregrine* → host port 8504
|
|
|
|
services:
|
|
|
|
app:
|
|
build: .
|
|
ports:
|
|
- "8504:8501"
|
|
volumes:
|
|
- ./demo/config:/app/config
|
|
- ./demo/data:/app/data
|
|
# No /docs mount — demo has no personal documents
|
|
environment:
|
|
- DEMO_MODE=true
|
|
- STAGING_DB=/app/data/staging.db
|
|
- DOCS_DIR=/tmp/demo-docs
|
|
- STREAMLIT_SERVER_BASE_URL_PATH=peregrine
|
|
- 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
|
|
|
|
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)
|