#!/bin/bash # Traefik + Docker Swarm 管理脚本 # 用于部署、管理和监控 Traefik 在 Docker Swarm 中的集成 set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" NETWORK_NAME="traefik-public" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 日志函数 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" } # 检查 Docker Swarm 状态 check_swarm() { log_info "检查 Docker Swarm 状态..." if ! docker info | grep -q "Swarm: active"; then log_error "Docker Swarm 未激活,请先初始化 Swarm 集群" echo "运行: docker swarm init" exit 1 fi log_success "Docker Swarm 已激活" } # 创建网络 create_network() { log_info "创建 Traefik 公共网络..." if docker network ls | grep -q "$NETWORK_NAME"; then log_warning "网络 $NETWORK_NAME 已存在" else docker network create --driver overlay --attachable "$NETWORK_NAME" log_success "网络 $NETWORK_NAME 创建成功" fi } # 部署 Traefik deploy_traefik() { log_info "部署 Traefik 服务..." docker stack deploy -c "$SCRIPT_DIR/traefik-swarm-stack.yml" traefik log_success "Traefik 部署完成" } # 部署示例服务 deploy_demo() { log_info "部署示例服务..." docker stack deploy -c "$SCRIPT_DIR/demo-services-stack.yml" demo log_success "示例服务部署完成" } # 部署监控服务 deploy_monitoring() { log_info "部署监控服务..." docker stack deploy -c "$SCRIPT_DIR/monitoring-stack.yml" monitoring log_success "监控服务部署完成" } # 显示服务状态 show_status() { log_info "显示服务状态..." echo "" echo "=== Traefik Stack ===" docker stack services traefik echo "" echo "=== Demo Stack ===" docker stack services demo 2>/dev/null || echo "Demo stack not deployed" echo "" echo "=== Monitoring Stack ===" docker stack services monitoring 2>/dev/null || echo "Monitoring stack not deployed" echo "" } # 显示访问地址 show_urls() { log_info "服务访问地址:" echo "" echo "🎛️ Traefik Dashboard: http://traefik.local:8080" echo "🌐 Web App: http://app.local" echo "🔌 API Service: http://api.local" echo "📊 Monitor Service: http://monitor.local" echo "📈 Prometheus: http://prometheus.local" echo "📊 Grafana: http://grafana.local (admin/admin123)" echo "" echo "💡 请确保在 /etc/hosts 中添加以下条目:" echo "127.0.0.1 traefik.local app.local api.local monitor.local prometheus.local grafana.local" } # 查看日志 show_logs() { local service=${1:-traefik_traefik} log_info "显示 $service 服务日志..." docker service logs -f "$service" } # 扩缩容服务 scale_service() { local stack=$1 local service=$2 local replicas=$3 if [[ -z "$stack" || -z "$service" || -z "$replicas" ]]; then log_error "用法: $0 scale " exit 1 fi log_info "扩缩容 ${stack}_${service} 到 $replicas 个副本..." docker service scale "${stack}_${service}=$replicas" log_success "扩缩容完成" } # 清理所有服务 cleanup() { log_warning "清理所有 Traefik 相关服务..." read -p "确认删除所有服务? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then docker stack rm monitoring 2>/dev/null || true docker stack rm demo 2>/dev/null || true docker stack rm traefik 2>/dev/null || true log_info "等待服务清理完成..." sleep 10 # 清理网络 docker network rm "$NETWORK_NAME" 2>/dev/null || true log_success "清理完成" else log_info "取消清理操作" fi } # 更新 hosts 文件 update_hosts() { log_info "更新 /etc/hosts 文件..." # 备份原文件 sudo cp /etc/hosts /etc/hosts.backup.$(date +%Y%m%d_%H%M%S) # 移除旧的条目 sudo sed -i '/# Traefik Swarm Demo/d' /etc/hosts sudo sed -i '/traefik.local\|app.local\|api.local\|monitor.local\|prometheus.local\|grafana.local/d' /etc/hosts # 添加新条目 echo "# Traefik Swarm Demo" | sudo tee -a /etc/hosts echo "127.0.0.1 traefik.local app.local api.local monitor.local prometheus.local grafana.local" | sudo tee -a /etc/hosts log_success "hosts 文件更新完成" } # 显示帮助 show_help() { echo "Traefik + Docker Swarm 管理脚本" echo "" echo "用法: $0 [options]" echo "" echo "命令:" echo " init 初始化环境 (创建网络)" echo " deploy 部署 Traefik" echo " deploy-demo 部署示例服务" echo " deploy-monitoring 部署监控服务" echo " deploy-all 部署所有服务" echo " status 显示服务状态" echo " urls 显示访问地址" echo " logs [service] 查看服务日志" echo " scale 扩缩容服务" echo " update-hosts 更新 hosts 文件" echo " cleanup 清理所有服务" echo " help 显示帮助信息" echo "" echo "示例:" echo " $0 deploy-all # 部署所有服务" echo " $0 scale demo webapp 3 # 扩容 webapp 到 3 个副本" echo " $0 logs traefik_traefik # 查看 Traefik 日志" } # 主函数 main() { case "${1:-help}" in "init") check_swarm create_network ;; "deploy") check_swarm create_network deploy_traefik show_urls ;; "deploy-demo") deploy_demo ;; "deploy-monitoring") deploy_monitoring ;; "deploy-all") check_swarm create_network deploy_traefik sleep 5 deploy_demo deploy_monitoring show_status show_urls ;; "status") show_status ;; "urls") show_urls ;; "logs") show_logs "$2" ;; "scale") scale_service "$2" "$3" "$4" ;; "update-hosts") update_hosts ;; "cleanup") cleanup ;; "help"|*) show_help ;; esac } # 执行主函数 main "$@"