fix(deploy): ??????? 80/443 ???????????
Made-with: Cursor
This commit is contained in:
@@ -4,6 +4,21 @@
|
|||||||
|
|
||||||
YH_COMPOSE_FILES="-f docker-compose.yml -f docker-compose.host-nginx.yml"
|
YH_COMPOSE_FILES="-f docker-compose.yml -f docker-compose.host-nginx.yml"
|
||||||
|
|
||||||
|
require_cmd() {
|
||||||
|
local c="$1"
|
||||||
|
command -v "$c" >/dev/null 2>&1 || {
|
||||||
|
echo "错误: 缺少命令 $c,请先安装后重试。" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_host_deploy_env() {
|
||||||
|
require_cmd systemctl
|
||||||
|
require_cmd ss
|
||||||
|
require_cmd sed
|
||||||
|
require_cmd awk
|
||||||
|
}
|
||||||
|
|
||||||
host_nginx_online() {
|
host_nginx_online() {
|
||||||
command -v systemctl >/dev/null 2>&1 || return 1
|
command -v systemctl >/dev/null 2>&1 || return 1
|
||||||
systemctl is-active nginx >/dev/null 2>&1 && return 0
|
systemctl is-active nginx >/dev/null 2>&1 && return 0
|
||||||
@@ -11,7 +26,43 @@ host_nginx_online() {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
force_release_port() {
|
||||||
|
local p="$1"
|
||||||
|
local victims
|
||||||
|
victims="$(run_sudo ss -tlnp "sport = :$p" 2>/dev/null | sed -n 's/.*pid=\([0-9]\+\).*/\1/p' | awk '!seen[$0]++')"
|
||||||
|
[ -z "$victims" ] && return 0
|
||||||
|
|
||||||
|
for pid in $victims; do
|
||||||
|
[ -z "$pid" ] && continue
|
||||||
|
local comm
|
||||||
|
comm="$(run_sudo sh -c "cat /proc/$pid/comm 2>/dev/null" || true)"
|
||||||
|
if [ "$comm" = "nginx" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "端口 $p 被非宿主机 nginx 进程占用(pid=$pid, comm=${comm:-unknown}),强制停止..."
|
||||||
|
run_sudo kill -9 "$pid" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
force_release_host_ports() {
|
||||||
|
# 先优先停掉所有发布了宿主机 80/443 的容器(最常见冲突源)
|
||||||
|
if command -v docker >/dev/null 2>&1; then
|
||||||
|
for cid in $(run_sudo docker ps --filter "publish=80" --format "{{.ID}}" 2>/dev/null); do
|
||||||
|
[ -n "$cid" ] && run_sudo docker rm -f "$cid" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
for cid in $(run_sudo docker ps --filter "publish=443" --format "{{.ID}}" 2>/dev/null); do
|
||||||
|
[ -n "$cid" ] && run_sudo docker rm -f "$cid" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
# 再兜底杀掉非 nginx 的占用进程
|
||||||
|
force_release_port 80
|
||||||
|
force_release_port 443
|
||||||
|
}
|
||||||
|
|
||||||
ensure_host_nginx_started() {
|
ensure_host_nginx_started() {
|
||||||
|
ensure_host_deploy_env
|
||||||
|
force_release_host_ports
|
||||||
|
|
||||||
if host_nginx_online; then
|
if host_nginx_online; then
|
||||||
echo "宿主机 Nginx 在线,跳过启动。"
|
echo "宿主机 Nginx 在线,跳过启动。"
|
||||||
return 0
|
return 0
|
||||||
@@ -57,6 +108,7 @@ yh_install_host_nginx_site_conf() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
ensure_host_deploy_env
|
||||||
mkdir -p "$ROOT/verify-root"
|
mkdir -p "$ROOT/verify-root"
|
||||||
sed "s|__VERIFY_ROOT__|$ROOT/verify-root|g" "$tpl" | run_sudo tee "$out" >/dev/null
|
sed "s|__VERIFY_ROOT__|$ROOT/verify-root|g" "$tpl" | run_sudo tee "$out" >/dev/null
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user