easyai/https.sh
wangbo 6bb62904e0 fix(config): 更新服务名称和配置检测逻辑
- 将 comfy-server 替换为 easyai-server 在环境配置文件中
- 修改 README.md 中的服务引用名称
- 添加 WS_GATEWAY_LOG_LEVEL 日志级别配置
- 实现 nginx 配置文件自动检测和选择功能
- 更新 https.sh 中的配置文件查找逻辑
2026-04-04 23:01:43 +08:00

360 lines
10 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

if command -v nginx &> /dev/null; then
echo "✅ Nginx 已安装,跳过安装步骤"
else
echo "🚀 安装 Nginx"
# 检测系统类型
if command -v apt &> /dev/null; then
# Debian/Ubuntu 系统
apt install -y nginx
elif command -v yum &> /dev/null; then
# CentOS/RHEL 系统
yum install -y nginx
elif command -v dnf &> /dev/null; then
# 较新版本的 Fedora/RHEL 系统
dnf install -y nginx
else
echo "❌ 不支持的操作系统:未找到支持的包管理器"
exit 1
fi
fi
# 函数:尝试使用指定的包管理器安装
try_install() {
local cmd=$1
if command -v "$cmd" &> /dev/null; then
echo "📦 尝试使用 $cmd 安装 snapd..."
if sudo "$cmd" install -y snapd; then
return 0
fi
fi
return 1
}
# 检查 Certbot 是否已安装
if command -v certbot &> /dev/null; then
echo "✅ Certbot 已安装,跳过安装步骤"
else
echo "🚀 安装 Certbot"
# 检测系统类型
if [ -f /etc/debian_version ]; then
# Ubuntu/Debian 系统
apt install -y certbot python3-certbot-nginx
# 也可以使用snapd安装
# apt install -y snapd
# # 使用snap安装 certbot
# snap install --classic certbot
# # Prepare the Certbot command
# sudo ln -s /snap/bin/certbot /usr/bin/certbot
elif [ -f /etc/redhat-release ]; then
# CentOS/RHEL 系统
# 首先安装 EPEL 仓库
yum install -y epel-release
# 安装 snapd
# 检查是否已安装
if command -v snap &> /dev/null; then
echo "✅ snapd 已经安装"
exit 0
fi
echo "🔍 检测系统包管理器..."
# 尝试使用 dnf 安装
if try_install "dnf"; then
echo "✅ 使用 dnf 安装 snapd 成功"
# 尝试使用 yum 安装
elif try_install "yum"; then
echo "✅ 使用 yum 安装 snapd 成功"
# 尝试使用 apt-get 安装(适用于 Debian/Ubuntu
elif try_install "apt-get"; then
echo "✅ 使用 apt-get 安装 snapd 成功"
else
echo "❌ 无法安装 snapd未找到支持的包管理器"
exit 1
fi
# 启用 snapd 服务
systemctl enable --now snapd.socket
# 创建符号链接
ln -s /var/lib/snapd/snap /snap
# 安装 certbot
snap install --classic certbot
# Prepare the Certbot command
sudo ln -s /snap/bin/certbot /usr/bin/certbot
else
echo "❌ 不支持的操作系统"
exit 1
fi
fi
# 验证安装
echo "🔍 验证安装"
if command -v nginx &> /dev/null && command -v certbot &> /dev/null; then
echo "✅ Nginx 和 Certbot 安装成功"
nginx -v
certbot --version
else
echo "❌ 安装验证失败"
exit 1
fi
# ===== 域名配置交互与文件生成 =====
prompt_domain() {
local domain
while true; do
read -r -p "🌐 请输入域名(例如 demo.example.com: " domain
domain=$(echo "$domain" | xargs)
if [ -n "$domain" ] && [[ "$domain" =~ ^[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)+$ ]]; then
echo "$domain"
return 0
fi
echo "❌ 域名格式不正确,请重新输入。"
done
}
escape_sed() {
echo "$1" | sed 's/[.[\*^$()+?{}|/]/\\&/g'
}
get_primary_domain_from_conf() {
local conf_file=$1
awk '
/server_name/ {
for (i = 2; i <= NF; i++) {
gsub(";", "", $i)
if ($i !~ /^www\./ && $i !~ /^\*/ && $i != "localhost") {
print $i
exit
}
}
}
' "$conf_file"
}
create_conf_by_template() {
local domain=$1
local target_file=$2
if [ -f "./demo.51easyai.com.conf" ]; then
cp "./demo.51easyai.com.conf" "./$target_file"
sed -i.bak "s/www\.demo\.51easyai\.com/www.$domain/g; s/demo\.51easyai\.com/$domain/g" "./$target_file"
rm -f "./$target_file.bak"
return 0
fi
if [ -f "./2.conf" ]; then
cp "./2.conf" "./$target_file"
sed -i.bak "s/www\.2/www.$domain/g; s/\b2\b/$domain/g" "./$target_file"
rm -f "./$target_file.bak"
return 0
fi
cat > "./$target_file" <<EOF
map \$http_upgrade \$connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name www.$domain;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
try_files \$uri =404;
}
location / {
return 301 https://$domain\$request_uri;
}
}
server {
listen 80;
listen [::]:80;
server_name $domain;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
try_files \$uri =404;
}
location / {
proxy_pass http://127.0.0.1:3010/;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_set_header Host \$host;
}
}
EOF
}
upsert_domain_for_conf() {
local conf_file=$1
local mode
local new_domain
echo " 检测到当前目录已有配置文件: $conf_file"
while true; do
echo "请选择域名处理方式:"
echo " 1) 替换当前域名"
echo " 2) 新增一个域名"
read -r -p "请输入选项 (1/2): " mode
case "$mode" in
1|2) break ;;
*) echo "❌ 无效选项,请输入 1 或 2" ;;
esac
done
new_domain=$(prompt_domain)
if [ "$mode" = "1" ]; then
local old_domain
old_domain=$(get_primary_domain_from_conf "./$conf_file")
if [ -z "$old_domain" ]; then
echo "⚠️ 未能自动识别旧域名,将直接尝试新增域名。"
mode="2"
else
local old_domain_escaped
local new_domain_escaped
old_domain_escaped=$(escape_sed "$old_domain")
new_domain_escaped=$(escape_sed "$new_domain")
sed -i.bak "s/www\\.$old_domain_escaped/www.$new_domain_escaped/g; s/$old_domain_escaped/$new_domain_escaped/g" "./$conf_file"
rm -f "./$conf_file.bak"
echo "✅ 已将域名从 $old_domain 替换为 $new_domain"
fi
fi
if [ "$mode" = "2" ]; then
local changed=0
if ! grep -Eq "server_name[^;]*[[:space:]]$new_domain([[:space:];]|$)" "./$conf_file"; then
sed -i.bak "/server_name/s/;/ $new_domain;/g" "./$conf_file"
changed=1
fi
if ! grep -Eq "server_name[^;]*[[:space:]]www\\.$new_domain([[:space:];]|$)" "./$conf_file"; then
sed -i.bak "/server_name/s/;/ www.$new_domain;/g" "./$conf_file"
changed=1
fi
rm -f "./$conf_file.bak"
if [ "$changed" -eq 1 ]; then
echo "✅ 已新增域名:$new_domain(含 www.$new_domain"
else
echo " 配置文件已包含该域名,无需新增。"
fi
fi
}
detect_existing_proxy_conf() {
local preferred_file=$1
local -a candidates=()
local conf
if [ -n "$preferred_file" ] && [ -f "./$preferred_file" ]; then
echo "$preferred_file"
return 0
fi
while IFS= read -r conf; do
if grep -Eq "^[[:space:]]*server_name[[:space:]]+" "./$conf"; then
candidates+=("$conf")
fi
done < <(ls -1 *.conf 2>/dev/null || true)
if [ "${#candidates[@]}" -eq 0 ]; then
return 1
fi
if [ "${#candidates[@]}" -eq 1 ]; then
echo "${candidates[0]}"
return 0
fi
echo "⚠️ 检测到多个可用配置文件,请选择一个:"
local i
for i in "${!candidates[@]}"; do
printf " %s) %s\n" "$((i + 1))" "${candidates[$i]}"
done
while true; do
read -r -p "请输入序号: " i
if [[ "$i" =~ ^[0-9]+$ ]] && [ "$i" -ge 1 ] && [ "$i" -le "${#candidates[@]}" ]; then
echo "${candidates[$((i - 1))]}"
return 0
fi
echo "❌ 无效序号,请重新输入。"
done
}
echo "🚀 复制当前目录的配置文件到nginx配置文件目录"
# 支持 EASYAI_PROXY_CONF 指定配置文件(如 51easyai.com.conf
PREFERRED_CONF_FILE="${EASYAI_PROXY_CONF:-}"
DEFAULT_NEW_CONF_FILE="${EASYAI_PROXY_CONF:-easyai-proxy.conf}"
CONF_FILE=$(detect_existing_proxy_conf "$PREFERRED_CONF_FILE")
if [ -n "$CONF_FILE" ]; then
upsert_domain_for_conf "$CONF_FILE"
else
CONF_FILE="$DEFAULT_NEW_CONF_FILE"
echo " 当前目录未找到可用 nginx 配置文件(*.conf 且包含 server_name"
input_domain=$(prompt_domain)
create_conf_by_template "$input_domain" "$CONF_FILE"
echo "✅ 已根据域名 $input_domain 创建配置文件: ./$CONF_FILE"
fi
cp "./$CONF_FILE" "/etc/nginx/conf.d/$CONF_FILE"
echo "🚀 重载nginx"
sudo nginx -s reload
# 停止 Nginx 服务以释放 80 端口
sudo nginx -s stop
echo "🚀 使用certbot 自动配置证书"
# 从 Nginx 配置文件中提取所有域名
SERVER_NAME_LINES=$(
if [ -f "/etc/nginx/conf.d/$CONF_FILE" ]; then
grep "server_name" "/etc/nginx/conf.d/$CONF_FILE" 2>/dev/null || true
else
find /etc/nginx/conf.d/ -name "*.conf" -exec grep "server_name" {} \; 2>/dev/null || true
fi
)
DOMAINS=$(echo "$SERVER_NAME_LINES" | \
grep -v "#" | \
awk '{for(i=2;i<=NF;i++) if($i!=";") print $i}' | \
sed 's/;//g' | \
sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | \
grep -E '^[A-Za-z0-9.-]+$' | \
grep -vE '^(\*|localhost)$' | \
sort -u | \
tr '\n' ' ')
if [ -n "$DOMAINS" ]; then
# 停止 Nginx 服务
echo "停止 Nginx 服务..."
sudo nginx -s stop
# 构建域名参数字符串
DOMAIN_ARGS=()
for domain in $DOMAINS; do
DOMAIN_ARGS+=("-d" "$domain")
done
# 使用 certbot --nginx 插件安装证书
sudo certbot --nginx \
--non-interactive \
--agree-tos \
--email wangbo@51easyai.com \
--rsa-key-size 2048 \
--preferred-challenges http \
--force-renewal \
"${DOMAIN_ARGS[@]}"
# 启动 Nginx 服务
echo "启动 Nginx 服务..."
sudo nginx
fi