---
description: Nexus Python/FastAPI 后端规范 — 异步、Pydantic、Repository、UTC 时间
globs: server/**/*.py
alwaysApply: false
---

# Nexus Python 后端

## 依赖版本（勿随意降级）

FastAPI 0.115 · SQLAlchemy 2.0 async · aiomysql · Pydantic v2 · asyncssh 2.17 · redis 5.x · PyJWT 2.10

## API 路由

- 请求/响应模型定义在 `server/api/schemas.py`
- 业务 API 必须 `Depends(get_current_admin)`；Agent 用 `X-API-Key`；install 路由无 JWT
- 返回结构化错误，禁止裸 `except: pass`

## 数据库

- 模型：`server/domain/models/__init__.py`（14 表）
- 访问：`*_repo.py`，分页在 Repository 层 `offset/limit/count`
- 时间戳：`datetime.now(timezone.utc)`，禁止 naive datetime
- 连接池：默认 pool=160、overflow=120（安装向导按 MySQL `max_connections` 计算）

## Redis

- 客户端：`server/infrastructure/redis/client.py`，启动时强校验（ADR-009）
- 心跳 key：`heartbeat:{server_id}` TTL 600；告警 key：`alerts:{server_id}` TTL 3600
- 跨 worker 广播：Redis Pub/Sub `nexus:alerts`

## SSH

- 仅用 **asyncssh**（已删除 paramiko）
- 连接池引用计数：`acquire` / `release`，空闲 5min 清理
- 远程命令参数必须 `shlex.quote()`

## 凭据加密

- Fernet 存储 `Server.password` / `ssh_key_private`
- API 响应：`password_set` 布尔，禁止返回明文密码

## 测试

- `pytest` + `tests/conftest.py`；改 API/Service 须跑相关测试
- 新 endpoint 至少覆盖：认证失败、校验失败、成功路径
