duidui_fiber/deploy/deploy.sh
2026-03-27 10:34:03 +08:00

172 lines
4.9 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
# 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 ""