Files
book-mcp/deploy/install.sh
Quentin 9b0910ccb1 Initial commit: book-mcp 教辅处理 MCP server + Arco Vue 管理端
后端 (book_mcp_server.py, 335 行, 15 个 MCP 工具):
- create_book / add_document / mark_html_ready / mark_json_ready / mark_failed
- update_book_status / soft_delete_book / retry_failed
- get_book / list_books / get_document / list_documents / get_document_url
- upload_to_rustfs / health
- 走 JSON-RPC + stateless_http + json_response(前端可直接调)
- launchd 守护 / 6 秒拉起(macOS)
- systemd 守护脚本(Linux/codelab)

存储:
- MongoDB (mongo:8.0 容器) - book/book_document/document_file 三表
- RustFS 对象存储(fs.code-lab.cn/scan/)- book/<id>/docs/<doc_id>/{docx,html,json}
- 幂等设计: zip_sha256 唯一 + (book_id+original_path) 唯一

前端 (Vue 3 + TS + Arco Design):
- 列表页 /book/list - 搜索 + 状态过滤 + 进度
- 详情页 /book/:id - 文档折叠 + 文件下载
- MCP 客户端 src/api/mcp.ts (JSON-RPC over fetch)

部署:
- deploy/install.sh (codelab 一键装 backend + systemd)
- deploy/install-frontend.sh (vite dev / 生产构建)
- docs/deploy.md (运维手册)

测试:
- tests/test_basic.py (sanity 7 项)
- tests/test_e2e.py (完整 e2e: docx→HTML→入库→上传→校验)
2026-10-11 18:03:57 +08:00

144 lines
4.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# book-mcp 一键部署 — 在 codelab 上跑
#
# 用法(在 codelab 上):
# cd ~/book-mcp
# bash deploy/install.sh
#
# 准备:
# 1. docker 已装
# 2. python3.11+ 已装
# 3. nginx/caddy 二选一(可选,本脚本用 caddy 配反代)
#
# 部署:
# - book-mcp-mongo(27018)
# - book-mcp-server(8100,由 launchd 守护)
# - frontend(vite dev 5176 or 生产构建)
set -euo pipefail
cd "$(dirname "$0")/.."
ROOT="$(pwd)"
log() { echo "[$(date +%H:%M:%S)] $*"; }
# ============================================================
# 1. MongoDB 容器(已存在则跳过)
# ============================================================
log "→ 检查 book-mcp-mongo"
if ! docker ps -a --format '{{.Names}}' | grep -q '^book-mcp-mongo$'; then
log " 启动 mongo 容器..."
docker run -d \
--name book-mcp-mongo \
-p 27018:27017 \
-e MONGO_INITDB_ROOT_USERNAME=book_admin \
-e MONGO_INITDB_ROOT_PASSWORD=book_mongo_2026 \
-e MONGO_INITDB_DATABASE=book_mcp \
-v book-mcp-mongo-data:/data/db \
--restart unless-stopped \
mongo:8.0
log " ✓ 容器已起(密码:book_mongo_2026)"
sleep 4
else
log " ✓ 容器已存在"
docker start book-mcp-mongo 2>/dev/null || true
fi
# ============================================================
# 2. Python venv + 依赖
# ============================================================
log "→ 准备 Python venv"
VENV=/opt/book-mcp-venv
if [ ! -d "$VENV" ]; then
python3 -m venv "$VENV"
log " ✓ venv 创建"
fi
$VENV/bin/pip install -q --upgrade pip
$VENV/bin/pip install -q -r "$ROOT/requirements.txt"
log " ✓ Python 依赖装好"
# ============================================================
# 3. MongoDB 索引
# ============================================================
log "→ 建 MongoDB 索引"
$VENV/bin/python "$ROOT/book_mcp_server.py" --init-db
log " ✓ 索引建好"
# ============================================================
# 4. 配置
# ============================================================
log "→ 写 .env(如果不存在)"
if [ ! -f "$ROOT/.env" ]; then
cat > "$ROOT/.env" <<EOF
BOOK_MCP_HOME=$ROOT
BOOK_MCP_MONGO_URL=mongodb://book_admin:book_mongo_2026@127.0.0.1:27018/book_mcp?authSource=admin
EOF
log " ✓ .env 写好"
fi
# ============================================================
# 5. systemd unit(替代 launchd,因为是 Linux)
# ============================================================
log "→ 装 systemd unit"
sudo tee /etc/systemd/system/book-mcp.service > /dev/null <<EOF
[Unit]
Description=book-mcp MCP server
After=docker.service
Requires=docker.service
Wants=book-mcp-mongo.service
[Service]
Type=simple
WorkingDirectory=$ROOT
Environment=BOOK_MCP_HOME=$ROOT
Environment=PATH=$VENV/bin:/usr/local/bin:/usr/bin:/bin
ExecStart=$VENV/bin/python $ROOT/book_mcp_server.py --port 8100
Restart=always
RestartSec=10
User=$USER
StandardOutput=append:/var/log/book-mcp/server.log
StandardError=append:/var/log/book-mcp/server.error.log
[Install]
WantedBy=multi-user.target
EOF
sudo mkdir -p /var/log/book-mcp
sudo chown $USER:$USER /var/log/book-mcp
sudo systemctl daemon-reload
sudo systemctl enable book-mcp.service
sudo systemctl restart book-mcp.service
sleep 3
log " ✓ systemd 服务已起"
# ============================================================
# 6. 健康检查
# ============================================================
log "→ 健康检查"
sleep 2
if $VENV/bin/python -c "
import asyncio
from fastmcp.client import Client
async def m():
async with Client('http://127.0.0.1:8100/mcp') as c:
h = await c.call_tool('health', {})
assert h.data['wordparse'] and h.data['mongo']
print('OK:', h.data)
asyncio.run(m())
" 2>&1; then
log " ✓ 健康"
else
log " ✗ 健康检查失败,看 /var/log/book-mcp/server.error.log"
exit 1
fi
log ""
log "============================================================"
log "✅ book-mcp 部署完成"
log "============================================================"
log " MCP endpoint: http://127.0.0.1:8100/mcp"
log " MongoDB: mongodb://book_admin:book_mongo_2026@127.0.0.1:27018/book_mcp?authSource=admin"
log " 日志: /var/log/book-mcp/server.log"
log " 服务管理: sudo systemctl {start|stop|restart|status} book-mcp"
log ""
log " 部署前端:cd frontend && bash ../deploy/install-frontend.sh"