257 lines
9.8 KiB
Bash
257 lines
9.8 KiB
Bash
# 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
|
|
|
|
########################################
|
|
# 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_MISPRICING_ONLY=true
|
|
TELEGRAM_ALERT_MISPRICING_INTERVAL_SEC=7200
|
|
TELEGRAM_MARKET_FOCUS_DIGEST_ENABLED=true
|
|
TELEGRAM_MARKET_FOCUS_DIGEST_INTERVAL_SEC=1800
|
|
TELEGRAM_MARKET_FOCUS_DIGEST_TOP_N=5
|
|
TELEGRAM_MARKET_FOCUS_PUSH_START_LOCAL_HOUR=8
|
|
TELEGRAM_MARKET_FOCUS_PUSH_BEFORE_PEAK_MIN=480
|
|
TELEGRAM_MARKET_FOCUS_PUSH_AFTER_PEAK_MIN=300
|
|
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
|
|
|
|
########################################
|
|
# 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 DeepSeek V4-Pro market scan review for Pro users
|
|
POLYWEATHER_SCAN_AI_ENABLED=false
|
|
POLYWEATHER_DEEPSEEK_API_KEY=
|
|
POLYWEATHER_DEEPSEEK_BASE_URL=https://api.deepseek.com
|
|
POLYWEATHER_SCAN_AI_MODEL=deepseek-v4-pro
|
|
POLYWEATHER_SCAN_AI_TIMEOUT_SEC=40
|
|
POLYWEATHER_SCAN_CITY_AI_TIMEOUT_SEC=45
|
|
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=1200
|
|
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=8
|
|
POLYMARKET_MARKET_CACHE_TTL_SEC=60
|
|
POLYMARKET_PRICE_CACHE_TTL_SEC=30
|
|
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=
|