# PolyWeather backend/bot minimal reproducible config # Full configuration guide: # docs/CONFIGURATION_ZH.md # Sensitive-only template: # .env.secrets.example ######################################## # 1) Runtime paths and base behavior ######################################## ENV=production LOG_LEVEL=INFO POLYWEATHER_MAP_URL=https://polyweather-pro.vercel.app/ POLYWEATHER_RUNTIME_DATA_DIR=/var/lib/polyweather POLYWEATHER_DB_PATH=/var/lib/polyweather/polyweather.db OPEN_METEO_DISK_CACHE_PATH=/var/lib/polyweather/open_meteo_cache.json # Optional: host user/group mapping for Docker on Linux. # Windows / macOS can usually keep the defaults. UID=1000 GID=1000 POLYWEATHER_STATE_STORAGE_MODE=sqlite POLYWEATHER_PROMETHEUS_PORT=9090 POLYWEATHER_ALERTMANAGER_PORT=9093 POLYWEATHER_ALERT_RELAY_PORT=9099 POLYWEATHER_GRAFANA_PORT=3001 POLYWEATHER_GRAFANA_ADMIN_USER=admin POLYWEATHER_GRAFANA_ADMIN_PASSWORD=polyweather # Backend CORS allowlist. Add your Vercel production/preview domains when # NEXT_PUBLIC_POLYWEATHER_API_BASE_URL points browsers directly at this backend. WEB_CORS_ORIGINS=http://localhost:3000,http://127.0.0.1:3000,https://polyweather-pro.vercel.app ######################################## # 2) Telegram bot minimal ######################################## TELEGRAM_BOT_TOKEN= TELEGRAM_CHAT_ID= TELEGRAM_CHAT_IDS= TELEGRAM_QUERY_TOPIC_CHAT_ID= TELEGRAM_QUERY_TOPIC_ID= TELEGRAM_QUERY_TOPIC_MAP= POLYWEATHER_BOT_GROUP_INVITE_URL= ######################################## # 3) Weather + cache ######################################## OPEN_METEO_CACHE_TTL_SEC=7200 OPEN_METEO_ENSEMBLE_CACHE_TTL_SEC=7200 OPEN_METEO_MULTI_MODEL_CACHE_TTL_SEC=7200 OPEN_METEO_MULTI_MODEL_CACHE_VERSION=v2 OPEN_METEO_RATE_LIMIT_COOLDOWN_SEC=900 OPEN_METEO_RATE_CACHE_TTL_SEC=3600 OPEN_METEO_MIN_CALL_INTERVAL_SEC=1 POLYWEATHER_HTTP_TIMEOUT_SEC=8 POLYWEATHER_HTTP_RETRY_COUNT=0 POLYWEATHER_HTTP_RETRY_BACKOFF_SEC=0.2 POLYWEATHER_OPEN_METEO_TIMEOUT_SEC=5 POLYWEATHER_METAR_TIMEOUT_SEC=4 POLYWEATHER_METAR_CLUSTER_TIMEOUT_SEC=3.5 METAR_CACHE_TTL_SEC=600 JMA_AMEDAS_CACHE_TTL_SEC=120 METEOBLUE_CACHE_TTL_SEC=7200 # Probability engine modes: # - legacy: production-safe primary path. # - emos_shadow: user-facing probability stays legacy, EMOS is generated for comparison. # - emos_primary: only after offline evaluation passes and manual rollout is approved. POLYWEATHER_PROBABILITY_ENGINE=legacy POLYWEATHER_EMOS_AUTO_MIN_SAMPLES=50 POLYWEATHER_EMOS_AUTO_MAX_DELTA_CRPS=0 POLYWEATHER_EMOS_AUTO_MAX_DELTA_MAE=0.05 POLYWEATHER_EMOS_AUTO_MIN_DELTA_BUCKET_HIT_RATE=-0.05 # Optional: cap recent probability snapshots used by EMOS retraining. # Recommended on VPS: do not train there; pull the SQLite DB to a local machine. # POLYWEATHER_EMOS_TRAINING_SNAPSHOT_LIMIT=20000 # Optional: set this to a writable runtime path if you manually deploy a # locally trained EMOS calibration file. # POLYWEATHER_PROBABILITY_CALIBRATION_FILE=/var/lib/polyweather/probability_calibration/default.json POLYWEATHER_LGBM_ENABLED=false POLYWEATHER_LGBM_MODEL_PATH=/app/artifacts/models/lgbm_daily_high.txt POLYWEATHER_LGBM_SCHEMA_PATH=/app/artifacts/models/lgbm_daily_high_schema.json POLYWEATHER_LGBM_MIN_HISTORY_POINTS=3 ######################################## # 4) Auth / entitlement ######################################## POLYWEATHER_AUTH_ENABLED=false POLYWEATHER_AUTH_REQUIRED=false POLYWEATHER_AUTH_REQUIRE_SUBSCRIPTION=false POLYWEATHER_REQUIRE_ENTITLEMENT=false SUPABASE_URL= SUPABASE_ANON_KEY= SUPABASE_SERVICE_ROLE_KEY= SUPABASE_HTTP_TIMEOUT_SEC=8 SUPABASE_AUTH_CACHE_TTL_SEC=30 SUPABASE_SUB_CACHE_TTL_SEC=60 POLYWEATHER_BACKEND_ENTITLEMENT_TOKEN= ######################################## # 5) Alerts / operations ######################################## TELEGRAM_ALERT_PUSH_ENABLED=true TELEGRAM_ALERT_PUSH_INTERVAL_SEC=300 TELEGRAM_ALERT_PUSH_COOLDOWN_SEC=1800 TELEGRAM_ALERT_MIN_TRIGGER_COUNT=2 TELEGRAM_ALERT_MIN_SEVERITY=medium TELEGRAM_ALERT_CITIES=ankara,london,paris,seoul,hong kong,shanghai,singapore,tokyo,tel aviv,toronto,buenos aires,wellington,new york,chicago,dallas,miami,atlanta,seattle,lucknow,sao paulo,munich POLYWEATHER_MONITORING_ALERT_CHAT_IDS= ######################################## # 6) Frontend-facing shared values ######################################## NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID= NEXT_PUBLIC_WALLETCONNECT_POLYGON_RPC_URL=https://polygon-bor-rpc.publicnode.com # Optional: disable homepage city summary preloading. Default is enabled. NEXT_PUBLIC_POLYWEATHER_DISABLE_EAGER_SUMMARIES=false # Optional: browser-visible FastAPI base URL for Vercel deployments. # Set this to your VPS HTTPS origin to let AI / METAR / scan dashboard calls # bypass Vercel Functions / Fluid Compute instead of going through Next.js API proxies. # Example: NEXT_PUBLIC_POLYWEATHER_API_BASE_URL=https://api.example.com NEXT_PUBLIC_POLYWEATHER_API_BASE_URL= ######################################## # 7) Optional modules ######################################## # Optional Groq commentary rewrite for intraday structure cards POLYWEATHER_GROQ_COMMENTARY_ENABLED=false GROQ_API_KEY= POLYWEATHER_GROQ_COMMENTARY_MODEL=openai/gpt-oss-20b POLYWEATHER_GROQ_COMMENTARY_TIMEOUT_SEC=8 POLYWEATHER_GROQ_COMMENTARY_CACHE_TTL_SEC=1800 # Optional OpenAI-compatible market scan review for Pro users # Temporary default provider: MiMo via https://token-plan-cn.xiaomimimo.com/v1. POLYWEATHER_SCAN_AI_ENABLED=false POLYWEATHER_SCAN_AI_API_KEY= POLYWEATHER_SCAN_AI_PROVIDER=mimo POLYWEATHER_SCAN_AI_PROVIDER_LABEL=MiMo POLYWEATHER_SCAN_AI_BASE_URL=https://token-plan-cn.xiaomimimo.com/v1 POLYWEATHER_SCAN_AI_MODEL=mimo-v2.5-pro POLYWEATHER_SCAN_CITY_AI_MODEL=mimo-v2.5-pro # Backward-compatible legacy DeepSeek variables are still read if the generic # POLYWEATHER_SCAN_AI_* variables are unset. # POLYWEATHER_DEEPSEEK_API_KEY= # POLYWEATHER_DEEPSEEK_BASE_URL=https://api.deepseek.com POLYWEATHER_SCAN_AI_TIMEOUT_SEC=18 POLYWEATHER_SCAN_CITY_AI_TIMEOUT_SEC=30 POLYWEATHER_SCAN_CITY_AI_RETRY_ON_STREAM_PARSE_ERROR=false POLYWEATHER_SCAN_AI_CACHE_TTL_SEC=1800 POLYWEATHER_SCAN_AI_MAX_ROWS=40 POLYWEATHER_SCAN_AI_MAX_TOKENS=3200 POLYWEATHER_SCAN_CITY_AI_MAX_TOKENS=900 POLYWEATHER_SCAN_AI_PROXY_TIMEOUT_MS=55000 POLYWEATHER_PREWARM_CITIES=ankara,istanbul,shanghai,beijing,shenzhen,guangzhou,wuhan,chengdu,chongqing,hong kong,taipei,singapore,tokyo,seoul,busan,london,paris,madrid POLYWEATHER_CITY_SUMMARY_CACHE_TTL_SEC=1800 POLYWEATHER_CITY_PANEL_CACHE_TTL_SEC=1800 POLYWEATHER_CITY_NEARBY_CACHE_TTL_SEC=1800 POLYWEATHER_CITY_MARKET_CACHE_TTL_SEC=1800 POLYWEATHER_CITY_HISTORY_PREVIEW_CACHE_TTL_SEC=1800 # Weekly reward / leaderboard POLYWEATHER_WEEKLY_REWARD_ENABLED=true POLYWEATHER_WEEKLY_REWARD_TIMEZONE=Asia/Shanghai POLYWEATHER_WEEKLY_REWARD_SETTLE_WEEKDAY=1 POLYWEATHER_WEEKLY_REWARD_SETTLE_HOUR=0 POLYWEATHER_WEEKLY_REWARD_SETTLE_MINUTE=5 POLYWEATHER_WEEKLY_REWARD_CHECK_INTERVAL_SEC=300 POLYWEATHER_WEEKLY_REWARD_HTTP_TIMEOUT_SEC=10 POLYWEATHER_WEEKLY_REWARD_ANNOUNCE_ENABLED=true # Group message points POLYWEATHER_BOT_MESSAGE_POINTS=4 POLYWEATHER_BOT_MESSAGE_DAILY_CAP=40 POLYWEATHER_BOT_MESSAGE_MIN_LENGTH=3 POLYWEATHER_BOT_MESSAGE_COOLDOWN_SEC=30 POLYWEATHER_BOT_CITY_QUERY_COST=1 POLYWEATHER_BOT_DEB_QUERY_COST=1 # Payments POLYWEATHER_PAYMENT_ENABLED=false POLYWEATHER_PAYMENT_CHAIN_ID=137 POLYWEATHER_PAYMENT_RPC_URL=https://polygon-rpc.com POLYWEATHER_PAYMENT_RPC_URLS=https://polygon-rpc.com POLYWEATHER_PAYMENT_RECEIVER_CONTRACT= POLYWEATHER_PAYMENT_TOKEN_ADDRESS=0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174 POLYWEATHER_PAYMENT_TOKEN_DECIMALS=6 POLYWEATHER_PAYMENT_ACCEPTED_TOKENS_JSON= POLYWEATHER_PAYMENT_CONFIRMATIONS=2 POLYWEATHER_PAYMENT_INTENT_TTL_SEC=1800 POLYWEATHER_PAYMENT_WALLET_CHALLENGE_TTL_SEC=600 POLYWEATHER_PAYMENT_HTTP_TIMEOUT_SEC=10 POLYWEATHER_PAYMENT_POLL_INTERVAL_SEC=4 POLYWEATHER_PAYMENT_MAX_WAIT_SEC=50 POLYWEATHER_PAYMENT_TELEGRAM_NOTIFY_ENABLED=true POLYWEATHER_PAYMENT_POINTS_ENABLED=true POLYWEATHER_PAYMENT_POINTS_PER_USDC=500 POLYWEATHER_PAYMENT_POINTS_MAX_DISCOUNT_USDC=3 POLYWEATHER_PAYMENT_ALLOWED_PLAN_CODES=pro_monthly POLYWEATHER_PAYMENT_PLAN_CATALOG_JSON= # Polymarket market scan POLYMARKET_MARKET_SCAN_ENABLED=true POLYMARKET_GAMMA_URL=https://gamma-api.polymarket.com POLYMARKET_CLOB_URL=https://clob.polymarket.com POLYMARKET_CHAIN_ID=137 POLYMARKET_HTTP_TIMEOUT_SEC=20 POLYMARKET_MARKET_CACHE_TTL_SEC=60 POLYMARKET_PRICE_CACHE_TTL_SEC=30 # false = fetch CLOB book/depth for orderbook analysis; true = price-only, lighter but no book levels POLYMARKET_FAST_PRICE_ONLY=false POLYWEATHER_MARKET_SCAN_PAYLOAD_TTL_SEC=30 POLYMARKET_WS_PRICE_ENABLED=false POLYMARKET_WS_MARKET_URL=wss://ws-subscriptions-clob.polymarket.com/ws/market POLYMARKET_WS_QUOTE_TTL_SEC=8 POLYMARKET_WS_MAX_ASSETS=256 POLYMARKET_WS_RECONNECT_DELAY_SEC=3 POLYMARKET_DISCOVERY_PAGES=6 POLYMARKET_DISCOVERY_LIMIT=200 POLYMARKET_SIGNAL_MIN_LIQUIDITY=500 POLYMARKET_SIGNAL_EDGE_PCT=2 # Polygon watcher POLYGON_WALLET_WATCH_ENABLED=false POLYGON_RPC_URL=https://polygon-rpc.com POLYGON_WALLET_WATCH_ADDRESSES= POLYGON_WALLET_WATCH_INTERVAL_SEC=8 POLYGON_WALLET_WATCH_CONFIRMATIONS=2 POLYGON_WALLET_WATCH_MAX_BLOCKS_PER_CYCLE=30 POLYGON_WALLET_WATCH_SEEN_TTL_SEC=604800 POLYGON_WALLET_WATCH_RPC_TIMEOUT_SEC=10 POLYGON_WALLET_WATCH_TX_BASE=https://polygonscan.com/tx POLYGON_WALLET_WATCH_ADDR_BASE=https://polygonscan.com/address POLYGON_WALLET_WATCH_POLYMARKET_ONLY=true POLYGON_WALLET_WATCH_INCLUDE_DEFAULT_PM_CONTRACTS=true POLYGON_WALLET_WATCH_POLYMARKET_CONTRACTS= # Polymarket wallet activity (retired; replaced by market monitor digests + critical alerts) POLYMARKET_WALLET_ACTIVITY_ENABLED=false POLYMARKET_WALLET_ACTIVITY_USERS= POLYMARKET_WALLET_ACTIVITY_CHAT_ID= POLYMARKET_WALLET_ACTIVITY_CHAT_IDS= POLYMARKET_WALLET_ACTIVITY_TOPIC_CHAT_ID= POLYMARKET_WALLET_ACTIVITY_TOPIC_ID= POLYMARKET_WALLET_ACTIVITY_USER_ALIASES= POLYMARKET_WALLET_ACTIVITY_DATA_API_URL=https://data-api.polymarket.com POLYMARKET_WALLET_ACTIVITY_INTERVAL_SEC=20 POLYMARKET_WALLET_ACTIVITY_TIMEOUT_SEC=10 POLYMARKET_WALLET_ACTIVITY_MIN_SIZE_ABS=0.001 POLYMARKET_WALLET_ACTIVITY_MIN_SIZE_DELTA=0.001 POLYMARKET_WALLET_ACTIVITY_MIN_AVG_PRICE_DELTA=0.002 POLYMARKET_WALLET_ACTIVITY_IMMEDIATE_ON_SIZE_DELTA=true POLYMARKET_WALLET_ACTIVITY_IMMEDIATE_SIZE_DELTA_MIN=0.001 POLYMARKET_WALLET_ACTIVITY_IMMEDIATE_COOLDOWN_SEC=20 POLYMARKET_WALLET_ACTIVITY_MAX_CHANGES_PER_MSG=5 POLYMARKET_WALLET_ACTIVITY_NOTIFY_CLOSED=false POLYMARKET_WALLET_ACTIVITY_BOOTSTRAP_ALERT=false POLYMARKET_WALLET_ACTIVITY_LINK_PREVIEW=true POLYMARKET_WALLET_ACTIVITY_UPDATE_DEBOUNCE_SEC=30 POLYMARKET_WALLET_ACTIVITY_UPDATE_MAX_HOLD_SEC=120 POLYMARKET_WALLET_ACTIVITY_AVG_PRICE_SHOW_MIN=0.01 POLYMARKET_WALLET_ACTIVITY_AVG_PRICE_SHOW_MAX=0.99 POLYMARKET_WALLET_ACTIVITY_MIN_POSITION_VALUE_USD=0 POLYMARKET_WALLET_ACTIVITY_MIN_VALUE_EXEMPT_USERS= ######################################## # 8) Optional proxies ######################################## HTTPS_PROXY= HTTP_PROXY=