The app confirms a StoreKit signed transaction or Play purchase token. The backend checks it with Apple or Google before writing the ledger, and the RevenueCat webhook no longer grants access.
137 lines
6.1 KiB
Bash
137 lines
6.1 KiB
Bash
# Local development environment file (copy to .env).
|
|
# For production server values, use .env.prod.example instead.
|
|
DJANGO_ENV=dev
|
|
DJANGO_DEBUG=true
|
|
DJANGO_SECRET_KEY=change-me-for-local-development
|
|
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1,0.0.0.0
|
|
# Optional; when unset, http:// origins are derived for local hosts.
|
|
# DJANGO_CSRF_TRUSTED_ORIGINS=http://localhost:8003,http://127.0.0.1:8003
|
|
|
|
# Database (docker-compose sets DATABASE_URL for the web service)
|
|
DATABASE_URL=postgres://chat_backend:chat_backend@db:5432/chat_backend
|
|
|
|
# Ollama — local loopback when Ollama runs on this machine; LAN IP for GPU host.
|
|
OLLAMA_BASE_URL=http://127.0.0.1:11434
|
|
# Legacy fallback (used when role-specific vars unset). Prefer the role vars.
|
|
# OLLAMA_MODEL=gpt-oss:20b
|
|
# OLLAMA_MODEL_THINKING=gpt-oss:20b
|
|
# OLLAMA_MODEL_FAST=gemma4:latest
|
|
# OLLAMA_MODEL_UTILITY=llama3.2
|
|
# OLLAMA_EMBED_MODEL=nomic-embed-text
|
|
# OLLAMA_NUM_CTX_THINKING=16384
|
|
# OLLAMA_NUM_CTX_FAST=8192
|
|
# OLLAMA_NUM_CTX_UTILITY=4096
|
|
|
|
# Web search (#62) — SearxNG primary, DDGS failover. See README "SearxNG".
|
|
ALLOW_INTERNET_ACCESS=true
|
|
SEARCH_PROVIDER=searxng
|
|
SEARCH_FAILOVER_PROVIDER=ddgs
|
|
SEARXNG_BASE_URL=http://127.0.0.1:8088
|
|
# SEARXNG_TIMEOUT_SECONDS=8
|
|
|
|
# Email (SMTP2GO) — optional for local
|
|
EMAIL_HOST=mail.smtp2go.com
|
|
EMAIL_HOST_USER=
|
|
EMAIL_HOST_PASSWORD=
|
|
EMAIL_PORT=2525
|
|
EMAIL_USE_TLS=true
|
|
|
|
# Captcha (optional local)
|
|
CAPTCHA_SECRET_KEY=
|
|
|
|
# Self-serve sign-up (default false — set true to allow /user/create/)
|
|
ENABLE_ACCOUNT_REGISTRATION=false
|
|
|
|
# OAuth SSO — Google / Microsoft (#24). Leave blank to hide SSO buttons.
|
|
# Redirect URIs (register in each IdP console):
|
|
# {OAUTH_CALLBACK_BASE_URL}/api/auth/oauth/google/callback/
|
|
# {OAUTH_CALLBACK_BASE_URL}/api/auth/oauth/microsoft/callback/
|
|
# Same client id/secret pair is reused for Drive linking (#47) — the extra
|
|
# Drive scopes below are requested incrementally via intent=link_drive /
|
|
# intent=link_company_drive, no separate app registration needed:
|
|
# Google: openid email profile https://www.googleapis.com/auth/drive.readonly
|
|
# Microsoft: openid email profile offline_access Files.Read (personal)
|
|
# openid email profile offline_access Files.Read.All Sites.Read.All (company)
|
|
GOOGLE_OAUTH_CLIENT_ID=
|
|
GOOGLE_OAUTH_CLIENT_SECRET=
|
|
MICROSOFT_OAUTH_CLIENT_ID=
|
|
MICROSOFT_OAUTH_CLIENT_SECRET=
|
|
MICROSOFT_OAUTH_TENANT=common
|
|
# Optional; defaults to request host. Example local: http://127.0.0.1:8001
|
|
OAUTH_CALLBACK_BASE_URL=http://127.0.0.1:8001
|
|
|
|
# Drive / RAG sync (#47-#53). Requires a subscription plan with allows_rag
|
|
# (Founders, Pro, Business, Backer by default — see finance PLAN_SEED).
|
|
# Start a link: GET /api/auth/oauth/google/start/?intent=link_drive (authenticated)
|
|
# GET /api/auth/oauth/google/start/?intent=link_company_drive (company manager)
|
|
# GET /api/auth/oauth/microsoft/start/?intent=link_drive
|
|
# GET /api/auth/oauth/microsoft/start/?intent=link_company_drive
|
|
# Manage: GET /api/drive/connections/
|
|
# DELETE /api/drive/connections/<id>/
|
|
# POST /api/drive/connections/<id>/resources/ { "resource_ids": [...] }
|
|
# POST /api/drive/connections/<id>/sync/
|
|
# Provider push notifications (best-effort; register with each provider's
|
|
# subscription/watch API pointing here, using ?connection_id=<id>):
|
|
# POST {OAUTH_CALLBACK_BASE_URL}/api/drive/webhooks/google/
|
|
# POST {OAUTH_CALLBACK_BASE_URL}/api/drive/webhooks/microsoft/
|
|
# Worker sync: `python manage.py sync_drive_connections [--connection-id N]`
|
|
|
|
# Stripe / monetization (optional local — required for checkout + webhooks)
|
|
STRIPE_SECRET_KEY=
|
|
STRIPE_PUBLISHABLE_KEY=
|
|
STRIPE_WEBHOOK_SECRET=
|
|
# Optional: pre-created Stripe Price ID for Founders. When empty, Checkout uses
|
|
# SubscriptionPlan.price_cents / SUBSCRIPTION_PRICE_* ($10 USD / month Founders).
|
|
STRIPE_PRICE_ID=
|
|
# Native store purchases (#78). iOS verifies the StoreKit signed transaction
|
|
# against Apple Root CA G3. Android calls the Play Developer API.
|
|
APPLE_IAP_BUNDLE_ID=ai.hesychia.chat
|
|
GOOGLE_PLAY_PACKAGE_NAME=ai.hesychia.chat
|
|
# Service-account JSON (one line) or a path to the JSON file. Empty disables Play confirm.
|
|
GOOGLE_PLAY_SERVICE_ACCOUNT_JSON=
|
|
# Optional JSON map of store product id → plan slug, e.g.
|
|
# REVENUECAT_PRODUCT_PLAN_MAP={"hesychia_founders_monthly":"founders"}
|
|
# SUBSCRIPTION_PRICE_AMOUNT_CENTS=1000
|
|
# SUBSCRIPTION_PRICE_CURRENCY=usd
|
|
# SUBSCRIPTION_PRICE_INTERVAL=month
|
|
# SUBSCRIPTION_PRODUCT_NAME=Founders
|
|
# Enforce plan feature + prompt/token quotas on chat turns (default true).
|
|
# ENFORCE_SUBSCRIPTION_GATES=true
|
|
FRONTEND_BASE_URL=http://localhost:3000
|
|
|
|
# Agentic task execution (#63) — long-running, multi-step, tool-using turns.
|
|
# Default false: chat behaves exactly like the always-on grounded path (#62),
|
|
# no planner/tools/AgentRun rows. Requires a plan with allows_rag (or
|
|
# allows_all_future_features) — see monetization SubscriptionPlan.allows_feature.
|
|
ALLOW_AGENTIC_TASKS=false
|
|
# Redis — optional. Unset = InMemory channel layer (single process, fine for
|
|
# dev/tests) and agent work runs on a daemon thread instead of Celery.
|
|
# REDIS_URL=redis://127.0.0.1:6379/0
|
|
# CELERY_BROKER_URL=redis://127.0.0.1:6379/0
|
|
# Orchestrator plans + synthesises; sub-agents run independent plan steps
|
|
# concurrently on a smaller/cheaper model.
|
|
# OLLAMA_MODEL_ORCHESTRATOR=gpt-oss:20b
|
|
# OLLAMA_MODEL_SUBAGENT=llama3.2
|
|
# AGENT_MAX_PLAN_STEPS=8
|
|
# AGENT_MAX_ITERATIONS=12
|
|
# AGENT_WALL_CLOCK_SECONDS=600
|
|
# AGENT_SUBAGENT_CONCURRENCY=3
|
|
# AGENT_TOOL_TIMEOUT_SECONDS=20
|
|
# AGENT_TOOL_OUTPUT_MAX_CHARS=8000
|
|
# AGENT_MAX_TOOL_CALLS_PER_RUN=40
|
|
# AGENT_FETCH_URL_MAX_BYTES=2097152
|
|
# Run a worker once REDIS_URL/CELERY_BROKER_URL are set:
|
|
# docker compose --profile agentic up redis worker
|
|
# uv run celery -A llm_be worker --loglevel=info
|
|
# STRIPE_CHECKOUT_SUCCESS_URL=http://localhost:3000/billing/success?session_id={CHECKOUT_SESSION_ID}
|
|
# STRIPE_CHECKOUT_CANCEL_URL=http://localhost:3000/billing/cancel
|
|
# Customer Portal return URL (plan change / cancel / payment method).
|
|
# STRIPE_PORTAL_RETURN_URL=http://localhost:3000/account/
|
|
|
|
# Gunicorn / ASGI
|
|
GUNICORN_WORKERS=2
|
|
GUNICORN_BIND=0.0.0.0:8000
|
|
|
|
# Host port for docker-compose.prod.yml
|
|
WEB_PORT=8003
|