# Core Configuration UPSTREAM_BASE_URL=https://api.openai.com/v1 UPSTREAM_API_KEY=your-upstream-api-key # Tinfoil (confidential inference enclaves, EHBP) # TINFOIL_API_KEY=your-tinfoil-api-key # Secret key used to encrypt node secrets at rest (optional). If unset, the node # generates one on first start, writes it to routstr_secret.key (override the path # with ROUTSTR_SECRET_KEY_FILE), and prints it once — back that file up, because # losing the key makes previously encrypted secrets unreadable. Set it explicitly # to manage the key yourself (recommended in production). Generate one with: # uv run python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" ROUTSTR_SECRET_KEY= # The admin password and the Nostr identity (nsec) are NOT set here. The admin # password is generated and logged once on first start (read it from the logs to # sign in); both are managed afterwards from the admin UI and stored encrypted in # the database. ADMIN_PASSWORD / NSEC are still read once as a legacy seed for # existing deployments, but new nodes should set them in the UI — a value left in # .env is ignored once the node has been configured. # Database # DATABASE_URL=sqlite+aiosqlite:///keys.db # Pool controls are validated at boot, sourced only from the environment, and # logged at startup. Keep total capacity across all workers below the database # connection limit. Pre-ping is automatic for networked backends; SQLite may # explicitly opt in if desired. # DATABASE_POOL_SIZE=5 # DATABASE_MAX_OVERFLOW=10 # DATABASE_POOL_TIMEOUT=30 # DATABASE_POOL_RECYCLE=1800 # DATABASE_POOL_PRE_PING=false # Warn when a checkout is held this many seconds. # DATABASE_POOL_HOLD_WARN_SECONDS=10 # SQLite serialises writes; increasing its pool can trade pool timeouts for # "database is locked" errors rather than increasing write throughput. # Node Information # NAME=My Routstr Node # DESCRIPTION=Fast AI API access with Bitcoin payments # HTTP_URL=https://api.mynode.com # ONION_URL=http://mynode.onion (auto fetched from compose) # RELAYS="wss://relay.damus.io,wss://relay.nostr.band,wss://eden.nostr.land,wss://relay.routstr.com" # ENABLE_ANALYTICS_SHARING=true # CASHU_MINTS="https://mint.minibits.cash/Bitcoin,https://mint.cubabitcoin.org,https://ecashmint.otrta.me" # MINT_OPERATION_CONCURRENCY=4 # RECEIVE_LN_ADDRESS= # REFUND_SWEEP_CLAIM_TIMEOUT_SECONDS=900 # Custom Pricing Configuration # MODEL_BASED_PRICING=true # COST_PER_REQUEST=1 # COST_PER_1K_INPUT_TOKENS=0 # COST_PER_1K_OUTPUT_TOKENS=0 # EXCHANGE_FEE=1.005 # UPSTREAM_PROVIDER_FEE=1.05 # Network Configuration # CORS_ORIGINS=* # TOR_PROXY_URL=socks5://127.0.0.1:9050 # Logging # LOG_LEVEL=INFO # ENABLE_CONSOLE_LOGGING=true # Custom Model Management # BASE_URL=https://openrouter.ai/api/v1 # MODELS_PATH=models.json # SOURCE= # UI Configuration (for Next.js frontend) # These variables are prefixed with NEXT_PUBLIC_ to be accessible in the browser # NEXT_PUBLIC_API_URL=http://127.0.0.1:8000