Centralize demo config in .env and add bootstrap-stack.sh

Expand .env.example with ports, AI, Usenet, WireGuard, demo logins, and
bootstrap flags. One script creates dirs, downloads the model, starts
compose, heals gluetun, and configures SABnzbd from the same file.
This commit is contained in:
tim 2026-07-22 13:06:08 -07:00
parent 56ddb349b4
commit 3bf1726a99
7 changed files with 410 additions and 76 deletions

View file

@ -1,88 +1,167 @@
# Copy to .env and adjust. The compose file reads these values.
################################################################################
# arr-stack — single config file for a tech demo / fresh host
# Copy to .env and edit. Compose + bootstrap scripts read this file.
#
# Demo credentials (all local UIs): DEMO_USER / DEMO_PASS (default tim / asdfasdf)
# Security is intentionally weak for demos. Change before any real exposure.
#
# Fresh rebuild checklist:
# 1. Put a valid wireguard/wg0.conf (Endpoint IP + # EndpointHost = hostname)
# 2. cp .env.example .env && edit paths / host IP / usenet keys
# 3. ./scripts/bootstrap-stack.sh
################################################################################
# --- user / group that owns your media (run `id` on the host) ---
# =============================================================================
# Demo mode & shared login
# =============================================================================
DEMO_MODE=true
DEMO_USER=tim
DEMO_PASS=asdfasdf
# Used as OpenAI-compatible key for Bonsai / OpenHands / Open WebUI connections
OPENAI_API_KEY=sk-local-bonsai
# =============================================================================
# Host identity & paths
# =============================================================================
PUID=1000
PGID=1000
TZ=America/Los_Angeles
# --- your timezone (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) ---
TZ=Europe/Berlin
# --- host paths (relative to this folder is fine) ---
# Production-style (server):
# CONFIG_DIR=/opt/stack/config
# DATA_DIR=/storage
# BONSAI_MODELS_DIR=/opt/stack/models/bonsai
# AI_WORKSPACE_DIR=/opt/stack/workspace
# Laptop / relative demo:
CONFIG_DIR=./config
DATA_DIR=./data
BONSAI_MODELS_DIR=./models/bonsai
AI_WORKSPACE_DIR=./workspace
# --- your LAN subnet, so the qBittorrent WebUI stays reachable through
# gluetun's firewall. If your machine is 192.168.1.50, use 192.168.1.0/24
LAN_SUBNET=192.168.1.0/24
# LAN used by gluetun FIREWALL_OUTBOUND_SUBNETS (qBittorrent WebUI from LAN)
LAN_SUBNET=192.168.8.0/24
# Public hostname/IP other PCs use to open UIs (landing page, Forgejo ROOT_URL, …)
STACK_HOST=192.168.8.123
# WireGuard peer hostname (used by scripts/gluetun-endpoint-watch.sh when gluetun is unhealthy)
# =============================================================================
# Published ports (host → service)
# =============================================================================
LANDING_PORT=80
QB_WEBUI_PORT=8080
JELLYFIN_PORT=8096
SONARR_PORT=8989
RADARR_PORT=7878
LIDARR_PORT=8686
BAZARR_PORT=6767
PROWLARR_PORT=9696
SABNZBD_PORT=8085
OPEN_WEBUI_PORT=3000
BONSAI_PORT=8081
OPENHANDS_PORT=3001
FORGEJO_HTTP_PORT=3002
FORGEJO_SSH_PORT=2222
SEARXNG_PORT=8888
# =============================================================================
# WireGuard / gluetun
# =============================================================================
# Peer hostname for gluetun-endpoint-watch (must match provider; dig when unhealthy)
WIREGUARD_ENDPOINT_HOST=las-183-wg.whiskergalaxy.com
WIREGUARD_ENDPOINT_PORT=443
# Path to conf mounted into gluetun (create before first up)
WIREGUARD_CONF=./wireguard/wg0.conf
# =============================================================================
# Local AI (Ternary-Bonsai-27B on SER5 PRO / Ryzen 7735HS)
# Local AI — Ternary-Bonsai-27B
# =============================================================================
# GGUF weights directory (populated by scripts/download-bonsai-model.sh)
BONSAI_MODELS_DIR=./models/bonsai
BONSAI_MODEL_PATH=/models/Ternary-Bonsai-27B-Q2_0.gguf
BONSAI_HF_REPO=prism-ml/Ternary-Bonsai-27B-gguf
BONSAI_MAIN_FILE=Ternary-Bonsai-27B-Q2_0.gguf
# Download model during bootstrap-stack.sh
DOWNLOAD_MODEL=true
DOWNLOAD_VISION=true
DOWNLOAD_DRAFTER=false
# cpu (default) or vulkan — rebuild image after changing:
# BONSAI_BACKEND=vulkan docker compose build --no-cache bonsai
BONSAI_BACKEND=cpu
# GPU layers: 0 = CPU only. With vulkan image + /dev/dri, try 99.
BONSAI_NGL=0
# Context size. 16384 is a solid default on 3264 GB RAM with the Arr stack.
# Raise for long docs / repo work; set BONSAI_KV4=1 if you run OOM.
# Inference: vulkan on AMD iGPU; cpu for safe fallback
BONSAI_BACKEND=vulkan
BONSAI_NGL=99
BONSAI_CTX=16384
BONSAI_KV4=0
# Leave 0 for auto threads, or e.g. 12 on 16-thread 7735HS to leave headroom
BONSAI_THREADS=0
# Sampling (Prism 27B thinking-mode defaults)
BONSAI_THREADS=12
BONSAI_TEMP=0.7
BONSAI_TOP_P=0.95
BONSAI_TOP_K=20
# Host port for llama-server API (OpenAI-compatible at /v1)
BONSAI_PORT=8081
BONSAI_EXTRA_ARGS=
# Open WebUI
OPEN_WEBUI_PORT=3000
OPENAI_API_KEY=sk-local-bonsai
# true = login required (recommended); false = open LAN access
WEBUI_AUTH=true
OPENWEBUI_DEFAULT_MODEL=openai/Ternary-Bonsai-27B-Q2_0.gguf
RAG_EMBEDDING_ENGINE=
RAG_CHUNK_SIZE=1000
RAG_CHUNK_OVERLAP=100
# Folder mounted read-only into Open WebUI as /workspace (RAG + file Q&A)
# Point this at your git projects, notes, docs, etc.
AI_WORKSPACE_DIR=./workspace
# SearXNG
SEARXNG_SECRET=demo-searxng-secret-change-me
# SearXNG (web search for RAG) — published on localhost only
SEARXNG_PORT=8888
SEARXNG_SECRET=change-me-to-a-long-random-string
# OpenHands (compose profile: coding)
OPENHANDS_MODEL=openai/Ternary-Bonsai-27B-Q2_0.gguf
# true = also start openhands in bootstrap
START_OPENHANDS=false
# OpenHands coding agent (docker compose --profile coding up -d)
OPENHANDS_PORT=3001
# LiteLLM-style id; after first start check http://host:8081/v1/models
OPENHANDS_MODEL=openai/local
# =============================================================================
# Forgejo
# =============================================================================
FORGEJO_DOMAIN=${STACK_HOST}
FORGEJO_ROOT_URL=http://${STACK_HOST}:3002/
FORGEJO_DISABLE_REGISTRATION=false
# First-run admin (set after install or via bootstrap when API allows)
FORGEJO_ADMIN_USER=${DEMO_USER}
FORGEJO_ADMIN_PASS=${DEMO_PASS}
FORGEJO_ADMIN_EMAIL=tim@stack.local
# FlareSolverr (Cloudflare helper for Prowlarr; internal only)
# Git remote used by server /opt/stack (see stack_deploy_method: git)
STACK_GIT_REPO=ssh://git@127.0.0.1:2222/tim/stack.git
STACK_GIT_BRANCH=main
# =============================================================================
# Usenet / NZB (also read by scripts/configure-usenet.sh)
# Prefer these names; legacy aliases still work (see configure-usenet.sh)
# =============================================================================
# NZBgeek indexer (Prowlarr)
NZBGEEKUSERNAME=
NZBGEEKEMAIL=
NZBGEEKAPI=https://api.nzbgeek.info/
NZBKEEPKEY=
# aliases: NZBGEEK_API_KEY
# Newshosting
NEWSHOSTINGAPI=news.newshosting.com
NEWSHOSTINGSSLPORT=563
NEWSHOSTINGUSER=
HNEWSHOSTINGPASS=
NEWSHOSTINGCONNECTIONS=20
# Tweaknews
TWEAKNEWSAPI=news.tweaknews.eu
TWEAKNEWSSSLPORT=563
TWEAKNEWSLOGIN=
TWEAKNEWSPASSWORD=
TWEAKNEWSCONNECTIONS=40
# =============================================================================
# FlareSolverr
# =============================================================================
FLARESOLVERR_LOG_LEVEL=info
FLARESOLVERR_CAPTCHA_SOLVER=none
# SABnzbd (Usenet) — credentials in secrets/.env, not here
SABNZBD_PORT=8085
# Caddy landing page (LAN service map)
LANDING_PORT=80
# Forgejo — self-hosted Git (web + SSH clone)
FORGEJO_HTTP_PORT=3002
FORGEJO_SSH_PORT=2222
FORGEJO_DOMAIN=192.168.8.123
FORGEJO_ROOT_URL=http://192.168.8.123:3002/
# true after you create the admin account (blocks random signups)
FORGEJO_DISABLE_REGISTRATION=false
# =============================================================================
# Bootstrap behaviour (scripts/bootstrap-stack.sh)
# =============================================================================
# compose profiles to enable: empty, or coding
COMPOSE_PROFILES=
# After containers are up, run configure-usenet.sh
CONFIGURE_USENET=true
# Recreate gluetun/qbittorrent if unhealthy after start
HEAL_GLUETUN=true
# Pull images before up
COMPOSE_PULL=true