<?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>Paved-Road on Tarragon</title><link>https://tarrragon.github.io/blog/tags/paved-road/</link><description>Recent content in Paved-Road on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Thu, 09 Jul 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/paved-road/index.xml" rel="self" type="application/rss+xml"/><item><title>把遠端 agent 工作機鋪成一條路：個人尺度的 paved road</title><link>https://tarrragon.github.io/blog/linux/tools/remote/remote-agent-paved-road/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/remote/remote-agent-paved-road/</guid><description>&lt;p>paved road（鋪好的路，也叫 golden path）是一條有主張、可重現、被支援的預設路徑：把「該用什麼工具、按什麼順序做、每步該長什麼樣」先決定好，讓走這條路的人不必每次重新選型、重查資料、再踩一次同一個雷。它的價值在於把重複性的決策成本一次付清、把注意力留給真正該想的事，而不在限制自由。這個詞源自 Spotify 內部的 golden path、Netflix 叫它 paved road，兩者都是為了讓工程師在複雜的基礎設施上有一條「照著走就對」的預設路線。&lt;/p>
&lt;p>這篇把本站散在多篇的遠端 agent 工作機內容，鋪成一條從零到可用的順序路徑，回答「我要架一台，該先做什麼、後做什麼、每步走完手上有什麼」——而不是再列一次有哪些主題。&lt;/p>
&lt;h2 id="個人尺度的-paved-road-只有三個零件">個人尺度的 paved road 只有三個零件&lt;/h2>
&lt;p>組織尺度的 paved road 需要一個平台團隊，把工具、模板、文件收進一個開發者入口（developer portal，如常用來建這種入口的開源框架 Backstage），讓幾十個團隊自助取用（組織尺度的真實案例見 &lt;a href="https://tarrragon.github.io/blog/backend/06-reliability/cases/spotify/backstage-service-catalog-and-reliability-metadata/" data-link-title="Spotify：Backstage Service Catalog 與 Reliability Metadata" data-link-desc="用 service catalog 治理分散團隊的可靠性資訊：ownership、SLO 狀態、依賴圖與 runbook 的單一入口。">Spotify 的 Backstage 與平台工程&lt;/a>）。那套投資對一個人或小團隊是過重的——但鋪路的原則可以整組搬下來，落地成三個零件：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>一個 repo 當唯一真實來源&lt;/strong>：機器的狀態（設定、腳本、image 定義）全部在 git，任何一台隨時 &lt;code>git pull&lt;/code> + 部署就長回來。手動放上去的檔案下次重裝就消失，不算鋪在路上。&lt;/li>
&lt;li>&lt;strong>一支冪等的部署腳本&lt;/strong>：把 image build、設定 scaffold、機密佔位收進一個可重複跑的入口，跑一次就把環境長出來，走的人不必記每一步 docker 指令。&lt;/li>
&lt;li>&lt;strong>一條排好序的路徑&lt;/strong>：也就是這篇——把要讀要做的內容排成順序，讓新的一台不必自己拼湊「先選型還是先連線」。&lt;/li>
&lt;/ul>
&lt;p>這三者到齊、且持續維護，就值得用 paved road 的語彙描述你已經在做的事：可重現、低決策、照著走就對。組織版的 developer portal 是把這三件事放進一個網頁自助入口；個人版把它們放進一個 repo 加這篇路標，不需要入口網站也成立。借「paved road」這個組織尺度的詞、套在個人尺度確實偏重——借的是它的原則，不是它的規模。&lt;/p>
&lt;h2 id="這條路從零到可用的遠端-agent-工作機">這條路：從零到可用的遠端 agent 工作機&lt;/h2>
&lt;p>每一步先決定一件事、走完給你一個明確的產物，再進下一步。卡住時往對應的深入文章走。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>步驟&lt;/th>
 &lt;th>這一步決定什麼&lt;/th>
 &lt;th>走完你有什麼&lt;/th>
 &lt;th>深入&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>1 形態&lt;/td>
 &lt;td>機器放家用機還是 VPS&lt;/td>
 &lt;td>一台選定形態、延遲與隔離都想清楚的目標機&lt;/td>
 &lt;td>&lt;a href="../agent-workstation-home-vs-vps/">遠端 agent 工作機選型&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>2 連線地基&lt;/td>
 &lt;td>怎麼初次連進機器、把 repo 同步上去、再換成跨網路穩定的位址&lt;/td>
 &lt;td>連得進去、機器上有 dotfile、換網路也連得到的定址&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/linux/install/ssh-keyless-bootstrap/" data-link-title="外部連入、SSH key 與無 key 的 bootstrap 路徑" data-link-desc="要從本機終端機操作新裝好的 Linux 機器、設 SSH key 免密碼、或還沒有 key 就想把 dotfile 弄進機器跑 install.sh 時回來讀">外部連入與 bootstrap&lt;/a>、&lt;a href="../tailscale-tailnet-and-relay/">Tailscale 深入&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>3 連線工具&lt;/td>
 &lt;td>用什麼連、斷線怎麼辦、手機端怎麼連&lt;/td>
 &lt;td>一組連得穩、斷得起、手機也能上的工具&lt;/td>
 &lt;td>&lt;a href="../connection-and-sync-tools/">連線與同步工具選型&lt;/a>、&lt;a href="../mobile-terminal-client-selection/">手機終端 client 選型&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>4 session 常駐&lt;/td>
 &lt;td>怎麼讓 session 留在遠端、斷線不掉工作&lt;/td>
 &lt;td>一個 detach 後任務仍在、重連就接回的常駐 session&lt;/td>
 &lt;td>&lt;a href="../../cli/zellij-session-lifecycle/">zellij session 生命週期&lt;/a>、&lt;a href="../../cli/tmux-persistence-and-basics/">tmux 持久化&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>5 裝 agent&lt;/td>
 &lt;td>agent 怎麼裝、三顆機密（Claude Code / GitHub / 通知）怎麼注入、跑完怎麼通知&lt;/td>
 &lt;td>一個認證解耦、可 clone/push、跑完會推播的 agent&lt;/td>
 &lt;td>&lt;a href="../claude-code-container-and-hooks/">在 container 裡跑 Claude Code&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>6 無人值守&lt;/td>
 &lt;td>互動提示 / 結果出不去怎麼解&lt;/td>
 &lt;td>一台可以放著走人、自己跑完長任務的機器&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/linux/install/unattended-remote-work/" data-link-title="讓機器跑無人值守的長任務" data-link-desc="要讓一台遠端機器在你不盯著時自己跑完一個長任務或 agent、卻被 sudo 密碼 / 斷線就死 / 推不出結果擋住時讀">無人值守的長任務&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>7 端到端驗證&lt;/td>
 &lt;td>前六步串起來實際跑不跑得通&lt;/td>
 &lt;td>一次從 image 到手機端跑通的完整驗證&lt;/td>
 &lt;td>&lt;a href="../agent-workstation-vm-handson/">實作記錄&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>步驟 1 形態&lt;/strong>決定的是後面所有步驟的約束：家用機延遲低、但要處理浮動 IP 與對外曝露；VPS 有固定位址、但要付月租且環境隔離自己扛。先定這件，因為它改寫步驟 2 的連線策略與步驟 5 的信任邊界。&lt;/p>
&lt;p>&lt;strong>步驟 2 連線地基&lt;/strong>是三件事的疊放、順序不能顛倒：先解決「第一次怎麼連進機器」——新機器還沒有任何遠端工具，只能靠 console 或區網 SSH 初次接觸、把 dotfile 同步上去；拿到能操作的 session 後，再裝 Tailscale、讓這個位址換成換網路也穩定的 tailnet 位址（機器名跟著機器走、不隨 LAN IP 漂移）。倒過來做不成——裝 Tailscale 這件事本身就需要先有一條連進機器的路。這步走完，機器才從「一台裝好的 OS」變成「你連得到、且帶著你設定的機器」。&lt;/p></description><content:encoded><![CDATA[<p>paved road（鋪好的路，也叫 golden path）是一條有主張、可重現、被支援的預設路徑：把「該用什麼工具、按什麼順序做、每步該長什麼樣」先決定好，讓走這條路的人不必每次重新選型、重查資料、再踩一次同一個雷。它的價值在於把重複性的決策成本一次付清、把注意力留給真正該想的事，而不在限制自由。這個詞源自 Spotify 內部的 golden path、Netflix 叫它 paved road，兩者都是為了讓工程師在複雜的基礎設施上有一條「照著走就對」的預設路線。</p>
<p>這篇把本站散在多篇的遠端 agent 工作機內容，鋪成一條從零到可用的順序路徑，回答「我要架一台，該先做什麼、後做什麼、每步走完手上有什麼」——而不是再列一次有哪些主題。</p>
<h2 id="個人尺度的-paved-road-只有三個零件">個人尺度的 paved road 只有三個零件</h2>
<p>組織尺度的 paved road 需要一個平台團隊，把工具、模板、文件收進一個開發者入口（developer portal，如常用來建這種入口的開源框架 Backstage），讓幾十個團隊自助取用（組織尺度的真實案例見 <a href="/blog/backend/06-reliability/cases/spotify/backstage-service-catalog-and-reliability-metadata/" data-link-title="Spotify：Backstage Service Catalog 與 Reliability Metadata" data-link-desc="用 service catalog 治理分散團隊的可靠性資訊：ownership、SLO 狀態、依賴圖與 runbook 的單一入口。">Spotify 的 Backstage 與平台工程</a>）。那套投資對一個人或小團隊是過重的——但鋪路的原則可以整組搬下來，落地成三個零件：</p>
<ul>
<li><strong>一個 repo 當唯一真實來源</strong>：機器的狀態（設定、腳本、image 定義）全部在 git，任何一台隨時 <code>git pull</code> + 部署就長回來。手動放上去的檔案下次重裝就消失，不算鋪在路上。</li>
<li><strong>一支冪等的部署腳本</strong>：把 image build、設定 scaffold、機密佔位收進一個可重複跑的入口，跑一次就把環境長出來，走的人不必記每一步 docker 指令。</li>
<li><strong>一條排好序的路徑</strong>：也就是這篇——把要讀要做的內容排成順序，讓新的一台不必自己拼湊「先選型還是先連線」。</li>
</ul>
<p>這三者到齊、且持續維護，就值得用 paved road 的語彙描述你已經在做的事：可重現、低決策、照著走就對。組織版的 developer portal 是把這三件事放進一個網頁自助入口；個人版把它們放進一個 repo 加這篇路標，不需要入口網站也成立。借「paved road」這個組織尺度的詞、套在個人尺度確實偏重——借的是它的原則，不是它的規模。</p>
<h2 id="這條路從零到可用的遠端-agent-工作機">這條路：從零到可用的遠端 agent 工作機</h2>
<p>每一步先決定一件事、走完給你一個明確的產物，再進下一步。卡住時往對應的深入文章走。</p>
<table>
  <thead>
      <tr>
          <th>步驟</th>
          <th>這一步決定什麼</th>
          <th>走完你有什麼</th>
          <th>深入</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>1 形態</td>
          <td>機器放家用機還是 VPS</td>
          <td>一台選定形態、延遲與隔離都想清楚的目標機</td>
          <td><a href="../agent-workstation-home-vs-vps/">遠端 agent 工作機選型</a></td>
      </tr>
      <tr>
          <td>2 連線地基</td>
          <td>怎麼初次連進機器、把 repo 同步上去、再換成跨網路穩定的位址</td>
          <td>連得進去、機器上有 dotfile、換網路也連得到的定址</td>
          <td><a href="/blog/linux/install/ssh-keyless-bootstrap/" data-link-title="外部連入、SSH key 與無 key 的 bootstrap 路徑" data-link-desc="要從本機終端機操作新裝好的 Linux 機器、設 SSH key 免密碼、或還沒有 key 就想把 dotfile 弄進機器跑 install.sh 時回來讀">外部連入與 bootstrap</a>、<a href="../tailscale-tailnet-and-relay/">Tailscale 深入</a></td>
      </tr>
      <tr>
          <td>3 連線工具</td>
          <td>用什麼連、斷線怎麼辦、手機端怎麼連</td>
          <td>一組連得穩、斷得起、手機也能上的工具</td>
          <td><a href="../connection-and-sync-tools/">連線與同步工具選型</a>、<a href="../mobile-terminal-client-selection/">手機終端 client 選型</a></td>
      </tr>
      <tr>
          <td>4 session 常駐</td>
          <td>怎麼讓 session 留在遠端、斷線不掉工作</td>
          <td>一個 detach 後任務仍在、重連就接回的常駐 session</td>
          <td><a href="../../cli/zellij-session-lifecycle/">zellij session 生命週期</a>、<a href="../../cli/tmux-persistence-and-basics/">tmux 持久化</a></td>
      </tr>
      <tr>
          <td>5 裝 agent</td>
          <td>agent 怎麼裝、三顆機密（Claude Code / GitHub / 通知）怎麼注入、跑完怎麼通知</td>
          <td>一個認證解耦、可 clone/push、跑完會推播的 agent</td>
          <td><a href="../claude-code-container-and-hooks/">在 container 裡跑 Claude Code</a></td>
      </tr>
      <tr>
          <td>6 無人值守</td>
          <td>互動提示 / 結果出不去怎麼解</td>
          <td>一台可以放著走人、自己跑完長任務的機器</td>
          <td><a href="/blog/linux/install/unattended-remote-work/" data-link-title="讓機器跑無人值守的長任務" data-link-desc="要讓一台遠端機器在你不盯著時自己跑完一個長任務或 agent、卻被 sudo 密碼 / 斷線就死 / 推不出結果擋住時讀">無人值守的長任務</a></td>
      </tr>
      <tr>
          <td>7 端到端驗證</td>
          <td>前六步串起來實際跑不跑得通</td>
          <td>一次從 image 到手機端跑通的完整驗證</td>
          <td><a href="../agent-workstation-vm-handson/">實作記錄</a></td>
      </tr>
  </tbody>
</table>
<p><strong>步驟 1 形態</strong>決定的是後面所有步驟的約束：家用機延遲低、但要處理浮動 IP 與對外曝露；VPS 有固定位址、但要付月租且環境隔離自己扛。先定這件，因為它改寫步驟 2 的連線策略與步驟 5 的信任邊界。</p>
<p><strong>步驟 2 連線地基</strong>是三件事的疊放、順序不能顛倒：先解決「第一次怎麼連進機器」——新機器還沒有任何遠端工具，只能靠 console 或區網 SSH 初次接觸、把 dotfile 同步上去；拿到能操作的 session 後，再裝 Tailscale、讓這個位址換成換網路也穩定的 tailnet 位址（機器名跟著機器走、不隨 LAN IP 漂移）。倒過來做不成——裝 Tailscale 這件事本身就需要先有一條連進機器的路。這步走完，機器才從「一台裝好的 OS」變成「你連得到、且帶著你設定的機器」。</p>
<p><strong>步驟 4 session 常駐</strong>是後面「無人值守」的前提：把 session 用終端機多工器（tmux / zellij）常駐在遠端，SSH 斷了 session 不受影響、重連 attach 就回到原狀。少了這層，斷線會把跑到一半的長任務一起帶走；agent 就跑在這個常駐 session 裡，你的連線斷了它照跑。</p>
<p><strong>步驟 5 裝 agent</strong>是這條路上唯一牽涉多顆機密的一步：Claude Code 對 Anthropic、GitHub token 對 git 操作、ntfy topic 對推播，三顆職責正交、但走同一套 <code>--env-file</code> 注入。把這步的認證想成「三顆獨立機密、同一個注入模式」，就不會把 GitHub 認證誤當成 Claude Code 認證的延伸。這裡也劃清兩條邊界：三零件裡的「部署腳本」只做到機密的佔位與注入流程，三顆機密的真值仍是手填、不進 repo——可重現的是流程、不是機密本身；container 則跑在步驟 1 選定的那台機器裡（VM、VPS 或家用機都行），步驟 7 的實作記錄就是這整疊在一台 VM 上跑通的樣子，不是路徑中途換了隔離策略。</p>
<p><strong>步驟 6 無人值守</strong>解的是幾個會讓「放著走人」破功的障礙：sudo 之類的互動提示卡住自動執行、任務跑完但結果推不回你手上——斷線把任務殺掉這條，已由步驟 4 的常駐 session 擋住。這步跟步驟 5 的推播通知互補——通知是「跑完叫你回來」，無人值守是「你不在時它自己跑完」。</p>
<h2 id="逃生口路是預設不是牢籠">逃生口：路是預設，不是牢籠</h2>
<p>paved road 的重點是預設路徑好走，不是禁止離開。這條路每一步都留了偏離的空間，且偏離本身也在路上：</p>
<ul>
<li><strong>agent 本身用不用 Claude Code</strong> 是這條路最大的預設、也最可換：步驟 5-7 以 Claude Code 為例，但「認證解耦、在受限環境裡跑、跑完通知」這套骨架對別的 coding agent 一樣成立，換 agent 主要改步驟 5 的裝法。</li>
<li><strong>步驟 1 的家用 vs VPS 就是一個岔路</strong>，不是唯一解——選型文給的是判準，不是規定。</li>
<li><strong>連線用 ssh 還是 mosh</strong> 依情境切換：坐著打中文用 ssh、移動漫遊用 mosh，兩條都在路上。</li>
<li><strong>agent 的 <code>--dangerously-skip-permissions</code> 開不開</strong>取決於這台機器的爆炸半徑：用完即丟的隔離機可以開，有真實資料的機器不該開。</li>
</ul>
<p>判準是：偏離要有理由、且偏離後仍能回到可重現的狀態（改動進 repo、不是手放）。一條禁止任何偏離的路會變成牢籠、逼人繞過它；一條連偏離都納入判準的路，才是走得久的路。</p>
<h2 id="為什麼一個人也值得鋪路">為什麼一個人也值得鋪路</h2>
<p>重複性的決策成本，一個人一樣要付。第二次架同類機器時又在「先選型還是先連線」上猶豫、又重查一次 token 怎麼注入，就是缺一條路的訊號。把它鋪好一次，後面每一台都省下這段。</p>
<p>路也會爛——工具版本漂移、某步的前提變了、文件跟實作對不上。個人尺度的活文件機制不需要平台團隊：repo 是 SSoT 讓每台機器能重現，事後把踩到的意外整理成規則、回灌進這條路的步驟。這篇本身也是活的——步驟順序或工具換了，改這張路標，而不是讓每個人重新拼一次。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>概念本身、組織尺度與個人尺度的界線：<a href="/blog/linux/dotfile/knowledge-cards/paved-road-golden-path/" data-link-title="Golden Path / paved road" data-link-desc="要判斷該不該為一套重複性的 setup 鋪一條預設路徑、或分辨組織尺度的 developer portal 跟個人尺度的 repo 加腳本加路標哪個適用時回來讀">Golden Path / paved road</a></li>
<li>這條路的第一步（形態選型）：<a href="../agent-workstation-home-vs-vps/">遠端 agent 工作機選型</a></li>
<li>整條路的端到端實作驗證：<a href="../agent-workstation-vm-handson/">遠端 agent 工作機實作記錄</a></li>
<li>若想理解這條路在更大交付脈絡的位置（Infra / CI/CD / 運維三階段）：<a href="/blog/devops/" data-link-title="DevOps 全景：軟體交付生命週期" data-link-desc="想釐清 infra、CI/CD、運行期維運怎麼串成一條軟體交付生命週期、或不確定手上的問題該進哪個系列時回來讀">DevOps 全景</a></li>
</ul>
]]></content:encoded></item></channel></rss>