Files
dock/nginx
2025-10-26 16:03:53 +08:00

226 lines
7.4 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 设置变量
DATA_DIR="/data"
SCRIPT_DIR="/boot/脚本"
COMPOSE_FILE="$SCRIPT_DIR/ru.yaml"
# 检查是否以 root 权限运行
if [ "$EUID" -ne 0 ]; then
echo "请使用 sudo 运行此脚本"
exit 1
fi
# 函数:检查端口是否被占用
check_port() {
local port=$1
if netstat -tulpn 2>/dev/null | grep -q ":${port} "; then
return 1 # 端口被占用
else
return 0 # 端口可用
fi
}
# 函数:显示端口占用信息
show_port_info() {
local port=$1
echo "端口 $port 被以下进程占用:"
netstat -tulpn 2>/dev/null | grep ":${port} " || lsof -i :${port} 2>/dev/null
echo "----------------------------------------"
}
# 函数:生成 Docker Compose 配置
generate_compose_config() {
local http_port=$1
local admin_port=$2
local https_port=$3
cat > "$COMPOSE_FILE" << EOF
# Nginx Proxy Manager 配置
# 初始登录信息:
# 邮箱: admin@example.com
# 密码: changeme
# 管理界面: http://服务器IP:${admin_port}
services:
app:
image: 'docker.io/jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '${http_port}:80' # HTTP 流量
- '${admin_port}:81' # 管理界面
- '${https_port}:443' # HTTPS 流量
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
environment:
- DISABLE_IPV6=false
EOF
}
# 创建目录
echo "创建必要的目录..."
mkdir -p "$DATA_DIR"
mkdir -p "$SCRIPT_DIR"
# 默认端口配置
DEFAULT_HTTP_PORT="80"
DEFAULT_ADMIN_PORT="81"
DEFAULT_HTTPS_PORT="443"
# 备用端口配置
ALTERNATE_HTTP_PORT="8080"
ALTERNATE_ADMIN_PORT="8081"
ALTERNATE_HTTPS_PORT="8443"
# 检查默认端口是否可用
echo "检查端口占用情况..."
http_port_used=0
admin_port_used=0
https_port_used=0
check_port $DEFAULT_HTTP_PORT || http_port_used=1
check_port $DEFAULT_ADMIN_PORT || admin_port_used=1
check_port $DEFAULT_HTTPS_PORT || https_port_used=1
# 如果有端口被占用,显示信息
if [ $http_port_used -eq 1 ] || [ $admin_port_used -eq 1 ] || [ $https_port_used -eq 1 ]; then
echo "发现端口被占用:"
[ $http_port_used -eq 1 ] && echo " - 端口 $DEFAULT_HTTP_PORT (HTTP) 被占用" && show_port_info $DEFAULT_HTTP_PORT
[ $admin_port_used -eq 1 ] && echo " - 端口 $DEFAULT_ADMIN_PORT (管理界面) 被占用" && show_port_info $DEFAULT_ADMIN_PORT
[ $https_port_used -eq 1 ] && echo " - 端口 $DEFAULT_HTTPS_PORT (HTTPS) 被占用" && show_port_info $DEFAULT_HTTPS_PORT
echo ""
echo "请选择操作:"
echo "1) 自动使用备用端口 (8080, 8081, 8443)"
echo "2) 手动指定端口"
echo "3) 停止占用端口的进程后重试"
echo "4) 退出脚本"
read -p "请输入选择 (1-4): " choice
case $choice in
1)
HTTP_PORT=$ALTERNATE_HTTP_PORT
ADMIN_PORT=$ALTERNATE_ADMIN_PORT
HTTPS_PORT=$ALTERNATE_HTTPS_PORT
echo "使用备用端口: HTTP=$HTTP_PORT, 管理界面=$ADMIN_PORT, HTTPS=$HTTPS_PORT"
;;
2)
echo "请手动指定端口:"
read -p "HTTP 端口 (默认 $ALTERNATE_HTTP_PORT): " custom_http
read -p "管理界面端口 (默认 $ALTERNATE_ADMIN_PORT): " custom_admin
read -p "HTTPS 端口 (默认 $ALTERNATE_HTTPS_PORT): " custom_https
HTTP_PORT=${custom_http:-$ALTERNATE_HTTP_PORT}
ADMIN_PORT=${custom_admin:-$ALTERNATE_ADMIN_PORT}
HTTPS_PORT=${custom_https:-$ALTERNATE_HTTPS_PORT}
# 检查手动指定的端口是否可用
echo "检查手动指定端口..."
check_port $HTTP_PORT && http_ok=1 || http_ok=0
check_port $ADMIN_PORT && admin_ok=1 || admin_ok=0
check_port $HTTPS_PORT && https_ok=1 || https_ok=0
if [ $http_ok -eq 0 ] || [ $admin_ok -eq 0 ] || [ $https_ok -eq 0 ]; then
echo "错误:以下端口仍被占用:"
[ $http_ok -eq 0 ] && echo " - 端口 $HTTP_PORT" && show_port_info $HTTP_PORT
[ $admin_ok -eq 0 ] && echo " - 端口 $ADMIN_PORT" && show_port_info $ADMIN_PORT
[ $https_ok -eq 0 ] && echo " - 端口 $HTTPS_PORT" && show_port_info $HTTPS_PORT
echo "请重新运行脚本选择其他端口"
exit 1
fi
;;
3)
echo "停止占用端口的进程..."
[ $http_port_used -eq 1 ] && sudo fuser -k $DEFAULT_HTTP_PORT/tcp 2>/dev/null
[ $admin_port_used -eq 1 ] && sudo fuser -k $DEFAULT_ADMIN_PORT/tcp 2>/dev/null
[ $https_port_used -eq 1 ] && sudo fuser -k $DEFAULT_HTTPS_PORT/tcp 2>/dev/null
sleep 2
# 重新检查端口
echo "重新检查端口..."
check_port $DEFAULT_HTTP_PORT && http_port_used=0 || http_port_used=1
check_port $DEFAULT_ADMIN_PORT && admin_port_used=0 || admin_port_used=1
check_port $DEFAULT_HTTPS_PORT && https_port_used=0 || https_port_used=1
if [ $http_port_used -eq 0 ] && [ $admin_port_used -eq 0 ] && [ $https_port_used -eq 0 ]; then
HTTP_PORT=$DEFAULT_HTTP_PORT
ADMIN_PORT=$DEFAULT_ADMIN_PORT
HTTPS_PORT=$DEFAULT_HTTPS_PORT
echo "端口现在可用,使用默认端口"
else
echo "无法释放所有端口,请使用备用端口选项"
exit 1
fi
;;
4)
echo "退出脚本"
exit 0
;;
*)
echo "无效选择,使用备用端口"
HTTP_PORT=$ALTERNATE_HTTP_PORT
ADMIN_PORT=$ALTERNATE_ADMIN_PORT
HTTPS_PORT=$ALTERNATE_HTTPS_PORT
;;
esac
else
# 所有默认端口都可用
HTTP_PORT=$DEFAULT_HTTP_PORT
ADMIN_PORT=$DEFAULT_ADMIN_PORT
HTTPS_PORT=$DEFAULT_HTTPS_PORT
echo "所有默认端口都可用"
fi
# 创建 Docker Compose 配置文件
echo "创建 Docker Compose 配置文件..."
generate_compose_config $HTTP_PORT $ADMIN_PORT $HTTPS_PORT
# 检查文件是否创建成功
if [ ! -f "$COMPOSE_FILE" ]; then
echo "错误:无法创建配置文件 $COMPOSE_FILE"
exit 1
fi
# 切换到脚本目录
cd "$SCRIPT_DIR" || exit 1
# 检查 Docker 是否运行
if ! systemctl is-active --quiet docker; then
echo "启动 Docker 服务..."
systemctl start docker
sleep 5
fi
# 部署服务
echo "启动 Nginx Proxy Manager..."
docker compose -p nginx -f "$COMPOSE_FILE" up -d
# 检查部署是否成功
if [ $? -eq 0 ]; then
echo "等待服务启动..."
sleep 5
SERVER_IP=$(hostname -I | awk '{print $1}')
echo "=================================================="
echo "Nginx Proxy Manager 部署完成!"
echo "管理界面: http://${SERVER_IP}:${ADMIN_PORT}"
echo "HTTP 端口: ${HTTP_PORT}"
echo "HTTPS 端口: ${HTTPS_PORT}"
echo "初始账号: admin@example.com"
echo "初始密码: changeme"
echo "=================================================="
echo ""
echo "重要提示:"
echo "1. 首次登录后请立即修改密码"
echo "2. 确保防火墙已开放端口 ${HTTP_PORT}, ${ADMIN_PORT}, ${HTTPS_PORT}"
echo "3. 数据保存在: $SCRIPT_DIR/data"
else
echo "错误:容器启动失败"
echo "请检查 Docker 日志docker logs nginx-proxy-manager"
exit 1
fi