[{"data":1,"prerenderedAt":6389},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Fzh\u002Farticle\u002Fsync-obsidian-across-devices":421,"\u002Fzh\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":339,"seo":1942,"stem":1944,"tags":1945,"updatedAt":1950,"__hash__":1951},"article\u002Fzh\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,996,1003,1036,1040,1047,1200,1234,1240,1261,1272,1277,1281,1296,1369,1373,1378,1414,1545,1552,1558,1565,1571,1574,1580,1587,1602,1613,1620,1626,1637,1774,1780,1785,1788,1793,1796,1800,1806,1811,1817,1828,1838,1842,1854,1860,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},"\u002Fzh\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"," 命令行客户端将该本地目录与我们之前设置 of 远程同步知识库进行实时同步。",[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,684],{"id":995},"将域名添加至-caddyfile-1",[429,997,998,999,1002],{},"在您的 Caddyfile 中以相同的方式为 ",[573,1000,1001],{},"obsidian.pafor.me"," 配置反向代理：",[567,1004,1006],{"className":710,"code":1005,"language":712,"meta":424,"style":424},"{$OBSIDIAN_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:9898\n}\n",[573,1007,1008,1019,1023,1032],{"__ignoreMap":424},[576,1009,1010,1012,1015,1017],{"class":578,"line":579},[576,1011,743],{"class":719},[576,1013,1014],{"class":593},"$OBSIDIAN_DOMAIN",[576,1016,749],{"class":719},[576,1018,752],{"class":719},[576,1020,1021],{"class":578,"line":597},[576,1022,757],{"class":593},[576,1024,1025,1027,1029],{"class":578,"line":603},[576,1026,762],{"class":593},[576,1028,765],{"class":719},[576,1030,1031],{"class":768},"9898\n",[576,1033,1034],{"class":578,"line":610},[576,1035,728],{"class":719},[543,1037,1039],{"id":1038},"使用-docker-启动-ignis","使用 Docker 启动 Ignis",[429,1041,1042,1043,1046],{},"在 VPS 上将以下 Docker Compose 配置保存为 ",[573,1044,1045],{},"ignis-docker-compose.yml","：",[567,1048,1052],{"className":1049,"code":1050,"language":1051,"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,1053,1054,1063,1070,1080,1087,1101,1108,1113,1120,1128,1136,1144,1152,1160,1168,1179,1184,1192],{"__ignoreMap":424},[576,1055,1056,1060],{"class":578,"line":579},[576,1057,1059],{"class":1058},"swJcz","services",[576,1061,1062],{"class":719},":\n",[576,1064,1065,1068],{"class":578,"line":597},[576,1066,1067],{"class":1058},"  ignis",[576,1069,1062],{"class":719},[576,1071,1072,1075,1077],{"class":578,"line":603},[576,1073,1074],{"class":1058},"    image",[576,1076,765],{"class":719},[576,1078,1079],{"class":586}," nobbe\u002Fignis:latest\n",[576,1081,1082,1085],{"class":578,"line":610},[576,1083,1084],{"class":1058},"    ports",[576,1086,1062],{"class":719},[576,1088,1089,1092,1095,1098],{"class":578,"line":620},[576,1090,1091],{"class":719},"      -",[576,1093,1094],{"class":719}," \"",[576,1096,1097],{"class":586},"9898:8080",[576,1099,1100],{"class":719},"\"\n",[576,1102,1103,1106],{"class":578,"line":625},[576,1104,1105],{"class":1058},"    environment",[576,1107,1062],{"class":719},[576,1109,1110],{"class":578,"line":631},[576,1111,1112],{"class":606},"      # match these to your host user (run: id)\n",[576,1114,1115,1117],{"class":578,"line":772},[576,1116,1091],{"class":719},[576,1118,1119],{"class":586}," PUID=1000\n",[576,1121,1123,1125],{"class":578,"line":1122},9,[576,1124,1091],{"class":719},[576,1126,1127],{"class":586}," PGID=1000\n",[576,1129,1131,1133],{"class":578,"line":1130},10,[576,1132,1091],{"class":719},[576,1134,1135],{"class":586}," WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n",[576,1137,1139,1142],{"class":578,"line":1138},11,[576,1140,1141],{"class":1058},"    volumes",[576,1143,1062],{"class":719},[576,1145,1147,1149],{"class":578,"line":1146},12,[576,1148,1091],{"class":719},[576,1150,1151],{"class":586}," .\u002Fvaults:\u002Fvaults\n",[576,1153,1155,1157],{"class":578,"line":1154},13,[576,1156,1091],{"class":719},[576,1158,1159],{"class":586}," .\u002Fdata:\u002Fapp\u002Fdata\n",[576,1161,1163,1165],{"class":578,"line":1162},14,[576,1164,1091],{"class":719},[576,1166,1167],{"class":586}," obsidian-app:\u002Fapp\u002Fobsidian-app\n",[576,1169,1171,1174,1176],{"class":578,"line":1170},15,[576,1172,1173],{"class":1058},"    restart",[576,1175,765],{"class":719},[576,1177,1178],{"class":586}," unless-stopped\n",[576,1180,1182],{"class":578,"line":1181},16,[576,1183,738],{"emptyLinePlaceholder":737},[576,1185,1187,1190],{"class":578,"line":1186},17,[576,1188,1189],{"class":1058},"volumes",[576,1191,1062],{"class":719},[576,1193,1195,1198],{"class":578,"line":1194},18,[576,1196,1197],{"class":1058},"  obsidian-app",[576,1199,1062],{"class":719},[503,1201,1202,1213,1227],{},[506,1203,1204,1205,1208,1209,1212],{},"在主机端使用 ",[573,1206,1207],{},"9898"," 端口，因为 ",[573,1210,1211],{},"8080"," 是一个非常常用且容易冲突的端口。",[506,1214,1215,1216,1219,1220,468,1223,1226],{},"在您的 VPS 上运行 ",[573,1217,1218],{},"id"," 命令，获取当前主机用户的 ",[573,1221,1222],{},"UID",[573,1224,1225],{},"GID","，并将其填写到配置文件中，以确保文件系统具备正确的读写权限。",[506,1228,1229,1230,1233],{},"配置 ",[573,1231,1232],{},"WS_ORIGINS","，仅允许来自您指定域名的 WebSocket 连接，提高安全性。",[429,1235,1236,1237,1239],{},"启动 ",[462,1238,456],{}," 容器：",[567,1241,1243],{"className":569,"code":1242,"language":571,"meta":424,"style":424},"docker compose -f ignis-docker-compose.yml up -d\n",[573,1244,1245],{"__ignoreMap":424},[576,1246,1247,1249,1251,1254,1257,1259],{"class":578,"line":579},[576,1248,787],{"class":582},[576,1250,790],{"class":586},[576,1252,1253],{"class":586}," -f",[576,1255,1256],{"class":586}," ignis-docker-compose.yml",[576,1258,793],{"class":586},[576,1260,796],{"class":586},[429,1262,1263,1264,1267,1268,1271],{},"当您在网页浏览器中访问您的域名时，将会弹出 ",[462,1265,1266],{},"'Vault Manager'","（知识库管理器）。由于此时文件夹为空，它不会显示任何本地知识库。在下一节中，我们将配置 ",[462,1269,1270],{},"'Synch CLI'","，从我们之前配置的远程同步服务器中拉取笔记。",[433,1273],{"src":1274,"alt":1275,"style":1276},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-vault-manager-empty.webp","Ignis 网页客户端中当前为空的知识库管理器","max-width: 466px; width: 100%; height: auto;",[543,1278,1280],{"id":1279},"解决-docker-带来的防火墙失效问题","解决 Docker 带来的防火墙失效问题",[429,1282,1283,1284,1287,1288,1291,1292,1295],{},"默认情况下，Docker 会自动在系统底层插入自己的 DNAT 与 FORWARD 链规则，直接将外部公网流量转发至活动的容器端口。这会完全绕过 Ubuntu 默认的 UFW 或 iptables ",[573,1285,1286],{},"INPUT"," 链防火墙保护。为了阻止外部未经授权的访问并保持容器的绝对私有，我们需要手动将以下规则添加至 ",[573,1289,1290],{},"iptables"," 中的 ",[573,1293,1294],{},"DOCKER-USER"," 链：",[567,1297,1299],{"className":569,"code":1298,"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,1300,1301,1306,1335,1339,1344],{"__ignoreMap":424},[576,1302,1303],{"class":578,"line":579},[576,1304,1305],{"class":606},"# 阻断所有外部公网流量的直接访问\n",[576,1307,1308,1311,1314,1317,1320,1323,1326,1329,1332],{"class":578,"line":597},[576,1309,1310],{"class":582},"sudo",[576,1312,1313],{"class":586}," iptables",[576,1315,1316],{"class":586}," -I",[576,1318,1319],{"class":586}," DOCKER-USER",[576,1321,1322],{"class":586}," -i",[576,1324,1325],{"class":586}," ext_if",[576,1327,1328],{"class":586}," -j",[576,1330,1331],{"class":586}," DROP",[576,1333,1334],{"class":593}," \n",[576,1336,1337],{"class":578,"line":603},[576,1338,738],{"emptyLinePlaceholder":737},[576,1340,1341],{"class":578,"line":610},[576,1342,1343],{"class":606},"# 仅允许来自您的 Cloudflare WARP 客户端私有 IP 的访问流量\n",[576,1345,1346,1348,1350,1352,1354,1356,1358,1361,1364,1366],{"class":578,"line":620},[576,1347,1310],{"class":582},[576,1349,1313],{"class":586},[576,1351,1316],{"class":586},[576,1353,1319],{"class":586},[576,1355,1322],{"class":586},[576,1357,1325],{"class":586},[576,1359,1360],{"class":586}," -s",[576,1362,1363],{"class":768}," 100.96.0.10",[576,1365,1328],{"class":586},[576,1367,1368],{"class":586}," ACCEPT\n",[543,1370,1372],{"id":1371},"配置-synch-cli-命令行同步工具","配置 Synch CLI 命令行同步工具",[429,1374,1375,1377],{},[462,1376,971],{}," 是一款无界面的命令行工具，即使在没有安装 Obsidian 桌面应用的远程服务器上，它也能让本地目录与远程知识库进行实时同步。",[429,1379,1380,1381,1384,1385,1387,1388,1391,1392,949,1395,1398,1399,468,1402,1405,1406,1409,1410,1413],{},"从您之前克隆的 ",[573,1382,1383],{},"synch"," 仓库源码中构建 ",[462,1386,971],{},"。构建过程需要 ",[462,1389,1390],{},"Node.js >= 22.5","（因为 CLI 依赖于 ",[573,1393,1394],{},"node:sqlite",[573,1396,1397],{},"fetch","、",[573,1400,1401],{},"WebSocket",[573,1403,1404],{},"WebCrypto"," 等全局浏览器原生 API）和 ",[462,1407,1408],{},"pnpm","（由于整个仓库是一个使用了 ",[573,1411,1412],{},"pnpm@10.33.0"," 版本管理器的 pnpm 工作区）：",[567,1415,1417],{"className":569,"code":1416,"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,1418,1419,1424,1435,1442,1446,1451,1458,1462,1467,1480,1484,1489,1500,1529,1533,1538],{"__ignoreMap":424},[576,1420,1421],{"class":578,"line":579},[576,1422,1423],{"class":606},"# Check versions\n",[576,1425,1426,1429,1432],{"class":578,"line":597},[576,1427,1428],{"class":582},"node",[576,1430,1431],{"class":586}," --version",[576,1433,1434],{"class":606},"   # must be >= 22.5\n",[576,1436,1437,1439],{"class":578,"line":603},[576,1438,1408],{"class":582},[576,1440,1441],{"class":586}," --version\n",[576,1443,1444],{"class":578,"line":610},[576,1445,738],{"emptyLinePlaceholder":737},[576,1447,1448],{"class":578,"line":620},[576,1449,1450],{"class":606},"# In the repos root\n",[576,1452,1453,1455],{"class":578,"line":625},[576,1454,1408],{"class":582},[576,1456,1457],{"class":586}," install\n",[576,1459,1460],{"class":578,"line":631},[576,1461,738],{"emptyLinePlaceholder":737},[576,1463,1464],{"class":578,"line":772},[576,1465,1466],{"class":606},"# Build the CLI bundle\n",[576,1468,1469,1471,1474,1477],{"class":578,"line":1122},[576,1470,1408],{"class":582},[576,1472,1473],{"class":586}," -C",[576,1475,1476],{"class":586}," apps\u002Fcli",[576,1478,1479],{"class":586}," build\n",[576,1481,1482],{"class":578,"line":1130},[576,1483,738],{"emptyLinePlaceholder":737},[576,1485,1486],{"class":578,"line":1138},[576,1487,1488],{"class":606},"# After a successful build you have `apps\u002Fcli\u002Fdist\u002Fsynch.js`. Make it executable and put it on your PATH\n",[576,1490,1491,1494,1497],{"class":578,"line":1146},[576,1492,1493],{"class":582},"chmod",[576,1495,1496],{"class":586}," +x",[576,1498,1499],{"class":586}," apps\u002Fcli\u002Fdist\u002Fsynch.js\n",[576,1501,1502,1505,1508,1510,1513,1516,1519,1521,1524,1527],{"class":578,"line":1154},[576,1503,1504],{"class":582},"ln",[576,1506,1507],{"class":586}," -sf",[576,1509,1094],{"class":719},[576,1511,1512],{"class":593},"$PWD",[576,1514,1515],{"class":586},"\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js",[576,1517,1518],{"class":719},"\"",[576,1520,1094],{"class":719},[576,1522,1523],{"class":593},"$HOME",[576,1525,1526],{"class":586},"\u002F.local\u002Fbin\u002Fsynch",[576,1528,1100],{"class":719},[576,1530,1531],{"class":578,"line":1162},[576,1532,738],{"emptyLinePlaceholder":737},[576,1534,1535],{"class":578,"line":1170},[576,1536,1537],{"class":606},"# Verification\n",[576,1539,1540,1542],{"class":578,"line":1181},[576,1541,1383],{"class":582},[576,1543,1544],{"class":586}," --help\n",[429,1546,1547,1548,1551],{},"由于 Synch CLI 运行在与您的 Synch remote 虚拟同步服务端相同的 VPS 上，它能够直接自动连接至本地的 API 服务端口。如果您将它们部署在不同的服务器上，请运行 ",[573,1549,1550],{},"synch login --api-url \u003Cremote-synch-api-url>"," 来手动定义您的远程目标 API 端点。",[429,1553,1554],{},[433,1555],{"alt":1556,"src":1557},"在终端中输入自定义 API URL 运行 synch login 登录命令","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-api-url-terminal.webp",[429,1559,1560,1561,1564],{},"在您的 VPS 终端中运行 ",[573,1562,1563],{},"synch login"," 命令，您将获得一个用于身份验证的登录 URL：",[429,1566,1567],{},[433,1568],{"alt":1569,"src":1570},"终端输出显示的 Synch CLI 认证 URL","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-auth-url-terminal.webp",[429,1572,1573],{},"使用与您在 Obsidian 桌面端 Synchrun 插件中注册的相同邮箱地址，通过该网页链接进行登录授权。",[429,1575,1576],{},[433,1577],{"alt":1578,"src":1579},"Synch CLI 授权网页端登录成功","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-web-login-success.webp",[429,1581,1582,1583,1586],{},"运行 ",[573,1584,1585],{},"synch vault connect --vault ~\u002Fvaults\u002F\u003Cvaultname> --vault-id asadqe-7b29-4677-fsad-234asdafasd"," 来将您 VPS 上的本地知识库目录与远程自建服务器上的知识库进行关联：",[429,1588,1589,1590,1593,1594,1597,1598,1601],{},"您可以通过打开桌面端 Obsidian 中的 ",[462,1591,1592],{},"Synchrun"," 插件设置，点击 ",[462,1595,1596],{},"“管理远程知识库”（Manage remote vaults）"," 来找到您的远程知识库 ID。该操作会打开一个网页并列出您所有的远程知识库，每个库旁边都附带有一个 GUID 格式的唯一标识符（例如：",[573,1599,1600],{},"123e4567-e89b-12d3-a456-426614174000","）：",[429,1603,1604,1609],{},[433,1605],{"src":1606,"alt":1607,"style":1608},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-manage-remote-vaults.webp","在 Synchrun 插件中管理远程知识库","max-width: 582px; width: 100%; height: auto;",[433,1610],{"alt":1611,"src":1612},"在 Synchrun 中定位唯一的远程知识库 ID","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-remote-vault-id.webp",[429,1614,1615,1616,1619],{},"在提示时输入您的知识库密码以确立关联。关联成功后，运行 ",[573,1617,1618],{},"synch sync --vault ~\u002Fvaults\u002F\u003Cvault-name>"," 来进行您的首次全量同步。首次同步根据您的文件大小，可能会耗费一些时间。",[429,1621,1622],{},[433,1623],{"alt":1624,"src":1625},"Synch CLI 中显示首次拉取同步知识库的进度","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-cli-initial-sync-progress.webp",[429,1627,1628,1629,1632,1633,1636],{},"为了让同步全自动进行，我们可以配置并启用一个 ",[573,1630,1631],{},"systemd"," 系统守护服务，在后台持续运行 ",[573,1634,1635],{},"synch watch"," 监听文件变化，以确保 VPS 上的笔记在系统开机时即可实现毫秒级自动同步：",[567,1638,1640],{"className":569,"code":1639,"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,1641,1642,1658,1663,1668,1673,1678,1682,1687,1692,1697,1702,1707,1712,1717,1722,1727,1731,1736,1741,1747,1758],{"__ignoreMap":424},[576,1643,1644,1646,1649,1652,1655],{"class":578,"line":579},[576,1645,1310],{"class":582},[576,1647,1648],{"class":586}," tee",[576,1650,1651],{"class":586}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service",[576,1653,1654],{"class":719}," \u003C\u003C",[576,1656,1657],{"class":719},"'EOF'\n",[576,1659,1660],{"class":578,"line":597},[576,1661,1662],{"class":586},"[Unit]\n",[576,1664,1665],{"class":578,"line":603},[576,1666,1667],{"class":586},"Description=Synch vault watcher\n",[576,1669,1670],{"class":578,"line":610},[576,1671,1672],{"class":586},"After=network-online.target\n",[576,1674,1675],{"class":578,"line":620},[576,1676,1677],{"class":586},"Wants=network-online.target\n",[576,1679,1680],{"class":578,"line":625},[576,1681,738],{"emptyLinePlaceholder":737},[576,1683,1684],{"class":578,"line":631},[576,1685,1686],{"class":586},"[Service]\n",[576,1688,1689],{"class":578,"line":772},[576,1690,1691],{"class":586},"Type=simple\n",[576,1693,1694],{"class":578,"line":1122},[576,1695,1696],{"class":586},"User=\u003Cusername>\n",[576,1698,1699],{"class":578,"line":1130},[576,1700,1701],{"class":586},"ExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\n",[576,1703,1704],{"class":578,"line":1138},[576,1705,1706],{"class":586},"WorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\n",[576,1708,1709],{"class":578,"line":1146},[576,1710,1711],{"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,1713,1714],{"class":578,"line":1154},[576,1715,1716],{"class":586},"Environment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\n",[576,1718,1719],{"class":578,"line":1162},[576,1720,1721],{"class":586},"Restart=always\n",[576,1723,1724],{"class":578,"line":1170},[576,1725,1726],{"class":586},"RestartSec=5\n",[576,1728,1729],{"class":578,"line":1181},[576,1730,738],{"emptyLinePlaceholder":737},[576,1732,1733],{"class":578,"line":1186},[576,1734,1735],{"class":586},"[Install]\n",[576,1737,1738],{"class":578,"line":1194},[576,1739,1740],{"class":586},"WantedBy=multi-user.target\n",[576,1742,1744],{"class":578,"line":1743},19,[576,1745,1746],{"class":719},"EOF\n",[576,1748,1750,1752,1755],{"class":578,"line":1749},20,[576,1751,1310],{"class":582},[576,1753,1754],{"class":586}," systemctl",[576,1756,1757],{"class":586}," daemon-reload\n",[576,1759,1761,1763,1765,1768,1771],{"class":578,"line":1760},21,[576,1762,1310],{"class":582},[576,1764,1754],{"class":586},[576,1766,1767],{"class":586}," enable",[576,1769,1770],{"class":586}," --now",[576,1772,1773],{"class":586}," synch-watch.service\n",[429,1775,1776,1777,1779],{},"现在，在浏览器中打开 ",[573,1778,1001],{},"，您会发现其用户界面和排版布局与桌面端原生 App 几乎完全一致：",[433,1781],{"src":1782,"alt":1783,"style":1784},"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,1786,1787],{},"点击左下角的设置图标可以发现，除了需要手动重新安装第三方社区插件外，几乎所有的 Obsidian 核心配置与功能均已完美保留：",[433,1789],{"src":1790,"alt":1791,"style":1792},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-settings-community-plugins.webp","Ignis 网页界面中的社区第三方插件设置","max-width: 597px; width: 100%; height: auto;",[429,1794,1795],{},"为了测试整个同步闭环，您可以通过 Ignis 网页端直接新建一篇笔记：",[433,1797],{"src":1798,"alt":1799,"style":1792},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-create-new-note-web.webp","通过 Ignis 网页界面新建一篇 Markdown 笔记",[429,1801,1802,1803,1805],{},"该笔记会立即被同步回您的 Obsidian 桌面客户端。需要注意的是，空白文件夹不会在 ",[462,1804,456],{}," 网页端中显示。",[433,1807],{"src":1808,"alt":1809,"style":1810},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-desktop-synced-note.webp","新创建的笔记已成功同步到本地 Obsidian 桌面客户端","max-width: 502px; width: 100%; height: auto;",[429,1812,1813,1814,1816],{},"在移动端手机浏览器上访问 ",[573,1815,1001],{}," 的实际效果：",[429,1818,1819,1824],{},[433,1820],{"src":1821,"alt":1822,"style":1823},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-sidebar.webp","在移动端手机浏览器上访问 Ignis 网页客户端的侧边栏菜单","max-width: 269px; width: 100%; height: auto;",[433,1825],{"src":1826,"alt":1827,"style":1823},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-editor.webp","在移动端手机浏览器上访问 Ignis 网页客户端的 Markdown 编辑器",[429,1829,1830,1831,1833,1834,1837],{},"当您在 ",[462,1832,456],{}," 网页端中删除笔记时，它们会被安全地移至本地知识库的 ",[573,1835,1836],{},"~\u002Fvaults\u002F\u003Cvault-name>\u002F.trash"," 垃圾桶文件夹中，以防误删。",[493,1839,1841],{"id":1840},"自建-obsidian-同步服务的一些结语","自建 Obsidian 同步服务的一些结语",[429,1843,1844,1845,1847,1848,1850,1851,1853],{},"通过将 ",[462,1846,447],{}," 与 ",[462,1849,456],{}," 结合，您可以使用完全处于自己掌控之下的 VPS 服务器硬件，无缝地实现 Obsidian 笔记库的多端同步与网页端访问。而将这些服务整体托管于 ",[462,1852,476],{}," 私有网络之中，又为您提供了极致的安全物理边界，从根本上阻断了公网暴露带来的安全隐患。",[429,1855,1856,1857,1859],{},"当然，",[462,1858,456],{}," 的初衷 spiritual 并客套不是为了完全替代本地的 Obsidian 桌面客户端。相反，它更像是一个极其便利的临时桥梁，供您在没有携带主力电脑时，能够随时随地通过任意浏览器快速存取和编辑自己的笔记。对于日常高强度的写作与重度笔记库管理，本地原生客户端仍然是更加舒适、高效的选择。",[429,1861,1862,1863,1866],{},"由于 Synch 采用了坚固的端到端加密机制，您的远程知识库密码必须具备足够强的复杂度以抵御暴力破解攻击。同时，请务必牢记该密码，因为同步服务端不会存储任何未加密的",[462,1864,1865],{},"知识库秘钥","。一旦遗忘该密码，您的全部笔记数据将彻底无法恢复。此外，由于所有数据均保存在您的自建 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":684},{"id":1038,"depth":610,"text":1039},{"id":1279,"depth":610,"text":1280},{"id":1371,"depth":610,"text":1372},{"id":1840,"depth":597,"text":1841},{"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\u002FZH-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 跨设备安全同步","zh\u002Farticle\u002Fsync-obsidian-across-devices",[1946,1947,1948,1949],"自建服务","Obsidian","云端同步","Zero Trust",null,"qUymzYxHVbtcLzhIfa6H_SfwK2NWnW9W0EcGJC30Pbc",{"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":1138,"navigation":737,"path":331,"seo":4138,"stem":4140,"tags":4141,"updatedAt":1950,"__hash__":4146},"article\u002Fzh\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 复制并粘贴 to 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-prerequisites","0. Prerequisites",[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\u002FZH-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,1094],{"class":719},[576,2189,2190],{"class":586},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[576,2192,1518],{"class":719},[576,2194,2195],{"class":586}," -H",[576,2197,1094],{"class":719},[576,2199,2200],{"class":586},"Authorization: Bearer YOUR_TOKEN_HERE",[576,2202,1100],{"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,1094],{"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,1518],{"class":719},[576,2303,2250],{"class":719},[576,2305,2253],{"class":582},[576,2307,1648],{"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,1310],{"class":582},[576,2331,2332],{"class":586}," apt",[576,2334,2335],{"class":586}," update\n",[576,2337,2338],{"class":578,"line":1122},[576,2339,738],{"emptyLinePlaceholder":737},[576,2341,2342],{"class":578,"line":1130},[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":1138},[576,2348,1310],{"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":1146},[576,2369,738],{"emptyLinePlaceholder":737},[576,2371,2372],{"class":578,"line":1154},[576,2373,2374],{"class":606},"# Start automatically when the system boots\n",[576,2376,2377,2379,2381,2383],{"class":578,"line":1162},[576,2378,1310],{"class":582},[576,2380,1754],{"class":586},[576,2382,1767],{"class":586},[576,2384,2385],{"class":586}," docker\n",[576,2387,2388],{"class":578,"line":1170},[576,2389,738],{"emptyLinePlaceholder":737},[576,2391,2392],{"class":578,"line":1181},[576,2393,2394],{"class":606},"# Verify docker is installed\n",[576,2396,2397,2399],{"class":578,"line":1186},[576,2398,787],{"class":582},[576,2400,1441],{"class":586},[576,2402,2403],{"class":578,"line":1194},[576,2404,738],{"emptyLinePlaceholder":737},[576,2406,2407,2409,2411,2413,2416],{"class":578,"line":1743},[576,2408,1310],{"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":1749},[576,2422,738],{"emptyLinePlaceholder":737},[576,2424,2425],{"class":578,"line":1760},[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,1398,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":1049,"code":2616,"language":1051,"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":1049,"code":2655,"language":1051,"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":1049,"code":2705,"language":1051,"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,1059],{"class":1058},[576,2713,1062],{"class":719},[576,2715,2716,2719],{"class":578,"line":597},[576,2717,2718],{"class":1058},"  relay",[576,2720,1062],{"class":719},[576,2722,2723,2725,2727,2731],{"class":578,"line":603},[576,2724,1084],{"class":1058},[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":1058},"  caddy",[576,2744,1062],{"class":719},[576,2746,2747,2750],{"class":578,"line":625},[576,2748,2749],{"class":1058},"    build",[576,2751,1062],{"class":719},[576,2753,2754,2757,2759],{"class":578,"line":631},[576,2755,2756],{"class":1058},"      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":1058},"      dockerfile",[576,2768,765],{"class":719},[576,2770,2771],{"class":586}," Dockerfile.caddy\n",[576,2773,2774,2776,2778],{"class":578,"line":1122},[576,2775,1074],{"class":1058},[576,2777,765],{"class":719},[576,2779,2780],{"class":586}," buzz-caddy:cloudflare\n",[576,2782,2783,2786],{"class":578,"line":1130},[576,2784,2785],{"class":1058},"    depends_on",[576,2787,1062],{"class":719},[576,2789,2790,2793],{"class":578,"line":1138},[576,2791,2792],{"class":1058},"      relay",[576,2794,1062],{"class":719},[576,2796,2797,2800,2802],{"class":578,"line":1146},[576,2798,2799],{"class":1058},"        condition",[576,2801,765],{"class":719},[576,2803,2804],{"class":586}," service_healthy\n",[576,2806,2807,2809],{"class":578,"line":1154},[576,2808,1105],{"class":1058},[576,2810,1062],{"class":719},[576,2812,2813,2816,2818],{"class":578,"line":1162},[576,2814,2815],{"class":1058},"      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":1170},[576,2824,2825],{"class":1058},"      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":1181},[576,2834,1084],{"class":1058},[576,2836,1062],{"class":719},[576,2838,2839,2841,2843,2846],{"class":578,"line":1186},[576,2840,1091],{"class":719},[576,2842,1094],{"class":719},[576,2844,2845],{"class":586},"${CADDY_HTTP_PORT:-80}:80",[576,2847,1100],{"class":719},[576,2849,2850,2852,2854,2857],{"class":578,"line":1194},[576,2851,1091],{"class":719},[576,2853,1094],{"class":719},[576,2855,2856],{"class":586},"${CADDY_HTTPS_PORT:-443}:443",[576,2858,1100],{"class":719},[576,2860,2861,2863],{"class":578,"line":1743},[576,2862,1141],{"class":1058},[576,2864,1062],{"class":719},[576,2866,2867,2869],{"class":578,"line":1749},[576,2868,1091],{"class":719},[576,2870,2871],{"class":586}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[576,2873,2874,2876],{"class":578,"line":1760},[576,2875,1091],{"class":719},[576,2877,2878],{"class":586}," buzz-caddy-data:\u002Fdata\n",[576,2880,2881,2883],{"class":578,"line":2430},[576,2882,1091],{"class":719},[576,2884,2885],{"class":586}," buzz-caddy-config:\u002Fconfig\n",[576,2887,2889,2891,2893],{"class":578,"line":2888},23,[576,2890,1173],{"class":1058},[576,2892,765],{"class":719},[576,2894,1178],{"class":586},[576,2896,2898,2901],{"class":578,"line":2897},24,[576,2899,2900],{"class":1058},"    networks",[576,2902,1062],{"class":719},[576,2904,2906,2908],{"class":578,"line":2905},25,[576,2907,1091],{"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,1189],{"class":1058},[576,2922,1062],{"class":719},[576,2924,2926,2929],{"class":578,"line":2925},28,[576,2927,2928],{"class":1058},"  buzz-caddy-data",[576,2930,1062],{"class":719},[576,2932,2934,2937],{"class":578,"line":2933},29,[576,2935,2936],{"class":1058},"    labels",[576,2938,1062],{"class":719},[576,2940,2942,2945,2947],{"class":578,"line":2941},30,[576,2943,2944],{"class":1058},"      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":1058},"  buzz-caddy-config",[576,2957,1062],{"class":719},[576,2959,2961,2963],{"class":578,"line":2960},32,[576,2962,2936],{"class":1058},[576,2964,1062],{"class":719},[576,2966,2968,2970,2972],{"class":578,"line":2967},33,[576,2969,2944],{"class":1058},[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,1253],{"class":586},[576,2993,2994],{"class":586}," compose.yml",[576,2996,1253],{"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,1310],{"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,1094],{"class":719},[576,3559,3560],{"class":586},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[576,3562,1100],{"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,1094],{"class":719},[576,3695,3696],{"class":586},"nsec1...",[576,3698,1518],{"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":1049,"code":3892,"language":1051,"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":1058},"  pair",[576,3901,1062],{"class":719},[576,3903,3904,3906,3908],{"class":578,"line":597},[576,3905,1074],{"class":1058},[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":1058},"    entrypoint",[576,3917,765],{"class":719},[576,3919,3920],{"class":719}," [",[576,3922,1518],{"class":719},[576,3924,3925],{"class":586},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[576,3927,1518],{"class":719},[576,3929,3930],{"class":719},"]\n",[576,3932,3933,3935],{"class":578,"line":610},[576,3934,1105],{"class":1058},[576,3936,1062],{"class":719},[576,3938,3939,3942,3944],{"class":578,"line":620},[576,3940,3941],{"class":1058},"      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,1084],{"class":1058},[576,3952,1062],{"class":719},[576,3954,3955,3957,3959,3962],{"class":578,"line":631},[576,3956,1091],{"class":719},[576,3958,1094],{"class":719},[576,3960,3961],{"class":586},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[576,3963,1100],{"class":719},[576,3965,3966,3968,3970],{"class":578,"line":772},[576,3967,1173],{"class":1058},[576,3969,765],{"class":719},[576,3971,1178],{"class":586},[576,3973,3974,3976],{"class":578,"line":1122},[576,3975,2900],{"class":1058},[576,3977,1062],{"class":719},[576,3979,3980,3983,3986],{"class":578,"line":1130},[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\u002FZH-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","一张高颜值的 16:9 科技质感卡片，具有深蓝色和橙色色调，插图展示如何在 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 协作中继服务器","zh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[4142,4143,1971,4144,4145],"Nostr","Docker","Caddy","Cloudflare","Plt5qPXpCpnSq9t6cSV6VM3z9k3i2BkoxxI46S98hdM",{"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":323,"seo":5023,"stem":5025,"tags":5026,"updatedAt":5022,"__hash__":5029},"article\u002Fzh\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,1847,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,1310],{"class":582},[576,4328,1754],{"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,1310],{"class":582},[576,4349,1754],{"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,1100],{"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,1310],{"class":582},[576,4447,4448],{"class":586}," ufw",[576,4450,1767],{"class":586},[576,4452,1334],{"class":593},[576,4454,4455,4457,4459,4462,4465,4468],{"class":578,"line":597},[576,4456,1310],{"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,1334],{"class":593},[576,4471,4472,4474,4476,4478,4481],{"class":578,"line":603},[576,4473,1310],{"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,1310],{"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,1310],{"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,1310],{"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,1310],{"class":582},[576,4553,4448],{"class":586},[576,4555,4556],{"class":586}," reload",[576,4558,1334],{"class":593},[576,4560,4561,4563,4565,4567],{"class":578,"line":597},[576,4562,1310],{"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":1058},"dashboard",[576,4639,1062],{"class":719},[576,4641,4642,4645,4647],{"class":578,"line":597},[576,4643,4644],{"class":1058},"  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":1058},"  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":1058},"  oauth",[576,4667,1062],{"class":719},[576,4669,4670,4673,4675],{"class":578,"line":620},[576,4671,4672],{"class":1058},"    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":1058},"    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":1058},"  basic_auth",[576,4694,1062],{"class":719},[576,4696,4697,4700,4702],{"class":578,"line":772},[576,4698,4699],{"class":1058},"    username",[576,4701,765],{"class":719},[576,4703,4704],{"class":719}," ''\n",[576,4706,4707,4710,4712],{"class":578,"line":1122},[576,4708,4709],{"class":1058},"    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,1310],{"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,1662],{},[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,1686],{},[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":1122},[576,4796,1721],{},[576,4798,4799],{"class":578,"line":1130},[576,4800,4801],{},"RestartSec=10\n",[576,4803,4804],{"class":578,"line":1138},[576,4805,4806],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[576,4808,4809],{"class":578,"line":1146},[576,4810,738],{"emptyLinePlaceholder":737},[576,4812,4813],{"class":578,"line":1154},[576,4814,1735],{},[576,4816,4817],{"class":578,"line":1162},[576,4818,1740],{},[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,1310],{"class":582},[576,4834,1754],{"class":586},[576,4836,1757],{"class":586},[576,4838,4839,4841,4843,4845],{"class":578,"line":597},[576,4840,1310],{"class":582},[576,4842,1754],{"class":586},[576,4844,1767],{"class":586},[576,4846,4847],{"class":586}," hermes-dashboard\n",[576,4849,4850,4852,4854,4857],{"class":578,"line":603},[576,4851,1310],{"class":582},[576,4853,1754],{"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,1310],{"class":582},[576,4864,1754],{"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 的安全访问","zh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[4160,1949,4156,5027,5028],"私有网络","教程","ishCX4pAaZiNmcl6lotlFfav2RLbIjIFUuYwHpzosd4",[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\u002Fzh\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）。上周已经确认的决策在开启新对话后便被遗忘，这迫使我们不得不一遍又一遍地输入相同的技术栈细节，并在每个新会话中重新设置用户偏好。",[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%E4%B8%AA%E6%94%AF%E6%8C%81%E6%A8%A1%E5%9E%8B%E4%B8%8A%E4%B8%8B%E6%96%87%E5%8D%8F%E8%AE%AE%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' 环境变量旁的编辑图标，以创建一条高强度的访问令牌：\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,1518],{"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,1518],{"class":719},[576,5290,765],{"class":719},[576,5292,1094],{"class":719},[576,5294,5295],{"class":586},"npx",[576,5297,1518],{"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,1518],{"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,1518],{"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,1518],{"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,1518],{"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,1100],{"class":719},[576,5359,5360],{"class":578,"line":772},[576,5361,5362],{"class":719},"      ]\n",[576,5364,5365],{"class":578,"line":1122},[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,1518],{"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,1518],{"class":719},[576,5490,765],{"class":719},[576,5492,1094],{"class":719},[576,5494,5333],{"class":586},[576,5496,1518],{"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,1518],{"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,1518],{"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 生态的最大痛点之一 —— 长期上下文遗忘与记忆断层，提供了一套极为优雅的开源解决方案。通过将自托管项目与 CloudflareWorkers 弹性、全球分布的 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之间实现多Agent上下文共享。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002FZH-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},"zh\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[4145,5853,5854,5061,1947],"MCP","AI 记忆","GcIodpT98ONAwkuIbWbfMhCB1u7m4jUIxYtKqcXxO9c",{"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\u002Fzh\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":1122},[576,5967,5968],{},"      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n",[576,5970,5971],{"class":578,"line":1130},[576,5972,5973],{},"      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[576,5975,5976],{"class":578,"line":1138},[576,5977,5978],{},"      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[576,5980,5981],{"class":578,"line":1146},[576,5982,5983],{},"      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[576,5985,5986],{"class":578,"line":1154},[576,5987,5988],{},"      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n",[576,5990,5991],{"class":578,"line":1162},[576,5992,5993],{},"      \u003Ckey>PayloadType\u003C\u002Fkey>\n",[576,5995,5996],{"class":578,"line":1170},[576,5997,5998],{},"      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n",[576,6000,6001],{"class":578,"line":1181},[576,6002,6003],{},"      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[576,6005,6006],{"class":578,"line":1186},[576,6007,6008],{},"      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[576,6010,6011],{"class":578,"line":1194},[576,6012,6013],{},"      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[576,6015,6016],{"class":578,"line":1743},[576,6017,6018],{},"      \u003Cinteger>1\u003C\u002Finteger>\n",[576,6020,6021],{"class":578,"line":1749},[576,6022,6023],{},"      \u003Ckey>configs\u003C\u002Fkey>\n",[576,6025,6026],{"class":578,"line":1760},[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\u002FZH-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},"zh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",[6386,4160,6387,1949],"macOS","MDM","PqQ8V7tDnvy35zbYhRFeP2qlFyG5TcvpZCHoKbf9GqU",1792490011665]