Files
012-kaopeilian/backend/deploy/quick_deploy.sh
111 998211c483 feat: 初始化考培练系统项目
- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
2026-01-24 19:33:28 +08:00

224 lines
5.5 KiB
Bash

#!/bin/bash
# 快速部署脚本 - 考陪练 SQL 执行器
# 使用方法: bash quick_deploy.sh
set -e # 遇到错误立即退出
echo "==================================="
echo "考陪练 SQL 执行器快速部署脚本"
echo "服务器: 120.79.247.16"
echo "==================================="
# 配置变量
APP_DIR="/opt/kaopeilian/backend"
SERVICE_NAME="kaopeilian-backend"
PYTHON_VERSION="python3"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 打印带颜色的信息
print_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
# 检查是否为 root 用户
if [[ $EUID -ne 0 ]]; then
print_error "此脚本必须以 root 用户运行"
exit 1
fi
# 1. 安装系统依赖
print_info "安装系统依赖..."
apt update
apt install -y python3 python3-pip python3-venv git mysql-client
# 2. 创建应用目录
print_info "创建应用目录..."
mkdir -p $APP_DIR
# 3. 检查代码是否存在
if [ ! -f "$APP_DIR/app/main.py" ]; then
print_warning "代码不存在,请先上传代码到 $APP_DIR"
print_info "可以使用以下命令上传:"
echo "scp -r /path/to/kaopeilian-backend/* root@120.79.247.16:$APP_DIR/"
exit 1
fi
cd $APP_DIR
# 4. 创建虚拟环境
print_info "创建 Python 虚拟环境..."
if [ ! -d "venv" ]; then
$PYTHON_VERSION -m venv venv
fi
# 5. 激活虚拟环境并安装依赖
print_info "安装 Python 依赖..."
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
# 6. 创建环境配置文件
if [ ! -f ".env" ]; then
print_info "创建环境配置文件..."
cat > .env << EOF
# 应用配置
APP_NAME=KaoPeiLian
DEBUG=False
HOST=0.0.0.0
PORT=8000
# 数据库配置
DATABASE_URL=mysql+aiomysql://root:Kaopeilian2025!@#@localhost:3306/kaopeilian?charset=utf8mb4
# Redis配置
REDIS_URL=redis://localhost:6379/0
# JWT配置
SECRET_KEY=production-secret-key-for-kaopeilian-2025-at-least-32-chars
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
# CORS配置
CORS_ORIGINS=["http://120.79.247.16:8000", "http://aiedu.ireborn.com.cn", "http://localhost:3000"]
# 日志配置
LOG_LEVEL=INFO
LOG_FORMAT=json
EOF
print_info "环境配置文件已创建"
else
print_warning "环境配置文件已存在,跳过创建"
fi
# 7. 创建 systemd 服务
print_info "配置 systemd 服务..."
cat > /etc/systemd/system/${SERVICE_NAME}.service << EOF
[Unit]
Description=KaoPeiLian Backend API
After=network.target mysql.service
[Service]
Type=simple
User=root
WorkingDirectory=$APP_DIR
Environment="PATH=$APP_DIR/venv/bin"
Environment="PYTHONPATH=$APP_DIR"
ExecStart=$APP_DIR/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 2
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
# 8. 重新加载 systemd 并启动服务
print_info "启动服务..."
systemctl daemon-reload
systemctl enable ${SERVICE_NAME}
# 检查服务是否已经运行
if systemctl is-active --quiet ${SERVICE_NAME}; then
print_info "重启服务..."
systemctl restart ${SERVICE_NAME}
else
print_info "启动服务..."
systemctl start ${SERVICE_NAME}
fi
# 9. 等待服务启动
print_info "等待服务启动..."
sleep 5
# 10. 检查服务状态
if systemctl is-active --quiet ${SERVICE_NAME}; then
print_info "服务启动成功!"
else
print_error "服务启动失败,请检查日志"
journalctl -u ${SERVICE_NAME} -n 50
exit 1
fi
# 11. 配置防火墙
print_info "配置防火墙..."
if command -v ufw &> /dev/null; then
ufw allow 8000/tcp
ufw --force enable
elif command -v firewall-cmd &> /dev/null; then
firewall-cmd --permanent --add-port=8000/tcp
firewall-cmd --reload
else
print_warning "未检测到防火墙,请手动配置端口 8000"
fi
# 12. 测试部署
print_info "测试部署..."
sleep 2
# 健康检查
if curl -s http://localhost:8000/health > /dev/null; then
print_info "健康检查通过 ✓"
else
print_error "健康检查失败"
fi
# 测试 SQL 执行器
print_info "测试 SQL 执行器..."
RESPONSE=$(curl -s -X POST http://localhost:8000/api/v1/sql/execute-simple \
-H "X-API-Key: dify-2025-kaopeilian" \
-H "Content-Type: application/json" \
-d '{"sql": "SELECT COUNT(*) as total FROM users"}')
if [[ $RESPONSE == *"SQL 执行成功"* ]]; then
print_info "SQL 执行器测试通过 ✓"
echo "响应: $RESPONSE"
else
print_error "SQL 执行器测试失败"
echo "响应: $RESPONSE"
fi
# 13. 打印部署信息
echo ""
echo "==================================="
echo -e "${GREEN}部署完成!${NC}"
echo "==================================="
echo ""
echo "服务信息:"
echo "- 服务状态: $(systemctl is-active ${SERVICE_NAME})"
echo "- API 地址: http://120.79.247.16:8000"
echo "- 健康检查: http://120.79.247.16:8000/health"
echo "- SQL 执行器: http://120.79.247.16:8000/api/v1/sql/execute-simple"
echo ""
echo "认证信息:"
echo "- API Key: dify-2025-kaopeilian"
echo "- 请求头: X-API-Key"
echo ""
echo "常用命令:"
echo "- 查看日志: journalctl -u ${SERVICE_NAME} -f"
echo "- 重启服务: systemctl restart ${SERVICE_NAME}"
echo "- 停止服务: systemctl stop ${SERVICE_NAME}"
echo "- 服务状态: systemctl status ${SERVICE_NAME}"
echo ""
echo "Dify 配置:"
echo "1. 鉴权类型: 请求头"
echo "2. 鉴权头部前缀: Custom"
echo "3. 键: X-API-Key"
echo "4. 值: dify-2025-kaopeilian"
echo "==================================="#