mgmt/mgmt.sh

162 lines
4.0 KiB
Bash
Executable File

#!/bin/bash
# 项目管理主脚本
set -euo pipefail
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 项目根目录
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 显示项目状态
show_status() {
log_info "=== 项目状态总览 ==="
echo ""
# Docker Swarm 状态
log_info "Docker Swarm 状态:"
if docker info --format '{{.Swarm.LocalNodeState}}' 2>/dev/null | grep -q "active"; then
log_success "✓ Docker Swarm 已激活"
docker node ls 2>/dev/null | head -n 5
else
log_warning "✗ Docker Swarm 未激活"
fi
echo ""
# OpenTofu 状态
log_info "OpenTofu 状态:"
if command -v tofu &> /dev/null; then
local version=$(tofu version | head -n1)
log_success "✓ OpenTofu 已安装: $version"
else
log_warning "✗ OpenTofu 未安装"
fi
echo ""
# 部署的堆栈
log_info "已部署的 Docker Stack:"
if docker info --format '{{.Swarm.LocalNodeState}}' 2>/dev/null | grep -q "active"; then
docker stack ls 2>/dev/null || log_warning "无堆栈部署"
else
log_warning "Swarm 未激活,无法查看堆栈"
fi
echo ""
}
# 快速部署
quick_deploy() {
log_info "=== 快速部署 ==="
# 检查 Swarm
if ! docker info --format '{{.Swarm.LocalNodeState}}' 2>/dev/null | grep -q "active"; then
log_info "初始化 Docker Swarm..."
"${PROJECT_ROOT}/swarm/scripts/swarm-manager.sh" init
fi
# 部署 Traefik
log_info "部署 Traefik 反向代理..."
"${PROJECT_ROOT}/swarm/scripts/swarm-manager.sh" deploy traefik "${PROJECT_ROOT}/swarm/stacks/traefik-swarm-stack.yml"
# 等待 Traefik 启动
log_info "等待 Traefik 启动..."
sleep 10
# 部署示例服务
log_info "部署示例服务..."
"${PROJECT_ROOT}/swarm/scripts/swarm-manager.sh" deploy demo "${PROJECT_ROOT}/swarm/stacks/demo-services-stack.yml"
log_success "快速部署完成!"
echo ""
log_info "访问地址:"
echo " - Traefik Dashboard: http://localhost:8080"
echo " - 示例应用: 请查看 demo 堆栈的服务配置"
}
# 清理环境
cleanup() {
log_info "=== 清理环境 ==="
# 停止所有堆栈
log_info "停止所有 Docker Stack..."
docker stack ls --format "{{.Name}}" 2>/dev/null | while read -r stack; do
if [[ -n "$stack" ]]; then
log_info "删除堆栈: $stack"
docker stack rm "$stack"
fi
done
# 等待服务清理
log_info "等待服务清理..."
sleep 5
log_success "环境清理完成"
}
# 显示帮助
show_help() {
echo "项目管理脚本"
echo ""
echo "用法: $0 [命令]"
echo ""
echo "命令:"
echo " status - 显示项目状态总览"
echo " deploy - 快速部署所有服务"
echo " cleanup - 清理所有部署的服务"
echo " swarm - 打开 Swarm 管理工具"
echo " tofu - 打开 OpenTofu 管理工具"
echo " help - 显示此帮助信息"
echo ""
echo "子工具:"
echo " ./swarm/scripts/swarm-manager.sh - Docker Swarm 管理"
echo " ./scripts/setup/setup-opentofu.sh - OpenTofu 设置"
echo ""
}
# 主函数
main() {
cd "$PROJECT_ROOT"
case "${1:-help}" in
"status")
show_status
;;
"deploy")
quick_deploy
;;
"cleanup")
cleanup
;;
"swarm")
exec "${PROJECT_ROOT}/swarm/scripts/swarm-manager.sh" "${@:2}"
;;
"tofu")
exec "${PROJECT_ROOT}/scripts/setup/setup-opentofu.sh" "${@:2}"
;;
"help"|*)
show_help
;;
esac
}
main "$@"