251 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			251 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
#!/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 <stack> <service> <replicas>"
 | 
						|
        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 <command> [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 <stack> <service> <replicas>  扩缩容服务"
 | 
						|
    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 "$@" |