feat: 重构为 SOCKS5 代理管理平台 v2.0
架构: - engine/server.py: asyncio SOCKS5 服务器引擎(含隧道/认证/限速) - engine/instances.py: 多实例管理器(独立事件循环/热启动/热停止) - services/user_service.py: 用户认证/流量统计/IP白名单/防爆破 - services/stats_service.py: 实时监控/流量趋势/连接追踪 - services/backup_service.py: 数据库备份与恢复 - api/v1.py: 完整 RESTful API - web/routes.py: Web 管理面板(暗色 Bootstrap 5 主题) 功能覆盖: ✅ 多实例 SOCKS5 管理(创建/启动/停止/重启/热加载) ✅ 用户认证(无认证/账号密码/流量上限/限速/并发限制) ✅ IP 白名单/黑名单/防爆破 ✅ 实时仪表盘(CPU/内存/网络/活跃连接) ✅ 流量统计(30天趋势图/用户排名/实例统计) ✅ 活跃连接追踪 ✅ 审计日志(事件/用户/IP 筛选) ✅ 数据库备份与恢复 ✅ 管理员密码保护 ✅ 16 项功能测试全部通过
This commit is contained in:
@@ -1,58 +1,58 @@
|
||||
import os
|
||||
import logging
|
||||
|
||||
basedir = os.path.abspath(os.path.dirname(__file__))
|
||||
from datetime import timedelta
|
||||
|
||||
_basedir = os.path.abspath(os.path.dirname(__file__))
|
||||
|
||||
class Config:
|
||||
SECRET_KEY = os.environ.get("SM_SECRET_KEY", "change-me-in-production")
|
||||
# ── Flask ──────────────────────────────────────────────────
|
||||
SECRET_KEY = os.environ.get("SM_SECRET_KEY", "sm-dev-key-change-in-prod")
|
||||
SESSION_COOKIE_HTTPONLY = True
|
||||
SESSION_COOKIE_SAMESITE = "Lax"
|
||||
PERMANENT_SESSION_LIFETIME = timedelta(hours=8)
|
||||
|
||||
# ── 数据库 ─────────────────────────────────────────────────
|
||||
SQLALCHEMY_DATABASE_URI = os.environ.get(
|
||||
"SM_DB_URI", f"sqlite:///{os.path.join(basedir, 'socks_manager.db')}"
|
||||
"SM_DB_URI", f"sqlite:///{os.path.join(_basedir, 'socks_manager.db')}"
|
||||
)
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||
|
||||
# 管理后台认证(在 create_app 时读取,确保 env var 生效)
|
||||
# ── 管理后台 ───────────────────────────────────────────────
|
||||
@staticmethod
|
||||
def admin_user():
|
||||
return os.environ.get("SM_ADMIN_USER", "admin")
|
||||
|
||||
@staticmethod
|
||||
def admin_password():
|
||||
return os.environ.get("SM_ADMIN_PASSWORD", "")
|
||||
|
||||
# 健康检测
|
||||
HEALTH_CHECK_TIMEOUT = int(os.environ.get("SM_HEALTH_TIMEOUT", "10"))
|
||||
HEALTH_CHECK_INTERVAL = int(os.environ.get("SM_HEALTH_INTERVAL", "300")) # 秒
|
||||
# ── 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")
|
||||
|
||||
|
||||
def create_app(config_class=Config):
|
||||
from flask import Flask
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config.from_object(config_class)
|
||||
|
||||
# 日志
|
||||
logging.basicConfig(
|
||||
level=getattr(logging, app.config["LOG_LEVEL"]),
|
||||
format="%(asctime)s [%(levelname)s] %(message)s",
|
||||
)
|
||||
|
||||
from extensions import db
|
||||
db.init_app(app)
|
||||
|
||||
from models import db as _db
|
||||
with app.app_context():
|
||||
_db.create_all()
|
||||
|
||||
# Blueprint 注册
|
||||
from routes import main
|
||||
from routes import api
|
||||
from auth import bp as auth_bp
|
||||
|
||||
app.register_blueprint(auth_bp)
|
||||
app.register_blueprint(main.bp)
|
||||
app.register_blueprint(api.bp, url_prefix="/api")
|
||||
|
||||
return app
|
||||
|
||||
Reference in New Issue
Block a user