#!/bin/bash # DD Fiber API 部署脚本 # 用途:在服务器上自动化部署容器(使用 Docker) set -e # 遇到错误立即退出 echo "=========================================" echo " DD Fiber API 部署脚本" echo "=========================================" echo "" # 检查 Docker 是否安装 if ! command -v docker &> /dev/null; then echo "❌ 错误: 未找到 Docker,请先安装 Docker" exit 1 fi CONTAINER_CMD="docker" echo "✅ 使用 Docker 运行" echo "" # 变量定义 IMAGE_NAME="dd-fiber-api" IMAGE_TAG="latest" IMAGE_TAR="dd-fiber-api.tar" CONTAINER_NAME="dd-fiber-api" CONFIG_FILE="config.yaml" STORAGE_DIR="storage" # 检查必要文件是否存在 echo "📋 检查部署文件..." if [ ! -f "$IMAGE_TAR" ]; then echo "❌ 错误: 找不到 Docker 镜像文件 $IMAGE_TAR" exit 1 fi if [ ! -f "$CONFIG_FILE" ]; then echo "❌ 错误: 找不到配置文件 $CONFIG_FILE" exit 1 fi # 检查 storage 目录是否存在 if [ ! -d "$STORAGE_DIR" ]; then echo "⚠️ 警告: storage 目录不存在,正在创建..." mkdir -p "$STORAGE_DIR" echo "✅ storage 目录已创建" echo "⚠️ 请确保将证书文件放到 $STORAGE_DIR/1503017331_20251231_cert/ 目录中" else echo "✅ storage 目录存在" fi # 检查证书文件是否存在(如果配置了私钥路径) CERT_DIR="$STORAGE_DIR/1503017331_20251231_cert" if [ -d "$CERT_DIR" ]; then if [ -f "$CERT_DIR/apiclient_key.pem" ]; then echo "✅ 私钥文件存在: $CERT_DIR/apiclient_key.pem" else echo "⚠️ 警告: 私钥文件不存在: $CERT_DIR/apiclient_key.pem" echo "⚠️ 请确保将证书文件放到 $CERT_DIR/ 目录中" fi if [ -f "$CERT_DIR/apiclient_cert.pem" ]; then echo "✅ 证书文件存在: $CERT_DIR/apiclient_cert.pem" else echo "⚠️ 警告: 证书文件不存在: $CERT_DIR/apiclient_cert.pem" fi else echo "⚠️ 警告: 证书目录不存在: $CERT_DIR" echo "⚠️ 如果不需要微信支付功能,可以忽略此警告" fi echo "✅ 部署文件检查通过" echo "" # 停止并删除旧容器(如果存在) echo "🛑 停止旧容器..." if $CONTAINER_CMD ps -a | grep -q "$CONTAINER_NAME"; then $CONTAINER_CMD stop "$CONTAINER_NAME" 2>/dev/null || true $CONTAINER_CMD rm "$CONTAINER_NAME" 2>/dev/null || true echo "✅ 旧容器已删除" else echo "ℹ️ 没有运行中的旧容器" fi echo "" # 加载容器镜像 echo "📦 加载容器镜像..." $CONTAINER_CMD load -i "$IMAGE_TAR" echo "✅ 容器镜像加载完成" echo "" # 运行新容器 echo "🚀 启动新容器..." # 获取当前目录的绝对路径 DEPLOY_DIR="$(cd "$(dirname "$0")" && pwd)" # 验证挂载路径 echo "📋 验证挂载路径..." echo " 配置文件: $DEPLOY_DIR/$CONFIG_FILE -> /app/data/config/config.yaml" echo " 证书目录: $DEPLOY_DIR/$STORAGE_DIR -> /app/data/storage" if [ -d "$DEPLOY_DIR/$STORAGE_DIR" ]; then echo " ✅ 证书目录存在: $DEPLOY_DIR/$STORAGE_DIR" if [ -d "$DEPLOY_DIR/$STORAGE_DIR/1503017331_20251231_cert" ]; then echo " ✅ 证书子目录存在" if [ -f "$DEPLOY_DIR/$STORAGE_DIR/1503017331_20251231_cert/apiclient_key.pem" ]; then echo " ✅ 私钥文件存在" else echo " ⚠️ 私钥文件不存在" fi else echo " ⚠️ 证书子目录不存在" fi else echo " ⚠️ 证书目录不存在" fi echo "" $CONTAINER_CMD run -d \ --name "$CONTAINER_NAME" \ --restart=unless-stopped \ --network dd.net \ -p 8080:8080 \ -p 8081:8081 \ -v "$DEPLOY_DIR/$CONFIG_FILE:/app/data/config/config.yaml:ro" \ -v "$DEPLOY_DIR/$STORAGE_DIR:/app/data/storage:ro" \ "$IMAGE_NAME:$IMAGE_TAG" echo "✅ 容器已启动" echo "" # 等待服务启动 echo "⏳ 等待服务启动..." sleep 3 # 检查容器状态 echo "📊 检查服务状态..." if $CONTAINER_CMD ps | grep -q "$CONTAINER_NAME"; then echo "✅ 服务运行正常" echo "" echo "容器信息:" $CONTAINER_CMD ps | grep "$CONTAINER_NAME" echo "" echo "查看日志命令:" echo " $CONTAINER_CMD logs -f $CONTAINER_NAME" else echo "❌ 服务启动失败" echo "查看错误日志:" $CONTAINER_CMD logs "$CONTAINER_NAME" exit 1 fi echo "" echo "=========================================" echo " 🎉 部署成功!" echo "=========================================" echo "" echo "服务信息:" echo " - 容器名称: $CONTAINER_NAME" echo " - 网络: dd.net" echo " - Admin 端口: 8080" echo " - API 端口: 8081" echo " - 配置文件: $DEPLOY_DIR/$CONFIG_FILE (挂载)" echo " - 证书目录: $DEPLOY_DIR/$STORAGE_DIR (挂载)" echo "" echo "常用命令:" echo " 查看日志: $CONTAINER_CMD logs -f $CONTAINER_NAME" echo " 停止服务: $CONTAINER_CMD stop $CONTAINER_NAME" echo " 重启服务: $CONTAINER_CMD restart $CONTAINER_NAME" echo " 删除容器: $CONTAINER_CMD rm -f $CONTAINER_NAME" echo ""