第15章封面圖:Section 15 部署安裝與成果驗收

這章要學會什麼

  • 說明開發環境跟正式環境有什麼不同,把連線密碼、憑證密碼、授權服務網址全部改用環境變數提供,並讓正式環境只接受加密連線。
  • 用可以重複執行的資料庫腳本建立全新的正式資料庫,並且建立一個只有讀寫權限(不能改結構)的網站專用帳號。
  • 設定加解密金鑰要持久化保存,實測「有持久化保存時重新啟動仍然維持登入、沒有的話會被登出」。
  • 用環境變數建立第一位管理員,在全新的正式網站上跑完「新會員註冊→服務上架核准→使用申請核准→AI 助理呼叫→儀表板查詢→撤銷後被拒絕」整條流程。
  • 完成備份與還原演練,並交付安裝說明、操作手冊、服務與 MCP 文件、測試報告。

先備知識

要先完成第 14 章:自動化測試全部通過,測試報告已經有安全與版面量測的證據。要會用資料庫管理工具以最高權限連線;知道「憑證加私鑰」這種檔案格式大概是什麼。

觀念白話講

開發環境跟正式環境,差在哪裡

項目開發環境正式環境為什麼
密碼放哪開發機器上的獨立設定環境變數(或主機的密鑰管理服務)開發用的設定只存在開發者自己的電腦上
示範資料啟動時自動匯入不匯入正式資料庫不能出現測試帳號
第一位管理員示範資料裡就有用環境變數指定信箱密碼,只生效一次沒有示範資料時要有辦法建立第一位管理員
資料庫帳號最高權限帳號只有讀寫資料權限的專用帳號網站被攻破時,攻擊者拿到的權限越小越好
資料庫結構變更指令直接套用由系統管理員執行可重複執行的腳本網站帳號沒有改結構的權限,變更要有人審閱
連線協定允許不加密連線只允許加密連線授權碼與通行證不能在網路上明文傳送
加解密金鑰存在使用者個人設定檔指定固定資料夾並額外加密保存重新啟動、換主機後,已簽發的通行證仍然能驗證

部署的五個步驟

部署與驗收的五個步驟:①用鎖定的套件版本還原並發行程式→②建立全新資料庫、套用可重複執行的腳本、建立網站專用帳號→③準備憑證與加解密金鑰→④用環境變數啟動,第一次帶著建立管理員的參數→⑤用全新帳號跑完整條驗收流程。
圖 15-1 部署與驗收的五個步驟:①用鎖定的套件版本還原並發行程式→②建立全新資料庫、套用可重複執行的腳本、建立網站專用帳號→③準備憑證與加解密金鑰→④用環境變數啟動,第一次帶著建立管理員的參數→⑤用全新帳號跑完整條驗收流程。

加解密金鑰為什麼一定要「持久化保存」

網站框架用同一套加解密機制保護三樣東西:登入憑證、防偽造請求權杖、以及第 5 章加密存放的上游服務密鑰。這組加解密用的金鑰預設存放在執行帳號的個人設定檔裡;只要換一個執行帳號、換一台主機,或者主機環境沒有正確載入這個設定檔,就會變成完全不同的一組金鑰。後果很直接:已經登入的人全部被登出(而且系統不會顯示任何警告);資料庫裡原本已經加密的上游密鑰永遠解不開,所有需要密鑰的服務呼叫會全部失敗。所以正式環境一定要把這組金鑰指定存放在一個固定的資料夾,並且把這個資料夾跟資料庫一起納入備份計畫。

本章限制:本章示範用同一台機器模擬「教室主機」,實際部署到真正的正式伺服器時,步驟大同小異;提供給雲端的 AI 服務使用時,需要一個外部連得到的加密網址。

老師示範做了什麼

示範情境:把整個系統部署成正式環境(全新資料庫、專用帳號、加密連線),用兩個全新的會員帳號跑完整個成果驗收流程,再示範金鑰持久化的效果與備份還原演練。所有密碼都是隨機產生、只存在部署資料夾裡,不會出現在程式碼或講義裡。

老師先用最高權限帳號建立全新的正式資料庫,套用可重複執行的建置腳本(全部五個之前累積的結構變更依序套用完成),再建立網站專用帳號並只授予讀寫資料的權限——實測用這個專用帳號嘗試刪除資料表跟修改資料表結構,兩者都被明確拒絕;重複執行同一份建置腳本也不會出現任何錯誤。接著以正式環境設定啟動網站,第一次啟動時帶著建立管理員用的環境變數,日誌清楚提示「已建立第一位管理員,請立即移除這組環境變數」;金鑰資料夾裡也出現了金鑰檔案。

正式網站的呼叫紀錄:整條驗收流程留下的足跡,由下往上依時間順序——最下面是學員還沒獲准前被拒絕的呼叫;中間是核准後第一次成功呼叫,附上追查代碼;再往上是參數不合規格的工具錯誤;最上面兩列是撤銷授權之後、同一位學員的呼叫再次被拒絕。
圖 15-2 正式網站的呼叫紀錄:整條驗收流程留下的足跡,由下往上依時間順序——最下面是學員還沒獲准前被拒絕的呼叫;中間是核准後第一次成功呼叫,附上追查代碼;再往上是參數不合規格的工具錯誤;最上面兩列是撤銷授權之後、同一位學員的呼叫再次被拒絕。

老師接著用兩個全新註冊的帳號(一位當提供者、一位當學員),依序跑完:新會員註冊→服務上架送審核准→映射成工具→使用申請核准(此時學員的 AI 助理程式在核准前連線,工具清單是空的)→AI 助理成功呼叫並附上追查代碼、參數錯誤得到工具錯誤→儀表板查詢確認統計數字正確→撤銷使用權後,同一位學員重新連線,工具清單立刻變成空的、呼叫立刻被拒絕。最後示範金鑰持久化的效果:以管理員身分登入並存下登入狀態,重新啟動網站——有設定金鑰持久化路徑時,舊的登入狀態仍然有效;沒有設定的話,同樣的舊登入狀態立刻失效,而且日誌完全沒有顯示任何警告,這正是最容易被忽略的一個坑。備份與還原演練也照著標準流程走了一遍:備份、驗證備份檔有效、還原成一個測試用的資料庫、比對筆數完全相同,演練完再把這份還原副本刪除。

自己動手的步驟

步驟一:套件版本鎖定與可重複執行的建置腳本

讓每個專案都產生一份「鎖定檔」,記錄每個套件的確切版本與雜湊值;部署時用「鎖定模式」還原套件,只要跟鎖定檔不完全一致就直接失敗,確保部署當天裝到的套件版本,跟開發測試時完全相同。資料庫的建置腳本要能對任何版本的資料庫重複執行——每一段變更都先確認「是否已經套用過」才動手,補齊缺少的部分。

步驟二:專用的資料庫帳號

建立一個只有「讀取」跟「寫入資料列」這兩種權限的帳號,刻意不給「修改資料表結構」的權限——這樣就算網站程式碼被攻破,攻擊者頂多能亂改資料,沒辦法刪掉資料表或改變資料結構;網站本身在啟動時也不會自動套用結構變更,結構變更永遠是系統管理員手動執行、可以事先審閱的動作。

步驟三:正式環境的程式設定

設定加解密金鑰的固定存放資料夾與固定的應用程式識別名稱(換部署路徑也要能用同一組金鑰);正式環境改用正式的憑證檔案來簽發跟驗證通行證(開發環境用的是隨機產生的臨時憑證);並且只在開發環境才允許不加密連線,正式環境一律強制要求加密。

步驟四:第一位管理員

寫一段只在「系統裡一位管理員都沒有」時才生效的初始化邏輯:已經有任何管理員存在,就直接跳過並提示「請移除這組環境變數」——這樣就算忘記移除,也不會重複建立、也不會有安全疑慮,密碼一樣要通過完整的密碼強度規則檢查,不會因為是初始化流程就放寬標準。

步驟五:成果驗收與交付

照著老師示範的六個步驟,在全新的正式資料庫上用全新帳號跑一遍。最後整理交付清單:原始碼、套件鎖定資訊、資料庫建置腳本、正式環境設定範例、安裝說明文件、操作手冊、服務與 MCP 文件、測試報告(累積前一章的測試結果加上本章的部署驗收紀錄)。

常見錯誤

症狀原因怎麼處理
可重複執行的建置腳本在全新資料庫上第一次執行就失敗某一段自訂的資料搬移邏輯,跟「新增欄位」寫在同一個批次裡,執行到一半時欄位其實還不存在把自訂邏輯包裝成「執行到那一刻才編譯」的形式,避開批次編譯時序的問題
設定檔案整份失效,出現離奇的載入錯誤設定檔裡的說明註解不小心包含了兩個連續的連字符號,這在某些設定檔格式裡是保留符號改寫註解內容,避開這個保留符號組合
重新啟動網站後所有人被登出,但日誌完全沒有任何錯誤沒有設定金鑰持久化的固定資料夾,重啟後金鑰跟上次不同設定固定的金鑰資料夾,並且把它跟資料庫一起備份

怎麼驗收+反向驗證

  1. 整條流程可以重現:在全新的正式資料庫上,用兩個新註冊的帳號依序完成六個步驟,每一步的畫面訊息都要跟預期一致。
  2. 真實的 AI 助理程式:驗收用的程式要真的走過完整的授權碼+雜湊驗證流程(透過加密連線)取得通行證再呼叫,不能只是模擬一般的網路請求。
  3. 撤銷後立刻被拒絕:撤銷使用權後,同一位學員重新連線,工具清單立刻是空的、呼叫立刻得到被撤銷的錯誤。
  4. 最低通過條件:一般會員進不了後臺;未核准的服務無法被執行;未獲得授權的會員無法呼叫;撤銷、停權、下架都能立即擋下新的呼叫;至少有一個真實的 AI 助理程式完成端到端的呼叫。
  5. 交付:安裝說明、操作手冊、API 與 MCP 文件、部署腳本與設定範例都要齊全,讓其他人可以照著文件重現整個部署過程。

十五章的旅程走到這裡:從第一章一個能建置的網頁骨架,到現在有審核、授權、Gateway、OAuth、額度管制、儀表板、自動化測試與部署文件的一整套 MCP Server 治理平台。回到課程地圖可以重新瀏覽任何一篇;也歡迎下載完整原始講義慢慢細讀每一段程式碼。

← 上一章 回課程地圖 下一章 →