<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/feed.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>丁丁的亂寫空間</title><description>隨意寫寫，筆記記錄，以免忘記，後悔莫及</description><link>https://blog.thanatosdi.work</link><item><title>設定 Powershell 命令別名 (alias)</title><link>https://blog.thanatosdi.work/post/windows/%E8%A8%AD%E5%AE%9A-powershell-%E5%91%BD%E4%BB%A4%E5%88%A5%E5%90%8D-alias</link><guid isPermaLink="false">windows/設定-powershell-命令別名-alias</guid><description>設定 Powershell 命令別名 (alias)
每次開啟 PowerShell 或終端機等 shell 環境時，都會執行一組腳本文件，用於初始化 session 可用的功能。在標準的 Ubuntu 發行版中，.bashrc 檔案就是其中之一。將別名指令加入 .bashrc</description><pubDate>Thu, 13 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;設定 Powershell 命令別名 (alias)&lt;a href=&quot;#設定-powershell-命令別名-alias&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;每次開啟 PowerShell 或終端機等 shell 環境時，都會執行一組腳本文件，用於初始化 session 可用的功能。在標準的 Ubuntu 發行版中，.bashrc 檔案就是其中之一。將別名指令加入 .bashrc 檔案中，即可讓開發者使用該別名。&lt;/p&gt;
&lt;p&gt;Windows 同樣也有相同類似的設定&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;echo &lt;/span&gt;&lt;span&gt;$profile&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這時會印出你的 profile 路徑，你可以使用記事本或者 IDE 開啟編輯他&lt;/p&gt;
&lt;p&gt;或者使用以下命令直接新增 alias 進 profile 中&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;echo &lt;/span&gt;&lt;span&gt;&quot;Set-Alias alias cmdlet&quot;&lt;/span&gt;&lt;span&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; $profile&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如我要讓 &lt;code&gt;ll&lt;/code&gt; 變成 &lt;code&gt;ls&lt;/code&gt; 的別名 ( Linux 中 &lt;code&gt;ls -al&lt;/code&gt; 的簡寫)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;echo &lt;/span&gt;&lt;span&gt;&quot;Set-Alias ll ls&quot;&lt;/span&gt;&lt;span&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; $profile&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重開終端機後驗證看看是否有正確套用&lt;/p&gt;</content:encoded><category>category:windows</category><category>tag:windows</category><category>tag:CLI</category></item><item><title>Tailscale 與 Emby 實戰</title><link>https://blog.thanatosdi.work/post/linux/tailscale-%E8%88%87-emby-%E5%AF%A6%E6%88%B0</link><guid isPermaLink="false">linux/tailscale-與-emby-實戰</guid><description>Tailscale 與 Emby 實戰
照著 Tailscale 筆記 安裝好 tailscale 並新增 Machines 後，這邊用 Emby 做為範例來讓 Emby 服務可以有一個網址可以訪問
到 Dashboard 中的 Services &amp;gt; Advertised &amp;gt; Add</description><pubDate>Thu, 13 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Tailscale 與 Emby 實戰&lt;a href=&quot;#tailscale-與-emby-實戰&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;照著 &lt;a href=&quot;//blog.thanatosdi.work/post/linux/tailscale-%E7%AD%86%E8%A8%98/&quot;&gt;Tailscale 筆記&lt;/a&gt; 安裝好 tailscale 並新增 Machines 後，這邊用 Emby 做為範例來讓 Emby 服務可以有一個網址可以訪問&lt;/p&gt;
&lt;p&gt;到 Dashboard 中的 &lt;code&gt;Services &amp;gt; Advertised &amp;gt; Add service&lt;/code&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/file-20260814163318256.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;新增 Service 之後如下圖，接著要到 Emby 所在的主機建立設定&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/file-20260814163409088.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;div&gt;
&lt;p&gt;這邊範例 tailscale 是使用 docker compose 啟動的
所以操作會在 container 中進行操作
然後再 docker compose 有加入 extra_hosts 設定，所以會用 &lt;code&gt;host.docker.internal&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;在 container 中執行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; --service=svc:emby-test&lt;/span&gt;&lt;span&gt; --https=443&lt;/span&gt;&lt;span&gt; http://host.docker.internal:8096&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接著就要到 Dashboard 允許指定 Machine
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/file-20260814171605835.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;接著就可以連線到 tailscale 網路後訪問這個網址 &lt;code&gt;&amp;lt;service 名稱&amp;gt;.&amp;lt;Tailnet DNS name&amp;gt;&lt;/code&gt; 就可以正常訪問到服務&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/file-20260814172243610.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;如果要移除資源可以到 container 中輸入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; clear&lt;/span&gt;&lt;span&gt; svc:emby-test&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接著如果 Emby 有設定特定 IP range 才能訪問的要加入 tailscale net 的 IP range
把 &lt;code&gt;100.64.0.0/10, fd7a:115c:a1e0::/48&lt;/code&gt; 加入到允許清單中
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/file-20260822002252782.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;這樣就可以正常訪問 Emby 了&lt;/p&gt;</content:encoded><category>category:linux</category><category>category:tailscale</category><category>tag:Docker</category><category>tag:Linux</category><category>tag:Tailscale</category><category>tag:Emby</category></item><item><title>Tailscale 筆記</title><link>https://blog.thanatosdi.work/post/linux/tailscale-%E7%AD%86%E8%A8%98</link><guid isPermaLink="false">linux/tailscale-筆記</guid><description>Tailscale 筆記
前言
想從外面連回家裡的 NAS、路由器管理頁、或是那台跑著一堆服務的小主機，傳統做法是在路由器上開通訊埠轉發 (Port forwarding)、自架 OpenVPN 或 WireGuard，然後跟浮動 IP、NAT、防火牆規則搏鬥半天。
Tailscale</description><pubDate>Tue, 11 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Tailscale 筆記&lt;a href=&quot;#tailscale-筆記&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;前言&lt;a href=&quot;#前言&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;想從外面連回家裡的 NAS、路由器管理頁、或是那台跑著一堆服務的小主機，傳統做法是在路由器上開通訊埠轉發 (Port forwarding)、自架 OpenVPN 或 WireGuard，然後跟浮動 IP、NAT、防火牆規則搏鬥半天。&lt;/p&gt;
&lt;p&gt;Tailscale 把這件事變成「裝一個軟體、登入、結束」。它底層就是 WireGuard，但把最麻煩的金鑰交換、NAT 穿透、裝置探索全部自動化了。你不需要開任何對外通訊埠，裝置之間會自己想辦法直連。&lt;/p&gt;
&lt;p&gt;這篇是我的設定筆記，涵蓋安裝、常用指令、子網路由 (Subnet Router)、出口節點 (Exit Node)、Tailscale SSH、MagicDNS、Tailscale Services，以及 Docker 部署方式。&lt;/p&gt;
&lt;h2&gt;核心概念&lt;a href=&quot;#核心概念&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;先把名詞搞清楚，後面看設定會順很多。&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;名詞&lt;/th&gt;&lt;th&gt;意思&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tailnet&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;你的私有網路，一個帳號一個 tailnet，所有裝置都在裡面&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;節點 (Node)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;加入 tailnet 的裝置，每台會拿到一個 &lt;code&gt;100.x.y.z&lt;/code&gt; 的固定 IP&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;控制平面 (Control Plane)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Tailscale 的協調伺服器，負責交換公鑰與裝置清單。&lt;strong&gt;不處理你的流量&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;DERP&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;中繼伺服器。直連失敗時流量走這裡，仍然是端對端加密&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;子網路由 (Subnet Router)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;讓一台節點代理整個內網網段，其他裝置不用每台都裝 Tailscale&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;出口節點 (Exit Node)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;把所有對外流量都導到某個節點出去，等同傳統 VPN 的用法&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;MagicDNS&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;自動幫每台節點配一個名字，直接用 &lt;code&gt;hostname&lt;/code&gt; 連線&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Service&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;與裝置解耦的具名服務，有自己的虛擬 IP (TailVIP) 與 MagicDNS 名稱&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ACL / Tailnet Policy File&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;存取控制規則，用 JSON 描述誰能連到誰&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;p&gt;控制平面只負責交換金鑰與裝置資訊，實際流量是節點之間直接走 WireGuard 加密隧道。就算 Tailscale 的伺服器被入侵，對方也解不開你的流量內容。不放心的話可以自架 &lt;a href=&quot;https://github.com/juanfont/headscale&quot;&gt;Headscale&lt;/a&gt; 取代控制平面。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;安裝&lt;a href=&quot;#安裝&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Linux&lt;a href=&quot;#linux&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;主流發行版（Ubuntu、Debian、RHEL、CentOS、Fedora、Raspberry Pi OS、Amazon Linux、openSUSE、Oracle Linux）直接用官方腳本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -fsSL&lt;/span&gt;&lt;span&gt; https://tailscale.com/install.sh&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p&gt;安裝參考: &lt;a href=&quot;https://tailscale.com/docs/install/linux&quot;&gt;Install Tailscale on Linux&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;裝完啟動並登入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; tailscale&lt;/span&gt;&lt;span&gt; up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;終端機會印出一個授權網址，用瀏覽器開啟並登入即可。裝置隨即出現在後台的 Machines 頁面。&lt;/p&gt;
&lt;p&gt;確認狀態：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; ip&lt;/span&gt;&lt;span&gt;        # 看自己的 tailnet IP&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;    # 看所有節點與連線方式&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;tailscale status&lt;/code&gt; 的輸出裡要特別注意最後一欄：&lt;code&gt;direct&lt;/code&gt; 代表 P2P 直連，&lt;code&gt;relay &quot;xxx&quot;&lt;/code&gt; 代表流量正在走 DERP 中繼。&lt;/p&gt;
&lt;h3&gt;其他平台&lt;a href=&quot;#其他平台&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;平台&lt;/th&gt;&lt;th&gt;安裝方式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Windows&lt;/td&gt;&lt;td&gt;官方 &lt;code&gt;.exe&lt;/code&gt; / &lt;code&gt;winget&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;macOS&lt;/td&gt;&lt;td&gt;App Store 版或獨立版 &lt;code&gt;.pkg&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;iOS / iPadOS&lt;/td&gt;&lt;td&gt;App Store&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Android&lt;/td&gt;&lt;td&gt;Google Play&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Synology / QNAP&lt;/td&gt;&lt;td&gt;官方套件（Synology 需從 Tailscale 官網下載 &lt;code&gt;.spk&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OPNsense / pfSense&lt;/td&gt;&lt;td&gt;內建套件庫&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;p&gt;macOS 有兩種版本：&lt;strong&gt;App Store 版&lt;/strong&gt;跟&lt;strong&gt;獨立版 (Standalone)&lt;/strong&gt;。獨立版才支援出口節點與子網路由等進階功能，App Store 版功能受 sandbox 限制。要當 Exit Node 的話請裝獨立版。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;常用指令&lt;a href=&quot;#常用指令&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;              # 節點清單與連線狀態&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; ip&lt;/span&gt;&lt;span&gt; -4&lt;/span&gt;&lt;span&gt;               # 只看 IPv4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; ping&lt;/span&gt;&lt;span&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;nod&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;         # 測試對某節點的連線路徑（會顯示 direct 還是 relay）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; netcheck&lt;/span&gt;&lt;span&gt;            # 檢查本機 NAT 型態與各 DERP 延遲&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; down&lt;/span&gt;&lt;span&gt;                # 斷線但保留登入狀態&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; up&lt;/span&gt;&lt;span&gt;                  # 重新連線&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; logout&lt;/span&gt;&lt;span&gt;              # 登出並從 tailnet 移除&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; file&lt;/span&gt;&lt;span&gt; cp&lt;/span&gt;&lt;span&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;fil&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;nod&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;  # 傳檔案到另一台節點&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; bugreport&lt;/span&gt;&lt;span&gt;           # 產生診斷識別碼，回報問題時用&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p&gt;&lt;code&gt;tailscale ping&lt;/code&gt; 跟系統的 &lt;code&gt;ping&lt;/code&gt; 不一樣。它會沿著 WireGuard 路徑測試，並告訴你這條連線是直連還是走中繼，排查速度問題的第一個工具就是它。&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;set 與 up 的差別&lt;a href=&quot;#set-與-up-的差別&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;新版 Tailscale 把「修改設定」跟「連線」拆開了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tailscale up&lt;/code&gt;：連線。加上旗標時會&lt;strong&gt;重設&lt;/strong&gt;未指定的設定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tailscale set&lt;/code&gt;：只改指定的那一項設定，其他保持不動&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以要調整既有節點的設定，用 &lt;code&gt;tailscale set&lt;/code&gt; 比較安全，不會意外把之前的旗標清掉。&lt;/p&gt;
&lt;h2&gt;子網路由 (Subnet Router)&lt;a href=&quot;#子網路由-subnet-router&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;情境：家裡有一台伺服器、一台 NAS、一台路由器、幾台 IoT 裝置。不可能每台都裝 Tailscale（IoT 裝置根本裝不了），這時候就在其中一台 Linux 機器上開子網路由，讓它代理整個 &lt;code&gt;192.168.1.0/24&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;1. 開啟 IP 轉送&lt;a href=&quot;#1-開啟-ip-轉送&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;這步很容易忘，忘了就是「設定看起來都對但連不通」。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &apos;net.ipv4.ip_forward = 1&apos;&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; sudo&lt;/span&gt;&lt;span&gt; tee&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; /etc/sysctl.d/99-tailscale.conf&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &apos;net.ipv6.conf.all.forwarding = 1&apos;&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; sudo&lt;/span&gt;&lt;span&gt; tee&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; /etc/sysctl.d/99-tailscale.conf&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; sysctl&lt;/span&gt;&lt;span&gt; -p&lt;/span&gt;&lt;span&gt; /etc/sysctl.d/99-tailscale.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;沒有 &lt;code&gt;/etc/sysctl.d/&lt;/code&gt; 目錄的系統，寫進 &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; 再 &lt;code&gt;sudo sysctl -p /etc/sysctl.conf&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;2. 宣告路由&lt;a href=&quot;#2-宣告路由&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; tailscale&lt;/span&gt;&lt;span&gt; set&lt;/span&gt;&lt;span&gt; --advertise-routes=192.168.1.0/24&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;多個網段用逗號分隔：&lt;code&gt;--advertise-routes=192.168.1.0/24,10.0.0.0/16&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;3. 在後台核准路由&lt;a href=&quot;#3-在後台核准路由&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;宣告完不會馬上生效。到後台 &lt;strong&gt;Machines&lt;/strong&gt; 頁面，該節點會出現 &lt;code&gt;subnets&lt;/code&gt; 標記，點進去 → &lt;strong&gt;Subnets&lt;/strong&gt; → &lt;strong&gt;Edit&lt;/strong&gt; → 勾選要核准的路由 → &lt;strong&gt;Save&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;想跳過手動核准，在 Policy File 裡設 &lt;code&gt;autoApprovers&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;autoApprovers&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;routes&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;192.168.1.0/24&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;autogroup:admin&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 用戶端接受路由&lt;a href=&quot;#4-用戶端接受路由&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Linux 用戶端&lt;/strong&gt;預設不接受子網路由，要手動開：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; tailscale&lt;/span&gt;&lt;span&gt; set&lt;/span&gt;&lt;span&gt; --accept-routes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Windows、macOS、iOS、Android 會自動探索路由，不用額外設定。&lt;/p&gt;
&lt;h3&gt;5. 設定存取控制&lt;a href=&quot;#5-設定存取控制&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Policy File 裡授權誰可以連進這個網段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;grants&quot;&lt;/span&gt;&lt;span&gt;: [{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;src&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;group:dev&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;dst&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;192.168.1.0/24&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;ip&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;*:*&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;保留來源 IP&lt;a href=&quot;#保留來源-ip&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;預設子網路由會做 SNAT，內網機器看到的來源 IP 是子網路由那台。想保留原始來源 IP：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; tailscale&lt;/span&gt;&lt;span&gt; up&lt;/span&gt;&lt;span&gt; --snat-subnet-routes=false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代價是內網那些機器需要有一條回到 &lt;code&gt;100.64.0.0/10&lt;/code&gt; 的路由，否則封包出不去。通常要在路由器上加靜態路由。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;子網路由那台機器如果關機，整個網段就都連不到了。重要環境建議開兩台做&lt;strong&gt;高可用&lt;/strong&gt;：兩台宣告相同的路由並都核准，Tailscale 會自動容錯切換。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;出口節點 (Exit Node)&lt;a href=&quot;#出口節點-exit-node&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;子網路由是「連進特定網段」，出口節點是「&lt;strong&gt;所有&lt;/strong&gt;對外流量都從那台出去」，等於傳統 VPN 的用法。適合在外面用公共 Wi-Fi 時把流量繞回家裡。&lt;/p&gt;
&lt;h3&gt;宣告為出口節點&lt;a href=&quot;#宣告為出口節點&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;前提一樣要先開 IP 轉送（見上一節）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; tailscale&lt;/span&gt;&lt;span&gt; set&lt;/span&gt;&lt;span&gt; --advertise-exit-node&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後到後台該節點的設定裡核准 exit node。用 &lt;code&gt;firewalld&lt;/code&gt; 的系統要額外允許 masquerade：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; firewall-cmd&lt;/span&gt;&lt;span&gt; --permanent&lt;/span&gt;&lt;span&gt; --add-masquerade&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用出口節點&lt;a href=&quot;#使用出口節點&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; tailscale&lt;/span&gt;&lt;span&gt; set&lt;/span&gt;&lt;span&gt; --exit-node=&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;節點名稱或IP&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;問題來了：一旦啟用出口節點，&lt;strong&gt;連本地區域網路都會被導走&lt;/strong&gt;，家裡的印表機就找不到了。要保留本地存取：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; tailscale&lt;/span&gt;&lt;span&gt; set&lt;/span&gt;&lt;span&gt; --exit-node=&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;節點名稱或IP&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; --exit-node-allow-lan-access=true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;關閉：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; tailscale&lt;/span&gt;&lt;span&gt; set&lt;/span&gt;&lt;span&gt; --exit-node=&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Policy File 需要授權 &lt;code&gt;autogroup:internet&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;grants&quot;&lt;/span&gt;&lt;span&gt;: [{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;src&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;group:dev&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;dst&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;autogroup:internet&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;ip&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;*:*&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p&gt;每台裝置都必須&lt;strong&gt;主動選擇&lt;/strong&gt;要使用出口節點，不會被強制套用。這是刻意的設計——避免管理員一改設定就把所有人的流量全部繞道。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;MagicDNS&lt;a href=&quot;#magicdns&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;啟用後每台節點自動獲得 &lt;code&gt;&amp;lt;hostname&amp;gt;.&amp;lt;tailnet-name&amp;gt;.ts.net&lt;/code&gt; 的名字，同一個 tailnet 內直接用 &lt;code&gt;hostname&lt;/code&gt; 就能連，不用背 &lt;code&gt;100.x.y.z&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;後台 &lt;strong&gt;DNS&lt;/strong&gt; 頁面 → 勾選 &lt;strong&gt;Enable MagicDNS&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Linux 用戶端要接受 DNS 設定：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; tailscale&lt;/span&gt;&lt;span&gt; set&lt;/span&gt;&lt;span&gt; --accept-dns&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改主機名稱：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; tailscale&lt;/span&gt;&lt;span&gt; set&lt;/span&gt;&lt;span&gt; --hostname=nas&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p&gt;MagicDNS 會接管 &lt;code&gt;/etc/resolv.conf&lt;/code&gt;。跟本機已經在跑的 DNS 服務（Pi-hole、AdGuard Home、dnsmasq、systemd-resolved 的某些設定）容易打架。&lt;/p&gt;
&lt;p&gt;如果那台機器本身就是你的 DNS 伺服器，建議關掉該節點的 &lt;code&gt;--accept-dns&lt;/code&gt;，改在後台 DNS 頁面把它設成 tailnet 的 &lt;strong&gt;Global nameserver&lt;/strong&gt;——這樣所有節點都能用你的 Pi-hole 過廣告。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Tailscale SSH&lt;a href=&quot;#tailscale-ssh&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tailscale 可以接管 port 22，用 tailnet 身分驗證取代 SSH 金鑰。好處是不用再手動散發公鑰、離職成員的存取權在後台一鍵撤銷。&lt;/p&gt;
&lt;p&gt;目標主機上啟用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; tailscale&lt;/span&gt;&lt;span&gt; set&lt;/span&gt;&lt;span&gt; --ssh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Policy File 加上 &lt;code&gt;ssh&lt;/code&gt; 區塊（沒有這段的話連不上）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;ssh&quot;&lt;/span&gt;&lt;span&gt;: [{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;action&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;accept&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;src&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;autogroup:member&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;dst&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;autogroup:self&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;users&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;autogroup:nonroot&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;root&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;連線就跟平常一樣：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;ssh&lt;/span&gt;&lt;span&gt; nas&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ssh&lt;/span&gt;&lt;span&gt; ubuntu@nas&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;action&lt;/code&gt; 除了 &lt;code&gt;accept&lt;/code&gt; 還可以設 &lt;code&gt;check&lt;/code&gt;，會要求連線者先在瀏覽器完成一次身分再驗證，適合用在生產環境的機器上。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;啟用 Tailscale SSH 後，&lt;strong&gt;從 tailnet 進來的 22 埠流量會被 tailscaled 攔截&lt;/strong&gt;，不再交給 &lt;code&gt;sshd&lt;/code&gt;。設定 ACL 之前先確認你還有另一條進入路徑（本機終端機、實體存取、或走非 tailnet IP 的 SSH），不然 ACL 寫錯就把自己鎖在門外了。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Serve 與 Funnel&lt;a href=&quot;#serve-與-funnel&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Serve&lt;/strong&gt;：把本機服務用 HTTPS 分享給 tailnet 內部，自動配憑證。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; --bg&lt;/span&gt;&lt;span&gt; 3000&lt;/span&gt;&lt;span&gt;              # 把 localhost:3000 掛到 https://&amp;lt;host&amp;gt;.&amp;lt;tailnet&amp;gt;.ts.net&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;                 # 看目前設定&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; reset&lt;/span&gt;&lt;span&gt;                  # 清掉全部設定&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Funnel&lt;/strong&gt;：把服務開放到&lt;strong&gt;整個網際網路&lt;/strong&gt;，不需要用戶端。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; funnel&lt;/span&gt;&lt;span&gt; --bg&lt;/span&gt;&lt;span&gt; 3000&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; funnel&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; funnel&lt;/span&gt;&lt;span&gt; off&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p&gt;Funnel 是真的對全世界開放，Tailscale 不會幫你加任何驗證。只適合本來就打算公開的東西（webhook 接收端、給別人看的 demo）。管理後台、資料庫、任何有敏感資料的服務都不要用 Funnel。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Tailscale Services&lt;a href=&quot;#tailscale-services&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Serve 有個先天限制：服務綁在&lt;strong&gt;裝置&lt;/strong&gt;上。網址是 &lt;code&gt;https://nas.&amp;lt;tailnet&amp;gt;.ts.net&lt;/code&gt;，機器換掉、服務搬家，網址就跟著變。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tailscale Services&lt;/strong&gt; 解決的就是這件事——把服務從裝置上剝離，變成一個獨立的實體。每個 Service 會拿到自己的 &lt;strong&gt;TailVIP&lt;/strong&gt;（虛擬 IP，IPv4 + IPv6 各一）與 MagicDNS 名稱 &lt;code&gt;&amp;lt;service-name&amp;gt;.&amp;lt;tailnet&amp;gt;.ts.net&lt;/code&gt;，跟節點一樣是一等公民。底下由哪台機器提供服務、有幾台在提供，使用者完全不需要知道。&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;比較&lt;/th&gt;&lt;th&gt;Serve&lt;/th&gt;&lt;th&gt;Services&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;位址綁定&lt;/td&gt;&lt;td&gt;裝置的 MagicDNS 名稱&lt;/td&gt;&lt;td&gt;服務自己的 TailVIP 與名稱&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;搬遷&lt;/td&gt;&lt;td&gt;網址跟著變&lt;/td&gt;&lt;td&gt;網址不變&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;多台提供&lt;/td&gt;&lt;td&gt;不行&lt;/td&gt;&lt;td&gt;可以，自動導流與容錯&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ACL 目標&lt;/td&gt;&lt;td&gt;&lt;code&gt;tag:server&lt;/code&gt; 等節點識別&lt;/td&gt;&lt;td&gt;&lt;code&gt;svc:web-server&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;適合&lt;/td&gt;&lt;td&gt;單機的個人服務&lt;/td&gt;&lt;td&gt;需要穩定位址、會搬遷或要做高可用的服務&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;p&gt;需求：Tailscale &lt;strong&gt;v1.86.0&lt;/strong&gt; 以上。提供服務的主機必須使用&lt;strong&gt;標籤身分 (tag)&lt;/strong&gt;，不能是綁在個人帳號下的節點——所以要先 &lt;code&gt;tailscale up --advertise-tags=tag:server&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;用戶端 v1.94 以上會自動探索 Services，不用設定。v1.93 以下的 Linux 用戶端要 &lt;code&gt;sudo tailscale set --accept-routes&lt;/code&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;1. 在後台定義 Service&lt;a href=&quot;#1-在後台定義-service&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Services → Advertise → Add Service&lt;/strong&gt;，填入：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服務名稱（會變成 &lt;code&gt;svc:&amp;lt;name&amp;gt;&lt;/code&gt; 與 MagicDNS 名稱）&lt;/li&gt;
&lt;li&gt;說明&lt;/li&gt;
&lt;li&gt;通訊埠與通訊協定，例如 &lt;code&gt;tcp:443&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;選填標籤，用來在 ACL 裡分組&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 在主機上設定端點&lt;a href=&quot;#2-在主機上設定端點&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;一行指令同時完成設定與宣告：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; --service=svc:web-server&lt;/span&gt;&lt;span&gt; --https=443&lt;/span&gt;&lt;span&gt; 127.0.0.1:8080&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTTPS 端點的 TLS 憑證由 Tailscale 自動簽發與續期。&lt;/p&gt;
&lt;p&gt;端點分三層，依需求選：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L7（應用層）&lt;/strong&gt;——&lt;code&gt;http&lt;/code&gt; / &lt;code&gt;https&lt;/code&gt;。支援路徑分流、身分注入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; --service=svc:app&lt;/span&gt;&lt;span&gt; --https=443&lt;/span&gt;&lt;span&gt; --set-path=/api&lt;/span&gt;&lt;span&gt; localhost:8081&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;L4（傳輸層）&lt;/strong&gt;——&lt;code&gt;tcp&lt;/code&gt; / &lt;code&gt;tls-terminated-tcp&lt;/code&gt;。純 TCP 轉送，不改封包，額外負擔比 L7 低，但不支援 &lt;code&gt;--set-path&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; --service=svc:db&lt;/span&gt;&lt;span&gt; --tcp:5432&lt;/span&gt;&lt;span&gt; tcp://localhost:5432&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;L3（網路層）&lt;/strong&gt;——僅 Linux，不管通訊協定的 IP 轉送，保留封包邊界，可搭配 OS 層 &lt;code&gt;iptables&lt;/code&gt; 設定支援 UDP：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; --service=svc:custom&lt;/span&gt;&lt;span&gt; --tun&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 後台核准&lt;a href=&quot;#3-後台核准&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;管理員到 &lt;strong&gt;Services&lt;/strong&gt; 頁面把待審的宣告按 &lt;strong&gt;Approve&lt;/strong&gt;。要免手動核准，在 Policy File 設 &lt;code&gt;autoApprovers&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;autoApprovers&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;services&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;svc:web-server&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;tag:server&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;tag:prod-service&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;tag:prod-infra&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 設定存取控制&lt;a href=&quot;#4-設定存取控制&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Service 可以直接當 &lt;code&gt;dst&lt;/code&gt;，比對節點寫 ACL 乾淨很多：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;grants&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;src&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;autogroup:member&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;dst&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;svc:web-server&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;ip&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;443&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;src&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;tag:prod-service&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;dst&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;svc:database&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;ip&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;5432&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;設定檔方式&lt;a href=&quot;#設定檔方式&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;要管理多個 Service，或想把設定納入版控，用 JSON 設定檔比一行行敲指令好維護。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;serveconfig.json&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;version&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;0.0.1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;services&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;svc:web-server&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;endpoints&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;tcp:443&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;https://localhost:443&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;advertised&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;欄位&lt;/th&gt;&lt;th&gt;必填&lt;/th&gt;&lt;th&gt;說明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;version&lt;/code&gt;&lt;/td&gt;&lt;td&gt;是&lt;/td&gt;&lt;td&gt;目前固定為 &lt;code&gt;&quot;0.0.1&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;services&lt;/code&gt;&lt;/td&gt;&lt;td&gt;是&lt;/td&gt;&lt;td&gt;服務定義，鍵為 &lt;code&gt;svc:&amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;endpoints&lt;/code&gt;&lt;/td&gt;&lt;td&gt;是&lt;/td&gt;&lt;td&gt;&lt;code&gt;協定:通訊埠&lt;/code&gt; 對應到本機目標，例如 &lt;code&gt;&quot;tcp:443&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;advertised&lt;/code&gt;&lt;/td&gt;&lt;td&gt;否&lt;/td&gt;&lt;td&gt;是否接受連線，預設 &lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;套用與宣告：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; set-config&lt;/span&gt;&lt;span&gt; --all&lt;/span&gt;&lt;span&gt; serveconfig.json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; advertise&lt;/span&gt;&lt;span&gt; svc:web-server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;設定檔方式是「設定」與「宣告」兩步分離，比 CLI 一行搞定更可控——可以先把設定推上去，確認無誤再宣告。&lt;/p&gt;
&lt;h3&gt;維運指令&lt;a href=&quot;#維運指令&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt; --json&lt;/span&gt;&lt;span&gt;                              # 看目前設定&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; drain&lt;/span&gt;&lt;span&gt; svc:web-server&lt;/span&gt;&lt;span&gt;                       # 排空：停收新連線，既有連線繼續處理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; --service=svc:web-server&lt;/span&gt;&lt;span&gt; --https=443&lt;/span&gt;&lt;span&gt; off&lt;/span&gt;&lt;span&gt;   # 移除單一端點&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; clear&lt;/span&gt;&lt;span&gt; svc:web-server&lt;/span&gt;&lt;span&gt;                       # 清掉該服務全部端點&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; advertise&lt;/span&gt;&lt;span&gt; svc:web-server&lt;/span&gt;&lt;span&gt;                   # 改完設定檔後重新宣告&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;確認本機是否為 service host：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt; --json&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; jq&lt;/span&gt;&lt;span&gt; &apos;.Self.CapMap.&quot;service-host&quot;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;服務狀態在後台可以看到：&lt;strong&gt;Pending approval&lt;/strong&gt;（待核准）、&lt;strong&gt;Needs configuration&lt;/strong&gt;（設定有誤或缺漏）、&lt;strong&gt;Connected&lt;/strong&gt;（至少一台在提供）、&lt;strong&gt;Offline&lt;/strong&gt;（沒有主機在宣告）、&lt;strong&gt;Pre-approved&lt;/strong&gt;（已預先核准但還沒宣告）、&lt;strong&gt;Draining&lt;/strong&gt;（排空中）。&lt;/p&gt;
&lt;h3&gt;高可用與滾動更新&lt;a href=&quot;#高可用與滾動更新&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;多台主機宣告同一個 Service 時，Tailscale 會自動把流量導到可用的主機。想在同區域內做負載平衡，要另外在 tailnet 開啟 &lt;strong&gt;regional routing&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;drain&lt;/code&gt; 讓滾動更新變得很單純：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 在要下線維護的主機上&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; drain&lt;/span&gt;&lt;span&gt; svc:web-server&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 等既有連線收乾，做你的維護&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 完成後重新宣告&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;span&gt; serve&lt;/span&gt;&lt;span&gt; advertise&lt;/span&gt;&lt;span&gt; svc:web-server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p&gt;Services 目前的限制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;只支援 TCP&lt;/strong&gt;。UDP 僅能透過 Linux 的 L3 端點加上手動 OS 設定實現&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只能接收連線&lt;/strong&gt;。TailVIP 不能主動發起對外連線&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留封包邊界只有 Linux 有&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;設定檔不支援 &lt;code&gt;text:&lt;/code&gt; 與 &lt;code&gt;file:&lt;/code&gt; 目標，那兩種只能用 CLI&lt;/li&gt;
&lt;li&gt;主機有多張網路介面、且遠端目標不在預設路由表裡時，Linux（缺少 &lt;code&gt;SO_MARK&lt;/code&gt;）與 macOS App Store 版可能連不到遠端資源。變通做法是改用 userspace networking 模式&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2&gt;Docker 部署&lt;a href=&quot;#docker-部署&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;官方映像檔是 &lt;code&gt;tailscale/tailscale&lt;/code&gt;。有兩種常見用法。&lt;/p&gt;
&lt;h3&gt;事前準備：Auth Key&lt;a href=&quot;#事前準備auth-key&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;容器裡沒辦法互動式登入，要先在後台 &lt;strong&gt;Settings → Keys&lt;/strong&gt; 產生一個 Auth Key。建議勾選：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reusable&lt;/strong&gt;：需要重建容器時不用一直換 key&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ephemeral&lt;/strong&gt;：容器離線後自動從 tailnet 移除節點，避免後台一堆殭屍裝置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tags&lt;/strong&gt;：綁定 &lt;code&gt;tag:container&lt;/code&gt; 之類的標籤，方便寫 ACL&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;用法一：獨立節點 + 子網路由&lt;a href=&quot;#用法一獨立節點--子網路由&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;讓容器本身當一個節點，順便代理 Docker 網段。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  tailscale&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;tailscale/tailscale:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    hostname&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;docker-host&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;TS_AUTHKEY=tskey-auth-xxxxx&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;TS_STATE_DIR=/var/lib/tailscale&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;TS_ROUTES=172.20.0.0/16&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;TS_EXTRA_ARGS=--advertise-exit-node&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;TS_USERSPACE=false&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./tailscale-state:/var/lib/tailscale&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    devices&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/dev/net/tun:/dev/net/tun&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    cap_add&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;NET_ADMIN&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;SYS_MODULE&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;用法二：Sidecar 模式&lt;a href=&quot;#用法二sidecar-模式&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;讓某個服務&lt;strong&gt;只透過 Tailscale&lt;/strong&gt; 存取，完全不開對外通訊埠。關鍵是 &lt;code&gt;network_mode: service:tailscale&lt;/code&gt;，讓服務共用 Tailscale 容器的網路命名空間。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  tailscale&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;tailscale/tailscale:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    hostname&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;my-app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;TS_AUTHKEY=tskey-auth-xxxxx&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;TS_STATE_DIR=/var/lib/tailscale&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;TS_SERVE_CONFIG=/config/serve.json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./tailscale-state:/var/lib/tailscale&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./serve.json:/config/serve.json:ro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;nginx:alpine&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    network_mode&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;service:tailscale&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    depends_on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;serve.json&lt;/code&gt; 讓 Tailscale 直接處理 HTTPS：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;TCP&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;443&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;HTTPS&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; } },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;Web&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;${TS_CERT_DOMAIN}:443&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;Handlers&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;/&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;Proxy&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;http://127.0.0.1:80&quot;&lt;/span&gt;&lt;span&gt; } }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣 &lt;code&gt;app&lt;/code&gt; 完全沒有對外通訊埠，只有 tailnet 內連得到 &lt;code&gt;https://my-app.&amp;lt;tailnet&amp;gt;.ts.net&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;用法三：官方 Docker Compose 範例&lt;a href=&quot;#用法三官方-docker-compose-範例&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://tailscale.com/docs/features/containers/docker/how-to/connect-docker-container&quot;&gt;官方文件&lt;/a&gt;的入門寫法，最單純：Tailscale 容器獨立跑，服務容器照舊 publish 埠到 host。&lt;/p&gt;
&lt;p&gt;步驟：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;到後台 &lt;strong&gt;Settings → Keys&lt;/strong&gt; 產生 Auth Key，複製起來（只會顯示一次）&lt;/li&gt;
&lt;li&gt;建立 &lt;code&gt;docker-compose.yml&lt;/code&gt;，把 &lt;code&gt;&amp;lt;tskey-YOUR-AUTH-KEY&amp;gt;&lt;/code&gt; 換成剛剛的金鑰&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;到後台 &lt;strong&gt;Machines&lt;/strong&gt; 確認 &lt;code&gt;tailscale-nginx&lt;/code&gt; 已加入 tailnet&lt;/li&gt;
&lt;li&gt;從 tailnet 上任一裝置連 Docker host 的 &lt;code&gt;8080&lt;/code&gt; 埠&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  tailscale&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;tailscale/tailscale:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    hostname&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;tailscale-nginx&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;TS_AUTHKEY=&amp;lt;tskey-YOUR-AUTH-KEY&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;TS_STATE_DIR=/var/lib/tailscale&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./tailscale-state:/var/lib/tailscale&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    cap_add&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;net_admin&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;net_raw&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;nginx_server&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;8080:80&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    depends_on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;tailscale&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只有兩個環境變數：&lt;code&gt;TS_AUTHKEY&lt;/code&gt; 認證、&lt;code&gt;TS_STATE_DIR&lt;/code&gt; 搭配 volume 保存狀態。&lt;code&gt;net_admin&lt;/code&gt; 與 &lt;code&gt;net_raw&lt;/code&gt; 讓容器能建立 &lt;code&gt;tun&lt;/code&gt; 介面走核心態網路，不加的話只能跑 userspace 模式，效能較差。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;這個範例裡 nginx 是&lt;strong&gt;用 &lt;code&gt;ports&lt;/code&gt; 開在 Docker host 上&lt;/strong&gt;的，跟 Tailscale 容器沒有共用網路。也就是說：它同時對 host 所在的實體區域網路開放，不是只有 tailnet 連得到。&lt;/p&gt;
&lt;p&gt;拿來熟悉流程很好，正式用要收緊的話：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;想要&lt;strong&gt;只有 tailnet 連得到 + 自動 HTTPS&lt;/strong&gt; → 改用&lt;strong&gt;用法二&lt;/strong&gt;的 sidecar&lt;/li&gt;
&lt;li&gt;想讓 tailnet 直接連&lt;strong&gt;容器 IP&lt;/strong&gt;、完全不開 host 埠 → 改用&lt;strong&gt;用法一&lt;/strong&gt;的子網路由&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;用法&lt;/th&gt;&lt;th&gt;曝露範圍&lt;/th&gt;&lt;th&gt;位址&lt;/th&gt;&lt;th&gt;適合&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;一：獨立節點+子網路由&lt;/td&gt;&lt;td&gt;只有 tailnet&lt;/td&gt;&lt;td&gt;容器 IP，例如 &lt;code&gt;172.20.0.5:8080&lt;/code&gt;&lt;/td&gt;&lt;td&gt;服務多、想省節點數&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;二：Sidecar&lt;/td&gt;&lt;td&gt;只有 tailnet&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://&amp;lt;name&amp;gt;.&amp;lt;tailnet&amp;gt;.ts.net&lt;/code&gt;&lt;/td&gt;&lt;td&gt;要 HTTPS、要穩定名稱&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;三：官方入門範例&lt;/td&gt;&lt;td&gt;tailnet &lt;strong&gt;＋&lt;/strong&gt; host 區網&lt;/td&gt;&lt;td&gt;Docker host IP + 埠&lt;/td&gt;&lt;td&gt;練習、內網本來就可信任&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;p&gt;官方的範例集在 &lt;a href=&quot;https://github.com/tailscale-dev/docker-guide-code-examples&quot;&gt;tailscale-dev/docker-guide-code-examples&lt;/a&gt;，除了 nginx 還有 OAuth 認證、Mealie、Immich（含 GPU）、Actual Server 等完整範例，也附了一份 &lt;code&gt;example-acls.hujson&lt;/code&gt;。Podman 可以直接套用不用改。&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;常用環境變數&lt;a href=&quot;#常用環境變數&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;


























































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;變數&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;th&gt;預設值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_AUTHKEY&lt;/code&gt;&lt;/td&gt;&lt;td&gt;加入 tailnet 的授權金鑰&lt;/td&gt;&lt;td&gt;未設定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_HOSTNAME&lt;/code&gt;&lt;/td&gt;&lt;td&gt;節點在 tailnet 的名稱&lt;/td&gt;&lt;td&gt;自動產生&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_STATE_DIR&lt;/code&gt;&lt;/td&gt;&lt;td&gt;狀態存放目錄，&lt;strong&gt;一定要掛 volume&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;未設定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_ROUTES&lt;/code&gt;&lt;/td&gt;&lt;td&gt;宣告子網路由&lt;/td&gt;&lt;td&gt;未設定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_USERSPACE&lt;/code&gt;&lt;/td&gt;&lt;td&gt;使用者空間網路模式&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_ACCEPT_DNS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;接受後台的 DNS 設定&lt;/td&gt;&lt;td&gt;不接受&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_SERVE_CONFIG&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Serve / Funnel 設定的 JSON 檔&lt;/td&gt;&lt;td&gt;未設定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_AUTH_ONCE&lt;/code&gt;&lt;/td&gt;&lt;td&gt;只認證一次，而非每次啟動都認證&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_DEST_IP&lt;/code&gt;&lt;/td&gt;&lt;td&gt;把進來的 tailnet 流量全部轉給某個 IP&lt;/td&gt;&lt;td&gt;未設定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_TAILNET_TARGET_IP&lt;/code&gt;&lt;/td&gt;&lt;td&gt;反向：把流量代理到 tailnet 內某個 IP&lt;/td&gt;&lt;td&gt;未設定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_TAILNET_TARGET_FQDN&lt;/code&gt;&lt;/td&gt;&lt;td&gt;同上，用 MagicDNS 名稱指定&lt;/td&gt;&lt;td&gt;未設定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_SOCKS5_SERVER&lt;/code&gt;&lt;/td&gt;&lt;td&gt;開 SOCKS5 代理的位址與通訊埠&lt;/td&gt;&lt;td&gt;未設定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_ENABLE_HEALTH_CHECK&lt;/code&gt;&lt;/td&gt;&lt;td&gt;開啟 &lt;code&gt;/healthz&lt;/code&gt; 端點&lt;/td&gt;&lt;td&gt;未啟用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_EXTRA_ARGS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;附加給 &lt;code&gt;tailscale up&lt;/code&gt; 的旗標&lt;/td&gt;&lt;td&gt;未設定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_TAILSCALED_EXTRA_ARGS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;附加給 &lt;code&gt;tailscaled&lt;/code&gt; 的旗標&lt;/td&gt;&lt;td&gt;未設定&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TS_EXPERIMENTAL_SERVICE_AUTO_ADVERTISEMENT&lt;/code&gt;&lt;/td&gt;&lt;td&gt;啟動時自動宣告 Tailscale Services&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;p&gt;&lt;code&gt;TS_STATE_DIR&lt;/code&gt; &lt;strong&gt;沒有掛 volume 的話&lt;/strong&gt;，每次重建容器都會被視為全新裝置重新加入 tailnet。後台會累積一堆同名節點（&lt;code&gt;my-app-1&lt;/code&gt;、&lt;code&gt;my-app-2&lt;/code&gt;…），MagicDNS 名稱也跟著跑掉。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TS_USERSPACE&lt;/code&gt; 預設是 &lt;code&gt;true&lt;/code&gt;，這種模式不需要 &lt;code&gt;NET_ADMIN&lt;/code&gt; 與 &lt;code&gt;/dev/net/tun&lt;/code&gt;，但效能較差、也不能當子網路由或出口節點。要做這兩件事就得設 &lt;code&gt;TS_USERSPACE=false&lt;/code&gt; 並補上 &lt;code&gt;cap_add&lt;/code&gt; 與 &lt;code&gt;devices&lt;/code&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;容器提供 Service&lt;a href=&quot;#容器提供-service&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sidecar 模式搭配 Tailscale Services 是很順的組合——容器本來就是會被重建、會換機器的東西，正好需要一個與裝置解耦的位址。&lt;/p&gt;
&lt;p&gt;把 &lt;code&gt;TS_SERVE_CONFIG&lt;/code&gt; 指向 Service 格式的設定檔即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;version&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;0.0.1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;services&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;svc:web-server&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;endpoints&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;tcp:443&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;http://127.0.0.1:80&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;容器啟動時會自動宣告（由 &lt;code&gt;TS_EXPERIMENTAL_SERVICE_AUTO_ADVERTISEMENT&lt;/code&gt; 控制，預設 &lt;code&gt;true&lt;/code&gt;）。Auth Key 記得綁 tag——Service 主機必須是標籤身分。&lt;/p&gt;
&lt;p&gt;同一個 Service 在多台機器上跑相同的容器，就直接得到高可用：滾動更新時逐台 &lt;code&gt;tailscale serve drain&lt;/code&gt;，位址不變、使用者無感。&lt;/p&gt;
&lt;h2&gt;存取控制 (ACL)&lt;a href=&quot;#存取控制-acl&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;預設的 Policy File 是&lt;strong&gt;全部開放&lt;/strong&gt;——tailnet 內任何裝置都連得到任何裝置。只有自己用還行，多人或多用途的環境該收緊。&lt;/p&gt;
&lt;p&gt;一個實際的例子：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;tagOwners&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;tag:server&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;autogroup:admin&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;tag:container&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;autogroup:admin&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;grants&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;src&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;autogroup:admin&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;dst&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;*&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;ip&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;*:*&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;src&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;group:family&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;dst&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;tag:server&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;ip&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;tcp:8096&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;groups&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;group:family&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;alice@example.com&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;bob@example.com&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這份規則的意思是：管理員能連所有東西，家人只能連到帶 &lt;code&gt;tag:server&lt;/code&gt; 標籤的機器的 8096 埠（Jellyfin），其他一律拒絕。&lt;/p&gt;
&lt;p&gt;節點加標籤：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; tailscale&lt;/span&gt;&lt;span&gt; up&lt;/span&gt;&lt;span&gt; --advertise-tags=tag:server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p&gt;加了標籤的節點&lt;strong&gt;所有權會轉移給標籤&lt;/strong&gt;，不再屬於原本的使用者，也不會受該使用者的權限影響。伺服器類的節點建議都打標籤，這樣 ACL 才寫得乾淨，而且成員離職時不會連帶影響伺服器。&lt;/p&gt;
&lt;p&gt;另外注意：加標籤需要重新認證，&lt;code&gt;tailscale set --advertise-tags&lt;/code&gt; 不能用，要用 &lt;code&gt;tailscale up&lt;/code&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;常見問題&lt;a href=&quot;#常見問題&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;連線一直走 relay 不是 direct&lt;a href=&quot;#連線一直走-relay-不是-direct&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;tailscale netcheck&lt;/code&gt; 看自己的 NAT 型態。兩邊都是對稱式 NAT (symmetric NAT) 的話打洞會失敗，只能走中繼。改善方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;路由器關掉 UPnP 以外的嚴格 NAT 設定，或改用 Full Cone NAT&lt;/li&gt;
&lt;li&gt;在其中一邊設定固定的 WireGuard 通訊埠並做通訊埠轉發：&lt;code&gt;tailscaled --port=41641&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;有一台有公開 IP 的機器就讓它當節點，變成事實上的直連對象&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;忘記開 IP 轉送&lt;a href=&quot;#忘記開-ip-轉送&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;子網路由與出口節點最常見的問題。&lt;code&gt;tailscale status&lt;/code&gt; 看起來一切正常、節點也 ping 得到，但流量就是過不去。檢查：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sysctl&lt;/span&gt;&lt;span&gt; net.ipv4.ip_forward&lt;/span&gt;&lt;span&gt;   # 要是 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;DNS 突然壞掉&lt;a href=&quot;#dns-突然壞掉&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;MagicDNS 跟本機 DNS 服務衝突。先 &lt;code&gt;sudo tailscale set --accept-dns=false&lt;/code&gt; 確認是不是這個原因。&lt;/p&gt;
&lt;h3&gt;後台一堆離線的殭屍節點&lt;a href=&quot;#後台一堆離線的殭屍節點&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;容器沒掛 state volume，或是 Auth Key 沒設 Ephemeral。後台手動刪掉，然後修設定。&lt;/p&gt;
&lt;h2&gt;結語&lt;a href=&quot;#結語&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tailscale 最大的價值是&lt;strong&gt;把「安全連回內網」這件事的設定成本壓到幾乎為零&lt;/strong&gt;。不用開通訊埠、不用管憑證、不用處理浮動 IP，裝完登入就有一個私有網路。&lt;/p&gt;
&lt;p&gt;實務上我的配置大致是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;家裡一台常開的 Linux 機器做&lt;strong&gt;子網路由 + 出口節點&lt;/strong&gt;，涵蓋整個 &lt;code&gt;192.168.1.0/24&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;那台同時是 &lt;strong&gt;Global nameserver&lt;/strong&gt;，跑 AdGuard Home，所有節點連上就自動過濾廣告&lt;/li&gt;
&lt;li&gt;需要單獨曝露的容器化服務用 &lt;strong&gt;Sidecar 模式&lt;/strong&gt; + &lt;code&gt;serve.json&lt;/code&gt;，完全不開對外通訊埠&lt;/li&gt;
&lt;li&gt;會搬遷或要做高可用的服務改用 &lt;strong&gt;Tailscale Services&lt;/strong&gt;，位址跟裝置脫鉤&lt;/li&gt;
&lt;li&gt;伺服器節點全部打 &lt;code&gt;tag:server&lt;/code&gt;，ACL 只放行必要的通訊埠&lt;/li&gt;
&lt;li&gt;完全不用 &lt;strong&gt;Funnel&lt;/strong&gt;，除非真的需要對外公開&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不確定要不要開某項功能的時候，原則跟其他網路設定一樣：&lt;strong&gt;先關著，等真的需要再開&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;參考資料&lt;a href=&quot;#參考資料&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/kb/1017/install&quot;&gt;Tailscale Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/kb/1031/install-linux&quot;&gt;Install on Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/kb/1019/subnets&quot;&gt;Subnet routers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/kb/1103/exit-nodes&quot;&gt;Exit nodes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/kb/1081/magicdns&quot;&gt;MagicDNS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/kb/1193/tailscale-ssh&quot;&gt;Tailscale SSH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/kb/1312/serve&quot;&gt;Tailscale Serve&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/kb/1223/funnel&quot;&gt;Tailscale Funnel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/docs/features/tailscale-services&quot;&gt;Tailscale Services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/docs/reference/tailscale-services-configuration-file&quot;&gt;Tailscale Services 設定檔&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/docs/reference/tailscale-cli/serve&quot;&gt;tailscale serve 指令參考&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/blog/four-ways-tailscale-service&quot;&gt;Four increasingly sophisticated ways to put a service on your tailnet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/kb/1282/docker&quot;&gt;Tailscale with Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/docs/features/containers/docker/how-to/connect-docker-container&quot;&gt;Connect a Docker container to your tailnet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tailscale-dev/docker-guide-code-examples&quot;&gt;官方 Docker 範例集&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/docs/features/containers/docker/docker-params&quot;&gt;Docker configuration parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/kb/1337/policy-syntax&quot;&gt;Tailnet policy file syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/kb/1085/auth-keys&quot;&gt;Auth keys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailscale.com/blog/how-nat-traversal-works&quot;&gt;NAT traversal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>category:linux</category><category>category:tailscale</category><category>tag:Docker</category><category>tag:Linux</category><category>tag:Tailscale</category></item><item><title>Pangolin 安裝筆記</title><link>https://blog.thanatosdi.work/post/linux/pangolin-%E5%AE%89%E8%A3%9D%E7%AD%86%E8%A8%98</link><guid isPermaLink="false">linux/pangolin-安裝筆記</guid><description>Pangolin 安裝筆記
前言
家裡放了一台 NAS、一台跑 Docker 的小主機，或是租了幾台散落各地的 VPS，接著問題就來了：要怎麼從外面連回去？
傳統做法不外乎那幾種：跟 ISP 要固定 IP、在路由器上開通訊埠轉發 (Port</description><pubDate>Mon, 27 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Pangolin 安裝筆記&lt;a href=&quot;#pangolin-安裝筆記&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;前言&lt;a href=&quot;#前言&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;家裡放了一台 NAS、一台跑 Docker 的小主機，或是租了幾台散落各地的 VPS，接著問題就來了：要怎麼從外面連回去？&lt;/p&gt;
&lt;p&gt;傳統做法不外乎那幾種：跟 ISP 要固定 IP、在路由器上開通訊埠轉發 (Port forwarding)、再自己架一套反向代理處理憑證。但只要遇上 CGNAT、浮動 IP，或是路由器根本不歸你管，這條路直接斷掉。就算通了，把 80、443、22 port 曝露在網際網路上，也等於每天被掃描機器人敲門問候。&lt;/p&gt;
&lt;p&gt;Pangolin 就是來解這個問題的。&lt;/p&gt;
&lt;p&gt;Pangolin 是什麼？Tailscale 或多或少應該有聽過，那 Cloudflare Tunnel 呢？其實這三者是相似的產品，差別在於 Pangolin 是開源專案，可以完全自架在自己的 VPS 上，資料不用經過第三方。&lt;/p&gt;
&lt;p&gt;那 Pangolin 能幹嘛？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;反向代理&lt;/strong&gt;：內建 Traefik，自動申請與續期 Let&apos;s Encrypt 憑證，設定都在 Web UI 上點一點就好&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;穿透防火牆&lt;/strong&gt;：透過 WireGuard 建立 tunnel，內網機器主動往外連，完全不需要通訊埠轉發，CGNAT 環境照樣能用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;零信任驗證 (Zero Trust)&lt;/strong&gt;：在服務前面加上一層身分驗證，支援 PIN、一次性密碼、OIDC SSO，未通過驗證的請求根本碰不到後端服務&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全 SSH&lt;/strong&gt;：主機不用對外開 22 port，一樣能從外面安全地連進去操作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;簡單說，就是用一台便宜的有 public IP 的 VPS 當入口，把散落各處的內網服務通通串起來，並且統一管理誰能存取什麼。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;Pangolin 比較適合了解 Linux 系統的使用者，或者平時有在管理雲端主機的使用者&lt;/p&gt;
&lt;p&gt;如果一般使用者比較推薦使用 Tailscale 或 Cloudflare 兩者&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;這篇筆記記錄 Pangolin 的安裝與設定過程。&lt;/p&gt;
&lt;h2&gt;Pangolin 是怎麼運作的&lt;a href=&quot;#pangolin-是怎麼運作的&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在動手裝之前，先花三分鐘搞懂它的架構，後面設定會順很多。整套東西拆成兩邊：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一台有 public IP 的 VPS&lt;/strong&gt;，跑 Pangolin 本體。這台是唯一對網際網路曝露的機器，也是所有流量的入口。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;你想要被存取的那些機器&lt;/strong&gt;（家裡的 NAS、公司的伺服器、朋友家的 Raspberry Pi），各自跑一個叫 &lt;strong&gt;Newt&lt;/strong&gt; 的小連接器。Newt 會主動往 VPS 建立一條 WireGuard 加密隧道 — 注意是「主動往外連」，所以這些機器完全不需要固定 IP、不需要開通訊埠、在 CGNAT 底下也照樣能用。&lt;/p&gt;
&lt;p&gt;VPS 上實際跑起來的容器有這幾個，知道名字就好：&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;元件&lt;/th&gt;&lt;th&gt;角色&lt;/th&gt;&lt;th&gt;白話解釋&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Pangolin&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;控制平面&lt;/td&gt;&lt;td&gt;資料庫、Web 管理介面、API。你所有的設定都存在這&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Traefik&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;反向代理&lt;/td&gt;&lt;td&gt;負責 HTTPS 憑證、把網域名稱對應到正確的後端服務&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Gerbil&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;隧道管理員&lt;/td&gt;&lt;td&gt;管理所有 WireGuard 連線，Newt 和用戶端都是連到它&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Badger&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;驗證中介層&lt;/td&gt;&lt;td&gt;Traefik 的外掛，在請求進入後端前先擋下來檢查身分&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Newt&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;站點連接器&lt;/td&gt;&lt;td&gt;裝在你的機器上，負責建立隧道跟轉發流量&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;流量走向長這樣：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;公開資源：  瀏覽器 → Traefik → Badger（驗證）→ Gerbil → Newt → 你的服務&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;私有資源：  Pangolin 用戶端 ←─ WireGuard ─→ Newt → 你的服務&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;三個一定要搞懂的名詞&lt;a href=&quot;#三個一定要搞懂的名詞&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pangolin 的管理介面圍繞著三個概念在轉，這三個沒搞清楚就會一直卡住：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site（站點）&lt;/strong&gt; — 一個「網路」。通常等於一台跑著 Newt 的機器，或者說「家裡那個網段」。你有幾個地點的機器要接進來，就建幾個 Site。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Resource（資源）&lt;/strong&gt; — 一個「你要開放出去的服務」。例如「家裡的 Jellyfin」、「NAS 的管理介面」、「開發機的 SSH」。資源分兩種：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;公開資源 (Public)&lt;/strong&gt;：透過網域名稱從瀏覽器直接存取，前面有 Pangolin 的驗證關卡擋著。不用裝任何用戶端。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;私有資源 (Private)&lt;/strong&gt;：真正的零信任 VPN，完全不對外曝露，必須裝 Pangolin 用戶端才連得到。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Target（目標）&lt;/strong&gt; — 資源實際指向的後端位址，也就是 &lt;code&gt;IP:Port&lt;/code&gt;。例如 &lt;code&gt;192.168.1.50:8096&lt;/code&gt;。一個資源可以掛多個 Target 做負載平衡。&lt;/p&gt;
&lt;p&gt;理解成這樣就對了：&lt;strong&gt;Site 是通道，Resource 是門，Target 是門後面的房間。&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;Pangolin 的預設是「全部拒絕」。裝好之後你的內網不會突然對外開放，每一個要能被存取的服務，都得由你手動建立成 Resource 才會通。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;開始之前的準備&lt;a href=&quot;#開始之前的準備&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;一台 VPS&lt;a href=&quot;#一台-vps&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;規格不用高，Pangolin 本身很輕量：&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;用途&lt;/th&gt;&lt;th&gt;建議規格&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;最低可跑&lt;/td&gt;&lt;td&gt;1 vCPU / 2GB RAM / 8GB SSD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;一般自架（推薦）&lt;/td&gt;&lt;td&gt;2 vCPU / 2GB RAM / 20GB SSD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;多站點、流量較大&lt;/td&gt;&lt;td&gt;4 vCPU / 4GB RAM / 40GB SSD&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;作業系統建議 Ubuntu 20.04 以上或 Debian 11 以上，需要 root 權限跟一個 public IP。&lt;/p&gt;
&lt;p&gt;真正要留意的不是 CPU 跟記憶體，是&lt;strong&gt;流量&lt;/strong&gt;。所有經過隧道的資料都會過這台 VPS，如果你要串流 4K 影片，月流量很容易破表。一般 VPS 方案含 1~2TB/月，超過通常要另外收費。挑機房也盡量挑離你近的，延遲直接影響體感。&lt;/p&gt;
&lt;h3&gt;一個網域&lt;a href=&quot;#一個網域&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;要有一個自己的網域，例如 &lt;code&gt;example.com&lt;/code&gt;。Pangolin 會用子網域來區分不同的服務（&lt;code&gt;nas.example.com&lt;/code&gt;、&lt;code&gt;jellyfin.example.com&lt;/code&gt;…），所以網域是必需品，不是選配。&lt;/p&gt;
&lt;h3&gt;DNS 設定&lt;a href=&quot;#dns-設定&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;到你的 DNS 供應商那邊加上這兩筆 A 記錄：&lt;/p&gt;























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;類型&lt;/th&gt;&lt;th&gt;名稱&lt;/th&gt;&lt;th&gt;值&lt;/th&gt;&lt;th&gt;TTL&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;&lt;td&gt;你的 VPS IP&lt;/td&gt;&lt;td&gt;300&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;&lt;code&gt;@&lt;/code&gt;&lt;/td&gt;&lt;td&gt;你的 VPS IP&lt;/td&gt;&lt;td&gt;300&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;第一筆萬用字元 (wildcard) 記錄是關鍵 — 它讓&lt;strong&gt;任何&lt;/strong&gt;子網域都指向你的 VPS。這樣以後每加一個新服務，你只要在 Pangolin 介面裡填個子網域名稱就好，不用再回 DNS 加記錄。第二筆根網域是選配。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;如果你用 Cloudflare 管理 DNS，這兩筆記錄請先設成 &lt;strong&gt;DNS only&lt;/strong&gt;（灰色雲朵），不要開橘色雲朵的 Proxy。Proxy 開著會擋掉 Let&apos;s Encrypt 的驗證流程，也會干擾 WireGuard。等一切都跑起來之後再看官方的 &lt;a href=&quot;https://docs.pangolin.net/self-host/advanced/cloudflare-proxy&quot;&gt;Cloudflare Proxy&lt;/a&gt; 文件決定要不要開。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;設定完可以等個幾分鐘，用這個指令確認 DNS 生效了沒：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;dig&lt;/span&gt;&lt;span&gt; +short&lt;/span&gt;&lt;span&gt; test.example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有回傳你的 VPS IP 就對了。&lt;/p&gt;
&lt;h3&gt;防火牆&lt;a href=&quot;#防火牆&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;VPS 上要放行這四個 port：&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Port&lt;/th&gt;&lt;th&gt;協定&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;80&lt;/td&gt;&lt;td&gt;TCP&lt;/td&gt;&lt;td&gt;HTTP，Let&apos;s Encrypt 憑證驗證用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;443&lt;/td&gt;&lt;td&gt;TCP&lt;/td&gt;&lt;td&gt;HTTPS，所有網頁流量跟管理介面&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;51820&lt;/td&gt;&lt;td&gt;UDP&lt;/td&gt;&lt;td&gt;站點隧道（Newt 連到 Gerbil）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;21820&lt;/td&gt;&lt;td&gt;UDP&lt;/td&gt;&lt;td&gt;用戶端隧道（Pangolin 用戶端連進來）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;以 &lt;code&gt;ufw&lt;/code&gt; 為例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; ufw&lt;/span&gt;&lt;span&gt; allow&lt;/span&gt;&lt;span&gt; 80/tcp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; ufw&lt;/span&gt;&lt;span&gt; allow&lt;/span&gt;&lt;span&gt; 443/tcp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; ufw&lt;/span&gt;&lt;span&gt; allow&lt;/span&gt;&lt;span&gt; 51820/udp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; ufw&lt;/span&gt;&lt;span&gt; allow&lt;/span&gt;&lt;span&gt; 21820/udp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; ufw&lt;/span&gt;&lt;span&gt; enable&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你的 VPS 供應商有另外一層雲端防火牆（DigitalOcean、AWS 安全群組之類的），記得那邊也要開。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;SSH 的 22 port 在設定好 Pangolin 之前都先綁定家裡特定 IP 才能通過防火牆，不要設定成 &lt;code&gt;0.0.0.0/0&lt;/code&gt; 都可以訪問到 22 port。等 Pangolin 設定完成後再改走 Pangolin 。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;安裝 Pangolin&lt;a href=&quot;#安裝-pangolin&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.pangolin.net/self-host/quick-install&quot;&gt;官方說明&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;安裝腳本會幫你把 Docker、Docker Compose 跟所有設定檔都準備好，實際上你只要跑兩行指令。&lt;/p&gt;
&lt;p&gt;先切到你想安裝的目錄（設定檔跟資料都會放在這，建議找個好記的地方）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; mkdir&lt;/span&gt;&lt;span&gt; -p&lt;/span&gt;&lt;span&gt; /opt/pangolin&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; /opt/pangolin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下載安裝程式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -fsSL&lt;/span&gt;&lt;span&gt; https://static.pangolin.net/get-installer.sh&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這支腳本會自動判斷你的架構（AMD64 / ARM64）抓對應的執行檔，跑完會在當前目錄留下一個 &lt;code&gt;installer&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;執行安裝：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; ./installer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安裝過程會問的問題&lt;a href=&quot;#安裝過程會問的問題&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;安裝程式是互動式的，會依序問你這幾件事：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 選擇版本&lt;/strong&gt; — 選 &lt;strong&gt;Community&lt;/strong&gt;（社群版，免費開源）。Enterprise 是商業授權版，個人自架用不到。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Base Domain（根網域）&lt;/strong&gt; — 填你的根網域，&lt;strong&gt;不要帶子網域&lt;/strong&gt;。例如 &lt;code&gt;example.com&lt;/code&gt;，不是 &lt;code&gt;www.example.com&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Dashboard Domain（管理介面網域）&lt;/strong&gt; — 管理後台要用的網址，預設是 &lt;code&gt;pangolin.example.com&lt;/code&gt;。可以改成你喜歡的，例如 &lt;code&gt;admin.example.com&lt;/code&gt;。直接按 Enter 用預設值也行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Let&apos;s Encrypt Email&lt;/strong&gt; — 填一個真實信箱。這個信箱有兩個用途：一是憑證即將到期時 Let&apos;s Encrypt 會寄通知，二是&lt;strong&gt;這也會是你之後登入管理後台的帳號&lt;/strong&gt;，所以別亂填。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. 是否安裝 Gerbil&lt;/strong&gt; — 選 &lt;strong&gt;是&lt;/strong&gt;。Gerbil 是負責 WireGuard 隧道的元件，不裝的話就沒有穿透防火牆的能力，Pangolin 就退化成一個普通的反向代理了。除非你所有服務都跑在這台 VPS 上，否則一定要裝。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Email（SMTP）設定&lt;/strong&gt; — 這個是選配，預設關閉，可以先跳過。之後想開通「email 一次性驗證碼」或「密碼重設信」等功能，再回頭改設定檔就好。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7. 確認安裝&lt;/strong&gt; — 確認後開始拉 Docker 映像檔（pangolin、gerbil、traefik）並啟動容器，大概 2~3 分鐘。&lt;/p&gt;
&lt;p&gt;跑完之後檢查一下容器狀態：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; ps&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;pangolin&lt;/code&gt;、&lt;code&gt;gerbil&lt;/code&gt;、&lt;code&gt;traefik&lt;/code&gt; 三個都是 &lt;code&gt;Up&lt;/code&gt; 就成功了。&lt;/p&gt;
&lt;h2&gt;初始設定&lt;a href=&quot;#初始設定&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;取得 Setup Token&lt;a href=&quot;#取得-setup-token&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;第一次登入需要一組安全權杖，它印在 pangolin 容器的日誌裡：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; logs&lt;/span&gt;&lt;span&gt; pangolin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在輸出裡找類似 &lt;code&gt;Setup token: xxxxxxxx&lt;/code&gt; 的字樣，把它複製起來。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;如果日誌太長翻不到，可以用 &lt;code&gt;sudo docker compose logs pangolin | grep -i token&lt;/code&gt; 過濾。&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;建立管理員帳號&lt;a href=&quot;#建立管理員帳號&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;瀏覽器打開：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;https://&amp;lt;你的管理介面網域&amp;gt;/auth/initial-setup&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如 &lt;code&gt;https://pangolin.example.com/auth/initial-setup&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果這頁打不開，先別急著懷疑 Pangolin，八成是 DNS 還沒生效或防火牆沒開。回去檢查上面的準備步驟。&lt;/p&gt;
&lt;p&gt;頁面上依序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;貼上剛剛複製的 Setup Token&lt;/li&gt;
&lt;li&gt;輸入管理員 email&lt;/li&gt;
&lt;li&gt;設定一組夠強的密碼 — 這是整個系統的最高權限帳號，別偷懶&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;建立組織 (Organization)&lt;a href=&quot;#建立組織-organization&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;建好帳號後會要你建立第一個 Organization，填個名稱跟說明就好，例如「我家」。組織是 Pangolin 用來分隔資源跟權限的最上層容器，個人自架通常一個就夠。&lt;/p&gt;
&lt;p&gt;到這裡你已經有一個能用的 Pangolin 了，但它現在還沒有任何東西可以連 — 因為還沒有 Site。&lt;/p&gt;
&lt;h2&gt;建立第一個 Site&lt;a href=&quot;#建立第一個-site&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Site 代表「你的服務所在的那個網路」。假設現在要把家裡 NAS 上的服務接進來，那就得在 NAS（或家裡任何一台常開的機器）上裝 Newt。&lt;/p&gt;
&lt;h3&gt;在後台建立 Site&lt;a href=&quot;#在後台建立-site&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 Pangolin 後台側邊欄找到 &lt;strong&gt;Sites&lt;/strong&gt; → 新增。&lt;/p&gt;
&lt;p&gt;需要選擇 Site 類型，有三種：&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;類型&lt;/th&gt;&lt;th&gt;什麼時候用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Newt&lt;/strong&gt;（推薦）&lt;/td&gt;&lt;td&gt;絕大多數情況。功能最完整，支援公開資源、私有資源、SSH/RDP/VNC、健康檢查、負載平衡&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Local&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;服務就跑在 Pangolin 這台 VPS 上，不需要隧道。不支援私有資源跟健康檢查&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Basic WireGuard&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;進階場景，手動設定原生 WireGuard，不用 Newt。功能限制多，一般不建議&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;選 &lt;strong&gt;Newt&lt;/strong&gt;，取個名字（例如「家裡」），建立。&lt;/p&gt;
&lt;p&gt;建立完成後，Pangolin 會顯示一組&lt;strong&gt;連線憑證&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Newt ID:     31fsdasdasp721&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Newt Secret: h51mmlkasdsadasdasdagrwumt6isgbpyavxodibx1k2d6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Endpoint:    https://pangolin.example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p&gt;Secret 只會完整顯示這一次，關掉視窗就看不到了。先複製到安全的地方。真的忘了也不用慌，可以回後台重新產生一組，只是要重設 Newt 那邊的設定。&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;在內網機器上安裝 Newt&lt;a href=&quot;#在內網機器上安裝-newt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pangolin 通常會直接把指令產好給你複製。以下是幾種常見的安裝方式，挑一種用就好。&lt;/p&gt;
&lt;h4&gt;方法一：Docker Compose（最推薦）&lt;a href=&quot;#方法一docker-compose最推薦&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;在你的內網機器上建立 &lt;code&gt;compose.yml&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  newt&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;fosrl/newt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    container_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;newt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    network_mode&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;PANGOLIN_ENDPOINT=https://pangolin.example.com&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;NEWT_ID=31fsdasdasp721&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;NEWT_SECRET=h51mmlkasdsadasdasdagrwumt6isgbpyavxodibx1k2d6&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;啟動：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; up&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p&gt;用 &lt;code&gt;network_mode: host&lt;/code&gt; 是為了讓 Newt 能直接存取同一台機器上的其他服務跟整個區域網路。如果你的環境不方便用 host 模式，就得另外處理容器間的網路互通，會麻煩不少。
或者可以移除 &lt;code&gt;network_mode: host&lt;/code&gt; 另外增加&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;extra_hosts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;&quot;host.docker.internal:host-gateway&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣就可以隔離網路且讓資源是透過 &lt;code&gt;host.docker.internal&lt;/code&gt; 來訪問 host 網路&lt;/p&gt;
&lt;/div&gt;
&lt;h4&gt;方法二：Docker 單行指令（快速測試用）&lt;a href=&quot;#方法二docker-單行指令快速測試用&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; --name&lt;/span&gt;&lt;span&gt; newt&lt;/span&gt;&lt;span&gt; --restart&lt;/span&gt;&lt;span&gt; unless-stopped&lt;/span&gt;&lt;span&gt; --network&lt;/span&gt;&lt;span&gt; host&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  fosrl/newt&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --id&lt;/span&gt;&lt;span&gt; 31fsdasdasp721&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --secret&lt;/span&gt;&lt;span&gt; h51mmlkasdsadasdasdagrwumt6isgbpyavxodibx1k2d6&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --endpoint&lt;/span&gt;&lt;span&gt; https://pangolin.example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;方法三：直接裝二進位執行檔&lt;a href=&quot;#方法三直接裝二進位執行檔&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;沒有 Docker 的環境（例如某些 NAS 或路由器）可以裝原生執行檔：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -fsSL&lt;/span&gt;&lt;span&gt; https://static.pangolin.net/get-newt.sh&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後執行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;newt&lt;/span&gt;&lt;span&gt; --id&lt;/span&gt;&lt;span&gt; 31fsdasdasp721&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;     --secret&lt;/span&gt;&lt;span&gt; h51mmlkasdsadasdasdagrwumt6isgbpyavxodibx1k2d6&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;     --endpoint&lt;/span&gt;&lt;span&gt; https://pangolin.example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要讓它開機自動啟動，寫成 systemd 服務。先把憑證放進環境變數檔 &lt;code&gt;/etc/newt/newt.env&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;NEWT_ID&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;31fsdasdasp721&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;NEWT_SECRET&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;h51mmlkasdsadasdasdagrwumt6isgbpyavxodibx1k2d6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;PANGOLIN_ENDPOINT&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;https://pangolin.example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建立 &lt;code&gt;/etc/systemd/system/newt.service&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[Unit]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Description&lt;/span&gt;&lt;span&gt;=Newt Connector&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;After&lt;/span&gt;&lt;span&gt;=network-online.target&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Wants&lt;/span&gt;&lt;span&gt;=network-online.target&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;[Service]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Type&lt;/span&gt;&lt;span&gt;=simple&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;EnvironmentFile&lt;/span&gt;&lt;span&gt;=/etc/newt/newt.env&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ExecStart&lt;/span&gt;&lt;span&gt;=/usr/local/bin/newt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Restart&lt;/span&gt;&lt;span&gt;=always&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RestartSec&lt;/span&gt;&lt;span&gt;=10&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;[Install]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WantedBy&lt;/span&gt;&lt;span&gt;=multi-user.target&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;啟用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; daemon-reload&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; enable&lt;/span&gt;&lt;span&gt; --now&lt;/span&gt;&lt;span&gt; newt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt; newt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;確認連線成功&lt;a href=&quot;#確認連線成功&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;回到 Pangolin 後台的 Sites 頁面，剛剛建立的 Site 狀態應該從 &lt;code&gt;Offline&lt;/code&gt; 變成 &lt;strong&gt;&lt;code&gt;Online&lt;/code&gt;&lt;/strong&gt;（可能要等個十幾秒）。&lt;/p&gt;
&lt;p&gt;沒變綠燈的話，先看 Newt 那邊的日誌：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; logs&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; newt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 或&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; journalctl&lt;/span&gt;&lt;span&gt; -u&lt;/span&gt;&lt;span&gt; newt&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;發布第一個服務&lt;a href=&quot;#發布第一個服務&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Site 通了，現在來把一個實際的服務開放出去。這裡以家裡的 Jellyfin（跑在 &lt;code&gt;192.168.1.50:8096&lt;/code&gt;）為例。&lt;/p&gt;
&lt;h3&gt;建立 Resource&lt;a href=&quot;#建立-resource&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;後台側邊欄 &lt;strong&gt;Resources&lt;/strong&gt; → 新增，選擇 &lt;strong&gt;HTTP / HTTPS&lt;/strong&gt; 類型。&lt;/p&gt;
&lt;p&gt;要填的東西：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;名稱&lt;/strong&gt;：自己看得懂就好，例如 &lt;code&gt;Jellyfin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;子網域&lt;/strong&gt;：例如 &lt;code&gt;jellyfin&lt;/code&gt;，完整網址就會是 &lt;code&gt;https://jellyfin.example.com&lt;/code&gt;。因為你 DNS 設了萬用字元記錄，這裡填什麼都會自動生效，不用回去改 DNS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Site&lt;/strong&gt;：選剛剛建立的「家裡」&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;設定 Target&lt;a href=&quot;#設定-target&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;建立完資源後，進去設定 &lt;strong&gt;Target&lt;/strong&gt;，也就是流量最終要送到哪。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;方式 (Method)&lt;/strong&gt;：&lt;code&gt;http&lt;/code&gt; 或 &lt;code&gt;https&lt;/code&gt; — 這是指 Pangolin 用什麼協定去連你的後端服務，跟外面看到的網址無關。外部一律是 HTTPS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IP / 主機名稱&lt;/strong&gt;：&lt;code&gt;192.168.1.50&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通訊埠&lt;/strong&gt;：&lt;code&gt;8096&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Target 位址怎麼填，看你的服務跑在哪：&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;服務位置&lt;/th&gt;&lt;th&gt;Target 填什麼&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;內網另一台機器&lt;/td&gt;&lt;td&gt;那台機器的區域網路 IP，例如 &lt;code&gt;192.168.1.50&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;跟 Newt 同一台機器（Newt 用 host 網路）&lt;/td&gt;&lt;td&gt;&lt;code&gt;127.0.0.1&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;跟 Newt 同一個 Docker Compose&lt;/td&gt;&lt;td&gt;容器的服務名稱，例如 &lt;code&gt;jellyfin&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Newt 容器要連到宿主機&lt;/td&gt;&lt;td&gt;&lt;code&gt;172.17.0.1&lt;/code&gt; 或 &lt;code&gt;host.docker.internal&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;存檔後等個十幾秒讓 Traefik 申請憑證，然後打開 &lt;code&gt;https://jellyfin.example.com&lt;/code&gt; — 應該就看到你的服務了，而且是有效的 HTTPS 憑證。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;到這一步為止，你家的路由器&lt;strong&gt;完全沒有動過任何設定&lt;/strong&gt;，一個 port 都沒轉。所有流量都是走 Newt 主動建立的那條加密隧道進來的。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;想加第二、第三個服務，就重複這一節：建 Resource、填子網域、指 Target。不用再碰 DNS、不用再碰防火牆。&lt;/p&gt;
&lt;h2&gt;加上身分驗證&lt;a href=&quot;#加上身分驗證&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;現在這個服務是「有網址就能進」的狀態。Jellyfin 自己有登入頁面還好，但如果是那種沒有驗證機制的內部工具，等於直接裸奔在網際網路上。&lt;/p&gt;
&lt;p&gt;Pangolin 的價值就在這 — 在服務&lt;strong&gt;前面&lt;/strong&gt;再加一層關卡，沒通過的請求根本碰不到後端。&lt;/p&gt;
&lt;p&gt;進入該 Resource 的設定頁，找到驗證 (Authentication) 相關選項：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pangolin SSO&lt;/strong&gt; — 必須用 Pangolin 帳號登入。可以指定哪些使用者或角色能存取這個資源。最完整的做法，適合給家人朋友各自開帳號。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;外部身分提供者 (OIDC)&lt;/strong&gt; — 接 Google、Microsoft Entra ID、Okta 等等。想用 Google 帳號登入就用這個。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PIN 碼&lt;/strong&gt; — 最簡單粗暴，設一組數字密碼，進去之前要先輸入。適合臨時分享。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;密碼&lt;/strong&gt; — 類似 HTTP Basic Auth，支援在 &lt;code&gt;Authorization: Basic&lt;/code&gt; 標頭帶帳密，或直接寫在網址裡 &lt;code&gt;user:pass@domain.com&lt;/code&gt;。適合給程式或腳本用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Email 一次性驗證碼 (OTP)&lt;/strong&gt; — 先設定允許的信箱白名單（支援萬用字元如 &lt;code&gt;*@example.com&lt;/code&gt;），使用者輸入信箱後收到驗證碼才能進。需要先設定好 SMTP。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;分享連結 (Shareable Links)&lt;/strong&gt; — 產生有時效的臨時連結，想收回權限就把連結刪掉。適合「幫我看一下這個」這種一次性需求。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IP / 地理位置規則&lt;/strong&gt; — 設定有優先順序的規則，依來源 IP、國家、URL 路徑決定放行或封鎖。例如「只允許台灣的 IP」。&lt;/p&gt;
&lt;p&gt;這些可以組合使用，也可以做成共用的 &lt;strong&gt;Resource Policy&lt;/strong&gt; 套用到多個資源上，避免每個服務都要重設一次。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;建議至少對所有沒有自帶登入機制的服務開啟一種驗證。開了之後即使有人猜到你的子網域名稱，看到的也只是 Pangolin 的驗證頁面。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;不開 22 port 的 SSH&lt;a href=&quot;#不開-22-port-的-ssh&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;這是 Pangolin 相當實用的功能之一：主機不用對外開 22 port。&lt;/p&gt;
&lt;p&gt;在 Resources 新增一個 &lt;strong&gt;SSH&lt;/strong&gt; 類型的資源。SSH 資源不使用 Target，而是直接：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;指定哪些 Site 可以路由到這個資源&lt;/li&gt;
&lt;li&gt;填入後端主機跟 port（例如 &lt;code&gt;192.168.1.50:22&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;設定驗證方式（同上一節）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;設定完成後，直接用瀏覽器打開這個資源的網址，就會看到一個&lt;strong&gt;完整的互動式終端機&lt;/strong&gt; — 不需要 SSH 用戶端，不需要裝 Pangolin 桌面程式，手機瀏覽器也能用。&lt;/p&gt;
&lt;p&gt;Pangolin 的驗證會在 SSH 連線建立&lt;strong&gt;之前&lt;/strong&gt;擋一次，通過之後才會進到主機自己的登入流程。等於多了一層完全獨立的防護。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;如果要用 Pangolin SSH 模式（直接連到執行 Newt 的那台主機本身），Newt 必須以 root 權限執行。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;確認能從瀏覽器連進去之後，就可以把 VPS 跟內網機器的 22 port 從對外防火牆規則裡拿掉了。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;防火牆禁用 22 port 之前，&lt;strong&gt;務必先確認 Pangolin 的 SSH 資源真的能連進去&lt;/strong&gt;，而且你有其他救援手段（VPS 供應商的 Console、實體機器旁邊的鍵盤）。不然一旦 Pangolin 出事，你就把自己鎖在門外了。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;日常維護&lt;a href=&quot;#日常維護&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;更新&lt;a href=&quot;#更新&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pangolin 更新沒有一鍵指令，要手動改版號。步驟如下：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 先備份&lt;/strong&gt; — 把 &lt;code&gt;config&lt;/code&gt; 目錄複製到安全的地方：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; cp&lt;/span&gt;&lt;span&gt; -r&lt;/span&gt;&lt;span&gt; /opt/pangolin/config&lt;/span&gt;&lt;span&gt; /opt/pangolin/config.bak.&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt; +%F&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. 停止服務&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; /opt/pangolin&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; down&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. 查最新版號&lt;/strong&gt; — 到 GitHub Releases 看 Pangolin、Gerbil、Badger 的版本，Traefik 則看 Docker Hub。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 改版號&lt;/strong&gt; — 編輯 &lt;code&gt;docker-compose.yml&lt;/code&gt; 裡各服務的映像檔版本；Badger 的版本在 &lt;code&gt;config/traefik/traefik_config.yml&lt;/code&gt; 裡。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. 拉映像檔並啟動&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; pull&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; up&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;6. 看日誌確認&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; logs&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;7. 驗證&lt;/strong&gt; — 開管理後台、確認 Site 還是 Online、測試幾個資源連得上。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;跨大版本升級請一個一個版本升上去，不要從 v1.0 直接跳 v1.5。中間可能有資料庫 migration，跳版容易出事。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Newt 那邊也要記得更新，Docker 的話：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; pull&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; up&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;網段衝突&lt;a href=&quot;#網段衝突&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pangolin 預設使用 &lt;code&gt;100.89.137.0/20&lt;/code&gt; 這個 CGNAT 網段給隧道用，每個 Site 分配一個 /30 子網（4 個 IP）。&lt;/p&gt;
&lt;p&gt;如果這個網段跟你家或公司的網路撞到，&lt;strong&gt;必須在註冊第一個 Site 之前&lt;/strong&gt;先改設定檔。已經跑起來之後才改會很麻煩。一般家用網路是 &lt;code&gt;192.168.x.x&lt;/code&gt;，通常不會撞。&lt;/p&gt;
&lt;h2&gt;常見問題&lt;a href=&quot;#常見問題&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;管理介面打不開&lt;/strong&gt;
DNS 還沒生效，或 80/443 沒開。用 &lt;code&gt;dig +short pangolin.example.com&lt;/code&gt; 確認解析，用 &lt;code&gt;sudo docker compose ps&lt;/code&gt; 確認容器有起來。別忘了 VPS 供應商的雲端防火牆也要開。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;憑證申請失敗&lt;/strong&gt;
Let&apos;s Encrypt 需要透過 80 port 驗證網域擁有權。檢查 80 port 有沒有被別的程式（Apache、nginx）佔用，以及 Cloudflare 的橘色雲朵有沒有關掉。看 Traefik 日誌：&lt;code&gt;sudo docker compose logs traefik&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site 一直顯示 Offline&lt;/strong&gt;
Newt 連不到 Gerbil。檢查 51820/udp 有沒有開（&lt;strong&gt;UDP 不是 TCP&lt;/strong&gt;，這是最常踩的雷），確認 &lt;code&gt;PANGOLIN_ENDPOINT&lt;/code&gt; 填的是完整網址含 &lt;code&gt;https://&lt;/code&gt;，看 Newt 日誌找錯誤訊息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site 是 Online 但資源連不上&lt;/strong&gt;
問題出在 Target。從 Newt 所在的那台機器手動測試一下後端通不通：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -v&lt;/span&gt;&lt;span&gt; http://192.168.1.50:8096&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;連不上就是內網路由或防火牆問題，跟 Pangolin 無關。另外檢查 Target 的協定（http/https）跟 port 有沒有填對。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;服務可以開但版面跑掉、資源載入失敗&lt;/strong&gt;
某些應用程式需要知道自己被反向代理，得在該應用的設定裡指定對外的 base URL，或是在 Pangolin 這邊調整轉發標頭 (Forwarded Headers)。&lt;/p&gt;
&lt;h2&gt;結語&lt;a href=&quot;#結語&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pangolin 的核心價值是把三件本來要分開處理的事情合成一套：反向代理 + 憑證管理、隧道穿透、身分驗證。對於手上有幾台散落各地機器的人來說，管理成本降低很多。&lt;/p&gt;
&lt;p&gt;代價是你得自己維護那台 VPS。它是整套系統的單點 — VPS 掛了所有服務都連不上，VPS 被打進去就是全面淪陷。所以該做的基本功一樣不能少：定期更新、SSH 金鑰登入、關掉不必要的服務。&lt;/p&gt;
&lt;p&gt;如果只是想在自己的幾台裝置之間互連，不需要對外公開任何東西，Tailscale 那類方案設定更簡單。但如果你想要「用網域名稱公開存取 + 統一的身分驗證 + 資料不經過第三方」，Pangolin 目前是相當完整的選擇。&lt;/p&gt;
&lt;h2&gt;參考資料&lt;a href=&quot;#參考資料&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.pangolin.net/&quot;&gt;Pangolin 官方文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.pangolin.net/self-host/quick-install&quot;&gt;Quick Install Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.pangolin.net/self-host/dns-and-networking&quot;&gt;DNS &amp;amp; Networking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.pangolin.net/manage/sites/understanding-sites&quot;&gt;Understanding Sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.pangolin.net/manage/resources/understanding-resources&quot;&gt;Understanding Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.pangolin.net/development/system-architecture&quot;&gt;System Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.pangolin.net/self-host/how-to-update&quot;&gt;How to Update&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>category:linux</category><category>category:pangolin</category><category>tag:Linux</category><category>tag:SSH</category><category>tag:Pangolin</category></item><item><title>tmux 筆記</title><link>https://blog.thanatosdi.work/post/linux/tmux-%E7%AD%86%E8%A8%98</link><guid isPermaLink="false">linux/tmux-筆記</guid><description>tmux 筆記
tmux 設定
設定 session 名稱寬度
echo &quot;set -g status-left-length 50&quot; | tee -a ~/.tmux.conf
tmux source-file ~/.tmux.conf
tmux 命令
建立 session
tmux</description><pubDate>Sat, 18 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;tmux 筆記&lt;a href=&quot;#tmux-筆記&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;tmux 設定&lt;a href=&quot;#tmux-設定&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;設定 session 名稱寬度&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;set -g status-left-length 50&quot;&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; tee&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; ~/.tmux.conf&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; source-file&lt;/span&gt;&lt;span&gt; ~/.tmux.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;tmux 命令&lt;a href=&quot;#tmux-命令&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;建立 session&lt;a href=&quot;#建立-session&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; new-session&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; -s&lt;/span&gt;&lt;span&gt; {session&lt;/span&gt;&lt;span&gt; 名稱}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;刪除背景所有 session&lt;a href=&quot;#刪除背景所有-session&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; kill-session&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;關閉「特定」的 session&lt;a href=&quot;#關閉特定的-session&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; kill-session&lt;/span&gt;&lt;span&gt; -t&lt;/span&gt;&lt;span&gt; {session&lt;/span&gt;&lt;span&gt; 名稱}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;tmux 操作&lt;a href=&quot;#tmux-操作&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在 tmux 中所有組合鍵的前提是先按 &lt;code&gt;ctrl+b&lt;/code&gt; 之後在按特定案件來操作&lt;/p&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;用途&lt;/th&gt;&lt;th&gt;組合鍵&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;在 session 中建立新 windows&lt;/td&gt;&lt;td&gt;c&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;關閉現在的 windows&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;查看所有 windows&lt;/td&gt;&lt;td&gt;w&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;切換至上一個&lt;/td&gt;&lt;td&gt;p&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;切換至下一個&lt;/td&gt;&lt;td&gt;n&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;切換至指定&lt;/td&gt;&lt;td&gt;0~9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;左右分割&lt;/td&gt;&lt;td&gt;%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;上下分割&lt;/td&gt;&lt;td&gt;”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;在分割區塊間移動游標&lt;/td&gt;&lt;td&gt;方向鍵（上、下、左、右）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;重新命名 windows&lt;/td&gt;&lt;td&gt;,&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;切換至其他 session&lt;/td&gt;&lt;td&gt;s&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;VSCode 遠端設定&lt;a href=&quot;#vscode-遠端設定&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;VSCode 必須安裝的擴充套件:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh&quot;&gt;Remote - SSH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-zh-hant&quot;&gt;Chinese (Traditional) Language Pack for Visual Studio Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;ctrl+,&lt;/code&gt; 開啟設定，選擇”遠端”如圖
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/file-20260719202320636.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;並點擊右邊開啟 json 設定
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/file-20260719202333331.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;將以下的 json 貼上，這樣連線至遠端之後就會自動進入特定 tmux session&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;terminal.integrated.profiles.linux&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;Auto Tmux&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &quot;path&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;tmux&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &quot;args&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                &quot;new-session&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                &quot;-A&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                &quot;-s&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                &quot;vscode-${workspaceFolderBasename}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            ]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;terminal.integrated.defaultProfile.linux&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;Auto Tmux&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:tmux</category><category>tag:CLI</category></item><item><title>Docker 資料目錄修改</title><link>https://blog.thanatosdi.work/post/docker/docker-%E8%B3%87%E6%96%99%E7%9B%AE%E9%8C%84%E4%BF%AE%E6%94%B9</link><guid isPermaLink="false">docker/docker-資料目錄修改</guid><description>在 Docker 版本 &amp;gt; 29.0 產生的異動
除了原先的 /etc/docker/daemon.json
{
  &quot;data-root&quot;: &quot;/mnt/docker-data&quot;
}
還增加了一個 containerd 路徑, 因為 29.0 之後的版本調整為使用 containerd</description><pubDate>Tue, 07 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 Docker 版本 &amp;gt; 29.0 產生的異動&lt;br /&gt;
除了原先的 &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;data-root&quot;: &quot;/mnt/docker-data&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;還增加了一個 containerd 路徑, 因為 29.0 之後的版本調整為使用 containerd 映像儲存
&lt;code&gt;/etc/containerd/config.toml&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;root = &quot;/mnt/containerd-data&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改完成後要將原先的 &lt;code&gt;/var/lib/containerd&lt;/code&gt;移動至新的目錄位置, 並且重新啟動 docker 和 containerd 服務&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; restart&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; restart&lt;/span&gt;&lt;span&gt; docker.socket&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; systemctl&lt;/span&gt;&lt;span&gt; restart&lt;/span&gt;&lt;span&gt; containerd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;參考資源&lt;a href=&quot;#參考資源&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/engine/daemon/#configure-the-data-directory-location&quot;&gt;Docker 官方文件 - Daemon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>category:docker</category><category>tag:Docker</category></item><item><title>Docker Volume 類型比較</title><link>https://blog.thanatosdi.work/post/docker/docker-volume-%E9%A1%9E%E5%9E%8B%E6%AF%94%E8%BC%83</link><guid isPermaLink="false">docker/docker-volume-類型比較</guid><description>#Docker #Linux
Docker Volume 類型比較
1. Named Volumes (命名卷)
說明
Named Volumes 是由 Docker 管理的持久化儲存方案,資料儲存在 Docker 的管理目錄中(Linux 通常在</description><pubDate>Tue, 07 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;#Docker #Linux&lt;/p&gt;
&lt;h1&gt;Docker Volume 類型比較&lt;a href=&quot;#docker-volume-類型比較&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;1. Named Volumes (命名卷)&lt;a href=&quot;#1-named-volumes-命名卷&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;說明&lt;a href=&quot;#說明&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Named Volumes 是由 Docker 管理的持久化儲存方案,資料儲存在 Docker 的管理目錄中(Linux 通常在 &lt;code&gt;/var/lib/docker/volumes/&lt;/code&gt;)。這是最推薦的資料持久化方式。&lt;/p&gt;
&lt;h3&gt;特點&lt;a href=&quot;#特點&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ 由 Docker 完全管理,不需要指定主機路徑&lt;/li&gt;
&lt;li&gt;✅ 可以在多個容器間共享&lt;/li&gt;
&lt;li&gt;✅ 支援 volume drivers,可擴展至遠端儲存&lt;/li&gt;
&lt;li&gt;✅ 容易備份和遷移&lt;/li&gt;
&lt;li&gt;✅ 在 Windows 和 Mac 上效能較好&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Docker Compose 設定&lt;a href=&quot;#docker-compose-設定&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  db&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;postgres:15&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      POSTGRES_PASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;example&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  postgres_data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    driver&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # 可選:指定 driver options&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    driver_opts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      device&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/path/on/host&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      o&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker 命令&lt;a href=&quot;#docker-命令&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 建立基本 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; my_volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 建立 volume 並指定 driver&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; --driver&lt;/span&gt;&lt;span&gt; local&lt;/span&gt;&lt;span&gt; my_volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 建立 volume 並設定 driver_opts (對應 docker-compose 的 driver_opts)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --driver&lt;/span&gt;&lt;span&gt; local&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --opt&lt;/span&gt;&lt;span&gt; type=none&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --opt&lt;/span&gt;&lt;span&gt; device=/path/on/host&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --opt&lt;/span&gt;&lt;span&gt; o=bind&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  postgres_data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用短選項 -o (等同於 --opt)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --driver&lt;/span&gt;&lt;span&gt; local&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -o&lt;/span&gt;&lt;span&gt; type=none&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -o&lt;/span&gt;&lt;span&gt; device=/absolute/path/on/host&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -o&lt;/span&gt;&lt;span&gt; o=bind&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  my_volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# NFS volume 範例&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --driver&lt;/span&gt;&lt;span&gt; local&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -o&lt;/span&gt;&lt;span&gt; type=nfs&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -o&lt;/span&gt;&lt;span&gt; o=addr=192.168.1.100,rw&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -o&lt;/span&gt;&lt;span&gt; device=:/path/to/nfs/share&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nfs_volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用 volume 啟動容器&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; my_container&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; my_volume:/app/data&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 查看所有 volumes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; ls&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 查看 volume 詳細資訊(包含 driver_opts)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; inspect&lt;/span&gt;&lt;span&gt; my_volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 刪除 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; rm&lt;/span&gt;&lt;span&gt; my_volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 清理未使用的 volumes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; prune&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Volume SubPath (掛載子目錄)&lt;a href=&quot;#volume-subpath-掛載子目錄&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Docker 支援使用 &lt;code&gt;volume-subpath&lt;/code&gt; 參數來掛載 volume 內的特定子目錄,而不是整個 volume。這在多容器共享同一 volume 時特別有用。&lt;/p&gt;
&lt;h4&gt;重要限制&lt;a href=&quot;#重要限制&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;子目錄必須預先存在&lt;/strong&gt;於 volume 中,否則掛載會失敗&lt;/li&gt;
&lt;li&gt;只能使用 &lt;code&gt;--mount&lt;/code&gt; 語法,不支援 &lt;code&gt;-v&lt;/code&gt; 簡短語法&lt;/li&gt;
&lt;li&gt;Docker Compose 目前官方文件未明確說明支援此功能&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Docker 命令語法&lt;a href=&quot;#docker-命令語法&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;--mount&lt;/span&gt;&lt;span&gt; src=&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;volume-nam&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;,dst=&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;container-pat&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;,volume-subpath=&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;subdi&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;完整範例&lt;div&gt;&lt;/div&gt;&lt;a href=&quot;#完整範例&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 1. 建立 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; logs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 2. 初始化子目錄結構(必須先建立)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=logs,dst=/logs&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; mkdir&lt;/span&gt;&lt;span&gt; -p&lt;/span&gt;&lt;span&gt; /logs/app1&lt;/span&gt;&lt;span&gt; /logs/app2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 3. App1 只掛載 logs volume 的 app1 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app1&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=logs,dst=/var/log/app,volume-subpath=app1&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  myapp1:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 4. App2 只掛載 logs volume 的 app2 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app2&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=logs,dst=/var/log/app,volume-subpath=app2&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  myapp2:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 5. 查看整個 volume 的內容(用於管理)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=logs,dst=/logs&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; ls&lt;/span&gt;&lt;span&gt; -lR&lt;/span&gt;&lt;span&gt; /logs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;實用範例&lt;div&gt;&lt;/div&gt;&lt;a href=&quot;#實用範例&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 建立共享資料 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; shared_data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 初始化多個應用的子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=shared_data,dst=/data&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;span&gt; -c&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mkdir -p /data/uploads/user1 /data/uploads/user2 &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mkdir -p /data/cache/app1 /data/cache/app2 &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    chown -R 1000:1000 /data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 上傳服務 - 使用 uploads/user1 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; upload_user1&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=shared_data,dst=/app/uploads,volume-subpath=uploads/user1&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  upload_service:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 快取服務 - 使用 cache/app1 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; cache_app1&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=shared_data,dst=/app/cache,volume-subpath=cache/app1&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  cache_service:latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Docker Compose (非官方支援,但可變通)&lt;a href=&quot;#docker-compose-非官方支援但可變通&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Docker Compose 目前沒有直接的 &lt;code&gt;volume-subpath&lt;/code&gt; 語法,但可以使用以下變通方式:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 方法 1: 使用 driver_opts 將 volume 綁定到主機子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;app1_logs:/var/log/app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app2&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;app2_logs:/var/log/app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app1_logs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    driver&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    driver_opts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      device&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/host/shared/logs/app1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      o&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app2_logs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    driver&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    driver_opts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      device&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/host/shared/logs/app2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      o&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 方法 2: 使用 init 容器 + 環境變數&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  init&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;alpine&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;shared_data:/data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    command&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;mkdir -p /data/app1 /data/app2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    restart&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;no&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    depends_on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;shared_data:/data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    working_dir&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/data/app1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      DATA_PATH&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/data/app1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app2&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    depends_on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;shared_data:/data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    working_dir&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/data/app2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      DATA_PATH&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/data/app2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  shared_data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;使用場景&lt;a href=&quot;#使用場景&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;多容器共享單一 volume 時隔離資料&lt;/li&gt;
&lt;li&gt;為每個容器維護獨立的日誌目錄&lt;/li&gt;
&lt;li&gt;精細控制資料存取範圍&lt;/li&gt;
&lt;li&gt;節省 volume 數量(一個 volume 多個用途)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用場景&lt;a href=&quot;#使用場景-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;資料庫資料持久化(PostgreSQL, MySQL, MongoDB)&lt;/li&gt;
&lt;li&gt;應用程式上傳的檔案儲存&lt;/li&gt;
&lt;li&gt;需要在多個容器間共享的資料&lt;/li&gt;
&lt;li&gt;生產環境的資料儲存&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Bind Mounts (綁定掛載)&lt;a href=&quot;#2-bind-mounts-綁定掛載&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;說明&lt;a href=&quot;#說明-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bind Mounts 將主機上的特定檔案或目錄直接掛載到容器中。提供了最直接的檔案系統存取,但依賴主機的檔案系統結構。&lt;/p&gt;
&lt;h3&gt;特點&lt;a href=&quot;#特點-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ 可以直接存取和編輯主機檔案&lt;/li&gt;
&lt;li&gt;✅ 適合開發環境的即時程式碼更新&lt;/li&gt;
&lt;li&gt;✅ 可以掛載單一檔案或整個目錄&lt;/li&gt;
&lt;li&gt;⚠️ 依賴主機的目錄結構&lt;/li&gt;
&lt;li&gt;⚠️ 在 Windows/Mac 上效能可能較差&lt;/li&gt;
&lt;li&gt;⚠️ 安全性較低(容器可以修改主機檔案)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Docker Compose 設定&lt;a href=&quot;#docker-compose-設定-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  web&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;node:18&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    working_dir&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # 長語法(推薦)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        source&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;./src&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        target&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        read_only&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # 短語法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./config:/app/config:ro&lt;/span&gt;&lt;span&gt;  # :ro 表示唯讀&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./logs:/app/logs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    command&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;npm run dev&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;3000:3000&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # 掛載設定檔&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./nginx.conf:/etc/nginx/nginx.conf:ro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # 掛載靜態檔案&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./public:/usr/share/nginx/html:ro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;&quot;80:80&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker 命令&lt;a href=&quot;#docker-命令-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 使用絕對路徑掛載&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; dev_container&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; /absolute/path/on/host:/app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/config:/app/config:ro&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  node:18&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用相對路徑(需要完整路徑)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; web&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; &quot;$(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&quot;:/app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -w&lt;/span&gt;&lt;span&gt; /app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 掛載單一檔案&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/.env:/app/.env:ro&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用 --mount 語法(更明確,推薦)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; type=bind,source=&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/src,target=/app,readonly=&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  node:18&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用場景&lt;a href=&quot;#使用場景-2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;開發環境的即時程式碼更新&lt;/li&gt;
&lt;li&gt;掛載設定檔到容器&lt;/li&gt;
&lt;li&gt;需要在主機上直接查看/編輯容器檔案&lt;/li&gt;
&lt;li&gt;CI/CD 建置過程中的檔案共享&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Anonymous Volumes (匿名卷)&lt;a href=&quot;#3-anonymous-volumes-匿名卷&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;說明&lt;a href=&quot;#說明-2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Anonymous Volumes 是沒有指定名稱的 volume,由 Docker 自動產生隨機名稱。當容器被刪除時,通常也會一起被刪除(除非使用特定選項)。&lt;/p&gt;
&lt;h3&gt;特點&lt;a href=&quot;#特點-2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ 自動管理,無需手動建立&lt;/li&gt;
&lt;li&gt;✅ 適合臨時資料儲存&lt;/li&gt;
&lt;li&gt;⚠️ 難以追蹤和管理&lt;/li&gt;
&lt;li&gt;⚠️ 容器刪除後可能遺留孤立 volumes&lt;/li&gt;
&lt;li&gt;⚠️ 無法在容器間共享(每次都會建立新的)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Docker Compose 設定&lt;a href=&quot;#docker-compose-設定-2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;node:18&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # 匿名 volume(不指定主機路徑或 volume 名稱)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/app/node_modules&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/app/cache&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    working_dir&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    command&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;npm start&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  db&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;postgres:15&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # 結合 bind mount 和匿名 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./app:/app&lt;/span&gt;&lt;span&gt;                    # bind mount&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/app/node_modules&lt;/span&gt;&lt;span&gt;             # 匿名 volume,避免覆蓋&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      POSTGRES_PASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;example&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker 命令&lt;a href=&quot;#docker-命令-2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 建立匿名 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; /app/data&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 容器刪除時自動清理匿名 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; /tmp/cache&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 查看容器的匿名 volumes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; inspect&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 範例:避免 node_modules 被覆蓋&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; node_app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:/app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; /app/node_modules&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  node:18&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用場景&lt;a href=&quot;#使用場景-3&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;保護容器內特定目錄不被 bind mount 覆蓋(如 node_modules)&lt;/li&gt;
&lt;li&gt;臨時快取資料&lt;/li&gt;
&lt;li&gt;不需要持久化的資料&lt;/li&gt;
&lt;li&gt;開發環境的臨時檔案&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;4. tmpfs Mounts (臨時檔案系統掛載)&lt;a href=&quot;#4-tmpfs-mounts-臨時檔案系統掛載&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;說明&lt;a href=&quot;#說明-3&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;tmpfs Mounts 將資料儲存在主機的記憶體中,不會寫入磁碟。當容器停止時,資料就會消失。只在 Linux 上可用。&lt;/p&gt;
&lt;h3&gt;特點&lt;a href=&quot;#特點-3&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ 極快的讀寫速度(記憶體存取)&lt;/li&gt;
&lt;li&gt;✅ 敏感資料不會寫入磁碟&lt;/li&gt;
&lt;li&gt;✅ 容器停止後自動清理&lt;/li&gt;
&lt;li&gt;⚠️ 資料不持久化&lt;/li&gt;
&lt;li&gt;⚠️ 佔用主機記憶體&lt;/li&gt;
&lt;li&gt;⚠️ 只支援 Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Docker Compose 設定&lt;a href=&quot;#docker-compose-設定-3&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  web&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    tmpfs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/tmp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/run&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # 或使用長語法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;tmpfs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        target&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/app/cache&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        tmpfs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          size&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;100M&lt;/span&gt;&lt;span&gt;  # 限制大小為 100MB&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          mode&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1777&lt;/span&gt;&lt;span&gt;  # 設定權限&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;tmpfs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        target&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/app/temp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        tmpfs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          size&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;50M&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;data:/app/data&lt;/span&gt;&lt;span&gt;  # 結合 named volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker 命令&lt;a href=&quot;#docker-命令-3&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 基本使用&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --tmpfs&lt;/span&gt;&lt;span&gt; /tmp&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用 --mount 指定選項&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; type=tmpfs,target=/app/cache,tmpfs-size=100M,tmpfs-mode=&lt;/span&gt;&lt;span&gt;1770&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  myapp:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 多個 tmpfs mounts&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --tmpfs&lt;/span&gt;&lt;span&gt; /tmp:rw,size=50M,mode=&lt;/span&gt;&lt;span&gt;1777&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --tmpfs&lt;/span&gt;&lt;span&gt; /run:rw,size=10M&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  nginx:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 查看掛載資訊&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; inspect&lt;/span&gt;&lt;span&gt; app&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; grep&lt;/span&gt;&lt;span&gt; -A&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt; Mounts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用場景&lt;a href=&quot;#使用場景-4&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;敏感資料處理(密碼、金鑰等)&lt;/li&gt;
&lt;li&gt;高速快取需求&lt;/li&gt;
&lt;li&gt;臨時檔案處理&lt;/li&gt;
&lt;li&gt;Session 儲存&lt;/li&gt;
&lt;li&gt;編譯過程的臨時檔案&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Volume 類型比較表&lt;a href=&quot;#volume-類型比較表&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;


















































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;特性&lt;/th&gt;&lt;th&gt;Named Volume&lt;/th&gt;&lt;th&gt;Bind Mount&lt;/th&gt;&lt;th&gt;Anonymous Volume&lt;/th&gt;&lt;th&gt;tmpfs Mount&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;持久化&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ 是&lt;/td&gt;&lt;td&gt;✅ 是&lt;/td&gt;&lt;td&gt;✅ 是&lt;/td&gt;&lt;td&gt;❌ 否&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Docker 管理&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ 是&lt;/td&gt;&lt;td&gt;❌ 否&lt;/td&gt;&lt;td&gt;✅ 是&lt;/td&gt;&lt;td&gt;❌ 否&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;主機路徑控制&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;❌ 否&lt;/td&gt;&lt;td&gt;✅ 是&lt;/td&gt;&lt;td&gt;❌ 否&lt;/td&gt;&lt;td&gt;❌ 否&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;容器間共享&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ 容易&lt;/td&gt;&lt;td&gt;✅ 可以&lt;/td&gt;&lt;td&gt;❌ 困難&lt;/td&gt;&lt;td&gt;❌ 不可&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;效能(Linux)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 好&lt;/td&gt;&lt;td&gt; 好&lt;/td&gt;&lt;td&gt; 好&lt;/td&gt;&lt;td&gt; 極佳&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;效能(Win/Mac)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 好&lt;/td&gt;&lt;td&gt; 較差&lt;/td&gt;&lt;td&gt; 好&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;備份容易度&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 容易&lt;/td&gt;&lt;td&gt; 中等&lt;/td&gt;&lt;td&gt; 困難&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;安全性&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 高&lt;/td&gt;&lt;td&gt; 中等&lt;/td&gt;&lt;td&gt; 高&lt;/td&gt;&lt;td&gt; 高&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;使用複雜度&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 簡單&lt;/td&gt;&lt;td&gt; 中等&lt;/td&gt;&lt;td&gt; 簡單&lt;/td&gt;&lt;td&gt; 簡單&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;生產環境&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ 推薦&lt;/td&gt;&lt;td&gt;⚠️ 謹慎&lt;/td&gt;&lt;td&gt;❌ 不推薦&lt;/td&gt;&lt;td&gt;✅ 特定場景&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;實用技巧與最佳實踐&lt;a href=&quot;#實用技巧與最佳實踐&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;1. Volume 備份與還原&lt;a href=&quot;#1-volume-備份與還原&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 備份 named volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; my_volume:/source:ro&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:/backup&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; tar&lt;/span&gt;&lt;span&gt; czf&lt;/span&gt;&lt;span&gt; /backup/backup.tar.gz&lt;/span&gt;&lt;span&gt; -C&lt;/span&gt;&lt;span&gt; /source&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 還原 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; my_volume:/target&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:/backup&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; tar&lt;/span&gt;&lt;span&gt; xzf&lt;/span&gt;&lt;span&gt; /backup/backup.tar.gz&lt;/span&gt;&lt;span&gt; -C&lt;/span&gt;&lt;span&gt; /target&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 複製 Volume 資料&lt;a href=&quot;#2-複製-volume-資料&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 從一個 volume 複製到另一個&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; old_volume:/from:ro&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; new_volume:/to&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;span&gt; -c&lt;/span&gt;&lt;span&gt; &quot;cd /from &amp;amp;&amp;amp; cp -av . /to&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 組合使用範例&lt;a href=&quot;#3-組合使用範例&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  app&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;node:18&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # Bind mount: 開發時即時更新程式碼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;./src:/app/src&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # Named volume: 持久化上傳檔案&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;uploads:/app/uploads&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # Anonymous volume: 保護 node_modules&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/app/node_modules&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # tmpfs: 高速快取&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    tmpfs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;/app/cache:size=100M&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  db&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;postgres:15&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # Named volume: 資料庫資料持久化&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      - &lt;/span&gt;&lt;span&gt;db_data:/var/lib/postgresql/data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      POSTGRES_PASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;example&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  uploads&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  db_data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 清理未使用的 Volumes&lt;a href=&quot;#4-清理未使用的-volumes&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 清理所有未使用的 volumes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; prune&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 清理特定 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; rm&lt;/span&gt;&lt;span&gt; volume_name&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 查看 volume 使用情況&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; system&lt;/span&gt;&lt;span&gt; df&lt;/span&gt;&lt;span&gt; -v&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5. 使用 Volume SubPath 實現多租戶資料隔離&lt;a href=&quot;#5-使用-volume-subpath-實現多租戶資料隔離&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 實際場景:多個微服務共享一個資料 volume,但各自有獨立空間&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 建立共享 volume&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; volume&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; microservices_data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 初始化子目錄結構&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/data&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;span&gt; -c&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mkdir -p /data/{auth,user,order}/{uploads,cache,logs} &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mkdir -p /data/shared/{config,templates} &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    chown -R 1000:1000 /data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 認證服務 - 只能存取 auth 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; auth_service&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/app/data,volume-subpath=auth&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/app/shared,volume-subpath=shared,readonly&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  auth:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用者服務 - 只能存取 user 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; user_service&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/app/data,volume-subpath=user&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/app/shared,volume-subpath=shared,readonly&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  user:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 訂單服務 - 只能存取 order 子目錄&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; order_service&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/app/data,volume-subpath=order&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/app/shared,volume-subpath=shared,readonly&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  order:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 管理容器 - 可以存取完整 volume(用於維護)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; -it&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/data&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; sh&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 備份特定服務的資料&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; --rm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --mount&lt;/span&gt;&lt;span&gt; src=microservices_data,dst=/data,volume-subpath=auth&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/backups:/backup&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alpine&lt;/span&gt;&lt;span&gt; tar&lt;/span&gt;&lt;span&gt; czf&lt;/span&gt;&lt;span&gt; /backup/auth-&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt; +%Y%m%d&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.tar.gz&lt;/span&gt;&lt;span&gt; -C&lt;/span&gt;&lt;span&gt; /data&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;選擇建議&lt;a href=&quot;#選擇建議&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;使用 Named Volumes 當&lt;a href=&quot;#使用-named-volumes-當&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;生產環境的資料持久化&lt;/li&gt;
&lt;li&gt;需要簡單的備份和遷移&lt;/li&gt;
&lt;li&gt;資料需要在容器間共享&lt;/li&gt;
&lt;li&gt;使用 Windows 或 Mac 進行開發&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用 Bind Mounts 當&lt;a href=&quot;#使用-bind-mounts-當&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;開發環境需要即時程式碼更新&lt;/li&gt;
&lt;li&gt;需要精確控制檔案位置&lt;/li&gt;
&lt;li&gt;設定檔需要頻繁修改&lt;/li&gt;
&lt;li&gt;與主機工具整合(如 IDE)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用 Anonymous Volumes 當&lt;a href=&quot;#使用-anonymous-volumes-當&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;保護特定目錄不被覆蓋&lt;/li&gt;
&lt;li&gt;臨時資料儲存&lt;/li&gt;
&lt;li&gt;不需要跨容器共享&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用 tmpfs Mounts 當&lt;a href=&quot;#使用-tmpfs-mounts-當&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;處理敏感資料&lt;/li&gt;
&lt;li&gt;需要極高的 I/O 效能&lt;/li&gt;
&lt;li&gt;臨時快取或 session 儲存&lt;/li&gt;
&lt;li&gt;資料不需要持久化&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;參考資源&lt;a href=&quot;#參考資源&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/storage/volumes/&quot;&gt;Docker 官方文件 - Volumes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/storage/bind-mounts/&quot;&gt;Docker 官方文件 - Bind Mounts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/compose/compose-file/&quot;&gt;Docker Compose 文件參考&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>category:docker</category><category>tag:Linux</category><category>tag:Docker</category></item><item><title>Linux 常用壓縮/解壓縮命令</title><link>https://blog.thanatosdi.work/post/linux/linux-%E5%B8%B8%E7%94%A8%E5%A3%93%E7%B8%AE-%E8%A7%A3%E5%A3%93%E7%B8%AE%E5%91%BD%E4%BB%A4</link><guid isPermaLink="false">linux/linux-常用壓縮-解壓縮命令</guid><description>.tar.tar.gz.tar.bz.tar.bz2.tar.xz.tar.Z.tgz.tar.tgz.tar.zst.gz.bz.bz2.xz.Z.7z.zip.rar.lha.zst
.tar (無壓縮)

打包

tar cvf dir.tar dir_name

解包

tar xvf</description><pubDate>Sun, 07 Apr 2024 16:00:00 GMT</pubDate><content:encoded>&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#tar-%E7%84%A1%E5%A3%93%E7%B8%AE&quot;&gt;.tar&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#targz&quot;&gt;.tar.gz&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#tarbz&quot;&gt;.tar.bz&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#tarbz2&quot;&gt;.tar.bz2&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#tarxz&quot;&gt;.tar.xz&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#tarz&quot;&gt;.tar.Z&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#tgz&quot;&gt;.tgz&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#tartgz&quot;&gt;.tar.tgz&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#tarzst&quot;&gt;.tar.zst&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#gz&quot;&gt;.gz&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#bz&quot;&gt;.bz&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#bz2&quot;&gt;.bz2&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#xz&quot;&gt;.xz&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#z&quot;&gt;.Z&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#7z&quot;&gt;.7z&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#zip&quot;&gt;.zip&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#rar&quot;&gt;.rar&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;#lha&quot;&gt;.lha&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;#zst&quot;&gt;.zst&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h1&gt;.tar (無壓縮)&lt;a href=&quot;#tar-無壓縮&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;打包&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; cvf&lt;/span&gt;&lt;span&gt; dir.tar&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解包&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; xvf&lt;/span&gt;&lt;span&gt; dir.tar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.gz&lt;a href=&quot;#targz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zcvf&lt;/span&gt;&lt;span&gt; dir.tar.gz&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zxvf&lt;/span&gt;&lt;span&gt; dir.tar.gz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.bz&lt;a href=&quot;#tarbz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zcvf&lt;/span&gt;&lt;span&gt; dir.tar.gz&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; jxvf&lt;/span&gt;&lt;span&gt; dir.tar.bz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.bz2&lt;a href=&quot;#tarbz2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; jcvf&lt;/span&gt;&lt;span&gt; dir.tar.bz2&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; jxvf&lt;/span&gt;&lt;span&gt; dir.tar.bz2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.xz&lt;a href=&quot;#tarxz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; Jcvf&lt;/span&gt;&lt;span&gt; dir.tar.xz&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; Jxvf&lt;/span&gt;&lt;span&gt; dir.tar.xz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.Z&lt;a href=&quot;#tarz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; Zcvf&lt;/span&gt;&lt;span&gt; dir.tar.Z&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; Zxvf&lt;/span&gt;&lt;span&gt; dir.tar.Z&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tgz&lt;a href=&quot;#tgz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zcvf&lt;/span&gt;&lt;span&gt; dir.tgz&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zxvf&lt;/span&gt;&lt;span&gt; dir.tgz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.tgz&lt;a href=&quot;#tartgz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zcvf&lt;/span&gt;&lt;span&gt; dir.tar.tgz&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; zxvf&lt;/span&gt;&lt;span&gt; dir.tar.tgz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.tar.zst&lt;a href=&quot;#tarzst&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; -I&lt;/span&gt;&lt;span&gt; zstd&lt;/span&gt;&lt;span&gt; -cvf&lt;/span&gt;&lt;span&gt; dir.tar.zst&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; -I&lt;/span&gt;&lt;span&gt; zstd&lt;/span&gt;&lt;span&gt; -xvf&lt;/span&gt;&lt;span&gt; dir.tar.zst&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.gz&lt;a href=&quot;#gz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;gzip&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 1&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;gunzip&lt;/span&gt;&lt;span&gt; dir.gz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 2&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;gzip&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; dir.gz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.bz&lt;a href=&quot;#bz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 1&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;bzip2&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; dir.bz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 2&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;bunzip2&lt;/span&gt;&lt;span&gt; dir.bz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.bz2&lt;a href=&quot;#bz2&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;bzip2&lt;/span&gt;&lt;span&gt; -z&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 1&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;bzip2&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; dir.bz2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 2&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;bunzip2&lt;/span&gt;&lt;span&gt; dir.bz2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.xz&lt;a href=&quot;#xz&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;xz&lt;/span&gt;&lt;span&gt; -z&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;xz&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; dir.xz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.Z&lt;a href=&quot;#z&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;compress&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;uncompress&lt;/span&gt;&lt;span&gt; dir.Z&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.7z&lt;a href=&quot;#7z&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;7z&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt; dir.7z&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;使用密碼 (PASSWORD) 壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;7z&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt; dir.7z&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;span&gt; -pPASSWORD&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;7z&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span&gt; dir.7z&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.zip&lt;a href=&quot;#zip&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;zip&lt;/span&gt;&lt;span&gt; -r&lt;/span&gt;&lt;span&gt; dir.zip&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;unzip&lt;/span&gt;&lt;span&gt; dir.zip&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.rar&lt;a href=&quot;#rar&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rar&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt; dir.rar&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 1&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rar&lt;/span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span&gt; dir.rar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 2&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;unrar&lt;/span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span&gt; dir.rar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮 3 在指定目錄內解壓縮。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rar&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span&gt; dir.rar&lt;/span&gt;&lt;span&gt; dir_name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.lha&lt;a href=&quot;#lha&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;lha&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; dir.lha&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;lha&lt;/span&gt;&lt;span&gt; -e&lt;/span&gt;&lt;span&gt; dir.lha&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;.zst&lt;a href=&quot;#zst&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;zst&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;zstd&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; dir.zst&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/%E8%A7%A3%E5%A3%93%E7%B8%AE/&quot;&gt;解壓縮&lt;/a&gt;&lt;a href=&quot;/tags/%E5%A3%93%E7%B8%AE/&quot;&gt;壓縮&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2024-04-09&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:解壓縮</category><category>tag:壓縮</category></item><item><title>HyperX QuadCast 聲音很小</title><link>https://blog.thanatosdi.work/post/windows/hyperx-quadcast-%E8%81%B2%E9%9F%B3%E5%BE%88%E5%B0%8F</link><guid isPermaLink="false">windows/hyperx-quadcast-聲音很小</guid><description>HyperX QuadCast 聲音很小
因為正在服役的 HyperX cloud 耳麥的麥克風已經半死不活了，趁著 1212 的時候坑了一隻 HyperX QuadCast
然後因為是桌上型的 mic 所以距離嘴巴其實有一段不小的距離 (中間還隔了鍵盤)
image</description><pubDate>Fri, 16 Dec 2022 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;HyperX QuadCast 聲音很小&lt;a href=&quot;#hyperx-quadcast-聲音很小&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;因為正在服役的 HyperX cloud 耳麥的麥克風已經半死不活了，趁著 1212 的時候坑了一隻 HyperX QuadCast&lt;/p&gt;
&lt;p&gt;然後因為是桌上型的 mic 所以距離嘴巴其實有一段不小的距離 (中間還隔了鍵盤)&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/windows/post/hyperx_quadcast.webp&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;但在平時白天被朋友說講話的聲音很小聲，就整個很困惑，明明已經把增益轉到最大了還小聲？！&lt;br /&gt;
然後就看到這篇文章&lt;br /&gt;
但請各位小心服用 畢竟會對硬體造成什麼影響目前我也不知道&lt;/p&gt;
&lt;p&gt;如果您的設備直接或間接損壞，我拒絕承擔任何責任，請自行考慮好再使用～&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/HyperX/comments/97s0ez/hyperx_cloud_2_quiet_mic_solved/&quot;&gt;來源文章&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;簡單濃縮來說就是使用軟體 &lt;code&gt;Equalizer APO&lt;/code&gt; 和其擴充套件 &lt;code&gt;Peace&lt;/code&gt; 來提高麥克風音量&lt;/p&gt;
&lt;p&gt;實際的操作如下…&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安裝 Equalizer APO&lt;br /&gt;
一般來說只要下一步下一步安裝完之後會跳出 Configurator 要求選擇哪個裝置，例如我是要讓 HyperX QuadCast 就選擇這個裝置&lt;br /&gt;
如果沒有跳出來則打開程式目錄並啟動 Configurator.exe，轉到 “捕獲設備” 並選擇 / 勾選麥克風&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/equalizerapo/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/equalizerapo/&quot;&gt;Equalizer APO (sourceforge)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Equalizer APO 下載頁面&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安裝 Peace&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/peace-equalizer-apo-extension/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/peace-equalizer-apo-extension/&quot;&gt;Peace Equalizer, interface Equalizer APO (sourceforge)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Peace Equalizer, interface Equalizer APO 下載頁面&lt;/p&gt;
&lt;p&gt;Peace 就比較簡單有中文介面，安裝完之後選擇 “簡潔介面”&lt;/p&gt;
&lt;p&gt;首先從右下角的菜單中選擇您的麥克風 (預設為 “全部音訊設備”)&lt;br /&gt;
然後就可以在最上面調整想要大聲還是小聲&lt;br /&gt;
最後再按完成就完成調整麥克風大小聲拉～&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/208232169-88e470a5-186b-4c95-929c-91e2d125c2fa.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;/tags/windows/&quot;&gt;windows&lt;/a&gt;&lt;a href=&quot;/tags/%E9%BA%A5%E5%85%8B%E9%A2%A8%E5%BE%88%E5%B0%8F%E8%81%B2/&quot;&gt;麥克風很小聲&lt;/a&gt;&lt;a href=&quot;/tags/HyperX/&quot;&gt;HyperX&lt;/a&gt;&lt;a href=&quot;/tags/QuadCast/&quot;&gt;QuadCast&lt;/a&gt;&lt;a href=&quot;/tags/HyperX-QuadCast/&quot;&gt;HyperX QuadCast&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-12-17&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:windows</category><category>tag:windows</category><category>tag:麥克風很小聲</category><category>tag:HyperX</category><category>tag:QuadCast</category><category>tag:HyperX QuadCast</category></item><item><title>Minecraft 安裝 fabric</title><link>https://blog.thanatosdi.work/post/games/minecraft/minecraft-%E5%AE%89%E8%A3%9D-fabric</link><guid isPermaLink="false">games/minecraft/minecraft-安裝-fabric</guid><description>前言 (廢話 w)
玩 minecraft 到最後一定會想玩玩廣大開發者開發的各種 mods
而現在整個 minecraft vanilla 版本的 mod loader 就兩個

fabric
forge

而這邊介紹 fabric 的安裝流程
準備好 minecraft 客戶端</description><pubDate>Thu, 15 Sep 2022 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言 (廢話 w)&lt;a href=&quot;#前言-廢話-w&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;玩 minecraft 到最後一定會想玩玩廣大開發者開發的各種 mods&lt;br /&gt;
而現在整個 minecraft vanilla 版本的 mod loader 就兩個&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fabric&lt;/li&gt;
&lt;li&gt;forge&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而這邊介紹 fabric 的安裝流程&lt;/p&gt;
&lt;h1&gt;準備好 minecraft 客戶端&lt;a href=&quot;#準備好-minecraft-客戶端&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;當你下載好了客戶端並且看到下方的畫面的時候就先放著不理它，這邊就已經可以準備安裝 fabric&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/190607741-a1ffe80f-64b7-48bf-a8d9-7e1457cf48b3.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;h1&gt;下載 fabric&lt;a href=&quot;#下載-fabric&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://fabricmc.net/use/installer/&quot;&gt;fabric&lt;/a&gt; 下載 fabric&lt;/p&gt;
&lt;p&gt;開啟頁面後可以選擇下載 jar 檔或 exe 檔，兩個都可以使用&lt;br /&gt;
下載後會看到這個 UI&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/190611089-abb290be-78ed-4eae-b27a-681087498121.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;注意 1 確定上方頁籤是: “客戶端”&lt;br /&gt;
注意 2 確定 “Minecraft 版本” 是你即將遊玩的版本號&lt;br /&gt;
注意 3 確定 “安裝位置” 這個位置如果沒有&lt;strong&gt;刻意&lt;/strong&gt;去做調整就預設即可&lt;br /&gt;
注意 4 確定 “建立設定檔” 這個選項有打勾&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/190611323-9b791f77-86ea-4a0d-aa8c-80dd51f15b89.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;接著把 minecraft 客戶端關閉，並且在 _&lt;strong&gt;fabric 安裝程式&lt;/strong&gt;_中直接按下安裝就會開始安裝 fabric&lt;/p&gt;
&lt;p&gt;等待安裝完後再開啟 minecraft 客戶端，就會看到新的設定檔&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/190612152-41def0bb-276e-4dac-ad08-4d3bfd53f482.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h1&gt;安裝 mods&lt;a href=&quot;#安裝-mods&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;安裝 mods 很簡單，只要在 minecraft 客戶端上方的頁籤切換成 &lt;strong&gt;“安裝檔”&lt;/strong&gt;&lt;br /&gt;
並懸停在 fabric 的設定檔上，後方就會有三個按鈕可以按，點擊第二個會開啟資料夾&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/190612475-075b2c2e-b548-4fa7-bbe0-94cf6472d77b.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;此時只要將你下載的 fabric mods 放入 mods 資料夾內，重開遊戲就會自動載入 mods 了&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/190613055-b20118fc-db4e-4690-908f-0a632cee36d4.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/games/&quot;&gt;games&lt;/a&gt;&lt;a href=&quot;/tags/minecraft/&quot;&gt;minecraft&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-09-16&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:games</category><category>category:minecraft</category><category>tag:games</category><category>tag:minecraft</category></item><item><title>DSM photo、drive 反向代理</title><link>https://blog.thanatosdi.work/post/synology/dsm-photodrive-%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86</link><guid isPermaLink="false">synology/dsm-photodrive-反向代理</guid><description>DSM photo、drive 反向代理
預設 Synology 的 NAS photo 和 drive 兩個應用程式的 port 是與 DSM 相同
http 5000
https 5001
image
image
image
詳細的套件對應 port 可以參考 Synology 官方的文件</description><pubDate>Wed, 24 Aug 2022 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;DSM photo、drive 反向代理&lt;a href=&quot;#dsm-photodrive-反向代理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;預設 Synology 的 NAS photo 和 drive 兩個應用程式的 port 是與 DSM 相同&lt;br /&gt;
http 5000&lt;br /&gt;
https 5001&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186729195-d5316b2c-c527-4d59-85d1-aec53e80fc21.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;br /&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186729301-f985e8ed-bb6d-4a88-8980-1c88c094db85.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;br /&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186729388-436a4809-a905-4302-bd24-2fa64561f4f2.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;詳細的套件對應 port 可以參考 &lt;a href=&quot;https://kb.synology.com/zh-tw/DSM/tutorial/What_network_ports_are_used_by_Synology_services&quot;&gt;Synology 官方的文件&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;所以今天如果我們要在外面使用&lt;strong&gt;自有網域&lt;/strong&gt;透過網際網路存取 photo 和 drive 有兩種方式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;利用群輝自帶的 QuickConnect&lt;/li&gt;
&lt;li&gt;利用反向代理&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一個就不在此敘述如何設定，故這裡要使用的是第二個，利用反向代理&lt;/p&gt;
&lt;h2&gt;設定 photo 和 drive 的 port&lt;a href=&quot;#設定-photo-和-drive-的-port&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;首先我們要先修改 photo 和 drive 的應用程式所使用的 port&lt;br /&gt;
進到 &lt;code&gt;DSM -&amp;gt; 控制台 -&amp;gt; 登入入口 -&amp;gt; 應用程式 -&amp;gt; Synology Drive&lt;/code&gt;&lt;br /&gt;
在自訂連接埠設定 https 的 port 值，&lt;/p&gt;
&lt;p&gt;測試 warning 提醒&lt;/p&gt;
&lt;p&gt;這邊設定的 http 或 https 和 port 會影響到後續的反向代理設定&lt;br /&gt;
這邊舉例使用 https 並且連接埠 (port) 為 20000&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186730230-e3fd170c-a3b0-4f76-b340-e07ac31ee40c.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;設定反向代理&lt;a href=&quot;#設定反向代理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;接著到 &lt;code&gt;控制台 -&amp;gt; 登入入口 -&amp;gt; 進階 -&amp;gt; 反向代理&lt;/code&gt; 新增反向代理&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186730915-278f431b-a7ad-4f1c-a234-17f0acb0c72d.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186731409-e2085639-8d89-4c1f-aabb-697e8d666ae6.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3&gt;反向代理 - 來源&lt;a href=&quot;#反向代理---來源&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;反向代理名稱 輸入一個你自己懂得這是什麼服務的名字&lt;br /&gt;
通訊協定 在 &lt;a href=&quot;#%E8%A8%AD%E5%AE%9A-photo-%E5%92%8C-drive-%E7%9A%84-port&quot;&gt;設定 photo 和 drive 的 port&lt;/a&gt; 的地方所設定的連接埠 (port) 所對應的協定，這邊舉例使用 https 並且連接埠 (port) 為 20000&lt;br /&gt;
主機名稱 因為是 NAS 本機服務，所以這邊都是使用 &lt;code&gt;localhost&lt;/code&gt;&lt;br /&gt;
連接埠 在 &lt;a href=&quot;#%E8%A8%AD%E5%AE%9A-photo-%E5%92%8C-drive-%E7%9A%84-port&quot;&gt;設定 photo 和 drive 的 port&lt;/a&gt; 的地方所設定的連接埠 (port)，這邊舉例為 20000&lt;/p&gt;
&lt;h3&gt;反向代理 - 目的地&lt;a href=&quot;#反向代理---目的地&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;通訊協定 這邊建議都選擇 &lt;code&gt;https&lt;/code&gt; 可以到 &lt;code&gt;控制台 -&amp;gt; 安全性 -&amp;gt; 憑證&lt;/code&gt; 申請一個 TLS 證書&lt;br /&gt;
主機名稱 你的網域，例如我要用 &lt;code&gt;photo.example.com&lt;/code&gt; 開啟 photo 服務 就在此輸入 &lt;code&gt;photo.example.com&lt;/code&gt;&lt;br /&gt;
連接埠 如果第一個&lt;strong&gt;通訊協定&lt;/strong&gt;選擇為 https 這邊就要是 443；http 為 80&lt;br /&gt;
整體設定後就如下圖&lt;br /&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/12424898/186734520-b1c15620-0080-4329-a819-0163a212ee2d.png&quot; alt=&quot;image&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;設定完成後就可以透過自己的網域訪問服務啦&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Synology/&quot;&gt;Synology&lt;/a&gt;&lt;a href=&quot;/tags/NAS/&quot;&gt;NAS&lt;/a&gt;&lt;a href=&quot;/tags/DSM/&quot;&gt;DSM&lt;/a&gt;&lt;a href=&quot;/tags/Synology-photo/&quot;&gt;Synology photo&lt;/a&gt;&lt;a href=&quot;/tags/Synology-drive/&quot;&gt;Synology drive&lt;/a&gt;&lt;a href=&quot;/tags/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/&quot;&gt;反向代理&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2024-03-31&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:synology</category><category>tag:Synology</category><category>tag:NAS</category><category>tag:DSM</category><category>tag:Synology photo</category><category>tag:Synology drive</category><category>tag:反向代理</category></item><item><title>let&apos;s encrypt 證書簽署失敗 bad handshake</title><link>https://blog.thanatosdi.work/post/linux/let-s-encrypt-%E8%AD%89%E6%9B%B8%E7%B0%BD%E7%BD%B2%E5%A4%B1%E6%95%97-bad-handshake</link><guid isPermaLink="false">linux/let-s-encrypt-證書簽署失敗-bad-handshake</guid><description>
let’s encrypt 證書簽署失敗 bad handshake
當平時自動運作的 Let’s encrypt 都正常運作時，最近要簽署新證書卻發現下 certbot renew 無法正常簽署並出現錯誤 unexpected error: bad handshake 要怎麼處理這問題呢</description><pubDate>Wed, 15 Dec 2021 16:00:00 GMT</pubDate><content:encoded>&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/cover/hotlink-ok/LetsEncrypt-SocialShare.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;h1&gt;let’s encrypt 證書簽署失敗 bad handshake&lt;a href=&quot;#lets-encrypt-證書簽署失敗-bad-handshake&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;當平時自動運作的 Let’s encrypt 都正常運作時，最近要簽署新證書卻發現下 &lt;code&gt;certbot renew&lt;/code&gt; 無法正常簽署並出現錯誤 &lt;strong&gt;unexpected error: bad handshake&lt;/strong&gt; 要怎麼處理這問題呢&lt;/p&gt;
&lt;p&gt;其實這問題在先前官方有公告要調整 root 證書&lt;a href=&quot;https://letsencrypt.org/zh-tw/docs/dst-root-ca-x3-expiration-september-2021/&quot;&gt;公告&lt;/a&gt;，原先使用的 DST Root CA X3 將於 2021 年 9 月 30 日到期，而新的 ISRG Root X1 在舊裝置上並不存在，所以導致切換成 ISRG Root X1 而舊裝置找不到該憑證就導致 TLS handshake 失敗&lt;/p&gt;
&lt;p&gt;最簡單就是更新套件，而有些主機可能因為歷史包袱不好做套件更新等等處理，所以就手動新增 ISRG Root X1 證書來驗證&lt;/p&gt;
&lt;p&gt;首先先測試看看能不能訪問新的驗證端 API&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -v&lt;/span&gt;&lt;span&gt; https://acme-v02.api.letsencrypt.org/directory&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回傳的結果應該會有個 &lt;code&gt;SSL certificate problem: unable to get local issuer certificate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;接著到官網這邊取得 &lt;a href=&quot;https://letsencrypt.org/zh-tw/certificates/&quot;&gt;ISRG Root X1 證書&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/Snipaste_2021-12-16_17-45-15.webp&quot; alt=&quot;ISRG Root X1 證書&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;ISRG Root X1 證書&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;將裡面的文字複製起來，並且到主機中的 &lt;code&gt;/usr/local/share/ca-certificates&lt;/code&gt; 建立一個檔案 &lt;code&gt;isrgrootx1.pem&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;接著將內容貼上該檔案中，然後執行 &lt;code&gt;sudo update-ca-certificates&lt;/code&gt; 正常會顯示 &lt;code&gt;1 add&lt;/code&gt; ，此時在進行 &lt;code&gt;certbot renew&lt;/code&gt; 就可以正常執行了&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/let-s-encrypt/&quot;&gt;let’s encrypt&lt;/a&gt;&lt;a href=&quot;/tags/bad-handshake/&quot;&gt;bad handshake&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:let&apos;s encrypt</category><category>tag:bad handshake</category></item><item><title>CentOS 安裝 Webmin</title><link>https://blog.thanatosdi.work/post/linux/centos-%E5%AE%89%E8%A3%9D-webmin</link><guid isPermaLink="false">linux/centos-安裝-webmin</guid><description>利用 yum 安裝 Webmin
首先先下載 repo 到 /etc/yum.repos.d
cd /etc/yum.repos.d
接著 yum install 安裝即可
yum install webmin -y
LinuxWebminCentOS
此文章已被阅读次数…更新於</description><pubDate>Fri, 15 May 2020 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;利用 yum 安裝 Webmin&lt;/p&gt;
&lt;p&gt;首先先下載 repo 到 /etc/yum.repos.d&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; /etc/yum.repos.d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接著 yum install 安裝即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; webmin&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/Webmin/&quot;&gt;Webmin&lt;/a&gt;&lt;a href=&quot;/tags/CentOS/&quot;&gt;CentOS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-24&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:Webmin</category><category>tag:CentOS</category></item><item><title>Centos7 安裝多版本 Python</title><link>https://blog.thanatosdi.work/post/linux/centos7-%E5%AE%89%E8%A3%9D%E5%A4%9A%E7%89%88%E6%9C%AC-python</link><guid isPermaLink="false">linux/centos7-安裝多版本-python</guid><description>雖然現在 Python 最新版本已經到了 3.7 但是 Linux 上還是有蠻多的套件使用 Python2，加上 Python2.7 的支援期間只到 2020 (不知是否會再延長)，但越來越多的開發者已經轉移版本到 3.x 了
那要如何保留原始版本的 Python 另外再安裝 Python3.x</description><pubDate>Sat, 28 Sep 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;雖然現在 Python 最新版本已經到了 3.7 但是 Linux 上還是有蠻多的套件使用 Python2，加上 Python2.7 的支援期間只到 2020 (不知是否會再延長)，但越來越多的開發者已經轉移版本到 3.x 了&lt;br /&gt;
那要如何保留原始版本的 Python 另外再安裝 Python3.x 呢？&lt;br /&gt;
首先要有 ROOT 權限或者 sudo (廢話 w&lt;br /&gt;
然後到 &lt;a href=&quot;https://www.python.org/downloads/&quot;&gt;Python 官網&lt;/a&gt;找你要下載的版本連結&lt;br /&gt;
ps: 這邊範例為下載最新版本 3.7.4&lt;br /&gt;
如果要安裝多個 3.x 建議還是寫完整版號&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; /tmp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大致上到這邊就是完成安裝，但是不管用 python3 python3.7 python37 都是回應 command not found&lt;br /&gt;
很簡單因為剛剛安裝完沒有在預設的 command 資料夾中&lt;br /&gt;
所以我們要建立軟連結&lt;br /&gt;
PS: 這邊也是做個範例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;ln&lt;/span&gt;&lt;span&gt; -s&lt;/span&gt;&lt;span&gt; /usr/local/python3/bin/python3&lt;/span&gt;&lt;span&gt; /usr/bin/python3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣子你再執行 &lt;code&gt;python3 -V&lt;/code&gt; 照理就會出現 Python3.x.x 的訊息，同時執行 &lt;code&gt;python -V&lt;/code&gt; 會得到 Python2.7.5&lt;br /&gt;
這樣就安裝好其他版本的 Python 也保留預設的 Python2.7&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/Python/&quot;&gt;Python&lt;/a&gt;&lt;a href=&quot;/tags/Centos7/&quot;&gt;Centos7&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:Python</category><category>tag:Centos7</category></item><item><title>phpMyAdmin 啟用2FA</title><link>https://blog.thanatosdi.work/post/linux/phpmyadmin-%E5%95%9F%E7%94%A82fa</link><guid isPermaLink="false">linux/phpmyadmin-啟用2fa</guid><description>phpMyAdmin 啟用 2FA
最近把伺服器的 phpMyAdmin 升級到 4.9.1
然後就在設定裡面發現可以開啟 2FA 的選項
phpMyAdmin 中啟用 2FA
後來去看看 documentation 之後發現其實在 4.8.0 (2018/4/19)</description><pubDate>Tue, 24 Sep 2019 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;phpMyAdmin 啟用 2FA&lt;a href=&quot;#phpmyadmin-啟用-2fa&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;最近把伺服器的 phpMyAdmin 升級到 4.9.1&lt;br /&gt;
然後就在設定裡面發現可以開啟 2FA 的選項&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/phpmyadmin-enable-2fa.webp&quot; alt=&quot;phpMyAdmin 中啟用 2FA&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;phpMyAdmin 中啟用 2FA&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;後來去看看 documentation 之後發現其實在 4.8.0 (2018/4/19) 就加入這個功能了，沒錯啦我就是沒在更新，因為之前有過更新完系統直接掛掉的陰影存在，但其實為了安全性還是要好好的更新套件跟軟體 XD&lt;/p&gt;
&lt;p&gt;如果直接從 phpMyAdmin 官網下載下來的 zip 檔其實可以直接啟動 2FA 功能，那如果是直接 git 下來的就還要另外安裝一些套件，這邊不加以闡述&lt;/p&gt;
&lt;p&gt;啟用 2FA 非常簡單，只要選擇第二項 “認證應用程式 (2FA)“&lt;br /&gt;
然後按下” 設定雙因素認證 ”&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/phpmyadmin-enable-2fa-2.webp&quot; alt=&quot;phpMyAdmin 中啟用 2FA&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;phpMyAdmin 中啟用 2FA&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;接下來就會看到一個 QRcode 跟密碼&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/phpmyadmin-enable-2fa-3.webp&quot; alt=&quot;phpMyAdmin 中啟用 2FA&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;phpMyAdmin 中啟用 2FA&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;這邊就要用到你的手機了，使用 Google Two Factor Authentication 或者 Authy 兩個應用程式都可以，掃描 QRCode 之後並輸入該 2FA 的驗證就可以開啟了～&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/phpmyadmin-enable-2fa-finish.webp&quot; alt=&quot;phpMyAdmin 中啟用 2FA&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;phpMyAdmin 中啟用 2FA&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;那接下來就是緊急處理，如果是用 Google Two Factor Authentication 的使用者要注意，在做手機更換的時候 &lt;strong&gt;一定！一定！一定！一定！&lt;/strong&gt; 一定要先把 2FA 先解除在做更換手機的動作，不然會導致無法登入 phpMyAdmin&lt;/p&gt;
&lt;p&gt;那如果真的很不幸你真的忘記了，是有解決辦法&lt;br /&gt;
先用 ssh 登入你的 mysql&lt;br /&gt;
PS: 這邊是範例，忘記 root 的 2FA，請依照你自己的伺服器做處理&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;mysql&lt;/span&gt;&lt;span&gt; -u&lt;/span&gt;&lt;span&gt; root&lt;/span&gt;&lt;span&gt; -p&lt;/span&gt;&lt;span&gt; # 使用 root 登入 mysql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之後會看到一些資料&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; root&lt;/span&gt;&lt;span&gt;     |&lt;/span&gt;&lt;span&gt; 2019-09-25&lt;/span&gt;&lt;span&gt; 16:21:20&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt;&quot;Server\/hide_db&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;information_schema|mysql|performance_schema|information_schema&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;lang&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;zh_TW&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;collation_connection&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;utf8mb4_unicode_ci&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;Console\/Mode&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;collapse&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;DefaultConnectionCollation&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;utf8_unicode_ci&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;2fa&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;backend&lt;/span&gt;&lt;span&gt;&quot;:&quot;&lt;/span&gt;&lt;span&gt;application&lt;/span&gt;&lt;span&gt;&quot;,&quot;&lt;/span&gt;&lt;span&gt;settings&lt;/span&gt;&lt;span&gt;&quot;:{&quot;&lt;/span&gt;&lt;span&gt;secret&lt;/span&gt;&lt;span&gt;&quot;:&quot;&lt;/span&gt;&lt;span&gt;KKASIRHQ904U2KS918JSEBTJ9132459U1902&lt;/span&gt;&lt;span&gt;&quot;}},&quot;&lt;/span&gt;&lt;span&gt;ThemeDefault&lt;/span&gt;&lt;span&gt;&quot;:&quot;&lt;/span&gt;&lt;span&gt;pmahomme&lt;/span&gt;&lt;span&gt;&quot;} |&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最重要最重要的就是在後面的 JSON 資料中的 “2fa”&lt;br /&gt;
裡面有個”secret” 把這段輸入到 Google Two Factor Authentication 中就可以繼續使用了&lt;br /&gt;
PS: 這邊的範例是假的，當然沒有這麼的長&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/2FA/&quot;&gt;2FA&lt;/a&gt;&lt;a href=&quot;/tags/phpMyAdmin/&quot;&gt;phpMyAdmin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:2FA</category><category>tag:phpMyAdmin</category></item><item><title>Nginx+Cloudflare-取得使用者真實IP</title><link>https://blog.thanatosdi.work/post/linux/nginx-cloudflare-%E5%8F%96%E5%BE%97%E4%BD%BF%E7%94%A8%E8%80%85%E7%9C%9F%E5%AF%A6ip</link><guid isPermaLink="false">linux/nginx-cloudflare-取得使用者真實ip</guid><description>Nginx+Cloudflare - 取得使用者真實 IP
使用 Python 或者其他的程式語言架設網站的時候勢必一定要有個 Webserver 作為代理，但在有些時候網站的一些套件需要取得使用者的 IP 要如何取得？
一般來說 Nginx 只要在 virtualhost conf</description><pubDate>Sun, 22 Sep 2019 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Nginx+Cloudflare - 取得使用者真實 IP&lt;a href=&quot;#nginxcloudflare---取得使用者真實-ip&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;使用 Python 或者其他的程式語言架設網站的時候勢必一定要有個 Webserver 作為代理，但在有些時候網站的一些套件需要取得使用者的 IP 要如何取得？&lt;/p&gt;
&lt;p&gt;一般來說 Nginx 只要在 virtualhost conf 中設定以下就可以了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;proxy_set_header&lt;/span&gt;&lt;span&gt; Host&lt;/span&gt;&lt;span&gt; $host; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在程式部分 (使用 flask)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; flask &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; request &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣就可以取得使用者的 IP 了&lt;br /&gt;
但如果在 Nginx 前面還加個 Cloudflare CDN 怎麼辦？&lt;br /&gt;
其實在官方文件中有提到這點 &lt;a href=&quot;https://support.cloudflare.com/hc/en-us/articles/200170786-Restoring-original-visitor-IPs-Logging-visitor-IP-addresses-with-mod-cloudflare-&quot;&gt;Restoring original visitor IPs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nginx 上有提到的 Cloudflare IP 區間不一定是固定的，可能隨時會變動&lt;br /&gt;
&lt;a href=&quot;https://github.com/ergin/&quot;&gt;ergin&lt;/a&gt; 就寫出一個可以自動更新的腳本 &lt;a href=&quot;https://github.com/ergin/nginx-cloudflare-real-ip&quot;&gt;nginx-cloudflare-real-ip&lt;/a&gt;&lt;br /&gt;
然後我就 fork 之後把他的 readme 做翻譯&lt;br /&gt;
大致上跟著操作就可以了 最後別忘了到 Nginx 的 access log 查看 IP 是不是變成使用者的 IP&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/Python/&quot;&gt;Python&lt;/a&gt;&lt;a href=&quot;/tags/cloudflare/&quot;&gt;cloudflare&lt;/a&gt;&lt;a href=&quot;/tags/Nginx/&quot;&gt;Nginx&lt;/a&gt;&lt;a href=&quot;/tags/Real-IP-address/&quot;&gt;Real IP address&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>category:cloudflare</category><category>tag:Linux</category><category>tag:Python</category><category>tag:cloudflare</category><category>tag:Nginx</category><category>tag:Real IP address</category></item><item><title>使用 certbot+cloudflare 讓 wildcard certificate 自動更新憑證</title><link>https://blog.thanatosdi.work/post/linux/%E4%BD%BF%E7%94%A8-certbot-cloudflare-%E8%AE%93-wildcard-certificate-%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E6%86%91%E8%AD%89</link><guid isPermaLink="false">linux/使用-certbot-cloudflare-讓-wildcard-certificate-自動更新憑證</guid><description>下方使用 CentOS7 當作示範環境
如果你還沒裝 certbot，請先執行 yum install certbot

首先要先登入 Cloudflare，右上角 My Profile 那就可找到 Global API Key
請點選 View 輸入密碼就會出現，這把 Key 很重要請小心保管</description><pubDate>Tue, 18 Jun 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;下方使用 CentOS7 當作示範環境&lt;br /&gt;
如果你還沒裝 certbot，請先執行 &lt;code&gt;yum install certbot&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先要先登入 Cloudflare，右上角 My Profile 那就可找到 Global API Key&lt;br /&gt;
請點選 View 輸入密碼就會出現，這把 Key 很重要請小心保管&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/linux/post/Snipaste_2019-06-19_19-07-35.webp&quot; alt=&quot;api key&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;api key&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;由於這把 Key 很重要，所以要放在一個安全的地方&lt;br /&gt;
原作者把它放在 &lt;code&gt;/root/.secrets&lt;/code&gt; 裡面（你要改地方也行，最後的參數路徑記得改就好）&lt;br /&gt;
但系統預設沒有 &lt;code&gt;/root/.secrets&lt;/code&gt; 這個目錄&lt;br /&gt;
所以要先建立這個目錄 &lt;code&gt;mkdir /root/.secrets&lt;/code&gt;&lt;br /&gt;
然後把下面這兩行填好後放到 &lt;code&gt;/root/.secrets/cloudflare.ini&lt;/code&gt; 裡面&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;dns_cloudflare_email = &quot;請填你的cloudflare帳號，也就是email&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;dns_cloudflare_api_key = &quot;請輸入上述的 Global API Key&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;修改 &lt;code&gt;/root/.secrets/cloudflare.ini&lt;/code&gt; 權限&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;chmod 0700 /root/.secrets/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;chmod 0400 /root/.secrets/cloudflare.ini&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;安裝 Certbot 及 CloudFlare DNS 認證套件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum install python-pip&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pip install certbot-dns-cloudflare&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;申請 Wildcard SSL 憑證&lt;br /&gt;
把 &lt;code&gt;example.com&lt;/code&gt; 更換成自己的域名，如果有 4 級域名也要一起加入&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/cloudflare.ini -d example.com,*.example.com --preferred-challenges dns-01&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;於 crontab 設定自動 renew&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;nginx&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;14 5 * * * /usr/local/bin/certbot renew --quiet --post-hook &quot;/usr/sbin/service nginx reload&quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;apache&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;14 5 * * * /usr/local/bin/certbot renew --quiet --post-hook &quot;systemctl reload httpd&quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/certbot/&quot;&gt;certbot&lt;/a&gt;&lt;a href=&quot;/tags/cloudflare/&quot;&gt;cloudflare&lt;/a&gt;&lt;a href=&quot;/tags/certificate/&quot;&gt;certificate&lt;/a&gt;&lt;a href=&quot;/tags/wildcard-certificate/&quot;&gt;wildcard certificate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>category:cloudflare</category><category>tag:Linux</category><category>tag:certbot</category><category>tag:cloudflare</category><category>tag:certificate</category><category>tag:wildcard certificate</category></item><item><title>Debian / Ubuntu 安裝 Webmin</title><link>https://blog.thanatosdi.work/post/linux/debian-ubuntu-%E5%AE%89%E8%A3%9D-webmin</link><guid isPermaLink="false">linux/debian-ubuntu-安裝-webmin</guid><description>首先加入 Webmin 官方 repository, 開啟檔案 /etc/apt/sources.list
sudo vi /etc/apt/sources.list
加入以下兩行:
deb http://download.webmin.com/download/repository sarge</description><pubDate>Sun, 02 Jun 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;首先加入 Webmin 官方 repository, 開啟檔案 /etc/apt/sources.list&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; vi&lt;/span&gt;&lt;span&gt; /etc/apt/sources.list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加入以下兩行:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;deb http://download.webmin.com/download/repository sarge contrib&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後取得以上 repository 的 GPG key:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; /root&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加入 Webmin 的 repository 後，用安就很簡單了，更新 apt-get 就可以開始安裝了:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; apt-get&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Webmin 預設使用 10000 埠號，設定 firewall 開通 10000 埠號:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; ufw&lt;/span&gt;&lt;span&gt; allow&lt;/span&gt;&lt;span&gt; 10000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Webmin 預設使用的埠號是 10000, 可以這樣存取:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://localhost:10000&quot;&gt;http://localhost&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;
或&lt;br /&gt;
&lt;a href=&quot;https://localhost:10000&quot;&gt;https://localhost&lt;div&gt;&lt;/div&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/Webmin/&quot;&gt;Webmin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-24&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:Webmin</category></item><item><title>CentOS 更新Kernel</title><link>https://blog.thanatosdi.work/post/linux/centos-%E6%9B%B4%E6%96%B0kernel</link><guid isPermaLink="false">linux/centos-更新kernel</guid><description>1. 導入 Public Key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
2. 安裝 ELRepo
CentOS 5
rpm -Uvh</description><pubDate>Sun, 02 Jun 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;1. 導入 Public Key&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rpm&lt;/span&gt;&lt;span&gt; --import&lt;/span&gt;&lt;span&gt; https://www.elrepo.org/RPM-GPG-KEY-elrepo.org&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2. 安裝 ELRepo&lt;/p&gt;
&lt;p&gt;CentOS 5&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rpm&lt;/span&gt;&lt;span&gt; -Uvh&lt;/span&gt;&lt;span&gt; http://www.elrepo.org/elrepo-release-5-5.el5.elrepo.noarch.rpm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CentOS6&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rpm&lt;/span&gt;&lt;span&gt; -Uvh&lt;/span&gt;&lt;span&gt; http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CentOS7&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rpm&lt;/span&gt;&lt;span&gt; -Uvh&lt;/span&gt;&lt;span&gt; http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3. 升級 Kernel&lt;/p&gt;
&lt;p&gt;※在 ELRepo 中有兩個內核選項，一個是 kernel-lt (長期支持版本)，一個是 kernel-ml (主線最新版本)&lt;/p&gt;
&lt;p&gt;kernel-lt&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; --enablerepo=elrepo-kernel&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; kernel-lt&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;kernel-ml&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; --enablerepo=elrepo-kernel&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; kernel-ml&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4. 更改 Grub&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;vi /etc/grub.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根據安裝好以後的內核位置，修改 default 的值，一般是修改為 0，因為 default 從 0 開始，一般新安裝的內核在第一個位置，所以設置&lt;br /&gt;
default=0&lt;/p&gt;
&lt;p&gt;5. 查看 Kernel&lt;/p&gt;
&lt;p&gt;重啟主機，重啟後執行&lt;br /&gt;
&lt;code&gt;uname -r&lt;/code&gt;&lt;br /&gt;
，查看內核版本號，判斷是否升級成功&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/CentOS/&quot;&gt;CentOS&lt;/a&gt;&lt;a href=&quot;/tags/Kernel/&quot;&gt;Kernel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:CentOS</category><category>tag:Kernel</category></item><item><title>OpenVPN 使用帳號密碼認證</title><link>https://blog.thanatosdi.work/post/linux/openvpn-%E4%BD%BF%E7%94%A8%E5%B8%B3%E8%99%9F%E5%AF%86%E7%A2%BC%E8%AA%8D%E8%AD%89</link><guid isPermaLink="false">linux/openvpn-使用帳號密碼認證</guid><description>如果安裝好 OpenVPN 其實可以使用他預設的製作金鑰來連線，但是要新增帳號或者管理帳號這部分就比較麻煩，所以還是用帳號密碼做管理比較容易
首先先安裝以下編譯程式需要的日常庫
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel \</description><pubDate>Sun, 02 Jun 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果安裝好 OpenVPN 其實可以使用他預設的製作金鑰來連線，但是要新增帳號或者管理帳號這部分就比較麻煩，所以還是用帳號密碼做管理比較容易&lt;/p&gt;
&lt;p&gt;首先先安裝以下編譯程式需要的日常庫&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; gcc&lt;/span&gt;&lt;span&gt; gcc-c++&lt;/span&gt;&lt;span&gt; autoconf&lt;/span&gt;&lt;span&gt; libjpeg&lt;/span&gt;&lt;span&gt; libjpeg-devel&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面安装 pam 组件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; pam_krb5&lt;/span&gt;&lt;span&gt; pam_mysql&lt;/span&gt;&lt;span&gt; pam&lt;/span&gt;&lt;span&gt; pam-devel&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我們需要安裝 mysql 服務器&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; mysql&lt;/span&gt;&lt;span&gt; mysql-server&lt;/span&gt;&lt;span&gt; mysql-devel&lt;/span&gt;&lt;span&gt; mysql-libs&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;登錄 mysql 建立一個驗證用的測試數據庫，添加使用者帳號&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;mysql&lt;/span&gt;&lt;span&gt; -u&lt;/span&gt;&lt;span&gt; root&lt;/span&gt;&lt;span&gt; -p&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 /etc/pam.d/ 下建立一個配置文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;vim&lt;/span&gt;&lt;span&gt; /etc/pam.d/openvpn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸入以下內容並保存&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt; sufficient&lt;/span&gt;&lt;span&gt; pam_mysql.so&lt;/span&gt;&lt;span&gt; user=vpn&lt;/span&gt;&lt;span&gt; passwd=vpn123&lt;/span&gt;&lt;span&gt; host=localhost&lt;/span&gt;&lt;span&gt; db=vpn&lt;/span&gt;&lt;span&gt; table=vpnuser&lt;/span&gt;&lt;span&gt; usercolumn=name&lt;/span&gt;&lt;span&gt; passwdcolumn=password&lt;/span&gt;&lt;span&gt; where=active=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; sqllog=&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; crypt=&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;現在可以測試 pam_mysql 是否工作正常，但這個動作之前需要安裝 sasl&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; cyrus-sasl&lt;/span&gt;&lt;span&gt; cyrus-sasl-plain&lt;/span&gt;&lt;span&gt; cyrus-sasl-devel&lt;/span&gt;&lt;span&gt; cyrus-sasl-lib&lt;/span&gt;&lt;span&gt; cyrus-sasl-gssapi&lt;/span&gt;&lt;span&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;測試是否成功&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;saslauthd&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; pam&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果成功，顯示 0: OK 「Success.」，pam_mysql 工作正常了&lt;/p&gt;
&lt;p&gt;下面可以開始配置 OpenVPN 服務器了。&lt;/p&gt;
&lt;p&gt;這裡需要有一部非常重要的步驟，2.1 以上的 OpenVPN 的 openvpn-auth-pam.so 都會出現驗證錯誤的問題，這裡需要我們重新編譯一個低版本的，我這裡用 2.0.7 的，大家也可以使用 2.0.9 版本的。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; /etc/openvpn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之後在伺服器端的 conf 檔中加入以下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;client-cert-not-required&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;客戶端的 conf 檔&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;client&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果要讓客戶端連線時自動輸入帳號密碼可以在客戶端 conf 中的 &lt;code&gt;auth-user-pass&lt;/code&gt; 結尾加上 &lt;code&gt;檔案名稱+副檔名&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;auth-user-pass account.txt&lt;/code&gt;&lt;br /&gt;
並在同一個目錄底下新增一個 account 的 txt 檔&lt;br /&gt;
在第一行打上帳號，第二行打上密碼儲存即可&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/tags/Linux/&quot;&gt;Linux&lt;/a&gt;&lt;a href=&quot;/tags/OpenVPN/&quot;&gt;OpenVPN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此文章已被阅读次数&lt;/p&gt;&lt;div&gt;&lt;/div&gt;…更新於 2022-08-25&lt;p&gt;&lt;/p&gt;</content:encoded><category>category:linux</category><category>tag:Linux</category><category>tag:OpenVPN</category></item></channel></rss>