diff --git a/docs/DEPLOY.md b/docs/DEPLOY.md new file mode 100644 index 0000000..ff021d8 --- /dev/null +++ b/docs/DEPLOY.md @@ -0,0 +1,155 @@ +# 部署指南 + +## 1. NAS 端部署 (FAM-Core + FAM-UI + MariaDB) + +### 1.1 MariaDB +```bash +# 安装 MariaDB (通过 Synology 套件中心) +# 确认端口 3306 可用 + +# 执行 DDL +python3 scripts/init_db.py --host 127.0.0.1 --port 3306 --user root --password <密码> +``` + +### 1.2 FAM-Core +```bash +cd /path/to/sentinel-home-ai/fam-core +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt + +# 配置 +cp config/config.yaml.example config/config.yaml +# 编辑 config.yaml: 数据库密码、Oracle Tailscale IP、token 等 + +# 启动 +./scripts/start_core.sh +# 或手动: gunicorn -w 1 -b 0.0.0.0:8000 --timeout 120 src.fam_core.app:app +``` + +### 1.3 FAM-UI +```bash +cd /path/to/sentinel-home-ai/fam-ui +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt + +# 配置 +cp config/config.yaml.example config/config.yaml +# 编辑 config.yaml: 数据库连接、FAM-Core 地址 + +# 启动 +./scripts/start_ui.sh +# 或手动: streamlit run src/app.py --server.port 8501 --server.address 0.0.0.0 +``` + +## 2. Oracle 端部署 (FAM-Edge + Ollama + FFmpeg) + +### 2.1 系统依赖 +```bash +# FFmpeg +sudo apt update && sudo apt install -y ffmpeg + +# OpenCV 依赖 +sudo apt install -y python3-opencv libopencv-dev + +# Ollama +curl -fsSL https://ollama.com/install.sh | sh +systemctl enable ollama +systemctl start ollama + +# 拉取模型 +ollama pull llava-phi3 +``` + +### 2.2 FAM-Edge +```bash +cd /path/to/sentinel-home-ai/fam-edge +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt + +# 配置 +cp config/config.yaml.example config/config.yaml +# 编辑 config.yaml: NAS Tailscale IP、media_token、Gemini API Key + +# 设置 Gemini API Key 环境变量 +export GEMINI_API_KEY="your-api-key-here" + +# 启动 +./scripts/start_edge.sh +# 或手动: gunicorn -w 1 -b 0.0.0.0:5000 --timeout 600 src.fam_edge.app:app +``` + +### 2.3 模型可行性压测 (阶段一验证) +```bash +# 测试 llava-phi3 单张图推理耗时 +ollama run llava-phi3 "描述这张图片" --images /path/to/test.jpg + +# 预期: +# - 单张 ≤ 8 秒 → 可行 +# - 单张 ≤ 30 秒 → 可接受 +# - 单张 > 30 秒 → 需换更小模型或减帧 +``` + +## 3. Tailscale 组网 + +```bash +# NAS 端 +curl -fsSL https://tailscale.com/install.sh | sh +sudo tailscale up + +# Oracle 端 +curl -fsSL https://tailscale.com/install.sh | sh +sudo tailscale up + +# 验证 +# NAS: ping 100.x.x.20 (Oracle Tailscale IP) +# Oracle: ping 100.x.x.10 (NAS Tailscale IP) +``` + +## 4. 开机自启 (可选) + +### NAS 端 (使用任务计划) +```bash +# Synology DSM -> 控制面板 -> 任务计划 -> 新增 -> 触发的任务 -> 开机 +# 脚本: +cd /path/to/sentinel-home-ai +./scripts/start_core.sh & +./scripts/start_ui.sh & +``` + +### Oracle 端 (使用 systemd) +```bash +sudo tee /etc/systemd/system/fam-edge.service << 'EOF' +[Unit] +Description=FAM-Edge Service +After=network.target ollama.service + +[Service] +Type=simple +User=ubuntu +WorkingDirectory=/path/to/sentinel-home-ai/fam-edge +Environment=GEMINI_API_KEY=your-api-key +ExecStart=/path/to/sentinel-home-ai/fam-edge/venv/bin/gunicorn -w 1 -b 0.0.0.0:5000 --timeout 600 src.fam_edge.app:app +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF + +sudo systemctl enable fam-edge +sudo systemctl start fam-edge +``` + +## 5. 验证清单 + +| 项目 | 命令 | 预期 | +|------|------|------| +| NAS MariaDB | `mysql -u root -p -e "SHOW DATABASES"` | 包含 sentinel_home_ai | +| NAS FAM-Core | `curl http://localhost:8000/health` | `{"status":"ok"}` | +| NAS FAM-UI | 浏览器访问 `http://192.168.50.64:8501` | Streamlit 页面 | +| Oracle FAM-Edge | `curl http://localhost:5000/health` | `{"status":"ok"}` | +| Oracle Ollama | `curl http://localhost:11434/api/tags` | 模型列表含 llava-phi3 | +| Tailscale | NAS `ping 100.x.x.20` | 通 | diff --git a/scripts/start_core.sh b/scripts/start_core.sh new file mode 100755 index 0000000..0f9a25b --- /dev/null +++ b/scripts/start_core.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# FAM-Core 启动脚本 (NAS 端) +# 用法: ./scripts/start_core.sh +set -e + +APP_DIR="$(cd "$(dirname "$0")/.." && pwd)/fam-core" +CONFIG_FILE="$APP_DIR/config/config.yaml" + +if [ ! -f "$CONFIG_FILE" ]; then + echo "错误: 配置文件不存在: $CONFIG_FILE" + echo "请复制 config.yaml.example 为 config.yaml 并修改实际值" + exit 1 +fi + +cd "$APP_DIR" + +# 检查虚拟环境 +if [ -d "venv" ]; then + source venv/bin/activate +fi + +echo "启动 FAM-Core (端口 8000)..." +exec gunicorn -w 1 -b 0.0.0.0:8000 --timeout 120 src.fam_core.app:app diff --git a/scripts/start_edge.sh b/scripts/start_edge.sh new file mode 100755 index 0000000..b4bfdd5 --- /dev/null +++ b/scripts/start_edge.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# FAM-Edge 启动脚本 (Oracle 端) +# 用法: ./scripts/start_edge.sh +set -e + +APP_DIR="$(cd "$(dirname "$0")/.." && pwd)/fam-edge" +CONFIG_FILE="$APP_DIR/config/config.yaml" + +if [ ! -f "$CONFIG_FILE" ]; then + echo "错误: 配置文件不存在: $CONFIG_FILE" + echo "请复制 config.yaml.example 为 config.yaml 并修改实际值" + exit 1 +fi + +cd "$APP_DIR" + +# 检查虚拟环境 +if [ -d "venv" ]; then + source venv/bin/activate +fi + +echo "启动 FAM-Edge (端口 5000)..." +exec gunicorn -w 1 -b 0.0.0.0:5000 --timeout 600 src.fam_edge.app:app diff --git a/scripts/start_ui.sh b/scripts/start_ui.sh new file mode 100755 index 0000000..2a63ecf --- /dev/null +++ b/scripts/start_ui.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# FAM-UI 启动脚本 (NAS 端) +# 用法: ./scripts/start_ui.sh +set -e + +APP_DIR="$(cd "$(dirname "$0")/.." && pwd)/fam-ui" +CONFIG_FILE="$APP_DIR/config/config.yaml" + +if [ ! -f "$CONFIG_FILE" ]; then + echo "错误: 配置文件不存在: $CONFIG_FILE" + echo "请复制 config.yaml.example 为 config.yaml 并修改实际值" + exit 1 +fi + +cd "$APP_DIR" + +# 检查虚拟环境 +if [ -d "venv" ]; then + source venv/bin/activate +fi + +echo "启动 FAM-UI Streamlit (端口 8501)..." +exec streamlit run src/app.py --server.port 8501 --server.address 0.0.0.0