Astro 部落格部署至 VPS
前言:
在開發 Astro 部落格時,最麻煩的步驟莫過於每次改完內容都要手動打包、開啟 FTP、上傳檔案。本篇文章將分享如何利用 Windows 11 內建的 OpenSSH 工具,撰寫一個自動化批次檔 (.bat),實現「打包 + 上傳」一鍵完成。
為什麼選擇批次檔部署?
- 速度快:省去打開 GUI 工具(如 FileZilla)的時間。
- 自動化:自動執行
npm run build,確保上傳的是最新版本。 - 靈活性:可選擇「僅上傳」或「打包後上傳」。
前置準備
- VPS 環境:確保你的伺服器已建立目標目錄(例如
/var/www/html/blog)。 - SSH 金鑰:
- 在 Windows 使用
ssh-keygen產生金鑰,或將 PuTTY 的.ppk匯出為 OpenSSH 格式。 - 確保私鑰檔案權限已重設(僅限本人讀取),否則會被系統拒絕連線。
- 在 Windows 使用
- Node.js:本地電腦需安裝 Node.js 以執行打包指令。
自動化部署腳本 (deploy.bat)
請在你的電腦建立一個 deploy.bat,並將以下代碼複製進去。記得根據你的 VPS IP 與路徑修改 [設定區]。
@echo off
:: 強制切換為 UTF-8 編碼以顯示中文
chcp 65001 >nul
setlocal enabledelayedexpansion
:: ==========================================
:: --- [設定區] 請根據實際情況調整 ---
:: ==========================================
set SERVER_USER=root
set SERVER_IP=你的VPS_IP
set SSH_KEY_PATH=D:\你的金鑰路徑\id_rsa_linux
set PROJECT_DIR=D:\你的專案路徑\my-astro-blog
set LOCAL_DIST=D:\你的專案路徑\my-astro-blog\dist
set REMOTE_DIR=/var/www/html/blog
:: ==========================================
echo ==========================================
echo Astro 部署助手
echo ==========================================
echo [1] 僅上傳資料 (不執行 Build)
echo [2] 執行 Build 並上傳 (完整部署)
echo ==========================================
set /p opt="請選擇操作 (1 或 2): "
if "%opt%"=="1" goto :UPLOAD_ONLY
if "%opt%"=="2" goto :FULL_DEPLOY
echo [錯誤] 無效的選項,程式結束。
pause
exit /b
:FULL_DEPLOY
echo.
echo [1/3] 正在打包專案 (npm run build)...
cd /d "%PROJECT_DIR%"
call npm run build
if %ERRORLEVEL% NEQ 0 (
echo [Error] 打包失敗,請檢查代碼。
pause
exit /b 1
)
goto :CLEAN_REMOTE
:UPLOAD_ONLY
echo.
echo [跳過] 已選擇不執行 Build,直接使用現有的 dist 資料夾。
goto :CLEAN_REMOTE
:CLEAN_REMOTE
echo.
echo [2/3] 正在清理遠端目錄並準備環境...
ssh -i "%SSH_KEY_PATH%" %SERVER_USER%@%SERVER_IP% "mkdir -p %REMOTE_DIR% && rm -rf %REMOTE_DIR%/*"
if %ERRORLEVEL% NEQ 0 goto :SSH_ERROR
echo.
echo [3/3] 正在上傳檔案至 VPS...
scp -i "%SSH_KEY_PATH%" -r "%LOCAL_DIST%\*" %SERVER_USER%@%SERVER_IP%:%REMOTE_DIR%
if %ERRORLEVEL% EQU 0 goto :SUCCESS
goto :UPLOAD_ERROR
:SSH_ERROR
echo [Error] SSH 連線失敗,請檢查網路或金鑰。
goto :END
:UPLOAD_ERROR
echo [Error] 上傳失敗。
goto :END
:SUCCESS
echo.
echo ------------------------------------------
echo Status: [Success] 部署完成!
echo Local Source: %LOCAL_DIST%
echo Remote Target: %REMOTE_DIR%
echo ------------------------------------------
goto :END
:END
pause
exit /b
踩坑筆記:解決 Windows 的權限問題
如果你在執行時遇到 WARNING: UNPROTECTED PRIVATE KEY FILE!,這是因為 Windows 的檔案權限太過開放。
解決方案: 以「系統管理員身分」開啟 PowerShell,執行以下指令來鎖定金鑰權限:
$keyPath = "你的金鑰路徑"
# 1. 取得所有權 (這一條執行不成功沒關係,下面兩條成功就好)
icacls $keyPath /setowner $env:USERNAME
# 2. 停用繼承
icacls $keyPath /inheritance:r
# 3. 僅賦予當前使用者完全控制權
icacls $keyPath /grant:r "${env:USERNAME}:(F)"
結語
透過這個腳本,我將原本需要 2-3 分鐘的部署流程縮短到了 30 秒以內。這對於頻繁更新內容的部落客來說非常有感。如果你也有一台 VPS,不妨試試看這種更專業、更工程師的部署方式!
以上內容使用Gemini 產生,目前這個部落格就是用上面的程式更新網頁內容
Exported: 3/27/2026 19:07:23
Link: https://gemini.google.com/app/ccf940c9751c0f98
Powered by Gemini Exporter