<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Delivery-Mode-Selection on Tarragon</title><link>https://tarrragon.github.io/blog/tags/delivery-mode-selection/</link><description>Recent content in Delivery-Mode-Selection on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Thu, 11 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/delivery-mode-selection/index.xml" rel="self" type="application/rss+xml"/><item><title>0.21 交付形態選型：從全託管到自建的光譜與邊界</title><link>https://tarrragon.github.io/blog/backend/00-service-selection/delivery-mode-selection/</link><pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/00-service-selection/delivery-mode-selection/</guid><description>&lt;p>交付形態選型的核心原則是先判斷「這個服務值得自建嗎」、再進入自建世界的服務選型。提供線上服務的途徑是一個光譜：全託管平台（Wix、Shopify、Google Sites）、辦公生態自動化（Google Apps Script）、BaaS（Firebase、Supabase）、半託管 CMS（WordPress）、到自建程式 — 本模組其餘章節討論的資料庫、快取、queue、部署選型、全部屬於光譜最右端的自建世界。落在光譜其他位置的服務、那些章節的問題暫時與它無關；判斷自己落在哪、以及什麼訊號出現時該往右移、是比「選哪個資料庫」更早的決策。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本章後、讀者能夠：&lt;/p>
&lt;ol>
&lt;li>用差異化位置與業務量判斷服務該落在交付形態光譜的哪一段&lt;/li>
&lt;li>看懂全託管平台、辦公生態自動化、BaaS、半託管 CMS 與自建各自的能力邊界與遷出代價&lt;/li>
&lt;li>在選擇託管形態的同時、保留日後遷往自建的可遷出路徑&lt;/li>
&lt;li>把「該升級自建了」的判斷從感覺轉成可觀察的 tripwire&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="觀察自建的合理性來自差異化位置">【觀察】自建的合理性來自差異化位置&lt;/h2>
&lt;p>自建的合理性來自一個前提：&lt;strong>這個產品的差異化在軟體本身&lt;/strong>。差異化在商品、內容、社群或服務品質的生意、軟體只是通路 — 通路用現成的、把工程資源留給差異化所在的位置、是成本上更誠實的選擇。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>可觀察訊號&lt;/th>
 &lt;th>指向&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>需求能用「型錄 + 結帳」「表單 + 通知」「文章 + 頁面」描述完&lt;/td>
 &lt;td>託管平台的標準域、先不自建&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>流程是把幾個現成服務串起來（表單進試算表、定時寄報表）&lt;/td>
 &lt;td>辦公生態自動化（Apps Script 類）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>產品是行動 app 或 SPA、後端需求是認證 + 資料同步 + 推播&lt;/td>
 &lt;td>BaaS（Firebase 類）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>內容為主、但要客製版型、SEO、外掛功能&lt;/td>
 &lt;td>半託管 CMS（WordPress 類）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>業務流程落在某個垂直行業 SaaS 的標準域（預約、課表、POS、訂位）&lt;/td>
 &lt;td>垂直 SaaS — 行業專用的託管形態、先進候選&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>產品本身就是軟體（SaaS 工具、API 服務、平台）&lt;/td>
 &lt;td>自建 — 本模組其餘章節的世界&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>核心流程在任何現成平台都要大量 workaround 才能表達&lt;/td>
 &lt;td>自建、或重新檢視流程是否過度客製&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>服務只有自己 / 家人用、跑在自有主機或私有網路、無對外使用者&lt;/td>
 &lt;td>個人自架工具 — 自建但走極縮減流程&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>第一列的判讀方式值得展開：把產品的核心流程用一句話描述、再問「這句話是不是某個託管平台的官方首頁文案」。「賣手作飾品、信用卡結帳、出貨通知」就是 Shopify 的首頁；「活動報名、自動寄確認信、報名滿額關閉」就是表單工具加自動化的範圍。描述不出落在任何平台標準域的流程 — 例如「客戶上傳檔案後跑客製演算法、依結果動態計價」— 才是自建訊號。&lt;/p>
&lt;p>「產品本身就是軟體」這一列要先過一個澄清：&lt;strong>這個軟體是要賣的產品、還是經營業務的工具&lt;/strong>。「給健身教練用的課表系統」有兩種身分 — 開發者要賣給眾多教練的產品（市場上的垂直 SaaS 是競爭對手、交付形態走自建）、或教練管理自己學員的工具（同一批垂直 SaaS — 課表、預約、POS — 正是該優先評估的託管形態）。同一句需求描述、兩種身分的結論相反、先拆身分再進訊號表。&lt;/p>
&lt;h2 id="判讀交付形態光譜">【判讀】交付形態光譜&lt;/h2>
&lt;p>光譜從左到右、控制力遞增、維運責任同步遞增。每一段先看它解什麼、再看邊界訊號與遷出代價。&lt;/p>
&lt;h3 id="全託管平台wixshopifysquarespacegoogle-sites">全託管平台：Wix、Shopify、Squarespace、Google Sites&lt;/h3>
&lt;p>平台承擔整條技術棧：主機、憑證、防護、金流、版面。使用者操作的對象是「網站內容」、不是「程式碼」。電商走 Shopify、形象站與簡介站走 Wix / Google Sites、訂閱內容走 Substack 類 — 各平台的標準域內、上線時間以天計、且本系列 &lt;a href="https://tarrragon.github.io/blog/backend/00-service-selection/security-data-protection-requirements/" data-link-title="0.8 資安與資料保護需求" data-link-desc="從權限分級、伺服器防護、資料遮罩、傳輸保護與稽核設計安全邊界">0.8 資安與資料保護需求&lt;/a> 裡多數伺服器側的功課由平台承擔。&lt;/p>
&lt;p>邊界訊號：客製需求開始對抗平台 — 結帳流程要插入平台不支援的步驟、資料要跟外部系統雙向同步、頁面效能撞到平台的模板天花板。在平台內 workaround 的程式碼（Shopify 的 liquid hack、Wix 的 Velo 腳本）累積越多、等於在用最差的開發環境自建。&lt;/p>
&lt;p>遷出代價：資料匯出通常有官方管道（商品、訂單 CSV）、但 URL 結構、SEO 累積、會員密碼（雜湊不可攜、遷移等於全體重設密碼）、訂閱金流的扣款授權（綁在平台的金流帳戶上）都要重建。&lt;/p>
&lt;h3 id="辦公生態自動化google-apps-script--sites--forms--sheets">辦公生態自動化：Google Apps Script + Sites / Forms / Sheets&lt;/h3>
&lt;p>這一段解的是「流程自動化」、不是「產品」。表單收件進試算表、定時整理寄報表、收到 email 觸發動作 — Apps Script 把 Google Workspace 的元件串成工作流、零主機、零部署、權限直接掛在 Google 帳號上。同段位的還有 no-code 資料庫工具（Airtable、Notion 當輕後台）— 串現成元件、零部署的角色相同。內部工具與小規模對外流程（報名、登記、排班）在這一段的成本接近零。&lt;/p>
&lt;p>邊界訊號：第一個出現的通常是配額牆 — 某天報名表單停止收件、log 裡躺著超額錯誤、而且已經靜默丟了一個下午的提交。再來是併發：兩個人同時送出、Sheets 用最後寫入蓋掉前一筆。最後是工程紀律的渴望、腳本長到想要版本控制與測試時、它已經是一個沒有工程基礎設施的程式專案。&lt;/p>
&lt;p>遷出代價：低 — 資料在 Sheets / Drive 裡天然可匯出、流程邏輯通常短到可以重寫。這一段的風險是「忘記遷」、不是「遷不動」：業務量上來後配額錯誤靜默發生、報名表單少收一批人才發現。&lt;/p>
&lt;h3 id="baasfirebasesupabase">BaaS：Firebase、Supabase&lt;/h3>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/baas/" data-link-title="BaaS（Backend as a Service）" data-link-desc="說明把認證、資料庫、檔案儲存、推播打包成現成模組、由前端 SDK 直連的後端交付形態">BaaS&lt;/a> 把後端拆成現成模組：認證、資料庫、檔案儲存、推播、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/serverless/" data-link-title="Serverless" data-link-desc="說明按請求 / 按用量計費、由平台管理執行環境與擴縮的運算交付模型、與其冷啟動與計價邊界">serverless&lt;/a> function。前端（app / SPA）自己寫、後端用平台的 SDK 直連 — 本系列 &lt;a href="https://tarrragon.github.io/blog/backend/00-service-selection/state-storage-selection/" data-link-title="0.2 狀態與資料儲存選型" data-link-desc="區分 source of truth、快取、搜尋索引、event log 與 object storage 的選型邊界">0.2 狀態與資料儲存選型&lt;/a> 討論的多數問題、在這一段被平台的預設答案取代。行動 app MVP 與快速驗證期的產品、BaaS 把「後端工程師」這個角色延後了。&lt;/p>
&lt;p>BaaS 的邊界牆通常分三面依序出現。第一面是報表 — 老闆要一張跨集合的月報、Firestore 查不出來、工程師開始把資料複製第二份、複製管線本身變成要維護的系統。第二面是帳單：讀寫計費隨流量線性成長、某個月的發票讓人重新打開計算機比對自建。第三面最安靜：client 直連資料庫的模型把授權邏輯全部塞進 security rules、規則檔長到沒人敢改時、&lt;a href="https://tarrragon.github.io/blog/backend/00-service-selection/security-data-protection-requirements/" data-link-title="0.8 資安與資料保護需求" data-link-desc="從權限分級、伺服器防護、資料遮罩、傳輸保護與稽核設計安全邊界">0.8&lt;/a> 的整個控制面已經壓在一個難以測試的規則語言（DSL）裡。&lt;/p></description><content:encoded><![CDATA[<p>交付形態選型的核心原則是先判斷「這個服務值得自建嗎」、再進入自建世界的服務選型。提供線上服務的途徑是一個光譜：全託管平台（Wix、Shopify、Google Sites）、辦公生態自動化（Google Apps Script）、BaaS（Firebase、Supabase）、半託管 CMS（WordPress）、到自建程式 — 本模組其餘章節討論的資料庫、快取、queue、部署選型、全部屬於光譜最右端的自建世界。落在光譜其他位置的服務、那些章節的問題暫時與它無關；判斷自己落在哪、以及什麼訊號出現時該往右移、是比「選哪個資料庫」更早的決策。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本章後、讀者能夠：</p>
<ol>
<li>用差異化位置與業務量判斷服務該落在交付形態光譜的哪一段</li>
<li>看懂全託管平台、辦公生態自動化、BaaS、半託管 CMS 與自建各自的能力邊界與遷出代價</li>
<li>在選擇託管形態的同時、保留日後遷往自建的可遷出路徑</li>
<li>把「該升級自建了」的判斷從感覺轉成可觀察的 tripwire</li>
</ol>
<hr>
<h2 id="觀察自建的合理性來自差異化位置">【觀察】自建的合理性來自差異化位置</h2>
<p>自建的合理性來自一個前提：<strong>這個產品的差異化在軟體本身</strong>。差異化在商品、內容、社群或服務品質的生意、軟體只是通路 — 通路用現成的、把工程資源留給差異化所在的位置、是成本上更誠實的選擇。</p>
<table>
  <thead>
      <tr>
          <th>可觀察訊號</th>
          <th>指向</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>需求能用「型錄 + 結帳」「表單 + 通知」「文章 + 頁面」描述完</td>
          <td>託管平台的標準域、先不自建</td>
      </tr>
      <tr>
          <td>流程是把幾個現成服務串起來（表單進試算表、定時寄報表）</td>
          <td>辦公生態自動化（Apps Script 類）</td>
      </tr>
      <tr>
          <td>產品是行動 app 或 SPA、後端需求是認證 + 資料同步 + 推播</td>
          <td>BaaS（Firebase 類）</td>
      </tr>
      <tr>
          <td>內容為主、但要客製版型、SEO、外掛功能</td>
          <td>半託管 CMS（WordPress 類）</td>
      </tr>
      <tr>
          <td>業務流程落在某個垂直行業 SaaS 的標準域（預約、課表、POS、訂位）</td>
          <td>垂直 SaaS — 行業專用的託管形態、先進候選</td>
      </tr>
      <tr>
          <td>產品本身就是軟體（SaaS 工具、API 服務、平台）</td>
          <td>自建 — 本模組其餘章節的世界</td>
      </tr>
      <tr>
          <td>核心流程在任何現成平台都要大量 workaround 才能表達</td>
          <td>自建、或重新檢視流程是否過度客製</td>
      </tr>
      <tr>
          <td>服務只有自己 / 家人用、跑在自有主機或私有網路、無對外使用者</td>
          <td>個人自架工具 — 自建但走極縮減流程</td>
      </tr>
  </tbody>
</table>
<p>第一列的判讀方式值得展開：把產品的核心流程用一句話描述、再問「這句話是不是某個託管平台的官方首頁文案」。「賣手作飾品、信用卡結帳、出貨通知」就是 Shopify 的首頁；「活動報名、自動寄確認信、報名滿額關閉」就是表單工具加自動化的範圍。描述不出落在任何平台標準域的流程 — 例如「客戶上傳檔案後跑客製演算法、依結果動態計價」— 才是自建訊號。</p>
<p>「產品本身就是軟體」這一列要先過一個澄清：<strong>這個軟體是要賣的產品、還是經營業務的工具</strong>。「給健身教練用的課表系統」有兩種身分 — 開發者要賣給眾多教練的產品（市場上的垂直 SaaS 是競爭對手、交付形態走自建）、或教練管理自己學員的工具（同一批垂直 SaaS — 課表、預約、POS — 正是該優先評估的託管形態）。同一句需求描述、兩種身分的結論相反、先拆身分再進訊號表。</p>
<h2 id="判讀交付形態光譜">【判讀】交付形態光譜</h2>
<p>光譜從左到右、控制力遞增、維運責任同步遞增。每一段先看它解什麼、再看邊界訊號與遷出代價。</p>
<h3 id="全託管平台wixshopifysquarespacegoogle-sites">全託管平台：Wix、Shopify、Squarespace、Google Sites</h3>
<p>平台承擔整條技術棧：主機、憑證、防護、金流、版面。使用者操作的對象是「網站內容」、不是「程式碼」。電商走 Shopify、形象站與簡介站走 Wix / Google Sites、訂閱內容走 Substack 類 — 各平台的標準域內、上線時間以天計、且本系列 <a href="/blog/backend/00-service-selection/security-data-protection-requirements/" data-link-title="0.8 資安與資料保護需求" data-link-desc="從權限分級、伺服器防護、資料遮罩、傳輸保護與稽核設計安全邊界">0.8 資安與資料保護需求</a> 裡多數伺服器側的功課由平台承擔。</p>
<p>邊界訊號：客製需求開始對抗平台 — 結帳流程要插入平台不支援的步驟、資料要跟外部系統雙向同步、頁面效能撞到平台的模板天花板。在平台內 workaround 的程式碼（Shopify 的 liquid hack、Wix 的 Velo 腳本）累積越多、等於在用最差的開發環境自建。</p>
<p>遷出代價：資料匯出通常有官方管道（商品、訂單 CSV）、但 URL 結構、SEO 累積、會員密碼（雜湊不可攜、遷移等於全體重設密碼）、訂閱金流的扣款授權（綁在平台的金流帳戶上）都要重建。</p>
<h3 id="辦公生態自動化google-apps-script--sites--forms--sheets">辦公生態自動化：Google Apps Script + Sites / Forms / Sheets</h3>
<p>這一段解的是「流程自動化」、不是「產品」。表單收件進試算表、定時整理寄報表、收到 email 觸發動作 — Apps Script 把 Google Workspace 的元件串成工作流、零主機、零部署、權限直接掛在 Google 帳號上。同段位的還有 no-code 資料庫工具（Airtable、Notion 當輕後台）— 串現成元件、零部署的角色相同。內部工具與小規模對外流程（報名、登記、排班）在這一段的成本接近零。</p>
<p>邊界訊號：第一個出現的通常是配額牆 — 某天報名表單停止收件、log 裡躺著超額錯誤、而且已經靜默丟了一個下午的提交。再來是併發：兩個人同時送出、Sheets 用最後寫入蓋掉前一筆。最後是工程紀律的渴望、腳本長到想要版本控制與測試時、它已經是一個沒有工程基礎設施的程式專案。</p>
<p>遷出代價：低 — 資料在 Sheets / Drive 裡天然可匯出、流程邏輯通常短到可以重寫。這一段的風險是「忘記遷」、不是「遷不動」：業務量上來後配額錯誤靜默發生、報名表單少收一批人才發現。</p>
<h3 id="baasfirebasesupabase">BaaS：Firebase、Supabase</h3>
<p><a href="/blog/backend/knowledge-cards/baas/" data-link-title="BaaS（Backend as a Service）" data-link-desc="說明把認證、資料庫、檔案儲存、推播打包成現成模組、由前端 SDK 直連的後端交付形態">BaaS</a> 把後端拆成現成模組：認證、資料庫、檔案儲存、推播、<a href="/blog/backend/knowledge-cards/serverless/" data-link-title="Serverless" data-link-desc="說明按請求 / 按用量計費、由平台管理執行環境與擴縮的運算交付模型、與其冷啟動與計價邊界">serverless</a> function。前端（app / SPA）自己寫、後端用平台的 SDK 直連 — 本系列 <a href="/blog/backend/00-service-selection/state-storage-selection/" data-link-title="0.2 狀態與資料儲存選型" data-link-desc="區分 source of truth、快取、搜尋索引、event log 與 object storage 的選型邊界">0.2 狀態與資料儲存選型</a> 討論的多數問題、在這一段被平台的預設答案取代。行動 app MVP 與快速驗證期的產品、BaaS 把「後端工程師」這個角色延後了。</p>
<p>BaaS 的邊界牆通常分三面依序出現。第一面是報表 — 老闆要一張跨集合的月報、Firestore 查不出來、工程師開始把資料複製第二份、複製管線本身變成要維護的系統。第二面是帳單：讀寫計費隨流量線性成長、某個月的發票讓人重新打開計算機比對自建。第三面最安靜：client 直連資料庫的模型把授權邏輯全部塞進 security rules、規則檔長到沒人敢改時、<a href="/blog/backend/00-service-selection/security-data-protection-requirements/" data-link-title="0.8 資安與資料保護需求" data-link-desc="從權限分級、伺服器防護、資料遮罩、傳輸保護與稽核設計安全邊界">0.8</a> 的整個控制面已經壓在一個難以測試的規則語言（DSL）裡。</p>
<p>遷出的代價集中在資料層：資料本身可匯出、但資料模型沿平台特性設計（為遷就查詢限制、同一份資料複製存放多處的反正規化結構、加上平台專屬的即時同步語意）、遷到關聯式資料庫等於重做資料層。認證體系可攜性視平台而定（Firebase Auth 可匯出密碼雜湊、是少數友善案例）。</p>
<h3 id="半託管-cmswordpress-與同類">半託管 CMS：WordPress 與同類</h3>
<p>WordPress 代表「半手動自定義」這一段：核心由開源專案提供、功能靠外掛拼裝、版型可以改到面目全非、主機可以託管也可以自架。內容為主、客製需求中等的站（媒體、部落格、預約、小型電商加 WooCommerce）長期住在這一段。控制力比全託管平台高一級：資料庫是自己的 MySQL、檔案是自己的目錄、想改什麼理論上都改得動。</p>
<p>邊界訊號：每次外掛更新前先全站備份、更新完手動點一輪主要頁面 — 這個儀式固定下來時、外掛堆疊已經超出任何人的全盤理解。效能問題跟著來：頁面變慢、但慢在哪一層查詢沒人說得清。資安面則是時間問題：WordPress 外掛漏洞是攻擊者的固定狩獵場、patch 責任在自己身上、沒人 patch 的站是 <a href="/blog/backend/00-service-selection/red-team-cross-service-weaknesses/" data-link-title="0.11 攻擊者視角（紅隊）：跨服務弱點判讀總表" data-link-desc="用攻擊面、可觀察訊號與失敗代價，建立 backend 選型前的弱點盤點框架">0.11 攻擊者視角</a> 裡最便宜的目標。</p>
<p>遷出代價：真正遷不動的是外掛私有表裡的業務邏輯 — 會員等級、預約規則、客製欄位散在各外掛自己的資料表、遷移時要逐個考古；內容本身（文章、媒體）反而是最成熟的匯出路徑。</p>
<h3 id="垂直-saas行業專用的託管形態">垂直 SaaS：行業專用的託管形態</h3>
<p>垂直 SaaS（預約系統、課表排班、POS、訂位平台）是全託管平台的行業特化分支。平台已經把該行業的標準流程做成產品、使用者設定開通而非寫程式碼。業務流程落在平台標準域內時、效率跟全託管平台相同；差異在於當需求偏離行業標準域（例如預約系統要加客製的動態定價邏輯）、平台的 API 與 webhook 是延伸天花板 — 超出就是自建訊號。遷出代價集中在客戶資料與業務規則的可攜性：客戶名單、歷史交易紀錄的匯出格式、以及在平台 UI 裡長出來的行業特定規則（排班邏輯、會員等級、優惠券組合）能否帶走。</p>
<h3 id="個人自架工具常駐本機無對外服務">個人自架工具：常駐本機、無對外服務</h3>
<p>這一段跟前面所有形態的本質差異在於：沒有對外使用者。遠端操控自己的主機、家庭自動化、個人備份同步這類工具、使用者就是所有者（單人或家人）。它在光譜上是自建的一個特例 — 自建成立、但本模組其餘章節的多數問題（租戶、使用者資料庫、對外服務）不適用。常駐在自有主機（launchd / systemd）或私有網路上、本模組裡真正展開的只剩三條：入口怎麼安全進來（部署平台）、誰能存取（資安）、密鑰怎麼保管（secret）;資料庫、快取、queue、多租戶隔離多半 N/A。</p>
<p>認證也離開 web-auth 光譜。沒有帳號系統、沒有 SSO、主體就是持有裝置的所有者：一層裝置原生生物辨識（Face ID / 指紋）認「人」、一層 app 與主機共享的密鑰認「連線」。入口形態常是 outbound tunnel（cloudflared / Tailscale）而非公網 IP — 本機主動外連、路由器零開 port。詳見 <a href="/blog/backend/07-security-data-protection/identity-access-boundary/" data-link-title="7.2 身分與授權邊界" data-link-desc="以問題驅動方式整理身分、授權、會話與供應商身分鏈">7.2 身分與授權邊界</a> 的單人裝置認證段與 <a href="/blog/backend/05-deployment-platform/outbound-tunnel-entry/" data-link-title="5.10 Outbound Tunnel 入口與生命週期" data-link-desc="整理 cloudflared / Tailscale 等反向隧道的入口形態、生命週期合約與故障模式">5.10 Outbound Tunnel 入口</a>。</p>
<p>這個模型的邊界在使用者數。使用者從「自己」變成「自己 + 幾個朋友」時、第一個多出來的使用者就打破整個模型 — 共享密鑰無法分辨是誰、生物辨識綁在單一裝置、沒有帳號就無法個別撤銷。這時回到完整自建訪談、把認證升級成帳號系統。</p>
<p>遷出方向也跟其他形態相反 — 方向是「長成服務」、離開平台只是副產物。工具沒有累積對外使用者資料、遷移成本低;真正要重做的是認證與授權層（從單人共享密鑰換成多使用者帳號系統）、以及入口（從個人 tunnel 換成能承載多人的公開入口）。</p>
<h3 id="自建本模組其餘章節的世界">自建：本模組其餘章節的世界</h3>
<p>差異化在軟體本身、或所有託管形態的邊界都已撞到、就進入自建。自建的真正成本由本模組其餘章節展開：<a href="/blog/backend/00-service-selection/backend-demand-taxonomy/" data-link-title="0.0 後端需求分類地圖" data-link-desc="先從需求形狀辨識狀態、讀取、非同步、即時、診斷、交付與可靠性問題">0.0 需求分類</a> 開始、<a href="/blog/backend/00-service-selection/cost-risk-tradeoffs/" data-link-title="0.6 成本、風險與選型取捨" data-link-desc="用人力成本、雲端成本、操作成本與失敗代價判斷後端能力投入順序">0.6 成本、風險與選型取捨</a> 把人力與維運成本攤開。自建換到的是：資料模型自己定、流程任意客製、成本曲線在規模化後由自己控制、以及所有控制面（資安、觀測、備援）可以做到合規要求的深度。</p>
<h2 id="判讀混合形態是常態不是過渡期的妥協">【判讀】混合形態是常態、不是過渡期的妥協</h2>
<p>光譜上的位置不必全站一致。常見的健康組合：行銷頁與內容放託管平台（Wix / WordPress）、核心產品自建、兩者用子網域分流；電商主站走 Shopify、客製的批發報價系統自建接 Shopify API；內部流程跑 Apps Script、對外產品自建。判讀單位是「每條業務流程」、不是「整間公司」— 把不是差異化的流程硬塞進自建 codebase、跟把差異化流程硬塞進託管平台、是同一個錯誤的兩個方向。拆分軸除了逐流程、還有逐層：headless 形態（託管平台當後端引擎、自建前端體驗層）是同一條流程內的層級混合、判讀方式相同 — 每一層各自問「差異化在這層嗎」。</p>
<p>光譜上還有兩個停靠點值得知道：靜態網站生成器（Hugo / Next.js export）搭配 hosting（Netlify / Vercel）介於全託管與半託管之間，適合文件站與行銷頁；Edge Functions（Cloudflare Workers / Vercel Edge）介於 BaaS 與自建之間，寫程式但不管基礎設施，適合輕量 API 與邊緣邏輯。兩者的邊界訊號與遷出代價跟相鄰形態類似，需求超出時回到各自相鄰段落的判讀。</p>
<h2 id="權衡託管形態的成本與資安帳">【權衡】託管形態的成本與資安帳</h2>
<p>託管形態把伺服器帳單換成平台帳單、把維運人力換成平台依賴。權衡時五個方向都要看：</p>
<ol>
<li><strong>資安限制</strong>：平台扛掉 patch、憑證、DDoS 防護 — 這對沒有資安人力的團隊是淨收益。代價是資料主權與稽核深度受限：資料落在平台的儲存裡、<a href="/blog/backend/knowledge-cards/audit-log/" data-link-title="Audit Log" data-link-desc="說明高風險操作如何留下可追溯、可稽核的紀錄">audit log</a> 細度由平台決定、有資料落地或合規要求（金融、醫療、政府標案）的業務、託管形態可能直接出局。</li>
<li><strong>流量與穩定性</strong>：平台的彈性通常優於小團隊自建（Shopify 扛 Black Friday 是它的本業）、但天花板不可協商 — API rate limit、配額、模板效能、撞到就是撞到。</li>
<li><strong>平台費用</strong>：月費 + 抽成（電商平台的交易抽成在量大後是實質稅率）。自建與託管的成本曲線會交叉、交叉點要算：平台月費 + 抽成 vs 自建的工程薪資 + 雲端帳單、在目前與三倍業務量下各是多少。</li>
<li><strong>人力與操作</strong>：託管形態讓非工程角色能直接維護（改文案、上商品、調流程）、這個能力在小團隊值很多錢；自建後每個改動都過工程隊列。</li>
<li><strong>機會成本</strong>：選託管、省下的工程時間投到差異化；選自建、買到的控制力要有明確用途。「以後可能要客製」是最常見的偽自建理由 — 客製需求出現時再遷、總成本通常低於提前自建養一套用不滿的基礎設施。</li>
</ol>
<h2 id="檢查可遷出保險選託管的同時保留往右走的路">【檢查】可遷出保險：選託管的同時保留往右走的路</h2>
<p>託管形態的真正風險是 <a href="/blog/backend/knowledge-cards/vendor-lock-in/" data-link-title="Vendor Lock-In" data-link-desc="說明採用供應商產品後，其 API 與格式滲入程式碼造成的退出成本">vendor lock-in</a> 的具體形：遷不出去。保險在進場時最便宜。選擇任何託管形態的同時、確認下列事項：</p>
<table>
  <thead>
      <tr>
          <th>保險項</th>
          <th>做法</th>
          <th>缺了會發生什麼</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>自有網域</td>
          <td>網域註冊在自己名下、DNS 自己控制、不用平台贈送的子網域</td>
          <td>遷移等於換址、SEO 與既有連結歸零</td>
      </tr>
      <tr>
          <td>資料定期匯出</td>
          <td>排程匯出商品 / 訂單 / 會員資料、確認格式可被重新匯入</td>
          <td>遷移當天才發現匯出殘缺、或平台限制匯出頻率</td>
      </tr>
      <tr>
          <td>客戶聯絡管道自有</td>
          <td>email 名單同步到自有系統、不只活在平台的行銷模組裡</td>
          <td>客戶關係綁死在平台、遷移等於重新獲客</td>
      </tr>
      <tr>
          <td>金流可攜性</td>
          <td>評估金流商是否平台綁定；訂閱制確認扣款授權能否轉移</td>
          <td>訂閱客戶遷移時全體重新授權、流失率直接體現在營收</td>
      </tr>
      <tr>
          <td>密碼不可攜的預案</td>
          <td>接受會員密碼雜湊多半遷不走、預先設計重設密碼的遷移體驗</td>
          <td>遷移日全體會員被迫重設、無預案時體驗等於資安事故</td>
      </tr>
      <tr>
          <td>業務邏輯文件化</td>
          <td>在平台設定裡長出來的規則（折扣邏輯、會員等級）寫成文件</td>
          <td>規則只存在平台 UI 裡、遷移時靠回憶重建</td>
      </tr>
  </tbody>
</table>
<p>每項保險在遷出日如何兌現 — 保險與理賠流程的對應 — 見 <a href="/blog/backend/10-system-evolution/managed-platform-exit/" data-link-title="10.3 託管形態遷出：資產線盤點與並行期執行" data-link-desc="0.21 升級自建 tripwire 觸發後的執行劇本 — 把遷出拆成資料、身分、流量、整合各自的可攜性與斷點、設計舊平台與新系統的並行期與回切窗口、用部分遷出作為中繼形態">10.3 託管形態遷出</a> 的資產線盤點。</p>
<h2 id="檢查升級自建的-tripwire">【檢查】升級自建的 tripwire</h2>
<p>「日後可能需要自建」要轉成可觀察訊號、寫進選型記錄、而不是留在感覺裡：</p>
<table>
  <thead>
      <tr>
          <th>Tripwire 訊號</th>
          <th>判讀</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>平台內 workaround 程式碼持續成長（liquid hack、Velo、外掛魔改）</td>
          <td>已經在用最差的環境自建、把工程投入轉到正式自建更划算</td>
      </tr>
      <tr>
          <td>平台年費用超過半個工程師全載年薪（含招聘與管理成本）</td>
          <td>成本曲線交叉、用自己團隊的數字錨定後重算自建總帳；三倍業務量下再算一次</td>
      </tr>
      <tr>
          <td>核心流程的客製需求連續被平台能力擋下</td>
          <td>差異化開始長在軟體上、自建的前提成立了</td>
      </tr>
      <tr>
          <td>API rate limit / 配額錯誤開始影響業務</td>
          <td>天花板撞到、額度調整權在平台手上</td>
      </tr>
      <tr>
          <td>合規或客戶要求資料落地、稽核細度、滲透測試</td>
          <td>控制面深度超出託管形態能給的範圍</td>
      </tr>
      <tr>
          <td>平台政策變更（費率、功能下架）直接衝擊營收</td>
          <td>平台風險具體化、依賴單一平台的代價浮現</td>
      </tr>
      <tr>
          <td>平台被收購、停止維護或公告 EOL</td>
          <td>帶死線的續存風險 — 問題從「該不該遷」變成「遷移窗口多長」、立即啟動評估</td>
      </tr>
  </tbody>
</table>
<p>tripwire 是重評承諾、不是遷移保證 — 觸發後每拖一季、資料量與整合深度都在墊高遷移成本。任一 tripwire 觸發時、回到本模組從 <a href="/blog/backend/00-service-selection/backend-demand-taxonomy/" data-link-title="0.0 後端需求分類地圖" data-link-desc="先從需求形狀辨識狀態、讀取、非同步、即時、診斷、交付與可靠性問題">0.0 需求分類</a> 走完整的自建選型；評估成立後的執行劇本 — 資產線盤點、並行期、回切窗口 — 見 <a href="/blog/backend/10-system-evolution/managed-platform-exit/" data-link-title="10.3 託管形態遷出：資產線盤點與並行期執行" data-link-desc="0.21 升級自建 tripwire 觸發後的執行劇本 — 把遷出拆成資料、身分、流量、整合各自的可攜性與斷點、設計舊平台與新系統的並行期與回切窗口、用部分遷出作為中繼形態">10.3 託管形態遷出</a>。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>判斷落在自建：從 <a href="/blog/backend/00-service-selection/backend-demand-taxonomy/" data-link-title="0.0 後端需求分類地圖" data-link-desc="先從需求形狀辨識狀態、讀取、非同步、即時、診斷、交付與可靠性問題">0.0 後端需求分類地圖</a> 開始走本模組的選型順序。</li>
<li>判斷落在自建、但周邊能力仍想逐塊外包（認證、搜尋、金流、表單、後台）：見 <a href="/blog/backend/00-service-selection/capability-buy-vs-build/" data-link-title="0.22 能力級買 vs 建：feature-as-a-service 與 BaaS bundle 選型" data-link-desc="在交付形態決定整個系統要不要自建之後、逐能力判斷該外包還是自建：辨識 managed 基礎設施、feature SaaS 與 BaaS bundle 三種外包深度、no-code 到 dev-tool 的服務光譜、買 vs 建判準與權重浮動、整合接縫與遷出代價">0.22 能力級買 vs 建</a>。</li>
<li>判斷落在個人自架工具（單人自用、無對外服務）：跳過資料庫 / 快取 / queue 章節、只看 <a href="/blog/backend/07-security-data-protection/identity-access-boundary/" data-link-title="7.2 身分與授權邊界" data-link-desc="以問題驅動方式整理身分、授權、會話與供應商身分鏈">7.2 單人裝置認證</a> 與 <a href="/blog/backend/05-deployment-platform/outbound-tunnel-entry/" data-link-title="5.10 Outbound Tunnel 入口與生命週期" data-link-desc="整理 cloudflared / Tailscale 等反向隧道的入口形態、生命週期合約與故障模式">5.10 Outbound Tunnel 入口</a>;多人化時再回完整自建選型。</li>
<li>判斷落在託管形態：完成上方可遷出保險清單、把 tripwire 寫進選型記錄、定期回看。</li>
<li>成本曲線的算法：見 <a href="/blog/backend/00-service-selection/cost-risk-tradeoffs/" data-link-title="0.6 成本、風險與選型取捨" data-link-desc="用人力成本、雲端成本、操作成本與失敗代價判斷後端能力投入順序">0.6 成本、風險與選型取捨</a>。</li>
<li>託管形態下仍需要的資安底線（帳號安全、權限、資料匯出管控）：見 <a href="/blog/backend/00-service-selection/security-data-protection-requirements/" data-link-title="0.8 資安與資料保護需求" data-link-desc="從權限分級、伺服器防護、資料遮罩、傳輸保護與稽核設計安全邊界">0.8 資安與資料保護需求</a>。</li>
<li>從託管遷往自建的執行劇本：見 <a href="/blog/backend/10-system-evolution/managed-platform-exit/" data-link-title="10.3 託管形態遷出：資產線盤點與並行期執行" data-link-desc="0.21 升級自建 tripwire 觸發後的執行劇本 — 把遷出拆成資料、身分、流量、整合各自的可攜性與斷點、設計舊平台與新系統的並行期與回切窗口、用部分遷出作為中繼形態">10.3 託管形態遷出</a>；模組總覽見 <a href="/blog/backend/10-system-evolution/" data-link-title="模組十：系統演進與遷移" data-link-desc="處理服務拆分、跨服務重構、大型遷移與雲端切換的執行紀律 — 設計階段的選型判斷見模組零、執行階段的高風險變更收斂在本模組">模組十：系統演進與遷移</a>。</li>
</ul>
]]></content:encoded></item></channel></rss>