[{"data":1,"prerenderedAt":4620},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac":421,"\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac-surround":1017},[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":994,"date":997,"description":998,"extension":999,"image":1000,"imageAlt":1001,"isPublished":1002,"meta":1003,"minRead":512,"navigation":1002,"path":337,"seo":1009,"stem":1010,"tags":1011,"updatedAt":1015,"__hash__":1016},"article\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac.md","使用MDM配置文件在macOS上无缝切换与配置多个Cloudflare WARP零信任组织的完整指南","",{"type":426,"value":427,"toc":987},"minimark",[428,433,437,445,449,452,455,458,462,465,473,494,824,944,947,950,953,983],[429,430,432],"h2",{"id":431},"什么是-cloudflare-warp","什么是 Cloudflare WARP？",[434,435,436],"p",{},"Cloudflare WARP 是一款客户端应用程序，它将指定设备的数据流量通过 Cloudflare 的全球网络进行路由，而不是直接发送到公共互联网。",[434,438,439,440,444],{},"它基于 ",[441,442,443],"strong",{},"WireGuard"," 协议建立一条加密隧道，从而保护从设备到最近的 Cloudflare 数据中心之间的流量安全。随后，您可以在 Cloudflare 控制面板中创建策略，对这些流入的流量进行过滤、记录、检查或路由。",[429,446,448],{"id":447},"为什么我们需要-cloudflare-warp","为什么我们需要 Cloudflare WARP？",[434,450,451],{},"为了向员工、承包商和其他利益相关者安全地公开内部资源（如私有 Web 服务或 SaaS 应用程序），Cloudflare WARP 客户端被用作**零信任网络访问 (ZTNA)**的客户端强制执行点。",[434,453,454],{},"Cloudflare WARP 客户端安装在用户的笔记本电脑或手机上。它要求用户在授予访问权限之前进行身份验证，并满足特定的安全状态检查（例如来自经过批准的 IP 范围、使用已注册的邮箱域名或运行处于活动状态的防火墙）。",[434,456,457],{},"通过将设备流量直接隧道化传输到 Cloudflare，用户的身份、设备和策略将在请求到达内部资源之前得到验证。因此，内部资源永远不会暴露在公共互联网上，每一次请求都将得到完整的记录和审计。",[429,459,461],{"id":460},"在单台设备上支持多个-warp-配置文件","在单台设备上支持多个 WARP 配置文件",[434,463,464],{},"当用户需要在个人和企业 Cloudflare 账户之间进行切换，或者当系统管理员需要管理多个租户（tenant）时，在单台设备上支持多个 WARP 配置文件就显得至关重要。",[434,466,467,468,472],{},"要在 macOS 上实现这一目标，我们可以使用 ",[469,470,471],"code",{},".mobileconfig"," MDM 配置文件来定义和注册不同的 WARP 环境。",[474,475,476,491],"ul",{},[477,478,479,480,490],"li",{},"直接从 Cloudflare ",[481,482,486,487,489],"a",{"href":483,"rel":484},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fstatic\u002Fmdm\u002Fmultiple-orgs\u002FCloudflareWARP.mobileconfig",[485],"nofollow","下载 ",[469,488,471],{}," 示例文件","。",[477,492,493],{},"以下是该配置文件的示例文本：",[495,496,500],"pre",{"className":497,"code":498,"language":499,"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",[469,501,502,510,516,522,528,534,540,546,552,558,564,570,576,582,588,594,600,606,612,618,624,630,636,642,648,654,660,666,671,676,682,687,693,698,704,710,716,722,728,734,740,746,752,758,764,770,776,782,788,794,800,806,812,818],{"__ignoreMap":424},[503,504,507],"span",{"class":505,"line":506},"line",1,[503,508,509],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[503,511,513],{"class":505,"line":512},2,[503,514,515],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[503,517,519],{"class":505,"line":518},3,[503,520,521],{},"\u003Cplist version=\"1.0\">\n",[503,523,525],{"class":505,"line":524},4,[503,526,527],{},"\u003Cdict>\n",[503,529,531],{"class":505,"line":530},5,[503,532,533],{},"  \u003Ckey>PayloadContent\u003C\u002Fkey>\n",[503,535,537],{"class":505,"line":536},6,[503,538,539],{},"  \u003Carray>\n",[503,541,543],{"class":505,"line":542},7,[503,544,545],{},"    \u003Cdict>\n",[503,547,549],{"class":505,"line":548},8,[503,550,551],{},"      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[503,553,555],{"class":505,"line":554},9,[503,556,557],{},"      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n",[503,559,561],{"class":505,"line":560},10,[503,562,563],{},"      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[503,565,567],{"class":505,"line":566},11,[503,568,569],{},"      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[503,571,573],{"class":505,"line":572},12,[503,574,575],{},"      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[503,577,579],{"class":505,"line":578},13,[503,580,581],{},"      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n",[503,583,585],{"class":505,"line":584},14,[503,586,587],{},"      \u003Ckey>PayloadType\u003C\u002Fkey>\n",[503,589,591],{"class":505,"line":590},15,[503,592,593],{},"      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n",[503,595,597],{"class":505,"line":596},16,[503,598,599],{},"      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[503,601,603],{"class":505,"line":602},17,[503,604,605],{},"      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[503,607,609],{"class":505,"line":608},18,[503,610,611],{},"      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[503,613,615],{"class":505,"line":614},19,[503,616,617],{},"      \u003Cinteger>1\u003C\u002Finteger>\n",[503,619,621],{"class":505,"line":620},20,[503,622,623],{},"      \u003Ckey>configs\u003C\u002Fkey>\n",[503,625,627],{"class":505,"line":626},21,[503,628,629],{},"      \u003Carray>\n",[503,631,633],{"class":505,"line":632},22,[503,634,635],{},"        \u003Cdict>\n",[503,637,639],{"class":505,"line":638},23,[503,640,641],{},"          \u003Ckey>organization\u003C\u002Fkey>\n",[503,643,645],{"class":505,"line":644},24,[503,646,647],{},"          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n",[503,649,651],{"class":505,"line":650},25,[503,652,653],{},"          \u003Ckey>display_name\u003C\u002Fkey>\n",[503,655,657],{"class":505,"line":656},26,[503,658,659],{},"          \u003Cstring>Team 1\u003C\u002Fstring>\n",[503,661,663],{"class":505,"line":662},27,[503,664,665],{},"        \u003C\u002Fdict>\n",[503,667,669],{"class":505,"line":668},28,[503,670,635],{},[503,672,674],{"class":505,"line":673},29,[503,675,641],{},[503,677,679],{"class":505,"line":678},30,[503,680,681],{},"          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n",[503,683,685],{"class":505,"line":684},31,[503,686,653],{},[503,688,690],{"class":505,"line":689},32,[503,691,692],{},"          \u003Cstring>Team 2\u003C\u002Fstring>\n",[503,694,696],{"class":505,"line":695},33,[503,697,665],{},[503,699,701],{"class":505,"line":700},34,[503,702,703],{},"      \u003C\u002Farray>\n",[503,705,707],{"class":505,"line":706},35,[503,708,709],{},"    \u003C\u002Fdict>\n",[503,711,713],{"class":505,"line":712},36,[503,714,715],{},"  \u003C\u002Farray>\n",[503,717,719],{"class":505,"line":718},37,[503,720,721],{},"  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[503,723,725],{"class":505,"line":724},38,[503,726,727],{},"  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n",[503,729,731],{"class":505,"line":730},39,[503,732,733],{},"  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[503,735,737],{"class":505,"line":736},40,[503,738,739],{},"  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n",[503,741,743],{"class":505,"line":742},41,[503,744,745],{},"  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[503,747,749],{"class":505,"line":748},42,[503,750,751],{},"  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n",[503,753,755],{"class":505,"line":754},43,[503,756,757],{},"  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n",[503,759,761],{"class":505,"line":760},44,[503,762,763],{},"  \u003Cfalse\u002F>\n",[503,765,767],{"class":505,"line":766},45,[503,768,769],{},"  \u003Ckey>PayloadScope\u003C\u002Fkey>\n",[503,771,773],{"class":505,"line":772},46,[503,774,775],{},"  \u003Cstring>System\u003C\u002Fstring>\n",[503,777,779],{"class":505,"line":778},47,[503,780,781],{},"  \u003Ckey>PayloadType\u003C\u002Fkey>\n",[503,783,785],{"class":505,"line":784},48,[503,786,787],{},"  \u003Cstring>Configuration\u003C\u002Fstring>\n",[503,789,791],{"class":505,"line":790},49,[503,792,793],{},"  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[503,795,797],{"class":505,"line":796},50,[503,798,799],{},"  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n",[503,801,803],{"class":505,"line":802},51,[503,804,805],{},"  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[503,807,809],{"class":505,"line":808},52,[503,810,811],{},"  \u003Cinteger>1\u003C\u002Finteger>\n",[503,813,815],{"class":505,"line":814},53,[503,816,817],{},"\u003C\u002Fdict>\n",[503,819,821],{"class":505,"line":820},54,[503,822,823],{},"\u003C\u002Fplist>\n",[474,825,826,837,851,861,867,886,899,918,935],{},[477,827,828,829,832,833,836],{},"将 ",[469,830,831],{},"your-team-name-1"," 和 ",[469,834,835],{},"your-team-name-2"," 替换为您各自的 Cloudflare Zero Trust 团队名称。",[477,838,839,840,843,844,846,847,850],{},"在终端中运行命令 ",[469,841,842],{},"uuidgen"," 生成唯一的 UUID，并使用它们替换 ",[469,845,471],{}," 文件中的占位符 ",[469,848,849],{},"PayloadUUID"," 值。",[477,852,853,854,857,858,860],{},"确保 ",[469,855,856],{},"PayloadIdentifier"," 字符串中也包含更新后的 ",[469,859,849],{},"，以保证配置文件的唯一性。",[477,862,863,864,866],{},"保存编辑后的 ",[469,865,471],{}," 文件。",[477,868,869,870,873,874,877,878,881],{},"打开 Mac 上的",[441,871,872],{},"系统设置","，搜索并选择",[441,875,876],{},"描述文件","（Profiles）。",[879,880],"br",{},[882,883],"img",{"alt":884,"src":885},"macOS 系统设置中的描述档面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-system-settings-profiles.webp",[477,887,888,889,892,893,895],{},"点击",[441,890,891],{},"安装、查看或移除...","（Install, view or remove...）开始添加您的新配置文件。",[879,894],{},[882,896],{"alt":897,"src":898},"macOS 描述档安装、查看或移除按钮","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-view-remove.webp",[477,900,901,902,905,906,866,908,910,914],{},"点击左下角的 ",[441,903,904],{},"+","（加号）图标，并选择您保存的 ",[469,907,471],{},[879,909],{},[882,911],{"alt":912,"src":913},"macOS 描述档左下角新增（+）按钮","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-add-profile.webp",[882,915],{"alt":916,"src":917},"在 macOS 上选择 .mobileconfig 配置文件","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-select-mobileconfig-file.webp",[477,919,920,921,924,925,928,929,931],{},"选择 ",[441,922,923],{},"Cloudflare WARP"," 并点击",[441,926,927],{},"安装","以应用此配置。",[879,930],{},[882,932],{"alt":933,"src":934},"在 macOS 上确认安装 Cloudflare WARP 描述档","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-install-cloudflare-warp-profile.webp",[477,936,937,938,940],{},"重新启动您的 Cloudflare WARP 客户端。您现在应该可以在用户界面中看到多组织切换器：",[879,939],{},[882,941],{"alt":942,"src":943},"macOS 上支持多组织切换的 Cloudflare WARP 客户端界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fcloudflare-warp-multi-profile-switcher.webp",[429,945,946],{"id":946},"结论",[434,948,949],{},"Cloudflare WARP 客户端在用户设备上扮演着关键的安全边界角色，使零信任网络访问（ZTNA）既稳固又极具实用性。通过将内部资源与公共互联网隔离开来，可确保每一次连接尝试都经过安全的身份验证、评估与审计。",[429,951,952],{"id":952},"参考资料",[474,954,955,962,969,976],{},[477,956,957],{},[481,958,961],{"href":959,"rel":960},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002F#prepare-file-for-mdm-deployment",[485],"Managed Deployment Preparation",[477,963,964],{},[481,965,968],{"href":966,"rel":967},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002Fswitch-organizations\u002F",[485],"Switch Between Zero Trust Organizations",[477,970,971],{},[481,972,975],{"href":973,"rel":974},"https:\u002F\u002Fblog.cloudflare.com\u002Fintroducing-warp-connector-paving-the-path-to-any-to-any-connectivity-2\u002F",[485],"Introducing WARP Connector: Paving the Path to Any-to-Any Connectivity",[477,977,978],{},[481,979,982],{"href":980,"rel":981},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002F",[485],"Cloudflare One Client Documentation",[984,985,986],"style",{},"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":512,"depth":518,"links":988},[989,990,991,992,993],{"id":431,"depth":512,"text":432},{"id":447,"depth":512,"text":448},{"id":460,"depth":512,"text":461},{"id":946,"depth":512,"text":946},{"id":952,"depth":512,"text":952},[995,996],"security","cloudflare","2026-07-04","本指南将详细介绍如何在macOS系统上，通过使用MDM .mobileconfig配置文件，实现多个Cloudflare WARP零信任组织或账户之间的无缝切换。本文为企业IT系统管理员提供了一套完整的、可直接落地部署的操作指南与配置步骤模板，帮助企业轻松管理并确保终端用户的网络安全与合规审计要求。","md","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组织账户",true,{"schemaOrg":1004,"robots":1007,"sitemap":1008},[1005],{"@type":1006,"headline":423,"description":998},"HowTo","index, follow",{"lastmod":997},{"title":1001,"description":998,"ogTitle":423,"ogDescription":998,"twitterTitle":423,"twitterDescription":998},"zh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",[1012,923,1013,1014],"macOS","MDM","Zero Trust",null,"PqQ8V7tDnvy35zbYhRFeP2qlFyG5TcvpZCHoKbf9GqU",{"surround":1018,"related":2270},[1019,1428],{"id":1020,"title":1021,"author":424,"body":1022,"category":1410,"date":1412,"description":1413,"extension":999,"image":1414,"imageAlt":1415,"isPublished":1002,"meta":1416,"minRead":512,"navigation":1002,"path":317,"seo":1420,"stem":1421,"tags":1422,"updatedAt":1015,"__hash__":1427},"article\u002Fzh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them.md","什么是AI Agent技能？深入探讨其工作原理并手把手教你如何构建高效、可复用的Agent技能",{"type":426,"value":1023,"toc":1400},[1024,1028,1039,1050,1119,1124,1128,1131,1140,1146,1150,1207,1218,1224,1227,1283,1287,1290,1297,1300,1311,1315,1360,1363,1380,1383,1394,1397],[429,1025,1027],{"id":1026},"什么是-ai-agent-技能","什么是 AI Agent 技能？",[434,1029,1030,1031,1034,1035,1038],{},"智能体技能（agent skill）是一种可复用的",[441,1032,1033],{},"指令集"," —— 它是一个标准化的流程，旨在指导 Agent 如何卓越地完成某一特定类型的任务。一个技能通常由单个 Markdown 文件 ",[469,1036,1037],{},"SKILL.md"," 构成，并且可以打包该任务所需的任何其他文件，例如参考文档、模板或可执行脚本。",[434,1040,1041,1042,1049],{},"以 ",[481,1043,1046],{"href":1044,"rel":1045},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002F733d312884b3878a9a9cff693c5886943753a741\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[485],[469,1047,1048],{},"grill-me"," 技能为例：",[495,1051,1055],{"className":1052,"code":1053,"language":1054,"meta":424,"style":424},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\nname: grill-me\ndescription: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n---\n\nInterview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n\nAsk the questions one at a time.\n\nIf a question can be answered by exploring the codebase, explore the codebase instead.\n","yaml",[469,1056,1057,1063,1077,1087,1091,1096,1101,1105,1110,1114],{"__ignoreMap":424},[503,1058,1059],{"class":505,"line":506},[503,1060,1062],{"class":1061},"sBMFI","---\n",[503,1064,1065,1069,1073],{"class":505,"line":512},[503,1066,1068],{"class":1067},"swJcz","name",[503,1070,1072],{"class":1071},"sMK4o",":",[503,1074,1076],{"class":1075},"sfazB"," grill-me\n",[503,1078,1079,1082,1084],{"class":505,"line":518},[503,1080,1081],{"class":1067},"description",[503,1083,1072],{"class":1071},[503,1085,1086],{"class":1075}," Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n",[503,1088,1089],{"class":505,"line":524},[503,1090,1062],{"class":1061},[503,1092,1093],{"class":505,"line":530},[503,1094,1095],{"emptyLinePlaceholder":1002},"\n",[503,1097,1098],{"class":505,"line":536},[503,1099,1100],{"class":1075},"Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n",[503,1102,1103],{"class":505,"line":542},[503,1104,1095],{"emptyLinePlaceholder":1002},[503,1106,1107],{"class":505,"line":548},[503,1108,1109],{"class":1075},"Ask the questions one at a time.\n",[503,1111,1112],{"class":505,"line":554},[503,1113,1095],{"emptyLinePlaceholder":1002},[503,1115,1116],{"class":505,"line":560},[503,1117,1118],{"class":1075},"If a question can be answered by exploring the codebase, explore the codebase instead.\n",[434,1120,1121,1123],{},[469,1122,1037],{}," 文件包含一小块元数据（metadata）和指令的正文。元数据由技能的名称（name）和描述（description）组成，AI Agent 会在启动时将其加载。",[429,1125,1127],{"id":1126},"ai-agent-技能的工作原理渐进式披露progressive-disclosure","AI Agent 技能的工作原理：渐进式披露（Progressive Disclosure）",[434,1129,1130],{},"在初始阶段，只有技能的名称 and 描述会被加载到上下文（Context）中。当用户的请求与技能的描述相匹配时，该技能的完整指令正文才会被加载到相同的上下文中。",[434,1132,1133,1134,1139],{},"让我们来看看在实际使用中，",[481,1135,1137],{"href":1044,"rel":1136},[485],[469,1138,1048],{}," 技能是如何工作的。",[434,1141,1142],{},[882,1143],{"alt":1144,"src":1145},"展示 AI 智能体技能执行中渐进式揭示（Progressive Disclosure）机制的时序图","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002Fai-agent-skill-progressive-disclosure-sequence-diagram.webp",[1147,1148,1149],"h3",{"id":1149},"逐步流程",[1151,1152,1153,1159,1165,1171,1177,1191,1201],"ol",{},[477,1154,1155,1158],{},[441,1156,1157],{},"请求（Request）"," —— 用户向 Agent 提出需求（例如：“对我的工作流设计进行压力测试剖析”）。",[477,1160,1161,1164],{},[441,1162,1163],{},"选择提示词（Selection prompt）"," —— 用户的请求与所有可用技能的描述一起发送给 LLM。",[477,1166,1167,1170],{},[441,1168,1169],{},"LLM 做出选择"," —— LLM 将请求与每个描述进行对比，并返回匹配的技能。",[477,1172,1173,1176],{},[441,1174,1175],{},"确认（Confirmation）"," —— Agent 将推荐的技能呈现给用户，由用户进行确认（或拒绝\u002F调整）该选择。",[477,1178,1179,1182,1183,1187,1188,1190],{},[441,1180,1181],{},"加载指令"," —— Agent 获取已确认技能的",[1184,1185,1186],"em",{},"完整","指令：即 ",[469,1189,1037],{}," 的正文内容。",[477,1192,1193,1196,1197,1200],{},[441,1194,1195],{},"执行提示词（Execution prompt）"," —— 用户的请求",[441,1198,1199],{},"加上所选技能的具体指令","一起发送给 LLM。",[477,1202,1203,1206],{},[441,1204,1205],{},"响应（Response）"," —— LLM 生成输出，即压力测试面谈中的第一个剖析问题。",[434,1208,1209,1210,1217],{},"现在，我们使用 ",[481,1211,1214],{"href":1212,"rel":1213},"https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[485],[469,1215,1216],{},"excalidraw-diagram-skill"," 来演示带参考文档的技能是如何工作的：",[434,1219,1220],{},[882,1221],{"alt":1222,"src":1223},"展示 AI 智能体执行载有外部参考文件与模板的技能时序图","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002Fai-agent-skill-with-reference-files-sequence-diagram.webp",[1147,1225,1149],{"id":1226},"逐步流程-1",[1151,1228,1229,1234,1239,1248,1253,1265,1273],{},[477,1230,1231,1233],{},[441,1232,1157],{}," —— 用户向 Agent 提出需求（“绘制部署流程的工作流图”）。",[477,1235,1236,1164],{},[441,1237,1238],{},"选择提示词",[477,1240,1241,1243,1244,1247],{},[441,1242,1169],{}," —— LLM 将请求与每个描述进行对比，并返回匹配的技能。在这里，“绘制工作流图”与 ",[469,1245,1246],{},"excalidraw-diagram"," 的描述匹配，因此该技能被选中。",[477,1249,1250,1176],{},[441,1251,1252],{},"确认",[477,1254,1255,1182,1257,1187,1259,1261,1262,1264],{},[441,1256,1181],{},[1184,1258,1186],{},[469,1260,1037],{}," 的正文内容以及任何引用的参考文件（对于 ",[469,1263,1246],{},"，这包括调色板、JSON Schema 和图表元素模板）。",[477,1266,1267,1196,1270,1272],{},[441,1268,1269],{},"执行提示词",[441,1271,1199],{},"一起发送给 LLM。模型现在拥有了它所需的详细方法论。",[477,1274,1275,1278,1279,1282],{},[441,1276,1277],{},"响应"," —— LLM 生成输出（一个 ",[469,1280,1281],{},".excalidraw"," 的 JSON 文件），由 Agent 将其返回给用户。",[429,1284,1286],{"id":1285},"ai-agent-技能-vs-工具与-mcp","AI Agent 技能 vs. 工具与 MCP",[434,1288,1289],{},"技能并不能替代提示词、普通工具（Tools） or MCP。工具和 MCP 集成扩展了 Agent 对外部系统的访问范围 —— 例如查询数据库、调用 API 等等。而技能则加深了 Agent 完成特定任务的实战诀窍（Know-how）和专业深度。",[434,1291,1292,1293,1296],{},"诸如 ",[481,1294,1295],{"href":395},"在ChatGPT和Claude中配置NetSuite MCP"," 的 MCP 集成，能够让 Agent 通过访问 NetSuite 中的实时财务和运营数据来回答用户问题。而 NetSuite 业务报告技能则会进一步引导 Agent 如何去撰写这份报告，并以规范的报表形式呈现给用户。",[434,1298,1299],{},"使用技能的典型场景包括：",[474,1301,1302,1305,1308],{},[477,1303,1304],{},"多步骤复杂工作流",[477,1306,1307],{},"文档处理，例如从 PDF 中提取特定数据结构",[477,1309,1310],{},"代码生成规范与标准",[429,1312,1314],{"id":1313},"如何创建-ai-agent-技能","如何创建 AI Agent 技能",[1151,1316,1317,1327,1341,1350],{},[477,1318,1319,1322,1323,1326],{},[441,1320,1321],{},"创建一个文件夹","，并以技能名称命名（例如 ",[469,1324,1325],{},"netsuite-operation-report\u002F","）。",[477,1328,1329,1334,1335,1337,1338,1340],{},[441,1330,1331,1332],{},"编写 ",[469,1333,1037],{},"，包含 ",[469,1336,1068],{},"、精准的 ",[469,1339,1081],{},"，以及精炼的指令正文（控制在 200 字以内）。",[477,1342,1343,1346,1347,1349],{},[441,1344,1345],{},"添加任务所需资源"," —— 包括参考文档、模板、脚本。保持 ",[469,1348,1037],{}," 短小精悍，并将细节链接至其他文件。",[477,1351,1352,1355,1356,1359],{},[441,1353,1354],{},"进行安装","，让 Agent 能够发现它。参考 ",[481,1357,1358],{"href":359},"解决AI智能体技能碎片化：集中化管理技能"," 以了解如何在多个 Agent 之间集中管理技能。",[434,1361,1362],{},"编写优秀技能的几个技巧：",[474,1364,1365,1368,1374,1377],{},[477,1366,1367],{},"技能描述（description）应当面向系统触发器（Trigger）来写，而不是给人类阅读。",[477,1369,1370,1371,1373],{},"保持 ",[469,1372,1037],{}," 极其精简 —— 限制在 200 字以内。在正文中写下通用流程，将边缘情况和细节留给参考文档。",[477,1375,1376],{},"凡是确定性的任务，应当使用脚本（Script）来处理。不要让 LLM 去做算术。",[477,1378,1379],{},"做好版本控制，将其提交进 Git 中。",[429,1381,1382],{"id":1382},"总结",[434,1384,1385,1386,1389,1390,1393],{},"与定义“",[1184,1387,1388],{},"连接到什么","”的工具和 MCP 不同，智能体技能封装了“",[1184,1391,1392],{},"如何去完成工作","”。它们是不可或缺的互补，而非替代关系。",[434,1395,1396],{},"通过利用渐进式披露（Progressive Disclosure），技能可以使 Agent 的上下文窗口保持整洁和高效 —— 仅在用户请求触发时，才会加载详细的指令、参考文档和可执行脚本。",[984,1398,1399],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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);}",{"title":424,"searchDepth":512,"depth":518,"links":1401},[1402,1403,1407,1408,1409],{"id":1026,"depth":512,"text":1027},{"id":1126,"depth":512,"text":1127,"children":1404},[1405,1406],{"id":1149,"depth":518,"text":1149},{"id":1226,"depth":518,"text":1149},{"id":1285,"depth":512,"text":1286},{"id":1313,"depth":512,"text":1314},{"id":1382,"depth":512,"text":1382},[1411],"ai-agents","2026-06-26","全面系统地深入了解什么是AI Agent技能、渐进式披露（Progressive Disclosure）的工作原理，并手把手教你如何编写SKILL.md规范，打包参考文档、模板和脚本。本文还将对比技能、工具与MCP的区别与标准工作流，助你轻松构建出可复用、高效率、能够进行复杂上下文管理的自定义智能体核心技能。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002FZH-AI-Agent-Skills-What-They-Are-%26-How-to-Create-Them.webp","AI Agent技能开发指南：构建可复用、高效率的智能体工作流",{"schemaOrg":1417,"robots":1007,"sitemap":1419},[1418],{"@type":1006,"headline":1021,"description":1413},{"lastmod":1412},{"title":1415,"description":1413,"ogTitle":1021,"ogDescription":1413,"twitterTitle":1021,"twitterDescription":1413},"zh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",[1423,1424,1425,1426],"AI 智能体","智能体技能","可重复使用的工作流程","AI 教程","_atZh5i-Jgvruah38ZkG41QGU4DTktOc6AYeZmiwxKo",{"id":1429,"title":1430,"author":1015,"body":1431,"category":2251,"date":2252,"description":2253,"extension":999,"image":2254,"imageAlt":2255,"isPublished":1002,"meta":2256,"minRead":706,"navigation":1002,"path":345,"seo":2262,"stem":2263,"tags":2264,"updatedAt":1015,"__hash__":2269},"article\u002Fzh\u002Farticle\u002Fuse-cloudflare-as-ai-memory.md","基于Cloudflare Workers与MCP协议构建个人专属的AI持久化记忆系统，解决Context空白痛点",{"type":426,"value":1432,"toc":2233},[1433,1437,1440,1443,1447,1450,1465,1469,1476,1490,1493,1496,1540,1544,1626,1630,1656,1773,1784,1788,1793,1838,1863,1867,1872,1945,1950,1954,1987,1995,2034,2037,2069,2073,2081,2086,2127,2131,2181,2184,2187,2190,2193,2196,2230],[429,1434,1436],{"id":1435},"持久化ai记忆对智能体agent的重要性","持久化AI记忆对智能体（Agent）的重要性",[434,1438,1439],{},"随着AI助手逐渐融入我们的日常生活与工作，我们经常会遇到“空白上下文”的问题（Blank Context Issue）。上周已经确认的决策在开启新对话后便被遗忘，这迫使我们不得不一遍又一遍地输入相同的技术栈细节，并在每个新会话中重新设置用户偏好。",[434,1441,1442],{},"与其每次都从零开始，我们需要构建一个能够持续演进、深入理解用户决策的记忆系统，从而彻底消除重复输入上下文的烦恼。",[429,1444,1446],{"id":1445},"自托管-ai-记忆系统-vs-内置-ai-记忆功能","自托管 AI 记忆系统 vs. 内置 AI 记忆功能",[434,1448,1449],{},"虽然许多AI智能体或客户端（如 ChatGPT、Claude 等）自带了内置记忆功能，但我们很少在所有场景下只使用单一智能体。我们可能会用 Claude 来设计和规划项目架构，用 Kimi 来编写代码，用 ChatGPT 进行深度的背景研究。然而，这些不同的智能体之间无法直接共享上下文，所有记忆依然被孤立在各自的生态黑盒中。",[434,1451,1452,1453,1458,1459,1464],{},"从软件工程的角度来看，我们并不信任无法控制的黑盒。我们需要的是一个可观察、可审计且完全处于自己掌控之下的 AI 记忆系统。开源项目 ",[481,1454,1457],{"href":1455,"rel":1456},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[485],"Second Brain","（Fork 自 ",[481,1460,1463],{"href":1461,"rel":1462},"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",[485],"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare）提供了一个支持模型上下文协议（Model"," Context Protocol，简称 MCP）的持久化自托管 AI 记忆系统。任何兼容 MCP 协议的 AI 智能体（如 Claude、ChatGPT、Kimi Code 等）都可以完美共享相同的上下文记忆库。",[429,1466,1468],{"id":1467},"如何在-cloudflare-上构建-second-brain-ai-记忆系统","如何在 Cloudflare 上构建 Second Brain AI 记忆系统",[434,1470,1471,1472,1475],{},"Second Brain 记忆系统部署在 ",[441,1473,1474],{},"Cloudflare Workers"," 之上，其提供了全球分布式、极低延迟的 Serverless 运行基础设施。这使得在 AI 的推理和决策循环中，检索记忆（Recall）及写入等操作能够以近乎零延迟的体验执行。",[434,1477,1478,1479,1482,1483,1486,1487,1489],{},"系统使用 ",[441,1480,1481],{},"Workers AI"," 的嵌入（Embedding）模型来生成高维向量。这些嵌入向量存储在 ",[441,1484,1485],{},"Cloudflare Vectorize"," 中，这是一项经过高度优化、全球分布式的高性能向量数据库服务。",[441,1488,1485],{}," 会执行余弦相似度（Cosine Similarity）搜索，以精准匹配具有语义相关性的记忆切片。",[434,1491,1492],{},"Second Brain 还内置了智能的去重与合并机制。只有在内容相似度低于 85% 时，系统才会将其作为新记忆存储；否则，该内容将被拦截或标记为潜在的重复候选。超过 1,600 字符的长文本会被系统在句子或换行符边界处进行合理切分，并保持相邻分片之间有 200 字符的重叠（Overlap），以防丢失上下文语境。随后，每个文本分片都会被单独向量化，从而实现极高精度的语义匹配。",[434,1494,1495],{},"系统为 AI 智能体直接暴露了以下 MCP 工具接口：",[474,1497,1498,1504,1510,1516,1522,1528,1534],{},[477,1499,1500,1503],{},[469,1501,1502],{},"remember","：存储想法、决策、偏好及项目整体上下文",[477,1505,1506,1509],{},[469,1507,1508],{},"append","：为已有的记忆内容追加新的更新或补充信息",[477,1511,1512,1515],{},[469,1513,1514],{},"update","：完全替换已有的某条记忆内容",[477,1517,1518,1521],{},[469,1519,1520],{},"recall","：基于语义相似度检索相关记忆，而非死板的关键词精确匹配",[477,1523,1524,1527],{},[469,1525,1526],{},"list_recent","：浏览最近保存的记忆记录",[477,1529,1530,1533],{},[469,1531,1532],{},"forget","：永久且彻底地删除某条记忆",[477,1535,1536,1539],{},[469,1537,1538],{},"link\u002Fconnections","：明示关联不同的记忆节点（V2 版本提供的图谱功能）",[1147,1541,1543],{"id":1542},"在-cloudflare-上配置-second-brain","在 Cloudflare 上配置 Second Brain",[1151,1545,1546,1564,1571,1578,1585,1592,1603,1610,1613,1620],{},[477,1547,1548,1549,1554,1555,1558,1559,1563],{},"在 ",[481,1550,1553],{"href":1551,"rel":1552},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[485],"Github 仓库"," 页面，点击 ",[469,1556,1557],{},"Deploy to Cloudflare"," 按钮。 [[",[882,1560],{"alt":1561,"src":1562},"GitHub 页面上突出显示的 Deploy to Cloudflare 部署按钮","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fdeploy-to-cloudflare-button.webp","]]",[477,1565,1566,1567],{},"填写弹出的 Cloudflare Worker 配置表单。\n",[882,1568],{"alt":1569,"src":1570},"Cloudflare Workers 部署配置表单","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-deployment-form.webp",[477,1572,1573,1574],{},"在 Dimensions（维度）输入 '384'，Metric（度量指标）选择 'cosine'，然后点击 Deploy 按钮。\n",[882,1575],{"alt":1576,"src":1577},"Cloudflare Vectorize 向量数据库创建与维度设置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-vectorize-configuration.webp",[477,1579,1580,1581],{},"部署成功后，以下是 Cloudflare Workers 平台中 Second Brain 实例的概览信息：\n",[882,1582],{"alt":1583,"src":1584},"已部署的 Second Brain Worker 实例概览主页","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-second-brain-overview.webp",[477,1586,1587,1588],{},"点击 'Settings'（设置），然后点击 'AUTH_TOKEN' 环境变量旁的编辑图标，以创建一条高强度的访问令牌：\n",[882,1589],{"alt":1590,"src":1591},"Cloudflare Worker 变量设置中高亮显示的 AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-settings.webp",[477,1593,1594,1595,1599],{},"点击 'Rotate'（轮换）链接，以便能输入新的安全值： ",[882,1596],{"alt":1597,"src":1598},"AUTH_TOKEN 变量修改与秘钥轮换界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-rotate.webp",[882,1600],{"alt":1601,"src":1602},"在 AUTH_TOKEN 值字段中输入生成的随机安全字符串","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-value-input.webp",[477,1604,1605,1606,1609],{},"在 macOS 终端中运行 ",[469,1607,1608],{},"openssl rand -base64 32"," 命令来生成一个随机的安全字符串，并将其复制粘贴到 'Value' 输入框中。",[477,1611,1612],{},"点击 'Deploy' 按钮，使新配置的 'AUTH_TOKEN' 正式生效。",[477,1614,1615,1616],{},"在浏览器中打开您刚刚创建的 Second Brain Worker 访问域名：\n",[882,1617],{"alt":1618,"src":1619},"包含 Bearer Token 输入框的 Second Brain Web 登录界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-login.webp",[477,1621,1548,1622,1625],{},[469,1623,1624],{},"Bearer token"," 输入框中填入刚才创建的 'AUTH_TOKEN'，然后点击 'Connect' 按钮登录 Web 控制台。",[1147,1627,1629],{"id":1628},"通过-mcp-协议集成-claude-desktop","通过 MCP 协议集成 Claude Desktop",[1151,1631,1632,1639,1646],{},[477,1633,1634,1635],{},"在 Claude Desktop 客户端中点击 'Customize'（自定义）按钮。\n",[882,1636],{"alt":1637,"src":1638},"Claude Desktop 界面中指向 Customize 自定义按钮的位置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-customize-button.webp",[477,1640,1641,1642],{},"点击 'Developer'（开发者）选项，手动编辑本地的 MCP 配置文件：\n",[882,1643],{"alt":1644,"src":1645},"Claude Desktop 开发者设置菜单中用于打开 MCP 配置文件的选项","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-developer-menu.webp",[477,1647,1548,1648,1651,1652,1655],{},[469,1649,1650],{},"claude_desktop_config.json"," 的 ",[469,1653,1654],{},"mcpServers"," 字段中加入以下配置代码块：",[495,1657,1661],{"className":1658,"code":1659,"language":1660,"meta":424,"style":424},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","    \"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","json",[469,1662,1663,1681,1705,1719,1731,1742,1753,1763,1768],{"__ignoreMap":424},[503,1664,1665,1668,1671,1674,1678],{"class":505,"line":506},[503,1666,1667],{"class":1071},"    \"",[503,1669,1670],{"class":1075},"second-brain",[503,1672,1673],{"class":1071},"\"",[503,1675,1677],{"class":1676},"sTEyZ",": ",[503,1679,1680],{"class":1071},"{\n",[503,1682,1683,1686,1690,1692,1694,1697,1700,1702],{"class":505,"line":512},[503,1684,1685],{"class":1071},"      \"",[503,1687,1689],{"class":1688},"spNyl","command",[503,1691,1673],{"class":1071},[503,1693,1072],{"class":1071},[503,1695,1696],{"class":1071}," \"",[503,1698,1699],{"class":1075},"npx",[503,1701,1673],{"class":1071},[503,1703,1704],{"class":1071},",\n",[503,1706,1707,1709,1712,1714,1716],{"class":505,"line":518},[503,1708,1685],{"class":1071},[503,1710,1711],{"class":1688},"args",[503,1713,1673],{"class":1071},[503,1715,1072],{"class":1071},[503,1717,1718],{"class":1071}," [\n",[503,1720,1721,1724,1727,1729],{"class":505,"line":524},[503,1722,1723],{"class":1071},"        \"",[503,1725,1726],{"class":1075},"mcp-remote",[503,1728,1673],{"class":1071},[503,1730,1704],{"class":1071},[503,1732,1733,1735,1738,1740],{"class":505,"line":530},[503,1734,1723],{"class":1071},[503,1736,1737],{"class":1075},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[503,1739,1673],{"class":1071},[503,1741,1704],{"class":1071},[503,1743,1744,1746,1749,1751],{"class":505,"line":536},[503,1745,1723],{"class":1071},[503,1747,1748],{"class":1075},"--header",[503,1750,1673],{"class":1071},[503,1752,1704],{"class":1071},[503,1754,1755,1757,1760],{"class":505,"line":542},[503,1756,1723],{"class":1071},[503,1758,1759],{"class":1075},"Authorization: Bearer \u003Cyour-token>",[503,1761,1762],{"class":1071},"\"\n",[503,1764,1765],{"class":505,"line":548},[503,1766,1767],{"class":1071},"      ]\n",[503,1769,1770],{"class":505,"line":554},[503,1771,1772],{"class":1071},"    }\n",[434,1774,1775,1779,1780],{},[882,1776],{"alt":1777,"src":1778},"包含 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",[882,1781],{"alt":1782,"src":1783},"Claude Desktop 客户端中显示为运行（running）状态的的 Second Brain MCP 服务","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-status-running.webp",[1147,1785,1787],{"id":1786},"通过-mcp-协议集成-claude-code","通过 MCP 协议集成 Claude Code",[474,1789,1790],{},[477,1791,1792],{},"在终端中运行以下命令以添加该远程 MCP 服务：",[495,1794,1798],{"className":1795,"code":1796,"language":1797,"meta":424,"style":424},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","claude mcp add --transport http second-brain https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\n","shell",[469,1799,1800],{"__ignoreMap":424},[503,1801,1802,1805,1808,1811,1814,1817,1820,1823,1826,1829,1832,1835],{"class":505,"line":506},[503,1803,1804],{"class":1061},"claude",[503,1806,1807],{"class":1075}," mcp",[503,1809,1810],{"class":1075}," add",[503,1812,1813],{"class":1075}," --transport",[503,1815,1816],{"class":1075}," http",[503,1818,1819],{"class":1075}," second-brain",[503,1821,1822],{"class":1075}," https:\u002F\u002F",[503,1824,1825],{"class":1071},"\u003C",[503,1827,1828],{"class":1075},"your-worker-ur",[503,1830,1831],{"class":1676},"l",[503,1833,1834],{"class":1071},">",[503,1836,1837],{"class":1075},"\u002Fmcp\n",[474,1839,1840,1846],{},[477,1841,1842,1843,490],{},"Claude Code 会自动检测到该端点需要 OAuth 身份验证，并在您的默认浏览器中打开登录页面，供您输入并验证刚才创建的 ",[469,1844,1845],{},"AUTH_TOKEN",[477,1847,1848,1849,1852,1853,1856,1857,1862],{},"在本地的 ",[469,1850,1851],{},"~\u002F.claude"," 目录下创建 ",[469,1854,1855],{},"CLAUDE.md"," 文件，并将 ",[481,1858,1861],{"href":1859,"rel":1860},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[485],"CLAUDE_INSTRUCTIONS.md"," 文件中的引导词和规则完整写入其中。",[1147,1864,1866],{"id":1865},"通过-mcp-协议集成-gemini-cli","通过 MCP 协议集成 Gemini CLI",[1151,1868,1869],{},[477,1870,1871],{},"将以下 MCP 设定信息加入您本地的 '.\u002F.gemini\u002Fsettings.json' 文件：",[495,1873,1875],{"className":1658,"code":1874,"language":1660,"meta":424,"style":424},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[469,1876,1877,1889,1908,1922,1936,1941],{"__ignoreMap":424},[503,1878,1879,1881,1883,1885,1887],{"class":505,"line":506},[503,1880,1667],{"class":1071},[503,1882,1670],{"class":1075},[503,1884,1673],{"class":1071},[503,1886,1677],{"class":1676},[503,1888,1680],{"class":1071},[503,1890,1891,1893,1896,1898,1900,1902,1904,1906],{"class":505,"line":512},[503,1892,1685],{"class":1071},[503,1894,1895],{"class":1688},"httpUrl",[503,1897,1673],{"class":1071},[503,1899,1072],{"class":1071},[503,1901,1696],{"class":1071},[503,1903,1737],{"class":1075},[503,1905,1673],{"class":1071},[503,1907,1704],{"class":1071},[503,1909,1910,1912,1915,1917,1919],{"class":505,"line":518},[503,1911,1685],{"class":1071},[503,1913,1914],{"class":1688},"oauth",[503,1916,1673],{"class":1071},[503,1918,1072],{"class":1071},[503,1920,1921],{"class":1071}," {\n",[503,1923,1924,1926,1929,1931,1933],{"class":505,"line":524},[503,1925,1723],{"class":1071},[503,1927,1928],{"class":1061},"enabled",[503,1930,1673],{"class":1071},[503,1932,1072],{"class":1071},[503,1934,1935],{"class":1071}," true\n",[503,1937,1938],{"class":505,"line":530},[503,1939,1940],{"class":1071},"      }\n",[503,1942,1943],{"class":505,"line":536},[503,1944,1772],{"class":1071},[1151,1946,1947],{"start":512},[477,1948,1949],{},"启动 Gemini CLI 客户端。",[1147,1951,1953],{"id":1952},"在不同-ai-智能体中测试-second-brain-效果","在不同 AI 智能体中测试 Second Brain 效果",[1151,1955,1956,1966,1980],{},[477,1957,1548,1958,1961,1962],{},[441,1959,1960],{},"Claude Desktop"," 中，如果我们只是进行简单的品牌色调偏好设置，此时默认并不会调用外部的 Second Brain 服务：\n",[882,1963],{"alt":1964,"src":1965},"在未启用 Second Brain 记忆层时在 Claude Desktop 中进行的首次偏好设置测试","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-first-run-brand-palette.webp",[477,1967,1968,1969,1971,1972,1975,1976],{},"如果我们只是输入 'remember' 等常规词，由于其尚未触发特定提示词引导，",[441,1970,1960],{}," 此时仅会调用本地内置的 ",[469,1973,1974],{},"memory_user-edits"," 工具，并不会同步到云端的持久化记忆层。\n",[882,1977],{"alt":1978,"src":1979},"Claude Desktop 默认调用本地内置用户编辑工具而忽略云端 Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-remember-built-in-tool-fallback.webp",[477,1981,1982,1983,1986],{},"而当我们在配置了规则引导的 ",[441,1984,1985],{},"Claude Code"," 终端中，输入以下具体指令时，系统便成功地在后台触发并调用了 Second Brain 工具：",[495,1988,1993],{"className":1989,"code":1991,"language":1992},[1990],"language-text","Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n","text",[469,1994,1991],{"__ignoreMap":424},[434,1996,1997,2001,2002,2005,2006,2010,2011,2014,2015,2017,2018,2022,2023,2026,2027,2010,2031],{},[882,1998],{"alt":1999,"src":2000},"Claude Code 终端窗口显示成功触发并写入 Second Brain 远程记忆","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-code-second-brain-mcp-called.webp","\n4. 登录 ",[441,2003,2004],{},"Cloudflare Workers 控制台"," 查看 Second Brain 的数据库，确认这些颜色信息已成功同步并存储在云端：\n",[882,2007],{"alt":2008,"src":2009},"在 Second Brain 控制台 Web UI 中验证已成功保存的品牌色配置数据","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-color-verification.webp","\n- ",[1184,2012,2013],{},"Claude Code 之所以能够自动无缝工作，得益于项目目录下的 CLAUDE_INSTRUCTIONS.md 文件。该文件让智能体能够理解并关联包含 'Second Brain' 关键字的记忆流程。","\n5. 在 ",[441,2016,1960],{}," 中若想达到相同效果，我们需要在提示词中显式提及 'Second Brain' 相关的指引，以强制智能体读取或写入这一持久化记忆图层。\n",[882,2019],{"alt":2020,"src":2021},"在提示词中显式提及 'Second Brain' 关键字以触发远程记忆读写","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-second-brain-explicit-trigger.webp","\n6. 同样地，在 ",[441,2024,2025],{},"Gemini CLI"," 交互中，我们也需要提到 'Second Brain' 关键字，以唤醒并触发其对应的远程 MCP 工具。\n",[882,2028],{"alt":2029,"src":2030},"Gemini CLI 终端命令行交互中成功触发 Second Brain 读写","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fgemini-cli-second-brain-trigger.webp",[1184,2032,2033],{},"如果您仿照 CLAUDE_INSTRUCTIONS.md 的做法，在本地的 GEMINI.md 文件中添加类似的上下文引导，AI 便可在后台静默调用 Second Brain 记忆层，不再需要您每次都手动输入触发关键字。",[1147,2035,2036],{"id":2036},"浏览器插件与快捷剪辑",[474,2038,2039,2042],{},[477,2040,2041],{},"系统为 Chrome、Firefox 和 Microsoft Edge 浏览器提供了官方插件支持。",[477,2043,2044,2045],{},"通过该插件，您可以非常快捷地完成以下操作：\n",[474,2046,2047,2053,2059],{},[477,2048,2049,2052],{},[441,2050,2051],{},"网页一键剪辑"," — 一键将当前页面的网页标题与 URL 网址快捷归档到您的 Second Brain 中。",[477,2054,2055,2058],{},[441,2056,2057],{},"选中文本摘要剪辑"," — 选中网页中的任意精彩段落或技术细节后点击剪辑，该摘录便会配合网页标题和 URL 被一并存储。",[477,2060,2061,2064,2065,2068],{},[441,2062,2063],{},"自由文本速记"," — 在保存前直接在插件弹窗中输入额外的补充上下文，或直接附带 ",[469,2066,2067],{},"#标签","；这些标签会被系统自动识别并提取。",[1147,2070,2072],{"id":2071},"通过-obsidian-插件同步个人本地知识库","通过 Obsidian 插件同步个人本地知识库",[474,2074,2075,2078],{},[477,2076,2077],{},"系统提供了一个 Obsidian 专属插件，支持将您本地 Obsidian Vault（保险库）中的特定笔记完美同步至 Cloudflare 端自托管的 Second Brain 记忆中心。",[477,2079,2080],{},"通过配置特定的同步标签，您可以精准控制哪些笔记能够写入您的持久化 AI 上下文库中。",[2082,2083,2085],"h4",{"id":2084},"安装-obsidian-插件","安装 Obsidian 插件",[1151,2087,2088,2102,2113,2120],{},[477,2089,2090,2091,2094,2095,2098],{},"启动 Obsidian 客户端 → 点击 ",[503,2092,2093],{},"Settings（设置）"," → ",[503,2096,2097],{},"Community Plugins（第三方插件）",[882,2099],{"alt":2100,"src":2101},"Obsidian 系统设置面板中指向第三方社区插件的入口","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-settings-community-plugins.webp",[477,2103,2104,2105,2108,2109],{},"点击 ",[503,2106,2107],{},"Browse（浏览）"," 按钮。\n",[882,2110],{"alt":2111,"src":2112},"Obsidian 第三方插件应用中心并高亮显示的 Browse 浏览按钮","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-browse.webp",[477,2114,2115,2116],{},"检索关键词 'Second Brain Sync'。\n",[882,2117],{"alt":2118,"src":2119},"在 Obsidian 第三方插件市场中搜索 Second Brain Sync 插件","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-search-second-brain.webp",[477,2121,2122,2123],{},"点击 'Install' 进行安装，然后点击 'Enable' 启用该插件。\n",[882,2124],{"alt":2125,"src":2126},"在 Obsidian 中点击安装并启用 Second Brain Sync 插件","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-install-and-enable.webp",[2082,2128,2130],{"id":2129},"配置-obsidian-插件","配置 Obsidian 插件",[1151,2132,2133,2143,2150,2157,2164,2174],{},[477,2134,2135,2136,2138,2139,2142],{},"进入 Obsidian 客户端 ",[503,2137,2093],{}," → 选中 ",[503,2140,2141],{},"Second Brain Sync"," 插件配置页面：",[477,2144,2145,2146],{},"准确填写您的 Worker 的端点「URL」和刚才创建的「Auth token（身份令牌）」：\n",[882,2147],{"alt":2148,"src":2149},"在 Obsidian 插件配置页面中输入 Worker URL 和 AUTH_TOKEN 身份凭证","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-configuration-credentials.webp",[477,2151,2152,2153],{},"点击 'Test' 按钮来验证网络连接是否畅通：\n",[882,2154],{"alt":2155,"src":2156},"Obsidian 插件连接测试返回成功（Success）提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-connection-test-success.webp",[477,2158,2159,2160],{},"配置具体的同步策略。设定您的同步标签「Sync tag」并开启「Auto-sync on save（保存时自动同步）」功能：\n",[882,2161],{"alt":2162,"src":2163},"在 Obsidian 插件中配置特定同步标签并启用保存时自动同步","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-sync-behavior-settings.webp",[477,2165,2166,2167,2169,2170],{},"在 Obsidian 知识库中新建一篇笔记，并为其附带您配置好的同步标签（例如： ",[469,2168,1670],{},"）：\n",[882,2171],{"alt":2172,"src":2173},"在 Obsidian 中创建一篇带有 'second-brain' 标签的待同步本地笔记","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-note-with-sync-tag.webp",[477,2175,2176,2177],{},"笔记保存后，其内容已成功触发并自动同步到在 Cloudflare 上运行的自托管 Second Brain 实例中：\n",[882,2178],{"alt":2179,"src":2180},"在云端 Second Brain 控制台 Web UI 中验证已成功同步过来的 Obsidian 笔记","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-synced-note-verification.webp",[429,2182,2183],{"id":2183},"总结与展望",[434,2185,2186],{},"Second Brain 记忆系统为困扰当前 AI 生态的最大痛点之一 —— 长期上下文遗忘与记忆断层，提供了一套极为优雅的开源解决方案。通过将自托管项目与 CloudflareWorkers 弹性、全球分布的 Serverless 基础设施深度结合，我们得以在边缘网络上轻松架设起一条低延迟、高响应速度的个人语义记忆网关。得益于 MCP 这一开放的标准，这条记忆脉络如今已能无缝流动、并被移植共享于各种主流的 AI 助手和开发终端之间。",[434,2188,2189],{},"Obsidian 专属同步插件的加入，更是将这套架构完美融合进了个人日常的知识管理（PKM）流程。您平时随手记录的杂乱卡片或开发速记，能被有选择地提炼并重构，转化为可被 AI 完美解析的结构化上下文。",[434,2191,2192],{},"将私有化部署、高精度的语义向量搜索以及开放式的 MCP 集成标准相融合，Second Brain 不仅仅是一层记忆的外挂，它正向我们展示着一个由用户个人掌握核心数据所有权，安全、独立、互联的未来 Agent 生态系统基石。",[429,2194,2195],{"id":952},"参考资料：",[474,2197,2198,2204,2210,2217,2224],{},[477,2199,2200],{},[481,2201,2202],{"href":2202,"rel":2203},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[485],[477,2205,2206],{},[481,2207,2208],{"href":2208,"rel":2209},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[485],[477,2211,2212],{},[481,2213,2216],{"href":2214,"rel":2215},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[485],"Connect to AI Clients",[477,2218,2219],{},[481,2220,2223],{"href":2221,"rel":2222},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[485],"Second Brain Obsidian Plugin",[477,2225,2226],{},[481,2227,2228],{"href":2228,"rel":2229},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[485],[984,2231,2232],{},"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":512,"depth":518,"links":2234},[2235,2236,2237,2249,2250],{"id":1435,"depth":512,"text":1436},{"id":1445,"depth":512,"text":1446},{"id":1467,"depth":512,"text":1468,"children":2238},[2239,2240,2241,2242,2243,2244,2245],{"id":1542,"depth":518,"text":1543},{"id":1628,"depth":518,"text":1629},{"id":1786,"depth":518,"text":1787},{"id":1865,"depth":518,"text":1866},{"id":1952,"depth":518,"text":1953},{"id":2036,"depth":518,"text":2036},{"id":2071,"depth":518,"text":2072,"children":2246},[2247,2248],{"id":2084,"depth":524,"text":2085},{"id":2129,"depth":524,"text":2130},{"id":2183,"depth":512,"text":2183},{"id":952,"depth":512,"text":2195},[996,1411],"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":2257,"robots":1007,"sitemap":2261},[2258],{"@type":2259,"headline":2260,"description":2253},"TechArticle","基于Cloudflare与MCP构建自托管AI持久化记忆系统",{"lastmod":2252},{"title":2260,"description":2253,"ogTitle":1430,"ogDescription":2253,"twitterTitle":1430,"twitterDescription":2253},"zh\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[2265,2266,2267,1457,2268],"Cloudflare","MCP","AI 记忆","Obsidian","GcIodpT98ONAwkuIbWbfMhCB1u7m4jUIxYtKqcXxO9c",[2271,3166,3167],{"id":2272,"title":2273,"author":424,"body":2274,"category":3149,"date":3150,"description":3151,"extension":999,"image":3152,"imageAlt":3153,"isPublished":1002,"meta":3154,"minRead":530,"navigation":1002,"path":363,"seo":3159,"stem":3161,"tags":3162,"updatedAt":3158,"__hash__":3165},"article\u002Fzh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md","教程：使用 Cloudflare WARP 安全地将 Hermes Agent 暴露至私有网络",{"type":426,"value":2275,"toc":3131},[2276,2290,2300,2303,2306,2318,2321,2329,2332,2336,2385,2389,2523,2527,2560,2564,2567,2633,2636,2672,2675,2702,2706,2716,2719,2758,2845,2849,2854,2869,2878,2953,2958,3004,3008,3054,3068,3072,3115,3118,3128],[434,2277,2278,2279,2282,2283,2285,2286,2289],{},"当我们希望通过笔记本电脑、平板或手机等其他设备访问 ",[441,2280,2281],{},"Hermes Agent","，同时又不想将其暴露在公共互联网上时，这往往是一个普遍的挑战。利用 ",[441,2284,923],{}," 与 ",[441,2287,2288],{},"Cloudflare Zero Trust","，您可以在无需打开任何防火墙入站端口的情况下，将其安全地暴露并在全球范围内进行访问。",[434,2291,2292,2293,2296,2297,2299],{},"如果您之前已经阅读并遵循了我们的指南 '",[481,2294,2295],{"href":375},"如何在 Linux VPS 上部署 Hermes Agent","'，那么您应该已经拥有了一个全天候运行的 Hermes Agent。相比于配置传统 VPN 带来的繁琐步骤，我们将使用 ",[441,2298,923],{}," 客户端，通过互联网将 Hermes Agent 暴露到私有网络中。",[429,2301,2302],{"id":2302},"架构解析",[434,2304,2305],{},"此方案涉及的两个核心组件：",[1151,2307,2308,2313],{},[477,2309,2310,2312],{},[441,2311,2288],{},"：Cloudflare 的云端仪表板，您可以在此定义路由规则和访问策略。",[477,2314,2315,2317],{},[441,2316,923],{},"：安装在您的设备（VPS、笔记本电脑、手机）上的客户端应用程序。它能够拦截发往私有网络的流量，并安全地进行路由。",[1147,2319,2320],{"id":2320},"前置条件",[474,2322,2323,2326],{},[477,2324,2325],{},"一台已经运行 Hermes Agent 的 VPS。",[477,2327,2328],{},"一个免费的 Cloudflare 账号。",[429,2330,2331],{"id":2331},"详细步骤指南",[1147,2333,2335],{"id":2334},"第-1-步配置-cloudflare-zero-trust","第 1 步：配置 Cloudflare Zero Trust",[1151,2337,2338,2346,2353,2364,2371,2378],{},[477,2339,2340,2341,490],{},"登录您的 ",[481,2342,2345],{"href":2343,"rel":2344},"https:\u002F\u002Fdash.cloudflare.com\u002F",[485],"Cloudflare 仪表板 (Dashboard)",[477,2347,2348,2349],{},"点击左侧菜单栏中的 'Zero Trust'。\n",[882,2350],{"alt":2351,"src":2352},"Cloudflare 仪表板左侧侧边栏导航菜单中的 Zero Trust 选项","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-left-menu.webp",[477,2354,2355,2356,2359,2360],{},"如果这是您第一次使用，系统会提示您选择套餐（免费版对本教程完全足够）并为您的团队命名（例如，",[469,2357,2358],{},"ai-team","）。\n",[882,2361],{"alt":2362,"src":2363},"首次设置 Cloudflare Zero Trust 帐户并为团队命名","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-team-setup.webp",[477,2365,2366,2367],{},"点击 'Access'，然后点击 'Policies' 来创建访问策略，以定义谁有权限访问网络。\n",[882,2368],{"alt":2369,"src":2370},"Cloudflare Zero Trust Access 策略页面，显示新配置的访问规则","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-access-policies-page.webp",[477,2372,2373,2374],{},"点击 'Create new policy'。\n",[882,2375],{"alt":2376,"src":2377},"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",[477,2379,2380,2381],{},"选择 'Emails' 并在 'Policy rules' 下方输入您的电子邮件地址。\n",[882,2382],{"alt":2383,"src":2384},"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",[1147,2386,2388],{"id":2387},"第-2-步在-vps-上配置-cloudflare-warp-客户端","第 2 步：在 VPS 上配置 Cloudflare WARP 客户端",[1151,2390,2391,2400,2406,2413,2416,2431,2434,2516],{},[477,2392,2393,2394,832,2397,490],{},"在 VPS 终端中运行 ",[469,2395,2396],{},"sudo apt update",[469,2398,2399],{},"sudo apt install cloudflare-warp",[477,2401,2393,2402,2405],{},[469,2403,2404],{},"warp-cli registration new \u003CTEAM-NAME>","，该命令将输出一个 URL。",[477,2407,2408,2409,2412],{},"复制输出的 URL（其格式类似于 ",[469,2410,2411],{},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp","），并将其粘贴到浏览器中进行认证。",[477,2414,2415],{},"由于前面的策略设置中使用了电子邮件认证，请输入您的电子邮件以进行认证。",[477,2417,2418,2419,2422,2423,2426,2427,2430],{},"当浏览器中显示 '",[441,2420,2421],{},"Success","' 页面后，右键点击蓝色的 '",[441,2424,2425],{},"Open Cloudflare WARP","' 按钮并选择“",[441,2428,2429],{},"检查 (Inspect)","”。",[477,2432,2433],{},"复制该按钮链接中的长 Token 字符串。",[477,2435,2393,2436,2439,2440,2442,2443],{},[469,2437,2438],{},"warp-cli --accept-tos registration token \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\"","，将您的 VPS 连接到 Cloudflare Zero Trust。",[879,2441],{},"如果在 Ubuntu 26 上遇到 'Error: Failed to communicate with the WARP API'，请运行以下命令：",[495,2444,2448],{"className":2445,"code":2446,"language":2447,"meta":424,"style":424},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","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","bash",[469,2449,2450,2464,2468,2474,2485,2489,2494],{"__ignoreMap":424},[503,2451,2452,2455,2458,2461],{"class":505,"line":506},[503,2453,2454],{"class":1061},"sudo",[503,2456,2457],{"class":1075}," systemctl",[503,2459,2460],{"class":1075}," restart",[503,2462,2463],{"class":1075}," warp-svc.service\n",[503,2465,2466],{"class":505,"line":512},[503,2467,1095],{"emptyLinePlaceholder":1002},[503,2469,2470],{"class":505,"line":518},[503,2471,2473],{"class":2472},"sHwdD","# Check status\n",[503,2475,2476,2478,2480,2483],{"class":505,"line":524},[503,2477,2454],{"class":1061},[503,2479,2457],{"class":1075},[503,2481,2482],{"class":1075}," status",[503,2484,2463],{"class":1075},[503,2486,2487],{"class":505,"line":530},[503,2488,1095],{"emptyLinePlaceholder":1002},[503,2490,2491],{"class":505,"line":536},[503,2492,2493],{"class":2472},"# Run the warp-cli registration token again\n",[503,2495,2496,2499,2502,2505,2508,2511,2514],{"class":505,"line":542},[503,2497,2498],{"class":1061},"warp-cli",[503,2500,2501],{"class":1075}," --accept-tos",[503,2503,2504],{"class":1075}," registration",[503,2506,2507],{"class":1075}," token",[503,2509,2510],{"class":1071},"   \"",[503,2512,2513],{"class":1075},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[503,2515,1762],{"class":1071},[477,2517,2518,2519],{},"回到 Cloudflare Zero Trust 仪表板，点击 'Devices'。您现在应该能看到您的 VPS 设备。\n",[882,2520],{"alt":2521,"src":2522},"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",[1147,2524,2526],{"id":2525},"第-3-步配置流量路由","第 3 步：配置流量路由",[1151,2528,2529,2536,2543,2550],{},[477,2530,2531,2532],{},"在 Devices 仪表板中点击您 VPS 设备的配置文件。\n",[882,2533],{"alt":2534,"src":2535},"访问已注册 VPS 设备的详细信息与拆分隧道设置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-device-profile.webp",[477,2537,2538,2539],{},"向下滚动至 'Split Tunnels' 部分。\n",[882,2540],{"alt":2541,"src":2542},"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",[477,2544,2545,2546],{},"点击 'Manage' 按钮，并按照下图配置设置。如有需要请替换相应的 IP 地址。\n",[882,2547],{"alt":2548,"src":2549},"在 Cloudflare 设置中管理拆分隧道 IP 与主机名排除规则","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-manage-split-tunnels.webp",[477,2551,2552,2553,832,2556,2559],{},"暴露 ",[469,2554,2555],{},"address",[469,2557,2558],{},"host"," 会将发往您服务的流量路由到该私有网络内。",[1147,2561,2563],{"id":2562},"第-4-步配置-vps-防火墙","第 4 步：配置 VPS 防火墙",[434,2565,2566],{},"启用防火墙，仅允许 '100.96.0.0\u002F12' 子网的流量通过，并阻止其他所有公共入站访问。",[495,2568,2570],{"className":2445,"code":2569,"language":2447,"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",[469,2571,2572,2585,2602,2616],{"__ignoreMap":424},[503,2573,2574,2576,2579,2582],{"class":505,"line":506},[503,2575,2454],{"class":1061},[503,2577,2578],{"class":1075}," ufw",[503,2580,2581],{"class":1075}," enable",[503,2583,2584],{"class":1676}," \n",[503,2586,2587,2589,2591,2594,2597,2600],{"class":505,"line":512},[503,2588,2454],{"class":1061},[503,2590,2578],{"class":1075},[503,2592,2593],{"class":1075}," default",[503,2595,2596],{"class":1075}," allow",[503,2598,2599],{"class":1075}," outgoing",[503,2601,2584],{"class":1676},[503,2603,2604,2606,2608,2610,2613],{"class":505,"line":518},[503,2605,2454],{"class":1061},[503,2607,2578],{"class":1075},[503,2609,2593],{"class":1075},[503,2611,2612],{"class":1075}," deny",[503,2614,2615],{"class":1075}," incoming\n",[503,2617,2618,2620,2622,2624,2627,2630],{"class":505,"line":524},[503,2619,2454],{"class":1061},[503,2621,2578],{"class":1075},[503,2623,2596],{"class":1075},[503,2625,2626],{"class":1075}," in",[503,2628,2629],{"class":1075}," from",[503,2631,2632],{"class":1075}," 100.96.0.0\u002F12\n",[434,2634,2635],{},"允许回环网络 (loopback) 的流量，避免导致本地服务异常：",[495,2637,2639],{"className":2445,"code":2638,"language":2447,"meta":424,"style":424},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[469,2640,2641,2657],{"__ignoreMap":424},[503,2642,2643,2645,2647,2649,2651,2654],{"class":505,"line":506},[503,2644,2454],{"class":1061},[503,2646,2578],{"class":1075},[503,2648,2596],{"class":1075},[503,2650,2626],{"class":1075},[503,2652,2653],{"class":1075}," on",[503,2655,2656],{"class":1075}," lo\n",[503,2658,2659,2661,2663,2665,2668,2670],{"class":505,"line":512},[503,2660,2454],{"class":1061},[503,2662,2578],{"class":1075},[503,2664,2596],{"class":1075},[503,2666,2667],{"class":1075}," out",[503,2669,2653],{"class":1075},[503,2671,2656],{"class":1075},[434,2673,2674],{},"重载防火墙规则并验证状态：",[495,2676,2678],{"className":2445,"code":2677,"language":2447,"meta":424,"style":424},"sudo ufw reload \nsudo ufw status verbose\n",[469,2679,2680,2691],{"__ignoreMap":424},[503,2681,2682,2684,2686,2689],{"class":505,"line":506},[503,2683,2454],{"class":1061},[503,2685,2578],{"class":1075},[503,2687,2688],{"class":1075}," reload",[503,2690,2584],{"class":1676},[503,2692,2693,2695,2697,2699],{"class":505,"line":512},[503,2694,2454],{"class":1061},[503,2696,2578],{"class":1075},[503,2698,2482],{"class":1075},[503,2700,2701],{"class":1075}," verbose\n",[1147,2703,2705],{"id":2704},"第-5-步将-hermes-agent-暴露至私有网络","第 5 步：将 Hermes Agent 暴露至私有网络",[434,2707,2708,2709,2712,2713,490],{},"我们将把 ",[441,2710,2711],{},"Hermes Agent Web Dashboard"," 暴露至私有网络，并使用默认的认证提供商 ",[441,2714,2715],{},"Nous Research",[2082,2717,2718],{"id":2718},"配置认证提供商",[1151,2720,2721,2730,2737,2744,2751],{},[477,2722,2723,2724,2729],{},"前往 ",[481,2725,2728],{"href":2726,"rel":2727},"https:\u002F\u002Fportal.nousresearch.com",[485],"portal.nousresearch.com"," 注册一个账号。",[477,2731,2732,2733],{},"选择 'Local Dashboards'。\n",[882,2734],{"alt":2735,"src":2736},"在 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",[477,2738,2739,2740],{},"点击 'Register Dashboard'。\n",[882,2741],{"alt":2742,"src":2743},"点击 Register Dashboard 按钮以创建新的仪表板项目","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-dashboard.webp",[477,2745,2746,2747],{},"将 VPS 在私有网络中的 IP 地址填入 'Dashboard redirect URI' 并点击 'Save'。\n",[882,2748],{"alt":2749,"src":2750},"在 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",[477,2752,2753,2754,2757],{},"复制 'OAuth client ID' 并将其粘贴到您的 ",[469,2755,2756],{},"config.yaml"," 文件中：",[495,2759,2761],{"className":1052,"code":2760,"language":1054,"meta":424,"style":424},"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",[469,2762,2763,2771,2781,2792,2799,2809,2819,2826,2836],{"__ignoreMap":424},[503,2764,2765,2768],{"class":505,"line":506},[503,2766,2767],{"class":1067},"dashboard",[503,2769,2770],{"class":1071},":\n",[503,2772,2773,2776,2778],{"class":505,"line":512},[503,2774,2775],{"class":1067},"  theme",[503,2777,1072],{"class":1071},[503,2779,2780],{"class":1075}," default\n",[503,2782,2783,2786,2788],{"class":505,"line":518},[503,2784,2785],{"class":1067},"  show_token_analytics",[503,2787,1072],{"class":1071},[503,2789,2791],{"class":2790},"sfNiH"," false\n",[503,2793,2794,2797],{"class":505,"line":524},[503,2795,2796],{"class":1067},"  oauth",[503,2798,2770],{"class":1071},[503,2800,2801,2804,2806],{"class":505,"line":530},[503,2802,2803],{"class":1067},"    client_id",[503,2805,1072],{"class":1071},[503,2807,2808],{"class":1075}," agent:cmq02x7ha0002jk0ba3kfnb\n",[503,2810,2811,2814,2816],{"class":505,"line":536},[503,2812,2813],{"class":1067},"    portal_url",[503,2815,1072],{"class":1071},[503,2817,2818],{"class":1075}," https:\u002F\u002Fportal.nousresearch.com\n",[503,2820,2821,2824],{"class":505,"line":542},[503,2822,2823],{"class":1067},"  basic_auth",[503,2825,2770],{"class":1071},[503,2827,2828,2831,2833],{"class":505,"line":548},[503,2829,2830],{"class":1067},"    username",[503,2832,1072],{"class":1071},[503,2834,2835],{"class":1071}," ''\n",[503,2837,2838,2841,2843],{"class":505,"line":554},[503,2839,2840],{"class":1067},"    password_hash",[503,2842,1072],{"class":1071},[503,2844,2835],{"class":1071},[2082,2846,2848],{"id":2847},"使用-systemd-确保-hermes-dashboard-开机自启","使用 Systemd 确保 Hermes Dashboard 开机自启",[1151,2850,2851],{},[477,2852,2853],{},"创建服务文件：",[495,2855,2857],{"className":1795,"code":2856,"language":1797,"meta":424,"style":424},"sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[469,2858,2859],{"__ignoreMap":424},[503,2860,2861,2863,2866],{"class":505,"line":506},[503,2862,2454],{"class":1061},[503,2864,2865],{"class":1075}," nano",[503,2867,2868],{"class":1075}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[1151,2870,2871],{"start":512},[477,2872,2873,2874,2877],{},"粘贴以下配置，确保 ",[469,2875,2876],{},"--host 0.0.0.0"," 包含在命令中：",[495,2879,2883],{"className":2880,"code":2881,"language":2882,"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",[469,2884,2885,2890,2895,2900,2904,2909,2914,2919,2924,2929,2934,2939,2943,2948],{"__ignoreMap":424},[503,2886,2887],{"class":505,"line":506},[503,2888,2889],{},"[Unit]\n",[503,2891,2892],{"class":505,"line":512},[503,2893,2894],{},"Description=Hermes Dashboard\n",[503,2896,2897],{"class":505,"line":518},[503,2898,2899],{},"After=network.target\n",[503,2901,2902],{"class":505,"line":524},[503,2903,1095],{"emptyLinePlaceholder":1002},[503,2905,2906],{"class":505,"line":530},[503,2907,2908],{},"[Service]\n",[503,2910,2911],{"class":505,"line":536},[503,2912,2913],{},"User=hermes\n",[503,2915,2916],{"class":505,"line":542},[503,2917,2918],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[503,2920,2921],{"class":505,"line":548},[503,2922,2923],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[503,2925,2926],{"class":505,"line":554},[503,2927,2928],{},"Restart=always\n",[503,2930,2931],{"class":505,"line":560},[503,2932,2933],{},"RestartSec=10\n",[503,2935,2936],{"class":505,"line":566},[503,2937,2938],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[503,2940,2941],{"class":505,"line":572},[503,2942,1095],{"emptyLinePlaceholder":1002},[503,2944,2945],{"class":505,"line":578},[503,2946,2947],{},"[Install]\n",[503,2949,2950],{"class":505,"line":584},[503,2951,2952],{},"WantedBy=multi-user.target\n",[1151,2954,2955],{"start":518},[477,2956,2957],{},"启用并启动服务：",[495,2959,2961],{"className":1795,"code":2960,"language":1797,"meta":424,"style":424},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[469,2962,2963,2972,2983,2994],{"__ignoreMap":424},[503,2964,2965,2967,2969],{"class":505,"line":506},[503,2966,2454],{"class":1061},[503,2968,2457],{"class":1075},[503,2970,2971],{"class":1075}," daemon-reload\n",[503,2973,2974,2976,2978,2980],{"class":505,"line":512},[503,2975,2454],{"class":1061},[503,2977,2457],{"class":1075},[503,2979,2581],{"class":1075},[503,2981,2982],{"class":1075}," hermes-dashboard\n",[503,2984,2985,2987,2989,2992],{"class":505,"line":518},[503,2986,2454],{"class":1061},[503,2988,2457],{"class":1075},[503,2990,2991],{"class":1075}," start",[503,2993,2982],{"class":1075},[503,2995,2996,2998,3000,3002],{"class":505,"line":524},[503,2997,2454],{"class":1061},[503,2999,2457],{"class":1075},[503,3001,2482],{"class":1075},[503,3003,2982],{"class":1075},[1147,3005,3007],{"id":3006},"第-6-步在桌面上安装-cloudflare-warp-客户端","第 6 步：在桌面上安装 Cloudflare WARP 客户端",[1151,3009,3010,3019,3022,3029,3036,3043],{},[477,3011,3012,3013,3018],{},"从 ",[481,3014,3017],{"href":3015,"rel":3016},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[485],"Cloudflare 官网"," 下载 Cloudflare WARP 客户端。",[477,3020,3021],{},"安装完成后打开并运行 Cloudflare WARP 客户端。",[477,3023,3024,3025],{},"按提示登录。\n",[882,3026],{"alt":3027,"src":3028},"台式电脑上的 Cloudflare WARP 客户端登录提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-prompt.webp",[477,3030,3031,3032],{},"登录成功后会显示 'Success' 页面。\n",[882,3033],{"alt":3034,"src":3035},"在台式电脑登录 Cloudflare Zero Trust 后的验证成功网页","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-success.webp",[477,3037,3038,3039],{},"此时 WARP 客户端应显示已连接至您的 Zero Trust 团队。\n",[882,3040],{"alt":3041,"src":3042},"桌面版 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",[477,3044,3045,3046,3049,3050],{},"在浏览器中输入您的私有 IP 地址（例如 ",[469,3047,3048],{},"100.96.0.3","），即可成功加载 Hermes Web Dashboard。\n",[882,3051],{"alt":3052,"src":3053},"在桌面浏览器中访问私有 Hermes Agent 网页仪表板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-desktop-view.webp",[3055,3056,3057],"blockquote",{},[434,3058,3059,3062,3063,3067],{},[441,3060,3061],{},"macOS 用户进阶提示："," 如果您需要使用 WARP 客户端访问多个 Cloudflare 账号，请参阅我们的快速指南 ",[441,3064,3065],{},[481,3066,423],{"href":399},"，实现账号间的无缝切换。",[1147,3069,3071],{"id":3070},"第-7-步在-ios-设备上安装-cloudflare-warp-客户端","第 7 步：在 iOS 设备上安装 Cloudflare WARP 客户端",[1151,3073,3074,3080,3088,3096,3104],{},[477,3075,3076,3077,490],{},"在 App Store 中安装 ",[441,3078,3079],{},"Cloudflare One",[477,3081,3082,3083],{},"打开 Cloudflare One 应用并在提示时输入您的团队名称。\n",[882,3084],{"alt":3085,"src":3086,"width":3087},"在 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,[477,3089,3090,3091],{},"使用前面在策略规则中配置的同一个电子邮箱地址进行登录。\n",[882,3092],{"alt":3093,"src":3094,"width":3095},"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,[477,3097,3098,3099],{},"连接成功后，界面应如下所示：\n",[882,3100],{"alt":3101,"src":3102,"width":3103},"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,[477,3105,3106,3107,3109,3110],{},"在手机浏览器中输入私有 IP ",[469,3108,3048],{}," 即可在移动设备上访问 Hermes Web Dashboard。\n",[882,3111],{"alt":3112,"src":3113,"width":3114},"在手机浏览器上访问 Hermes Agent 网页仪表板界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-mobile-view.webp",345,[429,3116,3117],{"id":3117},"结语",[434,3119,3120,3121,3123,3124,3127],{},"借助 ",[441,3122,2288],{}," 管理身份策略以及 ",[441,3125,3126],{},"WARP"," 客户端通过加密隧道路由流量，您的 Hermes Agent 现在可以被您的设备在全球范围内安全访问。该配置为构建并访问完全远程、私有的 AI 基础设施奠定了坚实而安全的根基。",[984,3129,3130],{},"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":512,"depth":518,"links":3132},[3133,3136,3148],{"id":2302,"depth":512,"text":2302,"children":3134},[3135],{"id":2320,"depth":518,"text":2320},{"id":2331,"depth":512,"text":2331,"children":3137},[3138,3139,3140,3141,3142,3146,3147],{"id":2334,"depth":518,"text":2335},{"id":2387,"depth":518,"text":2388},{"id":2525,"depth":518,"text":2526},{"id":2562,"depth":518,"text":2563},{"id":2704,"depth":518,"text":2705,"children":3143},[3144,3145],{"id":2718,"depth":524,"text":2718},{"id":2847,"depth":524,"text":2848},{"id":3006,"depth":518,"text":3007},{"id":3070,"depth":518,"text":3071},{"id":3117,"depth":512,"text":3117},[1411,995],"2026-07-09","本文深入探讨如何使用 Cloudflare WARP 与 Zero Trust 技术，在完全不需要开启任何防火墙入站端口的情况下，安全地将您的 Hermes Agent 暴露到私有网络中，从而实现全球范围内的安全访问。这为您构建专属私有远程 AI 基础设施打下坚实基础。","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 暴露至私有网络",{"schemaOrg":3155,"robots":1007,"sitemap":3157},[3156],{"@type":1006,"headline":2273,"description":3151,"name":2273,"image":3152},{"lastmod":3158},"2026-09-28",{"title":3160,"description":3151,"ogTitle":2273,"ogDescription":3151,"twitterTitle":2273,"twitterDescription":3151},"通过 Cloudflare Zero Trust 实现对 Hermes Agent 的安全访问","zh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[923,1014,2281,3163,3164],"私有网络","教程","ishCX4pAaZiNmcl6lotlFfav2RLbIjIFUuYwHpzosd4",{"id":1429,"title":1430,"author":1015,"body":1431,"category":2251,"date":2252,"description":2253,"extension":999,"image":2254,"imageAlt":2255,"isPublished":1002,"meta":2256,"minRead":706,"navigation":1002,"path":415,"seo":2262,"stem":2263,"tags":2264,"updatedAt":1015,"__hash__":2269},{"id":3168,"title":3169,"author":424,"body":3170,"category":4600,"date":4602,"description":4603,"extension":999,"image":4604,"imageAlt":4605,"isPublished":1002,"meta":4606,"minRead":548,"navigation":1002,"path":403,"seo":4613,"stem":4615,"tags":4616,"updatedAt":1015,"__hash__":4619},"article\u002Fzh\u002Farticle\u002Fsync-obsidian-across-devices.md","如何在多台设备之间安全地同步 Obsidian 本地知识库",{"type":426,"value":3171,"toc":4578},[3172,3175,3180,3189,3198,3215,3220,3229,3233,3238,3252,3268,3271,3275,3278,3285,3290,3294,3298,3356,3364,3396,3400,3407,3415,3422,3480,3483,3502,3509,3521,3525,3529,3536,3541,3552,3573,3578,3590,3595,3600,3605,3620,3623,3628,3631,3636,3640,3645,3659,3663,3677,3688,3692,3697,3700,3707,3740,3744,3751,3890,3924,3930,3951,3962,3967,3971,3986,4057,4061,4066,4102,4232,4239,4245,4252,4258,4261,4267,4274,4289,4300,4307,4313,4324,4450,4456,4461,4464,4469,4472,4476,4482,4487,4493,4504,4514,4518,4529,4535,4542,4548,4552,4575],[434,3173,3174],{},"Obsidian 是一款本地优先的知识管理应用。每一个笔记在设备上都是一个本地 Markdown 文件，并完全处于您的掌控之中。然而，我们通常希望在笔记本电脑、手机和其他设备上共享同一个本地知识库，或者希望在某些时候能够通过网页浏览器远程访问它。",[882,3176],{"src":3177,"alt":3178,"style":3179},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-multi-device-sync-illustration.webp","跨多设备同步的 Obsidian 本地知识库的插图","max-width: 667px; width: 100%; height: auto;",[434,3181,3182,3183,3188],{},"市面上有很多针对 Obsidian 的同步方案，但在冲突处理、加密和数据自主权方面，它们或多或少都做出了一些妥协。",[481,3184,3187],{"href":3185,"rel":3186},"https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch",[485],"Synch"," 是一款开源应用，它可以在自建服务器上实现具备端到端加密和冲突解决机制的 Obsidian 知识库同步。",[434,3190,3191,3192,3197],{},"虽然 Obsidian 的本地优先方案在绝大多数情况下都能完美工作，但在某些场景下，我们可能仍需要通过网页浏览器远程访问并编辑笔记。",[481,3193,3196],{"href":3194,"rel":3195},"https:\u002F\u002Fgithub.com\u002FNystik-gh\u002Fignis",[485],"Ignis"," 是一款开源应用，它能够在网页浏览器中以接近原生的体验运行 Obsidian，让您能够直接读取和编辑知识库。",[434,3199,3200,3201,3204,3205,832,3207,3209,3210,3214],{},"在本文中，我们将在一台 ",[441,3202,3203],{},"VPS","（虚拟专用服务器）上部署 ",[441,3206,3187],{},[441,3208,3196],{},"，并将它们安全地托管在 ",[441,3211,3212],{},[481,3213,2288],{"href":363}," 私有网络中，而无需将它们直接暴露在公网上。",[882,3216],{"src":3217,"alt":3218,"style":3219},"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;",[3221,3222],"article-card",{"description":3223,"image":3224,"image-alt":3225,"label":3226,"min-read":3227,"title":3228,"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",[429,3230,3232],{"id":3231},"使用-synch-安全同步-obsidian-知识库","使用 Synch 安全同步 Obsidian 知识库",[434,3234,3235,3237],{},[441,3236,3187],{}," 提供以下特性：",[474,3239,3240,3243,3246,3249],{},[477,3241,3242],{},"检测到更改时立即实时同步您的知识库",[477,3244,3245],{},"并在上传前对知识库数据进行端到端加密",[477,3247,3248],{},"支持从历史版本记录中进行恢复",[477,3250,3251],{},"内置自动冲突解决机制",[434,3253,3254,3256,3257,3260,3261,3264,3265,3267],{},[441,3255,3187],{}," 会在您的本地设备上生成一个随机的 32 字节",[441,3258,3259],{},"知识库密钥","（Vault Key），该密钥专门用于加密您的知识库数据。当您创建远程知识库时，您需要设置一个",[441,3262,3263],{},"知识库密码","。该密码用于保护您的",[441,3266,3259],{},"，以便能够将密钥安全地存储在服务器上，并在其他设备上进行解密。",[434,3269,3270],{},"笔记的冲突解决是在客户端设备上完成的，而不是在服务器端。如果两台设备同时编辑同一个笔记，服务器会保留最先到达的版本，并通知另一台设备其本地版本已过时。随后，该设备会自动将服务器上的最新版本与其本地更改进行合并，然后再将合并后的最终笔记上传。",[1147,3272,3274],{"id":3273},"在您的-vps-上部署-synch","在您的 VPS 上部署 Synch",[2082,3276,3277],{"id":3277},"创建域名解析",[434,3279,3280,3281,3284],{},"在 Cloudflare 中创建一条 A 记录，并将其代理状态设置为",[441,3282,3283],{},"仅限 DNS","（绕过 Cloudflare CDN）。",[882,3286],{"src":3287,"alt":3288,"style":3289},"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;",[2082,3291,3293],{"id":3292},"在-ubuntu-上使用-docker-安装-synch","在 Ubuntu 上使用 Docker 安装 Synch",[3295,3296,3297],"h5",{"id":3297},"克隆仓库",[495,3299,3301],{"className":2445,"code":3300,"language":2447,"meta":424,"style":424},"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",[469,3302,3303,3317,3322,3327,3336,3340,3345],{"__ignoreMap":424},[503,3304,3305,3308,3311,3314],{"class":505,"line":506},[503,3306,3307],{"class":1061},"git",[503,3309,3310],{"class":1075}," clone",[503,3312,3313],{"class":1075}," https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git",[503,3315,3316],{"class":1676},"       \n",[503,3318,3319],{"class":505,"line":512},[503,3320,3321],{"class":1676},"        \n",[503,3323,3324],{"class":505,"line":518},[503,3325,3326],{"class":2472},"# Navigate to the API folder\n",[503,3328,3329,3333],{"class":505,"line":524},[503,3330,3332],{"class":3331},"s2Zo4","cd",[503,3334,3335],{"class":1075}," synch\u002Fapps\u002Fapi\n",[503,3337,3338],{"class":505,"line":530},[503,3339,3321],{"class":1676},[503,3341,3342],{"class":505,"line":536},[503,3343,3344],{"class":2472},"# Copy the example environment file:\n",[503,3346,3347,3350,3353],{"class":505,"line":542},[503,3348,3349],{"class":1061},"cp",[503,3351,3352],{"class":1075}," .env.example",[503,3354,3355],{"class":1075}," .env\n",[3295,3357,3359,3360,3363],{"id":3358},"编辑-env-环境变量","编辑 ",[469,3361,3362],{},".env"," 环境变量",[474,3365,3366,3372,3390],{},[477,3367,3368,3371],{},[469,3369,3370],{},"PUBLIC_URL=synch.pafor.me","：输入您的 Synch 服务器公网域名（即在上一步中创建的域名）。",[477,3373,3374,832,3377,3380,3381,3385,3386,3389],{},[469,3375,3376],{},"BETTER_AUTH_SECRET",[469,3378,3379],{},"SYNC_TOKEN_SECRET","：请使用此 ",[481,3382,3384],{"href":3383},"\u002Fzh\u002Ftools\u002Fsecret-key-hex","在线秘钥生成工具"," 或在终端中运行两次 ",[469,3387,3388],{},"openssl rand -hex 32"," 来生成高强度的随机秘钥。",[477,3391,3392,3395],{},[469,3393,3394],{},"AUTH_ALLOWED_EMAILS","：允许注册并创建账户的邮箱地址列表（用英文逗号分隔）。",[3295,3397,3399],{"id":3398},"将域名添加至-caddyfile","将域名添加至 Caddyfile",[434,3401,3402,3403,490],{},"有关如何将 Cloudflare DNS 模块集成到 Caddy 中并使用 Docker 容器启动的详细配置方法，请参阅我们的 ",[481,3404,3406],{"href":3405},"\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#_4-enable-https-with-caddy","自建 Buzz 协作平台文章",[3221,3408],{"description":3409,"image":3410,"image-alt":3411,"label":3412,"min-read":3413,"title":3414,"to":3405},"学习如何在 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 智能体高效协同工作的全新共享工作空间",[434,3416,3417,3418,3421],{},"在您的 Caddyfile 中添加 ",[469,3419,3420],{},"SYNCH_DOMAIN"," 配置，并将其反向代理指向 8787 端口（Synch 容器内部运行的端口）：",[495,3423,3425],{"className":1658,"code":3424,"language":1660,"meta":424,"style":424},"{\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",[469,3426,3427,3431,3439,3443,3447,3460,3465,3476],{"__ignoreMap":424},[503,3428,3429],{"class":505,"line":506},[503,3430,1680],{"class":1071},[503,3432,3433,3436],{"class":505,"line":512},[503,3434,3435],{"class":1676},"  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN",[503,3437,3438],{"class":1071},"}\n",[503,3440,3441],{"class":505,"line":518},[503,3442,3438],{"class":1676},[503,3444,3445],{"class":505,"line":524},[503,3446,1095],{"emptyLinePlaceholder":1002},[503,3448,3449,3452,3455,3458],{"class":505,"line":530},[503,3450,3451],{"class":1071},"{",[503,3453,3454],{"class":1676},"$SYNCH_DOMAIN",[503,3456,3457],{"class":1071},"}",[503,3459,1921],{"class":1071},[503,3461,3462],{"class":505,"line":536},[503,3463,3464],{"class":1676},"  encode zstd gzip\n",[503,3466,3467,3470,3472],{"class":505,"line":542},[503,3468,3469],{"class":1676},"  reverse_proxy host.docker.internal",[503,3471,1072],{"class":1071},[503,3473,3475],{"class":3474},"sbssI","8787\n",[503,3477,3478],{"class":505,"line":548},[503,3479,3438],{"class":1071},[434,3481,3482],{},"启动容器：",[495,3484,3486],{"className":2445,"code":3485,"language":2447,"meta":424,"style":424},"docker compose up -d\n",[469,3487,3488],{"__ignoreMap":424},[503,3489,3490,3493,3496,3499],{"class":505,"line":506},[503,3491,3492],{"class":1061},"docker",[503,3494,3495],{"class":1075}," compose",[503,3497,3498],{"class":1075}," up",[503,3500,3501],{"class":1075}," -d\n",[434,3503,3504,3505,3508],{},"运行以下 ",[469,3506,3507],{},"curl"," 命令以验证服务的可用性：",[495,3510,3512],{"className":2445,"code":3511,"language":2447,"meta":424,"style":424},"curl https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[469,3513,3514],{"__ignoreMap":424},[503,3515,3516,3518],{"class":505,"line":506},[503,3517,3507],{"class":1061},[503,3519,3520],{"class":1075}," https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[1147,3522,3524],{"id":3523},"将-obsidian-客户端连接至您的-synch-服务器","将 Obsidian 客户端连接至您的 Synch 服务器",[2082,3526,3528],{"id":3527},"在-obsidian-中安装-synch-插件","在 Obsidian 中安装 Synch 插件",[434,3530,3531,3532,3535],{},"打开 Obsidian 的“设置”（Settings），导航至“第三方插件”（Community plugins），然后点击 ",[441,3533,3534],{},"“浏览”（Browse）"," 按钮：",[882,3537],{"src":3538,"alt":3539,"style":3540},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-community-plugins-browse.webp","在 Obsidian 设置中浏览第三方社区插件","max-width: 523px; width: 100%; height: auto;",[434,3542,3543,3544,3547,3548],{},"搜索并安装 ",[441,3545,3546],{},"'Synchrun'"," 插件：\n",[882,3549],{"src":3550,"alt":3551,"style":3289},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-install-synchrun-plugin.webp","在 Obsidian 中安装 Synchrun 同步插件",[434,3553,3554,3555,3557,3558,3561,3562,3565,3566,3569,3570,490],{},"安装完成后，打开 ",[441,3556,3546],{}," 插件设置，并启用 ",[441,3559,3560],{},"“使用自建服务器”（Use a self-hosted server）","。随后，在 ",[441,3563,3564],{},"“服务器 URL”（Server URL）"," 字段中输入 ",[469,3567,3568],{},"https:\u002F\u002Fsynch.pafor.me","，并点击 ",[441,3571,3572],{},"“保存”（Save）",[882,3574],{"src":3575,"alt":3576,"style":3577},"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;",[434,3579,2104,3580,3583,3584,3586,3587,3589],{},[441,3581,3582],{},"“在当前设备上登录”（Sign in on this device）"," 按钮。接着，使用您在 ",[469,3585,3362],{}," 中 ",[469,3588,3394],{}," 列表中指定的邮箱地址进行注册，注册成功后您将看到以下授权页面：",[882,3591],{"src":3592,"alt":3593,"style":3594},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-account-authorization-page.webp","Synchrun 插件的账户授权登录页面","max-width: 494px; width: 100%; height: auto;",[434,3596,2104,3597,3535],{},[441,3598,3599],{},"“允许 Obsidian 登录”（Allow Obsidian sign-in）",[882,3601],{"src":3602,"alt":3603,"style":3604},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-allow-obsidian-signin.webp","允许 Obsidian 通过 Synch 登录","max-width: 498px; width: 100%; height: auto;",[434,3606,2104,3607,3610,3611,3614,3615],{},[441,3608,3609],{},"“返回 Obsidian”（Return to Obsidian）"," 按钮，随后点击 ",[441,3612,3613],{},"“创建知识库”（Create vault）","：\n",[882,3616],{"src":3617,"alt":3618,"style":3619},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-create-remote-vault.webp","在 Synchrun 中创建新的远程同步知识库","max-width: 496px; width: 100%; height: auto;",[434,3621,3622],{},"输入您自定义的知识库名称与高强度密码来创建远程知识库。",[882,3624],{"src":3625,"alt":3626,"style":3627},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-vault-password-setup.webp","为 Obsidian 远程知识库设置高强度安全密码","max-width: 500px; width: 100%; height: auto;",[434,3629,3630],{},"同步过程将立即开始，根据您的知识库文件大小，这可能会需要一些时间。同步完成后，界面将显示您所使用的总存储空间。",[882,3632],{"src":3633,"alt":3634,"style":3635},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-sync-completed-storage.webp","Synchrun 同步完成并显示所使用的总存储空间","max-width: 508px; width: 100%; height: auto;",[429,3637,3639],{"id":3638},"使用-ignis-实现基于浏览器的-obsidian-访问","使用 Ignis 实现基于浏览器的 Obsidian 访问",[434,3641,3642,3644],{},[441,3643,3196],{}," 通过将 Obsidian 的 Electron API 替换为 Web API，使得 Obsidian 的 JavaScript 代码能够直接在标准网页浏览器中运行。您所有的 Markdown 笔记和附件都将直接存储在托管服务器的本地文件系统中。",[434,3646,3647,3648,3653,3654,490],{},"不过，相比于独立运行的 Obsidian 桌面客户端，网页端还存在一些局限性。由于浏览器沙箱环境的限制，某些依赖于 Electron 或 Node.js 特有 API 的功能或第三方插件将无法正常工作。详情请参阅 Ignis 官方文档中的 ",[481,3649,3652],{"href":3650,"rel":3651},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Flimitations\u002F",[485],"局限性说明"," 以及 ",[481,3655,3658],{"href":3656,"rel":3657},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Fplugin-compatibility\u002F",[485],"插件兼容性列表",[1147,3660,3662],{"id":3661},"部署-ignis","部署 Ignis",[434,3664,3665,3666,3668,3669,3672,3673,3676],{},"我们将使用 Docker 在 VPS 上安装 ",[441,3667,3196],{},"，并将其映射挂载到本地的 ",[469,3670,3671],{},".\u002Fvaults"," 文件夹中。随后，我们将在服务器上通过 ",[441,3674,3675],{},"Synch CLI"," 命令行客户端将该本地目录与我们之前设置 of 远程同步知识库进行实时同步。",[434,3678,3679,3680,3682,3683,3687],{},"由于 ",[441,3681,3196],{}," 本身没有内置的身份验证机制，为了确保隐私，我们必须将其安全地隐藏在 ",[441,3684,3685],{},[481,3686,2288],{"href":363}," 私有网络中。",[2082,3689,3691],{"id":3690},"创建-dns-记录","创建 DNS 记录",[882,3693],{"src":3694,"alt":3695,"style":3696},"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;",[2082,3698,3399],{"id":3699},"将域名添加至-caddyfile-1",[434,3701,3702,3703,3706],{},"在您的 Caddyfile 中以相同的方式为 ",[469,3704,3705],{},"obsidian.pafor.me"," 配置反向代理：",[495,3708,3710],{"className":1658,"code":3709,"language":1660,"meta":424,"style":424},"{$OBSIDIAN_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:9898\n}\n",[469,3711,3712,3723,3727,3736],{"__ignoreMap":424},[503,3713,3714,3716,3719,3721],{"class":505,"line":506},[503,3715,3451],{"class":1071},[503,3717,3718],{"class":1676},"$OBSIDIAN_DOMAIN",[503,3720,3457],{"class":1071},[503,3722,1921],{"class":1071},[503,3724,3725],{"class":505,"line":512},[503,3726,3464],{"class":1676},[503,3728,3729,3731,3733],{"class":505,"line":518},[503,3730,3469],{"class":1676},[503,3732,1072],{"class":1071},[503,3734,3735],{"class":3474},"9898\n",[503,3737,3738],{"class":505,"line":524},[503,3739,3438],{"class":1071},[2082,3741,3743],{"id":3742},"使用-docker-启动-ignis","使用 Docker 启动 Ignis",[434,3745,3746,3747,3750],{},"在 VPS 上将以下 Docker Compose 配置保存为 ",[469,3748,3749],{},"ignis-docker-compose.yml","：",[495,3752,3756],{"className":3753,"code":3754,"language":3755,"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",[469,3757,3758,3765,3772,3782,3789,3801,3808,3813,3820,3827,3834,3841,3848,3855,3862,3872,3876,3883],{"__ignoreMap":424},[503,3759,3760,3763],{"class":505,"line":506},[503,3761,3762],{"class":1067},"services",[503,3764,2770],{"class":1071},[503,3766,3767,3770],{"class":505,"line":512},[503,3768,3769],{"class":1067},"  ignis",[503,3771,2770],{"class":1071},[503,3773,3774,3777,3779],{"class":505,"line":518},[503,3775,3776],{"class":1067},"    image",[503,3778,1072],{"class":1071},[503,3780,3781],{"class":1075}," nobbe\u002Fignis:latest\n",[503,3783,3784,3787],{"class":505,"line":524},[503,3785,3786],{"class":1067},"    ports",[503,3788,2770],{"class":1071},[503,3790,3791,3794,3796,3799],{"class":505,"line":530},[503,3792,3793],{"class":1071},"      -",[503,3795,1696],{"class":1071},[503,3797,3798],{"class":1075},"9898:8080",[503,3800,1762],{"class":1071},[503,3802,3803,3806],{"class":505,"line":536},[503,3804,3805],{"class":1067},"    environment",[503,3807,2770],{"class":1071},[503,3809,3810],{"class":505,"line":542},[503,3811,3812],{"class":2472},"      # match these to your host user (run: id)\n",[503,3814,3815,3817],{"class":505,"line":548},[503,3816,3793],{"class":1071},[503,3818,3819],{"class":1075}," PUID=1000\n",[503,3821,3822,3824],{"class":505,"line":554},[503,3823,3793],{"class":1071},[503,3825,3826],{"class":1075}," PGID=1000\n",[503,3828,3829,3831],{"class":505,"line":560},[503,3830,3793],{"class":1071},[503,3832,3833],{"class":1075}," WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n",[503,3835,3836,3839],{"class":505,"line":566},[503,3837,3838],{"class":1067},"    volumes",[503,3840,2770],{"class":1071},[503,3842,3843,3845],{"class":505,"line":572},[503,3844,3793],{"class":1071},[503,3846,3847],{"class":1075}," .\u002Fvaults:\u002Fvaults\n",[503,3849,3850,3852],{"class":505,"line":578},[503,3851,3793],{"class":1071},[503,3853,3854],{"class":1075}," .\u002Fdata:\u002Fapp\u002Fdata\n",[503,3856,3857,3859],{"class":505,"line":584},[503,3858,3793],{"class":1071},[503,3860,3861],{"class":1075}," obsidian-app:\u002Fapp\u002Fobsidian-app\n",[503,3863,3864,3867,3869],{"class":505,"line":590},[503,3865,3866],{"class":1067},"    restart",[503,3868,1072],{"class":1071},[503,3870,3871],{"class":1075}," unless-stopped\n",[503,3873,3874],{"class":505,"line":596},[503,3875,1095],{"emptyLinePlaceholder":1002},[503,3877,3878,3881],{"class":505,"line":602},[503,3879,3880],{"class":1067},"volumes",[503,3882,2770],{"class":1071},[503,3884,3885,3888],{"class":505,"line":608},[503,3886,3887],{"class":1067},"  obsidian-app",[503,3889,2770],{"class":1071},[474,3891,3892,3903,3917],{},[477,3893,3894,3895,3898,3899,3902],{},"在主机端使用 ",[469,3896,3897],{},"9898"," 端口，因为 ",[469,3900,3901],{},"8080"," 是一个非常常用且容易冲突的端口。",[477,3904,3905,3906,3909,3910,832,3913,3916],{},"在您的 VPS 上运行 ",[469,3907,3908],{},"id"," 命令，获取当前主机用户的 ",[469,3911,3912],{},"UID",[469,3914,3915],{},"GID","，并将其填写到配置文件中，以确保文件系统具备正确的读写权限。",[477,3918,3919,3920,3923],{},"配置 ",[469,3921,3922],{},"WS_ORIGINS","，仅允许来自您指定域名的 WebSocket 连接，提高安全性。",[434,3925,3926,3927,3929],{},"启动 ",[441,3928,3196],{}," 容器：",[495,3931,3933],{"className":2445,"code":3932,"language":2447,"meta":424,"style":424},"docker compose -f ignis-docker-compose.yml up -d\n",[469,3934,3935],{"__ignoreMap":424},[503,3936,3937,3939,3941,3944,3947,3949],{"class":505,"line":506},[503,3938,3492],{"class":1061},[503,3940,3495],{"class":1075},[503,3942,3943],{"class":1075}," -f",[503,3945,3946],{"class":1075}," ignis-docker-compose.yml",[503,3948,3498],{"class":1075},[503,3950,3501],{"class":1075},[434,3952,3953,3954,3957,3958,3961],{},"当您在网页浏览器中访问您的域名时，将会弹出 ",[441,3955,3956],{},"'Vault Manager'","（知识库管理器）。由于此时文件夹为空，它不会显示任何本地知识库。在下一节中，我们将配置 ",[441,3959,3960],{},"'Synch CLI'","，从我们之前配置的远程同步服务器中拉取笔记。",[882,3963],{"src":3964,"alt":3965,"style":3966},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-vault-manager-empty.webp","Ignis 网页客户端中当前为空的知识库管理器","max-width: 466px; width: 100%; height: auto;",[2082,3968,3970],{"id":3969},"解决-docker-带来的防火墙失效问题","解决 Docker 带来的防火墙失效问题",[434,3972,3973,3974,3977,3978,3981,3982,3985],{},"默认情况下，Docker 会自动在系统底层插入自己的 DNAT 与 FORWARD 链规则，直接将外部公网流量转发至活动的容器端口。这会完全绕过 Ubuntu 默认的 UFW 或 iptables ",[469,3975,3976],{},"INPUT"," 链防火墙保护。为了阻止外部未经授权的访问并保持容器的绝对私有，我们需要手动将以下规则添加至 ",[469,3979,3980],{},"iptables"," 中的 ",[469,3983,3984],{},"DOCKER-USER"," 链：",[495,3987,3989],{"className":2445,"code":3988,"language":2447,"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",[469,3990,3991,3996,4023,4027,4032],{"__ignoreMap":424},[503,3992,3993],{"class":505,"line":506},[503,3994,3995],{"class":2472},"# 阻断所有外部公网流量的直接访问\n",[503,3997,3998,4000,4003,4006,4009,4012,4015,4018,4021],{"class":505,"line":512},[503,3999,2454],{"class":1061},[503,4001,4002],{"class":1075}," iptables",[503,4004,4005],{"class":1075}," -I",[503,4007,4008],{"class":1075}," DOCKER-USER",[503,4010,4011],{"class":1075}," -i",[503,4013,4014],{"class":1075}," ext_if",[503,4016,4017],{"class":1075}," -j",[503,4019,4020],{"class":1075}," DROP",[503,4022,2584],{"class":1676},[503,4024,4025],{"class":505,"line":518},[503,4026,1095],{"emptyLinePlaceholder":1002},[503,4028,4029],{"class":505,"line":524},[503,4030,4031],{"class":2472},"# 仅允许来自您的 Cloudflare WARP 客户端私有 IP 的访问流量\n",[503,4033,4034,4036,4038,4040,4042,4044,4046,4049,4052,4054],{"class":505,"line":530},[503,4035,2454],{"class":1061},[503,4037,4002],{"class":1075},[503,4039,4005],{"class":1075},[503,4041,4008],{"class":1075},[503,4043,4011],{"class":1075},[503,4045,4014],{"class":1075},[503,4047,4048],{"class":1075}," -s",[503,4050,4051],{"class":3474}," 100.96.0.10",[503,4053,4017],{"class":1075},[503,4055,4056],{"class":1075}," ACCEPT\n",[2082,4058,4060],{"id":4059},"配置-synch-cli-命令行同步工具","配置 Synch CLI 命令行同步工具",[434,4062,4063,4065],{},[441,4064,3675],{}," 是一款无界面的命令行工具，即使在没有安装 Obsidian 桌面应用的远程服务器上，它也能让本地目录与远程知识库进行实时同步。",[434,4067,4068,4069,4072,4073,4075,4076,4079,4080,3653,4083,4086,4087,832,4090,4093,4094,4097,4098,4101],{},"从您之前克隆的 ",[469,4070,4071],{},"synch"," 仓库源码中构建 ",[441,4074,3675],{},"。构建过程需要 ",[441,4077,4078],{},"Node.js >= 22.5","（因为 CLI 依赖于 ",[469,4081,4082],{},"node:sqlite",[469,4084,4085],{},"fetch","、",[469,4088,4089],{},"WebSocket",[469,4091,4092],{},"WebCrypto"," 等全局浏览器原生 API）和 ",[441,4095,4096],{},"pnpm","（由于整个仓库是一个使用了 ",[469,4099,4100],{},"pnpm@10.33.0"," 版本管理器的 pnpm 工作区）：",[495,4103,4105],{"className":2445,"code":4104,"language":2447,"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",[469,4106,4107,4112,4123,4130,4134,4139,4146,4150,4155,4168,4172,4177,4188,4216,4220,4225],{"__ignoreMap":424},[503,4108,4109],{"class":505,"line":506},[503,4110,4111],{"class":2472},"# Check versions\n",[503,4113,4114,4117,4120],{"class":505,"line":512},[503,4115,4116],{"class":1061},"node",[503,4118,4119],{"class":1075}," --version",[503,4121,4122],{"class":2472},"   # must be >= 22.5\n",[503,4124,4125,4127],{"class":505,"line":518},[503,4126,4096],{"class":1061},[503,4128,4129],{"class":1075}," --version\n",[503,4131,4132],{"class":505,"line":524},[503,4133,1095],{"emptyLinePlaceholder":1002},[503,4135,4136],{"class":505,"line":530},[503,4137,4138],{"class":2472},"# In the repos root\n",[503,4140,4141,4143],{"class":505,"line":536},[503,4142,4096],{"class":1061},[503,4144,4145],{"class":1075}," install\n",[503,4147,4148],{"class":505,"line":542},[503,4149,1095],{"emptyLinePlaceholder":1002},[503,4151,4152],{"class":505,"line":548},[503,4153,4154],{"class":2472},"# Build the CLI bundle\n",[503,4156,4157,4159,4162,4165],{"class":505,"line":554},[503,4158,4096],{"class":1061},[503,4160,4161],{"class":1075}," -C",[503,4163,4164],{"class":1075}," apps\u002Fcli",[503,4166,4167],{"class":1075}," build\n",[503,4169,4170],{"class":505,"line":560},[503,4171,1095],{"emptyLinePlaceholder":1002},[503,4173,4174],{"class":505,"line":566},[503,4175,4176],{"class":2472},"# After a successful build you have `apps\u002Fcli\u002Fdist\u002Fsynch.js`. Make it executable and put it on your PATH\n",[503,4178,4179,4182,4185],{"class":505,"line":572},[503,4180,4181],{"class":1061},"chmod",[503,4183,4184],{"class":1075}," +x",[503,4186,4187],{"class":1075}," apps\u002Fcli\u002Fdist\u002Fsynch.js\n",[503,4189,4190,4193,4196,4198,4201,4204,4206,4208,4211,4214],{"class":505,"line":578},[503,4191,4192],{"class":1061},"ln",[503,4194,4195],{"class":1075}," -sf",[503,4197,1696],{"class":1071},[503,4199,4200],{"class":1676},"$PWD",[503,4202,4203],{"class":1075},"\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js",[503,4205,1673],{"class":1071},[503,4207,1696],{"class":1071},[503,4209,4210],{"class":1676},"$HOME",[503,4212,4213],{"class":1075},"\u002F.local\u002Fbin\u002Fsynch",[503,4215,1762],{"class":1071},[503,4217,4218],{"class":505,"line":584},[503,4219,1095],{"emptyLinePlaceholder":1002},[503,4221,4222],{"class":505,"line":590},[503,4223,4224],{"class":2472},"# Verification\n",[503,4226,4227,4229],{"class":505,"line":596},[503,4228,4071],{"class":1061},[503,4230,4231],{"class":1075}," --help\n",[434,4233,4234,4235,4238],{},"由于 Synch CLI 运行在与您的 Synch remote 虚拟同步服务端相同的 VPS 上，它能够直接自动连接至本地的 API 服务端口。如果您将它们部署在不同的服务器上，请运行 ",[469,4236,4237],{},"synch login --api-url \u003Cremote-synch-api-url>"," 来手动定义您的远程目标 API 端点。",[434,4240,4241],{},[882,4242],{"alt":4243,"src":4244},"在终端中输入自定义 API URL 运行 synch login 登录命令","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-api-url-terminal.webp",[434,4246,4247,4248,4251],{},"在您的 VPS 终端中运行 ",[469,4249,4250],{},"synch login"," 命令，您将获得一个用于身份验证的登录 URL：",[434,4253,4254],{},[882,4255],{"alt":4256,"src":4257},"终端输出显示的 Synch CLI 认证 URL","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-auth-url-terminal.webp",[434,4259,4260],{},"使用与您在 Obsidian 桌面端 Synchrun 插件中注册的相同邮箱地址，通过该网页链接进行登录授权。",[434,4262,4263],{},[882,4264],{"alt":4265,"src":4266},"Synch CLI 授权网页端登录成功","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-web-login-success.webp",[434,4268,4269,4270,4273],{},"运行 ",[469,4271,4272],{},"synch vault connect --vault ~\u002Fvaults\u002F\u003Cvaultname> --vault-id asadqe-7b29-4677-fsad-234asdafasd"," 来将您 VPS 上的本地知识库目录与远程自建服务器上的知识库进行关联：",[434,4275,4276,4277,4280,4281,4284,4285,4288],{},"您可以通过打开桌面端 Obsidian 中的 ",[441,4278,4279],{},"Synchrun"," 插件设置，点击 ",[441,4282,4283],{},"“管理远程知识库”（Manage remote vaults）"," 来找到您的远程知识库 ID。该操作会打开一个网页并列出您所有的远程知识库，每个库旁边都附带有一个 GUID 格式的唯一标识符（例如：",[469,4286,4287],{},"123e4567-e89b-12d3-a456-426614174000","）：",[434,4290,4291,4296],{},[882,4292],{"src":4293,"alt":4294,"style":4295},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-manage-remote-vaults.webp","在 Synchrun 插件中管理远程知识库","max-width: 582px; width: 100%; height: auto;",[882,4297],{"alt":4298,"src":4299},"在 Synchrun 中定位唯一的远程知识库 ID","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-remote-vault-id.webp",[434,4301,4302,4303,4306],{},"在提示时输入您的知识库密码以确立关联。关联成功后，运行 ",[469,4304,4305],{},"synch sync --vault ~\u002Fvaults\u002F\u003Cvault-name>"," 来进行您的首次全量同步。首次同步根据您的文件大小，可能会耗费一些时间。",[434,4308,4309],{},[882,4310],{"alt":4311,"src":4312},"Synch CLI 中显示首次拉取同步知识库的进度","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-cli-initial-sync-progress.webp",[434,4314,4315,4316,4319,4320,4323],{},"为了让同步全自动进行，我们可以配置并启用一个 ",[469,4317,4318],{},"systemd"," 系统守护服务，在后台持续运行 ",[469,4321,4322],{},"synch watch"," 监听文件变化，以确保 VPS 上的笔记在系统开机时即可实现毫秒级自动同步：",[495,4325,4327],{"className":2445,"code":4326,"language":2447,"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",[469,4328,4329,4345,4349,4354,4359,4364,4368,4372,4377,4382,4387,4392,4397,4402,4406,4411,4415,4419,4423,4428,4436],{"__ignoreMap":424},[503,4330,4331,4333,4336,4339,4342],{"class":505,"line":506},[503,4332,2454],{"class":1061},[503,4334,4335],{"class":1075}," tee",[503,4337,4338],{"class":1075}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service",[503,4340,4341],{"class":1071}," \u003C\u003C",[503,4343,4344],{"class":1071},"'EOF'\n",[503,4346,4347],{"class":505,"line":512},[503,4348,2889],{"class":1075},[503,4350,4351],{"class":505,"line":518},[503,4352,4353],{"class":1075},"Description=Synch vault watcher\n",[503,4355,4356],{"class":505,"line":524},[503,4357,4358],{"class":1075},"After=network-online.target\n",[503,4360,4361],{"class":505,"line":530},[503,4362,4363],{"class":1075},"Wants=network-online.target\n",[503,4365,4366],{"class":505,"line":536},[503,4367,1095],{"emptyLinePlaceholder":1002},[503,4369,4370],{"class":505,"line":542},[503,4371,2908],{"class":1075},[503,4373,4374],{"class":505,"line":548},[503,4375,4376],{"class":1075},"Type=simple\n",[503,4378,4379],{"class":505,"line":554},[503,4380,4381],{"class":1075},"User=\u003Cusername>\n",[503,4383,4384],{"class":505,"line":560},[503,4385,4386],{"class":1075},"ExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\n",[503,4388,4389],{"class":505,"line":566},[503,4390,4391],{"class":1075},"WorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\n",[503,4393,4394],{"class":505,"line":572},[503,4395,4396],{"class":1075},"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",[503,4398,4399],{"class":505,"line":578},[503,4400,4401],{"class":1075},"Environment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\n",[503,4403,4404],{"class":505,"line":584},[503,4405,2928],{"class":1075},[503,4407,4408],{"class":505,"line":590},[503,4409,4410],{"class":1075},"RestartSec=5\n",[503,4412,4413],{"class":505,"line":596},[503,4414,1095],{"emptyLinePlaceholder":1002},[503,4416,4417],{"class":505,"line":602},[503,4418,2947],{"class":1075},[503,4420,4421],{"class":505,"line":608},[503,4422,2952],{"class":1075},[503,4424,4425],{"class":505,"line":614},[503,4426,4427],{"class":1071},"EOF\n",[503,4429,4430,4432,4434],{"class":505,"line":620},[503,4431,2454],{"class":1061},[503,4433,2457],{"class":1075},[503,4435,2971],{"class":1075},[503,4437,4438,4440,4442,4444,4447],{"class":505,"line":626},[503,4439,2454],{"class":1061},[503,4441,2457],{"class":1075},[503,4443,2581],{"class":1075},[503,4445,4446],{"class":1075}," --now",[503,4448,4449],{"class":1075}," synch-watch.service\n",[434,4451,4452,4453,4455],{},"现在，在浏览器中打开 ",[469,4454,3705],{},"，您会发现其用户界面和排版布局与桌面端原生 App 几乎完全一致：",[882,4457],{"src":4458,"alt":4459,"style":4460},"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;",[434,4462,4463],{},"点击左下角的设置图标可以发现，除了需要手动重新安装第三方社区插件外，几乎所有的 Obsidian 核心配置与功能均已完美保留：",[882,4465],{"src":4466,"alt":4467,"style":4468},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-settings-community-plugins.webp","Ignis 网页界面中的社区第三方插件设置","max-width: 597px; width: 100%; height: auto;",[434,4470,4471],{},"为了测试整个同步闭环，您可以通过 Ignis 网页端直接新建一篇笔记：",[882,4473],{"src":4474,"alt":4475,"style":4468},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-create-new-note-web.webp","通过 Ignis 网页界面新建一篇 Markdown 笔记",[434,4477,4478,4479,4481],{},"该笔记会立即被同步回您的 Obsidian 桌面客户端。需要注意的是，空白文件夹不会在 ",[441,4480,3196],{}," 网页端中显示。",[882,4483],{"src":4484,"alt":4485,"style":4486},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-desktop-synced-note.webp","新创建的笔记已成功同步到本地 Obsidian 桌面客户端","max-width: 502px; width: 100%; height: auto;",[434,4488,4489,4490,4492],{},"在移动端手机浏览器上访问 ",[469,4491,3705],{}," 的实际效果：",[434,4494,4495,4500],{},[882,4496],{"src":4497,"alt":4498,"style":4499},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-sidebar.webp","在移动端手机浏览器上访问 Ignis 网页客户端的侧边栏菜单","max-width: 269px; width: 100%; height: auto;",[882,4501],{"src":4502,"alt":4503,"style":4499},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-editor.webp","在移动端手机浏览器上访问 Ignis 网页客户端的 Markdown 编辑器",[434,4505,4506,4507,4509,4510,4513],{},"当您在 ",[441,4508,3196],{}," 网页端中删除笔记时，它们会被安全地移至本地知识库的 ",[469,4511,4512],{},"~\u002Fvaults\u002F\u003Cvault-name>\u002F.trash"," 垃圾桶文件夹中，以防误删。",[429,4515,4517],{"id":4516},"自建-obsidian-同步服务的一些结语","自建 Obsidian 同步服务的一些结语",[434,4519,4520,4521,2285,4523,4525,4526,4528],{},"通过将 ",[441,4522,3187],{},[441,4524,3196],{}," 结合，您可以使用完全处于自己掌控之下的 VPS 服务器硬件，无缝地实现 Obsidian 笔记库的多端同步与网页端访问。而将这些服务整体托管于 ",[441,4527,2288],{}," 私有网络之中，又为您提供了极致的安全物理边界，从根本上阻断了公网暴露带来的安全隐患。",[434,4530,4531,4532,4534],{},"当然，",[441,4533,3196],{}," 的初衷 spiritual 并客套不是为了完全替代本地的 Obsidian 桌面客户端。相反，它更像是一个极其便利的临时桥梁，供您在没有携带主力电脑时，能够随时随地通过任意浏览器快速存取和编辑自己的笔记。对于日常高强度的写作与重度笔记库管理，本地原生客户端仍然是更加舒适、高效的选择。",[434,4536,4537,4538,4541],{},"由于 Synch 采用了坚固的端到端加密机制，您的远程知识库密码必须具备足够强的复杂度以抵御暴力破解攻击。同时，请务必牢记该密码，因为同步服务端不会存储任何未加密的",[441,4539,4540],{},"知识库秘钥","。一旦遗忘该密码，您的全部笔记数据将彻底无法恢复。此外，由于所有数据均保存在您的自建 VPS 上，您需要自行承担并妥善做好服务器的主机安全防护、以及自动快照与备份管理。",[434,4543,4544,4545,4547],{},"尽管 ",[441,4546,3187],{}," 内置了加密的历史版本管理和已删除文件恢复机制，能为您规避绝大多数意外数据丢失，但为了万无一失，我们依然强烈建议您在第三方物理介质上定期保留一份独立的 Obsidian 知识库离线备份。",[429,4549,4551],{"id":4550},"references","References",[474,4553,4554,4561,4568],{},[477,4555,4556],{},[481,4557,4560],{"href":4558,"rel":4559},"https:\u002F\u002Fsynch.run\u002Fself-hosting-docker\u002F",[485],"Synch Deploy with Docker Compose",[477,4562,4563],{},[481,4564,4567],{"href":4565,"rel":4566},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fserver\u002Fdeploy\u002F",[485],"Ignis Deploy with Docker",[477,4569,4570],{},[481,4571,4574],{"href":4572,"rel":4573},"https:\u002F\u002Fsynch.run\u002Fblog\u002Fencryption-and-decryption\u002F",[485],"How does end-to-end encryption work in Synch?",[984,4576,4577],{},"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":512,"depth":518,"links":4579},[4580,4589,4598,4599],{"id":3231,"depth":512,"text":3232,"children":4581},[4582,4586],{"id":3273,"depth":518,"text":3274,"children":4583},[4584,4585],{"id":3277,"depth":524,"text":3277},{"id":3292,"depth":524,"text":3293},{"id":3523,"depth":518,"text":3524,"children":4587},[4588],{"id":3527,"depth":524,"text":3528},{"id":3638,"depth":512,"text":3639,"children":4590},[4591],{"id":3661,"depth":518,"text":3662,"children":4592},[4593,4594,4595,4596,4597],{"id":3690,"depth":524,"text":3691},{"id":3699,"depth":524,"text":3399},{"id":3742,"depth":524,"text":3743},{"id":3969,"depth":524,"text":3970},{"id":4059,"depth":524,"text":4060},{"id":4516,"depth":512,"text":4517},{"id":4550,"depth":512,"text":4551},[4601],"productivity","2026-09-15","本文详细介绍如何利用开源工具 Synch 与 Ignis 在您的 VPS 上搭建私有同步服务器，从而在多台电脑、手机以及平板设备之间安全地同步您的 Obsidian 知识库。我们还将所有服务全部部署在 Cloudflare Zero Trust 私有网络中，从而完全阻断来自公网的恶意扫描与未授权访问，保障数据隐私安全。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002FZH-Sync-Obsidian-Across-Devices.webp","使用自建 Synch 平台和 Ignis 网页端在 Cloudflare Zero Trust 安全私有网络中同步多端 Obsidian 本地知识库的架构图",{"schemaOrg":4607,"robots":1007,"sitemap":4611},[4608,4610],{"@type":4609,"headline":3169,"description":4603,"image":4604},"Article",{"@type":1006,"name":3169,"description":4603,"image":4604},{"lastmod":4612},"2026-09-16",{"title":4614,"description":4603,"ogTitle":3169,"ogDescription":4603,"twitterTitle":3169,"twitterDescription":4603},"基于自建 Synch 与 Ignis 实现 Obsidian 跨设备安全同步","zh\u002Farticle\u002Fsync-obsidian-across-devices",[4617,2268,4618,1014],"自建服务","云端同步","qUymzYxHVbtcLzhIfa6H_SfwK2NWnW9W0EcGJC30Pbc",1792490007855]