ec33aedd79
ci/woodpecker/push/woodpecker Pipeline failed
- Fix standalone path: dist/standalone/novalon-website/ - Update static files path: dist/static - Replace curl with wget in health checks (Alpine compatibility) - Add monitoring and optimization scripts - Configure external network for docker-compose This resolves the deployment failure caused by Next.js 16's new standalone output structure.
148 lines
3.6 KiB
Bash
Executable File
148 lines
3.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# 生产环境容器优化脚本
|
|
# 用途:优化容器自动重启策略和Nginx配置
|
|
|
|
set -e
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
log_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
log_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
separator() {
|
|
echo "======================================================================"
|
|
}
|
|
|
|
separator
|
|
echo "生产环境容器优化脚本"
|
|
echo "执行时间: $(date)"
|
|
separator
|
|
|
|
# 1. 更新容器重启策略
|
|
log_info "步骤1: 更新容器重启策略"
|
|
separator
|
|
|
|
CONTAINERS=(
|
|
"woodpecker-server"
|
|
"woodpecker-agent"
|
|
"novalon-nginx"
|
|
"novalon-website"
|
|
"forgejo"
|
|
"postgresql"
|
|
"registry"
|
|
)
|
|
|
|
for container in "${CONTAINERS[@]}"; do
|
|
if docker ps -a --format "{{.Names}}" | grep -q "^${container}$"; then
|
|
log_info "更新 $container 重启策略为 always"
|
|
docker update --restart=always "$container" || log_warning "无法更新 $container"
|
|
else
|
|
log_warning "容器 $container 不存在"
|
|
fi
|
|
done
|
|
|
|
log_success "容器重启策略更新完成"
|
|
|
|
# 2. 优化Nginx配置
|
|
log_info "步骤2: 优化Nginx配置"
|
|
separator
|
|
|
|
NGINX_CONF="/home/novalon/docker-app/novalon-nginx/nginx.conf"
|
|
|
|
if [ -f "$NGINX_CONF" ]; then
|
|
# 备份原配置
|
|
cp "$NGINX_CONF" "${NGINX_CONF}.backup.$(date +%Y%m%d_%H%M%S)"
|
|
|
|
# 添加Docker DNS解析器
|
|
if ! grep -q "resolver 127.0.0.11" "$NGINX_CONF"; then
|
|
log_info "添加Docker DNS解析器到Nginx配置"
|
|
|
|
# 在http块中添加resolver
|
|
sed -i '/http {/a\ # Docker DNS resolver for dynamic container name resolution\n resolver 127.0.0.11 valid=30s ipv6=off;\n' "$NGINX_CONF"
|
|
|
|
log_success "Nginx配置已优化"
|
|
else
|
|
log_info "Nginx配置已包含DNS解析器"
|
|
fi
|
|
else
|
|
log_warning "未找到Nginx配置文件: $NGINX_CONF"
|
|
fi
|
|
|
|
# 3. 重启Nginx应用新配置
|
|
log_info "步骤3: 重启Nginx应用新配置"
|
|
separator
|
|
|
|
docker restart novalon-nginx
|
|
sleep 3
|
|
|
|
if docker ps --format "{{.Names}}\t{{.Status}}" | grep "novalon-nginx" | grep -q "Up"; then
|
|
log_success "Nginx重启成功"
|
|
else
|
|
log_error "Nginx重启失败"
|
|
exit 1
|
|
fi
|
|
|
|
# 4. 验证服务状态
|
|
log_info "步骤4: 验证服务状态"
|
|
separator
|
|
|
|
echo ""
|
|
log_info "容器状态:"
|
|
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "NAME|woodpecker|nginx|novalon|forgejo|postgres|registry"
|
|
|
|
echo ""
|
|
log_info "容器重启策略:"
|
|
for container in "${CONTAINERS[@]}"; do
|
|
if docker ps -a --format "{{.Names}}" | grep -q "^${container}$"; then
|
|
RESTART_POLICY=$(docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' "$container")
|
|
echo " $container: $RESTART_POLICY"
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
log_info "测试服务访问:"
|
|
if curl -I --connect-timeout 5 http://localhost:80 2>&1 | grep -q "HTTP"; then
|
|
log_success "HTTP服务正常"
|
|
else
|
|
log_warning "HTTP服务异常"
|
|
fi
|
|
|
|
if curl -I --connect-timeout 5 https://localhost:443 -k 2>&1 | grep -q "HTTP"; then
|
|
log_success "HTTPS服务正常"
|
|
else
|
|
log_warning "HTTPS服务异常"
|
|
fi
|
|
|
|
separator
|
|
log_success "容器优化完成"
|
|
separator
|
|
|
|
echo ""
|
|
log_info "优化摘要:"
|
|
echo " ✅ 所有容器重启策略已更新为 always"
|
|
echo " ✅ Nginx已配置Docker DNS解析器"
|
|
echo " ✅ 服务状态已验证"
|
|
|
|
echo ""
|
|
log_warning "后续建议:"
|
|
echo " 1. 监控容器状态: docker ps"
|
|
echo " 2. 查看容器日志: docker logs <container-name>"
|
|
echo " 3. 配置监控告警: 设置定时检查脚本"
|
|
|
|
separator
|