Update nginx

This commit is contained in:
2025-11-17 13:45:21 +08:00
committed by GitHub
parent b7100a9918
commit f03756df36

345
nginx
View File

@@ -1,164 +1,237 @@
#!/bin/bash #!/bin/bash
# 设置颜色输出 set -euo pipefail
# ==================================================
# Nginx Proxy Manager 一键安装脚本
# 版本: 1.0
# 描述: 自动部署 Nginx Proxy Manager 反向代理管理工具
# ==================================================
# 脚本配置
APP_NAME="nginx-proxy-manager"
SCRIPT_NAME="deploy_nginx_proxy_manager.sh"
WORK_DIR="/data"
# 颜色定义
RED='\033[0;31m' RED='\033[0;31m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color NC='\033[0m' # No Color
# 打印颜色信息 # 日志函数
print_info() { log_info() {
echo -e "${GREEN}[INFO]${NC} $1" echo -e "${BLUE}[INFO]${NC} $1"
} }
print_warning() { log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1" echo -e "${YELLOW}[WARNING]${NC} $1"
} }
print_error() { log_error() {
echo -e "${RED}[ERROR]${NC} $1" echo -e "${RED}[ERROR]${NC} $1"
} }
# 检查端口是否被占用 # 错误处理函数
check_port() { error_exit() {
local port=$1 log_error "$1"
if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null ; then exit 1
print_error "端口 $port 已被占用"
return 1
else
print_info "端口 $port 可用"
return 0
fi
} }
# 检查所有需要的端口 # 清理函数
check_ports() { cleanup() {
print_info "检查端口占用情况..." log_info "正在清理临时资源..."
# 可以在这里添加清理代码
}
# 信号处理
trap cleanup EXIT INT TERM
# ==================================================
# 环境检查
# ==================================================
log_info "开始检查运行环境..."
# 检查是否为 root 用户
if [[ $EUID -eq 0 ]]; then
log_warning "建议使用非 root 用户执行此脚本,但将继续执行..."
fi
# 检查 Docker 是否安装
if ! command -v docker &> /dev/null; then
error_exit "Docker 未安装,请先安装 Docker"
fi
# 检查 Docker 服务状态
if ! systemctl is-active --quiet docker && ! systemctl is-active --quiet docker.service; then
log_info "尝试启动 Docker 服务..."
if ! sudo systemctl start docker 2>/dev/null; then
error_exit "Docker 服务未运行且无法启动"
fi
fi
# 测试 Docker 是否正常工作
if ! docker info &> /dev/null; then
error_exit "Docker 无法正常工作,请检查 Docker 服务状态"
fi
log_success "环境检查通过"
# ==================================================
# 目录准备
# ==================================================
log_info "正在准备工作目录..."
# 创建并切换到工作目录
if [[ ! -d "$WORK_DIR" ]]; then
log_info "创建工作目录: $WORK_DIR"
if ! sudo mkdir -p "$WORK_DIR" 2>/dev/null && ! mkdir -p "$WORK_DIR"; then
error_exit "无法创建目录 $WORK_DIR请检查权限"
fi
fi
# 进入工作目录
cd "$WORK_DIR" || error_exit "无法进入目录 $WORK_DIR"
# 创建必要的子目录
for dir in nginx-proxy-manager/data nginx-proxy-manager/letsencrypt; do
if [[ ! -d "$dir" ]]; then
log_info "创建目录: $WORK_DIR/$dir"
mkdir -p "$dir" || error_exit "无法创建目录 $dir"
fi
done
log_success "目录准备完成"
# ==================================================
# 停止并删除现有容器(如果存在)
# ==================================================
log_info "检查现有容器..."
if docker ps -a --format "table {{.Names}}" | grep -q "^${APP_NAME}$"; then
log_info "发现已存在的容器,正在停止并删除..."
local ports=(80 81 443) # 停止容器
local conflict_found=0 if docker ps --format "table {{.Names}}" | grep -q "^${APP_NAME}$"; then
docker stop "$APP_NAME" || log_warning "停止容器失败,但将继续执行"
sleep 5
fi
for port in "${ports[@]}"; do # 删除容器
if ! check_port $port; then docker rm "$APP_NAME" || error_exit "删除旧容器失败"
conflict_found=1 log_success "旧容器清理完成"
fi
# ==================================================
# 拉取 Docker 镜像
# ==================================================
log_info "正在拉取 Nginx Proxy Manager 镜像..."
# 设置重试机制
MAX_RETRIES=3
RETRY_COUNT=0
while [[ $RETRY_COUNT -lt $MAX_RETRIES ]]; do
if docker pull docker.io/jc21/nginx-proxy-manager:latest; then
log_success "镜像拉取成功"
break
else
RETRY_COUNT=$((RETRY_COUNT + 1))
if [[ $RETRY_COUNT -eq $MAX_RETRIES ]]; then
error_exit "镜像拉取失败,已达到最大重试次数"
else
log_warning "镜像拉取失败,第 $RETRY_COUNT 次重试..."
sleep 10
fi fi
done
if [ $conflict_found -eq 1 ]; then
print_error "检测到端口冲突,请解决冲突后重新运行脚本"
exit 1
else
print_info "所有端口检查通过"
fi fi
} done
# 创建必要的目录 # ==================================================
create_directories() { # 部署容器
print_info "创建数据目录..." # ==================================================
mkdir -p ./data
mkdir -p ./letsencrypt log_info "正在启动 Nginx Proxy Manager 容器..."
if [ $? -eq 0 ]; then DOCKER_RUN_CMD="docker run -d \
print_info "目录创建成功" --name $APP_NAME \
else --restart=unless-stopped \
print_error "目录创建失败" -p 80:80 \
exit 1 -p 81:81 \
-p 443:443 \
-v $WORK_DIR/nginx-proxy-manager/data:/data \
-v $WORK_DIR/nginx-proxy-manager/letsencrypt:/etc/letsencrypt \
docker.io/jc21/nginx-proxy-manager:latest"
log_info "执行命令: $DOCKER_RUN_CMD"
if ! eval "$DOCKER_RUN_CMD"; then
error_exit "容器启动失败"
fi
log_success "容器启动命令执行成功"
# ==================================================
# 等待并验证服务状态
# ==================================================
log_info "等待服务启动..."
sleep 10
# 检查容器状态
if ! docker ps --format "table {{.Names}}\t{{.Status}}" | grep -q "$APP_NAME"; then
error_exit "容器未运行,请检查日志: docker logs $APP_NAME"
fi
CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' "$APP_NAME" 2>/dev/null || echo "unknown")
if [[ "$CONTAINER_STATUS" != "running" ]]; then
error_exit "容器状态异常: $CONTAINER_STATUS请检查日志: docker logs $APP_NAME"
fi
# 检查服务端口
PORTS=(80 81 443)
for port in "${PORTS[@]}"; do
if ! ss -tln | grep -q ":$port "; then
log_warning "端口 $port 未监听,服务可能仍在启动中"
fi fi
} done
# 创建 docker-compose.yml 文件 log_success "Nginx Proxy Manager 部署完成!"
create_docker_compose() {
print_info "创建 docker-compose.yml 文件..."
cat > docker-compose.yml << 'EOF'
services:
app:
image: 'docker.io/jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
EOF
if [ -f "docker-compose.yml" ]; then # ==================================================
print_info "docker-compose.yml 文件创建成功" # 显示部署信息
else # ==================================================
print_error "docker-compose.yml 文件创建失败"
exit 1
fi
}
# 启动服务 echo
start_services() { log_success "🎉 Nginx Proxy Manager 部署成功!"
print_info "启动 Nginx Proxy Manager..." echo
echo "═══════════════════════════════════════════════════════════════"
if command -v docker-compose &> /dev/null; then echo "访问地址: http://$(hostname -I | awk '{print $1}'):81"
docker-compose up -d echo "默认邮箱: admin@example.com"
elif command -v docker &> /dev/null && docker compose version &> /dev/null; then echo "默认密码: changeme"
docker compose up -d echo
else echo "重要提示:"
print_error "未找到 docker-compose 或 docker compose 命令" echo "1. 首次登录后请立即修改默认密码"
exit 1 echo "2. 管理界面运行在 81 端口"
fi echo "3. 数据存储位置: $WORK_DIR/nginx-proxy-manager/"
echo "4. 查看容器日志: docker logs $APP_NAME"
if [ $? -eq 0 ]; then echo "5. 停止服务: docker stop $APP_NAME"
print_info "Nginx Proxy Manager 启动成功" echo "6. 启动服务: docker start $APP_NAME"
else echo "═══════════════════════════════════════════════════════════════"
print_error "Nginx Proxy Manager 启动失败" echo
exit 1
fi
}
# 显示安装完成信息 # 显示容器状态
show_completion_info() { log_info "当前容器状态:"
echo docker ps --filter "name=$APP_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
print_info "=== Nginx Proxy Manager 安装完成 ==="
echo
print_info "访问地址: http://你的服务器IP:81"
print_info "默认登录信息:"
print_info " 邮箱: admin@example.com"
print_info " 密码: changeme"
echo
print_warning "首次登录后请立即修改默认密码!"
echo
print_info "服务端口映射:"
print_info " - 管理界面: 81"
print_info " - HTTP 代理: 80 → 80"
print_info " - HTTPS 代理: 443 → 443"
echo
}
# 主函数 # 显示数据目录结构
main() { log_info "数据目录结构:"
echo find "$WORK_DIR/nginx-proxy-manager" -type f -name "*" | head -10
print_info "开始安装 Nginx Proxy Manager..."
echo
# 检查 Docker 是否安装
if ! command -v docker &> /dev/null; then
print_error "Docker 未安装,请先安装 Docker"
exit 1
fi
# 检查端口
check_ports
# 创建目录
create_directories
# 创建 docker-compose 文件
create_docker_compose
# 启动服务
start_services
# 显示完成信息
show_completion_info
}
# 运行主函数
main "$@"