222 lines
5.2 KiB
Bash
Executable File
222 lines
5.2 KiB
Bash
Executable File
#!/bin/bash
|
||
# Cosmo 后端一键初始化脚本
|
||
|
||
set -e # 遇到错误立即退出
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 日志函数
|
||
log_info() {
|
||
echo -e "${BLUE}[INFO]${NC} $1"
|
||
}
|
||
|
||
log_success() {
|
||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||
}
|
||
|
||
log_warning() {
|
||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}[ERROR]${NC} $1"
|
||
}
|
||
|
||
# 打印标题
|
||
print_header() {
|
||
echo "================================================================="
|
||
echo " Cosmo 后端初始化脚本"
|
||
echo "================================================================="
|
||
echo ""
|
||
}
|
||
|
||
# 检查 Python
|
||
check_python() {
|
||
log_info "检查 Python 环境..."
|
||
if ! command -v python3 &> /dev/null; then
|
||
log_error "未找到 Python 3,请先安装 Python 3.9+"
|
||
exit 1
|
||
fi
|
||
|
||
PYTHON_VERSION=$(python3 --version | awk '{print $2}')
|
||
log_success "Python 版本: $PYTHON_VERSION"
|
||
}
|
||
|
||
# 检查 PostgreSQL
|
||
check_postgresql() {
|
||
log_info "检查 PostgreSQL..."
|
||
if ! command -v psql &> /dev/null; then
|
||
log_error "未找到 psql 命令,请先安装 PostgreSQL"
|
||
exit 1
|
||
fi
|
||
|
||
# 尝试连接 PostgreSQL
|
||
if psql -U postgres -c "SELECT version();" &> /dev/null; then
|
||
log_success "PostgreSQL 连接成功"
|
||
else
|
||
log_error "无法连接到 PostgreSQL,请检查:"
|
||
log_error " 1. PostgreSQL 是否正在运行"
|
||
log_error " 2. 账号密码是否为 postgres/postgres"
|
||
log_error " 3. 是否允许本地连接"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 检查 Redis
|
||
check_redis() {
|
||
log_info "检查 Redis..."
|
||
if ! command -v redis-cli &> /dev/null; then
|
||
log_warning "未找到 redis-cli 命令"
|
||
log_warning "Redis 是可选的,但建议安装以获得更好的缓存性能"
|
||
return
|
||
fi
|
||
|
||
# 尝试连接 Redis
|
||
if redis-cli ping &> /dev/null; then
|
||
log_success "Redis 连接成功"
|
||
else
|
||
log_warning "无法连接到 Redis"
|
||
log_warning "应用会自动降级为仅使用内存缓存"
|
||
fi
|
||
}
|
||
|
||
# 检查依赖
|
||
check_dependencies() {
|
||
log_info "检查 Python 依赖包..."
|
||
|
||
cd "$(dirname "$0")/.." # 切换到 backend 目录
|
||
|
||
# 检查 requirements.txt 是否存在
|
||
if [ ! -f "requirements.txt" ]; then
|
||
log_error "未找到 requirements.txt 文件"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查关键依赖是否已安装
|
||
if ! python3 -c "import fastapi" &> /dev/null; then
|
||
log_warning "依赖包未完全安装,正在安装..."
|
||
pip install -r requirements.txt
|
||
log_success "依赖包安装完成"
|
||
else
|
||
log_success "依赖包已安装"
|
||
fi
|
||
}
|
||
|
||
# 检查 .env 文件
|
||
check_env_file() {
|
||
log_info "检查配置文件..."
|
||
|
||
cd "$(dirname "$0")/.." # 确保在 backend 目录
|
||
|
||
if [ ! -f ".env" ]; then
|
||
log_warning ".env 文件不存在,从 .env.example 创建..."
|
||
if [ -f ".env.example" ]; then
|
||
cp .env.example .env
|
||
log_success ".env 文件创建成功"
|
||
else
|
||
log_error "未找到 .env.example 文件"
|
||
exit 1
|
||
fi
|
||
else
|
||
log_success ".env 文件已存在"
|
||
fi
|
||
}
|
||
|
||
# 创建数据库
|
||
create_database() {
|
||
log_info "创建数据库..."
|
||
|
||
cd "$(dirname "$0")/.." # 确保在 backend 目录
|
||
|
||
if python3 scripts/create_db.py; then
|
||
log_success "数据库创建完成"
|
||
else
|
||
log_error "数据库创建失败"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 初始化数据库表
|
||
init_database() {
|
||
log_info "初始化数据库表结构..."
|
||
|
||
cd "$(dirname "$0")/.." # 确保在 backend 目录
|
||
|
||
if python3 scripts/init_db.py; then
|
||
log_success "数据库表结构初始化完成"
|
||
else
|
||
log_error "数据库表结构初始化失败"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 创建上传目录
|
||
create_upload_dir() {
|
||
log_info "创建上传目录..."
|
||
|
||
cd "$(dirname "$0")/.." # 确保在 backend 目录
|
||
|
||
if [ ! -d "upload" ]; then
|
||
mkdir -p upload
|
||
log_success "上传目录创建成功: upload/"
|
||
else
|
||
log_success "上传目录已存在: upload/"
|
||
fi
|
||
}
|
||
|
||
# 打印完成信息
|
||
print_completion() {
|
||
echo ""
|
||
echo "================================================================="
|
||
echo -e "${GREEN} ✓ 初始化完成!${NC}"
|
||
echo "================================================================="
|
||
echo ""
|
||
echo "启动服务:"
|
||
echo " cd backend"
|
||
echo " python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000"
|
||
echo ""
|
||
echo "或者:"
|
||
echo " python app/main.py"
|
||
echo ""
|
||
echo "访问:"
|
||
echo " - API 文档: http://localhost:8000/docs"
|
||
echo " - 健康检查: http://localhost:8000/health"
|
||
echo " - 根路径: http://localhost:8000/"
|
||
echo ""
|
||
echo "================================================================="
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
print_header
|
||
|
||
# 1. 检查环境
|
||
check_python
|
||
check_postgresql
|
||
check_redis
|
||
|
||
# 2. 安装依赖
|
||
check_dependencies
|
||
|
||
# 3. 配置文件
|
||
check_env_file
|
||
|
||
# 4. 数据库初始化
|
||
create_database
|
||
init_database
|
||
|
||
# 5. 创建必要目录
|
||
create_upload_dir
|
||
|
||
# 6. 完成
|
||
print_completion
|
||
}
|
||
|
||
# 执行主函数
|
||
main
|