Files
s3-balance/deploy/start.sh
2025-09-13 22:30:40 +08:00

309 lines
8.3 KiB
Bash
Executable File

#!/bin/bash
# S3 Balance 快速部署脚本
# 支持 Docker、Docker Compose、Kubernetes、HELM 四种部署方式
set -e
# 显示帮助信息
show_help() {
echo "S3 Balance 快速部署脚本"
echo ""
echo "用法: ./start.sh [选项]"
echo ""
echo "选项:"
echo " -m, --mode MODE 部署模式: docker|compose|kubernetes|helm"
echo " -e, --env ENV 环境: dev|test|prod (默认: dev)"
echo " -b, --build 构建镜像"
echo " -p, --port PORT 服务端口 (默认: 8080)"
echo " -h, --help 显示帮助信息"
echo ""
echo "示例:"
echo " ./start.sh -m compose -e prod"
echo " ./start.sh -m kubernetes --build"
echo " ./start.sh -m helm -e test"
}
# 默认参数
MODE="compose"
ENV="dev"
BUILD=false
PORT="8080"
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case $1 in
-m|--mode)
MODE="$2"
shift 2
;;
-e|--env)
ENV="$2"
shift 2
;;
-b|--build)
BUILD=true
shift
;;
-p|--port)
PORT="$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
*)
echo "未知选项: $1"
show_help
exit 1
;;
esac
done
# 输出配置信息
echo "🚀 S3 Balance 快速部署开始..."
echo "📋 配置信息:"
echo " 部署模式: $MODE"
echo " 环境: $ENV"
echo " 构建镜像: $BUILD"
echo " 服务端口: $PORT"
echo ""
# 检查必要工具
check_requirements() {
local tool=$1
local tool_name=$2
if ! command -v $tool &> /dev/null; then
echo "$tool_name 未安装"
return 1
fi
echo "$tool_name 已安装"
}
# Docker 模式部署
deploy_docker() {
echo "📦 Docker 单容器部署..."
check_requirements docker "Docker" || exit 1
if [ "$BUILD" = true ]; then
echo "🔨 构建 Docker 镜像..."
docker build -t s3-balance:$MODE-$ENV -f deploy/docker/Dockerfile .
fi
echo "🚀 启动容器..."
docker run -d \
--name s3-balance-$ENV \
-p $PORT:8080 \
-v $(pwd)/deploy/docker/config.docker.yaml:/app/config/config.yaml \
-v s3-balance-data:/app/data \
-e TZ=Asia/Shanghai \
--restart unless-stopped \
s3-balance:$MODE-$ENV
echo "✅ Docker 容器已启动"
}
# Docker Compose 模式部署
deploy_compose() {
echo "🐳 Docker Compose 部署..."
check_requirements docker "Docker" || exit 1
check_requirements docker-compose "Docker Compose" || exit 1
if [ "$BUILD" = true ]; then
echo "🔨 构建 Docker 镜像..."
cd deploy/docker
docker build -t s3-balance:$MODE-$ENV -f Dockerfile ../..
fi
echo "🚀 启动服务栈..."
cd deploy/docker
# 修改 docker-compose.yml 中的端口
if [ "$PORT" != "8080" ]; then
sed -i.bak "s/8080:8080/$PORT:8080/" docker-compose.yml
fi
docker-compose up -d
# 恢复配置文件
if [ "$PORT" != "8080" ]; then
mv docker-compose.yml.bak docker-compose.yml
fi
cd ../..
echo "✅ Docker Compose 服务已启动"
}
# Kubernetes 模式部署
deploy_kubernetes() {
echo "☸️ Kubernetes 部署..."
check_requirements kubectl "kubectl" || exit 1
check_requirements kubectl "Kubernetes 集群连接" || exit 1
echo "🚀 应用 Kubernetes 配置..."
cd deploy/kubernetes
# 替换环境变量
if [ "$ENV" != "dev" ]; then
# 根据环境替换镜像标签
sed -i.bak 's/image: s3-balance:latest/image: s3-balance:'"$ENV"'/' deployment.yaml
fi
kubectl apply -f namespace.yaml
kubectl apply -f configmap.yaml
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml
# 如果是生产环境,应用 HPA
if [ "$ENV" = "prod" ]; then
kubectl apply -f hpa.yaml
echo "📊 已启用水平自动扩缩容"
fi
# 恢复配置文件
if [ -f deployment.yaml.bak ]; then
mv deployment.yaml.bak deployment.yaml
fi
cd ../..
echo "✅ Kubernetes 部署完成"
}
# HELM 模式部署
deploy_helm() {
echo "🔧 HELM Chart 部署..."
check_requirements helm "HELM" || exit 1
check_requirements kubectl "kubectl" || exit 1
echo "🚀 部署 HELM Chart..."
cd deploy/helm
# 根据环境选择 values 文件
VALUES_FILE="values.yaml"
if [ "$ENV" = "prod" ] && [ -f "production-values.yaml" ]; then
VALUES_FILE="production-values.yaml"
fi
# 安装或升级 Chart
if helm status s3-balance-$ENV 2>/dev/null; then
echo "⬆️ 升级现有 HELM 发布..."
helm upgrade s3-balance-$ENV s3-balance -f $VALUES_FILE \
--namespace s3-balance-$ENV \
--create-namespace \
--wait
else
echo "📦 安装新的 HELM Chart..."
helm install s3-balance-$ENV s3-balance -f $VALUES_FILE \
--namespace s3-balance-$ENV \
--create-namespace \
--wait
fi
cd ../..
echo "✅ HELM Chart 部署完成"
}
# 通用后处理
post_deploy() {
echo ""
echo "⏳ 等待服务启动..."
sleep 10
case $MODE in
docker)
echo ""
echo "✅ Docker 部署完成!"
echo "🔗 访问地址:"
echo " 📊 指标端点: http://localhost:$PORT/metrics"
echo ""
echo "📝 Docker 命令:"
echo " docker logs -f s3-balance-$ENV # 查看日志"
echo " docker stop s3-balance-$ENV # 停止服务"
echo " docker rm s3-balance-$ENV # 删除容器"
;;
compose)
echo ""
echo "✅ Docker Compose 部署完成!"
echo "🔗 访问地址:"
echo " 📊 Grafana 面板: http://localhost:3000 (admin/admin123)"
echo " 🔥 Prometheus: http://localhost:9090"
echo " 📈 指标端点: http://localhost:$PORT/metrics"
echo ""
echo "📝 Compose 命令:"
echo " cd deploy/docker && docker-compose logs -f # 查看日志"
echo " cd deploy/docker && docker-compose down # 停止服务"
;;
kubernetes)
echo ""
echo "✅ Kubernetes 部署完成!"
echo "🔗 检查状态:"
echo " kubectl get pods -n s3-balance"
echo " kubectl get svc -n s3-balance"
echo " kubectl get ingress -n s3-balance"
echo ""
echo "📋 常用命令:"
echo " kubectl logs -f deployment/s3-balance-deployment -n s3-balance"
echo " kubectl scale deployment s3-balance-deployment --replicas=5 -n s3-balance"
;;
helm)
echo ""
echo "✅ HELM Chart 部署完成!"
echo "🔗 检查状态:"
echo " helm status s3-balance-$ENV -n s3-balance-$ENV"
echo " kubectl get pods -n s3-balance-$ENV"
echo " kubectl get svc -n s3-balance-$ENV"
echo ""
echo "🔧 HELM 命令:"
echo " helm uninstall s3-balance-$ENV -n s3-balance-$ENV"
echo " helm list -A"
;;
esac
echo ""
echo "📊 监控指标查询:"
echo " - 存储桶健康: s3_balance_bucket_healthy"
echo " - QPS: rate(s3_balance_s3_operations_total[1m])"
echo " - 延迟: histogram_quantile(0.95, s3_balance_s3_operation_duration_seconds_bucket)"
echo ""
echo "🎉 部署完成!享受 S3 Balance 服务!"
}
# 主执行逻辑
main() {
echo "🚀 开始部署 S3 Balance..."
# 根据模式执行部署
case $MODE in
docker)
deploy_docker
;;
compose)
deploy_compose
;;
kubernetes)
deploy_kubernetes
;;
helm)
deploy_helm
;;
*)
echo "❌ 未知部署模式: $MODE"
show_help
exit 1
;;
esac
post_deploy
}
# 执行主函数
main