總覽上軌是設定與搬移(零業務風險,隨時插隊);下軌是三個重建型工地,嚴格排隊。階段 3 與 4 可對調——照圖走拿到的是「錢流去重」的最大價值優先。
現況流量(2026-08-17 實測)
歸屬與排序的決策依據。左表=各站 vhost log 日均(近 14–19 天,含 bot);右表=salary 內部模組(DB 統計 90/30 天,僅 .php 頁)。
⚠️ 判讀注意:line_chat 含 SSE 輪詢灌水;sales.kng.tw 與 call.kng.tw 的真流量走自己的 vhost(DB 統計沒接到);
Laravel 站路由被 .php 過濾摺疊——盲區修理已列入階段 0。紅線=歸屬判定時的重點對象(瀕死或收斂中)。
互動瀏覽:page_access_stats.php。
階段 0
清場
零風險搬移
本週可完成
- muxue 搬遷收尾:125 驗收 → 94 下線 lk/callhub/mu/analysis 的 vhost 與服務(8/17 使用者指示暫緩)
- 研究目錄移出 web root → /home/ying/lab/✓ 8/17 完成(13 目錄+9 散檔;dictation_client、ai-images 實查有正式引用故保留)
- crm 三步下架✓ 8/17 全部完成:①貼圖搬 salary+改 config → ②301 轉址 → ③目錄清除(使用者裁示免觀察期;tar 備份留 /var/backups,301 vhost 留存服務歷史貼圖網址)
- 證據管線開機:page_stats 修盲區✓ 8/17(erp 改讀 apache log、call/callhub/kn 接入、Laravel 路由模式、輪替時序 bug)+各站 log 輪替拉到 90 天✓ 8/17(ERP access log 原本完全沒輪替,已補);shadow 估奶排程停用✓ 已完成
- 快贏三項✓ 8/17 完成:flux 完全除役(predict/data-alert 移植 salary tools/ 後目錄移除,備份 /var/backups)、:6048 誤殺後恢復(Livewire 薪資每月算薪仍在用——月頻應用看週流量必誤判)、報表站登入收斂成 session-auth 一套
清場全是「搬移」:沒有一行業務邏輯被改動,做完 web root 只剩正式業務。
完成條件web root 只剩正式業務;流量證據開始累積 · 檢核 →
階段 1
權限與地基
設定級
- 四個寄生網域拆出獨立目錄:cf/call/ny26/sales.kng.tw(+cpt proxy 理清)
- 寫入權矩陣:每張核心表標唯一 writer、允許讀者、同步方向;據此拆掉 11 站共用的 david 帳號,各站換專屬最小權限帳號
- 服務目錄 services.json+CI 護欄(守門回歸、禁跨域寫表)
- kng/notify 套件(寄信 6 份→1、簡訊 3→1、push 2→1)+design token 獨立發版
一把萬能鑰匙換成一站一把——矩陣先畫(誰讀誰寫哪張表),帳號照矩陣發,CI 照矩陣攔。
完成條件每站專屬 DB 帳號與矩陣一致;矩陣成文進版控 · 檢核 →
▼ 以下三個重建型工地,嚴格一次一個 ▼
階段 2
ERP 新殼起步
重建型 #1
- 新專案 scaffold:erp.kng.tw
/next/* 路徑分流、專屬 DB 帳號(只授權新世代表)、票據式登入(不共用 APP_KEY)、分 FPM pool/cache/queue、CI 舊表攔檢
- AI 地基 day-one:測試安全網、CLAUDE.md 慣例、服務目錄掛載
- 搬 ERP-一「基礎資料」:customers、weekly_orders CRUD、地址簿、奶區 marea、員工 hum、定價——零依賴純 CRUD
- 命令 API 建在新殼(按領域契約:idempotency key、狀態機、審計),供階段 3 的對外站切入
- 舊 ERP 同步凍結:只修 bug,新功能一律進新殼
- 營運金絲雀測試組建立:下單、估奶、路條、異動、帳務彙總,用去識別資料集比對,金額/瓶數是硬門檻
同一個網址、兩個互相隔離的 app;新殼碰不到舊表——邊界鎖在 DB 帳號,不是靠自律。
完成條件第一批頁面在新殼上線;金絲雀全綠 · 檢核 →
階段 3
對外站 strangler
重建型 #2
價值最高 · 也最危險
- 新建對外站 kngoatmilk.com,逐一搬:forms → ny26 活動頁 → shop → 最後才碰 www 的 5.8 萬行 API
- 每搬一塊,寫入改走新殼命令 API;新舊雙寫+每日自動對帳告警——沒建好告警不准切流量
- 跑過兩個完整月結、對帳連續綠燈才切換;之後 shop 資料庫併入 goalu(先程式後資料)
- 綠燈後退役外圍站的訂單舊邏輯
一次吞一站、順序照風險排;④ 的 www 隱藏 API 實測 5.8 萬行,永遠最後碰。
完成條件訂單/會員資料的唯一寫入者=ERP 新殼 · 檢核 →
階段 4
估奶與配送搬遷+雙寫收斂
重建型(續)
- ERP-二「估奶管線」(DailyPre+DailyPostingService)搬入新殼:雙算單寫——舊程式維持正式寫入、新程式算進 staging 逐筆比對,達標才停舊排程、記 cutover epoch
- ERP-三「配送執行」(DvDvm 日計、DvReport 路條)跟進,多為唯讀消費端
- 雙寫收斂:舊表讀者地圖(salary/kn 誰還在讀 hcust_dorder、hcust_dv…)→ 讀者逐個搬到新表 → 清空就停對應 SyncOld
- dorder 真死區 10–15 檔進隔離區(410+觸擊 log,跨一次月結)——維護級,可提早並行
上半是估奶搬遷的安全機制(兩套 writer 永不同時寫正式表);下半是雙寫收斂的原理(先搬讀者、再關水龍頭)。
完成條件估奶由新殼唯一產出;至少停掉一組 SyncOld · 檢核 →
階段 5
對內站與行動入口
重建型 #3
- salary.kng.tw 立共用入口+SSO;電訪名單、報表 93 支、FLUX 十頁 BI、庫存、invoice 行政表單逐模組遷入——模組硬邊界,禁互讀 model,BI 走唯讀帳號
- 人資模組:兩套薪資(Livewire 版+html/salary 舊版)同月比對後合一,吸收 invoice /leave;硬隔離配套一項不可少——8/17 裁示:Livewire 薪資(:6048,每月算薪使用中)為人資第一個整合標的
- 行動入口 m.kng.tw(外勤手機主入口,8/17 裁示):erp-next 行動區+PWA;業務員區逐頁吸收 sales.kng.tw、配送員區先吸 delivery 日誌、再逐步搬 kn 的軌跡/積分/獎金——目標取代 kn,過渡期 kn 照跑
- LINE 站收尾(條件觸發):www/api/linebot 殘留確認被涵蓋、通知走 kng/notify 就關舊路徑
模組間禁互讀 model——邊界用 route group+service 層守住,不然只是把總務室換個門牌。
內外勤分流:同一個 erp-next 部署,桌面與手機各一個門;行動區吸乾三個來源後,外勤只剩一個入口。
完成條件對外網址收斂到終態:對外站、ERP、對內站、行動入口 m、LINE+PBX;kn 與 delivery 功能清空後退役 · 檢核 →
尾聲
業務異動核+大清理
最後單獨動
- TradeService+DailyRenew(trades 三方寫入、人工調整 vs 重估覆蓋的帳務心臟)——前面全部跑穩後才搬,單獨一個工地
- 舊 ERP 責任清空後,死碼按五關判準分批刪(HTTP 流量、任務表、CBM 引用、資料證據、業務確認)
- 終態驗收:每個切片都過完成定義——舊入口關、舊 writer 停、同步縮、可刪除
衡量整條路線成敗的就是這張圖:舊 ERP 有沒有真的一路變小。只長新殼、不縮舊殼=第二套 ERP。
完成條件strangler 不是第二套 ERP:舊 ERP 縮到可以整包退役 · 檢核 →
全程三條紀律
單一重建原則——重建型工地全域同時最多一個;開新工地前先問「上一個收工了嗎」。維護軌(隔離死區、搬讀者、快贏)不受限,隨時小步。
月結是驗收單位——動到訂單路徑或 ERP 的變更,以「跑過完整月結」為驗收,不以「測試綠了」為驗收。
每步可停——每個階段獨立收工,停在任何一步都比現在好;唯一的單向門是切流量,所以切流量的單位要小、要有對帳告警。