diff --git a/README.md b/README.md index b61fe3c..bccf54b 100644 --- a/README.md +++ b/README.md @@ -294,7 +294,10 @@ chat_history 独立表(问答上下文摘要留存) | 端点 | 方法 | 说明 | |------|------|------| -| `/health` | GET | 服务健康 | +| `/health` | GET | 服务健康(**免登录**) | +| `/api/login` | POST | 登录:`{"username","password"}` → 校验 `FAM_AUTH_USER`/`FAM_AUTH_PASS`(默认 `ericwyuan`/`iLoveJava5`,NAS `.env` 可改)→ 种 HttpOnly cookie `fam_session`(7 天) | +| `/api/logout` | POST | 退出登录(清 cookie) | +| `/api/auth/check` | GET | 登录态检查:`{"authed": true\|false}`(**免登录**) | | `/api/status` | GET | Oracle-Sync + MotionNotifier 状态(sync running/cursor;motion poll_enabled/pushed_total/heartbeat) | | `/api/chat/ask` | POST | 用户问答:`{"question","queried_person","queried_date"}` → `{"answer","context_summary","chat_id"}`(上下文来自 sync_events) | | `/api/chat/history` | GET | 对话历史(`?date=` 或 `?person=&limit=`) | @@ -302,7 +305,7 @@ chat_history 独立表(问答上下文摘要留存) | `/api/member/list` | GET | 全部人物(label + canonical_name + 是否命名) | | `/api/member/name` | POST | 命名:`{"label","canonical_name"}` → 回推 Oracle 并即时拉回本地镜像 | | `/api/member/merge` | POST | 合并:`{"source","target"}` → 将 source 并入 target 身份(统一 canonical_name) | -| `/api/ss/webhook` | POST | **可选**:接收 Surveillance Station Webhook(参数 `event_time`/`device_name`/`event_name`/`server_name`/`thumbnail_url`),映射后推送 Oracle `/api/ss/motion`(SS 行動規則未配置则不触发) | +| `/api/ss/webhook` | POST | **可选 + 免登录**:接收 Surveillance Station Webhook(参数 `event_time`/`device_name`/`event_name`/`server_name`/`thumbnail_url`),映射后推送 Oracle `/api/ss/motion`(SS 行動規則未配置则不触发;SS 推送无法携带登录态故列入白名单) | | `/api/ss/status` | GET | 运动监测状态:`poll_enabled` / `camera_loaded` / `camera_map` / `pushed_total` / `last_error` / 心跳 | | `/api/ui/videos` | GET | 运动片段会话列表(`?date=&page=`;**只返回 `motion_` 前缀或有事件的会话**,0 段素材不展示) | | `/api/ui/videos/` | GET | 会话详情:`{video, events[]}`(事件含 person_list_json / person_appearances_json / is_attention_event) | @@ -500,11 +503,17 @@ task_id=289(30s 测试片段)全链路打通:推送 5.7MB → Edge 分析 | 组件 | 节点 | 路径 | 启动 | |------|------|------|------| -| FAM-Core | NAS | `/volume1/web/sentinel-home-ai/fam-core/` | `bash start_core.sh`(gunicorn -w 1 :8000,source .env 注入 DSM_*/ORACLE_SYNC_TOKEN) | +| FAM-Core | NAS | `/volume1/web/sentinel-home-ai/fam-core/` | `bash start_core.sh`(gunicorn -w 1 :8000,source .env 注入 DSM_*/ORACLE_SYNC_TOKEN/FAM_AUTH_*) | | FAM-UI | NAS | `/volume1/web/sentinel-home-ai/fam-ui/dist/` | Vue3 构建产物,由 FAM-Core `static_app.py` 托管(无需独立进程);本地改代码后 `npm run build` 并 tar 部署 dist | | FAM-Edge | Oracle | `/opt/fam-edge/` | **systemd `fam-edge.service` 守护**(Restart=always);部署代码后 `sudo systemctl restart fam-edge`(勿手动 setsid,会端口冲突) | | Ollama | Oracle | systemd 托管 | 环境变量 `OLLAMA_KEEP_ALIVE=-1` | +> **外网访问(frp 内网穿透)**:NAS 跑 `frpc`(`/etc/frp/frpc.toml`,S99frpc.sh 守护),映射到 Oracle `129.146.203.203`(frps :7000): +> - `3000` → NAS Gitea、`8500` → NAS WordPress(8088)、**`8000` → NAS FAM-Core(本系统)** +> - 外网入口 `http://129.146.203.203:8000`,**需登录**(见 §5.2 `/api/login`) +> +> **登录校验(2026-08-22)**:FAM-Core 全站拦截(`auth.py`)——页面未登录 302 `/login`(内置深色登录页,SPA 零改动),`/api/*` 未登录 401;凭据 `FAM_AUTH_USER`/`FAM_AUTH_PASS`(NAS `.env`,默认 `ericwyuan`/`iLoveJava5`);白名单免登录:`/login` `/api/login` `/api/logout` `/api/auth/check` `/health` `/api/ss/webhook` `/assets/*`。登录态为进程内 token + HttpOnly cookie(7 天),重启 fam-core 需重新登录。 + > Oracle 部署方式:本地 git 提交 push Gitea → tar 管道到 `/opt/fam-edge`(`--strip-components=1` 解临时目录再 cp,避免动 data/venv/gdrive_videos)。 ### 8.2 依赖