import os from datetime import timedelta _basedir = os.path.abspath(os.path.dirname(__file__)) class Config: # ── Flask ────────────────────────────────────────────────── SECRET_KEY = os.environ.get("SM_SECRET_KEY", "sm-dev-key-change-in-prod") SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_SAMESITE = "Lax" SESSION_COOKIE_DOMAIN = os.environ.get("SM_SESSION_DOMAIN", None) SESSION_COOKIE_SECURE = os.environ.get("SM_COOKIE_SECURE", "false").lower() == "true" PERMANENT_SESSION_LIFETIME = timedelta(hours=8) SESSION_COOKIE_NAME = os.environ.get("SM_SESSION_NAME", "sm_session") # ── 数据库 ───────────────────────────────────────────────── SQLALCHEMY_DATABASE_URI = os.environ.get( "SM_DB_URI", f"sqlite:///{os.path.join(_basedir, 'socks_manager.db')}" ) SQLALCHEMY_TRACK_MODIFICATIONS = False # ── 管理后台 ─────────────────────────────────────────────── @staticmethod def admin_user(): return os.environ.get("SM_ADMIN_USER", "admin") @staticmethod def admin_password(): return os.environ.get("SM_ADMIN_PASSWORD", "") # ── SOCKS5 引擎 ─────────────────────────────────────────── SOFT_ENGINE = "builtin" # builtin | 3proxy DEFAULT_LISTEN_HOST = "0.0.0.0" DEFAULT_PORT = 1080 DEFAULT_TIMEOUT = 30 # 秒 MAX_INSTANCES = 20 # ── 流量与限速 (默认值) ──────────────────────────────────── DEFAULT_BANDWIDTH_DOWN = 0 # 下行默认 Mbps (0=不限) DEFAULT_BANDWIDTH_UP = 0 # 上行默认 Mbps DEFAULT_CONCURRENT = 10 # 单用户最大并发连接 DEFAULT_TOTAL_TRAFFIC = 0 # 总流量上限 MB (0=不限) DEFAULT_MONTHLY_TRAFFIC = 0 # 月流量 MB # ── 健康检测 ─────────────────────────────────────────────── HEALTH_TIMEOUT = 8 # 秒 HEALTH_CHECK_ALL_INTERVAL = 300 # 秒 # ── 备份 ─────────────────────────────────────────────────── BACKUP_DIR = os.environ.get("SM_BACKUP_DIR", os.path.join(_basedir, "backups")) BACKUP_KEEP = 10 # 保留份数 # ── 防爆破 ───────────────────────────────────────────────── FAIL2BAN_MAX_ATTEMPTS = 10 FAIL2BAN_WINDOW = 600 # 秒 # ── Webhook ──────────────────────────────────────────────── WEBHOOK_URLS = os.environ.get("SM_WEBHOOK_URLS", "").split(",") # ── 日志 ─────────────────────────────────────────────────── LOG_LEVEL = os.environ.get("SM_LOG_LEVEL", "INFO")