06470512f6
### 严重修复 1. 跨服务器无法登录 - 新增SESSION_COOKIE_DOMAIN/SECURE/NAME配置 2. SOCKS5用户密码明文存储→bcrypt哈希(兼容自动迁移) 3. 仪表盘审计日志不显示→替换为空循环为真实API加载 4. 管理员登录防爆破未生效→auth.py集成check_fail2ban ### 中等问题修复 5. 流量趋势图表无数据→新增record_traffic_snapshot后台线程 6. 网络流量累计值跳变→新增基线差值机制 7. asyncio连接计数非线程安全→加锁保护 ### 优化改进 8. API密钥页面截断文本修复 9. 新增gunicorn/bcrypt依赖 10. 更新README环境变量文档和生产建议 11. 登录密码常量时间对比防时序攻击 12. 仪表盘图表添加animation:false防卡顿
62 lines
3.4 KiB
Python
62 lines
3.4 KiB
Python
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")
|