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;"

生产环境建议

  1. 安全配置
  2. 使用防火墙限制访问
  3. 定期更新系统和依赖
  4. 使用强密码

  5. 性能优化

  6. 配置 MySQL 缓存
  7. 启用 Nginx 缓存
  8. 使用 CDN

  9. 监控

  10. 配置日志监控
  11. 监控服务状态
  12. 监控磁盘空间

  13. 备份

  14. 定期备份数据库
  15. 备份上传文件
  16. 测试恢复流程

Leave A Comment

Recommended Posts