172 lines
4.9 KiB
Bash
Executable File
172 lines
4.9 KiB
Bash
Executable File
#!/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 ""
|
||
|