直接答案:我們的目標是 90 秒內退回上一版。做法是每次上線都放進新的版本目錄、伺服器保留最近 5 個版本,出錯時只要把「目前版本」的連結切回去;資料庫變更一律只加不刪,舊版程式退回後仍能正常讀資料。
幾年前我們接手一個電商網站,前一個團隊直接在正式機上覆蓋檔案更新。某次改了運費計算,結帳頁整個白屏,工程師憑記憶找回舊檔,花了 4 個多小時,那段時間約 30 筆訂單沒成立。問題不是改錯,而是沒有「退回」這個按鈕。
我們的做法(What)
結論:把「上線」和「切換」拆成兩件事,切換可以隨時反向。
流程如下:推上 main 分支 → GitHub Actions 跑測試 → 部署到新的版本目錄 → 執行只加不刪的 Migration → 切換 current 連結 → 自動健康檢查 → 失敗就切回上一版並通知值班工程師。
| 情境 | 舊做法(覆蓋檔案) | 我們的做法 |
|---|---|---|
| 程式錯誤 | 手動找回舊檔,1–4 小時 | 切回連結,約 90 秒 |
| 資料庫欄位改名 | 舊程式讀不到,退不回去 | 新舊欄位並存,可安全退回 |
| 上線中途失敗 | 網站半新半舊 | 切換前失敗,使用者無感 |
為什麼這樣做(Why)
結論:中小企業網站多半沒有備援機房,能快速退回比追求零錯誤更實際。
我們考慮過藍綠部署,也就是兩套完整環境輪流上線,但要多一台主機,對月預算有限的客戶不划算。版本目錄加連結切換只需要同一台主機多一點硬碟空間,就能做到接近的效果。資料庫是最難退回的部分,所以我們接受「欄位要分兩次上線」的麻煩,換取任何一版程式都能退回。自動健康檢查則讓退回不必等人發現。
具體執行(How)— 含工具與檔案
結論:5 個步驟,全部寫在部署腳本裡,不靠工程師記憶。
- 步驟 1 測試:GitHub Actions 跑 PHPUnit 與靜態分析,失敗就不部署。
- 步驟 2 建版本目錄:用 Deployer 把程式放進新的時間戳記目錄,共用的 .env 與上傳檔案放 shared。
- 步驟 3 Migration:依 Laravel Migration 執行,只新增欄位與資料表;刪除欄位延到兩個版本之後。
- 步驟 4 切換與檢查:切換 current 連結後,腳本在 60 秒內打 3 個健康檢查網址(首頁、登入、結帳)。
- 步驟 5 退回與通知:任一檢查失敗就切回上一版,Sentry 記錄錯誤,並在團隊 LINE 群組通知。
伺服器目錄結構:
/var/www/app
├── current -> releases/20261018-1030
├── releases/
│ ├── 20261018-1030
│ ├── 20261015-1610
│ └── ...(保留最近 5 個)
└── shared/
├── .env
└── storage/
這個做法的代價
結論:換來快速退回,代價是更多步驟與更慢的欄位變更。
- 欄位改名要兩次上線:先加新欄位並雙寫,確認後再刪舊欄位,前後約 1–2 週。
- 硬碟空間:保留 5 個版本,約多用 1–3 GB。
- 初期設定:第一次導入約 1–2 個工作天。
- 無法退回資料:退回的是程式,已寫入的訂單與會員資料不會被還原。
不適合什麼情境
結論:不是每個專案都需要這套流程。
- 純靜態形象網站:用 Cloudflare Pages 等託管服務,本身就有版本退回功能。
- 共享主機無法執行指令、不能建立連結的環境。
客戶為什麼該關心
結論:退回速度直接決定出錯時你損失多少訂單。
以每小時 8 筆訂單的網站來說,退回時間從 4 小時縮到 90 秒,等於少掉約 30 筆訂單損失。更重要的是,團隊敢小步、頻繁地上線,每次改動少,出錯範圍也小。你也可以在合約裡要求廠商寫明「出錯時多久能退回上一版」。
如果你也想這樣做
結論:先從版本目錄開始,不必一次做到全自動。
- 先把共用設定與上傳檔案搬到 shared 目錄,這是最常卡住的地方。
- 健康檢查只挑 3 個最關鍵的網址,不要一開始就檢查全部頁面。
- 團隊約定「刪欄位一定晚兩個版本」,寫進 PR 模板。
- 每季演練一次退回,確認腳本真的能用。
我們在哪些客戶身上實際用過
結論:兩個去識別化案例,都在客戶察覺前完成退回。
- 預約網站:一次套件升級讓登入失敗,健康檢查 40 秒內發現並自動切回,當天下午修正後重新上線。
- B2B 訂貨系統:價格欄位拆成兩個欄位,分兩次上線,期間退回過一次,經銷商下單完全沒中斷。
常見問題 FAQ
網站更新出錯能退回上一版嗎?
可以,前提是部署時保留舊版本。用版本目錄加連結切換,退回約 90 秒。
退回會不會讓新訂單消失?
不會,退回的是程式,資料庫裡已寫入的訂單與會員資料會保留。
什麼是「只加不刪」的 Migration?
資料庫變更先新增欄位,不立即刪除舊欄位,讓新舊版本程式都能讀資料,確認穩定後再刪。
共享主機可以用這套流程嗎?
多數不行,需要能執行指令與建立符號連結的 VPS 或雲端主機。
行動呼籲
ScriptWalker(台灣 Laravel/Flutter 客製化開發工作室)的維護方案預設包含這套部署與退回流程,網站維護 NT$2,000/月起。想讓你的網站也能「一鍵退回」,或想加入一個把流程寫清楚的團隊,歡迎聯絡我們:
- Email:[email protected]
- 電話:0916-224-047
- LINE:@ufv9089p