一個資料站掉頁事故,建置檢查假綠燈了15.5小時
我們這天圍繞四個股市資料站討論優化方向,分成兩塊處理。即時股價與指數這條路走不通:讀過13個可能的公開資料來源的使用條款,幾乎全部明文禁止我們拿來用,唯一乾淨的官方來源是美國證管會的公開申報系統,但只有財報沒有股價,於是決定不建即時行情的管線。另一塊是站內導覽:做出一個依產業分類瀏覽個股的頁面,用「產業頁收錄了幾檔個股連結」取代原本依賴行情數字的排序方式,A 站與另外兩站都已上線,並順手救回其中一站一段先前被舊版部署悄悄蓋掉的改版版面。三站上線後逐一驗證頁面正常、網址集合沒有掉頁。
A 站一個網址悄悄消失,自己都沒發現
幫A 站擴充頁面時(新增244頁,讓網站地圖——也就是交給搜尋引擎的網址清單——從7819筆變成8063筆),順手查了一個舊缺陷:某支個股的頁面一直是404。追下去發現根因很意外:部署工具內建一份「不要上傳」的忽略清單,裡面沿襲了幾十年前版本控制系統的舊慣例,剛好排除了一個跟這檔股票代號同名的資料夾。頁面因此從一開始就沒真正上傳,但網站地圖、站內搜尋索引、產業分類頁,以及其他個股頁面的「相關個股」卡片全部照樣宣告這個頁面存在,站內因此有7個地方連過去都是死路。我們把頁面重新產生出來(18,576 bytes),調整了忽略清單的規則,兩個網域都驗證回應200且內容逐位元組相同。為了確認這不是單一事件,對全站群88個有在對外服務的網站做了同樣的掃描,結果只有這一次,且已經修好。修這個問題時也抓到自己寫的檢查工具裡一個邏輯錯誤:它一開始會把本機一個用來暫存登入憑證的檔案,誤判成同一類問題,還「建議」放寬規則讓它可以被上傳——等於叫我們把一份憑證放上網。這個錯誤在測試階段就被抓到並修正,沒有真的執行,也沒有任何憑證外流。
磁碟只剩3.9 GB
同一天,整台機器的磁碟空間降到只剩3.9 GB(總容量460 GB),已經逼近會讓工具整個當機的門檻。找出一批可以從備份重建、佔用最大的暫存工作檔案,確認唯一保留的備份完整無誤後,取得批准才刪除,騰出一些空間讓工作可以繼續。
搬遷盤點:登記清單只涵蓋六成上線的網站
這天也展開搬遷盤點的第一階段:打算把網站群逐步搬到Google雲端,並評估要不要把DNS(網域名稱系統,決定網址連到哪裡)也搬到Cloudflare。盤點發現落差不小:雲端平台上實際有413個專案在跑,但正式登記清單只涵蓋其中78個,大約六成;原本以為已經在用Cloudflare做防護,實測下來只有一個網站真的掛在上面;DNS 也完全靠人工在網域代管平台後台操作,沒有可以批次更新的管道,當下的結論是「搬遷出問題就整批切回」的安全網做不到。這個結論當天稍晚被自己推翻:xmy 問了一句「不能從其他程式庫分析出 DNS 怎麼管嗎」,回頭去搜舊的決策紀錄,才發現 7 月 23 日早就核准過一份分階段導入 Cloudflare 的決策,那個唯一掛著的網站是刻意選的第一站,不是漏掉;DNS 沒有自動化也是刻意的人工把關。我們查了三輪現況,卻從來沒查過自己過去的決定。盤點過程也抓到兩個正式網址其實在服務過期內容:其中一個網站有一個網域停在舊版本(19,205 bytes),另一個網站的兩個網域也停在舊版本(16,173 bytes),已經重新指向正確版本,分別驗證變成24,053 bytes與20,741 bytes,跟現行版本一致。當天最後決定網域暫時維持現狀不搬,但先把19個原本沒有版本控制的網站著手補進版本控制系統。
一個假綠燈掛了15.5小時
負責幫所有網站共用程式碼把關的自動化檢查系統這天出了一次事故。兩個各自獨立的修改,分別送出時都通過全部檢查,但合在一起之後,網站地圖裡多出一筆沒被檢查工具算進去的網址,理論上應該要讓檢查變紅燈。結果沒有:三個各自合理的機制疊在一起讓錯誤被完全蓋住——新的推送會自動取消還在跑的舊檢查、純文件修改的送出會直接跳過重新建置、系統又判定「這棵程式碼樹先前驗證過了」所以再省一次建置。錯誤狀態就這樣掛在主分支上顯示全部通過,長達15.5小時都沒被發現。修法是把兩個追蹤數字改成正確值,並且另外抓到一個真正的缺漏:當天稍早上線的活動頁面漏了「最後修改時間」這個必要欄位,不是數字對不對的問題,是欄位整個沒登記,一併修好。
自己的個人網站上線活動報名與會員系統
這個網站這天完成並正式上線一套活動報名與會員系統:訪客可以用email與密碼註冊、登入,報名活動的資料存進資料庫,線上講座的連結只有登入且已報名的人才看得到。上線後特別請一個沒有參與開發過程的驗證流程,實際跑一次註冊、登入、登出、再登入、確認未登入時會被擋下,以及既有頁面沒有跑掉,全部通過。
這天其他出錯的地方
- 嘗試建立一個新的雲端正式環境專案失敗,原因是這個帳號可以建立的雲端專案數量已經用完額度,需要另外申請提高上限。
- 網站群盤點時,原本以為找到幾個「完全沒登記」的獨立網站,查證後發現其實都是已登記網站的另一個網域名稱,不是新網站。
- 確認沒有任何Cloudflare的存取權限,網域代管平台也沒有可以批次操作的管道;不過當天稍晚查到舊決策後確認,分階段導入本來就是既定安排,不是缺件。