Files
novalon-website/scripts/optimization/production-container-optimization.sh
T
张翔 ec33aedd79
ci/woodpecker/push/woodpecker Pipeline failed
fix(docker): adapt Dockerfile.prod for Next.js 16 standalone output structure
- 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.
2026-03-30 09:04:51 +08:00

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