Files
full-stack-doc/backend/smart_deploy.sh
2025-10-14 20:05:29 +08:00

225 lines
5.2 KiB
Bash
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.

#!/bin/bash
# 智能部署脚本 - 自动检测权限并选择合适的安装方式
set -e
echo "=== 云盘后端智能部署脚本 ==="
# 检查当前目录
if [ ! -f "main.py" ]; then
echo "错误: 请在包含main.py的项目根目录下运行此脚本"
exit 1
fi
echo "当前目录: $(pwd)"
echo "当前用户: $(whoami)"
echo "用户ID: $EUID"
# 1. 检查Python环境
echo ""
echo "1. 检查Python环境..."
if ! command -v python3 &> /dev/null; then
echo "错误: 未找到python3请先安装Python 3.8+"
exit 1
fi
echo "✓ Python版本: $(python3 --version)"
# 2. 创建必要目录
echo ""
echo "2. 创建必要目录..."
mkdir -p logs uploads
echo "✓ 目录创建完成"
# 3. 创建和使用虚拟环境
echo ""
echo "3. 创建Python虚拟环境..."
if [ ! -d "venv" ]; then
echo "正在创建新的虚拟环境..."
python3 -m venv venv
echo "✓ 虚拟环境创建成功"
else
echo "✓ 虚拟环境已存在"
fi
# 4. 激活虚拟环境并安装依赖
echo ""
echo "4. 激活虚拟环境并安装依赖..."
if [ -f "venv/bin/activate" ]; then
source venv/bin/activate
echo "✓ 虚拟环境已激活 (Linux)"
elif [ -f "venv/Scripts/activate" ]; then
source venv/Scripts/activate
echo "✓ 虚拟环境已激活 (Windows)"
else
echo "✗ 虚拟环境激活文件不存在,重新创建..."
rm -rf venv
python3 -m venv venv
source venv/bin/activate
echo "✓ 虚拟环境重新创建并激活成功"
fi
# 升级pip
echo "升级虚拟环境中的pip..."
pip install --upgrade pip
# 先安装email-validator
echo "安装email-validator..."
pip install email-validator
# 安装其他依赖
echo "安装其他依赖..."
if [ -f "requirements.txt" ]; then
echo "从requirements.txt安装..."
pip install -r requirements.txt
else
echo "安装核心依赖..."
pip install fastapi uvicorn sqlalchemy pymysql redis python-jose passlib python-multipart pydantic pydantic-settings httpx python-dotenv loguru alembic bcrypt
fi
echo "✓ 依赖安装完成 (虚拟环境中)"
# 5. 验证安装
echo ""
echo "5. 验证依赖安装..."
python -c "
import sys
try:
import email_validator
print('✓ email-validator')
except ImportError:
print('✗ email-validator 导入失败')
sys.exit(1)
try:
from pydantic import EmailStr
print('✓ Pydantic EmailStr')
except Exception as e:
print(f'✗ Pydantic EmailStr 失败: {e}')
sys.exit(1)
packages = ['fastapi', 'uvicorn', 'sqlalchemy', 'pymysql', 'redis']
for pkg in packages:
try:
__import__(pkg)
print(f'✓ {pkg}')
except ImportError:
print(f'✗ {pkg} 导入失败')
sys.exit(1)
print('\\n✓ 所有依赖验证成功!')
"
# 6. 配置环境变量
echo ""
echo "6. 配置环境变量..."
if [ ! -f ".env" ]; then
echo "创建默认 .env 文件..."
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-$(date +%s)
JWT_ALGORITHM=HS256
JWT_EXPIRE_MINUTES=30
# 文件上传配置
UPLOAD_DIR=uploads
MAX_FILE_SIZE=10485760
# CORS配置
ALLOWED_HOSTS=["*"]
EOF
echo "✓ 已创建默认 .env 文件"
else
echo "✓ .env 文件已存在"
fi
# 7. 创建启动脚本(可选,用于手动启动)
echo ""
echo "7. 创建启动脚本(用于手动启动)..."
cat > start_app.sh << 'EOF'
#!/bin/bash
# 云盘后端启动脚本
cd "$(dirname "$0")"
if [ ! -f ".env" ]; then
echo "错误: .env 文件不存在"
exit 1
fi
mkdir -p logs uploads
# 激活虚拟环境
if [ -f "venv/bin/activate" ]; then
source venv/bin/activate
elif [ -f "venv/Scripts/activate" ]; then
source venv/Scripts/activate
fi
echo "启动云盘后端服务..."
echo "服务地址: http://localhost:8002"
echo "API文档: http://localhost:8002/docs"
echo "按 Ctrl+C 停止服务"
echo ""
python main.py
EOF
chmod +x start_app.sh
echo "✓ 启动脚本创建完成: start_app.sh"
# 8. 测试应用配置
echo ""
echo "8. 测试应用配置..."
python -c "
import sys
sys.path.insert(0, '.')
try:
from app.core.config import settings
print('✓ 应用配置加载成功')
print(f' 环境: {settings.ENVIRONMENT}')
print(f' 调试模式: {settings.DEBUG}')
except Exception as e:
print(f'✗ 应用配置加载失败: {e}')
print('请检查.env文件和应用代码')
sys.exit(1)
"
echo ""
echo "=== 智能部署完成 ==="
echo ""
echo "管理命令:"
echo "手动启动: ./start_app.sh"
echo "直接启动: source venv/bin/activate && python main.py"
echo ""
echo "访问地址:"
echo "- 服务地址: http://localhost:8002"
echo "- API文档: http://localhost:8002/docs"
echo "- 健康检查: http://localhost:8002/api/v1/health"
echo ""
echo "配置文件: .env"
echo "日志目录: logs/"
echo "上传目录: uploads/"
echo "虚拟环境: venv/"
# 9. 直接启动应用(在虚拟环境中)
echo ""
echo "=== 正在启动服务 ==="
echo "在虚拟环境中启动云盘后端服务..."
echo "服务地址: http://localhost:8002"
echo "API文档: http://localhost:8002/docs"
echo "按 Ctrl+C 停止服务"
echo ""
python main.py