feat(core): 初始化 Key-IP Sentinel 服务与部署骨架

- 搭建 FastAPI、Redis、PostgreSQL、Nginx 与 Docker Compose 基础结构
- 实现反向代理、首用绑定、拦截告警、归档任务和管理接口
- 提供 Vue3 管理后台初版,以及 uv/requirements 双依赖配置
This commit is contained in:
2026-03-04 00:18:33 +08:00
commit ab1bd90c65
50 changed files with 5645 additions and 0 deletions

53
app/dependencies.py Normal file
View File

@@ -0,0 +1,53 @@
from __future__ import annotations
from collections.abc import AsyncIterator
from fastapi import Depends, HTTPException, Request, status
from redis.asyncio import Redis
from sqlalchemy.ext.asyncio import AsyncSession
from app.config import RuntimeSettings, Settings
from app.core.security import decode_admin_jwt, extract_bearer_token
from app.services.alert_service import AlertService
from app.services.archive_service import ArchiveService
from app.services.binding_service import BindingService
def get_settings(request: Request) -> Settings:
return request.app.state.settings
def get_redis(request: Request) -> Redis | None:
return request.app.state.redis
async def get_db_session(request: Request) -> AsyncIterator[AsyncSession]:
session_factory = request.app.state.session_factory
async with session_factory() as session:
yield session
def get_binding_service(request: Request) -> BindingService:
return request.app.state.binding_service
def get_alert_service(request: Request) -> AlertService:
return request.app.state.alert_service
def get_archive_service(request: Request) -> ArchiveService:
return request.app.state.archive_service
def get_runtime_settings(request: Request) -> RuntimeSettings:
return request.app.state.runtime_settings
async def require_admin(request: Request, settings: Settings = Depends(get_settings)) -> dict:
token = extract_bearer_token(request.headers.get("authorization"))
if token is None:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Missing admin bearer token.",
)
return decode_admin_jwt(token, settings)