#!/usr/bin/env bash # 备案期间:临时用 http://<服务器IP>:8321 访问博客(不走域名/80/443) # # 用法: ./deploy/ip-preview.sh # 前置: ① 服务器安全组/防火墙放行 TCP 8321 # ② 本机配好到服务器的 SSH 免密(REMOTE_HOST 连不通时改成服务器 IP) # 幂等可重跑:每次重新构建同步 + 重写 8321 配置。 set -euo pipefail # ====== 配置区(与 deploy.sh 保持一致,ssh 不通时 REMOTE_HOST 填服务器 IP) ====== REMOTE_USER="root" # SSH 用户(服务器是 ubuntu 用户的话改成 ubuntu) REMOTE_HOST="106.54.37.223" # VPS 地址(备案期间用 IP;备案完成后改回 sausagetoast.cloud) REMOTE_DIR="/var/www/yukun" # 博客站点根目录 # ============================================================================== SSH_TARGET="${REMOTE_USER}@${REMOTE_HOST}" ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" SSH_OPTS="-o StrictHostKeyChecking=accept-new" echo "==> [1/3] 构建站点 (astro build)..." cd "$ROOT_DIR" # 备案期间评论区用 IP 直连(无需子域名): # REMOTE_HOST 是 IPv4 时自动注入评论后端地址 http://:8080 # 如需自定义(比如端口不同),可提前手动 export PUBLIC_ARTALK_SERVER 覆盖 if [[ "$REMOTE_HOST" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] && [ -z "${PUBLIC_ARTALK_SERVER:-}" ]; then export PUBLIC_ARTALK_SERVER="http://${REMOTE_HOST}:8080" echo " 评论服务地址: ${PUBLIC_ARTALK_SERVER} (deploy/artalk/)" fi npm run build [ -d "$ROOT_DIR/dist" ] || { echo "✗ 构建失败:dist 不存在"; exit 1; } echo "==> [2/3] 同步到 ${SSH_TARGET}:${REMOTE_DIR} ..." rsync -avz --delete --human-readable \ "$ROOT_DIR/dist/" "${SSH_TARGET}:${REMOTE_DIR}/" echo "==> 生成 8321 访问配置并上传 ..." cat > /tmp/yukun-ip-preview.conf <<'NGINX' # 备案期间:临时用 http://<服务器IP>:8321 访问博客(由 deploy/ip-preview.sh 生成) # 不监听 80/443,与正式站点配置互不干扰;备案完成后删除此文件即可。 server { listen 8321; server_name _; root /var/www/yukun; index index.html; gzip on; gzip_vary on; gzip_min_length 1024; gzip_comp_level 6; gzip_types text/plain text/css text/xml text/javascript application/javascript application/x-javascript application/json application/xml application/xml+rss image/svg+xml; location ~* \.(?:css|js|woff2?|ttf|otf|svg|png|jpg|jpeg|gif|webp|ico|avif)$ { expires 30d; add_header Cache-Control "public, immutable"; access_log off; } location = /sitemap-index.xml { add_header Cache-Control "no-cache"; } location ~ ^/sitemap.* { add_header Cache-Control "no-cache"; } location / { try_files $uri $uri/ $uri.html =404; } error_page 404 /404.html; add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; access_log /var/log/nginx/yukun.access.log; error_log /var/log/nginx/yukun.error.log; } NGINX scp $SSH_OPTS /tmp/yukun-ip-preview.conf "$SSH_TARGET:/tmp/yukun-ip-preview.conf" rm -f /tmp/yukun-ip-preview.conf echo "==> [3/3] 远端启用 8321 配置 ..." ssh $SSH_OPTS "$SSH_TARGET" "bash -s" <<'REMOTE' set -euo pipefail SUDO="" [ "$(id -u)" -ne 0 ] && SUDO="sudo" $SUDO cp /tmp/yukun-ip-preview.conf /etc/nginx/conf.d/ip-preview.conf rm -f /tmp/yukun-ip-preview.conf echo "==> 测试 nginx 配置 ..." $SUDO nginx -t echo "==> reload nginx ..." $SUDO systemctl reload nginx || $SUDO systemctl restart nginx REMOTE echo "" echo "✓ 完成!访问 http://${REMOTE_HOST}:8321" echo " 备案完成后:ssh 到服务器执行 sudo rm /etc/nginx/conf.d/ip-preview.conf && sudo systemctl reload nginx 即可移除"