Support me on Ko-fi

基於 Next.js 開發的本站 iKnowABit 自動化部署流程介紹 | 技術架構

2026年3月19日
Daniel Lu全端工程師 | 內容創作者

本文詳細解析 iKnowABit 網站基於 Next.js、PM2 與純 Shell 腳本實現的輕量級自動化部署架構。涵蓋從 Git 輪詢監控、原子化發布、軟連結掛載到 Drizzle ORM 多 SQLite 資料庫自動化遷移的全套技術實現方案。

分類Next.js技術Web 開發

本站(iKnowABit)基於 Next.js 框架開發。在沒有引入重量級 CI/CD 工具(如 Jenkins 或 GitLab CI)的前提下,我們透過原生 Shell 腳本結合 PM2 與 Node.js,實現了一套輕量、無停機(Zero-downtime)且具備故障自動回滾能力的自動化部署流程。

本文將詳細拆解該部署流程的設計思路、解決的痛點以及具體的技術實現機制。

1. 痛點與需求分析

在採用原生腳本部署 Next.js 全端專案時,通常會面臨以下 技術痛點

  1. 服務中斷問題 :直接在生產目錄執行原始碼拉取與依賴安裝,會導致建置期間服務不可用。
  2. 狀態污染與回滾困難 :若依賴安裝失敗或資料庫遷移報錯,生產環境會處於損壞的中間狀態,手動恢復成本極高。
  3. 多 SQLite 資料庫併發管理 :本專案底層採用多個獨立的 SQLite 資料庫檔案分離業務線,手動執行結構遷移極易遺漏或造成檔案鎖死。
  4. 伺服器資源占用 :如果在伺服器本地執行完整的 Webhook 監聽服務,會額外占用記憶體與通訊埠資源。

2. 架構設計與核心機制

針對上述痛點,本站設計了 「輕量級輪詢監控 + 原子化軟連結發布 + 故障自動清理」 的架構方案。

  • 輕量化監控 :利用排程任務系統結合遠端 Hash 讀取指令,無需下載全量程式碼即可判斷伺服器端是否有更新。
  • 原子化發布(Atomic Deployment) :每次部署生成獨立的時間戳記目錄,拉取程式碼與依賴安裝均在隔離的目錄下進行,最終透過切換軟連結(Symlink)更新應用版本。
  • 無縫重載 :基於 PM2 的平滑重載特性,軟連結切換後自動重啟 Node 行程,保證線上用戶請求不中斷。
  • 安全回滾機制 :透過 Bash 行程捕捉異常訊號,部署中途出現任何非零退出碼,立即自動刪除當前建置目錄,防止污染線上穩定環境。

自動化部署總流程圖

Loading diagram...

3. 核心實現原理解析

整個部署架構由監控模組、部署模組以及多資料庫遷移模組共同驅動。為徹底剝離敏感資訊,以下著重解析各模組的底層運轉邏輯。

3.1 監控觸發模組

該模組透過系統的排程任務以高頻次呼叫。為保證併發安全與效能,採取了特定維度的最佳化策略。

Loading diagram...
  • 併發鎖控制 :每次執行前檢查並在暫存目錄下生成行程鎖檔案(Lock File)。若檢測到鎖檔案留存超過設定閾值(如 20 分鐘),則判定為死鎖並強制釋放,防止監控任務永久掛起。
  • 極速版本比對 :放棄使用消耗頻寬與磁碟 IO 的全量程式碼拉取命令,改為設定超時的唯讀網路請求,直接獲取遠端儲存庫的指標 Hash 值,並將其與本地記錄的檔案進行比對。僅當檢測到差異時,才觸發下游發布流程。

3.2 部署與回滾模組

該模組是核心的執行引擎,負責完成原子化發布,其核心特性在於容錯與環境隔離。

Loading diagram...
  • 嚴格異常處理與自動回滾 :模組開啟了嚴格模式,一旦中間任何一條指令(如依賴安裝、網路超時)失敗,將立即拋出異常。同時註冊了退出鉤子(Trap),當接收到異常終止訊號且成功標識未被置位時,自動執行清理邏輯,銷毀當前尚未建置完整的殘缺目錄。
  • 資料與程式碼解耦 :將持久化資料(如各業務線獨立的 SQLite 資料庫檔案及其預寫式日誌 WAL 快取)以及用戶靜態資源均存放在絕對物理共享路徑下。每次部署時,在新版本的目錄下建立指向這些物理路徑的軟連結,確保程式碼更新與資料狀態完全剝離。
  • 無停機切換與舊版清理 :所有準備工作(依賴安裝、資料掛載)在獨立隔離的目錄完成後,透過重設軟連結將生產入口瞬間指向新目錄,隨後呼叫守護行程進行設定重新整理。最後執行自動清理指令,基於時間戳記倒序刪除老舊目錄,僅保留極少數歷史版本以釋放伺服器磁碟空間。

3.3 多資料庫遷移模組

基於 Node.js 腳本與 Drizzle ORM 構建的多庫自動化遷移模組,負責解決底層資料表結構變更的跨業務同步。

Loading diagram...
  • 多庫映射管理 :模組內部維護了核心業務庫、系統設定庫、內容庫等多個實體資料庫的名稱、物理檔案絕對路徑與預編譯 SQL 遷移腳本路徑的映射矩陣。在獨立執行環境下,按需讀取全域環境變數並初始化對應的連線池。
  • 狀態聯動與安全阻斷 :嚴格遍歷執行各資料庫的結構升級任務。若在此過程中出現任何 SQL 級錯誤或資料表結構衝突,將立即捕捉異常、安全切斷當前檔案的連線鎖,並強制以非零狀態碼退出行程。該異常狀態碼會被外層監控體系的嚴格模式捕捉,從而直接阻斷應用層的重載行為,並觸發物理目錄的自動清理回滾,進而保障舊版本服務所依賴的資料結構不受破壞。

在排查上述架構部署生成的大段參數日誌,或者獨立調試業務相關的深層結構設定檔時,推薦使用以下系統排錯輔助工具:

🔗 本地純前端 JSON 校驗與結構解析工具

提供即時語法錯誤標註與視覺化樹狀檢索互動,純本地瀏覽器記憶體中計算格式,不外洩雲端敏感參數。


本文由 iknowabit 團隊原創。技術支援:基於 Next.js、常規 Bash 叢集架構及 Drizzle ORM 構建自動化發布策略。