[{"data":1,"prerenderedAt":6389},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices":421,"\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices-surround":1952},[4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346],{"path":5},"\u002Fde\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":7},"\u002Fde\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":9},"\u002Fde\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":11},"\u002Fde\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":13},"\u002Fde\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":15},"\u002Fde\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":17},"\u002Fde\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":19},"\u002Fde\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":21},"\u002Fde\u002Farticle\u002Fsetup-antigravity-2",{"path":23},"\u002Fde\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":25},"\u002Fde\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":27},"\u002Fde\u002Farticle\u002Fsync-obsidian-across-devices",{"path":29},"\u002Fde\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":31},"\u002Fde\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":33},"\u002Fde\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":35},"\u002Fde\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":37},"\u002Fen\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":39},"\u002Fen\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":41},"\u002Fen\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":43},"\u002Fen\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":45},"\u002Fen\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":47},"\u002Fen\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":49},"\u002Fen\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":51},"\u002Fen\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":53},"\u002Fen\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":55},"\u002Fen\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":57},"\u002Fen\u002Farticle\u002Fsetup-antigravity-2",{"path":59},"\u002Fen\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":61},"\u002Fen\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":63},"\u002Fen\u002Farticle\u002Fsync-obsidian-across-devices",{"path":65},"\u002Fen\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":67},"\u002Fen\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":69},"\u002Fen\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":71},"\u002Fen\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":73},"\u002Fes\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":75},"\u002Fes\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":77},"\u002Fes\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":79},"\u002Fes\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":81},"\u002Fes\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":83},"\u002Fes\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":85},"\u002Fes\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":87},"\u002Fes\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":89},"\u002Fes\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":91},"\u002Fes\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":93},"\u002Fes\u002Farticle\u002Fsetup-antigravity-2",{"path":95},"\u002Fes\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":97},"\u002Fes\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":99},"\u002Fes\u002Farticle\u002Fsync-obsidian-across-devices",{"path":101},"\u002Fes\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":103},"\u002Fes\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":105},"\u002Fes\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":107},"\u002Fes\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":109},"\u002Ffr\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":111},"\u002Ffr\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":113},"\u002Ffr\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":115},"\u002Ffr\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":117},"\u002Ffr\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":119},"\u002Ffr\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":121},"\u002Ffr\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":123},"\u002Ffr\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":125},"\u002Ffr\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":127},"\u002Ffr\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":129},"\u002Ffr\u002Farticle\u002Fsetup-antigravity-2",{"path":131},"\u002Ffr\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":133},"\u002Ffr\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":135},"\u002Ffr\u002Farticle\u002Fsync-obsidian-across-devices",{"path":137},"\u002Ffr\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":139},"\u002Ffr\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":141},"\u002Ffr\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":143},"\u002Ffr\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":145},"\u002Fid\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":147},"\u002Fid\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":149},"\u002Fid\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":151},"\u002Fid\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":153},"\u002Fid\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":155},"\u002Fid\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":157},"\u002Fid\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":159},"\u002Fid\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":161},"\u002Fid\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":163},"\u002Fid\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":165},"\u002Fid\u002Farticle\u002Fsetup-antigravity-2",{"path":167},"\u002Fid\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":169},"\u002Fid\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":171},"\u002Fid\u002Farticle\u002Fsync-obsidian-across-devices",{"path":173},"\u002Fid\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":175},"\u002Fid\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":177},"\u002Fid\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":179},"\u002Fid\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":181},"\u002Fja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":183},"\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":185},"\u002Fja\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":187},"\u002Fja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":189},"\u002Fja\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":191},"\u002Fja\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":193},"\u002Fja\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":195},"\u002Fja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":197},"\u002Fja\u002Farticle\u002Fsetup-antigravity-2",{"path":199},"\u002Fja\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":201},"\u002Fja\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":203},"\u002Fja\u002Farticle\u002Fsync-obsidian-across-devices",{"path":205},"\u002Fja\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":207},"\u002Fja\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":209},"\u002Fja\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":211},"\u002Fja\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":213},"\u002Fpt\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":215},"\u002Fpt\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":217},"\u002Fpt\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":219},"\u002Fpt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":221},"\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":223},"\u002Fpt\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":225},"\u002Fpt\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":227},"\u002Fpt\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":229},"\u002Fpt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":231},"\u002Fpt\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":233},"\u002Fpt\u002Farticle\u002Fsetup-antigravity-2",{"path":235},"\u002Fpt\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":237},"\u002Fpt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":239},"\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices",{"path":241},"\u002Fpt\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":243},"\u002Fpt\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":245},"\u002Fpt\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":247},"\u002Fpt\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":249},"\u002Ftw\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":251},"\u002Ftw\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":253},"\u002Ftw\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":255},"\u002Ftw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":257},"\u002Ftw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":259},"\u002Ftw\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":261},"\u002Ftw\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":263},"\u002Ftw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":265},"\u002Ftw\u002Farticle\u002Fsetup-antigravity-2",{"path":267},"\u002Ftw\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":269},"\u002Ftw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":271},"\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices",{"path":273},"\u002Ftw\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":275},"\u002Ftw\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":277},"\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":279},"\u002Ftw\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":281},"\u002Fvi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":283},"\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":285},"\u002Fvi\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":287},"\u002Fvi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":289},"\u002Fvi\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":291},"\u002Fvi\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":293},"\u002Fvi\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":295},"\u002Fvi\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":297},"\u002Fvi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":299},"\u002Fvi\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":301},"\u002Fvi\u002Farticle\u002Fsetup-antigravity-2",{"path":303},"\u002Fvi\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":305},"\u002Fvi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":307},"\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices",{"path":309},"\u002Fvi\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":311},"\u002Fvi\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":313},"\u002Fvi\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":315},"\u002Fvi\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":317},"\u002Fzh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":319},"\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":321},"\u002Fzh\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":323},"\u002Fzh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":325},"\u002Fzh\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":327},"\u002Fzh\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":329},"\u002Fzh\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":331},"\u002Fzh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":333},"\u002Fzh\u002Farticle\u002Fsetup-antigravity-2",{"path":335},"\u002Fzh\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":337},"\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":339},"\u002Fzh\u002Farticle\u002Fsync-obsidian-across-devices",{"path":341},"\u002Fzh\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":343},"\u002Fzh\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":345},"\u002Fzh\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":347},"\u002Fzh\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417],{"title":350,"path":351,"stem":352},"AI Agent Skills: What They Are & How to Create Them","\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them","en\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"title":354,"path":355,"stem":356},"Bringing Buzz to DeepSeek Harness: Taught to Speak Nostr","\u002Farticle\u002Fbringing-buzz-to-deepseek-harness","en\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"title":358,"path":359,"stem":360},"Solving AI Agent Skills Fragmentation with npx skills","\u002Farticle\u002Fcentralised-the-skills-for-agents","en\u002Farticle\u002Fcentralised-the-skills-for-agents",{"title":362,"path":363,"stem":364},"How to Expose Hermes Agent Privately with Cloudflare WARP","\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp","en\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"title":366,"path":367,"stem":368},"How AI Agent Skills Replace Nuxt App Scaffolding Scripts","\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts","en\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"title":370,"path":371,"stem":372},"Stop Exposing Your Vault: Secure NodeWarden with Cloudflare","\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare","en\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"title":374,"path":375,"stem":376},"How to Deploy Hermes Agent on a Linux VPS","\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server","en\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"title":378,"path":379,"stem":380},"Self-Host Your Travel Itineraries with TREK and Docker","\u002Farticle\u002Fself-hosted-travel-planner-trek","en\u002Farticle\u002Fself-hosted-travel-planner-trek",{"title":382,"path":383,"stem":384},"Self-Host Block's Buzz: Shared AI Agent Workspace","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues","en\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"title":386,"path":387,"stem":388},"How to Self-Host a BitWarden Compatible Server Nodewarden","\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare","en\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"title":390,"path":391,"stem":392},"Google Antigravity 2 Hands-On: Setup & First Impressions","\u002Farticle\u002Fsetup-antigravity-2","en\u002Farticle\u002Fsetup-antigravity-2",{"title":394,"path":395,"stem":396},"NetSuite AI Connector Guide: MCP Setup & Use Cases","\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude","en\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"title":398,"path":399,"stem":400},"Switch Between Multiple Cloudflare WARP Orgs on Mac","\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac","en\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"title":402,"path":403,"stem":404},"How to Sync Obsidian Vaults Across Devices Securely","\u002Farticle\u002Fsync-obsidian-across-devices","en\u002Farticle\u002Fsync-obsidian-across-devices",{"title":406,"path":407,"stem":408},"Testing Claude Fable 5: A Financial Analysis Review","\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis","en\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"title":410,"path":411,"stem":412},"Guide to Browser and Scheduler in Antigravity 2","\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2","en\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"title":414,"path":415,"stem":416},"Build a Persistent AI Memory System on Cloudflare","\u002Farticle\u002Fuse-cloudflare-as-ai-memory","en\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"title":418,"path":419,"stem":420},"Antigravity 2 in Action: AI Agents, Skills, and MCP","\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2","en\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"id":422,"title":423,"author":424,"body":425,"category":1926,"date":1928,"description":1929,"extension":1930,"image":1931,"imageAlt":1932,"isPublished":737,"meta":1933,"minRead":772,"navigation":737,"path":271,"seo":1942,"stem":1944,"tags":1945,"updatedAt":1950,"__hash__":1951},"article\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices.md","如何在多台裝置之間安全地同步 Obsidian 本地筆記庫","",{"type":426,"value":427,"toc":1904},"minimark",[428,432,438,449,458,478,483,492,497,502,518,534,537,542,546,553,558,562,566,641,649,681,685,693,701,708,775,778,797,804,816,820,824,831,836,847,868,873,886,891,896,901,916,919,924,927,932,936,941,955,959,973,984,988,993,997,1004,1037,1041,1048,1201,1235,1241,1262,1273,1278,1282,1297,1370,1374,1379,1415,1546,1553,1559,1566,1572,1575,1581,1588,1603,1614,1621,1627,1638,1775,1781,1786,1789,1794,1797,1801,1807,1812,1818,1829,1839,1843,1855,1861,1867,1873,1877,1900],[429,430,431],"p",{},"Obsidian 是一款本地優先的知識管理應用。每一個筆記在裝置上都是一個本地 Markdown 檔案，並完全處於您的掌控之中。然而，我們通常希望在筆記型電腦、手機和其他裝置上共享同一個本地筆記庫，或者希望在某些時候能夠透過網頁瀏覽器遠端存取它。",[433,434],"img",{"src":435,"alt":436,"style":437},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-multi-device-sync-illustration.webp","跨多裝置同步的 Obsidian 本地筆記庫的插圖","max-width: 667px; width: 100%; height: auto;",[429,439,440,441,448],{},"市面上有許多針對 Obsidian 的同步方案，但在衝突處理、加密和數據自主權方面，它們或多或少都做出了一些妥協。",[442,443,447],"a",{"href":444,"rel":445},"https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch",[446],"nofollow","Synch"," 是一款開源應用，它可以在自建伺服器上實現具備端到端加密和衝突解決機制的 Obsidian 筆記庫同步。",[429,450,451,452,457],{},"雖然 Obsidian 的本地優先方案在絕大多數情况下都能完美運作，但在某些場景下，我們可能仍需要透過網頁瀏覽器遠端存取並編輯筆記。",[442,453,456],{"href":454,"rel":455},"https:\u002F\u002Fgithub.com\u002FNystik-gh\u002Fignis",[446],"Ignis"," 是一款開源應用，它能夠讓網頁瀏覽器中以接近原生的體驗執行 Obsidian，讓您能够直接讀取和編輯筆記庫。",[429,459,460,461,465,466,468,469,471,472,477],{},"在本文中，我們將在一台 ",[462,463,464],"strong",{},"VPS","（虛擬專用伺服器）上部署 ",[462,467,447],{}," 和 ",[462,470,456],{},"，並將它們安全地託管在 ",[462,473,474],{},[442,475,476],{"href":363},"Cloudflare Zero Trust"," 私有網路中，而無需將它們直接暴露在公網上。",[433,479],{"src":480,"alt":481,"style":482},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-sync-cloudflare-zero-trust-architecture.webp","使用 Cloudflare Zero Trust 安全網路同步 Obsidian 的架構圖","max-width: 671px; width: 100%; height: auto;",[484,485],"article-card",{"description":486,"image":487,"image-alt":488,"label":489,"min-read":490,"title":491,"to":363},"學習如何使用 Cloudflare WARP 和 Zero Trust 安全地在全網範圍內暴露和存取您的 Hermes Agent，而無需在防火牆上開啟任何入站連接埠。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FEN-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","使用 Cloudflare Zero Trust 和 WARP 隧道安全地將 Hermes Agent 暴露到私有網路中","相關指南","8","如何使用 Cloudflare WARP 私密地公開暴露 Hermes Agent",[493,494,496],"h2",{"id":495},"使用-synch-安全同步-obsidian-筆記庫","使用 Synch 安全同步 Obsidian 筆記庫",[429,498,499,501],{},[462,500,447],{}," 提供以下特性：",[503,504,505,509,512,515],"ul",{},[506,507,508],"li",{},"偵測到變更時立即即時同步您的筆記庫",[506,510,511],{},"並在上傳前對筆記庫資料進行端到端加密",[506,513,514],{},"支援從歷史版本記錄中進行復原",[506,516,517],{},"內建自動衝突解決機制",[429,519,520,522,523,526,527,530,531,533],{},[462,521,447],{}," 會在您的本地裝置上生成一個隨機的 32 位元組",[462,524,525],{},"筆記庫金鑰","（Vault Key），該金鑰專門用於加密您的筆記庫資料。當您建立遠端筆記庫時，您需要設定一個",[462,528,529],{},"筆記庫密碼","。該密碼用於保護您的",[462,532,525],{},"，以便能夠將金鑰安全地儲存在伺服器上，並在其他裝置上進行解密。",[429,535,536],{},"筆記的衝突解決是在用戶端裝置上完成的，而不是在伺服器端。如果兩台裝置同時編輯同一個筆記，伺服器會保留最先到達的版本，並通知另一台裝置其本地版本已過期。隨後，該裝置會自動將伺服器上的最新版本與其本地變更進行合併，然後再將合併後的最終筆記上傳。",[538,539,541],"h3",{"id":540},"在您的-vps-上部署-synch","在您的 VPS 上部署 Synch",[543,544,545],"h4",{"id":545},"建立網域名稱解析",[429,547,548,549,552],{},"在 Cloudflare 中建立一條 A 記錄，並將其代理狀態設定為",[462,550,551],{},"僅限 DNS","（繞過 Cloudflare CDN）。",[433,554],{"src":555,"alt":556,"style":557},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fcloudflare-dns-a-record-synch-server.webp","在 Cloudflare 中為 Synch 同步伺服器設定 DNS A 記錄","max-width: 538px; width: 100%; height: auto;",[543,559,561],{"id":560},"在-ubuntu-上使用-docker-安裝-synch","在 Ubuntu 上使用 Docker 安裝 Synch",[563,564,565],"h5",{"id":565},"克隆倉庫",[567,568,572],"pre",{"className":569,"code":570,"language":571,"meta":424,"style":424},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git       \n        \n# Navigate to the API folder\ncd synch\u002Fapps\u002Fapi\n        \n# Copy the example environment file:\ncp .env.example .env\n","bash",[573,574,575,595,601,608,618,623,629],"code",{"__ignoreMap":424},[576,577,580,584,588,591],"span",{"class":578,"line":579},"line",1,[576,581,583],{"class":582},"sBMFI","git",[576,585,587],{"class":586},"sfazB"," clone",[576,589,590],{"class":586}," https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git",[576,592,594],{"class":593},"sTEyZ","       \n",[576,596,598],{"class":578,"line":597},2,[576,599,600],{"class":593},"        \n",[576,602,604],{"class":578,"line":603},3,[576,605,607],{"class":606},"sHwdD","# Navigate to the API folder\n",[576,609,611,615],{"class":578,"line":610},4,[576,612,614],{"class":613},"s2Zo4","cd",[576,616,617],{"class":586}," synch\u002Fapps\u002Fapi\n",[576,619,621],{"class":578,"line":620},5,[576,622,600],{"class":593},[576,624,626],{"class":578,"line":625},6,[576,627,628],{"class":606},"# Copy the example environment file:\n",[576,630,632,635,638],{"class":578,"line":631},7,[576,633,634],{"class":582},"cp",[576,636,637],{"class":586}," .env.example",[576,639,640],{"class":586}," .env\n",[563,642,644,645,648],{"id":643},"編輯-env-變數","編輯 ",[573,646,647],{},".env"," 變數",[503,650,651,657,675],{},[506,652,653,656],{},[573,654,655],{},"PUBLIC_URL=synch.pafor.me","：輸入您的 Synch 伺服器公网網域名稱（即在上一步中建立的網域名称）。",[506,658,659,468,662,665,666,670,671,674],{},[573,660,661],{},"BETTER_AUTH_SECRET",[573,663,664],{},"SYNC_TOKEN_SECRET","：請使用此 ",[442,667,669],{"href":668},"\u002Ftw\u002Ftools\u002Fsecret-key-hex","線上金鑰產生工具"," 或在終端機中執行兩次 ",[573,672,673],{},"openssl rand -hex 32"," 來產生高強度的隨機金鑰。",[506,676,677,680],{},[573,678,679],{},"AUTH_ALLOWED_EMAILS","：允許註冊並建立帳號的電子信箱列表（用英文逗號分隔）。",[563,682,684],{"id":683},"将网域添加至-caddyfile","将网域添加至 Caddyfile",[429,686,687,688,692],{},"有關如何將 Cloudflare DNS 模組整合到 Caddy 中並使用 Docker 容器啟動的詳細設定方法，請參閱我們的 ",[442,689,691],{"href":690},"\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#_4-enable-https-with-caddy","自建 Buzz 協作平台文章","。",[484,694],{"description":695,"image":696,"image-alt":697,"label":698,"min-read":699,"title":700,"to":690},"學習如何在 Docker 容器中設定 Caddy 反向代理，並利用 Cloudflare DNS Challenge 自動申請和管理 SSL\u002FTLS 憑證。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FEN-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","在自建工作區中設定帶有 Cloudflare DNS API 權杖的 Caddy，實現 SSL\u002FTLS 憑證的自動申請與管理","自建指南","12","自建 Block 旗下 Buzz 協作平台：輕鬆構建人類與 AI 智能體高效協同工作的全新共享工作空間",[429,702,703,704,707],{},"在您的 Caddyfile 中添加 ",[573,705,706],{},"SYNCH_DOMAIN"," 設定，並將其反向代理指向 8787 連接埠（Synch 容器內部執行的連接埠）：",[567,709,713],{"className":710,"code":711,"language":712,"meta":424,"style":424},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n\n{$SYNCH_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:8787\n}\n","json",[573,714,715,721,729,733,739,753,758,770],{"__ignoreMap":424},[576,716,717],{"class":578,"line":579},[576,718,720],{"class":719},"sMK4o","{\n",[576,722,723,726],{"class":578,"line":597},[576,724,725],{"class":593},"  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN",[576,727,728],{"class":719},"}\n",[576,730,731],{"class":578,"line":603},[576,732,728],{"class":593},[576,734,735],{"class":578,"line":610},[576,736,738],{"emptyLinePlaceholder":737},true,"\n",[576,740,741,744,747,750],{"class":578,"line":620},[576,742,743],{"class":719},"{",[576,745,746],{"class":593},"$SYNCH_DOMAIN",[576,748,749],{"class":719},"}",[576,751,752],{"class":719}," {\n",[576,754,755],{"class":578,"line":625},[576,756,757],{"class":593},"  encode zstd gzip\n",[576,759,760,763,766],{"class":578,"line":631},[576,761,762],{"class":593},"  reverse_proxy host.docker.internal",[576,764,765],{"class":719},":",[576,767,769],{"class":768},"sbssI","8787\n",[576,771,773],{"class":578,"line":772},8,[576,774,728],{"class":719},[429,776,777],{},"啟動容器：",[567,779,781],{"className":569,"code":780,"language":571,"meta":424,"style":424},"docker compose up -d\n",[573,782,783],{"__ignoreMap":424},[576,784,785,788,791,794],{"class":578,"line":579},[576,786,787],{"class":582},"docker",[576,789,790],{"class":586}," compose",[576,792,793],{"class":586}," up",[576,795,796],{"class":586}," -d\n",[429,798,799,800,803],{},"執行以下 ",[573,801,802],{},"curl"," 命令以驗證服務的可用性：",[567,805,807],{"className":569,"code":806,"language":571,"meta":424,"style":424},"curl https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[573,808,809],{"__ignoreMap":424},[576,810,811,813],{"class":578,"line":579},[576,812,802],{"class":582},[576,814,815],{"class":586}," https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[538,817,819],{"id":818},"將-obsidian-用戶端連接至您的-synch-伺服器","將 Obsidian 用戶端連接至您的 Synch 伺服器",[543,821,823],{"id":822},"在-obsidian-中安裝-synch-插件","在 Obsidian 中安裝 Synch 插件",[429,825,826,827,830],{},"打開 Obsidian 的「設定」（Settings），導覽至「第三方外掛」（Community plugins），然后點擊 ",[462,828,829],{},"「瀏覽」（Browse）"," 按鈕：",[433,832],{"src":833,"alt":834,"style":835},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-community-plugins-browse.webp","在 Obsidian 設定中瀏覽第三方社群外掛","max-width: 523px; width: 100%; height: auto;",[429,837,838,839,842,843],{},"搜尋並安裝 ",[462,840,841],{},"'Synchrun'"," 外掛：\n",[433,844],{"src":845,"alt":846,"style":557},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-install-synchrun-plugin.webp","在 Obsidian 中安裝 Synchrun 同步外掛",[429,848,849,850,852,853,856,857,860,861,864,865,692],{},"安裝完成後，打開 ",[462,851,841],{}," 外掛設定，並啟用 ",[462,854,855],{},"「使用自建伺服器」（Use a self-hosted server）","。隨後，在 ",[462,858,859],{},"「伺服器 URL」（Server URL）"," 欄位中輸入 ",[573,862,863],{},"https:\u002F\u002Fsynch.pafor.me","，並點擊 ",[462,866,867],{},"「儲存」（Save）",[433,869],{"src":870,"alt":871,"style":872},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-plugin-settings-self-hosted.webp","在 Synchrun 外掛設定中配置您的自建伺服器 URL","max-width: 525px; width: 100%; height: auto;",[429,874,875,876,879,880,882,883,885],{},"點擊 ",[462,877,878],{},"「在當前裝置上登入」（Sign in on this device）"," 按鈕。接著，使用您在 ",[573,881,647],{}," 中 ",[573,884,679],{}," 列表中指定的信箱地址進行註冊，註冊成功後您将看到以下授權頁面：",[433,887],{"src":888,"alt":889,"style":890},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-account-authorization-page.webp","Synchrun 外掛的帳號授權登入頁面","max-width: 494px; width: 100%; height: auto;",[429,892,875,893,830],{},[462,894,895],{},"「允許 Obsidian 登入」（Allow Obsidian sign-in）",[433,897],{"src":898,"alt":899,"style":900},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-allow-obsidian-signin.webp","允許 Obsidian 透過 Synch 登入","max-width: 498px; width: 100%; height: auto;",[429,902,875,903,906,907,910,911],{},[462,904,905],{},"「返回 Obsidian」（Return to Obsidian）"," 按鈕，隨後點擊 ",[462,908,909],{},"「建立筆記庫」（Create vault）","：\n",[433,912],{"src":913,"alt":914,"style":915},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-create-remote-vault.webp","在 Synchrun 中建立新的遠端同步筆記庫","max-width: 496px; width: 100%; height: auto;",[429,917,918],{},"輸入您自訂的筆記庫名稱與高強度密碼來建立遠端筆記庫。",[433,920],{"src":921,"alt":922,"style":923},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-vault-password-setup.webp","為 Obsidian 遠端筆記庫設定高強度安全密碼","max-width: 500px; width: 100%; height: auto;",[429,925,926],{},"同步過程將立即開始，根據您的筆記庫檔案大小，這可能會需要一些時間。同步完成後，介面將顯示您所使用的總儲存空間。",[433,928],{"src":929,"alt":930,"style":931},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-sync-completed-storage.webp","Synchrun 同步完成並顯示所使用的總儲存空間","max-width: 508px; width: 100%; height: auto;",[493,933,935],{"id":934},"使用-ignis-實現基於瀏覽器的-obsidian-存取","使用 Ignis 實現基於瀏覽器的 Obsidian 存取",[429,937,938,940],{},[462,939,456],{}," 透過將 Obsidian 的 Electron API 替換為 Web API，使得 Obsidian 的 JavaScript 程式碼能够直接在標準網頁瀏覽器中執行。您所有的 Markdown 筆記和附件都將直接儲存在託管伺服器的本地檔案系統中。",[429,942,943,944,949,950,692],{},"不過，相比於獨立執行的 Obsidian 桌面用戶端，網頁端還存在一些局限性。由於瀏覽器沙箱環境的限制，某些依賴於 Electron 或 Node.js 特有 API 的功能或第三方外掛將無法正常運作。詳情請參閱 Ignis 官方文件中的 ",[442,945,948],{"href":946,"rel":947},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Flimitations\u002F",[446],"局限性說明"," 以及 ",[442,951,954],{"href":952,"rel":953},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Fplugin-compatibility\u002F",[446],"外掛相容性列表",[538,956,958],{"id":957},"部署-ignis","部署 Ignis",[429,960,961,962,964,965,968,969,972],{},"我們將使用 Docker 在 VPS 上安裝 ",[462,963,456],{},"，並將其對應掛載到本地的 ",[573,966,967],{},".\u002Fvaults"," 資料夾中。隨後，我們將在伺服器上透過 ",[462,970,971],{},"Synch CLI"," 命令列用戶端將該本地目錄與我們之前設定的遠端同步筆記庫進行即時同步。",[429,974,975,976,978,979,983],{},"由於 ",[462,977,456],{}," 本身沒有內建的身份驗證機制，為了確保隱私，我們必須將其安全地隱藏在 ",[462,980,981],{},[442,982,476],{"href":363}," 私有網路中。",[543,985,987],{"id":986},"建立-dns-記錄","建立 DNS 記錄",[433,989],{"src":990,"alt":991,"style":992},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fcloudflare-dns-a-record-ignis.webp","在 Cloudflare 中為 Ignis 網頁端設定 DNS A 記錄","max-width: 552px; width: 100%; height: auto;",[543,994,996],{"id":995},"將網域添加至-caddyfile","將網域添加至 Caddyfile",[429,998,999,1000,1003],{},"在您的 Caddyfile 中以相同的方式為 ",[573,1001,1002],{},"obsidian.pafor.me"," 設定反向代理：",[567,1005,1007],{"className":710,"code":1006,"language":712,"meta":424,"style":424},"{$OBSIDIAN_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:9898\n}\n",[573,1008,1009,1020,1024,1033],{"__ignoreMap":424},[576,1010,1011,1013,1016,1018],{"class":578,"line":579},[576,1012,743],{"class":719},[576,1014,1015],{"class":593},"$OBSIDIAN_DOMAIN",[576,1017,749],{"class":719},[576,1019,752],{"class":719},[576,1021,1022],{"class":578,"line":597},[576,1023,757],{"class":593},[576,1025,1026,1028,1030],{"class":578,"line":603},[576,1027,762],{"class":593},[576,1029,765],{"class":719},[576,1031,1032],{"class":768},"9898\n",[576,1034,1035],{"class":578,"line":610},[576,1036,728],{"class":719},[543,1038,1040],{"id":1039},"使用-docker-啟動-ignis","使用 Docker 啟動 Ignis",[429,1042,1043,1044,1047],{},"在 VPS 上將以下 Docker Compose 設定儲存為 ",[573,1045,1046],{},"ignis-docker-compose.yml","：",[567,1049,1053],{"className":1050,"code":1051,"language":1052,"meta":424,"style":424},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","services:\n  ignis:\n    image: nobbe\u002Fignis:latest\n    ports:\n      - \"9898:8080\"\n    environment:\n      # match these to your host user (run: id)\n      - PUID=1000\n      - PGID=1000\n      - WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n    volumes:\n      - .\u002Fvaults:\u002Fvaults\n      - .\u002Fdata:\u002Fapp\u002Fdata\n      - obsidian-app:\u002Fapp\u002Fobsidian-app\n    restart: unless-stopped\n\nvolumes:\n  obsidian-app:\n","yml",[573,1054,1055,1064,1071,1081,1088,1102,1109,1114,1121,1129,1137,1145,1153,1161,1169,1180,1185,1193],{"__ignoreMap":424},[576,1056,1057,1061],{"class":578,"line":579},[576,1058,1060],{"class":1059},"swJcz","services",[576,1062,1063],{"class":719},":\n",[576,1065,1066,1069],{"class":578,"line":597},[576,1067,1068],{"class":1059},"  ignis",[576,1070,1063],{"class":719},[576,1072,1073,1076,1078],{"class":578,"line":603},[576,1074,1075],{"class":1059},"    image",[576,1077,765],{"class":719},[576,1079,1080],{"class":586}," nobbe\u002Fignis:latest\n",[576,1082,1083,1086],{"class":578,"line":610},[576,1084,1085],{"class":1059},"    ports",[576,1087,1063],{"class":719},[576,1089,1090,1093,1096,1099],{"class":578,"line":620},[576,1091,1092],{"class":719},"      -",[576,1094,1095],{"class":719}," \"",[576,1097,1098],{"class":586},"9898:8080",[576,1100,1101],{"class":719},"\"\n",[576,1103,1104,1107],{"class":578,"line":625},[576,1105,1106],{"class":1059},"    environment",[576,1108,1063],{"class":719},[576,1110,1111],{"class":578,"line":631},[576,1112,1113],{"class":606},"      # match these to your host user (run: id)\n",[576,1115,1116,1118],{"class":578,"line":772},[576,1117,1092],{"class":719},[576,1119,1120],{"class":586}," PUID=1000\n",[576,1122,1124,1126],{"class":578,"line":1123},9,[576,1125,1092],{"class":719},[576,1127,1128],{"class":586}," PGID=1000\n",[576,1130,1132,1134],{"class":578,"line":1131},10,[576,1133,1092],{"class":719},[576,1135,1136],{"class":586}," WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n",[576,1138,1140,1143],{"class":578,"line":1139},11,[576,1141,1142],{"class":1059},"    volumes",[576,1144,1063],{"class":719},[576,1146,1148,1150],{"class":578,"line":1147},12,[576,1149,1092],{"class":719},[576,1151,1152],{"class":586}," .\u002Fvaults:\u002Fvaults\n",[576,1154,1156,1158],{"class":578,"line":1155},13,[576,1157,1092],{"class":719},[576,1159,1160],{"class":586}," .\u002Fdata:\u002Fapp\u002Fdata\n",[576,1162,1164,1166],{"class":578,"line":1163},14,[576,1165,1092],{"class":719},[576,1167,1168],{"class":586}," obsidian-app:\u002Fapp\u002Fobsidian-app\n",[576,1170,1172,1175,1177],{"class":578,"line":1171},15,[576,1173,1174],{"class":1059},"    restart",[576,1176,765],{"class":719},[576,1178,1179],{"class":586}," unless-stopped\n",[576,1181,1183],{"class":578,"line":1182},16,[576,1184,738],{"emptyLinePlaceholder":737},[576,1186,1188,1191],{"class":578,"line":1187},17,[576,1189,1190],{"class":1059},"volumes",[576,1192,1063],{"class":719},[576,1194,1196,1199],{"class":578,"line":1195},18,[576,1197,1198],{"class":1059},"  obsidian-app",[576,1200,1063],{"class":719},[503,1202,1203,1214,1228],{},[506,1204,1205,1206,1209,1210,1213],{},"在主機端使用 ",[573,1207,1208],{},"9898"," 連接埠，因為 ",[573,1211,1212],{},"8080"," 是一個非常常用且容易衝突的連接埠。",[506,1215,1216,1217,1220,1221,468,1224,1227],{},"在您的 VPS 上執行 ",[573,1218,1219],{},"id"," 命令，獲取目前主機使用者的 ",[573,1222,1223],{},"UID",[573,1225,1226],{},"GID","，並將其填寫到設定檔中，以確保檔案系統具備正確的讀寫權限。",[506,1229,1230,1231,1234],{},"設定 ",[573,1232,1233],{},"WS_ORIGINS","，僅允許來自您指定網域的 WebSocket 連線，提高安全性。",[429,1236,1237,1238,1240],{},"啟動 ",[462,1239,456],{}," 容器：",[567,1242,1244],{"className":569,"code":1243,"language":571,"meta":424,"style":424},"docker compose -f ignis-docker-compose.yml up -d\n",[573,1245,1246],{"__ignoreMap":424},[576,1247,1248,1250,1252,1255,1258,1260],{"class":578,"line":579},[576,1249,787],{"class":582},[576,1251,790],{"class":586},[576,1253,1254],{"class":586}," -f",[576,1256,1257],{"class":586}," ignis-docker-compose.yml",[576,1259,793],{"class":586},[576,1261,796],{"class":586},[429,1263,1264,1265,1268,1269,1272],{},"當您在網頁瀏覽器中存取您的網域名稱時，將會彈出 ",[462,1266,1267],{},"'Vault Manager'","（筆記庫管理器）。由於此時資料夾為空，它不會顯示任何本地筆記庫。在下一節中，我們將設定 ",[462,1270,1271],{},"'Synch CLI'","，從我們之前設定的遠端同步伺服器中拉取筆記。",[433,1274],{"src":1275,"alt":1276,"style":1277},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-vault-manager-empty.webp","Ignis 網頁用戶端中當前為空的筆記庫管理器","max-width: 466px; width: 100%; height: auto;",[543,1279,1281],{"id":1280},"解決-docker-帶來的防火牆失效問題","解決 Docker 帶來的防火牆失效問題",[429,1283,1284,1285,1288,1289,1292,1293,1296],{},"預設情況下，Docker 會自動在系統底層插入自己的 DNAT 與 FORWARD 鏈規則，直接將外部公網流量轉發至作用中的容器連接埠。這會完全繞過 Ubuntu 預設的 UFW 或 iptables ",[573,1286,1287],{},"INPUT"," 鏈防火牆保護。為了阻止外部未經授權的存取並保持容器的絕對私有，我們需要手動將以下規則新增至 ",[573,1290,1291],{},"iptables"," 中的 ",[573,1294,1295],{},"DOCKER-USER"," 鏈：",[567,1298,1300],{"className":569,"code":1299,"language":571,"meta":424,"style":424},"# 阻斷所有外部公網流量的直接存取\nsudo iptables -I DOCKER-USER -i ext_if -j DROP \n\n# 僅允許來自您的 Cloudflare WARP 用戶端私有 IP 的存取流量\nsudo iptables -I DOCKER-USER -i ext_if -s 100.96.0.10 -j ACCEPT\n",[573,1301,1302,1307,1336,1340,1345],{"__ignoreMap":424},[576,1303,1304],{"class":578,"line":579},[576,1305,1306],{"class":606},"# 阻斷所有外部公網流量的直接存取\n",[576,1308,1309,1312,1315,1318,1321,1324,1327,1330,1333],{"class":578,"line":597},[576,1310,1311],{"class":582},"sudo",[576,1313,1314],{"class":586}," iptables",[576,1316,1317],{"class":586}," -I",[576,1319,1320],{"class":586}," DOCKER-USER",[576,1322,1323],{"class":586}," -i",[576,1325,1326],{"class":586}," ext_if",[576,1328,1329],{"class":586}," -j",[576,1331,1332],{"class":586}," DROP",[576,1334,1335],{"class":593}," \n",[576,1337,1338],{"class":578,"line":603},[576,1339,738],{"emptyLinePlaceholder":737},[576,1341,1342],{"class":578,"line":610},[576,1343,1344],{"class":606},"# 僅允許來自您的 Cloudflare WARP 用戶端私有 IP 的存取流量\n",[576,1346,1347,1349,1351,1353,1355,1357,1359,1362,1365,1367],{"class":578,"line":620},[576,1348,1311],{"class":582},[576,1350,1314],{"class":586},[576,1352,1317],{"class":586},[576,1354,1320],{"class":586},[576,1356,1323],{"class":586},[576,1358,1326],{"class":586},[576,1360,1361],{"class":586}," -s",[576,1363,1364],{"class":768}," 100.96.0.10",[576,1366,1329],{"class":586},[576,1368,1369],{"class":586}," ACCEPT\n",[543,1371,1373],{"id":1372},"設定-synch-cli-命令列同步工具","設定 Synch CLI 命令列同步工具",[429,1375,1376,1378],{},[462,1377,971],{}," 是一款無介面的命令列工具，即使在没有安裝 Obsidian 桌面應用的遠端伺服器上，它也能讓本地目錄與遠端筆記庫进行即時同步。",[429,1380,1381,1382,1385,1386,1388,1389,1392,1393,949,1396,1399,1400,468,1403,1406,1407,1410,1411,1414],{},"從您之前克隆的 ",[573,1383,1384],{},"synch"," 倉庫源碼中建置 ",[462,1387,971],{},"。建置過程需要 ",[462,1390,1391],{},"Node.js >= 22.5","（因為 CLI 依賴於 ",[573,1394,1395],{},"node:sqlite",[573,1397,1398],{},"fetch","、",[573,1401,1402],{},"WebSocket",[573,1404,1405],{},"WebCrypto"," 等全域瀏覽器原生 API）和 ",[462,1408,1409],{},"pnpm","（由於整個倉庫是一個使用了 ",[573,1412,1413],{},"pnpm@10.33.0"," 版本管理器的 pnpm 工作區）：",[567,1416,1418],{"className":569,"code":1417,"language":571,"meta":424,"style":424},"# Check versions\nnode --version   # must be >= 22.5\npnpm --version\n\n# In the repos root\npnpm install\n\n# Build the CLI bundle\npnpm -C apps\u002Fcli build\n\n# After a successful build you have `apps\u002Fcli\u002Fdist\u002Fsynch.js`. Make it executable and put it on your PATH\nchmod +x apps\u002Fcli\u002Fdist\u002Fsynch.js\nln -sf \"$PWD\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js\" \"$HOME\u002F.local\u002Fbin\u002Fsynch\"\n\n# Verification\nsynch --help\n",[573,1419,1420,1425,1436,1443,1447,1452,1459,1463,1468,1481,1485,1490,1501,1530,1534,1539],{"__ignoreMap":424},[576,1421,1422],{"class":578,"line":579},[576,1423,1424],{"class":606},"# Check versions\n",[576,1426,1427,1430,1433],{"class":578,"line":597},[576,1428,1429],{"class":582},"node",[576,1431,1432],{"class":586}," --version",[576,1434,1435],{"class":606},"   # must be >= 22.5\n",[576,1437,1438,1440],{"class":578,"line":603},[576,1439,1409],{"class":582},[576,1441,1442],{"class":586}," --version\n",[576,1444,1445],{"class":578,"line":610},[576,1446,738],{"emptyLinePlaceholder":737},[576,1448,1449],{"class":578,"line":620},[576,1450,1451],{"class":606},"# In the repos root\n",[576,1453,1454,1456],{"class":578,"line":625},[576,1455,1409],{"class":582},[576,1457,1458],{"class":586}," install\n",[576,1460,1461],{"class":578,"line":631},[576,1462,738],{"emptyLinePlaceholder":737},[576,1464,1465],{"class":578,"line":772},[576,1466,1467],{"class":606},"# Build the CLI bundle\n",[576,1469,1470,1472,1475,1478],{"class":578,"line":1123},[576,1471,1409],{"class":582},[576,1473,1474],{"class":586}," -C",[576,1476,1477],{"class":586}," apps\u002Fcli",[576,1479,1480],{"class":586}," build\n",[576,1482,1483],{"class":578,"line":1131},[576,1484,738],{"emptyLinePlaceholder":737},[576,1486,1487],{"class":578,"line":1139},[576,1488,1489],{"class":606},"# After a successful build you have `apps\u002Fcli\u002Fdist\u002Fsynch.js`. Make it executable and put it on your PATH\n",[576,1491,1492,1495,1498],{"class":578,"line":1147},[576,1493,1494],{"class":582},"chmod",[576,1496,1497],{"class":586}," +x",[576,1499,1500],{"class":586}," apps\u002Fcli\u002Fdist\u002Fsynch.js\n",[576,1502,1503,1506,1509,1511,1514,1517,1520,1522,1525,1528],{"class":578,"line":1155},[576,1504,1505],{"class":582},"ln",[576,1507,1508],{"class":586}," -sf",[576,1510,1095],{"class":719},[576,1512,1513],{"class":593},"$PWD",[576,1515,1516],{"class":586},"\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js",[576,1518,1519],{"class":719},"\"",[576,1521,1095],{"class":719},[576,1523,1524],{"class":593},"$HOME",[576,1526,1527],{"class":586},"\u002F.local\u002Fbin\u002Fsynch",[576,1529,1101],{"class":719},[576,1531,1532],{"class":578,"line":1163},[576,1533,738],{"emptyLinePlaceholder":737},[576,1535,1536],{"class":578,"line":1171},[576,1537,1538],{"class":606},"# Verification\n",[576,1540,1541,1543],{"class":578,"line":1182},[576,1542,1384],{"class":582},[576,1544,1545],{"class":586}," --help\n",[429,1547,1548,1549,1552],{},"由於 Synch CLI 執行在与您的 Synch 遠端同步伺服端相同的 VPS 上，它能够直接自動連線至本地的 API 服務連接埠。如果您將它們部署在不同的伺服器上，請執行 ",[573,1550,1551],{},"synch login --api-url \u003Cremote-synch-api-url>"," 来手動定義您的遠端目標 API 端點。",[429,1554,1555],{},[433,1556],{"alt":1557,"src":1558},"在終端機中輸入自訂 API URL 執行 synch login 登入指令","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-api-url-terminal.webp",[429,1560,1561,1562,1565],{},"在您的 VPS 終端機中執行 ",[573,1563,1564],{},"synch login"," 命令，您將獲得一個用於身份驗證的登入 URL：",[429,1567,1568],{},[433,1569],{"alt":1570,"src":1571},"終端機輸出顯示的 Synch CLI 認證 URL","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-auth-url-terminal.webp",[429,1573,1574],{},"使用與您在 Obsidian 桌面端 Synchrun 插件中註冊的相同信箱地址，透過該網頁連結進行登入授權。",[429,1576,1577],{},[433,1578],{"alt":1579,"src":1580},"Synch CLI 授權網頁端登入成功","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-web-login-success.webp",[429,1582,1583,1584,1587],{},"執行 ",[573,1585,1586],{},"synch vault connect --vault ~\u002Fvaults\u002F\u003Cvaultname> --vault-id asadqe-7b29-4677-fsad-234asdafasd"," 來將您 VPS 上的本地筆記庫目錄與遠端自建伺服器上的筆記庫進行關聯：",[429,1589,1590,1591,1594,1595,1598,1599,1602],{},"您可以透過打開桌面端 Obsidian 中的 ",[462,1592,1593],{},"Synchrun"," 外掛設定，點擊 ",[462,1596,1597],{},"「管理遠端筆記庫」（Manage remote vaults）"," 來找到您的遠端筆記庫 ID。該操作會打開一個網頁並列出您所有的遠端筆記庫，每個庫旁邊都附帶有一個 GUID 格式的唯一識別碼（例如：",[573,1600,1601],{},"123e4567-e89b-12d3-a456-426614174000","）：",[429,1604,1605,1610],{},[433,1606],{"src":1607,"alt":1608,"style":1609},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-manage-remote-vaults.webp","在 Synchrun 外掛中管理遠端筆記庫","max-width: 582px; width: 100%; height: auto;",[433,1611],{"alt":1612,"src":1613},"在 Synchrun 中定位唯一的遠端筆記庫 ID","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-remote-vault-id.webp",[429,1615,1616,1617,1620],{},"在提示時輸入您的筆記庫密碼以確立關聯。關聯成功後，執行 ",[573,1618,1619],{},"synch sync --vault ~\u002Fvaults\u002F\u003Cvault-name>"," 來進行您的首次全量同步。首次同步根據您的檔案大小，可能會耗費一些時間。",[429,1622,1623],{},[433,1624],{"alt":1625,"src":1626},"Synch CLI 中顯示首次拉取同步筆記庫的進度","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-cli-initial-sync-progress.webp",[429,1628,1629,1630,1633,1634,1637],{},"為了讓同步全自動進行，我們可以設定並啟用一個 ",[573,1631,1632],{},"systemd"," 系統守護服務，在背景持續執行 ",[573,1635,1636],{},"synch watch"," 監聽檔案變化，以確保 VPS 上的筆記在系統開機時即可實現毫秒級自動同步：",[567,1639,1641],{"className":569,"code":1640,"language":571,"meta":424,"style":424},"sudo tee \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service \u003C\u003C'EOF'\n[Unit]\nDescription=Synch vault watcher\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nUser=\u003Cusername>\nExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\nWorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\nEnvironment=\"PATH=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin:\u002Fhome\u002F\u003Cusername>\u002F.cargo\u002Fbin:\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fbin\"\nEnvironment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\nEOF\nsudo systemctl daemon-reload\nsudo systemctl enable --now synch-watch.service\n",[573,1642,1643,1659,1664,1669,1674,1679,1683,1688,1693,1698,1703,1708,1713,1718,1723,1728,1732,1737,1742,1748,1759],{"__ignoreMap":424},[576,1644,1645,1647,1650,1653,1656],{"class":578,"line":579},[576,1646,1311],{"class":582},[576,1648,1649],{"class":586}," tee",[576,1651,1652],{"class":586}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service",[576,1654,1655],{"class":719}," \u003C\u003C",[576,1657,1658],{"class":719},"'EOF'\n",[576,1660,1661],{"class":578,"line":597},[576,1662,1663],{"class":586},"[Unit]\n",[576,1665,1666],{"class":578,"line":603},[576,1667,1668],{"class":586},"Description=Synch vault watcher\n",[576,1670,1671],{"class":578,"line":610},[576,1672,1673],{"class":586},"After=network-online.target\n",[576,1675,1676],{"class":578,"line":620},[576,1677,1678],{"class":586},"Wants=network-online.target\n",[576,1680,1681],{"class":578,"line":625},[576,1682,738],{"emptyLinePlaceholder":737},[576,1684,1685],{"class":578,"line":631},[576,1686,1687],{"class":586},"[Service]\n",[576,1689,1690],{"class":578,"line":772},[576,1691,1692],{"class":586},"Type=simple\n",[576,1694,1695],{"class":578,"line":1123},[576,1696,1697],{"class":586},"User=\u003Cusername>\n",[576,1699,1700],{"class":578,"line":1131},[576,1701,1702],{"class":586},"ExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\n",[576,1704,1705],{"class":578,"line":1139},[576,1706,1707],{"class":586},"WorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\n",[576,1709,1710],{"class":578,"line":1147},[576,1711,1712],{"class":586},"Environment=\"PATH=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin:\u002Fhome\u002F\u003Cusername>\u002F.cargo\u002Fbin:\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fbin\"\n",[576,1714,1715],{"class":578,"line":1155},[576,1716,1717],{"class":586},"Environment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\n",[576,1719,1720],{"class":578,"line":1163},[576,1721,1722],{"class":586},"Restart=always\n",[576,1724,1725],{"class":578,"line":1171},[576,1726,1727],{"class":586},"RestartSec=5\n",[576,1729,1730],{"class":578,"line":1182},[576,1731,738],{"emptyLinePlaceholder":737},[576,1733,1734],{"class":578,"line":1187},[576,1735,1736],{"class":586},"[Install]\n",[576,1738,1739],{"class":578,"line":1195},[576,1740,1741],{"class":586},"WantedBy=multi-user.target\n",[576,1743,1745],{"class":578,"line":1744},19,[576,1746,1747],{"class":719},"EOF\n",[576,1749,1751,1753,1756],{"class":578,"line":1750},20,[576,1752,1311],{"class":582},[576,1754,1755],{"class":586}," systemctl",[576,1757,1758],{"class":586}," daemon-reload\n",[576,1760,1762,1764,1766,1769,1772],{"class":578,"line":1761},21,[576,1763,1311],{"class":582},[576,1765,1755],{"class":586},[576,1767,1768],{"class":586}," enable",[576,1770,1771],{"class":586}," --now",[576,1773,1774],{"class":586}," synch-watch.service\n",[429,1776,1777,1778,1780],{},"現在，在瀏覽器中打開 ",[573,1779,1002],{},"，您會發現其使用者介面和排版版面與桌面端原生 App 幾乎完全一致：",[433,1782],{"src":1783,"alt":1784,"style":1785},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-web-interface-desktop-view.webp","在桌面端顯示 Obsidian 筆記庫的 Ignis 網頁介面","max-width: 593px; width: 100%; height: auto;",[429,1787,1788],{},"點擊左下角的設定圖示可以發現，除了需要手動重新安裝第三方社群外掛外，幾乎所有的 Obsidian 核心設定與功能均已完美保留：",[433,1790],{"src":1791,"alt":1792,"style":1793},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-settings-community-plugins.webp","Ignis 網頁介面中的社群第三方外掛設定","max-width: 597px; width: 100%; height: auto;",[429,1795,1796],{},"為了測試整個同步閉環，您可以透過 Ignis 網頁端直接新增一篇筆記：",[433,1798],{"src":1799,"alt":1800,"style":1793},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-create-new-note-web.webp","透過 Ignis 網頁介面新增一篇 Markdown 筆記",[429,1802,1803,1804,1806],{},"該筆記會立即被同步回您的 Obsidian 桌面用戶端。需要注意的是，空白資料夾不會在 ",[462,1805,456],{}," 網頁端中顯示。",[433,1808],{"src":1809,"alt":1810,"style":1811},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-desktop-synced-note.webp","新建立的筆記已成功同步到本地 Obsidian 桌面用戶端","max-width: 502px; width: 100%; height: auto;",[429,1813,1814,1815,1817],{},"在行動端手機瀏覽器上存取 ",[573,1816,1002],{}," 的實際效果：",[429,1819,1820,1825],{},[433,1821],{"src":1822,"alt":1823,"style":1824},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-sidebar.webp","在行動端手機瀏覽器上存取 Ignis 網頁用戶端的側邊欄選單","max-width: 269px; width: 100%; height: auto;",[433,1826],{"src":1827,"alt":1828,"style":1824},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-editor.webp","在行動端手機瀏覽器上存取 Ignis 網頁用戶端的 Markdown 編輯器",[429,1830,1831,1832,1834,1835,1838],{},"當您在 ",[462,1833,456],{}," 網頁端中刪除筆記時，它們會被安全地移至本地筆記庫的 ",[573,1836,1837],{},"~\u002Fvaults\u002F\u003Cvault-name>\u002F.trash"," 垃圾桶資料夾中，以防誤刪。",[493,1840,1842],{"id":1841},"自建-obsidian-同步服務的一些結語","自建 Obsidian 同步服務的一些結語",[429,1844,1845,1846,1848,1849,1851,1852,1854],{},"透過將 ",[462,1847,447],{}," 與 ",[462,1850,456],{}," 結合，您可以使用完全處於自己掌控之下的 VPS 伺服器硬體，無縫地實現 Obsidian 筆記庫的多端同步與網頁端存取。而將這些服務整體託管於 ",[462,1853,476],{}," 私有網路之中，又為您提供了極致的安全物理邊界，從根本上阻断了公網暴露帶來的安全隱患。",[429,1856,1857,1858,1860],{},"當然，",[462,1859,456],{}," 的初衷並不是為了完全替代本地的 Obsidian 桌面用戶端。相反，它更像是一個極其便利的臨時橋梁，供您在沒有攜帶主力電腦時，能夠隨時隨地透過任意瀏覽器快速存取和編輯自己的筆記。對於日常高強度的寫作與重度筆記庫管理，本地原生用戶端仍然是更加舒適、高效的選擇。",[429,1862,1863,1864,1866],{},"由於 Synch 採用了堅固的端到端加密機制，您的遠端筆記庫密碼必須具備足夠強的複雜度以抵禦暴力破解攻擊。同時，請務必牢記該密碼，因為同步伺服端不會儲存任何未加密的",[462,1865,525],{},"。一旦遺忘該密碼，您的全部筆記資料將徹底無法復原。此外，由於所有資料均保存在您的自建 VPS 上，您需要自行承擔並妥善做好伺服器的主機安全防護、以及自動快照與備份管理。",[429,1868,1869,1870,1872],{},"儘管 ",[462,1871,447],{}," 內建了加密歷史版本管理和已刪除檔案復原機制，能為您規避絕大多數意外資料遺失，但為了萬一失，我們依然強烈建議您在第三方實體介質上定期保留一份獨立的 Obsidian 筆記庫離線備份。",[493,1874,1876],{"id":1875},"references","References",[503,1878,1879,1886,1893],{},[506,1880,1881],{},[442,1882,1885],{"href":1883,"rel":1884},"https:\u002F\u002Fsynch.run\u002Fself-hosting-docker\u002F",[446],"Synch Deploy with Docker Compose",[506,1887,1888],{},[442,1889,1892],{"href":1890,"rel":1891},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fserver\u002Fdeploy\u002F",[446],"Ignis Deploy with Docker",[506,1894,1895],{},[442,1896,1899],{"href":1897,"rel":1898},"https:\u002F\u002Fsynch.run\u002Fblog\u002Fencryption-and-decryption\u002F",[446],"How does end-to-end encryption work in Synch?",[1901,1902,1903],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":424,"searchDepth":597,"depth":603,"links":1905},[1906,1915,1924,1925],{"id":495,"depth":597,"text":496,"children":1907},[1908,1912],{"id":540,"depth":603,"text":541,"children":1909},[1910,1911],{"id":545,"depth":610,"text":545},{"id":560,"depth":610,"text":561},{"id":818,"depth":603,"text":819,"children":1913},[1914],{"id":822,"depth":610,"text":823},{"id":934,"depth":597,"text":935,"children":1916},[1917],{"id":957,"depth":603,"text":958,"children":1918},[1919,1920,1921,1922,1923],{"id":986,"depth":610,"text":987},{"id":995,"depth":610,"text":996},{"id":1039,"depth":610,"text":1040},{"id":1280,"depth":610,"text":1281},{"id":1372,"depth":610,"text":1373},{"id":1841,"depth":597,"text":1842},{"id":1875,"depth":597,"text":1876},[1927],"productivity","2026-09-15","本文詳細介紹如何利用開源工具 Synch 與 Ignis 在您的 VPS 上搭建私有同步伺服器，從而在多台電腦、手機以及平板裝置之間安全地同步您的 Obsidian 筆記庫。我們還將所有服務全部部署在 Cloudflare Zero Trust 私有網路中，從而完全阻斷來自公網的惡意掃描與未授權存取，保障數據隱私安全。","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002FTW-Sync-Obsidian-Across-Devices.webp","使用自建 Synch 平台和 Ignis 網頁端在 Cloudflare Zero Trust 安全私有網路中同步多端 Obsidian 本地筆記庫的架構圖",{"schemaOrg":1934,"robots":1939,"sitemap":1940},[1935,1937],{"@type":1936,"headline":423,"description":1929,"image":1931},"Article",{"@type":1938,"name":423,"description":1929,"image":1931},"HowTo","index, follow",{"lastmod":1941},"2026-09-16",{"title":1943,"description":1929,"ogTitle":423,"ogDescription":1929,"twitterTitle":423,"twitterDescription":1929},"基於自建 Synch 與 Ignis 實現 Obsidian 跨裝置安全同步","tw\u002Farticle\u002Fsync-obsidian-across-devices",[1946,1947,1948,1949],"自建服务","Obsidian","云端同步","Zero Trust",null,"6DsOPDA5q5K5tiypqYFvhyUvxHAduTMMII_8Mf-xVXM",{"surround":1953,"related":5030},[1954,4147],{"id":1955,"title":700,"author":424,"body":1956,"category":4107,"date":4110,"description":4111,"extension":1930,"image":4112,"imageAlt":4113,"isPublished":737,"meta":4114,"minRead":1139,"navigation":737,"path":263,"seo":4138,"stem":4140,"tags":4141,"updatedAt":1950,"__hash__":4146},"article\u002Ftw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md",{"type":426,"value":1957,"toc":4077},[1958,1961,1967,1973,1977,1980,2018,2022,2028,2066,2070,2074,2088,2095,2100,2104,2108,2122,2128,2177,2203,2207,2215,2221,2225,2228,2438,2442,2482,2487,2494,2502,2552,2558,2587,2591,2595,2614,2640,2653,2695,2703,2975,2979,3022,3027,3034,3038,3042,3066,3069,3075,3081,3085,3093,3099,3102,3108,3115,3144,3151,3157,3160,3166,3170,3173,3176,3179,3185,3188,3194,3200,3206,3211,3215,3226,3233,3239,3242,3248,3251,3258,3264,3271,3275,3283,3347,3356,3411,3414,3485,3491,3507,3513,3517,3563,3569,3572,3578,3581,3587,3591,3608,3624,3630,3728,3731,3737,3748,3797,3803,3809,3822,3838,3841,3847,3851,3858,3880,3890,3988,3998,4004,4011,4017,4020,4026,4029,4035,4038,4041,4044,4074],[429,1959,1960],{},"在與多個 AI 智能體（AI Agent）協同工作時，最讓人頭痛的障礙莫過於「上下文斷片化（Context Fragmentation）」。由於對話分散在不同的工具中，您最終不得不扮演起一個「肉肉路由器」的角色——頻繁地從 Claude Code 中複製對話並貼上到 Gemini CLI，然後再從 Gemini CLI 複製並貼上到 Hermes Agent。而當您身邊還有人類團隊成員一起協作時，這種繁瑣的摩擦感更是成倍增長。",[429,1962,1963],{},[433,1964],{"alt":1965,"src":1966},"Buzz 協作工作空間的使用者介面，顯示聊天頻道和活躍的 AI 智能體","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-workspace-interface.webp",[429,1968,1969,1972],{},[462,1970,1971],{},"Buzz"," 是一款開源的協同工作空間，它將人類團隊和 AI 智能體凝聚在一個統一環境中。在這裡，人類同事與 AI 智能體能夠共享相同的任務和專案歷史，並實現天衣無缝的工作交接。",[493,1974,1976],{"id":1975},"什麼是-block-旗下的-buzz人機協同的-ai-智能體共享空間","什麼是 Block 旗下的 Buzz？人機協同的 AI 智能體共享空間",[429,1978,1979],{},"Buzz 是 Block 公司（由推特創辦人傑克·多西創立）推出的開源協作工作空間，它讓團隊成員和 AI 智能體能夠在相同的頻道與專案中並肩工作。它具有以下幾個核心亮點：",[503,1981,1982,1988,1994,2000,2006,2012],{},[506,1983,1984,1987],{},[462,1985,1986],{},"共享上下文："," 頻道是團隊成員與智能體開展協作的核心陣地。所有的對話記錄和專案歷史都完整保留在頻道中。",[506,1989,1990,1993],{},[462,1991,1992],{},"智能體間通信："," 智能體之間能够跨機器直接進行交流。一個 AI 智能體可以 @ 另一個智能體，從上完成工作的轉交或代碼的交叉審查。",[506,1995,1996,1999],{},[462,1997,1998],{},"提及驅動激活："," AI 智能體僅在被 @ 提及時才會激活，平時則保持靜默。被提及時，智能體將讀取頻道中的相關上下文並開始工作。",[506,2001,2002,2005],{},[462,2003,2004],{},"統一身份系統："," 團隊成員與 AI 智能體使用同一套身份系統，並通過加密私鑰\u002F公鑰進行安全認證。",[506,2007,2008,2011],{},[462,2009,2010],{},"委派命令："," 您可以向人類同事授予指揮您的智能體的權限，讓整個團隊都能輕鬆指派和調用彼此的數位助手。",[506,2013,2014,2017],{},[462,2015,2016],{},"自託管伺服器："," 因為您是該伺服器的託管者，所以您的數據完全由您掌控。您可以自由決定誰能加入，並定義專屬的運行規則。",[493,2019,2021],{"id":2020},"基於-nostr-的加密級-buzz-架構解析","基於 Nostr 的加密級 Buzz 架構解析",[429,2023,2024],{},[433,2025],{"alt":2026,"src":2027},"基於 Nostr 協定的 Buzz 協作空間加密級架構拓撲圖","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-nostr-cryptographic-architecture.webp",[503,2029,2030,2036,2042,2048,2054,2060],{},[506,2031,2032,2035],{},[462,2033,2034],{},"Nostr 中繼器充當伺服器："," 消息、工作流、代碼倉庫以及其他事件都經過加密簽名和驗證，並儲存在 Nostr 中繼伺服器（Relay）上。Nostr 協定原生支援通過 WebSockets 和 REST API 進行通信。",[506,2037,2038,2041],{},[462,2039,2040],{},"統一加密身份："," 人類和智能體都使用各自的加密金鑰進行認證。此身份完全保留在用戶端，絕不會儲存在伺服器上。",[506,2043,2044,2047],{},[462,2045,2046],{},"一等公民級智能體："," 每个智能體都擁有獨立的身份、頻道成員資格和審計跟蹤（Audit Trail）。智能體使用智能體通信協定（ACP）連接到工作空間。",[506,2049,2050,2053],{},[462,2051,2052],{},"去中心化 Git 倉庫："," 代碼庫儲存在相容 S3 的物件儲存中，而任務、拉取請求（PR）和代碼審查則在 Nostr 事件日誌中進行追蹤。因此，Buzz 的 Git 倉庫實際上是託管在 Nostr 中繼器上，而非 GitHub。",[506,2055,2056,2059],{},[462,2057,2058],{},"Buzz 用戶端屬於 Nostr 用戶端："," Buzz 應用與 Nostr 中繼器是分離的；它是一個桌面或移動端用戶端，負責連接到中繼器的 URL 節點。",[506,2061,2062,2065],{},[462,2063,2064],{},"基礎技術棧："," 由 PostgreSQL 資料庫處理事件儲存與全文檢索，Redis 負責管理發佈\u002F訂閱（Pub\u002FSub）消息佇列，而相容 S3 的 MinIO 用於儲存媒體檔案。",[493,2067,2069],{"id":2068},"如何在-linux-vps-上部署自託管的-block-旗下-buzz","如何在 Linux VPS 上部署自託管的 Block 旗下 Buzz",[538,2071,2073],{"id":2072},"_0-前提條件","0. 前提條件",[503,2075,2076,2079,2082,2085],{},[506,2077,2078],{},"一台 Linux VPS",[506,2080,2081],{},"域名已指向您的伺服器 IP 地址",[506,2083,2084],{},"Docker 以及 Docker Compose 外掛程式",[506,2086,2087],{},"Cloudflare 帳戶（免費服務計劃）",[429,2089,2090,2091,2094],{},"在本指南中，我們將把 Nostr 中繼器部署在 Ubuntu VPS 上，並通過 ",[442,2092,2093],{"href":363},"教學：使用 Cloudflare WARP 安全地將 Hermes Agent 暴露至私有網路"," 保護其安全。整個基礎技術棧包含 Docker Compose 中的四個服務：中继器（relay）、PostgreSQL、Redis 和 MinIO，並使用 Caddy 來提供 HTTPS 支援。",[484,2096],{"description":2097,"image":2098,"image-alt":2099,"label":489,"min-read":490,"title":2093,"to":363},"了解如何利用 Cloudflare WARP 和 Zero Trust（零信任）在不開放入站防火牆端口的情況下，安全地在全球範圍內暴露和存取您的 Hermes Agent。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FTW-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","使用 Cloudflare Zero Trust 和 WARP 隧道安全地將 Hermes Agent 暴露到私有網路",[538,2101,2103],{"id":2102},"_1-cloudflare-dns-與-api-權杖","1. Cloudflare DNS 與 API 權杖",[543,2105,2107],{"id":2106},"創建-cloudflare-api-權杖token","創建 Cloudflare API 權杖（Token）",[2109,2110,2111,2117],"ol",{},[506,2112,2113,2114,692],{},"點擊右上角的個人頭像，並在下拉選單中選擇 ",[462,2115,2116],{},"Profile",[506,2118,875,2119,692],{},[462,2120,2121],{},"API Tokens",[429,2123,2124],{},[433,2125],{"alt":2126,"src":2127},"Cloudflare 使用者個人資料頁面，顯示 API 權杖創建選單","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-profile-api-tokens.webp",[2109,2129,2130,2136,2142,2162,2167,2171,2174],{"start":603},[506,2131,875,2132,2135],{},[462,2133,2134],{},"Create Token"," 按鈕。",[506,2137,2138,2139,692],{},"選擇使用範本 ",[462,2140,2141],{},"Edit zone DNS",[506,2143,2144,2145],{},"配置範本如下：\n",[503,2146,2147,2153],{},[506,2148,2149,2152],{},[462,2150,2151],{},"Permissions",": Zone — DNS — Edit",[506,2154,2155,2158,2159],{},[462,2156,2157],{},"Zone Resources",": Include — Specific zone — ",[573,2160,2161],{},"example.com",[506,2163,875,2164,692],{},[462,2165,2166],{},"Continue to summary",[506,2168,875,2169,692],{},[462,2170,2134],{},[506,2172,2173],{},"拷貝生成的 API 權杖，因為頁面關閉後它將不再顯示。",[506,2175,2176],{},"在終端機中驗證生成的權杖，確保其能正常工作：",[567,2178,2180],{"className":569,"code":2179,"language":571,"meta":424,"style":424},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[573,2181,2182],{"__ignoreMap":424},[576,2183,2184,2186,2188,2191,2193,2196,2198,2201],{"class":578,"line":579},[576,2185,802],{"class":582},[576,2187,1095],{"class":719},[576,2189,2190],{"class":586},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[576,2192,1519],{"class":719},[576,2194,2195],{"class":586}," -H",[576,2197,1095],{"class":719},[576,2199,2200],{"class":586},"Authorization: Bearer YOUR_TOKEN_HERE",[576,2202,1101],{"class":719},[543,2204,2206],{"id":2205},"dns-解析記錄","DNS 解析記錄",[503,2208,2209],{},[506,2210,2211,2212,2214],{},"創建一條 A 記錄，並將代理狀態設置為 ",[462,2213,551],{},"（DNS only）。",[429,2216,2217],{},[433,2218],{"alt":2219,"src":2220},"在 Cloudflare 控制台中配置 Buzz 域名的 DNS A 記錄，並將代理狀態設置為僅限 DNS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-dns-a-record-configuration.webp",[538,2222,2224],{"id":2223},"_2-在-ubuntu-上安裝-docker","2. 在 Ubuntu 上安裝 Docker",[429,2226,2227],{},"運行以下命令在 Ubuntu 上安裝 Docker：",[567,2229,2231],{"className":569,"code":2230,"language":571,"meta":424,"style":424},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Start automatically when the system boots\nsudo systemctl enable docker\n\n# Verify docker is installed\ndocker --version\n\nsudo apt install -y docker-compose-plugin\n\n# Verify the compose plugin is installed\ndocker compose version\n\n",[573,2232,2233,2238,2266,2270,2275,2317,2321,2326,2336,2340,2345,2366,2370,2375,2386,2390,2395,2401,2405,2419,2423,2428],{"__ignoreMap":424},[576,2234,2235],{"class":578,"line":579},[576,2236,2237],{"class":606},"# Add Docker's official GPG key and set up the Docker repository\n",[576,2239,2240,2242,2245,2248,2251,2254,2257,2260,2263],{"class":578,"line":597},[576,2241,802],{"class":582},[576,2243,2244],{"class":586}," -fsSL",[576,2246,2247],{"class":586}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[576,2249,2250],{"class":719}," |",[576,2252,2253],{"class":582}," sudo",[576,2255,2256],{"class":586}," gpg",[576,2258,2259],{"class":586}," --dearmor",[576,2261,2262],{"class":586}," -o",[576,2264,2265],{"class":586}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[576,2267,2268],{"class":578,"line":603},[576,2269,738],{"emptyLinePlaceholder":737},[576,2271,2272],{"class":578,"line":610},[576,2273,2274],{"class":606},"# Add the official Docker repository\n",[576,2276,2277,2280,2282,2285,2288,2291,2294,2297,2300,2302,2304,2306,2308,2311,2314],{"class":578,"line":620},[576,2278,2279],{"class":613},"echo",[576,2281,1095],{"class":719},[576,2283,2284],{"class":586},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[576,2286,2287],{"class":719},"$(",[576,2289,2290],{"class":582},"lsb_release",[576,2292,2293],{"class":586}," -cs",[576,2295,2296],{"class":719},")",[576,2298,2299],{"class":586}," stable",[576,2301,1519],{"class":719},[576,2303,2250],{"class":719},[576,2305,2253],{"class":582},[576,2307,1649],{"class":586},[576,2309,2310],{"class":586}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[576,2312,2313],{"class":719}," >",[576,2315,2316],{"class":586}," \u002Fdev\u002Fnull\n",[576,2318,2319],{"class":578,"line":625},[576,2320,738],{"emptyLinePlaceholder":737},[576,2322,2323],{"class":578,"line":631},[576,2324,2325],{"class":606},"# Update package list\n",[576,2327,2328,2330,2333],{"class":578,"line":772},[576,2329,1311],{"class":582},[576,2331,2332],{"class":586}," apt",[576,2334,2335],{"class":586}," update\n",[576,2337,2338],{"class":578,"line":1123},[576,2339,738],{"emptyLinePlaceholder":737},[576,2341,2342],{"class":578,"line":1131},[576,2343,2344],{"class":606},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[576,2346,2347,2349,2351,2354,2357,2360,2363],{"class":578,"line":1139},[576,2348,1311],{"class":582},[576,2350,2332],{"class":586},[576,2352,2353],{"class":586}," install",[576,2355,2356],{"class":586}," docker-ce",[576,2358,2359],{"class":586}," docker-ce-cli",[576,2361,2362],{"class":586}," containerd.io",[576,2364,2365],{"class":586}," -y\n",[576,2367,2368],{"class":578,"line":1147},[576,2369,738],{"emptyLinePlaceholder":737},[576,2371,2372],{"class":578,"line":1155},[576,2373,2374],{"class":606},"# Start automatically when the system boots\n",[576,2376,2377,2379,2381,2383],{"class":578,"line":1163},[576,2378,1311],{"class":582},[576,2380,1755],{"class":586},[576,2382,1768],{"class":586},[576,2384,2385],{"class":586}," docker\n",[576,2387,2388],{"class":578,"line":1171},[576,2389,738],{"emptyLinePlaceholder":737},[576,2391,2392],{"class":578,"line":1182},[576,2393,2394],{"class":606},"# Verify docker is installed\n",[576,2396,2397,2399],{"class":578,"line":1187},[576,2398,787],{"class":582},[576,2400,1442],{"class":586},[576,2402,2403],{"class":578,"line":1195},[576,2404,738],{"emptyLinePlaceholder":737},[576,2406,2407,2409,2411,2413,2416],{"class":578,"line":1744},[576,2408,1311],{"class":582},[576,2410,2332],{"class":586},[576,2412,2353],{"class":586},[576,2414,2415],{"class":586}," -y",[576,2417,2418],{"class":586}," docker-compose-plugin\n",[576,2420,2421],{"class":578,"line":1750},[576,2422,738],{"emptyLinePlaceholder":737},[576,2424,2425],{"class":578,"line":1761},[576,2426,2427],{"class":606},"# Verify the compose plugin is installed\n",[576,2429,2431,2433,2435],{"class":578,"line":2430},22,[576,2432,787],{"class":582},[576,2434,790],{"class":586},[576,2436,2437],{"class":586}," version\n",[538,2439,2441],{"id":2440},"_3-克隆倉庫並進行配置","3. 克隆倉庫並進行配置",[567,2443,2445],{"className":569,"code":2444,"language":571,"meta":424,"style":424},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[573,2446,2447,2456,2460,2467,2475],{"__ignoreMap":424},[576,2448,2449,2451,2453],{"class":578,"line":579},[576,2450,583],{"class":582},[576,2452,587],{"class":586},[576,2454,2455],{"class":586}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[576,2457,2458],{"class":578,"line":597},[576,2459,738],{"emptyLinePlaceholder":737},[576,2461,2462,2464],{"class":578,"line":603},[576,2463,614],{"class":613},[576,2465,2466],{"class":586}," buzz\u002Fdeploy\u002Fcompose\n",[576,2468,2469,2471,2473],{"class":578,"line":610},[576,2470,634],{"class":582},[576,2472,637],{"class":586},[576,2474,640],{"class":586},[576,2476,2477,2480],{"class":578,"line":620},[576,2478,2479],{"class":582},"nano",[576,2481,640],{"class":586},[429,2483,644,2484,2486],{},[573,2485,647],{}," 文件：",[503,2488,2489],{},[506,2490,2491],{},[462,2492,2493],{},"域名配置:",[567,2495,2500],{"className":2496,"code":2498,"language":2499},[2497],"language-text","BUZZ_DOMAIN=buzz.pafor.me\nRELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\nBUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_MEDIA_BASE_URL=https:\u002F\u002Fbuzz.pafor.me\u002Fmedia\nBUZZ_MEDIA_SERVER_DOMAIN=buzz.pafor.me\nBUZZ_CORS_ORIGINS=https:\u002F\u002Fbuzz.pafor.me\n","text",[573,2501,2498],{"__ignoreMap":424},[503,2503,2504,2514],{},[506,2505,2506,2509,2510,2513],{},[462,2507,2508],{},"所有者金鑰:"," ",[573,2511,2512],{},"RELAY_OWNER_PUBKEY"," 欄位需要填入您的 64 位 16 進位公鑰。請先在桌面用戶端生成一個身份（選擇 'Create a new identity key' → 複製以 npub 格式開頭的公開 ID），然後將其轉換為 16 進位格式。",[506,2515,2516,2519],{},[462,2517,2518],{},"金鑰安全（Secrets）:",[503,2520,2521,2531,2545],{},[506,2522,2523,2524,2527,2528,2530],{},"使用該 ",[442,2525,2526],{"href":668},"線上工具"," 或運行命令 ",[573,2529,673],{},"（運行 7 次）來生成高強度的隨機金鑰。",[506,2532,2533,2534,2537,2538,1399,2541,2544],{},"將所有的 ",[573,2535,2536],{},"CHANGE_ME"," 佔位符替換掉：包括 ",[573,2539,2540],{},"BUZZ_RELAY_PRIVATE_KEY",[573,2542,2543],{},"BUZZ_GIT_HOOK_HMAC_SECRET","、Postgres\u002FRedis\u002FTypesense 的密碼以及 S3 的 Access\u002FSecret Key。",[506,2546,2547,2548,2551],{},"未替換的佔位符是導致容器陷入無限重啟循環的最常見原因；請通過命令 ",[573,2549,2550],{},"grep CHANGE_ME .env"," 來核對並排除隱患。",[567,2553,2556],{"className":2554,"code":2555,"language":2499},[2497],"    BUZZ_RELAY_PRIVATE_KEY=CHANGE_ME_64_HEX_PRIVATE_KEY\n    BUZZ_GIT_HOOK_HMAC_SECRET=CHANGE_ME_RANDOM_64_HEX\n    POSTGRES_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    REDIS_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    TYPESENSE_API_KEY=CHANGE_ME_RANDOM_API_KEY\n    BUZZ_S3_ACCESS_KEY=CHANGE_ME_RANDOM_ACCESS_KEY\n    BUZZ_S3_SECRET_KEY=CHANGE_ME_RANDOM_SECRET_KEY\n",[573,2557,2555],{"__ignoreMap":424},[503,2559,2560],{},[506,2561,2562,2565],{},[462,2563,2564],{},"其他配置項:",[503,2566,2567,2574],{},[506,2568,2569,2570,2573],{},"將環境變數 ",[573,2571,2572],{},"CLOUDFLARE_API_TOKEN"," 添加到您的配置中，並賦予先前生成的 API 權杖值。Caddy 將用其自動申請憑證。",[506,2575,2576,2577,2579,2580,468,2583,2586],{},"Buzz 的預設配置非常開放，任何知道您中繼器地址的人都可以驗證並加入。為了安全起見，請務必配置 ",[573,2578,2512],{},"，並將 ",[573,2581,2582],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",[573,2584,2585],{},"BUZZ_REQUIRE_AUTH_TOKEN=true"," 設為啟用狀態。",[538,2588,2590],{"id":2589},"_4-使用-caddy-開啟-https-訪問","4. 使用 Caddy 開啟 HTTPS 訪問",[543,2592,2594],{"id":2593},"構建集成-cloudflare-dns-模組的自定義-caddy-鏡像","構建集成 Cloudflare DNS 模組的自定義 Caddy 鏡像",[503,2596,2597,2608,2611],{},[506,2598,2599,2600,2603,2604,2607],{},"我們在 Caddy 中配置基於 Cloudflare 的 DNS-01 挑戰（Challenge）。DNS-01 驗證的原理是讓 Caddy 外掛程式向您的",[462,2601,2602],{},"公網 DNS"," 寫入一條 TXT 挑戰記錄 ",[573,2605,2606],{},"_acme-challenge.buzz.pafor.me","；",[506,2609,2610],{},"隨後 Let's Encrypt 從公共網際網路查詢該記錄，以確權您的域名。這意味著您的域名必須是 Cloudflare 帳戶中的公網解析區域，而不能只是 Zero Trust \u002F WARP 區域網路 DNS 內的私有域名。如果您的域名只在私網下分发解析而沒有公網節點，DNS-01 將會失敗，需要改用其他驗證方式。",[506,2612,2613],{},"將以下配置加入到 Caddyfile 中：",[567,2615,2617],{"className":1050,"code":2616,"language":1052,"meta":424,"style":424},"{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n",[573,2618,2619,2623,2636],{"__ignoreMap":424},[576,2620,2621],{"class":578,"line":579},[576,2622,720],{"class":719},[576,2624,2625,2628,2631,2634],{"class":578,"line":597},[576,2626,2627],{"class":586},"  acme_dns cloudflare",[576,2629,2630],{"class":719}," {",[576,2632,2633],{"class":586},"env.CLOUDFLARE_API_TOKEN",[576,2635,728],{"class":719},[576,2637,2638],{"class":578,"line":603},[576,2639,728],{"class":719},[503,2641,2642],{},[506,2643,2644,2645,2648,2649,2652],{},"創建一個 ",[573,2646,2647],{},"Dockerfile.caddy","，其内容如下，這是 ",[573,2650,2651],{},"compose.caddy.yml"," 運行所必需的：",[567,2654,2656],{"className":1050,"code":2655,"language":1052,"meta":424,"style":424},"FROM caddy:2-builder AS builder\n\nRUN xcaddy build \\\n    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n\nFROM caddy:2-alpine\n\nCOPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[573,2657,2658,2663,2667,2672,2677,2681,2686,2690],{"__ignoreMap":424},[576,2659,2660],{"class":578,"line":579},[576,2661,2662],{"class":586},"FROM caddy:2-builder AS builder\n",[576,2664,2665],{"class":578,"line":597},[576,2666,738],{"emptyLinePlaceholder":737},[576,2668,2669],{"class":578,"line":603},[576,2670,2671],{"class":586},"RUN xcaddy build \\\n",[576,2673,2674],{"class":578,"line":610},[576,2675,2676],{"class":586},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[576,2678,2679],{"class":578,"line":620},[576,2680,738],{"emptyLinePlaceholder":737},[576,2682,2683],{"class":578,"line":625},[576,2684,2685],{"class":586},"FROM caddy:2-alpine\n",[576,2687,2688],{"class":578,"line":631},[576,2689,738],{"emptyLinePlaceholder":737},[576,2691,2692],{"class":578,"line":772},[576,2693,2694],{"class":586},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[503,2696,2697],{},[506,2698,2699,2700,2702],{},"修改 ",[573,2701,2651],{},"，以使用我們剛生成的帶有 Cloudflare 外掛程式的 Caddy 鏡像，並傳入 API 權杖參數：",[567,2704,2706],{"className":1050,"code":2705,"language":1052,"meta":424,"style":424},"services:\n  relay:\n    ports: !reset []\n\n  caddy:\n    build:\n      context: .\n      dockerfile: Dockerfile.caddy\n    image: buzz-caddy:cloudflare\n    depends_on:\n      relay:\n        condition: service_healthy\n    environment:\n      BUZZ_DOMAIN: ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n    ports:\n      - \"${CADDY_HTTP_PORT:-80}:80\"\n      - \"${CADDY_HTTPS_PORT:-443}:443\"\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n      - buzz-caddy-data:\u002Fdata\n      - buzz-caddy-config:\u002Fconfig\n    restart: unless-stopped\n    networks:\n      - buzz-net\n\nvolumes:\n  buzz-caddy-data:\n    labels:\n      com.buzz.volume: caddy-data\n  buzz-caddy-config:\n    labels:\n      com.buzz.volume: caddy-config\n",[573,2707,2708,2714,2721,2734,2738,2745,2752,2762,2772,2781,2788,2795,2805,2811,2821,2831,2837,2848,2859,2865,2872,2879,2886,2895,2903,2911,2916,2923,2931,2939,2950,2958,2965],{"__ignoreMap":424},[576,2709,2710,2712],{"class":578,"line":579},[576,2711,1060],{"class":1059},[576,2713,1063],{"class":719},[576,2715,2716,2719],{"class":578,"line":597},[576,2717,2718],{"class":1059},"  relay",[576,2720,1063],{"class":719},[576,2722,2723,2725,2727,2731],{"class":578,"line":603},[576,2724,1085],{"class":1059},[576,2726,765],{"class":719},[576,2728,2730],{"class":2729},"spNyl"," !reset",[576,2732,2733],{"class":719}," []\n",[576,2735,2736],{"class":578,"line":610},[576,2737,738],{"emptyLinePlaceholder":737},[576,2739,2740,2743],{"class":578,"line":620},[576,2741,2742],{"class":1059},"  caddy",[576,2744,1063],{"class":719},[576,2746,2747,2750],{"class":578,"line":625},[576,2748,2749],{"class":1059},"    build",[576,2751,1063],{"class":719},[576,2753,2754,2757,2759],{"class":578,"line":631},[576,2755,2756],{"class":1059},"      context",[576,2758,765],{"class":719},[576,2760,2761],{"class":768}," .\n",[576,2763,2764,2767,2769],{"class":578,"line":772},[576,2765,2766],{"class":1059},"      dockerfile",[576,2768,765],{"class":719},[576,2770,2771],{"class":586}," Dockerfile.caddy\n",[576,2773,2774,2776,2778],{"class":578,"line":1123},[576,2775,1075],{"class":1059},[576,2777,765],{"class":719},[576,2779,2780],{"class":586}," buzz-caddy:cloudflare\n",[576,2782,2783,2786],{"class":578,"line":1131},[576,2784,2785],{"class":1059},"    depends_on",[576,2787,1063],{"class":719},[576,2789,2790,2793],{"class":578,"line":1139},[576,2791,2792],{"class":1059},"      relay",[576,2794,1063],{"class":719},[576,2796,2797,2800,2802],{"class":578,"line":1147},[576,2798,2799],{"class":1059},"        condition",[576,2801,765],{"class":719},[576,2803,2804],{"class":586}," service_healthy\n",[576,2806,2807,2809],{"class":578,"line":1155},[576,2808,1106],{"class":1059},[576,2810,1063],{"class":719},[576,2812,2813,2816,2818],{"class":578,"line":1163},[576,2814,2815],{"class":1059},"      BUZZ_DOMAIN",[576,2817,765],{"class":719},[576,2819,2820],{"class":586}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[576,2822,2823,2826,2828],{"class":578,"line":1171},[576,2824,2825],{"class":1059},"      CLOUDFLARE_API_TOKEN",[576,2827,765],{"class":719},[576,2829,2830],{"class":586}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[576,2832,2833,2835],{"class":578,"line":1182},[576,2834,1085],{"class":1059},[576,2836,1063],{"class":719},[576,2838,2839,2841,2843,2846],{"class":578,"line":1187},[576,2840,1092],{"class":719},[576,2842,1095],{"class":719},[576,2844,2845],{"class":586},"${CADDY_HTTP_PORT:-80}:80",[576,2847,1101],{"class":719},[576,2849,2850,2852,2854,2857],{"class":578,"line":1195},[576,2851,1092],{"class":719},[576,2853,1095],{"class":719},[576,2855,2856],{"class":586},"${CADDY_HTTPS_PORT:-443}:443",[576,2858,1101],{"class":719},[576,2860,2861,2863],{"class":578,"line":1744},[576,2862,1142],{"class":1059},[576,2864,1063],{"class":719},[576,2866,2867,2869],{"class":578,"line":1750},[576,2868,1092],{"class":719},[576,2870,2871],{"class":586}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[576,2873,2874,2876],{"class":578,"line":1761},[576,2875,1092],{"class":719},[576,2877,2878],{"class":586}," buzz-caddy-data:\u002Fdata\n",[576,2880,2881,2883],{"class":578,"line":2430},[576,2882,1092],{"class":719},[576,2884,2885],{"class":586}," buzz-caddy-config:\u002Fconfig\n",[576,2887,2889,2891,2893],{"class":578,"line":2888},23,[576,2890,1174],{"class":1059},[576,2892,765],{"class":719},[576,2894,1179],{"class":586},[576,2896,2898,2901],{"class":578,"line":2897},24,[576,2899,2900],{"class":1059},"    networks",[576,2902,1063],{"class":719},[576,2904,2906,2908],{"class":578,"line":2905},25,[576,2907,1092],{"class":719},[576,2909,2910],{"class":586}," buzz-net\n",[576,2912,2914],{"class":578,"line":2913},26,[576,2915,738],{"emptyLinePlaceholder":737},[576,2917,2919,2921],{"class":578,"line":2918},27,[576,2920,1190],{"class":1059},[576,2922,1063],{"class":719},[576,2924,2926,2929],{"class":578,"line":2925},28,[576,2927,2928],{"class":1059},"  buzz-caddy-data",[576,2930,1063],{"class":719},[576,2932,2934,2937],{"class":578,"line":2933},29,[576,2935,2936],{"class":1059},"    labels",[576,2938,1063],{"class":719},[576,2940,2942,2945,2947],{"class":578,"line":2941},30,[576,2943,2944],{"class":1059},"      com.buzz.volume",[576,2946,765],{"class":719},[576,2948,2949],{"class":586}," caddy-data\n",[576,2951,2953,2956],{"class":578,"line":2952},31,[576,2954,2955],{"class":1059},"  buzz-caddy-config",[576,2957,1063],{"class":719},[576,2959,2961,2963],{"class":578,"line":2960},32,[576,2962,2936],{"class":1059},[576,2964,1063],{"class":719},[576,2966,2968,2970,2972],{"class":578,"line":2967},33,[576,2969,2944],{"class":1059},[576,2971,765],{"class":719},[576,2973,2974],{"class":586}," caddy-config\n",[543,2976,2978],{"id":2977},"啟動-docker-容器組合","啟動 Docker 容器組合",[567,2980,2982],{"className":569,"code":2981,"language":571,"meta":424,"style":424},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[573,2983,2984,3004,3008,3013],{"__ignoreMap":424},[576,2985,2986,2988,2990,2992,2995,2997,3000,3002],{"class":578,"line":579},[576,2987,787],{"class":582},[576,2989,790],{"class":586},[576,2991,1254],{"class":586},[576,2993,2994],{"class":586}," compose.yml",[576,2996,1254],{"class":586},[576,2998,2999],{"class":586}," compose.caddy.yml",[576,3001,793],{"class":586},[576,3003,796],{"class":586},[576,3005,3006],{"class":578,"line":597},[576,3007,738],{"emptyLinePlaceholder":737},[576,3009,3010],{"class":578,"line":603},[576,3011,3012],{"class":606},"#Check the Docker status\n",[576,3014,3015,3017,3019],{"class":578,"line":610},[576,3016,787],{"class":582},[576,3018,790],{"class":586},[576,3020,3021],{"class":586}," ps\n",[433,3023],{"src":3024,"alt":3025,"style":3026},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fdocker-compose-ps-status-terminal.webp","終端機視窗顯示通過 docker compose ps 運行的 Buzz 服務容器狀態","max-width: 700px; width: 100%; height: auto;",[429,3028,3029,3030,3033],{},"打開您的網頁瀏覽器並訪問 ",[573,3031,3032],{},"http:\u002F\u002Fbuzz.pafor.me","，驗證中繼服務是否已順利跑起來。",[433,3035],{"src":3036,"alt":3037,"style":923},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-relay-running-browser-verification.webp","瀏覽器驗證頁面，顯示自託管 Block's Buzz 中繼伺服器的成功運行響應",[538,3039,3041],{"id":3040},"步驟-5建立起首日備份機制","步驟 5：建立起首日備份機制",[567,3043,3045],{"className":569,"code":3044,"language":571,"meta":424,"style":424},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[573,3046,3047,3058],{"__ignoreMap":424},[576,3048,3049,3052,3055],{"class":578,"line":579},[576,3050,3051],{"class":582},"mkdir",[576,3053,3054],{"class":586}," -p",[576,3056,3057],{"class":586}," \u002Fbuzz_backups\n",[576,3059,3060,3063],{"class":578,"line":597},[576,3061,3062],{"class":582},"crontab",[576,3064,3065],{"class":586}," -e\n",[429,3067,3068],{},"添加一個每日凌晨自動執行的資料庫快照定時任務（Cron Job）：",[567,3070,3073],{"className":3071,"code":3072,"language":2499},[2497],"0 3 * * * cd \u002Fhome\u002F\u003Cuser>\u002Fbuzz\u002Fdeploy\u002Fcompose && docker compose exec -T postgres pg_dump -U buzz buzz > \u002Fbuzz_backups\u002Fbuzz-$(date +\\%Y\\%m\\%d).sql\n",[573,3074,3072],{"__ignoreMap":424},[429,3076,3077,3078,3080],{},"注意：請將 ",[573,3079,2540],{}," 視為永久不可失配的金鑰。由於中繼器中的事件都與此金鑰綁定，如果未來變更了私鑰，舊事件將無法通過驗證；就算您復原了資料庫備份，在新私鑰下它也不會被 Nostr 網路視為同一個中繼服務。",[493,3082,3084],{"id":3083},"配置-buzz-桌面用戶端與-nostr-加密身份","配置 Buzz 桌面用戶端與 Nostr 加密身份",[429,3086,3087,3088,3092],{},"從 ",[442,3089,3090],{"href":3090,"rel":3091},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[446]," 下載最新版 Buzz 桌面用戶端並運行。依次完善個人資料，直到您來到 “Join or create a community” 介面。",[429,3094,3095],{},[433,3096],{"alt":3097,"src":3098},"Buzz 桌面用戶端簡易設定介面，用於加入或創建社區","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-setup-community.webp",[429,3100,3101],{},"點擊 “Join a community” 並拷貝您的公鑰（Public Key）。",[429,3103,3104],{},[433,3105],{"alt":3106,"src":3107},"Buzz 用戶端介面顯示加入社區前的公鑰數位身份","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-join-community-public-key.webp",[429,3109,3110,3111,3114],{},"在 ",[462,3112,3113],{},"VPS 上","運行以下命令列工具，將您自己添加為該平台的首位會員：",[567,3116,3118],{"className":569,"code":3117,"language":571,"meta":424,"style":424},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[573,3119,3120],{"__ignoreMap":424},[576,3121,3122,3124,3126,3129,3132,3135,3138,3141],{"class":578,"line":579},[576,3123,787],{"class":582},[576,3125,790],{"class":586},[576,3127,3128],{"class":586}," exec",[576,3130,3131],{"class":586}," relay",[576,3133,3134],{"class":586}," buzz-admin",[576,3136,3137],{"class":586}," add-member",[576,3139,3140],{"class":586}," --pubkey",[576,3142,3143],{"class":586}," npub1yourkeyhere\n",[429,3145,3146,3147,3150],{},"在用戶端中填入 ",[573,3148,3149],{},"wss:\u002F\u002Fbuzz.pafor.me"," 作為社區接入 URL，然後點擊 “Next”。",[429,3152,3153],{},[433,3154],{"alt":3155,"src":3156},"在 Buzz 桌面用戶端中輸入自託管社區中繼伺服器的 URL 地址","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-input-community-url.webp",[429,3158,3159],{},"起一個帥氣的暱稱，然後點擊 “Next” 按鈕。",[429,3161,3162],{},[433,3163],{"alt":3164,"src":3165},"Buzz 用戶端個人資料配置介面，用於輸入使用者暱稱","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-profile-name-input.webp",[538,3167,3169],{"id":3168},"協作頻道與-ai-智能體","協作頻道與 AI 智能體",[429,3171,3172],{},"頻道是圍繞特定任務或專案劃分的群組。為您手頭的每個任務或工程建立獨立的頻道，並將團隊成員與所需的 AI 智能體拉入其中。",[429,3174,3175],{},"頻道內的所有消息、代碼與文件都會被自動分享，免去了逐一向新成員同步前因後果的煩惱。任何人都可以通過「@」來點名激活特定的 AI 智能體，智能體收到召喚後會讀取相關歷史消息並立刻著手處理。更妙的是，不同的 AI 智能體之間也能互相 @ 指派任務。",[429,3177,3178],{},"讓我們試著給預置的智能體發一條私信（DM）",[429,3180,3181],{},[433,3182],{"alt":3183,"src":3184},"在 Buzz 協同桌面用戶端中給 AI 智能體發送私信（DM）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-dm-agent.webp",[429,3186,3187],{},"創建一個新頻道并拉幾個 AI 智能體進來吧",[429,3189,3190],{},[433,3191],{"alt":3192,"src":3193},"在 Buzz 桌面用戶端中創建新的任務或專案協作頻道","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-create-channel-dialog.webp",[429,3195,3196],{},[433,3197],{"alt":3198,"src":3199},"將團隊成員和 AI 智能體添加至新創建的協作頻道中","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-agents-to-channel.webp",[429,3201,3202],{},[433,3203],{"alt":3204,"src":3205},"活躍協作頻道視圖，展示合併後的聊天歷史和專案任務","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-view.webp",[433,3207],{"src":3208,"alt":3209,"style":3210},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-active-agents.webp","已整合到協同專案頻道中的活躍 AI 智能體列表細節檢視","max-width: 367px; width: 100%; height: auto;",[538,3212,3214],{"id":3213},"激活智能體運行時agent-runtimes","激活智能體運行時（Agent Runtimes）",[429,3216,3217,3218,3221,3222,3225],{},"平台自帶的運行時預設依賴於「自動探測」來查找特定系統目錄（例如 ",[573,3219,3220],{},"~\u002F.local\u002Fbin","）下的執行程序（如 ",[573,3223,3224],{},"hermes-acp","）。如果您的智能體軟體安裝在非標準路徑下，Buzz 將無法正確識別。",[429,3227,3228,3229,3232],{},"以 Kimi Code 為例，它的智能體 ID 為 kimi，Buzz 預設會在 ",[573,3230,3231],{},"~\u002F.local\u002Fbin\u002Fkimi"," 尋找它。通過創建一個軟連結（Symbolic Link）即可輕鬆搞定：",[567,3234,3237],{"className":3235,"code":3236,"language":2499},[2497],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[573,3238,3236],{"__ignoreMap":424},[429,3240,3241],{},"此時，Kimi Code 就會顯示在「Agent runtimes」列表中。",[429,3243,3244],{},[433,3245],{"alt":3246,"src":3247},"Buzz 用戶端設置介面，顯示已配置的 AI 智能體執行期列表（包括 Kimi）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-agent-runtimes-list.webp",[538,3249,3250],{"id":3250},"專案與代碼倉庫管理",[429,3252,3253,3254,3257],{},"請先在 Settings → Experiments 菜單中激活「",[462,3255,3256],{},"Projects","」實驗性功能：",[429,3259,3260],{},[433,3261],{"alt":3262,"src":3263},"在 Buzz 用戶端設置的 Experiments 標籤頁中激活實驗性 Projects 功能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-experiments-projects.webp",[429,3265,3266,3267,3270],{},"目前，一個專案（Project）必須使用 ",[573,3268,3269],{},"buzz-cli"," 命令列工具來創建（雖然在後續版本中會加入 UI 直接創建的支持）。",[543,3272,3274],{"id":3273},"在-vps-上安裝並部署-buzz-cli","在 VPS 上安裝並部署 buzz-cli",[429,3276,3110,3277,3279,3280,3282],{},[462,3278,3113],{},"依次執行以下命令，編譯並安裝好 ",[573,3281,3269],{}," 用戶端：",[567,3284,3286],{"className":569,"code":3285,"language":571,"meta":424,"style":424},"sudo apt install cargo\ncd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-cli\necho 'export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"' >> ~\u002F.bashrc && source ~\u002F.bashrc\n",[573,3287,3288,3299,3306,3319],{"__ignoreMap":424},[576,3289,3290,3292,3294,3296],{"class":578,"line":579},[576,3291,1311],{"class":582},[576,3293,2332],{"class":586},[576,3295,2353],{"class":586},[576,3297,3298],{"class":586}," cargo\n",[576,3300,3301,3303],{"class":578,"line":597},[576,3302,614],{"class":613},[576,3304,3305],{"class":586}," ~\u002Fbuzz\n",[576,3307,3308,3311,3313,3316],{"class":578,"line":603},[576,3309,3310],{"class":582},"cargo",[576,3312,2353],{"class":586},[576,3314,3315],{"class":586}," --path",[576,3317,3318],{"class":586}," crates\u002Fbuzz-cli\n",[576,3320,3321,3323,3326,3329,3332,3335,3338,3341,3344],{"class":578,"line":610},[576,3322,2279],{"class":613},[576,3324,3325],{"class":719}," '",[576,3327,3328],{"class":586},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[576,3330,3331],{"class":719},"'",[576,3333,3334],{"class":719}," >>",[576,3336,3337],{"class":586}," ~\u002F.bashrc",[576,3339,3340],{"class":719}," &&",[576,3342,3343],{"class":613}," source",[576,3345,3346],{"class":586}," ~\u002F.bashrc\n",[429,3348,3349,3350,3352,3353,3355],{},"使用線上工具或通過 ",[573,3351,3269],{}," 生成一對 Nostr 加密公私鑰。這組金鑰將代表该 ",[573,3354,3269],{}," 工具在 Nostr 網路中的數位身份。",[567,3357,3359],{"className":569,"code":3358,"language":571,"meta":424,"style":424},"docker run --rm --entrypoint \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin ghcr.io\u002Fblock\u002Fbuzz:main generate-key\n\n# Use the generated Public Key\ndocker compose exec relay buzz-admin add-member --pubkey generated_Public_key\n",[573,3360,3361,3383,3387,3392],{"__ignoreMap":424},[576,3362,3363,3365,3368,3371,3374,3377,3380],{"class":578,"line":579},[576,3364,787],{"class":582},[576,3366,3367],{"class":586}," run",[576,3369,3370],{"class":586}," --rm",[576,3372,3373],{"class":586}," --entrypoint",[576,3375,3376],{"class":586}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[576,3378,3379],{"class":586}," ghcr.io\u002Fblock\u002Fbuzz:main",[576,3381,3382],{"class":586}," generate-key\n",[576,3384,3385],{"class":578,"line":597},[576,3386,738],{"emptyLinePlaceholder":737},[576,3388,3389],{"class":578,"line":603},[576,3390,3391],{"class":606},"# Use the generated Public Key\n",[576,3393,3394,3396,3398,3400,3402,3404,3406,3408],{"class":578,"line":610},[576,3395,787],{"class":582},[576,3397,790],{"class":586},[576,3399,3128],{"class":586},[576,3401,3131],{"class":586},[576,3403,3134],{"class":586},[576,3405,3137],{"class":586},[576,3407,3140],{"class":586},[576,3409,3410],{"class":586}," generated_Public_key\n",[429,3412,3413],{},"配置您的 CLI 變數：",[567,3415,3417],{"className":569,"code":3416,"language":571,"meta":424,"style":424},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\necho 'export BUZZ_PRIVATE_KEY=\"nsec1...\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n\necho 'export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n",[573,3418,3419,3424,3456,3460],{"__ignoreMap":424},[576,3420,3421],{"class":578,"line":579},[576,3422,3423],{"class":606},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[576,3425,3426,3428,3430,3433,3435,3438,3441,3444,3447,3450,3453],{"class":578,"line":597},[576,3427,2279],{"class":613},[576,3429,3325],{"class":719},[576,3431,3432],{"class":586},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[576,3434,3331],{"class":719},[576,3436,3437],{"class":719},"  >>",[576,3439,3440],{"class":586}," \u002Fhome\u002F",[576,3442,3443],{"class":719},"\u003C",[576,3445,3446],{"class":586},"use",[576,3448,3449],{"class":593},"r",[576,3451,3452],{"class":719},">",[576,3454,3455],{"class":586},"\u002F.bashrc\n",[576,3457,3458],{"class":578,"line":603},[576,3459,738],{"emptyLinePlaceholder":737},[576,3461,3462,3464,3466,3469,3471,3473,3475,3477,3479,3481,3483],{"class":578,"line":610},[576,3463,2279],{"class":613},[576,3465,3325],{"class":719},[576,3467,3468],{"class":586},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[576,3470,3331],{"class":719},[576,3472,3437],{"class":719},[576,3474,3440],{"class":586},[576,3476,3443],{"class":719},[576,3478,3446],{"class":586},[576,3480,3449],{"class":593},[576,3482,3452],{"class":719},[576,3484,3455],{"class":586},[429,3486,3487,3488,3490],{},"運行以下命令來測試 ",[573,3489,3269],{}," 是否已經與您的中繼器配对暢通：",[567,3492,3494],{"className":569,"code":3493,"language":571,"meta":424,"style":424},"buzz channels list\n",[573,3495,3496],{"__ignoreMap":424},[576,3497,3498,3501,3504],{"class":578,"line":579},[576,3499,3500],{"class":582},"buzz",[576,3502,3503],{"class":586}," channels",[576,3505,3506],{"class":586}," list\n",[429,3508,3509],{},[433,3510],{"alt":3511,"src":3512},"終端機命令列運行驗證，通過列出活躍頻道來檢查 buzz-cli 配置是否正確","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-cli-channels-list-terminal.webp",[543,3514,3516],{"id":3515},"使用-buzz-cli-創建全新的專案","使用 buzz-cli 創建全新的專案",[567,3518,3520],{"className":569,"code":3519,"language":571,"meta":424,"style":424},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[573,3521,3522,3527],{"__ignoreMap":424},[576,3523,3524],{"class":578,"line":579},[576,3525,3526],{"class":606},"# --channel refers to the UUID of the channel\n",[576,3528,3529,3531,3534,3537,3540,3543,3546,3548,3551,3553,3556,3558,3561],{"class":578,"line":597},[576,3530,3500],{"class":582},[576,3532,3533],{"class":586}," repos",[576,3535,3536],{"class":586}," create",[576,3538,3539],{"class":586}," --id",[576,3541,3542],{"class":586}," TestKOA",[576,3544,3545],{"class":586}," --name",[576,3547,3325],{"class":719},[576,3549,3550],{"class":586},"Display Name",[576,3552,3331],{"class":719},[576,3554,3555],{"class":586}," --channel",[576,3557,1095],{"class":719},[576,3559,3560],{"class":586},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[576,3562,1101],{"class":719},[429,3564,3565,3566,3568],{},"專案的所有權極為嚴格，只有創建者才有權將其刪除。由於該「Display Name」專案是由 ",[573,3567,3269],{}," 發起創建的，而目前的命令列版本尚未內置刪除指令，因此該專案無法通過常規方式清空。",[429,3570,3571],{},"再次點開您的桌面用戶端，驗證該專案是否已顯示在工作區中。",[429,3573,3574],{},[433,3575],{"alt":3576,"src":3577},"Buzz 桌面用戶端專案檢視頁面，確認專案已成功創建","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-project-view.webp",[429,3579,3580],{},"一旦專案列表在介面中開啟，後續您便可以直接通過右上角的 「+」 按鈕隨心所欲地添加更多子專案了。",[429,3582,3583],{},[433,3584],{"alt":3585,"src":3586},"在 Buzz 桌面用戶端中點擊右上角加號按鈕來添加新專案","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-project-button.webp",[543,3588,3590],{"id":3589},"拉入現有的-git-代碼倉庫","拉入現有的 Git 代碼倉庫",[429,3592,3593,3594,3597,3598,3601,3602,3607],{},"在您的本地開發機器上安裝 ",[573,3595,3596],{},"git-credential-nostr"," 憑證輔助工具。這需要您的系統已安裝 ",[462,3599,3600],{},"Git 2.46+"," 版本並配有 Rust 構建環境。詳情可參考此專案的 ",[442,3603,3606],{"href":3604,"rel":3605},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[446],"Readme"," 描述：",[567,3609,3611],{"className":569,"code":3610,"language":571,"meta":424,"style":424},"cargo install --path crates\u002Fgit-credential-nostr\n",[573,3612,3613],{"__ignoreMap":424},[576,3614,3615,3617,3619,3621],{"class":578,"line":579},[576,3616,3310],{"class":582},[576,3618,2353],{"class":586},[576,3620,3315],{"class":586},[576,3622,3623],{"class":586}," crates\u002Fgit-credential-nostr\n",[429,3625,3626,3627,3629],{},"對 ",[573,3628,3596],{}," 進行配置，使其獲得 Buzz 中繼器的授權權限：",[567,3631,3633],{"className":569,"code":3632,"language":571,"meta":424,"style":424},"# 1. Register the helper and enable per-path credentials.\ngit config --global credential.helper nostr\ngit config --global credential.useHttpPath true\n\n# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\nmkdir -p ~\u002F.nostr\necho \"nsec1...\" > ~\u002F.nostr\u002Fkey && chmod 600 ~\u002F.nostr\u002Fkey\ngit config --global nostr.keyfile ~\u002F.nostr\u002Fkey\n",[573,3634,3635,3640,3656,3670,3674,3679,3688,3715],{"__ignoreMap":424},[576,3636,3637],{"class":578,"line":579},[576,3638,3639],{"class":606},"# 1. Register the helper and enable per-path credentials.\n",[576,3641,3642,3644,3647,3650,3653],{"class":578,"line":597},[576,3643,583],{"class":582},[576,3645,3646],{"class":586}," config",[576,3648,3649],{"class":586}," --global",[576,3651,3652],{"class":586}," credential.helper",[576,3654,3655],{"class":586}," nostr\n",[576,3657,3658,3660,3662,3664,3667],{"class":578,"line":603},[576,3659,583],{"class":582},[576,3661,3646],{"class":586},[576,3663,3649],{"class":586},[576,3665,3666],{"class":586}," credential.useHttpPath",[576,3668,3669],{"class":719}," true\n",[576,3671,3672],{"class":578,"line":610},[576,3673,738],{"emptyLinePlaceholder":737},[576,3675,3676],{"class":578,"line":620},[576,3677,3678],{"class":606},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[576,3680,3681,3683,3685],{"class":578,"line":625},[576,3682,3051],{"class":582},[576,3684,3054],{"class":586},[576,3686,3687],{"class":586}," ~\u002F.nostr\n",[576,3689,3690,3692,3694,3697,3699,3701,3704,3706,3709,3712],{"class":578,"line":631},[576,3691,2279],{"class":613},[576,3693,1095],{"class":719},[576,3695,3696],{"class":586},"nsec1...",[576,3698,1519],{"class":719},[576,3700,2313],{"class":719},[576,3702,3703],{"class":586}," ~\u002F.nostr\u002Fkey",[576,3705,3340],{"class":719},[576,3707,3708],{"class":582}," chmod",[576,3710,3711],{"class":768}," 600",[576,3713,3714],{"class":586}," ~\u002F.nostr\u002Fkey\n",[576,3716,3717,3719,3721,3723,3726],{"class":578,"line":772},[576,3718,583],{"class":582},[576,3720,3646],{"class":586},[576,3722,3649],{"class":586},[576,3724,3725],{"class":586}," nostr.keyfile",[576,3727,3714],{"class":586},[429,3729,3730],{},"在 Buzz 中繼上開闢出該 Git 庫的儲存節點：",[567,3732,3735],{"className":3733,"code":3734,"language":2499},[2497],"buzz repos create --id koa-email-routing --name \"KOA Email Routing\" --clone \"https:\u002F\u002Fbuzz.pafor.me\u002Fgit\u002F\u003Cpub_key>\u002Fkoa-email-routing\" --nostr-relay \"wss:\u002F\u002Fbuzz.pafor.me\"\n",[573,3736,3734],{"__ignoreMap":424},[429,3738,3739,3740,3743,3744,3747],{},"在第一次執行 ",[573,3741,3742],{},"git push"," 時，您可能會被攔截並報錯 ",[573,3745,3746],{},"remote: missing Authorization header","。這是由於 Git 寫入控制（ACL）是由頻道成員資格決定的，您必須先將該倉庫 ID 與一個具體的 Buzz 頻道進行綁定，從而授權合規寫入：",[567,3749,3751],{"className":569,"code":3750,"language":571,"meta":424,"style":424},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[573,3752,3753,3781,3785,3790],{"__ignoreMap":424},[576,3754,3755,3757,3759,3762,3764,3767,3769,3772,3775,3778],{"class":578,"line":579},[576,3756,3500],{"class":582},[576,3758,3533],{"class":586},[576,3760,3761],{"class":586}," bind",[576,3763,3539],{"class":586},[576,3765,3766],{"class":586}," koa-email-routing",[576,3768,3555],{"class":586},[576,3770,3771],{"class":719}," \u003C",[576,3773,3774],{"class":586},"CHANNEL_UUI",[576,3776,3777],{"class":593},"D",[576,3779,3780],{"class":719},">\n",[576,3782,3783],{"class":578,"line":597},[576,3784,738],{"emptyLinePlaceholder":737},[576,3786,3787],{"class":578,"line":603},[576,3788,3789],{"class":606},"# push the code again\n",[576,3791,3792,3794],{"class":578,"line":610},[576,3793,583],{"class":582},[576,3795,3796],{"class":586}," push\n",[429,3798,3799,3800,3802],{},"在某些情況下，在 Buzz 桌面版中查閱專案進度時會遇到類似下方的 Git 模組拉取失敗提示。這是由於該桌面應用要求系統必須搭載 ",[462,3801,3600],{}," 版本，而應用直接啟動時可能預設尋址到了系統中的舊版 Git 引擎：",[429,3804,3805],{},[433,3806],{"alt":3807,"src":3808},"Buzz 用戶端展示由於本地 Git 版本低於 2.46 導致的 Git 庫載入失敗報錯介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-git-version-error.webp",[429,3810,3811,3812,3815,3816,3821],{},"請在您的 shell 設定檔中通過執行 ",[573,3813,3814],{},"launchctl setenv PATH \"\u002Fopt\u002Fhomebrew\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin:\u002Fusr\u002Fsbin:\u002Fsbin\""," 聲明新版 Git 所在的 PATH，並直接在終端中拉起 Buzz 應用。對此可參考該 ",[442,3817,3820],{"href":3818,"rel":3819},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[446],"Issue"," 的詳細排查記錄。",[567,3823,3825],{"className":569,"code":3824,"language":571,"meta":424,"style":424},"open -a Buzz\n",[573,3826,3827],{"__ignoreMap":424},[576,3828,3829,3832,3835],{"class":578,"line":579},[576,3830,3831],{"class":582},"open",[576,3833,3834],{"class":586}," -a",[576,3836,3837],{"class":586}," Buzz\n",[429,3839,3840],{},"重新進入用戶端中的 Projects 標籤頁，您會驚喜地發現代碼庫的所有提交與詳情已經完美載入出來了。",[429,3842,3843],{},[433,3844],{"alt":3845,"src":3846},"代碼庫提交詳情成功載入後的 Buzz 桌面用戶端專案面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-repository-details-loaded.webp",[493,3848,3850],{"id":3849},"利用二維碼將-ai-助手同步至手機端-buzz-app","利用二維碼將 AI 助手同步至手機端 Buzz App",[429,3852,3853,3854,3857],{},"Buzz 手機端的「掃碼配對」只認 HTTPS 協定，且 VPS 上的中繼服務預設並不會在背景運行 ",[573,3855,3856],{},"buzz-pair-relay"," 組件。",[567,3859,3861],{"className":569,"code":3860,"language":571,"meta":424,"style":424},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[573,3862,3863,3869],{"__ignoreMap":424},[576,3864,3865,3867],{"class":578,"line":579},[576,3866,614],{"class":613},[576,3868,3305],{"class":586},[576,3870,3871,3873,3875,3877],{"class":578,"line":597},[576,3872,3310],{"class":582},[576,3874,2353],{"class":586},[576,3876,3315],{"class":586},[576,3878,3879],{"class":586}," crates\u002Fbuzz-pair-relay\n",[429,3881,3882,3883,3886,3887,3889],{},"將以下配置注入到您的 ",[573,3884,3885],{},"compose.yml"," 文件中，聲明並啟動 ",[573,3888,3856],{}," 容器進程：",[567,3891,3893],{"className":1050,"code":3892,"language":1052,"meta":424,"style":424},"  pair:\n    image: ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n    entrypoint: [\"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay\"]\n    environment:\n      BUZZ_PAIR_RELAY_BIND_ADDR: 0.0.0.0:5000\n    ports:\n      - \"${BUZZ_PAIR_RELAY_PORT:-5000}:5000\"\n    restart: unless-stopped\n    networks:\n      [buzz-net]\n",[573,3894,3895,3902,3911,3931,3937,3947,3953,3964,3972,3978],{"__ignoreMap":424},[576,3896,3897,3900],{"class":578,"line":579},[576,3898,3899],{"class":1059},"  pair",[576,3901,1063],{"class":719},[576,3903,3904,3906,3908],{"class":578,"line":597},[576,3905,1075],{"class":1059},[576,3907,765],{"class":719},[576,3909,3910],{"class":586}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[576,3912,3913,3916,3918,3921,3923,3926,3928],{"class":578,"line":603},[576,3914,3915],{"class":1059},"    entrypoint",[576,3917,765],{"class":719},[576,3919,3920],{"class":719}," [",[576,3922,1519],{"class":719},[576,3924,3925],{"class":586},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[576,3927,1519],{"class":719},[576,3929,3930],{"class":719},"]\n",[576,3932,3933,3935],{"class":578,"line":610},[576,3934,1106],{"class":1059},[576,3936,1063],{"class":719},[576,3938,3939,3942,3944],{"class":578,"line":620},[576,3940,3941],{"class":1059},"      BUZZ_PAIR_RELAY_BIND_ADDR",[576,3943,765],{"class":719},[576,3945,3946],{"class":586}," 0.0.0.0:5000\n",[576,3948,3949,3951],{"class":578,"line":625},[576,3950,1085],{"class":1059},[576,3952,1063],{"class":719},[576,3954,3955,3957,3959,3962],{"class":578,"line":631},[576,3956,1092],{"class":719},[576,3958,1095],{"class":719},[576,3960,3961],{"class":586},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[576,3963,1101],{"class":719},[576,3965,3966,3968,3970],{"class":578,"line":772},[576,3967,1174],{"class":1059},[576,3969,765],{"class":719},[576,3971,1179],{"class":586},[576,3973,3974,3976],{"class":578,"line":1123},[576,3975,2900],{"class":1059},[576,3977,1063],{"class":719},[576,3979,3980,3983,3986],{"class":578,"line":1131},[576,3981,3982],{"class":719},"      [",[576,3984,3985],{"class":586},"buzz-net",[576,3987,3930],{"class":719},[429,3989,3990,3991,3993,3994,3997],{},"在您的 ",[573,3992,647],{}," 中聲明 ",[573,3995,3996],{},"BUZZ_PAIRING_RELAY_URL"," 及其專用的運行埠號：",[567,3999,4002],{"className":4000,"code":4001,"language":2499},[2497],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[573,4003,4001],{"__ignoreMap":424},[429,4005,4006,4007,4010],{},"點擊桌面端應用中的 Settings, 進入 「",[462,4008,4009],{},"Mobile","」 配對項：",[429,4012,4013],{},[433,4014],{"alt":4015,"src":4016},"Buzz 桌面用戶端設置中展示的 Mobile 行動端配對配置標籤頁","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-mobile-tab.webp",[429,4018,4019],{},"點擊 “Start pairing” —— 介面會生成專屬的綁定二維碼；打開手機端 App 掃一掃，接著在桌面端點擊 “Code Match” 確認無誤，雙端便立即完成信任綁定。",[429,4021,4022],{},[433,4023],{"alt":4024,"src":4025},"在桌面用戶端中生成安全的配對二維碼，用於同步 Buzz 手機端 App","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-pairing-qr-code.webp",[429,4027,4028],{},"注意：手機端应用中的智能體之所以能隨叫隨到，是基於您的桌面端應用在背景持續維繫運行。只有保障桌面機處於線上狀態，手機端派發的智能體指令才能被順利分發與執行。",[429,4030,4031],{},[433,4032],{"alt":4033,"src":4034},"在手機端 Buzz App 中成功載入同步後的活躍 AI 智能體列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-mobile-app-active-agents.webp",[493,4036,4037],{"id":4037},"結語",[429,4039,4040],{},"不可否認，作為一個還處於發展初期的技術方案，Buzz 在面對大規模生產環境時依然稍顯稚嫩，伴隨著一些偶發的系統 Bug 與介面互動上的限制。但對於小型團隊或單兵作戰的獨立開發者而言，這無疑是一場令人血脈偾張的前沿探索。它為我们揭開了一幅波瀾壯闊的人機無縫協奏畫卷，讓我們提前觸碰到了「AI 智能體成為工作夥伴」的未來工作模式。",[493,4042,4043],{"id":4043},"參考資源",[503,4045,4046,4053,4060,4067],{},[506,4047,4048],{},[442,4049,4052],{"href":4050,"rel":4051},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[446],"Buzz releases",[506,4054,4055],{},[442,4056,4059],{"href":4057,"rel":4058},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[446],"Introducing Buzz",[506,4061,4062],{},[442,4063,4066],{"href":4064,"rel":4065},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[446],"What is buzz",[506,4068,4069],{},[442,4070,4073],{"href":4071,"rel":4072},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[446],"How to self-host Buzz (Miget)",[1901,4075,4076],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":424,"searchDepth":597,"depth":603,"links":4078},[4079,4080,4081,4095,4104,4105,4106],{"id":1975,"depth":597,"text":1976},{"id":2020,"depth":597,"text":2021},{"id":2068,"depth":597,"text":2069,"children":4082},[4083,4084,4088,4089,4090,4094],{"id":2072,"depth":603,"text":2073},{"id":2102,"depth":603,"text":2103,"children":4085},[4086,4087],{"id":2106,"depth":610,"text":2107},{"id":2205,"depth":610,"text":2206},{"id":2223,"depth":603,"text":2224},{"id":2440,"depth":603,"text":2441},{"id":2589,"depth":603,"text":2590,"children":4091},[4092,4093],{"id":2593,"depth":610,"text":2594},{"id":2977,"depth":610,"text":2978},{"id":3040,"depth":603,"text":3041},{"id":3083,"depth":597,"text":3084,"children":4096},[4097,4098,4099],{"id":3168,"depth":603,"text":3169},{"id":3213,"depth":603,"text":3214},{"id":3250,"depth":603,"text":3250,"children":4100},[4101,4102,4103],{"id":3273,"depth":610,"text":3274},{"id":3515,"depth":610,"text":3516},{"id":3589,"depth":610,"text":3590},{"id":3849,"depth":597,"text":3850},{"id":4037,"depth":597,"text":4037},{"id":4043,"depth":597,"text":4043},[4108,4109,3500],"collaboration","ai-agents","2026-09-08","本教學將手把手帶您在 Ubuntu VPS 上部署自託管的 Block 旗下 Nostr 中繼 Buzz，並配置 Cloudflare DNS 安全網路。我們將幫助您搭建起一個安全性的共享工作空間，讓您的團隊成員與多個 AI 智能體（如 Claude、Kimi）能夠基於加密身份進行高效溝通、共享專案上下文並實現無縫協作。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FTW-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","一張高顏值的 16:9 科技質感卡片，具有深藍色 and 橙色色調，插圖展示如何在 Ubuntu VPS 上部署自託管的 Block 旗下 Buzz 協作中繼伺服器，其中包含一個帶有置中文字的毛玻璃微動質感面板。",{"schemaOrg":4115,"robots":1939,"sitemap":4136},[4116,4118],{"@type":4117,"headline":700,"description":4111,"image":4112},"TechArticle",{"@type":1938,"name":700,"description":4111,"image":4112,"step":4119},[4120,4124,4127,4130,4133],{"@type":4121,"name":4122,"text":4123},"HowToStep","階段 1：Cloudflare 設置","創建 Cloudflare API 權杖並配置 DNS 解析設置。",{"@type":4121,"name":4125,"text":4126},"階段 2：安裝 Docker","在 Ubuntu VPS 上設置並安裝 Docker 容器引擎。",{"@type":4121,"name":4128,"text":4129},"階段 3：克隆與配置","克隆倉庫代碼並配置 docker-compose 環境變數。",{"@type":4121,"name":4131,"text":4132},"階段 4：整合 Caddy","編譯帶有 Cloudflare DNS 挑戰模組的的自訂 Caddy 鏡像。",{"@type":4121,"name":4134,"text":4135},"階段 5：自動備份","配置 cron 定時任務以實現 PostgreSQL 資料庫的自動備份。",{"lastmod":4137},"2026-09-03",{"title":4139,"description":4111,"ogTitle":700,"ogDescription":4111,"twitterTitle":700,"twitterDescription":4111},"如何在 Ubuntu VPS 上自建 Block 旗下的 Buzz 協作中繼伺服器","tw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[4142,4143,1971,4144,4145],"Nostr","Docker","Caddy","Cloudflare","IBYHxp-6BbUZwuDc9Hxf1yMQj3uMpBUTAm2W1CTRUic",{"id":4148,"title":2093,"author":424,"body":4149,"category":5013,"date":5015,"description":5016,"extension":1930,"image":2098,"imageAlt":5017,"isPublished":737,"meta":5018,"minRead":620,"navigation":737,"path":255,"seo":5023,"stem":5025,"tags":5026,"updatedAt":5022,"__hash__":5029},"article\u002Ftw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md",{"type":426,"value":4150,"toc":4995},[4151,4164,4174,4177,4180,4192,4195,4203,4206,4210,4259,4263,4393,4397,4430,4434,4437,4501,4504,4540,4543,4570,4574,4584,4587,4626,4714,4718,4723,4740,4749,4819,4824,4869,4873,4918,4933,4937,4980,4982,4992],[429,4152,4153,4154,4157,4158,1848,4161,4163],{},"當我們希望透過筆記型電腦、平板或手機等其他設備存取 ",[462,4155,4156],{},"Hermes Agent","，同時又不想將其暴露在公共網際網路上時，這往往是一個普遍的挑戰。利用 ",[462,4159,4160],{},"Cloudflare WARP",[462,4162,476],{},"，您可以在無需打開任何防火牆入站連接埠的情況下，將其安全地暴露並在全球範圍內進行存取。",[429,4165,4166,4167,4170,4171,4173],{},"如果您之前已經閱讀並遵循了我們的指南 '",[442,4168,4169],{"href":375},"如何在 Linux VPS 上部署 Hermes Agent","'，那麼您應該大約擁有了一個全天候運行的 Hermes Agent。相比於設定傳統 VPN 帶來的繁瑣步驟，我們將使用 ",[462,4172,4160],{}," 用戶端，透過網際網路將 Hermes Agent 暴露到私有網路中。",[493,4175,4176],{"id":4176},"架構解析",[429,4178,4179],{},"此方案涉及的兩個核心組件：",[2109,4181,4182,4187],{},[506,4183,4184,4186],{},[462,4185,476],{},"：Cloudflare 的雲端儀表板，您可以在此定義路由規則和存取策略。",[506,4188,4189,4191],{},[462,4190,4160],{},"：安裝在您的設備（VPS、筆記型電腦、手機）上的用戶端應用程式。它能夠攔截發往私有網路的流量，並安全地進行路由。",[538,4193,4194],{"id":4194},"前置條件",[503,4196,4197,4200],{},[506,4198,4199],{},"一台已經運行 Hermes Agent 的 VPS（虛擬專屬伺服器）。",[506,4201,4202],{},"一個免費的 Cloudflare 帳號。",[493,4204,4205],{"id":4205},"詳細步驟指南",[538,4207,4209],{"id":4208},"第-1-步設定-cloudflare-zero-trust","第 1 步：設定 Cloudflare Zero Trust",[2109,4211,4212,4220,4227,4238,4245,4252],{},[506,4213,4214,4215,692],{},"登入您的 ",[442,4216,4219],{"href":4217,"rel":4218},"https:\u002F\u002Fdash.cloudflare.com\u002F",[446],"Cloudflare 儀表板 (Dashboard)",[506,4221,4222,4223],{},"點擊左側選單欄中的 'Zero Trust'。\n",[433,4224],{"alt":4225,"src":4226},"Cloudflare 儀表板左側側邊欄導覽選單中的 Zero Trust 選項","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-left-menu.webp",[506,4228,4229,4230,4233,4234],{},"如果這是您第一次使用，系統會提示您選擇方案（免費版對本教學完全足夠）並為您的團隊命名（例如，",[573,4231,4232],{},"ai-team","）。\n",[433,4235],{"alt":4236,"src":4237},"首次設定 Cloudflare Zero Trust 帳戶並為團隊命名","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-team-setup.webp",[506,4239,4240,4241],{},"點擊 'Access'，然后點擊 'Policies' 來建立存取策略，以定義誰有權限存取網路。\n",[433,4242],{"alt":4243,"src":4244},"Cloudflare Zero Trust Access 策略頁面，顯示新設定的存取規則","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-access-policies-page.webp",[506,4246,4247,4248],{},"點击 'Create new policy'。\n",[433,4249],{"alt":4250,"src":4251},"Cloudflare Access policies page showing no policies added and a button to create a new policy.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-no-policies-create-button.png",[506,4253,4254,4255],{},"選擇 'Emails' 並在 'Policy rules' 下方輸入您的電子郵件地址。\n",[433,4256],{"alt":4257,"src":4258},"Cloudflare Access policy rule configuration screen with an email address specified as the inclusion criteria.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-email.png",[538,4260,4262],{"id":4261},"第-2-步在-vps-上設定-cloudflare-warp-用戶端","第 2 步：在 VPS 上設定 Cloudflare WARP 用戶端",[2109,4264,4265,4274,4280,4287,4290,4305,4308,4386],{},[506,4266,4267,4268,468,4271,692],{},"在 VPS 終端機中執行 ",[573,4269,4270],{},"sudo apt update",[573,4272,4273],{},"sudo apt install cloudflare-warp",[506,4275,4267,4276,4279],{},[573,4277,4278],{},"warp-cli registration new \u003CTEAM-NAME>","，該指令將輸出一個 URL。",[506,4281,4282,4283,4286],{},"複製輸出的 URL（其格式類似於 ",[573,4284,4285],{},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp","），並將其貼上到瀏覽器中進行認證。",[506,4288,4289],{},"由於前面的策略設定中使用了電子郵件認證，請輸入您的電子郵件以進行認證。",[506,4291,4292,4293,4296,4297,4300,4301,4304],{},"當瀏覽器中顯示 '",[462,4294,4295],{},"Success","' 頁面後，右鍵點擊藍色的 '",[462,4298,4299],{},"Open Cloudflare WARP","' 按鈕並選擇「",[462,4302,4303],{},"檢查 (Inspect)","」。",[506,4306,4307],{},"複製該按鈕連結中的長 Token 字串。",[506,4309,4267,4310,4313,4314,4317,4318],{},[573,4311,4312],{},"warp-cli --accept-tos registration token \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\"","，將您的 VPS 連接到 Cloudflare Zero Trust。",[4315,4316],"br",{},"如果在 Ubuntu 26 上遇到 'Error: Failed to communicate with the WARP API'，請執行以下命令：",[567,4319,4321],{"className":569,"code":4320,"language":571,"meta":424,"style":424},"sudo systemctl restart warp-svc.service\n\n# Check status\nsudo systemctl status warp-svc.service\n\n# Run the warp-cli registration token again\nwarp-cli --accept-tos registration token   \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\"\n",[573,4322,4323,4335,4339,4344,4355,4359,4364],{"__ignoreMap":424},[576,4324,4325,4327,4329,4332],{"class":578,"line":579},[576,4326,1311],{"class":582},[576,4328,1755],{"class":586},[576,4330,4331],{"class":586}," restart",[576,4333,4334],{"class":586}," warp-svc.service\n",[576,4336,4337],{"class":578,"line":597},[576,4338,738],{"emptyLinePlaceholder":737},[576,4340,4341],{"class":578,"line":603},[576,4342,4343],{"class":606},"# Check status\n",[576,4345,4346,4348,4350,4353],{"class":578,"line":610},[576,4347,1311],{"class":582},[576,4349,1755],{"class":586},[576,4351,4352],{"class":586}," status",[576,4354,4334],{"class":586},[576,4356,4357],{"class":578,"line":620},[576,4358,738],{"emptyLinePlaceholder":737},[576,4360,4361],{"class":578,"line":625},[576,4362,4363],{"class":606},"# Run the warp-cli registration token again\n",[576,4365,4366,4369,4372,4375,4378,4381,4384],{"class":578,"line":631},[576,4367,4368],{"class":582},"warp-cli",[576,4370,4371],{"class":586}," --accept-tos",[576,4373,4374],{"class":586}," registration",[576,4376,4377],{"class":586}," token",[576,4379,4380],{"class":719},"   \"",[576,4382,4383],{"class":586},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[576,4385,1101],{"class":719},[506,4387,4388,4389],{},"回到 Cloudflare Zero Trust 儀表板，點擊 'Devices'。您現在應該能看到您的 VPS 設備。\n",[433,4390],{"alt":4391,"src":4392},"Zero Trust 設備儀表板，確認 Linux VPS 已成功連線","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-devices-vps-connected.webp",[538,4394,4396],{"id":4395},"第-3-步設定流量路由","第 3 步：設定流量路由",[2109,4398,4399,4406,4413,4420],{},[506,4400,4401,4402],{},"在 Devices 儀表板中點擊您 VPS 設備的設定檔。\n",[433,4403],{"alt":4404,"src":4405},"存取已登冊 VPS 設備的詳細資訊與分割通道設定","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-device-profile.webp",[506,4407,4408,4409],{},"向下捲動至 'Split Tunnels' 部分。\n",[433,4410],{"alt":4411,"src":4412},"VPS 設備設定檔下的 Split Tunnels 分割通道區段","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-split-tunnels-section.webp",[506,4414,4415,4416],{},"點擊 'Manage' 按鈕，並按照下圖設定。如有需要請替換相應的 IP 位址。\n",[433,4417],{"alt":4418,"src":4419},"在 Cloudflare 設定中管理分割通道 IP 與主機名稱排除規則","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-manage-split-tunnels.webp",[506,4421,4422,4423,468,4426,4429],{},"暴露 ",[573,4424,4425],{},"address",[573,4427,4428],{},"host"," 會將發往您服務的流量路由到該私有網路內。",[538,4431,4433],{"id":4432},"第-4-步設定-vps-防火牆","第 4 步：設定 VPS 防火牆",[429,4435,4436],{},"啟用防火牆，僅允許 '100.96.0.0\u002F12' 子網的流量通過，並阻擋其他所有公共入站存取。",[567,4438,4440],{"className":569,"code":4439,"language":571,"meta":424,"style":424},"sudo ufw enable \nsudo ufw default allow outgoing \nsudo ufw default deny incoming\nsudo ufw allow in from 100.96.0.0\u002F12\n",[573,4441,4442,4453,4470,4484],{"__ignoreMap":424},[576,4443,4444,4446,4449,4451],{"class":578,"line":579},[576,4445,1311],{"class":582},[576,4447,4448],{"class":586}," ufw",[576,4450,1768],{"class":586},[576,4452,1335],{"class":593},[576,4454,4455,4457,4459,4462,4465,4468],{"class":578,"line":597},[576,4456,1311],{"class":582},[576,4458,4448],{"class":586},[576,4460,4461],{"class":586}," default",[576,4463,4464],{"class":586}," allow",[576,4466,4467],{"class":586}," outgoing",[576,4469,1335],{"class":593},[576,4471,4472,4474,4476,4478,4481],{"class":578,"line":603},[576,4473,1311],{"class":582},[576,4475,4448],{"class":586},[576,4477,4461],{"class":586},[576,4479,4480],{"class":586}," deny",[576,4482,4483],{"class":586}," incoming\n",[576,4485,4486,4488,4490,4492,4495,4498],{"class":578,"line":610},[576,4487,1311],{"class":582},[576,4489,4448],{"class":586},[576,4491,4464],{"class":586},[576,4493,4494],{"class":586}," in",[576,4496,4497],{"class":586}," from",[576,4499,4500],{"class":586}," 100.96.0.0\u002F12\n",[429,4502,4503],{},"允許回環網路 (loopback) 的流量，避免導致本地服務異常：",[567,4505,4507],{"className":569,"code":4506,"language":571,"meta":424,"style":424},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[573,4508,4509,4525],{"__ignoreMap":424},[576,4510,4511,4513,4515,4517,4519,4522],{"class":578,"line":579},[576,4512,1311],{"class":582},[576,4514,4448],{"class":586},[576,4516,4464],{"class":586},[576,4518,4494],{"class":586},[576,4520,4521],{"class":586}," on",[576,4523,4524],{"class":586}," lo\n",[576,4526,4527,4529,4531,4533,4536,4538],{"class":578,"line":597},[576,4528,1311],{"class":582},[576,4530,4448],{"class":586},[576,4532,4464],{"class":586},[576,4534,4535],{"class":586}," out",[576,4537,4521],{"class":586},[576,4539,4524],{"class":586},[429,4541,4542],{},"重新載入防火牆規則並驗證狀態：",[567,4544,4546],{"className":569,"code":4545,"language":571,"meta":424,"style":424},"sudo ufw reload \nsudo ufw status verbose\n",[573,4547,4548,4559],{"__ignoreMap":424},[576,4549,4550,4552,4554,4557],{"class":578,"line":579},[576,4551,1311],{"class":582},[576,4553,4448],{"class":586},[576,4555,4556],{"class":586}," reload",[576,4558,1335],{"class":593},[576,4560,4561,4563,4565,4567],{"class":578,"line":597},[576,4562,1311],{"class":582},[576,4564,4448],{"class":586},[576,4566,4352],{"class":586},[576,4568,4569],{"class":586}," verbose\n",[538,4571,4573],{"id":4572},"第-5-步將-hermes-agent-暴露至私有網路","第 5 步：將 Hermes Agent 暴露至私有網路",[429,4575,4576,4577,4580,4581,692],{},"我們將把 ",[462,4578,4579],{},"Hermes Agent Web Dashboard"," 暴露至私有網路，並使用預設的認證提供商 ",[462,4582,4583],{},"Nous Research",[543,4585,4586],{"id":4586},"設定認證提供商",[2109,4588,4589,4598,4605,4612,4619],{},[506,4590,4591,4592,4597],{},"前往 ",[442,4593,4596],{"href":4594,"rel":4595},"https:\u002F\u002Fportal.nousresearch.com",[446],"portal.nousresearch.com"," 註冊一個帳號。",[506,4599,4600,4601],{},"選擇 'Local Dashboards'。\n",[433,4602],{"alt":4603,"src":4604},"在 Nous Research 入口網站中選擇 Local Dashboards 本地儀表板選項","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-local-dashboards-selection.webp",[506,4606,4607,4608],{},"點擊 'Register Dashboard'。\n",[433,4609],{"alt":4610,"src":4611},"點擊 Register Dashboard 按鈕以建立新的儀表板項目","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-dashboard.webp",[506,4613,4614,4615],{},"將 VPS 在私有網路中的 IP 位址填入 'Dashboard redirect URI' 並點擊 'Save'。\n",[433,4616],{"alt":4617,"src":4618},"在 Nous Research 入口網站中註冊私有網路 VPS IP 位址作為重新導向 URI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-redirect-uri.webp",[506,4620,4621,4622,4625],{},"複製 'OAuth client ID' 並將其貼上到您的 ",[573,4623,4624],{},"config.yaml"," 檔案中：",[567,4627,4631],{"className":4628,"code":4629,"language":4630,"meta":424,"style":424},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dashboard:\n  theme: default\n  show_token_analytics: false\n  oauth:\n    client_id: agent:cmq02x7ha0002jk0ba3kfnb\n    portal_url: https:\u002F\u002Fportal.nousresearch.com\n  basic_auth:\n    username: ''\n    password_hash: ''\n","yaml",[573,4632,4633,4640,4650,4661,4668,4678,4688,4695,4705],{"__ignoreMap":424},[576,4634,4635,4638],{"class":578,"line":579},[576,4636,4637],{"class":1059},"dashboard",[576,4639,1063],{"class":719},[576,4641,4642,4645,4647],{"class":578,"line":597},[576,4643,4644],{"class":1059},"  theme",[576,4646,765],{"class":719},[576,4648,4649],{"class":586}," default\n",[576,4651,4652,4655,4657],{"class":578,"line":603},[576,4653,4654],{"class":1059},"  show_token_analytics",[576,4656,765],{"class":719},[576,4658,4660],{"class":4659},"sfNiH"," false\n",[576,4662,4663,4666],{"class":578,"line":610},[576,4664,4665],{"class":1059},"  oauth",[576,4667,1063],{"class":719},[576,4669,4670,4673,4675],{"class":578,"line":620},[576,4671,4672],{"class":1059},"    client_id",[576,4674,765],{"class":719},[576,4676,4677],{"class":586}," agent:cmq02x7ha0002jk0ba3kfnb\n",[576,4679,4680,4683,4685],{"class":578,"line":625},[576,4681,4682],{"class":1059},"    portal_url",[576,4684,765],{"class":719},[576,4686,4687],{"class":586}," https:\u002F\u002Fportal.nousresearch.com\n",[576,4689,4690,4693],{"class":578,"line":631},[576,4691,4692],{"class":1059},"  basic_auth",[576,4694,1063],{"class":719},[576,4696,4697,4700,4702],{"class":578,"line":772},[576,4698,4699],{"class":1059},"    username",[576,4701,765],{"class":719},[576,4703,4704],{"class":719}," ''\n",[576,4706,4707,4710,4712],{"class":578,"line":1123},[576,4708,4709],{"class":1059},"    password_hash",[576,4711,765],{"class":719},[576,4713,4704],{"class":719},[543,4715,4717],{"id":4716},"使用-systemd-確保-hermes-dashboard-開機自啟","使用 Systemd 確保 Hermes Dashboard 開機自啟",[2109,4719,4720],{},[506,4721,4722],{},"建立服務檔案：",[567,4724,4728],{"className":4725,"code":4726,"language":4727,"meta":424,"style":424},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n","shell",[573,4729,4730],{"__ignoreMap":424},[576,4731,4732,4734,4737],{"class":578,"line":579},[576,4733,1311],{"class":582},[576,4735,4736],{"class":586}," nano",[576,4738,4739],{"class":586}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[2109,4741,4742],{"start":597},[506,4743,4744,4745,4748],{},"貼上以下設定，確保 ",[573,4746,4747],{},"--host 0.0.0.0"," 包含在指令中：",[567,4750,4754],{"className":4751,"code":4752,"language":4753,"meta":424,"style":424},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=Hermes Dashboard\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\nRestart=always\nRestartSec=10\nEnvironment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n\n[Install]\nWantedBy=multi-user.target\n","ini",[573,4755,4756,4760,4765,4770,4774,4778,4783,4788,4793,4797,4802,4807,4811,4815],{"__ignoreMap":424},[576,4757,4758],{"class":578,"line":579},[576,4759,1663],{},[576,4761,4762],{"class":578,"line":597},[576,4763,4764],{},"Description=Hermes Dashboard\n",[576,4766,4767],{"class":578,"line":603},[576,4768,4769],{},"After=network.target\n",[576,4771,4772],{"class":578,"line":610},[576,4773,738],{"emptyLinePlaceholder":737},[576,4775,4776],{"class":578,"line":620},[576,4777,1687],{},[576,4779,4780],{"class":578,"line":625},[576,4781,4782],{},"User=hermes\n",[576,4784,4785],{"class":578,"line":631},[576,4786,4787],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[576,4789,4790],{"class":578,"line":772},[576,4791,4792],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[576,4794,4795],{"class":578,"line":1123},[576,4796,1722],{},[576,4798,4799],{"class":578,"line":1131},[576,4800,4801],{},"RestartSec=10\n",[576,4803,4804],{"class":578,"line":1139},[576,4805,4806],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[576,4808,4809],{"class":578,"line":1147},[576,4810,738],{"emptyLinePlaceholder":737},[576,4812,4813],{"class":578,"line":1155},[576,4814,1736],{},[576,4816,4817],{"class":578,"line":1163},[576,4818,1741],{},[2109,4820,4821],{"start":603},[506,4822,4823],{},"啟用並啟動服务：",[567,4825,4827],{"className":4725,"code":4826,"language":4727,"meta":424,"style":424},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[573,4828,4829,4837,4848,4859],{"__ignoreMap":424},[576,4830,4831,4833,4835],{"class":578,"line":579},[576,4832,1311],{"class":582},[576,4834,1755],{"class":586},[576,4836,1758],{"class":586},[576,4838,4839,4841,4843,4845],{"class":578,"line":597},[576,4840,1311],{"class":582},[576,4842,1755],{"class":586},[576,4844,1768],{"class":586},[576,4846,4847],{"class":586}," hermes-dashboard\n",[576,4849,4850,4852,4854,4857],{"class":578,"line":603},[576,4851,1311],{"class":582},[576,4853,1755],{"class":586},[576,4855,4856],{"class":586}," start",[576,4858,4847],{"class":586},[576,4860,4861,4863,4865,4867],{"class":578,"line":610},[576,4862,1311],{"class":582},[576,4864,1755],{"class":586},[576,4866,4352],{"class":586},[576,4868,4847],{"class":586},[538,4870,4872],{"id":4871},"第-6-步在桌面上安裝-cloudflare-warp-用戶端","第 6 步：在桌面上安裝 Cloudflare WARP 用戶端",[2109,4874,4875,4883,4886,4893,4900,4907],{},[506,4876,3087,4877,4882],{},[442,4878,4881],{"href":4879,"rel":4880},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[446],"Cloudflare 官網"," 下載 Cloudflare WARP 用戶端。",[506,4884,4885],{},"安裝完成後打開並執行 Cloudflare WARP 用戶端。",[506,4887,4888,4889],{},"依提示登入。\n",[433,4890],{"alt":4891,"src":4892},"桌上型電腦上的 Cloudflare WARP 用戶端登入提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-prompt.webp",[506,4894,4895,4896],{},"登入成功後會顯示 'Success' 頁面。\n",[433,4897],{"alt":4898,"src":4899},"在桌上型電腦登入 Cloudflare Zero Trust 後的驗證成功網頁","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-success.webp",[506,4901,4902,4903],{},"此時 WARP 用戶端應顯示已連接至您的 Zero Trust 团队。\n",[433,4904],{"alt":4905,"src":4906},"桌面版 Cloudflare WARP 用戶端確認已連線至 Zero Trust 私有網路","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-client-connected.webp",[506,4908,4909,4910,4913,4914],{},"在瀏覽器中輸入您的私有 IP 位址（例如 ",[573,4911,4912],{},"100.96.0.3","），即可成功載入 Hermes Web Dashboard。\n",[433,4915],{"alt":4916,"src":4917},"在桌面瀏覽器中存取私有 Hermes Agent 網頁儀表板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-desktop-view.webp",[4919,4920,4921],"blockquote",{},[429,4922,4923,4926,4927,4932],{},[462,4924,4925],{},"macOS 用戶進階提示："," 如果您需要使用 WARP 用戶端存取多個 Cloudflare 帳號，請參閱我們的快速指南 ",[462,4928,4929],{},[442,4930,4931],{"href":399},"使用MDM設定檔在macOS上無縫切換與設定多個Cloudflare WARP零信任組織的完整教學指南","，實現帳號間的無縫切換。",[538,4934,4936],{"id":4935},"第-7-步在-ios-設備上安裝-cloudflare-warp-用戶端","第 7 步：在 iOS 設備上安裝 Cloudflare WARP 用戶端",[2109,4938,4939,4945,4953,4961,4969],{},[506,4940,4941,4942,692],{},"在 App Store 中安裝 ",[462,4943,4944],{},"Cloudflare One",[506,4946,4947,4948],{},"打開 Cloudflare One 應用程式並在提示時輸入您的團隊名稱。\n",[433,4949],{"alt":4950,"src":4951,"width":4952},"在 iOS 上的 Cloudflare One 應用程式中輸入 Cloudflare Zero Trust 團隊名稱","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-team-name-prompt.webp",239,[506,4954,4955,4956],{},"使用前面在策略規則中設定的同一個電子郵件地址進行登入。\n",[433,4957],{"alt":4958,"src":4959,"width":4960},"iOS 上的 Cloudflare Zero Trust 電子郵件驗證提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-email-login.webp",229,[506,4962,4963,4964],{},"連接成功後，介面應如下所示：\n",[433,4965],{"alt":4966,"src":4967,"width":4968},"iOS 行動設備上 Cloudflare One 應用程式顯示的已連線狀態","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-client-connected.webp",322,[506,4970,4971,4972,4974,4975],{},"在手機瀏覽器中輸入私有 IP ",[573,4973,4912],{}," 即可在行動設備上存取 Hermes Web Dashboard。\n",[433,4976],{"alt":4977,"src":4978,"width":4979},"在手機瀏覽器上存取 Hermes Agent 網頁儀表板介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-mobile-view.webp",345,[493,4981,4037],{"id":4037},[429,4983,4984,4985,4987,4988,4991],{},"藉助 ",[462,4986,476],{}," 管理身分策略以及 ",[462,4989,4990],{},"WARP"," 用戶端透過加密隧道路由流量，您的 Hermes Agent 現在可以被您的設備在全球範圍內安全存取。該配置為構建並存取完全遠端、私有的 AI 基礎架構奠定了堅實而安全的根基。",[1901,4993,4994],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":424,"searchDepth":597,"depth":603,"links":4996},[4997,5000,5012],{"id":4176,"depth":597,"text":4176,"children":4998},[4999],{"id":4194,"depth":603,"text":4194},{"id":4205,"depth":597,"text":4205,"children":5001},[5002,5003,5004,5005,5006,5010,5011],{"id":4208,"depth":603,"text":4209},{"id":4261,"depth":603,"text":4262},{"id":4395,"depth":603,"text":4396},{"id":4432,"depth":603,"text":4433},{"id":4572,"depth":603,"text":4573,"children":5007},[5008,5009],{"id":4586,"depth":610,"text":4586},{"id":4716,"depth":610,"text":4717},{"id":4871,"depth":603,"text":4872},{"id":4935,"depth":603,"text":4936},{"id":4037,"depth":597,"text":4037},[4109,5014],"security","2026-07-09","本文深入探討如何使用 Cloudflare WARP 與 Zero Trust 技術，在完全不需要開啟任何防火牆入站連接埠的情況下，安全地將您的 Hermes Agent 暴露到私有網路中，從而實現全球範圍內的安全存取。這為您構建專屬私有遠端 AI 基礎架構打下堅實基礎。","透過 Cloudflare Zero Trust 和 WARP 隧道安全地將 Hermes Agent 暴露至私有網路",{"schemaOrg":5019,"robots":1939,"sitemap":5021},[5020],{"@type":1938,"headline":2093,"description":5016,"name":2093,"image":2098},{"lastmod":5022},"2026-09-28",{"title":5024,"description":5016,"ogTitle":2093,"ogDescription":5016,"twitterTitle":2093,"twitterDescription":5016},"透過 Cloudflare Zero Trust 實現對 Hermes Agent 的安全存取","tw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[4160,1949,4156,5027,5028],"私有網路","教學","HTGJ42xrWk07SDM4iYiDvZunbYRe0lOzZcsR2BGh8No",[5031,5032,5856],{"id":4148,"title":2093,"author":424,"body":4149,"category":5013,"date":5015,"description":5016,"extension":1930,"image":2098,"imageAlt":5017,"isPublished":737,"meta":5018,"minRead":620,"navigation":737,"path":363,"seo":5023,"stem":5025,"tags":5026,"updatedAt":5022,"__hash__":5029},{"id":5033,"title":5034,"author":1950,"body":5035,"category":5838,"date":5840,"description":5841,"extension":1930,"image":5842,"imageAlt":5843,"isPublished":737,"meta":5844,"minRead":5849,"navigation":737,"path":415,"seo":5850,"stem":5851,"tags":5852,"updatedAt":1950,"__hash__":5855},"article\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory.md","基於Cloudflare Workers與MCP協定構建個人專屬AI持久化記憶系統，完美解決Context空白痛點",{"type":426,"value":5036,"toc":5820},[5037,5041,5044,5047,5051,5054,5069,5073,5080,5094,5097,5100,5144,5148,5229,5233,5259,5368,5379,5383,5388,5429,5454,5458,5463,5534,5539,5543,5576,5582,5622,5625,5657,5661,5669,5673,5713,5717,5767,5770,5773,5776,5779,5783,5817],[493,5038,5040],{"id":5039},"持久化-ai-記憶對智慧體agent的重要性","持久化 AI 記憶對智慧體（Agent）的重要性",[429,5042,5043],{},"隨著 AI 助手逐漸融入我們的日常生活與工作，我們經常會遇到「空白上下文」的問題（Blank Context Issue）。上週已經確認的決策在開啟新對話後便被遺忘，這迫使我们不得不一遍又一遍地輸入相同的技術堆疊（Tech Stack）細節，並在每個新會話中重新設定使用者偏好。",[429,5045,5046],{},"與其每次都從零開始，我們需要構建一個能夠持續演進、深入理解使用者決策的記憶系統，從而徹底消除重複輸入上下文的煩惱。",[493,5048,5050],{"id":5049},"自行架設-ai-記憶系統-vs-內置-ai-記憶功能","自行架設 AI 記憶系統 vs. 內置 AI 記憶功能",[429,5052,5053],{},"雖然許多 AI 智慧體或用戶端（如 ChatGPT、Claude 等）自帶了內建記憶功能，但我們很少在所有場景下只使用單一智慧體。我們可能會用 Claude 來設計和規劃專案架構，用 Kimi 來編寫程式碼，用 ChatGPT 進行深度的背景研究。然而，這些不同的智慧體之間無法直接共享上下文，所有記憶依然被孤立在各自的生態黑盒子中。",[429,5055,5056,5057,5062,5063,5068],{},"從軟體工程的角度來看，我們並不信任無法控制的黑盒子。我們需要的是一個可觀察、可審計且完全處於自己掌控之下的 AI 記憶系統。開放原始碼專案 ",[442,5058,5061],{"href":5059,"rel":5060},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[446],"Second Brain","（Fork 自 ",[442,5064,5067],{"href":5065,"rel":5066},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare%EF%BC%89%E6%8F%90%E4%BE%9B%E4%BA%86%E4%B8%80%E5%80%8B%E6%94%AF%E6%8F%B4%E6%A8%A1%E5%9E%8B%E4%B8%8A%E4%B8%8B%E6%96%87%E5%8D%94%E5%AE%9A%EF%BC%88Model",[446],"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare）提供了一個支援模型上下文協定（Model"," Context Protocol，簡稱 MCP）的持久化自行架設 AI 記憶系統。任何相容 MCP 協定的 AI 智慧體（如 Claude、ChatGPT、Kimi Code 等）都可以完美共享相同的上下文記憶庫。",[493,5070,5072],{"id":5071},"如何在-cloudflare-上構建-second-brain-ai-記憶系統","如何在 Cloudflare 上構建 Second Brain AI 記憶系統",[429,5074,5075,5076,5079],{},"Second Brain 記憶系統部署在 ",[462,5077,5078],{},"Cloudflare Workers"," 之上，其提供了全球分佈式、極低延遲的 Serverless 執行基礎設施。這使得在 AI 的推理和決策循環中，檢索記憶（Recall）及寫入等操作能夠以近乎零延遲的體驗執行。",[429,5081,5082,5083,5086,5087,5090,5091,5093],{},"系統使用 ",[462,5084,5085],{},"Workers AI"," 的嵌入（Embedding）模型来生成高維向量。這些嵌入向量儲存在 ",[462,5088,5089],{},"Cloudflare Vectorize"," 中，這是一項經過高度優化、全球分佈式的高性能向量資料庫服務。",[462,5092,5089],{}," 會執行餘弦相似度（Cosine Similarity）搜尋，以精準匹配具有語意相關性的記憶切片。",[429,5095,5096],{},"Second Brain 還內建了智慧的去重與合併機制。只有在內容相似度低於 85% 時，系統才會將其作為新記憶儲存；否則，該內容將被攔截或標記為潛在的重複候選。超過 1,600 字元的長文字會被系統在句子或換行符邊界處進行合理切分，並保持相鄰分片之間有 200 字元的重疊（Overlap），以防丟失上下文語境。隨後，每個文字分片都會被單獨向量化，從而實現極高精度的語意匹配。",[429,5098,5099],{},"系統為 AI 智慧體直接暴露了以下 MCP 工具介面：",[503,5101,5102,5108,5114,5120,5126,5132,5138],{},[506,5103,5104,5107],{},[573,5105,5106],{},"remember","：儲存想法、決策、偏好及專案整體上下文",[506,5109,5110,5113],{},[573,5111,5112],{},"append","：為已有的記憶內容追加新的更新或補充資訊",[506,5115,5116,5119],{},[573,5117,5118],{},"update","：完全替換已有的某條記憶內容",[506,5121,5122,5125],{},[573,5123,5124],{},"recall","：基於語意相似度檢索相關記憶，而非死板的關鍵字精確匹配",[506,5127,5128,5131],{},[573,5129,5130],{},"list_recent","：瀏覽最近儲存的記憶記錄",[506,5133,5134,5137],{},[573,5135,5136],{},"forget","：永久且徹底地刪除某條記憶",[506,5139,5140,5143],{},[573,5141,5142],{},"link\u002Fconnections","：明示關聯不同的記憶節點（V2 版本提供的圖譜功能）",[538,5145,5147],{"id":5146},"在-cloudflare-上設定-second-brain","在 Cloudflare 上設定 Second Brain",[2109,5149,5150,5167,5174,5181,5188,5195,5206,5213,5216,5223],{},[506,5151,3110,5152,5157,5158,5161,5162,5166],{},[442,5153,5156],{"href":5154,"rel":5155},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[446],"Github 儲存庫"," 頁面，點擊 ",[573,5159,5160],{},"Deploy to Cloudflare"," 按鈕。 [[",[433,5163],{"alt":5164,"src":5165},"GitHub 頁面上突出顯示的 Deploy to Cloudflare 部署按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fdeploy-to-cloudflare-button.webp","]]",[506,5168,5169,5170],{},"填寫彈出的 Cloudflare Worker 設定表單。\n",[433,5171],{"alt":5172,"src":5173},"Cloudflare Workers 部署設定表單","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-deployment-form.webp",[506,5175,5176,5177],{},"在 Dimensions（維度）輸入 '384'，Metric（度量指標）選擇 'cosine'，然後點擊 Deploy 按鈕。\n",[433,5178],{"alt":5179,"src":5180},"Cloudflare Vectorize 向量資料庫建立與維度設定","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-vectorize-configuration.webp",[506,5182,5183,5184],{},"部署成功後，以下是 Cloudflare Workers 平台中 Second Brain 實例的概覽資訊：\n",[433,5185],{"alt":5186,"src":5187},"已部署的 Second Brain Worker 實例概覽首頁","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-second-brain-overview.webp",[506,5189,5190,5191],{},"點擊 'Settings'（設定），然後點擊 'AUTH_TOKEN' 環境變數旁的編輯圖示，以建立一條高強度的存取權杖（Token）：\n",[433,5192],{"alt":5193,"src":5194},"Cloudflare Worker 變數設定中高亮顯示的 AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-settings.webp",[506,5196,5197,5198,5202],{},"點擊 'Rotate'（輪換）連結，以便能輸入新的安全值： ",[433,5199],{"alt":5200,"src":5201},"AUTH_TOKEN 變數修改與金鑰輪換介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-rotate.webp",[433,5203],{"alt":5204,"src":5205},"在 AUTH_TOKEN 值欄位中輸入產生的隨機安全字串","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-value-input.webp",[506,5207,5208,5209,5212],{},"在 macOS 終端機中執行 ",[573,5210,5211],{},"openssl rand -base64 32"," 命令來生成一個隨機的安全字串，並將其複製貼上到 'Value' 輸入框中。",[506,5214,5215],{},"點擊 'Deploy' 按鈕，使新設定的 'AUTH_TOKEN' 正式生效。",[506,5217,5218,5219],{},"在瀏覽器中打開您剛剛建立的 Second Brain Worker 存取網域：\n",[433,5220],{"alt":5221,"src":5222},"包含 Bearer Token 輸入欄位收藏的 Second Brain Web 登入介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-login.webp",[506,5224,3110,5225,5228],{},[573,5226,5227],{},"Bearer token"," 輸入框中填入剛才建立的 'AUTH_TOKEN'，然後點擊 'Connect' 按鈕登入 Web 主控台。",[538,5230,5232],{"id":5231},"透過-mcp-協定整合-claude-desktop","透過 MCP 協定整合 Claude Desktop",[2109,5234,5235,5242,5249],{},[506,5236,5237,5238],{},"在 Claude Desktop 用戶端中點擊 'Customize'（自訂）按鈕。\n",[433,5239],{"alt":5240,"src":5241},"Claude Desktop 介面中指向 Customize 自訂按鈕的位置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-customize-button.webp",[506,5243,5244,5245],{},"點擊 'Developer'（開發者）選項，手動編輯本地的 MCP 設定檔：\n",[433,5246],{"alt":5247,"src":5248},"Claude Desktop 開發者設定選單中用於開啟 MCP 設定檔的選項","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-developer-menu.webp",[506,5250,3110,5251,5254,5255,5258],{},[573,5252,5253],{},"claude_desktop_config.json"," 的 ",[573,5256,5257],{},"mcpServers"," 欄位中加入以下設定程式碼區塊：",[567,5260,5262],{"className":710,"code":5261,"language":712,"meta":424,"style":424},"    \"second-brain\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n        \"--header\",\n        \"Authorization: Bearer \u003Cyour-token>\"\n      ]\n    }\n",[573,5263,5264,5279,5301,5315,5327,5338,5349,5358,5363],{"__ignoreMap":424},[576,5265,5266,5269,5272,5274,5277],{"class":578,"line":579},[576,5267,5268],{"class":719},"    \"",[576,5270,5271],{"class":586},"second-brain",[576,5273,1519],{"class":719},[576,5275,5276],{"class":593},": ",[576,5278,720],{"class":719},[576,5280,5281,5284,5287,5289,5291,5293,5296,5298],{"class":578,"line":597},[576,5282,5283],{"class":719},"      \"",[576,5285,5286],{"class":2729},"command",[576,5288,1519],{"class":719},[576,5290,765],{"class":719},[576,5292,1095],{"class":719},[576,5294,5295],{"class":586},"npx",[576,5297,1519],{"class":719},[576,5299,5300],{"class":719},",\n",[576,5302,5303,5305,5308,5310,5312],{"class":578,"line":603},[576,5304,5283],{"class":719},[576,5306,5307],{"class":2729},"args",[576,5309,1519],{"class":719},[576,5311,765],{"class":719},[576,5313,5314],{"class":719}," [\n",[576,5316,5317,5320,5323,5325],{"class":578,"line":610},[576,5318,5319],{"class":719},"        \"",[576,5321,5322],{"class":586},"mcp-remote",[576,5324,1519],{"class":719},[576,5326,5300],{"class":719},[576,5328,5329,5331,5334,5336],{"class":578,"line":620},[576,5330,5319],{"class":719},[576,5332,5333],{"class":586},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[576,5335,1519],{"class":719},[576,5337,5300],{"class":719},[576,5339,5340,5342,5345,5347],{"class":578,"line":625},[576,5341,5319],{"class":719},[576,5343,5344],{"class":586},"--header",[576,5346,1519],{"class":719},[576,5348,5300],{"class":719},[576,5350,5351,5353,5356],{"class":578,"line":631},[576,5352,5319],{"class":719},[576,5354,5355],{"class":586},"Authorization: Bearer \u003Cyour-token>",[576,5357,1101],{"class":719},[576,5359,5360],{"class":578,"line":772},[576,5361,5362],{"class":719},"      ]\n",[576,5364,5365],{"class":578,"line":1123},[576,5366,5367],{"class":719},"    }\n",[429,5369,5370,5374,5375],{},[433,5371],{"alt":5372,"src":5373},"包含 Second Brain 遠端服務的 Claude Desktop MCP 設定檔","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-config-json.webp","\n4. 重啟 Claude Desktop 並檢查 'Local MCP servers' 列表，狀態應顯示為 'running'（運行中）。\n",[433,5376],{"alt":5377,"src":5378},"Claude Desktop 用戶端中顯示為執行（running）狀態的的 Second Brain MCP 服務","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-status-running.webp",[538,5380,5382],{"id":5381},"透過-mcp-協定整合-claude-code","透過 MCP 協定整合 Claude Code",[503,5384,5385],{},[506,5386,5387],{},"在終端機中執行以下命令以新增該遠端 MCP 服務：",[567,5389,5391],{"className":4725,"code":5390,"language":4727,"meta":424,"style":424},"claude mcp add --transport http second-brain https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\n",[573,5392,5393],{"__ignoreMap":424},[576,5394,5395,5398,5401,5404,5407,5410,5413,5416,5418,5421,5424,5426],{"class":578,"line":579},[576,5396,5397],{"class":582},"claude",[576,5399,5400],{"class":586}," mcp",[576,5402,5403],{"class":586}," add",[576,5405,5406],{"class":586}," --transport",[576,5408,5409],{"class":586}," http",[576,5411,5412],{"class":586}," second-brain",[576,5414,5415],{"class":586}," https:\u002F\u002F",[576,5417,3443],{"class":719},[576,5419,5420],{"class":586},"your-worker-ur",[576,5422,5423],{"class":593},"l",[576,5425,3452],{"class":719},[576,5427,5428],{"class":586},"\u002Fmcp\n",[503,5430,5431,5437],{},[506,5432,5433,5434,692],{},"Claude Code 會自動偵測到該端點需要 OAuth 身份驗證，並在您的預設瀏覽器中打開登入頁面，供您輸入並驗證剛才建立的 ",[573,5435,5436],{},"AUTH_TOKEN",[506,5438,5439,5440,5443,5444,5447,5448,5453],{},"在本地的 ",[573,5441,5442],{},"~\u002F.claude"," 目錄下建立 ",[573,5445,5446],{},"CLAUDE.md"," 檔案，並將 ",[442,5449,5452],{"href":5450,"rel":5451},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[446],"CLAUDE_INSTRUCTIONS.md"," 檔案中的引導詞和規則完整寫入其中。",[538,5455,5457],{"id":5456},"透過-mcp-協定整合-gemini-cli","透過 MCP 協定整合 Gemini CLI",[2109,5459,5460],{},[506,5461,5462],{},"将以下 MCP 設定資訊加入您本地的 '.\u002F.gemini\u002Fsettings.json' 檔案：",[567,5464,5466],{"className":710,"code":5465,"language":712,"meta":424,"style":424},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[573,5467,5468,5480,5499,5512,5525,5530],{"__ignoreMap":424},[576,5469,5470,5472,5474,5476,5478],{"class":578,"line":579},[576,5471,5268],{"class":719},[576,5473,5271],{"class":586},[576,5475,1519],{"class":719},[576,5477,5276],{"class":593},[576,5479,720],{"class":719},[576,5481,5482,5484,5487,5489,5491,5493,5495,5497],{"class":578,"line":597},[576,5483,5283],{"class":719},[576,5485,5486],{"class":2729},"httpUrl",[576,5488,1519],{"class":719},[576,5490,765],{"class":719},[576,5492,1095],{"class":719},[576,5494,5333],{"class":586},[576,5496,1519],{"class":719},[576,5498,5300],{"class":719},[576,5500,5501,5503,5506,5508,5510],{"class":578,"line":603},[576,5502,5283],{"class":719},[576,5504,5505],{"class":2729},"oauth",[576,5507,1519],{"class":719},[576,5509,765],{"class":719},[576,5511,752],{"class":719},[576,5513,5514,5516,5519,5521,5523],{"class":578,"line":610},[576,5515,5319],{"class":719},[576,5517,5518],{"class":582},"enabled",[576,5520,1519],{"class":719},[576,5522,765],{"class":719},[576,5524,3669],{"class":719},[576,5526,5527],{"class":578,"line":620},[576,5528,5529],{"class":719},"      }\n",[576,5531,5532],{"class":578,"line":625},[576,5533,5367],{"class":719},[2109,5535,5536],{"start":597},[506,5537,5538],{},"啟動 Gemini CLI 用戶端。",[538,5540,5542],{"id":5541},"在不同-ai-智慧體中測試-second-brain-效果","在不同 AI 智慧體中測試 Second Brain 效果",[2109,5544,5545,5555,5569],{},[506,5546,3110,5547,5550,5551],{},[462,5548,5549],{},"Claude Desktop"," 中，如果我們只是進行簡單的品牌色調偏好設定，此時預設並不會呼叫外部的 Second Brain 服務：\n",[433,5552],{"alt":5553,"src":5554},"在未啟用 Second Brain 記憶層時在 Claude Desktop 中進行的首次偏好設定測試","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-first-run-brand-palette.webp",[506,5556,5557,5558,5560,5561,5564,5565],{},"如果我們只是輸入 'remember' 等常規詞，由於其尚未觸發特定提示詞引導，",[462,5559,5549],{}," 此時僅會呼叫本地內建的 ",[573,5562,5563],{},"memory_user-edits"," 工具，並不會同步到雲端的持久化記憶層。\n",[433,5566],{"alt":5567,"src":5568},"Claude Desktop 預設呼叫本地內建使用者編輯工具而忽略雲端 Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-remember-built-in-tool-fallback.webp",[506,5570,5571,5572,5575],{},"而當我们在配置了規則引導的 ",[462,5573,5574],{},"Claude Code"," 終端機中，輸入以下具體指令時，系統便成功地在背景觸發並呼叫了 Second Brain 工具：",[567,5577,5580],{"className":5578,"code":5579,"language":2499},[2497],"Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n",[573,5581,5579],{"__ignoreMap":424},[429,5583,5584,5588,5589,5592,5593,5597,5598,5602,5603,5605,5606,5610,5611,5614,5615,5597,5619],{},[433,5585],{"alt":5586,"src":5587},"Claude Code 終端機視窗顯示成功觸發並寫入 Second Brain 遠端記憶","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-code-second-brain-mcp-called.webp","\n4. 登入 ",[462,5590,5591],{},"Cloudflare Workers 主控台"," 查看 Second Brain 的資料庫，確認這些顏色資訊已成功同步並儲存在雲端：\n",[433,5594],{"alt":5595,"src":5596},"在 Second Brain 主控台 Web UI 中驗證已成功儲存的品牌色設定資料","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-color-verification.webp","\n- ",[5599,5600,5601],"em",{},"Claude Code 之所以能夠自動無縫工作，得益於專案目錄下的 CLAUDE_INSTRUCTIONS.md 檔案。該檔案讓智慧體能夠理解並關聯包含 'Second Brain' 關鍵字的記憶流程。","\n5. 在 ",[462,5604,5549],{}," 中若想達到相同效果，我們需要在提示詞中顯式提及 'Second Brain' 相關的指引，以強制智慧體讀取或寫入這一持久化記憶圖層。\n",[433,5607],{"alt":5608,"src":5609},"在提示詞中顯式提及 'Second Brain' 關鍵字以觸發遠端記憶讀寫","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-second-brain-explicit-trigger.webp","\n6. 同樣地，在 ",[462,5612,5613],{},"Gemini CLI"," 互動中，我們也需要提到 'Second Brain' 關鍵字，以喚醒並觸發其對應的遠端 MCP 工具。\n",[433,5616],{"alt":5617,"src":5618},"Gemini CLI 終端機命令列互動中成功觸發 Second Brain 讀寫","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fgemini-cli-second-brain-trigger.webp",[5599,5620,5621],{},"如果您仿照 CLAUDE_INSTRUCTIONS.md 的做法，在本地的 GEMINI.md 檔案中添加類似的上下文引導，AI 便可在背景靜默呼叫 Second Brain 記憶層，不再需要您每次都手動輸入觸發關鍵字。",[538,5623,5624],{"id":5624},"瀏覽器擴充功能与快捷剪輯",[503,5626,5627,5630],{},[506,5628,5629],{},"系統為 Chrome、Firefox 和 Microsoft Edge 瀏覽器提供了官方外掛程式支援。",[506,5631,5632,5633],{},"透過該外掛程式，您可以非常快捷地完成以下操作：\n",[503,5634,5635,5641,5647],{},[506,5636,5637,5640],{},[462,5638,5639],{},"網頁一鍵剪輯"," — 一鍵將當前頁面的網頁標題與 URL 網址快捷歸檔到您的 Second Brain 中。",[506,5642,5643,5646],{},[462,5644,5645],{},"選取文字摘要剪輯"," — 選取網頁中的任意精彩段落或技術細節後點擊剪輯，該摘錄便會配合網頁標題和 URL 被一併儲存。",[506,5648,5649,5652,5653,5656],{},[462,5650,5651],{},"自由文字速記"," — 在儲存前直接在功能彈窗中輸入額外的補充上下文，或直接附帶 ",[573,5654,5655],{},"#標記","；這些標記會被系統自動識別並提取。",[538,5658,5660],{"id":5659},"透過-obsidian-外掛程式同步個人本地知識庫","透過 Obsidian 外掛程式同步個人本地知識庫",[503,5662,5663,5666],{},[506,5664,5665],{},"系統提供了一個 Obsidian 專屬外掛程式，支援將您本地 Obsidian Vault（保險庫）中的特定筆記完美同步至 Cloudflare 端自託管的 Second Brain 記憶中心。",[506,5667,5668],{},"透過設定特定的同步標記，您可以精準控制哪些筆記能夠寫入您的持久化 AI 上下文庫中。",[543,5670,5672],{"id":5671},"安装-obsidian-外掛程式","安装 Obsidian 外掛程式",[2109,5674,5675,5689,5699,5706],{},[506,5676,5677,5678,5681,5682,5685],{},"啟動 Obsidian 用戶端 → 點擊 ",[576,5679,5680],{},"Settings（設定）"," → ",[576,5683,5684],{},"Community Plugins（第三方外掛程式）",[433,5686],{"alt":5687,"src":5688},"Obsidian 系統設定面板中指向第三方社群外掛程式的入口","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-settings-community-plugins.webp",[506,5690,875,5691,5694,5695],{},[576,5692,5693],{},"Browse（瀏覽）"," 按鈕。\n",[433,5696],{"alt":5697,"src":5698},"Obsidian 第三方外掛程式市集並高亮顯示的 Browse 瀏覽按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-browse.webp",[506,5700,5701,5702],{},"檢索關鍵詞 'Second Brain Sync'。\n",[433,5703],{"alt":5704,"src":5705},"在 Obsidian 第三方外掛程式市集中搜尋 Second Brain Sync 外掛程式","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-search-second-brain.webp",[506,5707,5708,5709],{},"點擊 'Install' 進行安裝，然後點擊 'Enable' 啟用該外掛程式。\n",[433,5710],{"alt":5711,"src":5712},"在 Obsidian 中點擊安裝並啟用 Second Brain Sync 外掛程式","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-install-and-enable.webp",[543,5714,5716],{"id":5715},"設定-obsidian-外掛程式","設定 Obsidian 外掛程式",[2109,5718,5719,5729,5736,5743,5750,5760],{},[506,5720,5721,5722,5724,5725,5728],{},"進入 Obsidian 用戶端 ",[576,5723,5680],{}," → 選取 ",[576,5726,5727],{},"Second Brain Sync"," 外掛程式設定頁面：",[506,5730,5731,5732],{},"準確填寫您的 Worker 的端點「URL」和剛才建立的「Auth token（身份權杖）」：\n",[433,5733],{"alt":5734,"src":5735},"在 Obsidian 外掛程式設定頁面中輸入 Worker URL 和 AUTH_TOKEN 身份憑證","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-configuration-credentials.webp",[506,5737,5738,5739],{},"點擊 'Test' 按鈕來驗證網路連線是否暢通：\n",[433,5740],{"alt":5741,"src":5742},"Obsidian 外掛程式連線測試傳回成功（Success）提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-connection-test-success.webp",[506,5744,5745,5746],{},"設定具體的同步策略。設定您的同步標記「Sync tag」並開啟「Auto-sync on save（儲存時自動同步）」功能：\n",[433,5747],{"alt":5748,"src":5749},"在 Obsidian 外掛程式中設定特定同步標記並啟用儲存時自動同步","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-sync-behavior-settings.webp",[506,5751,5752,5753,5755,5756],{},"在 Obsidian 知識庫中新建一篇筆記，並為其附帶您設定好的同步標記（例如： ",[573,5754,5271],{},"）：\n",[433,5757],{"alt":5758,"src":5759},"在 Obsidian 中建立一篇帶有 'second-brain' 標籤的待同步本地筆記","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-note-with-sync-tag.webp",[506,5761,5762,5763],{},"筆記儲存後，其內容已成功觸發並自動同步到在 Cloudflare 上運行的自託管 Second Brain 實例中：\n",[433,5764],{"alt":5765,"src":5766},"在雲端 Second Brain 主控台 Web UI 中驗證已成功同步過來的 Obsidian 筆記","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-synced-note-verification.webp",[493,5768,5769],{"id":5769},"總結與展望",[429,5771,5772],{},"Second Brain 記憶系統為困擾當前 AI 生態的最大痛點之一 —— 長期上下文遺忘與記憶斷層，提供了一套極為優雅的開源解決方案。透過將自託管專案與 Cloudflare Workers 彈性、全球分佈的 Serverless 基礎設施深度結合，我們得以在邊緣網路上輕鬆架設起一條低延遲、高回應速度的個人語意記憶閘道。得益於 MCP 這一開放的標準，這條記憶脈絡如今已能無縫流動、並被移植共享於各種主流的 AI 助手和開發終端之間。",[429,5774,5775],{},"Obsidian 專屬同步外掛程式的加入，更是將這套架構完美融合進了個人日常的知識管理（PKM）流程。您平時隨手記錄的雜亂卡片或開發速記，能被有選擇地提煉並重構，轉化為可被 AI 完美解析的結構化上下文。",[429,5777,5778],{},"將私有化部署、高精度的語意向量搜尋以及開放式的 MCP 整合標準相融合，Second Brain 不僅僅是一層記憶的外掛，它正向我們展示著一個由使用者個人掌握核心資料所有權，安全、獨立、互聯的未來 Agent 生態系統基石。",[493,5780,5782],{"id":5781},"參考資料","參考資料：",[503,5784,5785,5791,5797,5804,5811],{},[506,5786,5787],{},[442,5788,5789],{"href":5789,"rel":5790},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[446],[506,5792,5793],{},[442,5794,5795],{"href":5795,"rel":5796},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[446],[506,5798,5799],{},[442,5800,5803],{"href":5801,"rel":5802},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[446],"Connect to AI Clients",[506,5805,5806],{},[442,5807,5810],{"href":5808,"rel":5809},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[446],"Second Brain Obsidian Plugin",[506,5812,5813],{},[442,5814,5815],{"href":5815,"rel":5816},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[446],[1901,5818,5819],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":424,"searchDepth":597,"depth":603,"links":5821},[5822,5823,5824,5836,5837],{"id":5039,"depth":597,"text":5040},{"id":5049,"depth":597,"text":5050},{"id":5071,"depth":597,"text":5072,"children":5825},[5826,5827,5828,5829,5830,5831,5832],{"id":5146,"depth":603,"text":5147},{"id":5231,"depth":603,"text":5232},{"id":5381,"depth":603,"text":5382},{"id":5456,"depth":603,"text":5457},{"id":5541,"depth":603,"text":5542},{"id":5624,"depth":603,"text":5624},{"id":5659,"depth":603,"text":5660,"children":5833},[5834,5835],{"id":5671,"depth":610,"text":5672},{"id":5715,"depth":610,"text":5716},{"id":5769,"depth":597,"text":5769},{"id":5781,"depth":597,"text":5782},[5839,4109],"cloudflare","2026-08-07","學習如何利用Cloudflare Workers、Vectorize與MCP協定自行架設AI持久化記憶系統（Second Brain）。在Claude、Gemini與Obsidian之間完美共享上下文。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002FTW-Use-Cloudflare-as-AI-memory.webp","基於 Cloudflare Workers 和 Vectorize 構建的自託管 AI 持久化記憶系統，支援 MCP 協定與 Obsidian 筆記雙向同步。",{"schemaOrg":5845,"robots":1939,"sitemap":5848},[5846],{"@type":4117,"headline":5847,"description":5841},"基於Cloudflare與MCP協定自行架設AI持久化記憶系統",{"lastmod":5840},35,{"title":5847,"description":5841,"ogTitle":5034,"ogDescription":5841,"twitterTitle":5034,"twitterDescription":5841},"tw\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[4145,5853,5854,5061,1947],"MCP","AI 記憶","YPOf86d5u4oQ6tOrox0pT9UIC3Wk6d7rbNYqAotfw5s",{"id":5857,"title":4931,"author":424,"body":5858,"category":6374,"date":6375,"description":6376,"extension":1930,"image":6377,"imageAlt":6378,"isPublished":737,"meta":6379,"minRead":597,"navigation":737,"path":399,"seo":6383,"stem":6384,"tags":6385,"updatedAt":1950,"__hash__":6388},"article\u002Ftw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac.md",{"type":426,"value":5859,"toc":6367},[5860,5864,5867,5874,5878,5881,5884,5887,5891,5894,5901,5917,6210,6326,6329,6332,6334,6364],[493,5861,5863],{"id":5862},"什麼是-cloudflare-warp","什麼是 Cloudflare WARP？",[429,5865,5866],{},"Cloudflare WARP 是一款用戶端應用程式，它會將指定裝置的網路流量引導至 Cloudflare 的全球網路進行路由，而不是直接傳送到公共網際網路。",[429,5868,5869,5870,5873],{},"它基於 ",[462,5871,5872],{},"WireGuard"," 通訊協定建立一條加密隧道，從而保護從裝置到最近的 Cloudflare 資料中心之間的流量安全。隨後，您可以在 Cloudflare 控制面板中建立原則，對這些流入的流量進行篩選、記錄、檢查或路由。",[493,5875,5877],{"id":5876},"為什麼我們需要-cloudflare-warp","為什麼我們需要 Cloudflare WARP？",[429,5879,5880],{},"為了向員工、承包商和其他專案關係人安全地公開內部資源（如私有 Web 服務或 SaaS 應用程式），Cloudflare WARP 用戶端被用作**零信任網路存取 (ZTNA)**的用戶端強制執行點。",[429,5882,5883],{},"Cloudflare WARP 用戶端安裝在用戶的筆記型電腦或手機上。它要求用戶在授予存取權限之前進行身分驗證，並滿足特定的安全性狀態檢查（例如來自經過核准的 IP 範圍、使用已註冊的電子郵件網域或執行處於作用狀態的防火牆）。",[429,5885,5886],{},"透過將裝置流量直接通道化傳輸到 Cloudflare，用戶的身分、裝置和原則將在要求到達內部資源之前得到驗證。因此，內部資源永遠不會暴露在公共網際網路上，每一次要求都將得到完整的記錄和稽核。",[493,5888,5890],{"id":5889},"在單一裝置上支援多個-warp-設定檔","在單一裝置上支援多個 WARP 設定檔",[429,5892,5893],{},"當用戶需要在個人和企業 Cloudflare 帳戶之間進行切換，或者當系統管理員需要管理多個租戶（tenant）時，在單一裝置上支援多個 WARP 設定檔就顯得至关重要。",[429,5895,5896,5897,5900],{},"要在 macOS 上實現此目標，我們可以使用 ",[573,5898,5899],{},".mobileconfig"," MDM 設定檔來定義和註冊不同的 WARP 環境。",[503,5902,5903,5914],{},[506,5904,5905,5906,692],{},"直接從 Cloudflare ",[442,5907,5910,5911,5913],{"href":5908,"rel":5909},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fstatic\u002Fmdm\u002Fmultiple-orgs\u002FCloudflareWARP.mobileconfig",[446],"下載 ",[573,5912,5899],{}," 範例檔案",[506,5915,5916],{},"以下是該設定檔的範例文本：",[567,5918,5922],{"className":5919,"code":5920,"language":5921,"meta":424,"style":424},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n\u003Cplist version=\"1.0\">\n\u003Cdict>\n  \u003Ckey>PayloadContent\u003C\u002Fkey>\n  \u003Carray>\n    \u003Cdict>\n      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n      \u003Ckey>PayloadType\u003C\u002Fkey>\n      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n      \u003Cinteger>1\u003C\u002Finteger>\n      \u003Ckey>configs\u003C\u002Fkey>\n      \u003Carray>\n        \u003Cdict>\n          \u003Ckey>organization\u003C\u002Fkey>\n          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n          \u003Ckey>display_name\u003C\u002Fkey>\n          \u003Cstring>Team 1\u003C\u002Fstring>\n        \u003C\u002Fdict>\n        \u003Cdict>\n          \u003Ckey>organization\u003C\u002Fkey>\n          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n          \u003Ckey>display_name\u003C\u002Fkey>\n          \u003Cstring>Team 2\u003C\u002Fstring>\n        \u003C\u002Fdict>\n      \u003C\u002Farray>\n    \u003C\u002Fdict>\n  \u003C\u002Farray>\n  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n  \u003Cfalse\u002F>\n  \u003Ckey>PayloadScope\u003C\u002Fkey>\n  \u003Cstring>System\u003C\u002Fstring>\n  \u003Ckey>PayloadType\u003C\u002Fkey>\n  \u003Cstring>Configuration\u003C\u002Fstring>\n  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n  \u003Cinteger>1\u003C\u002Finteger>\n\u003C\u002Fdict>\n\u003C\u002Fplist>\n","xml",[573,5923,5924,5929,5934,5939,5944,5949,5954,5959,5964,5969,5974,5979,5984,5989,5994,5999,6004,6009,6014,6019,6024,6029,6034,6039,6044,6049,6054,6059,6063,6067,6072,6076,6081,6085,6091,6096,6102,6108,6114,6120,6126,6132,6138,6144,6150,6156,6162,6168,6174,6180,6186,6192,6198,6204],{"__ignoreMap":424},[576,5925,5926],{"class":578,"line":579},[576,5927,5928],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[576,5930,5931],{"class":578,"line":597},[576,5932,5933],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[576,5935,5936],{"class":578,"line":603},[576,5937,5938],{},"\u003Cplist version=\"1.0\">\n",[576,5940,5941],{"class":578,"line":610},[576,5942,5943],{},"\u003Cdict>\n",[576,5945,5946],{"class":578,"line":620},[576,5947,5948],{},"  \u003Ckey>PayloadContent\u003C\u002Fkey>\n",[576,5950,5951],{"class":578,"line":625},[576,5952,5953],{},"  \u003Carray>\n",[576,5955,5956],{"class":578,"line":631},[576,5957,5958],{},"    \u003Cdict>\n",[576,5960,5961],{"class":578,"line":772},[576,5962,5963],{},"      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[576,5965,5966],{"class":578,"line":1123},[576,5967,5968],{},"      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n",[576,5970,5971],{"class":578,"line":1131},[576,5972,5973],{},"      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[576,5975,5976],{"class":578,"line":1139},[576,5977,5978],{},"      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[576,5980,5981],{"class":578,"line":1147},[576,5982,5983],{},"      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[576,5985,5986],{"class":578,"line":1155},[576,5987,5988],{},"      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n",[576,5990,5991],{"class":578,"line":1163},[576,5992,5993],{},"      \u003Ckey>PayloadType\u003C\u002Fkey>\n",[576,5995,5996],{"class":578,"line":1171},[576,5997,5998],{},"      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n",[576,6000,6001],{"class":578,"line":1182},[576,6002,6003],{},"      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[576,6005,6006],{"class":578,"line":1187},[576,6007,6008],{},"      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[576,6010,6011],{"class":578,"line":1195},[576,6012,6013],{},"      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[576,6015,6016],{"class":578,"line":1744},[576,6017,6018],{},"      \u003Cinteger>1\u003C\u002Finteger>\n",[576,6020,6021],{"class":578,"line":1750},[576,6022,6023],{},"      \u003Ckey>configs\u003C\u002Fkey>\n",[576,6025,6026],{"class":578,"line":1761},[576,6027,6028],{},"      \u003Carray>\n",[576,6030,6031],{"class":578,"line":2430},[576,6032,6033],{},"        \u003Cdict>\n",[576,6035,6036],{"class":578,"line":2888},[576,6037,6038],{},"          \u003Ckey>organization\u003C\u002Fkey>\n",[576,6040,6041],{"class":578,"line":2897},[576,6042,6043],{},"          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n",[576,6045,6046],{"class":578,"line":2905},[576,6047,6048],{},"          \u003Ckey>display_name\u003C\u002Fkey>\n",[576,6050,6051],{"class":578,"line":2913},[576,6052,6053],{},"          \u003Cstring>Team 1\u003C\u002Fstring>\n",[576,6055,6056],{"class":578,"line":2918},[576,6057,6058],{},"        \u003C\u002Fdict>\n",[576,6060,6061],{"class":578,"line":2925},[576,6062,6033],{},[576,6064,6065],{"class":578,"line":2933},[576,6066,6038],{},[576,6068,6069],{"class":578,"line":2941},[576,6070,6071],{},"          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n",[576,6073,6074],{"class":578,"line":2952},[576,6075,6048],{},[576,6077,6078],{"class":578,"line":2960},[576,6079,6080],{},"          \u003Cstring>Team 2\u003C\u002Fstring>\n",[576,6082,6083],{"class":578,"line":2967},[576,6084,6058],{},[576,6086,6088],{"class":578,"line":6087},34,[576,6089,6090],{},"      \u003C\u002Farray>\n",[576,6092,6093],{"class":578,"line":5849},[576,6094,6095],{},"    \u003C\u002Fdict>\n",[576,6097,6099],{"class":578,"line":6098},36,[576,6100,6101],{},"  \u003C\u002Farray>\n",[576,6103,6105],{"class":578,"line":6104},37,[576,6106,6107],{},"  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[576,6109,6111],{"class":578,"line":6110},38,[576,6112,6113],{},"  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n",[576,6115,6117],{"class":578,"line":6116},39,[576,6118,6119],{},"  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[576,6121,6123],{"class":578,"line":6122},40,[576,6124,6125],{},"  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n",[576,6127,6129],{"class":578,"line":6128},41,[576,6130,6131],{},"  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[576,6133,6135],{"class":578,"line":6134},42,[576,6136,6137],{},"  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n",[576,6139,6141],{"class":578,"line":6140},43,[576,6142,6143],{},"  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n",[576,6145,6147],{"class":578,"line":6146},44,[576,6148,6149],{},"  \u003Cfalse\u002F>\n",[576,6151,6153],{"class":578,"line":6152},45,[576,6154,6155],{},"  \u003Ckey>PayloadScope\u003C\u002Fkey>\n",[576,6157,6159],{"class":578,"line":6158},46,[576,6160,6161],{},"  \u003Cstring>System\u003C\u002Fstring>\n",[576,6163,6165],{"class":578,"line":6164},47,[576,6166,6167],{},"  \u003Ckey>PayloadType\u003C\u002Fkey>\n",[576,6169,6171],{"class":578,"line":6170},48,[576,6172,6173],{},"  \u003Cstring>Configuration\u003C\u002Fstring>\n",[576,6175,6177],{"class":578,"line":6176},49,[576,6178,6179],{},"  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[576,6181,6183],{"class":578,"line":6182},50,[576,6184,6185],{},"  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n",[576,6187,6189],{"class":578,"line":6188},51,[576,6190,6191],{},"  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[576,6193,6195],{"class":578,"line":6194},52,[576,6196,6197],{},"  \u003Cinteger>1\u003C\u002Finteger>\n",[576,6199,6201],{"class":578,"line":6200},53,[576,6202,6203],{},"\u003C\u002Fdict>\n",[576,6205,6207],{"class":578,"line":6206},54,[576,6208,6209],{},"\u003C\u002Fplist>\n",[503,6211,6212,6222,6236,6246,6252,6269,6282,6301,6317],{},[506,6213,6214,6215,468,6218,6221],{},"將 ",[573,6216,6217],{},"your-team-name-1",[573,6219,6220],{},"your-team-name-2"," 替換為您各自的 Cloudflare Zero Trust 團隊名稱。",[506,6223,6224,6225,6228,6229,6231,6232,6235],{},"在終端機中執行指令 ",[573,6226,6227],{},"uuidgen"," 產生唯一的 UUID，並使用它們替換 ",[573,6230,5899],{}," 檔案中的預留位置 ",[573,6233,6234],{},"PayloadUUID"," 值。",[506,6237,6238,6239,6242,6243,6245],{},"確保 ",[573,6240,6241],{},"PayloadIdentifier"," 字串中也包含更新後的 ",[573,6244,6234],{},"，以保證設定檔的唯一性。",[506,6247,6248,6249,6251],{},"儲存編輯後的 ",[573,6250,5899],{}," 檔案。",[506,6253,6254,6255,6258,6259,6262,6263,6265],{},"打開 Mac 上的",[462,6256,6257],{},"系統設定","，搜尋並選擇",[462,6260,6261],{},"描述檔","（Profiles）。",[4315,6264],{},[433,6266],{"alt":6267,"src":6268},"macOS 系統設定中的描述檔面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-system-settings-profiles.webp",[506,6270,6271,6272,6275,6276,6278],{},"按一下",[462,6273,6274],{},"安裝、檢視或移除...","（Install, view or remove...）開始新增您的新設定檔。",[4315,6277],{},[433,6279],{"alt":6280,"src":6281},"macOS 描述檔安裝、檢視或移除按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-view-remove.webp",[506,6283,6284,6285,6288,6289,6251,6291,6293,6297],{},"按一下左下角的 ",[462,6286,6287],{},"+","（加號）圖示，並選擇您儲存的 ",[573,6290,5899],{},[4315,6292],{},[433,6294],{"alt":6295,"src":6296},"macOS 描述檔左下角新增（+）按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-add-profile.webp",[433,6298],{"alt":6299,"src":6300},"在 macOS 上選擇 .mobileconfig 設定檔","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-select-mobileconfig-file.webp",[506,6302,6303,6304,6306,6307,6310,6311,6313],{},"選擇 ",[462,6305,4160],{}," 並按一下",[462,6308,6309],{},"安裝","以套用此設定。",[4315,6312],{},[433,6314],{"alt":6315,"src":6316},"在 macOS 上確認安裝 Cloudflare WARP 描述檔","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-install-cloudflare-warp-profile.webp",[506,6318,6319,6320,6322],{},"重新啟動您的 Cloudflare WARP 用戶端。您現在應該可以在使用者介面中看到多組織切換器：",[4315,6321],{},[433,6323],{"alt":6324,"src":6325},"macOS 上支援多組織切換的 Cloudflare WARP 用戶端介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fcloudflare-warp-multi-profile-switcher.webp",[493,6327,6328],{"id":6328},"結論",[429,6330,6331],{},"Cloudflare WARP 用戶端在用戶裝置上扮演著關鍵的安全邊界角色，使零信任網路存取（ZTNA）既穩固又極具實用性。透過將內部資源與公共網際網路隔離開來，可確保每一次連線嘗試都經過安全的身份驗證、評估與稽核。",[493,6333,5781],{"id":5781},[503,6335,6336,6343,6350,6357],{},[506,6337,6338],{},[442,6339,6342],{"href":6340,"rel":6341},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002F#prepare-file-for-mdm-deployment",[446],"Managed Deployment Preparation",[506,6344,6345],{},[442,6346,6349],{"href":6347,"rel":6348},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002Fswitch-organizations\u002F",[446],"Switch Between Zero Trust Organizations",[506,6351,6352],{},[442,6353,6356],{"href":6354,"rel":6355},"https:\u002F\u002Fblog.cloudflare.com\u002Fintroducing-warp-connector-paving-the-path-to-any-to-any-connectivity-2\u002F",[446],"Introducing WARP Connector: Paving the Path to Any-to-Any Connectivity",[506,6358,6359],{},[442,6360,6363],{"href":6361,"rel":6362},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002F",[446],"Cloudflare One Client Documentation",[1901,6365,6366],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":424,"searchDepth":597,"depth":603,"links":6368},[6369,6370,6371,6372,6373],{"id":5862,"depth":597,"text":5863},{"id":5876,"depth":597,"text":5877},{"id":5889,"depth":597,"text":5890},{"id":6328,"depth":597,"text":6328},{"id":5781,"depth":597,"text":5781},[5014,5839],"2026-07-04","本指南將詳細介紹如何在macOS系統上，通過使用MDM .mobileconfig設定檔，實現多個Cloudflare WARP零信任組織或帳戶之間的無縫切換。本文為企業IT系統管理員提供了一套完整的、可直接落地部署的教學指南與設定步驟範本，幫助企業輕鬆管理並確保終端用戶的網路安全、合規審計與流暢體驗。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002FTW-Switch-Between-Multiple-Cloudflare-WARP-Orgs-on-Mac.webp","在Mac上配置和切換多個Cloudflare WARP組織帳戶",{"schemaOrg":6380,"robots":1939,"sitemap":6382},[6381],{"@type":1938,"headline":4931,"description":6376},{"lastmod":6375},{"title":6378,"description":6376,"ogTitle":4931,"ogDescription":6376,"twitterTitle":4931,"twitterDescription":6376},"tw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",[6386,4160,6387,1949],"macOS","MDM","zclGoAFYNMezL6vd0bCfBa4isSiwsXYfCQa7Cwm9YLI",1792490012239]