f1ab1accaf
Replaces per-request history reconstruction with a persistent AsyncSqliteSaver
checkpointer keyed by conversation ID, so agent state (tool calls, intermediate
steps) carries forward between turns without manual message list building.
Also includes the missing migration for the CronJob model added in bb4619a.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
156 lines
5.9 KiB
Bash
156 lines
5.9 KiB
Bash
# Database Configuration
|
|
# PostgreSQL is recommended (required for OIDC features)
|
|
DATABASE_URL=postgres://raggr:changeme@postgres:5432/raggr
|
|
|
|
# PostgreSQL credentials (if using docker-compose postgres service)
|
|
POSTGRES_USER=raggr
|
|
POSTGRES_PASSWORD=changeme
|
|
POSTGRES_DB=raggr
|
|
|
|
# JWT Configuration
|
|
JWT_SECRET_KEY=your-secret-key-here
|
|
|
|
# Metrics Configuration
|
|
# Bearer token for the /metrics endpoint (Prometheus scrape + app token gate).
|
|
# Generate with: openssl rand -hex 32
|
|
# Leave empty to keep /metrics returning 403 (fail-closed).
|
|
METRICS_TOKEN=
|
|
|
|
# Paperless Configuration
|
|
PAPERLESS_TOKEN=your-paperless-token
|
|
BASE_URL=192.168.1.5:8000
|
|
|
|
# llama-server Configuration (OpenAI-compatible API)
|
|
# If set, uses llama-server as the primary LLM backend with OpenAI as fallback
|
|
LLAMA_SERVER_URL=http://192.168.1.213:8080/v1
|
|
LLAMA_MODEL_NAME=llama-3.1-8b-instruct
|
|
TTFT_TIMEOUT_SECONDS=30
|
|
|
|
# Embedding Server Configuration
|
|
# If set, uses a custom OpenAI-compatible embedding server (e.g. llama-server)
|
|
# Falls back to OpenAI embeddings if not set
|
|
EMBEDDING_SERVER_URL=http://192.168.1.7:8086/v1
|
|
EMBEDDING_MODEL_NAME=all-minilm
|
|
|
|
# OpenAI Configuration
|
|
OPENAI_API_KEY=your-openai-api-key
|
|
|
|
# Tavily Configuration (for web search)
|
|
TAVILY_API_KEY=your-tavily-api-key
|
|
|
|
# Immich Configuration
|
|
IMMICH_URL=http://192.168.1.5:2283
|
|
IMMICH_API_KEY=your-immich-api-key
|
|
SEARCH_QUERY=simba cat
|
|
DOWNLOAD_DIR=./simba_photos
|
|
|
|
# OIDC Configuration (Authelia)
|
|
OIDC_ISSUER=https://auth.example.com
|
|
OIDC_CLIENT_ID=simbarag
|
|
OIDC_CLIENT_SECRET=your-client-secret-here
|
|
OIDC_REDIRECT_URI=http://localhost:8080/
|
|
OIDC_USE_DISCOVERY=true
|
|
|
|
# Optional: Manual OIDC endpoints (if discovery is disabled)
|
|
# OIDC_AUTHORIZATION_ENDPOINT=https://auth.example.com/api/oidc/authorization
|
|
# OIDC_TOKEN_ENDPOINT=https://auth.example.com/api/oidc/token
|
|
# OIDC_USERINFO_ENDPOINT=https://auth.example.com/api/oidc/userinfo
|
|
# OIDC_JWKS_URI=https://auth.example.com/api/oidc/jwks
|
|
|
|
# YNAB Configuration
|
|
# Get your Personal Access Token from https://app.ynab.com/settings/developer
|
|
YNAB_ACCESS_TOKEN=your-ynab-personal-access-token
|
|
# Optional: Specify a budget ID, or leave empty to use the default/first budget
|
|
YNAB_BUDGET_ID=
|
|
|
|
# Mealie Configuration
|
|
# Base URL for your Mealie instance (e.g., http://192.168.1.5:9000 or https://mealie.example.com)
|
|
MEALIE_BASE_URL=http://192.168.1.5:9000
|
|
# Get your API token from Mealie's user settings page
|
|
MEALIE_API_TOKEN=your-mealie-api-token
|
|
|
|
# Email Integration
|
|
# Email Encryption Key (32-byte URL-safe base64)
|
|
# Generate with: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
|
FERNET_KEY=your-fernet-key-here
|
|
|
|
# Twilio Configuration (WhatsApp)
|
|
TWILIO_ACCOUNT_SID=your-twilio-account-sid
|
|
TWILIO_AUTH_TOKEN=your-twilio-auth-token
|
|
TWILIO_WHATSAPP_NUMBER=whatsapp:+14155238886
|
|
# Comma-separated list of WhatsApp numbers allowed to use the service (e.g., whatsapp:+1234567890)
|
|
# Use * to allow any number
|
|
ALLOWED_WHATSAPP_NUMBERS=
|
|
# Set to false to disable Twilio signature validation in development
|
|
TWILIO_SIGNATURE_VALIDATION=true
|
|
# If behind a reverse proxy, set this to your public webhook URL so signature validation works
|
|
# TWILIO_WEBHOOK_URL=https://your-domain.com/api/whatsapp/webhook
|
|
# Rate limiting: max messages per window (default: 10 messages per 60 seconds)
|
|
# WHATSAPP_RATE_LIMIT_MAX=10
|
|
# WHATSAPP_RATE_LIMIT_WINDOW=60
|
|
|
|
# Mailgun Configuration (Email channel)
|
|
MAILGUN_API_KEY=
|
|
MAILGUN_DOMAIN=
|
|
MAILGUN_WEBHOOK_SIGNING_KEY=
|
|
EMAIL_HMAC_SECRET=
|
|
# Rate limiting: max emails per window (default: 5 per 300 seconds)
|
|
# EMAIL_RATE_LIMIT_MAX=5
|
|
# EMAIL_RATE_LIMIT_WINDOW=300
|
|
# Set to false to disable Mailgun signature validation in development
|
|
MAILGUN_SIGNATURE_VALIDATION=true
|
|
|
|
# SendBlue Configuration (iMessage)
|
|
SENDBLUE_API_KEY=your-sendblue-api-key
|
|
SENDBLUE_API_SECRET=your-sendblue-api-secret
|
|
SENDBLUE_FROM_NUMBER=+1XXXXXXXXXX
|
|
SENDBLUE_WEBHOOK_SECRET=your-sendblue-webhook-secret
|
|
# Set to false to disable SendBlue signature validation in development
|
|
SENDBLUE_SIGNATURE_VALIDATION=true
|
|
# Comma-separated list of iMessage numbers allowed to use the service (E.164 format)
|
|
# Use * to allow any number
|
|
ALLOWED_IMESSAGE_NUMBERS=
|
|
# Rate limiting: max messages per window (default: 10 messages per 60 seconds)
|
|
# IMESSAGE_RATE_LIMIT_MAX=10
|
|
# IMESSAGE_RATE_LIMIT_WINDOW=60
|
|
|
|
# Google Calendar + Gmail Configuration (Python SDK)
|
|
# Run scripts/google_auth.py to generate token.json from your OAuth2 credentials:
|
|
# python scripts/google_auth.py --credentials credentials.json --token token.json
|
|
# Then mount token.json into the container (see docker-compose.yml).
|
|
# If GOOGLE_TOKEN_FILE points to a valid token, both Calendar and Gmail are enabled.
|
|
GOOGLE_TOKEN_FILE=/app/config/google-token.json
|
|
|
|
# Cronicle Integration
|
|
# Shared secret for Cronicle to authenticate cron job trigger requests.
|
|
# Generate with: openssl rand -hex 32
|
|
CRON_SECRET=
|
|
|
|
# SimbaKit / PetKit Configuration
|
|
# PetKit account credentials (used by SimbaKit to poll device data)
|
|
PETKIT_USERNAME=your-petkit-email
|
|
PETKIT_PASSWORD=your-petkit-password
|
|
PETKIT_REGION=US
|
|
PETKIT_TIMEZONE=America/New_York
|
|
# Internal URL for SimbaKit service (Docker network)
|
|
SIMBAKIT_URL=http://simbakit:8585
|
|
|
|
# Obsidian Configuration (headless sync)
|
|
# Obsidian account credentials (used for `ob login` on container startup)
|
|
OBSIDIAN_EMAIL=your-obsidian-email
|
|
OBSIDIAN_PASSWORD=your-obsidian-password
|
|
# Vault ID to sync (found in Obsidian sync settings)
|
|
OBSIDIAN_VAULT_ID=your-vault-id
|
|
# End-to-end encryption password (if vault uses E2E encryption)
|
|
OBSIDIAN_E2E_PASSWORD=
|
|
# Device name shown in Obsidian sync activity
|
|
OBSIDIAN_DEVICE_NAME=simbarag
|
|
# Set to true to run continuous sync in the background
|
|
OBSIDIAN_CONTINUOUS_SYNC=false
|
|
# Local path to Obsidian vault (where files are synced)
|
|
OBSIDIAN_VAULT_PATH=/app/data/obsidian
|
|
|
|
# LangGraph checkpoint store (SQLite). Must be on a persistent volume.
|
|
# Both blue and green containers share this volume via docker-compose.
|
|
CHECKPOINT_DB_PATH=/app/checkpoints/checkpoints.db
|