Files
2026-08-15 14:51:51 +08:00

114 lines
4.5 KiB
Python

import os
from dataclasses import dataclass
from pathlib import Path
from dotenv import load_dotenv
BASE_DIR = Path(__file__).resolve().parent
load_dotenv(BASE_DIR / ".env", override=True)
def env_bool(name: str, default: bool = False) -> bool:
value = os.getenv(name)
if value is None:
return default
return value.strip().lower() in {"1", "true", "yes", "on"}
@dataclass(frozen=True)
class Config:
app_name: str = os.getenv("APP_NAME", "API接口系统")
host: str = os.getenv("APP_HOST", os.getenv("API_HOST", "0.0.0.0"))
port: int = int(os.getenv("APP_PORT", os.getenv("API_PORT", "7788")))
debug: bool = env_bool("APP_DEBUG", env_bool("API_DEBUG", False))
secret_key: str = os.getenv("SECRET_KEY", "replace-this-secret-key")
api_key: str = os.getenv("API_KEY", "change-me")
session_cookie_secure: bool = env_bool("SESSION_COOKIE_SECURE", False)
db_host: str = os.getenv("DB_HOST", "127.0.0.1")
db_port: int = int(os.getenv("DB_PORT", "3306"))
db_user: str = os.getenv("DB_USER", "api_reader")
db_password: str = os.getenv("DB_PASSWORD", "")
db_name: str = os.getenv("DB_NAME", "member_system")
db_charset: str = os.getenv("DB_CHARSET", "utf8mb4")
db_connect_timeout: int = int(os.getenv("DB_CONNECT_TIMEOUT", "5"))
members_table: str = os.getenv("MEMBERS_TABLE", "members")
withdraw_table: str = os.getenv("WITHDRAW_TABLE", "withdraw_records")
withdraw_request_table: str = os.getenv(
"WITHDRAW_REQUEST_TABLE", "withdraw_request_records"
)
deposit_table: str = os.getenv("DEPOSIT_TABLE", "deposit_records")
read_only_mode: bool = env_bool("READ_ONLY_MODE", True)
auto_init_sim_tables: bool = env_bool("AUTO_INIT_SIM_TABLES", False)
default_activity_id: str = os.getenv("DEFAULT_ACTIVITY_ID", "ad-x1234")
deposit_search_hours: int = int(os.getenv("DEPOSIT_SEARCH_HOURS", "24"))
max_orders: int = int(os.getenv("MAX_ORDERS", "50"))
# Chatwoot 網站客服設定
chatwoot_enabled: bool = env_bool("CHATWOOT_ENABLED", True)
chatwoot_base_url: str = os.getenv(
"CHATWOOT_BASE_URL",
"http://pai.pubuli.com",
).rstrip("/")
chatwoot_website_token: str = os.getenv(
"CHATWOOT_WEBSITE_TOKEN",
"Vivum4g1WWxH1AmxoTivAcX5",
)
# 必須使用 Chatwoot Website Inbox 的 Identity Validation Token。
# 此值只保留在後端,絕不可輸出到 HTML 或 JavaScript。
chatwoot_identity_secret: str = os.getenv(
"CHATWOOT_IDENTITY_SECRET",
"",
)
chatwoot_debug: bool = env_bool("CHATWOOT_DEBUG", False)
chatwoot_account_id: int = int(os.getenv("CHATWOOT_ACCOUNT_ID", "1"))
chatwoot_inbox_id: int = int(os.getenv("CHATWOOT_INBOX_ID", "1"))
chatwoot_api_email: str = os.getenv("CHATWOOT_API_EMAIL", "")
chatwoot_api_password: str = os.getenv("CHATWOOT_API_PASSWORD", "")
chatwoot_greeting: str = os.getenv(
"CHATWOOT_GREETING",
"您好,欢迎光临【49彩票集团】客服服务中心,请问有什么可以帮到您的呢?",
)
chatwoot_greeting_image: str = os.getenv(
"CHATWOOT_GREETING_IMAGE",
"static/guest_promo.png",
)
chatwoot_guest_base_url: str = os.getenv(
"CHATWOOT_GUEST_BASE_URL",
"",
).rstrip("/")
chatwoot_guest_website_token: str = os.getenv(
"CHATWOOT_GUEST_WEBSITE_TOKEN",
"",
)
chatwoot_guest_proxy_target: str = os.getenv(
"CHATWOOT_GUEST_PROXY_TARGET",
"http://127.0.0.1:3000",
).rstrip("/")
chatwoot_guest_api_base: str = os.getenv(
"CHATWOOT_GUEST_API_BASE",
"",
).rstrip("/")
chatwoot_guest_api_email: str = os.getenv("CHATWOOT_GUEST_API_EMAIL", "")
chatwoot_guest_api_password: str = os.getenv("CHATWOOT_GUEST_API_PASSWORD", "")
chatwoot_guest_inbox_id: int = int(os.getenv("CHATWOOT_GUEST_INBOX_ID", "1"))
chatwoot_widget_jwt_secret: str = os.getenv("CHATWOOT_WIDGET_JWT_SECRET", "")
chatwoot_agent_bot_id: int = int(os.getenv("CHATWOOT_AGENT_BOT_ID", "0") or "0")
chatwoot_agent_bot_token: str = os.getenv("CHATWOOT_AGENT_BOT_TOKEN", "")
# 本機 Chatwoot → PAI MaxKB 橋接
maxkb_bridge_enabled: bool = env_bool("MAXKB_BRIDGE_ENABLED", True)
maxkb_base_url: str = os.getenv(
"MAXKB_BASE_URL",
"http://pai.pubuli.com:8080",
).rstrip("/")
maxkb_access_token: str = os.getenv("MAXKB_ACCESS_TOKEN", "")
maxkb_timeout_sec: float = float(os.getenv("MAXKB_TIMEOUT_SEC", "120"))
CONFIG = Config()