382 lines
11 KiB
Bash
382 lines
11 KiB
Bash
#!/bin/bash
|
||
# Linux环境部署脚本
|
||
|
||
set -e
|
||
|
||
echo "=== 云盘后端Linux部署脚本 ==="
|
||
|
||
# 检查当前目录
|
||
if [ ! -f "main.py" ]; then
|
||
echo "错误: 请在包含main.py的项目根目录下运行此脚本"
|
||
exit 1
|
||
fi
|
||
|
||
# 1. 检查Python环境
|
||
echo "1. 检查Python环境..."
|
||
if ! command -v python3 &> /dev/null; then
|
||
echo "错误: 未找到python3,请先安装Python 3.8+"
|
||
exit 1
|
||
fi
|
||
echo "✓ Python版本: $(python3 --version)"
|
||
|
||
# 2. 创建虚拟环境
|
||
echo "2. 创建Python虚拟环境..."
|
||
if [ ! -d "venv" ]; then
|
||
echo "正在创建新的虚拟环境..."
|
||
python3 -m venv venv
|
||
echo "✓ 虚拟环境创建成功"
|
||
# 验证虚拟环境文件
|
||
ls -la venv/bin/ | head -5
|
||
else
|
||
echo "✓ 虚拟环境已存在"
|
||
# 检查虚拟环境是否完整
|
||
if [ ! -f "venv/bin/activate" ] && [ ! -f "venv/Scripts/activate" ]; then
|
||
echo "⚠ 虚拟环境不完整,正在重新创建..."
|
||
rm -rf venv
|
||
python3 -m venv venv
|
||
echo "✓ 虚拟环境重新创建成功"
|
||
fi
|
||
fi
|
||
|
||
# 3. 激活虚拟环境
|
||
echo "3. 激活虚拟环境..."
|
||
if [ -f "venv/bin/activate" ]; then
|
||
source venv/bin/activate
|
||
echo "✓ 虚拟环境已激活"
|
||
elif [ -f "venv/Scripts/activate" ]; then
|
||
source venv/Scripts/activate
|
||
echo "✓ 虚拟环境已激活 (Windows兼容)"
|
||
else
|
||
echo "✗ 虚拟环境激活文件不存在,尝试重新创建虚拟环境..."
|
||
rm -rf venv
|
||
python3 -m venv venv
|
||
if [ -f "venv/bin/activate" ]; then
|
||
source venv/bin/activate
|
||
echo "✓ 虚拟环境重新创建并激活成功"
|
||
else
|
||
echo "✗ 虚拟环境创建失败,请检查Python安装"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
# 4. 升级pip
|
||
echo "4. 升级pip..."
|
||
pip install --upgrade pip
|
||
|
||
# 5. 安装依赖
|
||
echo "5. 安装Python依赖..."
|
||
if [ -f "requirements.txt" ]; then
|
||
pip install -r requirements.txt
|
||
echo "✓ 依赖安装完成"
|
||
else
|
||
echo "警告: requirements.txt 不存在,尝试安装基础依赖"
|
||
pip install fastapi uvicorn sqlalchemy pymysql redis python-jose passlib python-multipart pydantic pydantic-settings httpx python-dotenv loguru alembic
|
||
fi
|
||
|
||
# 6. 创建必要目录
|
||
echo "6. 创建必要目录..."
|
||
mkdir -p logs uploads
|
||
echo "✓ 目录创建完成"
|
||
|
||
# 7. 配置环境变量
|
||
echo "7. 配置环境变量..."
|
||
if [ ! -f ".env" ]; then
|
||
if [ -f ".env.example" ]; then
|
||
cp .env.example .env
|
||
echo "✓ 已从 .env.example 创建 .env 文件"
|
||
echo "请编辑 .env 文件配置数据库连接等参数"
|
||
echo "编辑命令: nano .env"
|
||
else
|
||
echo "警告: .env.example 不存在,创建默认配置"
|
||
cat > .env << EOF
|
||
# 基础配置
|
||
ENVIRONMENT=production
|
||
DEBUG=false
|
||
|
||
# 数据库配置
|
||
DATABASE_URL=mysql+pymysql://用户名:密码@localhost:3306/数据库名
|
||
|
||
# Redis配置
|
||
REDIS_URL=redis://localhost:6379
|
||
|
||
# JWT配置
|
||
JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production
|
||
JWT_ALGORITHM=HS256
|
||
JWT_EXPIRE_MINUTES=30
|
||
|
||
# 文件上传配置
|
||
UPLOAD_DIR=uploads
|
||
MAX_FILE_SIZE=10485760
|
||
|
||
# CORS配置
|
||
ALLOWED_HOSTS=["*"]
|
||
EOF
|
||
echo "✓ 已创建默认 .env 文件"
|
||
fi
|
||
else
|
||
echo "✓ .env 文件已存在"
|
||
fi
|
||
|
||
# 8. 创建启动脚本
|
||
echo "8. 创建启动脚本..."
|
||
cat > start.sh << 'STARTEOF'
|
||
#!/bin/bash
|
||
# 云盘后端启动脚本
|
||
|
||
# 进入脚本所在目录
|
||
cd "$(dirname "$0")"
|
||
|
||
# 激活虚拟环境
|
||
if [ -d "venv" ]; then
|
||
source venv/bin/activate
|
||
echo "✓ 虚拟环境已激活"
|
||
else
|
||
echo "错误: 虚拟环境不存在,请先运行部署脚本"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查环境文件
|
||
if [ ! -f ".env" ]; then
|
||
echo "错误: .env 文件不存在"
|
||
exit 1
|
||
fi
|
||
|
||
# 创建必要目录
|
||
mkdir -p logs uploads
|
||
|
||
# 启动服务
|
||
echo "启动云盘后端服务..."
|
||
echo "服务地址: http://localhost:8000"
|
||
echo "API文档: http://localhost:8000/docs"
|
||
echo "按 Ctrl+C 停止服务"
|
||
echo ""
|
||
|
||
python main.py
|
||
STARTEOF
|
||
|
||
chmod +x start.sh
|
||
echo "✓ 启动脚本创建完成: start.sh"
|
||
|
||
# 9. 创建停止脚本
|
||
echo "9. 创建停止脚本..."
|
||
cat > stop.sh << 'STOPEOF'
|
||
#!/bin/bash
|
||
# 云盘后端停止脚本
|
||
|
||
echo "停止云盘后端服务..."
|
||
pkill -f "python main.py" || echo "服务未运行"
|
||
echo "服务已停止"
|
||
STOPEOF
|
||
|
||
chmod +x stop.sh
|
||
echo "✓ 停止脚本创建完成: stop.sh"
|
||
|
||
# 10. 创建状态检查脚本
|
||
echo "10. 创建状态检查脚本..."
|
||
cat > status.sh << 'STATUSEOF'
|
||
#!/bin/bash
|
||
# 云盘后端状态检查脚本
|
||
|
||
if pgrep -f "python main.py" > /dev/null; then
|
||
echo "✓ 云盘后端服务正在运行"
|
||
echo "进程ID: $(pgrep -f 'python main.py')"
|
||
echo "端口: 8000"
|
||
echo "服务地址: http://localhost:8000"
|
||
echo "API文档: http://localhost:8000/docs"
|
||
|
||
# 测试健康检查
|
||
if curl -s http://localhost:8000/api/v1/health > /dev/null; then
|
||
echo "✓ 服务响应正常"
|
||
else
|
||
echo "⚠ 服务运行但可能有问题"
|
||
fi
|
||
else
|
||
echo "✗ 云盘后端服务未运行"
|
||
echo "启动服务: ./start.sh"
|
||
fi
|
||
STATUSEOF
|
||
|
||
chmod +x status.sh
|
||
echo "✓ 状态检查脚本创建完成: status.sh"
|
||
|
||
# 11. 创建systemd服务(可选)
|
||
echo "11. 创建systemd服务..."
|
||
|
||
# 检查是否为root用户
|
||
if [ "$EUID" -eq 0 ]; then
|
||
# root用户创建系统级服务
|
||
SERVICE_FILE="/etc/systemd/system/cloud-drive.service"
|
||
echo "检测到root用户,创建系统级systemd服务..."
|
||
|
||
# 检查是否有写入权限
|
||
if [ ! -w "/etc/systemd/system" ]; then
|
||
echo "⚠ 警告: 没有写入/etc/systemd/system的权限,跳过systemd服务创建"
|
||
echo "您可以手动创建服务文件或使用其他管理方式"
|
||
else
|
||
cat > "$SERVICE_FILE" << EOF
|
||
[Unit]
|
||
Description=Cloud Drive Backend Service
|
||
Documentation=https://github.com/your-repo/cloud-drive
|
||
After=network.target mysql.service redis.service
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=root
|
||
WorkingDirectory=$(pwd)
|
||
Environment=PATH=$(pwd)/venv/bin
|
||
ExecStart=$(pwd)/venv/bin/python $(pwd)/main.py
|
||
Restart=always
|
||
RestartSec=10
|
||
StandardOutput=journal
|
||
StandardError=journal
|
||
SyslogIdentifier=cloud-drive
|
||
|
||
# 环境变量
|
||
EnvironmentFile=$(pwd)/.env
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
# 重载systemd服务
|
||
systemctl daemon-reload
|
||
echo "✓ 系统级systemd服务已创建"
|
||
echo "启用服务: systemctl enable cloud-drive"
|
||
echo "启动服务: systemctl start cloud-drive"
|
||
echo "查看状态: systemctl status cloud-drive"
|
||
echo "查看日志: journalctl -u cloud-drive -f"
|
||
fi
|
||
else
|
||
# 普通用户创建用户级服务
|
||
echo "为普通用户创建systemd用户服务..."
|
||
|
||
# 创建用户systemd目录
|
||
USER_SERVICE_DIR="$HOME/.config/systemd/user"
|
||
|
||
# 检查并创建目录
|
||
if [ ! -d "$USER_SERVICE_DIR" ]; then
|
||
echo "创建用户systemd目录: $USER_SERVICE_DIR"
|
||
mkdir -p "$USER_SERVICE_DIR" 2>/dev/null || {
|
||
echo "⚠ 无法创建systemd用户目录,尝试使用临时目录..."
|
||
USER_SERVICE_DIR="/tmp/cloud-drive-systemd"
|
||
mkdir -p "$USER_SERVICE_DIR"
|
||
echo "临时目录: $USER_SERVICE_DIR"
|
||
}
|
||
fi
|
||
|
||
SERVICE_FILE="$USER_SERVICE_DIR/cloud-drive.service"
|
||
|
||
# 检查是否有写入权限
|
||
if [ ! -w "$USER_SERVICE_DIR" ]; then
|
||
echo "⚠ 警告: 没有写入$USER_SERVICE_DIR的权限,尝试修复权限..."
|
||
chmod 755 "$USER_SERVICE_DIR" 2>/dev/null || {
|
||
echo "无法修复权限,尝试使用/tmp目录..."
|
||
USER_SERVICE_DIR="/tmp/cloud-drive-systemd"
|
||
mkdir -p "$USER_SERVICE_DIR"
|
||
SERVICE_FILE="$USER_SERVICE_DIR/cloud-drive.service"
|
||
echo "使用临时目录创建服务文件: $SERVICE_FILE"
|
||
}
|
||
fi
|
||
|
||
if [ -w "$USER_SERVICE_DIR" ]; then
|
||
echo "✓ 确认有写入权限: $USER_SERVICE_DIR"
|
||
cat > "$SERVICE_FILE" << EOF
|
||
[Unit]
|
||
Description=Cloud Drive Backend Service
|
||
Documentation=https://github.com/your-repo/cloud-drive
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
WorkingDirectory=$(pwd)
|
||
ExecStart=$(pwd)/venv/bin/python $(pwd)/main.py
|
||
Restart=always
|
||
RestartSec=10
|
||
StandardOutput=journal
|
||
StandardError=journal
|
||
SyslogIdentifier=cloud-drive
|
||
|
||
[Install]
|
||
WantedBy=default.target
|
||
EOF
|
||
|
||
# 重载systemd用户服务
|
||
systemctl --user daemon-reload 2>/dev/null || echo "⚠ 用户systemd重载失败,可能需要手动重载"
|
||
echo "✓ systemd用户服务已创建"
|
||
echo "启用服务: systemctl --user enable cloud-drive"
|
||
echo "启动服务: systemctl --user start cloud-drive"
|
||
echo "查看状态: systemctl --user status cloud-drive"
|
||
echo "查看日志: journalctl --user -u cloud-drive -f"
|
||
fi
|
||
fi
|
||
|
||
# 创建通用的启动脚本作为备用
|
||
echo "创建备用启动脚本..."
|
||
cat > systemd_start.sh << 'EOF'
|
||
#!/bin/bash
|
||
# systemd服务启动脚本
|
||
|
||
echo "Cloud Drive Backend systemd服务管理"
|
||
echo "==================================="
|
||
echo ""
|
||
|
||
if [ "$EUID" -eq 0 ]; then
|
||
echo "系统级服务命令:"
|
||
echo "启用服务: systemctl enable cloud-drive"
|
||
echo "启动服务: systemctl start cloud-drive"
|
||
echo "停止服务: systemctl stop cloud-drive"
|
||
echo "重启服务: systemctl restart cloud-drive"
|
||
echo "查看状态: systemctl status cloud-drive"
|
||
echo "查看日志: journalctl -u cloud-drive -f"
|
||
else
|
||
echo "用户级服务命令:"
|
||
echo "启用服务: systemctl --user enable cloud-drive"
|
||
echo "启动服务: systemctl --user start cloud-drive"
|
||
echo "停止服务: systemctl --user stop cloud-drive"
|
||
echo "重启服务: systemctl --user restart cloud-drive"
|
||
echo "查看状态: systemctl --user status cloud-drive"
|
||
echo "查看日志: journalctl --user -u cloud-drive -f"
|
||
fi
|
||
|
||
echo ""
|
||
echo "如果systemd服务不可用,可以使用手动管理:"
|
||
echo "启动服务: ./start.sh"
|
||
echo "停止服务: ./stop.sh"
|
||
echo "查看状态: ./status.sh"
|
||
EOF
|
||
|
||
chmod +x systemd_start.sh
|
||
echo "✓ 备用启动脚本创建完成: systemd_start.sh"
|
||
|
||
# 12. 完成提示
|
||
echo ""
|
||
echo "=== 部署完成 ==="
|
||
echo "当前目录: $(pwd)"
|
||
echo ""
|
||
echo "快速启动方式:"
|
||
echo "1. 手动启动: ./start.sh"
|
||
echo "2. 查看状态: ./status.sh"
|
||
echo "3. 停止服务: ./stop.sh"
|
||
echo ""
|
||
echo "systemd服务方式:"
|
||
echo "1. 启用服务: systemctl --user enable cloud-drive"
|
||
echo "2. 启动服务: systemctl --user start cloud-drive"
|
||
echo "3. 查看状态: systemctl --user status cloud-drive"
|
||
echo "4. 查看日志: journalctl --user -u cloud-drive -f"
|
||
echo ""
|
||
echo "访问地址:"
|
||
echo "- 服务地址: http://localhost:8000"
|
||
echo "- API文档: http://localhost:8000/docs"
|
||
echo "- 健康检查: http://localhost:8000/api/v1/health"
|
||
echo ""
|
||
echo "配置文件: .env"
|
||
echo "日志目录: logs/"
|
||
echo "上传目录: uploads/"
|
||
echo ""
|
||
echo "注意: 请确保数据库和Redis服务已启动并正确配置"
|
||
|
||
# 13. 自动启动服务
|
||
echo ""
|
||
echo "=== 正在启动服务 ==="
|
||
echo "启动云盘后端服务..."
|
||
./start.sh |