266 lines
7.0 KiB
Bash
266 lines
7.0 KiB
Bash
|
#!/bin/bash
|
|||
|
|
|||
|
# 目标服务器配置脚本 (简化版 - 支持用户名密码)
|
|||
|
# 在 116.62.163.84 服务器上运行
|
|||
|
|
|||
|
echo "🚀 开始配置Jenkins部署目标服务器..."
|
|||
|
|
|||
|
# 更新系统
|
|||
|
echo "📦 更新系统包..."
|
|||
|
yum update -y || apt update -y
|
|||
|
|
|||
|
# 检查Docker是否已安装
|
|||
|
if command -v docker &> /dev/null; then
|
|||
|
echo "✅ Docker已安装"
|
|||
|
docker --version
|
|||
|
else
|
|||
|
echo "❌ 请先安装Docker"
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
|
|||
|
# 启动Docker服务
|
|||
|
echo "🐳 启动Docker服务..."
|
|||
|
systemctl start docker
|
|||
|
systemctl enable docker
|
|||
|
|
|||
|
# 创建应用目录
|
|||
|
echo "📁 创建应用目录..."
|
|||
|
mkdir -p /opt/jenkins-demo
|
|||
|
mkdir -p /opt/jenkins-demo/logs
|
|||
|
mkdir -p /opt/jenkins-demo/backup
|
|||
|
|
|||
|
# 设置防火墙规则
|
|||
|
echo "🔥 配置防火墙规则..."
|
|||
|
if command -v firewall-cmd &> /dev/null; then
|
|||
|
# CentOS/RHEL
|
|||
|
firewall-cmd --permanent --add-port=80/tcp
|
|||
|
firewall-cmd --permanent --add-port=8080/tcp
|
|||
|
firewall-cmd --reload
|
|||
|
elif command -v ufw &> /dev/null; then
|
|||
|
# Ubuntu
|
|||
|
ufw allow 80/tcp
|
|||
|
ufw allow 8080/tcp
|
|||
|
ufw --force enable
|
|||
|
fi
|
|||
|
|
|||
|
# 配置SSH(如果使用密码认证)
|
|||
|
echo "🔐 配置SSH..."
|
|||
|
# 确保SSH服务运行
|
|||
|
systemctl start sshd
|
|||
|
systemctl enable sshd
|
|||
|
|
|||
|
# 如果需要启用密码认证(不推荐生产环境)
|
|||
|
# sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
|
|||
|
# systemctl restart sshd
|
|||
|
|
|||
|
# 创建部署脚本
|
|||
|
echo "📝 创建部署脚本..."
|
|||
|
cat > /opt/jenkins-demo/deploy-local.sh << 'EOF'
|
|||
|
#!/bin/bash
|
|||
|
|
|||
|
# 本地部署脚本
|
|||
|
APP_NAME="jenkins-demo"
|
|||
|
CONTAINER_NAME_PROD="jenkins-demo-prod"
|
|||
|
CONTAINER_NAME_TEST="jenkins-demo-test"
|
|||
|
|
|||
|
case "$1" in
|
|||
|
"prod")
|
|||
|
echo "🎯 部署生产环境..."
|
|||
|
docker stop $CONTAINER_NAME_PROD || true
|
|||
|
docker rm $CONTAINER_NAME_PROD || true
|
|||
|
|
|||
|
docker run -d --name $CONTAINER_NAME_PROD \
|
|||
|
-p 80:8080 \
|
|||
|
--restart unless-stopped \
|
|||
|
-e SPRING_PROFILES_ACTIVE=prod \
|
|||
|
-e JAVA_OPTS="-Xms512m -Xmx1024m" \
|
|||
|
-v /opt/jenkins-demo/logs:/app/logs \
|
|||
|
$APP_NAME:latest
|
|||
|
echo "✅ 生产环境部署完成"
|
|||
|
;;
|
|||
|
"test")
|
|||
|
echo "🧪 部署测试环境..."
|
|||
|
docker stop $CONTAINER_NAME_TEST || true
|
|||
|
docker rm $CONTAINER_NAME_TEST || true
|
|||
|
|
|||
|
docker run -d --name $CONTAINER_NAME_TEST \
|
|||
|
-p 8080:8080 \
|
|||
|
--restart unless-stopped \
|
|||
|
-e SPRING_PROFILES_ACTIVE=test \
|
|||
|
-v /opt/jenkins-demo/logs:/app/logs \
|
|||
|
$APP_NAME:latest
|
|||
|
echo "✅ 测试环境部署完成"
|
|||
|
;;
|
|||
|
"status")
|
|||
|
echo "📊 应用状态:"
|
|||
|
docker ps -a --filter name=jenkins-demo
|
|||
|
;;
|
|||
|
"logs")
|
|||
|
echo "📄 应用日志:"
|
|||
|
docker logs -f ${2:-jenkins-demo-prod}
|
|||
|
;;
|
|||
|
"backup")
|
|||
|
echo "💾 备份当前版本..."
|
|||
|
BACKUP_TAG="backup-$(date +%Y%m%d-%H%M%S)"
|
|||
|
docker tag $APP_NAME:latest $APP_NAME:$BACKUP_TAG
|
|||
|
echo "✅ 备份完成: $APP_NAME:$BACKUP_TAG"
|
|||
|
;;
|
|||
|
*)
|
|||
|
echo "用法: $0 {prod|test|status|logs|backup}"
|
|||
|
exit 1
|
|||
|
;;
|
|||
|
esac
|
|||
|
EOF
|
|||
|
|
|||
|
chmod +x /opt/jenkins-demo/deploy-local.sh
|
|||
|
|
|||
|
# 创建健康检查脚本
|
|||
|
cat > /opt/jenkins-demo/health-check.sh << 'EOF'
|
|||
|
#!/bin/bash
|
|||
|
|
|||
|
# 健康检查脚本
|
|||
|
PROD_URL="http://localhost/api/health"
|
|||
|
TEST_URL="http://localhost:8080/api/health"
|
|||
|
|
|||
|
echo "🏥 执行应用健康检查..."
|
|||
|
|
|||
|
echo "检查生产环境:"
|
|||
|
curl -s -o /dev/null -w "状态码: %{http_code}\n" $PROD_URL || echo "生产环境无响应"
|
|||
|
|
|||
|
echo "检查测试环境:"
|
|||
|
curl -s -o /dev/null -w "状态码: %{http_code}\n" $TEST_URL || echo "测试环境无响应"
|
|||
|
|
|||
|
echo "Docker容器状态:"
|
|||
|
docker ps --filter name=jenkins-demo --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
|||
|
EOF
|
|||
|
|
|||
|
chmod +x /opt/jenkins-demo/health-check.sh
|
|||
|
|
|||
|
# 创建清理脚本
|
|||
|
cat > /opt/jenkins-demo/cleanup.sh << 'EOF'
|
|||
|
#!/bin/bash
|
|||
|
|
|||
|
echo "🧹 清理Docker资源..."
|
|||
|
|
|||
|
# 清理停止的容器
|
|||
|
docker container prune -f
|
|||
|
|
|||
|
# 清理未使用的镜像
|
|||
|
docker image prune -f
|
|||
|
|
|||
|
# 清理未使用的网络
|
|||
|
docker network prune -f
|
|||
|
|
|||
|
# 清理未使用的卷
|
|||
|
docker volume prune -f
|
|||
|
|
|||
|
# 显示磁盘使用情况
|
|||
|
echo "💾 磁盘使用情况:"
|
|||
|
df -h /
|
|||
|
|
|||
|
echo "🐳 Docker磁盘使用情况:"
|
|||
|
docker system df
|
|||
|
|
|||
|
echo "✅ 清理完成"
|
|||
|
EOF
|
|||
|
|
|||
|
chmod +x /opt/jenkins-demo/cleanup.sh
|
|||
|
|
|||
|
# 设置定时清理任务
|
|||
|
echo "⏰ 设置定时清理任务..."
|
|||
|
(crontab -l 2>/dev/null; echo "0 2 * * 0 /opt/jenkins-demo/cleanup.sh >> /var/log/docker-cleanup.log 2>&1") | crontab -
|
|||
|
|
|||
|
# 创建监控脚本
|
|||
|
cat > /opt/jenkins-demo/monitor.sh << 'EOF'
|
|||
|
#!/bin/bash
|
|||
|
|
|||
|
# 应用监控脚本
|
|||
|
LOG_FILE="/var/log/jenkins-demo-monitor.log"
|
|||
|
|
|||
|
# 记录日志
|
|||
|
log() {
|
|||
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
|
|||
|
}
|
|||
|
|
|||
|
# 检查容器是否运行
|
|||
|
check_container() {
|
|||
|
local container_name=$1
|
|||
|
if docker ps --filter name=$container_name --filter status=running -q | grep -q .; then
|
|||
|
log "✅ $container_name 运行正常"
|
|||
|
return 0
|
|||
|
else
|
|||
|
log "❌ $container_name 未运行"
|
|||
|
return 1
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
# 检查应用健康状态
|
|||
|
check_health() {
|
|||
|
local url=$1
|
|||
|
local name=$2
|
|||
|
local status=$(curl -s -o /dev/null -w "%{http_code}" $url)
|
|||
|
if [ "$status" = "200" ]; then
|
|||
|
log "✅ $name 健康检查通过"
|
|||
|
return 0
|
|||
|
else
|
|||
|
log "❌ $name 健康检查失败,状态码: $status"
|
|||
|
return 1
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
# 主监控逻辑
|
|||
|
main() {
|
|||
|
log "🔍 开始监控检查..."
|
|||
|
|
|||
|
# 检查生产环境
|
|||
|
if check_container "jenkins-demo-prod"; then
|
|||
|
check_health "http://localhost/api/health" "生产环境"
|
|||
|
fi
|
|||
|
|
|||
|
# 检查测试环境
|
|||
|
if check_container "jenkins-demo-test"; then
|
|||
|
check_health "http://localhost:8080/api/health" "测试环境"
|
|||
|
fi
|
|||
|
|
|||
|
log "✅ 监控检查完成"
|
|||
|
}
|
|||
|
|
|||
|
main
|
|||
|
EOF
|
|||
|
|
|||
|
chmod +x /opt/jenkins-demo/monitor.sh
|
|||
|
|
|||
|
# 设置监控定时任务
|
|||
|
echo "📊 设置监控定时任务..."
|
|||
|
(crontab -l 2>/dev/null; echo "*/5 * * * * /opt/jenkins-demo/monitor.sh") | crontab -
|
|||
|
|
|||
|
# 显示服务器信息
|
|||
|
echo ""
|
|||
|
echo "🎉 服务器配置完成!"
|
|||
|
echo ""
|
|||
|
echo "📋 服务器信息:"
|
|||
|
echo "IP地址: $(hostname -I | awk '{print $1}')"
|
|||
|
echo "操作系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'=' -f2 | tr -d '\"')"
|
|||
|
echo "Docker版本: $(docker --version)"
|
|||
|
echo ""
|
|||
|
echo "📁 应用目录: /opt/jenkins-demo"
|
|||
|
echo "📄 日志目录: /opt/jenkins-demo/logs"
|
|||
|
echo "💾 备份目录: /opt/jenkins-demo/backup"
|
|||
|
echo ""
|
|||
|
echo "🔧 可用脚本:"
|
|||
|
echo " 部署脚本: /opt/jenkins-demo/deploy-local.sh"
|
|||
|
echo " 健康检查: /opt/jenkins-demo/health-check.sh"
|
|||
|
echo " 清理脚本: /opt/jenkins-demo/cleanup.sh"
|
|||
|
echo " 监控脚本: /opt/jenkins-demo/monitor.sh"
|
|||
|
echo ""
|
|||
|
echo "🌐 访问地址:"
|
|||
|
echo " 生产环境: http://$(hostname -I | awk '{print $1}')/api/health"
|
|||
|
echo " 测试环境: http://$(hostname -I | awk '{print $1}'):8080/api/health"
|
|||
|
echo ""
|
|||
|
echo "💡 使用提示:"
|
|||
|
echo " sudo /opt/jenkins-demo/deploy-local.sh prod # 部署生产环境"
|
|||
|
echo " sudo /opt/jenkins-demo/deploy-local.sh test # 部署测试环境"
|
|||
|
echo " sudo /opt/jenkins-demo/health-check.sh # 健康检查"
|
|||
|
echo " sudo /opt/jenkins-demo/cleanup.sh # 清理资源"
|
|||
|
echo ""
|