MathAI 题库系统 – 非 Docker 部署指南
环境要求
后端
- Python 3.13+
- MySQL 8.0
- ChromaDB
前端
- Node.js 18+
- pnpm 9+
部署步骤
1. 安装系统依赖
# Ubuntu/Debian
sudo apt update
sudo apt install -y python3.13 python3.13-venv python3-pip
sudo apt install -y mysql-server
sudo apt install -y nodejs npm
# CentOS/RHEL
sudo yum install -y python3.13
sudo yum install -y mysql-server
sudo yum install -y nodejs npm
# 安装 pnpm
npm install -g pnpm@9
2. 配置 MySQL
# 启动 MySQL
sudo systemctl start mysql
sudo systemctl enable mysql
# 安全配置
sudo mysql_secure_installation
# 创建数据库和用户
sudo mysql -u root -p
-- 创建数据库
CREATE DATABASE question_bank CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建用户
CREATE USER 'question_bank'@'localhost' IDENTIFIED BY 'your-strong-password';
-- 授权
GRANT ALL PRIVILEGES ON question_bank.* TO 'question_bank'@'localhost';
FLUSH PRIVILEGES;
-- 导入 yuekegu 数据库的 sq_knowledge 和 sq_catalog 表
-- 先从 yuekegu 数据库导出表结构和数据
USE yuekegu;
SHOW CREATE TABLE sq_knowledge;
SHOW CREATE TABLE sq_catalog;
-- 在 question_bank 数据库中创建表
USE question_bank;
-- 执行迁移脚本
3. 部署后端
# 进入后端目录
cd /path/to/question-bank/source/backend
# 创建虚拟环境
python3.13 -m venv venv
source venv/bin/activate
# 安装依赖
pip install -e .
# 配置环境变量
cp .env.example .env
nano .env
修改 .env 文件:
# 生成随机密钥
SECRET_KEY=$(openssl rand -hex 32)
# 数据库配置
DB_URL=mysql+aiomysql://question_bank:your-strong-password@localhost:3306/question_bank
# ChromaDB 配置
CHROMADB_HOST=localhost
CHROMADB_PORT=8001
运行数据库迁移:
# 运行迁移
python -m alembic upgrade head
# 初始化数据
python scripts/initial_data.py
# 创建管理员
python scripts/create_superuser.py
启动后端服务:
# 使用 systemd 管理后端服务
sudo nano /etc/systemd/system/question-bank-backend.service
[Unit]
Description=Question Bank Backend API
After=network.target mysql.service
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/path/to/question-bank/source/backend
Environment="PATH=/path/to/question-bank/source/backend/venv/bin"
ExecStart=/path/to/question-bank/source/backend/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
# 启动服务
sudo systemctl daemon-reload
sudo systemctl start question-bank-backend
sudo systemctl enable question-bank-backend
# 查看状态
sudo systemctl status question-bank-backend
启动 Worker 服务:
# 创建 Worker 服务
sudo nano /etc/systemd/system/question-bank-worker.service
[Unit]
Description=Question Bank Celery Worker
After=network.target mysql.service
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/path/to/question-bank/source/backend
Environment="PATH=/path/to/question-bank/source/backend/venv/bin"
ExecStart=/path/to/question-bank/source/backend/venv/bin/python -m app.worker
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
# 启动 Worker
sudo systemctl daemon-reload
sudo systemctl start question-bank-worker
sudo systemctl enable question-bank-worker
4. 部署前端
# 进入前端目录
cd /path/to/question-bank/source/frontend
# 安装依赖
pnpm install
# 构建生产版本
pnpm build
# 部署到 Nginx 目录
sudo cp -r .output/public/* /var/www/question-bank/
5. 配置 Nginx
# 安装 Nginx
sudo apt install -y nginx
# 创建 Nginx 配置
sudo nano /etc/nginx/sites-available/question-bank
server {
listen 80;
server_name mathai.yuekegu.com;
# 前端静态文件
location / {
root /var/www/question-bank;
index index.html;
try_files $uri $uri/ /index.html;
}
# 后端 API 代理
location /api/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
}
# WebSocket 支持
location /api/ws/ {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
# 禁止访问敏感文件
location ~ ^/(\.env|\.git|\.svn) {
return 404;
}
# 日志
access_log /var/log/nginx/question-bank.access.log;
error_log /var/log/nginx/question-bank.error.log;
}
# 启用站点
sudo ln -s /etc/nginx/sites-available/question-bank /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
6. 配置 SSL (可选)
# 安装 Certbot
sudo apt install -y certbot python3-certbot-nginx
# 申请证书
sudo certbot --nginx -d mathai.yuekegu.com
# 自动续期
sudo crontab -e
# 添加: 0 12 * * * /usr/bin/certbot renew --quiet
7. 配置 ChromaDB
# 下载 ChromaDB
pip install chromadb
# 启动 ChromaDB 服务
chroma run --host 0.0.0.0 --port 8001 --path /var/lib/chromadb
# 使用 systemd 管理
sudo nano /etc/systemd/system/chromadb.service
[Unit]
Description=ChromaDB Vector Database
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
ExecStart=/path/to/question-bank/source/backend/venv/bin/chroma run --host 0.0.0.0 --port 8001 --path /var/lib/chromadb
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start chromadb
sudo systemctl enable chromadb
验证部署
# 检查后端
curl http://localhost:8000/docs
# 检查前端
curl http://localhost
# 检查数据库
mysql -u question_bank -p -e "USE question_bank; SHOW TABLES;"
# 检查服务状态
sudo systemctl status question-bank-backend
sudo systemctl status question-bank-worker
sudo systemctl status chromadb
sudo systemctl status mysql
sudo systemctl status nginx
常用命令
# 重启所有服务
sudo systemctl restart question-bank-backend
sudo systemctl restart question-bank-worker
sudo systemctl restart chromadb
sudo systemctl restart mysql
sudo systemctl restart nginx
# 查看日志
sudo journalctl -u question-bank-backend -f
sudo journalctl -u question-bank-worker -f
# 备份数据库
mysqldump -u question_bank -p question_bank > backup_$(date +%Y%m%d).sql
# 恢复数据库
mysql -u question_bank -p question_bank < backup.sql
故障排查
1. 后端无法启动
# 检查日志
sudo journalctl -u question-bank-backend -n 100
# 检查端口占用
netstat -tlnp | grep 8000
# 检查 MySQL 连接
mysql -u question_bank -p -e "SELECT 1"
2. 前端无法访问
# 检查 Nginx 状态
sudo systemctl status nginx
# 检查 Nginx 配置
sudo nginx -t
# 检查静态文件
ls -la /var/www/question-bank/
3. 数据库连接失败
# 检查 MySQL 状态
sudo systemctl status mysql
# 检查用户权限
mysql -u root -p -e "SELECT User, Host FROM mysql.user;"
生产环境建议
- 安全配置
- 使用防火墙限制访问
- 定期更新系统和依赖
-
使用强密码
-
性能优化
- 配置 MySQL 缓存
- 启用 Nginx 缓存
-
使用 CDN
-
监控
- 配置日志监控
- 监控服务状态
-
监控磁盘空间
-
备份
- 定期备份数据库
- 备份上传文件
- 测试恢复流程