#!/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 已提交。"