#!/bin/bash # Material Texture API 部署脚本 # 用法: ./deploy.sh [命令] # 命令: # pack - 打包项目用于传输 # server - 在服务器上执行部署 # help - 显示帮助 set -e PROJECT_NAME="material_texture" DEPLOY_DIR="deploy_package" ARCHIVE_NAME="${PROJECT_NAME}_deploy.tar.gz" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 本地打包(在开发机器上执行) pack() { log_info "开始打包项目..." # 清理旧文件 rm -rf "$DEPLOY_DIR" "$ARCHIVE_NAME" # 创建部署目录 mkdir -p "$DEPLOY_DIR" # 复制必要文件(排除不需要的) rsync -av \ --exclude='bin/' \ --exclude='.git/' \ --exclude='*.log' \ --exclude='.env' \ --exclude='.env.local' \ --exclude='.DS_Store' \ --exclude='deploy_package/' \ --exclude='*.tar.gz' \ . "$DEPLOY_DIR/" # 打包 tar -czvf "$ARCHIVE_NAME" "$DEPLOY_DIR" # 清理临时目录 rm -rf "$DEPLOY_DIR" # 显示文件大小 SIZE=$(du -h "$ARCHIVE_NAME" | cut -f1) log_info "打包完成: $ARCHIVE_NAME ($SIZE)" log_info "" log_info "下一步: 将文件传输到服务器" echo " scp $ARCHIVE_NAME user@your-server:/path/to/deploy/" log_info "" log_info "然后在服务器上执行:" echo " tar -xzvf $ARCHIVE_NAME" echo " cd $DEPLOY_DIR" echo " ./deploy.sh server" } # 服务器部署(在服务器上执行) server_deploy() { log_info "开始服务器部署..." # 检查 Docker if ! command -v docker &> /dev/null; then log_error "Docker 未安装,请先安装 Docker" exit 1 fi # 检查 docker compose if ! docker compose version &> /dev/null; then log_error "Docker Compose 未安装或版本过低" exit 1 fi # 创建 .env 文件(如果不存在) if [ ! -f .env ]; then log_info "创建 .env 配置文件..." cp .env.example .env log_warn "请编辑 .env 文件设置生产环境密钥" log_warn " vim .env" log_warn "然后重新运行: ./deploy.sh server" exit 0 fi # 停止旧容器(如果存在) log_info "停止旧容器..." docker compose down 2>/dev/null || true # 构建并启动 log_info "构建并启动服务..." docker compose up -d --build # 等待服务启动 log_info "等待服务启动..." sleep 5 # 健康检查 log_info "执行健康检查..." if curl -s http://localhost:8081/health > /dev/null; then log_info "服务启动成功!" echo "" echo "==========================================" echo " API 地址: http://localhost:8081" echo " 健康检查: http://localhost:8081/health" echo "==========================================" echo "" log_info "查看日志: docker compose logs -f" else log_error "健康检查失败,请查看日志: docker compose logs" exit 1 fi } # 显示帮助 show_help() { echo "Material Texture API 部署脚本" echo "" echo "用法: ./deploy.sh [命令]" echo "" echo "命令:" echo " pack 在本地机器打包项目用于传输" echo " server 在服务器上执行部署" echo " logs 查看容器日志" echo " stop 停止服务" echo " restart 重启服务" echo " help 显示此帮助信息" echo "" echo "部署流程:" echo " 1. 本地: ./deploy.sh pack" echo " 2. 传输: scp material_texture_deploy.tar.gz user@server:/path/" echo " 3. 服务器: tar -xzvf material_texture_deploy.tar.gz" echo " 4. 服务器: cd deploy_package && ./deploy.sh server" } # 日志 logs() { docker compose logs -f } # 停止 stop() { log_info "停止服务..." docker compose down log_info "服务已停止" } # 重启 restart() { log_info "重启服务..." docker compose restart log_info "服务已重启" } # 主入口 case "${1:-help}" in pack) pack ;; server) server_deploy ;; logs) logs ;; stop) stop ;; restart) restart ;; help|*) show_help ;; esac