#!/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 "$@"