Update nginx
This commit is contained in:
343
nginx
343
nginx
@@ -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 "正在清理临时资源..."
|
||||||
|
# 可以在这里添加清理代码
|
||||||
|
}
|
||||||
|
|
||||||
local ports=(80 81 443)
|
# 信号处理
|
||||||
local conflict_found=0
|
trap cleanup EXIT INT TERM
|
||||||
|
|
||||||
for port in "${ports[@]}"; do
|
# ==================================================
|
||||||
if ! check_port $port; then
|
# 环境检查
|
||||||
conflict_found=1
|
# ==================================================
|
||||||
|
|
||||||
|
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 "发现已存在的容器,正在停止并删除..."
|
||||||
|
|
||||||
|
# 停止容器
|
||||||
|
if docker ps --format "table {{.Names}}" | grep -q "^${APP_NAME}$"; then
|
||||||
|
docker stop "$APP_NAME" || log_warning "停止容器失败,但将继续执行"
|
||||||
|
sleep 5
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 删除容器
|
||||||
|
docker rm "$APP_NAME" || error_exit "删除旧容器失败"
|
||||||
|
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
|
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
log_info "正在启动 Nginx Proxy Manager 容器..."
|
||||||
print_info "目录创建成功"
|
|
||||||
else
|
DOCKER_RUN_CMD="docker run -d \
|
||||||
print_error "目录创建失败"
|
--name $APP_NAME \
|
||||||
exit 1
|
--restart=unless-stopped \
|
||||||
|
-p 80:80 \
|
||||||
|
-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
|
echo
|
||||||
print_info "docker-compose.yml 文件创建成功"
|
log_success "🎉 Nginx Proxy Manager 部署成功!"
|
||||||
else
|
echo
|
||||||
print_error "docker-compose.yml 文件创建失败"
|
echo "═══════════════════════════════════════════════════════════════"
|
||||||
exit 1
|
echo "访问地址: http://$(hostname -I | awk '{print $1}'):81"
|
||||||
fi
|
echo "默认邮箱: admin@example.com"
|
||||||
}
|
echo "默认密码: changeme"
|
||||||
|
echo
|
||||||
|
echo "重要提示:"
|
||||||
|
echo "1. 首次登录后请立即修改默认密码"
|
||||||
|
echo "2. 管理界面运行在 81 端口"
|
||||||
|
echo "3. 数据存储位置: $WORK_DIR/nginx-proxy-manager/"
|
||||||
|
echo "4. 查看容器日志: docker logs $APP_NAME"
|
||||||
|
echo "5. 停止服务: docker stop $APP_NAME"
|
||||||
|
echo "6. 启动服务: docker start $APP_NAME"
|
||||||
|
echo "═══════════════════════════════════════════════════════════════"
|
||||||
|
echo
|
||||||
|
|
||||||
# 启动服务
|
# 显示容器状态
|
||||||
start_services() {
|
log_info "当前容器状态:"
|
||||||
print_info "启动 Nginx Proxy Manager..."
|
docker ps --filter "name=$APP_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
|
||||||
if command -v docker-compose &> /dev/null; then
|
# 显示数据目录结构
|
||||||
docker-compose up -d
|
log_info "数据目录结构:"
|
||||||
elif command -v docker &> /dev/null && docker compose version &> /dev/null; then
|
find "$WORK_DIR/nginx-proxy-manager" -type f -name "*" | head -10
|
||||||
docker compose up -d
|
|
||||||
else
|
|
||||||
print_error "未找到 docker-compose 或 docker compose 命令"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
print_info "Nginx Proxy Manager 启动成功"
|
|
||||||
else
|
|
||||||
print_error "Nginx Proxy Manager 启动失败"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 显示安装完成信息
|
|
||||||
show_completion_info() {
|
|
||||||
echo
|
|
||||||
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() {
|
|
||||||
echo
|
|
||||||
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 "$@"
|
|
||||||
|
|||||||
Reference in New Issue
Block a user