&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Stan Wu 吳信典</title><link>https://blog.stanwu.org/tags/lima/</link><description>拆解被包裝過的東西、數位自主權實踐、非典型理財觀</description><language>zh-TW</language><lastBuildDate>Tue, 07 Apr 2026 12:50:45 +0800</lastBuildDate><atom:link href="https://blog.stanwu.org/tags/lima/feed.xml" rel="self" type="application/rss+xml"/><item><title>LiveSync 專用資料庫（系統資料庫 single_node 模式會自動建立）</title><link>https://blog.stanwu.org/posts/livesync-obsidian-couchdb-https-setup/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.stanwu.org/posts/livesync-obsidian-couchdb-https-setup/</guid><description>&lt;h2 id="需求背景"&gt;需求背景&lt;/h2&gt;
&lt;p&gt;需要一套跨所有裝置（macOS、Windows、Linux、iOS）的 Obsidian vault 同步方案。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最終同步架構：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;全裝置 ←— LiveSync (HTTPS) —→ CouchDB (Lima VM)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Caddy (HTTPS 反向代理)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Tailscale 內網 (WireGuard 加密)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="callout callout-important"&gt;
&lt;div class="callout-title"&gt;iCloud 同步不可行&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;原本計畫 iOS 走 iCloud、電腦端走 LiveSync，Mac mini 作為中樞橋接兩邊。但實測發現 &lt;strong&gt;LiveSync 插件是全域同步的，無法在單一裝置上關閉&lt;/strong&gt;——只要 vault 啟用了 LiveSync，所有開啟該 vault 的裝置都會參與同步。因此&lt;strong&gt;無法讓 iOS 只走 iCloud 而不走 LiveSync&lt;/strong&gt;，必須統一用 LiveSync 同步所有裝置。&lt;/p&gt;
&lt;p&gt;這也意味著 &lt;strong&gt;HTTPS 是必要的&lt;/strong&gt;，因為 Obsidian mobile 強制要求加密連線。已透過 Caddy + Tailscale HTTPS 憑證解決。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2 id="環境概覽"&gt;環境概覽&lt;/h2&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;macOS (你的主機)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;虛擬化&lt;/td&gt;
&lt;td&gt;Lima VM (default), Ubuntu 25.10, x86_64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;容器工具&lt;/td&gt;
&lt;td&gt;nerdctl v2.2.1 + nerdctl compose（非 Docker）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VM 資源&lt;/td&gt;
&lt;td&gt;4 CPU / 4GB RAM / 100GB Disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;內網&lt;/td&gt;
&lt;td&gt;Tailscale (你的 tailnet)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;反向代理&lt;/td&gt;
&lt;td&gt;Caddy 2 (alpine)，提供 Tailscale HTTPS 終止&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="部署架構"&gt;部署架構&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;macOS (你的主機)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ Lima VM (default, Ubuntu 25.10 x86_64)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ nerdctl compose
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ Caddy 2 (alpine) — :443 TLS 終止，host network mode
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ Tailscale HTTPS 憑證 (Let&amp;#39;s Encrypt)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ reverse_proxy → 127.0.0.1:5984
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ CouchDB 3.5.1 — :5984
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ Lima port forward: 0.0.0.0:443, 0.0.0.0:5984
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="部署流程"&gt;部署流程&lt;/h2&gt;
&lt;h3 id="1-建立目錄"&gt;1. 建立目錄&lt;/h3&gt;
&lt;p&gt;Lima VM 內 macOS 掛載 &lt;code&gt;/Users/your-name&lt;/code&gt; 是&lt;strong&gt;唯讀&lt;/strong&gt;（virtiofs ro），所有可寫資料必須放在 Linux 本地路徑：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl shell default -- bash -c &lt;span class="s2"&gt;&amp;#34;mkdir -p /home/your-user/couchdb/etc /home/your-user/couchdb/data&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl shell default -- bash -c &lt;span class="s2"&gt;&amp;#34;mkdir -p /home/your-user/caddy/certs /home/your-user/caddy/data /home/your-user/caddy/config&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="callout callout-warning"&gt;
&lt;div class="callout-title"&gt;踩坑：Lima 的 HOME 目錄&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;&lt;code&gt;~/&lt;/code&gt; 在 Lima shell 中解析到 &lt;code&gt;/Users/your-name&lt;/code&gt;（macOS 掛載），是唯讀的。必須明確使用 &lt;code&gt;/home/your-user/&lt;/code&gt; 路徑。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;h3 id="2-couchdb-docker-composeyml"&gt;2. CouchDB docker-compose.yml&lt;/h3&gt;
&lt;p&gt;路徑：&lt;code&gt;/home/your-user/couchdb/docker-compose.yml&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;couchdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker.io/library/couchdb:3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;5984:5984&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;COUCHDB_USER=`你的帳號`&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;COUCHDB_PASSWORD=`你的密碼`&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./data:/opt/couchdb/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./etc:/opt/couchdb/etc/local.d&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-couchdb-設定檔"&gt;3. CouchDB 設定檔&lt;/h3&gt;
&lt;p&gt;路徑：&lt;code&gt;/home/your-user/couchdb/etc/local.ini&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[couchdb]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;single_node&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;max_document_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;50000000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;uuid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;your-generated-couchdb-uuid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[chttpd]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;require_valid_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;max_http_request_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;4294967296&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;enable_cors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;bind_address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[chttpd_auth]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;require_valid_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[httpd]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;WWW-Authenticate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Basic realm=&amp;#34;couchdb&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;bind_address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;enable_cors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[cors]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;origins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;app://obsidian.md,capacitor://localhost,http://localhost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;accept, authorization, content-type, origin, referer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;methods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;GET, PUT, POST, HEAD, DELETE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;max_age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;3600&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="callout callout-note"&gt;
&lt;div class="callout-title"&gt;&lt;code&gt;[admins]&lt;/code&gt; 區塊&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;CouchDB 啟動後會自動在 &lt;code&gt;local.ini&lt;/code&gt; 寫入 &lt;code&gt;[admins]&lt;/code&gt; 區塊，將明文密碼轉為 PBKDF2 hash。這是正常行為，不需要手動修改。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;設定重點：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;single_node=true&lt;/code&gt;：單節點模式，不需要叢集&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_document_size = 50000000&lt;/code&gt;：50MB，LiveSync 附件同步需要&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_http_request_size = 4294967296&lt;/code&gt;：4GB&lt;/li&gt;
&lt;li&gt;CORS 開啟：LiveSync 從 Obsidian App 直連 CouchDB 需要&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-啟動-couchdb"&gt;4. 啟動 CouchDB&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl shell default -- bash -c &lt;span class="s2"&gt;&amp;#34;cd /home/your-user/couchdb &amp;amp;&amp;amp; nerdctl compose up -d&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-建立資料庫"&gt;5. 建立資料庫&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X PUT &lt;span class="s1"&gt;&amp;#39;http://`你的帳號`:`你的密碼`@127.0.0.1:5984/your-sync-db&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="callout callout-warning"&gt;
&lt;div class="callout-title"&gt;密碼含特殊字元&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;密碼中的 &lt;code&gt;/&lt;/code&gt; 在 URL 裡要編碼為 &lt;code&gt;%2F&lt;/code&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;blockquote class="callout callout-warning"&gt;
&lt;div class="callout-title"&gt;踩坑：資料庫名稱限制&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;LiveSync 插件的 DB name 欄位&lt;strong&gt;不支援 &lt;code&gt;-&lt;/code&gt; 和 &lt;code&gt;_&lt;/code&gt; 符號&lt;/strong&gt;。原本取名 &lt;code&gt;my-sync-db&lt;/code&gt; 和 &lt;code&gt;my_sync_db&lt;/code&gt; 都失敗，最終用 &lt;code&gt;yoursyncdb&lt;/code&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2 id="caddy-反向代理https"&gt;Caddy 反向代理（HTTPS）&lt;/h2&gt;
&lt;h3 id="為什麼需要反向代理"&gt;為什麼需要反向代理？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Obsidian mobile（iOS/Android）的 LiveSync &lt;strong&gt;強制要求 HTTPS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;LiveSync 插件無法在個別裝置關閉，iOS 也必須用 LiveSync，所以 &lt;strong&gt;HTTPS 是必要的&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;CouchDB 本身不支援 HTTPS&lt;/li&gt;
&lt;li&gt;Caddy 作為 Lima VM 的&lt;strong&gt;統一反向代理&lt;/strong&gt;，未來新增服務（Vaultwarden 等）只要改 Caddyfile&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tailscale-https-憑證"&gt;Tailscale HTTPS 憑證&lt;/h3&gt;
&lt;p&gt;Tailscale 內建 Let&amp;rsquo;s Encrypt 憑證簽發，不需要自簽憑證：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 在 macOS 上產生憑證&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tailscale cert node.example.ts.net
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 複製到 Lima VM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl copy node.example.ts.net.crt default:/home/your-user/caddy/certs/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl copy node.example.ts.net.key default:/home/your-user/caddy/certs/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="callout callout-info"&gt;
&lt;div class="callout-title"&gt;憑證有效期&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;Tailscale 憑證約 90 天有效，需定期重新執行 &lt;code&gt;tailscale cert&lt;/code&gt; 並複製到 Lima VM。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;h3 id="caddy-docker-composeyml"&gt;Caddy docker-compose.yml&lt;/h3&gt;
&lt;p&gt;路徑：&lt;code&gt;/home/your-user/caddy/docker-compose.yml&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;caddy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker.io/library/caddy:2-alpine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;network_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;host&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./Caddyfile:/etc/caddy/Caddyfile:ro&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./certs:/etc/caddy/certs:ro&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./data:/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./config:/config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="callout callout-info"&gt;
&lt;div class="callout-title"&gt;為什麼用 network_mode: host？&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;Caddy 和 CouchDB 在不同的 compose 專案裡。用 host network 讓 Caddy 直接使用 VM 的網路堆疊，可以透過 &lt;code&gt;127.0.0.1:5984&lt;/code&gt; 連到 CouchDB，未來加任何服務都能直接連到。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;h3 id="caddyfile"&gt;Caddyfile&lt;/h3&gt;
&lt;p&gt;路徑：&lt;code&gt;/home/your-user/caddy/Caddyfile&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-caddyfile" data-lang="caddyfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;auto_https&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;node.example.ts.net:443&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;tls&lt;/span&gt; &lt;span class="s"&gt;/etc/caddy/certs/node.example.ts.net.crt&lt;/span&gt; &lt;span class="s"&gt;/etc/caddy/certs/node.example.ts.net.key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;handle_path&lt;/span&gt; &lt;span class="nd"&gt;/couchdb/*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;reverse_proxy&lt;/span&gt; &lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5984&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;ul&gt;
&lt;li&gt;&lt;code&gt;auto_https off&lt;/code&gt;：關閉 Caddy 自動 HTTPS，因為我們手動管理 Tailscale 憑證&lt;/li&gt;
&lt;li&gt;&lt;code&gt;handle_path /couchdb/*&lt;/code&gt;：將 &lt;code&gt;/couchdb/&lt;/code&gt; 路徑的請求反向代理到 CouchDB，並自動去除 &lt;code&gt;/couchdb&lt;/code&gt; 前綴&lt;/li&gt;
&lt;li&gt;未來新增服務，在此檔案加新的 &lt;code&gt;handle_path&lt;/code&gt; 區塊即可&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="啟動-caddy"&gt;啟動 Caddy&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl shell default -- bash -c &lt;span class="s2"&gt;&amp;#34;cd /home/your-user/caddy &amp;amp;&amp;amp; nerdctl compose up -d&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="擴充範例未來加-vaultwarden"&gt;擴充範例（未來加 Vaultwarden）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-caddyfile" data-lang="caddyfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;node.example.ts.net:443&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;tls&lt;/span&gt; &lt;span class="s"&gt;/etc/caddy/certs/node.example.ts.net.crt&lt;/span&gt; &lt;span class="s"&gt;/etc/caddy/certs/node.example.ts.net.key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;handle_path&lt;/span&gt; &lt;span class="nd"&gt;/couchdb/*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;reverse_proxy&lt;/span&gt; &lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5984&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;handle_path&lt;/span&gt; &lt;span class="nd"&gt;/vaultwarden/*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;reverse_proxy&lt;/span&gt; &lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="lima-port-forward-設定"&gt;Lima Port Forward 設定&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;~/.lima/default/lima.yaml&lt;/code&gt;（約第 507 行）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;portForwards&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;guestPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostIP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;guestPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5984&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostIP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改後需重啟 Lima VM（容器設定了 &lt;code&gt;restart: unless-stopped&lt;/code&gt;，重啟後會自動恢復）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;limactl stop default &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; limactl start default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;驗證：log 中看到以下兩行即成功：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Forwarding TCP from [::]:443 to 0.0.0.0:443&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Forwarding TCP from [::]:5984 to 0.0.0.0:5984&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="livesync-插件設定"&gt;LiveSync 插件設定&lt;/h2&gt;
&lt;h3 id="安裝"&gt;安裝&lt;/h3&gt;
&lt;p&gt;Obsidian → Settings → Community plugins → Browse → 搜尋 &lt;strong&gt;&amp;ldquo;Self-hosted LiveSync&amp;rdquo;&lt;/strong&gt; → Install → Enable&lt;/p&gt;
&lt;h3 id="初始設定流程"&gt;初始設定流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;選擇 &lt;strong&gt;Minimal setup&lt;/strong&gt;（不是 Use a Setup URI）&lt;/li&gt;
&lt;li&gt;填入連線資訊：
&lt;ul&gt;
&lt;li&gt;URI: &lt;code&gt;https://node.example.ts.net/couchdb&lt;/code&gt;（全裝置通用，含 mobile）&lt;/li&gt;
&lt;li&gt;或 &lt;code&gt;http://localhost:5984&lt;/code&gt;（本機直連，僅限同一台電腦）&lt;/li&gt;
&lt;li&gt;Database: &lt;code&gt;yoursyncdb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Username: &lt;code&gt;你的帳號&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Password: &lt;code&gt;你的密碼&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E2EE&lt;/strong&gt;：&lt;strong&gt;不啟用&lt;/strong&gt;（見下方說明）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internal API&lt;/strong&gt;：啟用（效能較好）&lt;/li&gt;
&lt;li&gt;同步模式：啟用 &lt;strong&gt;LiveSync&lt;/strong&gt;（即時 P2P 雙向同步）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="多裝置設定"&gt;多裝置設定&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主力機&lt;/strong&gt;（第一台）：Rebuild Everything → 選「I am setting up a new server for the first time / I want to reset my existing server」&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;其他裝置&lt;/strong&gt;：等主力機同步完 → Rebuild Everything → 選「My remote server is already set up. I want to join this device」&lt;/li&gt;
&lt;li&gt;其他裝置的 vault 內容跟主力機差不多 → 選「The files in this Vault are almost identical to the server&amp;rsquo;s」&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="初次同步"&gt;初次同步&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;首次會把整個 vault 推送到 CouchDB（1000+ 筆記、20000+ chunks）&lt;/li&gt;
&lt;li&gt;出現 &lt;strong&gt;&amp;ldquo;Do you want to send all chunks before replication?&amp;rdquo;&lt;/strong&gt; → 選 Yes&lt;/li&gt;
&lt;li&gt;資源消耗：CPU 167%、RAM 125MB、網路進 55.8MB（同步完成後降至 CPU 6%、RAM 115MB）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="callout callout-warning"&gt;
&lt;div class="callout-title"&gt;踩坑：Fetch Remote Configuration Failed&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;首次設定時會報 &amp;ldquo;Could not fetch configuration from remote&amp;rdquo;，這是&lt;strong&gt;正常的&lt;/strong&gt;。因為新資料庫裡還沒有任何設定檔。直接跳過繼續。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;blockquote class="callout callout-warning"&gt;
&lt;div class="callout-title"&gt;踩坑：Broken files detected&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;同步過程中偵測到壞檔案會阻止同步。先選 &amp;ldquo;Check it later&amp;rdquo; 讓整體同步跑完，之後回來處理壞檔案即可恢復正常。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2 id="e2ee-的教訓"&gt;E2EE 的教訓&lt;/h2&gt;
&lt;blockquote class="callout callout-danger"&gt;
&lt;div class="callout-title"&gt;不建議啟用 E2EE&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;曾經啟用 E2EE（含 Obfuscate Properties），結果遇到嚴重問題：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;多裝置解密失敗&lt;/strong&gt;：第三台裝置即使 passphrase 完全一致，仍報 &amp;ldquo;Decryption with HKDF failed on Path&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特定檔案加解密出錯&lt;/strong&gt;：大檔、含特殊字元的檔名、二進位附件容易觸發&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;關閉 E2EE 需要全部重來&lt;/strong&gt;：清空資料庫、所有裝置重新同步&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;結論：&lt;/strong&gt; 走 Tailscale 內網已有 WireGuard 加密，傳輸安全性足夠，不需要再疊一層 E2EE。關閉 E2EE 後同步速度明顯提升，也更穩定。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;h3 id="清空資料庫重建流程關閉-e2ee-時用到"&gt;清空資料庫重建流程（關閉 E2EE 時用到）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 刪除並重建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X DELETE &lt;span class="s1"&gt;&amp;#39;http://`你的帳號`:`你的密碼`@127.0.0.1:5984/yoursyncdb&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X PUT &lt;span class="s1"&gt;&amp;#39;http://`你的帳號`:`你的密碼`@127.0.0.1:5984/yoursyncdb&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 清除廢棄資料庫&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X DELETE &lt;span class="s1"&gt;&amp;#39;http://`你的帳號`:`你的密碼`@127.0.0.1:5984/my-sync-db&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X DELETE &lt;span class="s1"&gt;&amp;#39;http://`你的帳號`:`你的密碼`@127.0.0.1:5984/my_sync_db&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 驗證&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl &lt;span class="s1"&gt;&amp;#39;http://`你的帳號`:`你的密碼`@127.0.0.1:5984/_all_dbs&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 預期：[&amp;#34;_replicator&amp;#34;,&amp;#34;_users&amp;#34;,&amp;#34;yoursyncdb&amp;#34;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然後主力機 reset server，其他裝置 join。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="同步架構決策"&gt;同步架構決策&lt;/h2&gt;
&lt;h3 id="為什麼不用-cloudflare--linode"&gt;為什麼不用 Cloudflare / Linode？&lt;/h3&gt;
&lt;p&gt;Tailscale 內網 + Caddy HTTPS 已經能讓所有裝置（含 mobile）互通，走內網延遲低、免費、憑證自動簽發。不需要公網部署。&lt;/p&gt;
&lt;h3 id="為什麼-https-是必要的"&gt;為什麼 HTTPS 是必要的？&lt;/h3&gt;
&lt;p&gt;原本以為電腦端用 HTTP、iOS 走 iCloud 就好，不需要 HTTPS。但因為 LiveSync 插件無法在個別裝置關閉，iOS 也必須用 LiveSync 同步，而 &lt;strong&gt;Obsidian mobile 強制要求 HTTPS&lt;/strong&gt;，所以 HTTPS 變成必要設定。&lt;/p&gt;
&lt;h3 id="icloud-方案已放棄"&gt;iCloud 方案已放棄&lt;/h3&gt;
&lt;blockquote class="callout callout-danger"&gt;
&lt;div class="callout-title"&gt;iCloud + LiveSync 不能共存&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;原本計畫讓 Mac mini 同時走 iCloud 和 LiveSync，iOS 單獨走 iCloud。但 LiveSync 是 vault 層級的插件，&lt;strong&gt;無法在個別裝置上單獨關閉同步&lt;/strong&gt;。一旦 vault 啟用 LiveSync，所有裝置都必須參與。因此 iCloud 同步已完全放棄，全部改走 LiveSync + Tailscale HTTPS。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;h3 id="所有裝置都必須裝-livesync"&gt;所有裝置都必須裝 LiveSync&lt;/h3&gt;
&lt;p&gt;LiveSync 是同步型插件，vault 內啟用後所有開啟該 vault 的裝置都會同步。包括 iOS 也必須安裝並設定 LiveSync，連線到 HTTPS endpoint &lt;code&gt;https://node.example.ts.net/couchdb&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="livesync-也支援-s3"&gt;LiveSync 也支援 S3？&lt;/h3&gt;
&lt;p&gt;是的，可用 AWS S3、MinIO、Cloudflare R2 等替代 CouchDB。但目前用 CouchDB 走 Tailscale 內網免費且快速，沒有必要換。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="nerdctl-vs-docker"&gt;nerdctl vs Docker&lt;/h2&gt;
&lt;p&gt;Lima VM 使用 nerdctl（containerd 前端），非 Docker。個人用途完全足夠：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能與 Docker 幾乎一致，compose 也支援&lt;/li&gt;
&lt;li&gt;免費、無授權限制（Docker Desktop 商業用要付費）&lt;/li&gt;
&lt;li&gt;CouchDB 這類標準 image 跑起來沒有任何差異&lt;/li&gt;
&lt;li&gt;資源消耗極低：閒置時 CPU &amp;lt; 6%、RAM 約 115MB&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="callout callout-tip"&gt;
&lt;div class="callout-title"&gt;nerdctl stats 注意事項&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;&lt;code&gt;nerdctl stats --no-stream&lt;/code&gt; 在 Lima VM 中偶爾會卡住不退出，累積殭屍進程吃 CPU。如果 load average 異常飆高，用 &lt;code&gt;ps aux | grep 'nerdctl stats'&lt;/code&gt; 檢查並 kill。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2 id="連線資訊"&gt;連線資訊&lt;/h2&gt;
&lt;h3 id="livesync-插件填入全裝置通用"&gt;LiveSync 插件填入（全裝置通用）&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;URI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://node.example.ts.net/couchdb&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;&lt;code&gt;yoursyncdb&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Username&lt;/td&gt;
&lt;td&gt;&lt;code&gt;admin&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password&lt;/td&gt;
&lt;td&gt;&lt;code&gt;你的密碼&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class="callout callout-important"&gt;
&lt;div class="callout-title"&gt;iOS / mobile 裝置&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;必須先開啟 &lt;strong&gt;Tailscale VPN&lt;/strong&gt; 才能連到 &lt;code&gt;node.example.ts.net&lt;/code&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;h3 id="服務位置"&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;CouchDB 位置&lt;/td&gt;
&lt;td&gt;Lima VM &lt;code&gt;/home/your-user/couchdb/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caddy 位置&lt;/td&gt;
&lt;td&gt;Lima VM &lt;code&gt;/home/your-user/caddy/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CouchDB 版本&lt;/td&gt;
&lt;td&gt;3.5.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS URI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://node.example.ts.net/couchdb&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP URI（本機直連）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http://localhost:5984&lt;/code&gt; 或 &lt;code&gt;http://100.115.83.44:5984&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="檔案結構總覽"&gt;檔案結構總覽&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/your-user/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── couchdb/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── docker-compose.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── data/ # CouchDB 資料
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── etc/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── local.ini # CouchDB 設定
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── caddy/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── docker-compose.yml # network_mode: host
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Caddyfile # 反向代理設定
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── certs/ # Tailscale TLS 憑證
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ ├── node.example.ts.net.crt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ └── node.example.ts.net.key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── data/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── config/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── nginx-proxy-manager/ # 舊，未使用
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── zoraxy/ # 舊，未使用
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="待處理"&gt;待處理&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 多裝置同步鏈路完整測試（全裝置透過 LiveSync HTTPS 同步）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Tailscale HTTPS 憑證自動更新機制（目前手動，90 天到期）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="mcp-設定備忘"&gt;MCP 設定備忘&lt;/h2&gt;
&lt;p&gt;此次也處理了 Claude Code 的 MCP 設定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;移除 Todoist MCP&lt;/strong&gt;：&lt;code&gt;claude mcp remove todoist&lt;/code&gt;（從 &lt;code&gt;~/.claude.json&lt;/code&gt; 移除）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新增 Obsidian MCP (stdio)&lt;/strong&gt;：&lt;code&gt;claude mcp add --transport stdio obsidian -- node /Users/your-name/mcp-obsidian/dist/index.js --stdio&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;MCP server 定義要放在 &lt;code&gt;~/.claude.json&lt;/code&gt;（按 project 路徑分區），&lt;strong&gt;不是&lt;/strong&gt; &lt;code&gt;~/.claude/settings.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;settings.json&lt;/code&gt; 只放權限、effort level 等設定，不放 MCP server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vault 路徑&lt;/strong&gt;：已從 iCloud 改為 &lt;code&gt;/Users/your-name/Obsidian Vault/個人筆記庫&lt;/code&gt;（設定檔：&lt;code&gt;~/.obsidian-mcp.json&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>