2026-08-04 14:02:45 +08:00
|
|
|
import os
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BASE_DIR = Path(__file__).resolve().parent
|
|
|
|
|
load_dotenv(BASE_DIR / ".env")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Config:
|
|
|
|
|
"""业务后端配置,生产环境应通过环境变量注入。"""
|
|
|
|
|
|
|
|
|
|
HOST = os.getenv("HOST", "0.0.0.0")
|
|
|
|
|
PORT = int(os.getenv("PORT", "8000"))
|
|
|
|
|
DATABASE_PATH = Path(os.getenv("DATABASE_PATH", BASE_DIR / "data" / "holy_crab.db"))
|
|
|
|
|
FILE_STORAGE_PATH = Path(os.getenv("FILE_STORAGE_PATH", BASE_DIR / "data" / "files"))
|
|
|
|
|
CRAWLER_BASE_URL = os.getenv(
|
|
|
|
|
"CRAWLER_BASE_URL",
|
|
|
|
|
"http://43.139.175.114:12007",
|
|
|
|
|
).rstrip("/")
|
|
|
|
|
CRAWLER_TIMEOUT_SECONDS = int(os.getenv("CRAWLER_TIMEOUT_SECONDS", "120"))
|
|
|
|
|
CRAWLER_RETRY_TIMES = int(os.getenv("CRAWLER_RETRY_TIMES", "3"))
|
|
|
|
|
CRAWLER_RETRY_DELAY_SECONDS = float(os.getenv("CRAWLER_RETRY_DELAY_SECONDS", "2"))
|
|
|
|
|
CRAWLER_POLL_INTERVAL_SECONDS = float(os.getenv("CRAWLER_POLL_INTERVAL_SECONDS", "5"))
|
2026-08-19 15:28:14 +08:00
|
|
|
ACCEPTANCE_BROWSER_TIMEOUT_SECONDS = int(os.getenv("ACCEPTANCE_BROWSER_TIMEOUT_SECONDS", "60"))
|
|
|
|
|
ACCEPTANCE_NOTE_WORKERS = int(os.getenv("ACCEPTANCE_NOTE_WORKERS", "4"))
|
2026-08-04 14:02:45 +08:00
|
|
|
CORS_ORIGIN = os.getenv("CORS_ORIGIN", "http://localhost:5173")
|
|
|
|
|
FRONTEND_BASE_URL = os.getenv("FRONTEND_BASE_URL", CORS_ORIGIN).rstrip("/")
|
|
|
|
|
SESSION_COOKIE_NAME = os.getenv("SESSION_COOKIE_NAME", "hc_session")
|
|
|
|
|
SESSION_COOKIE_SECURE = os.getenv("SESSION_COOKIE_SECURE", "true").lower() in ("1", "true", "yes", "on")
|
|
|
|
|
SESSION_COOKIE_SAMESITE = os.getenv("SESSION_COOKIE_SAMESITE", "Lax")
|
|
|
|
|
SESSION_EXPIRE_DAYS = int(os.getenv("SESSION_EXPIRE_DAYS", "14"))
|
2026-08-19 15:28:14 +08:00
|
|
|
# 仅供本机联调使用。生产环境不要设置或必须保持 false。
|
|
|
|
|
LOCAL_AUTH_BYPASS = os.getenv("LOCAL_AUTH_BYPASS", "false").lower() in ("1", "true", "yes", "on")
|
2026-08-04 14:02:45 +08:00
|
|
|
DINGTALK_CLIENT_ID = os.getenv("DINGTALK_CLIENT_ID", os.getenv("DINGTALK_APP_KEY", ""))
|
|
|
|
|
DINGTALK_CLIENT_SECRET = os.getenv("DINGTALK_CLIENT_SECRET", os.getenv("DINGTALK_APP_SECRET", ""))
|
|
|
|
|
DINGTALK_REDIRECT_URI = os.getenv(
|
|
|
|
|
"DINGTALK_REDIRECT_URI",
|
|
|
|
|
f"{FRONTEND_BASE_URL}/api/v1/auth/dingtalk/callback",
|
|
|
|
|
)
|
|
|
|
|
DINGTALK_AUTH_URL = os.getenv("DINGTALK_AUTH_URL", "https://login.dingtalk.com/oauth2/auth")
|
|
|
|
|
DINGTALK_TOKEN_URL = os.getenv("DINGTALK_TOKEN_URL", "https://api.dingtalk.com/v1.0/oauth2/userAccessToken")
|
|
|
|
|
DINGTALK_USER_URL = os.getenv("DINGTALK_USER_URL", "https://api.dingtalk.com/v1.0/contact/users/me")
|