feat: init Astro blog with wikilinks, KaTeX and local search
- Astro 5 static blog, zero runtime JS - Obsidian wikilink remark plugin (slug matches Astro content collection) - KaTeX math rendering, local search, TOC, archives, tags - 5 posts on math/physics/ML topics - deploy scripts for nginx + certbot + rsync
This commit is contained in:
Executable
+98
@@ -0,0 +1,98 @@
|
||||
#!/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="sausagetoast.cloud" # VPS 地址(备案期间建议填服务器 IP)
|
||||
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"
|
||||
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://<服务器IP>:8321"
|
||||
echo " 备案完成后:ssh 到服务器执行 sudo rm /etc/nginx/conf.d/ip-preview.conf && sudo systemctl reload nginx 即可移除"
|
||||
Reference in New Issue
Block a user