mgmt/swarm-traefik-manager.sh

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 "$@"