#!/bin/bash # NewAPI 生产环境部署脚本 set -e # 遇到错误立即退出 echo "🚀 NewAPI 生产环境部署脚本" echo "===============================" # 检查必要的文件 echo "📋 检查必要文件..." if [ ! -f ".env.prod" ]; then echo "❌ 未找到 .env.prod 文件!" echo "请复制 env.prod.example 为 .env.prod 并填写正确的配置" echo "" echo "cp env.prod.example .env.prod" echo "nano .env.prod # 编辑配置文件" exit 1 fi # 检查关键环境变量 echo "🔐 检查环境变量配置..." source .env.prod required_vars=("MYSQL_ROOT_PASSWORD" "MYSQL_PASSWORD" "REDIS_PASSWORD" "SESSION_SECRET") for var in "${required_vars[@]}"; do if [ -z "${!var}" ]; then echo "❌ 环境变量 $var 未设置!请检查 .env.prod 文件" exit 1 fi done # 检查密码强度 if [ ${#MYSQL_ROOT_PASSWORD} -lt 12 ]; then echo "⚠️ 警告: MySQL root密码长度不足12位,建议使用更强的密码" fi if [ ${#SESSION_SECRET} -lt 32 ]; then echo "❌ SESSION_SECRET 长度必须至少32位!" exit 1 fi echo "✅ 环境变量检查通过" # 检查Docker和Docker Compose if ! command -v docker &> /dev/null; then echo "❌ Docker 未安装!" exit 1 fi if ! command -v docker-compose &> /dev/null; then echo "❌ Docker Compose 未安装!" exit 1 fi echo "✅ Docker 环境检查通过" # 创建必要的目录 echo "📁 创建必要目录..." mkdir -p data logs # 停止现有服务 echo "🛑 停止现有服务..." docker-compose -f docker-compose.prod.yml --env-file .env.prod down 2>/dev/null || true # 备份数据(如果存在) if [ -d "data" ] && [ "$(ls -A data)" ]; then backup_dir="backup-$(date +%Y%m%d-%H%M%S)" echo "💾 备份现有数据到 $backup_dir..." cp -r data "$backup_dir" echo "✅ 数据已备份到 $backup_dir" fi # 构建镜像 echo "🔨 构建生产环境镜像..." docker-compose -f docker-compose.prod.yml --env-file .env.prod build --no-cache # 启动服务 echo "🚀 启动生产环境服务..." docker-compose -f docker-compose.prod.yml --env-file .env.prod up -d # 等待服务启动 echo "⏳ 等待服务启动..." sleep 30 # 检查服务状态 echo "📊 检查服务状态..." docker-compose -f docker-compose.prod.yml --env-file .env.prod ps # 检查健康状态 echo "🔍 检查服务健康状态..." max_attempts=10 attempt=1 while [ $attempt -le $max_attempts ]; do echo "尝试 $attempt/$max_attempts..." if curl -s http://localhost:3000/api/status > /dev/null; then echo "✅ NewAPI 服务启动成功!" echo "" echo "🌐 访问信息:" echo " Web界面: http://localhost:3000" echo " API接口: http://localhost:3000/api/" echo "" echo "📋 后续步骤:" echo "1. 配置反向代理(如nginx)" echo "2. 设置SSL证书" echo "3. 配置防火墙规则" echo "4. 设置定期备份" echo "" echo "📊 查看日志: docker-compose -f docker-compose.prod.yml --env-file .env.prod logs -f" echo "🛑 停止服务: docker-compose -f docker-compose.prod.yml --env-file .env.prod down" break fi if [ $attempt -eq $max_attempts ]; then echo "❌ 服务启动失败,请检查日志:" echo "docker-compose -f docker-compose.prod.yml --env-file .env.prod logs" exit 1 fi sleep 10 ((attempt++)) done echo "" echo "🎉 生产环境部署完成!"