80 lines
2.9 KiB
Bash
Executable File
80 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
ENV_FILE="${SCRIPT_DIR}/.env.prod"
|
||
if [ ! -f "${ENV_FILE}" ]; then
|
||
echo "❌ 找不到 deploy/.env.prod,請先建立後再執行。"
|
||
exit 1
|
||
fi
|
||
|
||
source "${ENV_FILE}"
|
||
|
||
DEPLOY_HOST="${DEPLOY_HOST:-}"
|
||
DEPLOY_USER="${DEPLOY_USER:-}"
|
||
DEPLOY_PORT="${DEPLOY_PORT:-22}"
|
||
APP_DOMAIN="${APP_DOMAIN:-vtuber.wooo.work}"
|
||
NGINX_SERVER_CONFIG="${NGINX_SERVER_CONFIG:-}"
|
||
SNIPPET_SRC="${SCRIPT_DIR}/vtuber-nginx-110-live-fallback.conf"
|
||
SNIPPET_REMOTE="/etc/nginx/snippets/vtuber-nginx-110-live-fallback.conf"
|
||
|
||
if [ -z "${DEPLOY_HOST}" ] || [ -z "${DEPLOY_USER}" ]; then
|
||
echo "❌ deploy/.env.prod 缺少 DEPLOY_HOST / DEPLOY_USER"
|
||
exit 1
|
||
fi
|
||
|
||
REMOTE="${DEPLOY_USER}@${DEPLOY_HOST}"
|
||
SSH_OPTS=(-p "${DEPLOY_PORT}")
|
||
SCP_OPTS=(-P "${DEPLOY_PORT}")
|
||
NGINX_SNIPPET_TAG="vtuber-nginx-110-live-fallback.conf"
|
||
TMP_SNIPPET="/tmp/vtuber-nginx-110-live-fallback.conf"
|
||
|
||
if [ -z "${NGINX_SERVER_CONFIG}" ]; then
|
||
echo "未指定 NGINX_SERVER_CONFIG,開始自動偵測..."
|
||
NGINX_SERVER_CONFIG="$(
|
||
ssh "${SSH_OPTS[@]}" "${REMOTE}" "
|
||
if [ -f '/etc/nginx/conf.d/vtuber.wooo.conf' ]; then
|
||
echo '/etc/nginx/conf.d/vtuber.wooo.conf'
|
||
elif [ -f \"/etc/nginx/sites-available/${APP_DOMAIN}\" ]; then
|
||
echo '/etc/nginx/sites-available/${APP_DOMAIN}'
|
||
elif [ -f '/etc/nginx/sites-enabled/vtuber.wooo.work' ]; then
|
||
echo '/etc/nginx/sites-enabled/vtuber.wooo.work'
|
||
else
|
||
grep -R -l \"server_name[[:space:]]\\+.*${APP_DOMAIN}\" /etc/nginx/sites-enabled /etc/nginx/sites-available /etc/nginx/conf.d 2>/dev/null | head -n 1
|
||
fi
|
||
"
|
||
)"
|
||
fi
|
||
|
||
if [ -z "${NGINX_SERVER_CONFIG}" ]; then
|
||
echo "❌ 無法自動找出 vtuber 的 nginx 設定檔,請手動指定 NGINX_SERVER_CONFIG 環境變數"
|
||
exit 1
|
||
fi
|
||
|
||
echo "目標主機:${REMOTE}"
|
||
echo "目標網域:${APP_DOMAIN}"
|
||
echo "目標 Nginx 設定:${NGINX_SERVER_CONFIG}"
|
||
|
||
ssh "${SSH_OPTS[@]}" "${REMOTE}" "test -f '${SNIPPET_REMOTE}' && sudo chmod 644 '${SNIPPET_REMOTE}' || true"
|
||
ssh "${SSH_OPTS[@]}" "${REMOTE}" "test -f '${NGINX_SERVER_CONFIG}' || { echo 'Nginx 設定檔不存在:${NGINX_SERVER_CONFIG}' >&2; exit 1; }"
|
||
scp "${SCP_OPTS[@]}" "${SNIPPET_SRC}" "${REMOTE}:${TMP_SNIPPET}"
|
||
ssh "${SSH_OPTS[@]}" "${REMOTE}" "sudo cp '${TMP_SNIPPET}' '${SNIPPET_REMOTE}' && sudo chmod 644 '${SNIPPET_REMOTE}'"
|
||
|
||
ssh "${SSH_OPTS[@]}" "${REMOTE}" "
|
||
set -euo pipefail
|
||
sudo cp '${NGINX_SERVER_CONFIG}' '${NGINX_SERVER_CONFIG}.bak.\$(date +%F_%H%M%S)'
|
||
if ! sudo grep -q '${NGINX_SNIPPET_TAG}' '${NGINX_SERVER_CONFIG}'; then
|
||
sudo sed -i '/^[[:space:]]*server_name[[:space:]]\\+[^;]*;/ a\\
|
||
include /etc/nginx/snippets/vtuber-nginx-110-live-fallback.conf;\\
|
||
' '${NGINX_SERVER_CONFIG}'
|
||
fi
|
||
sudo nginx -t
|
||
if command -v systemctl >/dev/null 2>&1; then
|
||
sudo systemctl reload nginx
|
||
else
|
||
sudo service nginx reload
|
||
fi
|
||
"
|
||
|
||
echo "✅ 110 Nginx 404 fallback 已提交。"
|