[{"data":1,"prerenderedAt":13470},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"category-articles-zh-buzz":421},[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",[422,1732,2643,4100,6264,8155,8742,9544,10075,10470,11104,11568,11780,12003,12342,13036],{"id":423,"title":424,"author":425,"body":426,"category":1686,"date":1690,"description":1691,"extension":1692,"image":1693,"imageAlt":1694,"isPublished":1077,"meta":1695,"minRead":1723,"navigation":1077,"path":319,"seo":1724,"stem":1726,"tags":1727,"updatedAt":1730,"__hash__":1731},"article\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness.md","为 DeepSeek Harness 接入 Buzz 协作平台：构建自托管 Nostr 消息网关的完整实践","",{"type":427,"value":428,"toc":1670},"minimark",[429,437,462,470,473,478,483,528,531,592,596,603,884,887,891,896,902,906,920,924,935,989,996,1000,1003,1035,1038,1043,1094,1102,1108,1117,1123,1154,1168,1172,1181,1212,1234,1282,1289,1295,1301,1308,1314,1319,1327,1341,1347,1357,1398,1401,1407,1414,1420,1424,1427,1582,1585,1626,1630,1636,1640,1666],[430,431,432],"p",{},[433,434],"img",{"alt":435,"src":436},"DeepSeek Harness 消息网关连接至 Block Buzz 频道的运行概览","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-nostr-gateway-overview.webp",[430,438,439,440,450,451,456,457,461],{},"DeepSeek Harness（DSH）的官方插件 ",[441,442,443],"strong",{},[444,445,449],"a",{"href":446,"rel":447},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway",[448],"nofollow","dsh-message-gateway","，能够将 DeepSeek Harness 助手无缝扩展至 Discord、Telegram、微信等多种主流即时通讯平台。该插件仓库已被 Fork 并进行了二次开发，旨在将 ",[441,452,453],{},[444,454,455],{"href":383},"自建 Block 旗下 Buzz 协作平台：轻松构建人类与 AI 智能体高效协同工作的全新共享工作空间"," 接入支持列表。Fork 后的开源代码仓库位于 GitHub：",[444,458,459],{"href":459,"rel":460},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway",[448]," 。",[463,464],"article-card",{"description":465,"image":466,"image-alt":467,"label":468,"min-read":469,"title":455,"to":383},"本教程将手把手带您在 Ubuntu VPS 上部署自托管的 Block 旗下 Nostr 中继服务 Buzz，并配置 Cloudflare DNS 安全网络。我们将帮助您搭建起一个安全性的共享工作空间，让您的团队成员与多个 AI 智能体（如 Claude、Kimi）能够基于加密身份进行高效沟通、共享项目上下文并实现无缝协作。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FZH-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","一张高颜值的 16:9 科技质感卡片，具有深蓝色和橙色色调，插图展示如何在 Ubuntu VPS 上部署自托管的 Block 旗下 Buzz 协作中继服务器，其中包含一个带有居中文字的毛玻璃微动质感面板。","前置准备指南","12",[430,471,472],{},"DSH 助手作为一个全功能成员加入 Buzz Nostr 中继，既能接收私信（DM），也能接收被 @mention 提及的频道消息，并通过与 Web UI 完全相同的独立会话智能体管线输出响应。",[474,475,477],"h2",{"id":476},"dsh-message-gateway-插件架构剖析","dsh-message-gateway 插件架构剖析",[430,479,480,482],{},[441,481,449],{}," 插件的系统架构清晰划分为宿主端与客户端两大部分：",[484,485,486,518],"ul",{},[487,488,489,492,493,497,498,501,502,505,506,509,510,513,514,517],"li",{},[441,490,491],{},"宿主端（Node 环境）","：",[494,495,496],"code",{},"gateway-store","（凭证与配置持久化存储，位于 ",[494,499,500],{},"~\u002F.dsh\u002Fgateway.json","）、",[494,503,504],{},"platforms.ts","（支持平台定义与连通性自检）、",[494,507,508],{},"routes.ts","（对外暴露的 ",[494,511,512],{},"\u002Fgateway\u002F*"," 路由端点）以及 ",[494,515,516],{},"bridge-manager.ts","（常驻网关桥接器：负责按会话维护独立 Agent 实例并统一管理流式响应推送）。",[487,519,520,523,524,527],{},[441,521,522],{},"客户端（浏览器前端）","：侧边栏的“",[441,525,526],{},"Message platforms","”可视化配置页面，负责录入密钥参数、发起连通性测试以及直观监控网关实时在线状态。",[430,529,530],{},"为网关接入一个全新通讯平台通常需要经历以下三步：",[532,533,534,552,566],"ol",{},[487,535,536,539,540,543,544,547,548,551],{},[441,537,538],{},"实现 Bridge 桥接类","：提供 ",[494,541,542],{},"start\u002Fstop\u002Fstatus"," 生命周期方法以及 ",[494,545,546],{},"onText(text, frame)"," 消息回调，结构规范与现有的 ",[494,549,550],{},"wecom-bridge.ts"," 完全一致。",[487,553,554,557,558,561,562,565],{},[441,555,556],{},"接入 bridge-manager 调度器","：复用既有的多会话调度管线（",[494,559,560],{},"ensureAgentForKey"," + ",[494,563,564],{},"pendingMap","），并将底层文本输出流挂载至该平台的专用回复接收器。",[487,567,568,571,572,575,576,579,580,583,584,587,588,591],{},[441,569,570],{},"对接持久化存储与配置路由","：在 ",[494,573,574],{},"\u002Fgateway\u002Fsave"," 与 ",[494,577,578],{},"\u002Fgateway\u002Fdelete"," 逻辑中实现：",[441,581,582],{},"保存配置即自动启动桥接服务，删除配置则优雅停止桥接服务","，配合 ",[494,585,586],{},"autoStartXxx"," 状态标记确保 ",[494,589,590],{},"dsh web"," 守护进程开机自动重连。",[474,593,595],{"id":594},"buzz-网关桥接实现nostr-协议标准与事件生命周期","Buzz 网关桥接实现：Nostr 协议标准与事件生命周期",[430,597,598,599,602],{},"本次接入直接使用 ",[441,600,601],{},"DeepSeek Harness"," 自行编写完成了完整的 Buzz 适配桥接器。底层严格遵循了如下 Nostr 协议规范标准：",[604,605,606,621],"table",{},[607,608,609],"thead",{},[610,611,612,618],"tr",{},[613,614,615],"th",{},[441,616,617],{},"维度 \u002F 阶段",[613,619,620],{},"协议实现规范与技术细节",[622,623,624,646,664,691,709,734,759,781,795,809,828,845,859],"tbody",{},[610,625,626,632],{},[627,628,629],"td",{},[441,630,631],{},"底层传输（Transport）",[627,633,634,635,638,639,642,643],{},"单条经过 NIP-42 鉴权认证的 WebSocket 链路；默认中继连接地址为 ",[494,636,637],{},"ws:\u002F\u002Flocalhost:3000","；输入的 ",[494,640,641],{},"http(s):\u002F\u002F"," 会自动规整为 ",[494,644,645],{},"ws(s):\u002F\u002F",[610,647,648,653],{},[627,649,650],{},[441,651,652],{},"鉴权认证（Auth）",[627,654,655,656,659,660,663],{},"AUTH 事件 ",[494,657,658],{},"kind 22242","，携带标签 ",[494,661,662],{},"[[\"relay\", url], [\"challenge\", challenge]]","，内容为空字符串，由 Agent 的私钥完成签名",[610,665,666,671],{},[627,667,668],{},[441,669,670],{},"订阅机制（Subs）",[627,672,673,492,676,679,680,683,684,687,688],{},[441,674,675],{},"严格基于频道隔离",[494,677,678],{},"REQ {\"kinds\":[9], \"#h\":[\u003Cuuid>]}"," — 每个频道独立建立一条订阅。全局性的 ",[494,681,682],{},"kinds:[9]"," 虽能收到 EOSE 但绝不广播推送；多值 ",[494,685,686],{},"#h"," 标签过滤在协议中",[441,689,690],{},"无法正常分发",[610,692,693,698],{},[627,694,695],{},[441,696,697],{},"频道发现（Discovery）",[627,699,700,701,704,705,708],{},"历史元数据回溯查询 ",[494,702,703],{},"REQ {kinds:[39000]}"," 提取频道详情（其中 ",[494,706,707],{},"type == \"dm\""," 用于标记单聊私信频道）",[610,710,711,716],{},[627,712,713],{},[441,714,715],{},"成员变动订阅",[627,717,718,719,722,723,725,726,729,730,733],{},"实时长连接订阅 ",[494,720,721],{},"REQ {kinds:[44100,44101], \"#p\":[Agent 公钥], since: now-60s}"," — 44100 为入群，44101 为被移出，均附带 ",[494,724,430],{},"+",[494,727,728],{},"h","；成员关系变更时",[441,731,732],{},"无需重连","即可动态热更新订阅状态",[610,735,736,741],{},[627,737,738],{},[441,739,740],{},"即时聊天事件",[627,742,743,746,747,750,751,754,755,758],{},[494,744,745],{},"kind 9"," 事件，携带 ",[494,748,749],{},"[\"h\", channel]"," 频道标签，可选附带 ",[494,752,753],{},"[\"e\", replyTo]"," 回复目标与 ",[494,756,757],{},"[\"p\", mention]"," 被提及者标签",[610,760,761,766],{},[627,762,763],{},[441,764,765],{},"原位更新编辑",[627,767,768,771,772,575,774,777,778,780],{},[494,769,770],{},"kind 40003"," 事件，附带 ",[494,773,728],{},[494,775,776],{},"e"," 目标标签；内容完全替换；中继单包上限 64 KB → 严控载荷 ≤ 60,000 B；超长回复分块处理 — 首块用于原位编辑替换，超出部分作为回复串线程的 ",[494,779,745],{}," 消息追加",[610,782,783,788],{},[627,784,785],{},[441,786,787],{},"CLOSED 异常帧处理",[627,789,790,791,794],{},"鉴权未完成前收到 ",[494,792,793],{},"auth-required"," 属于正常引导阶段（完成 AUTH 后重新拉起订阅）；鉴权完成后遇断连 → 阶梯式限次重试（最多 3 次，间隔 0\u002F1\u002F2 秒退避）；整链重连时全量重构上下文",[610,796,797,802],{},[627,798,799],{},[441,800,801],{},"中继拉取上限",[627,803,804,805,808],{},"每次订阅最多拉取 2000 条历史事件，即使配置了 ",[494,806,807],{},"since"," 过滤参数，中继仍按自最新向过去的时间倒序返回",[610,810,811,816],{},[627,812,813],{},[441,814,815],{},"消息命中判定",[627,817,818,819,821,822,824,825,827],{},"仅当满足以下任一条件时才激活处理入站 ",[494,820,745],{},"：(a) ",[494,823,430],{}," 标签明确包含自身公钥，(b) 处于 DM 私信频道，(c) 回复关联的 ",[494,826,776],{}," 根事件为自身发出的消息。自动过滤自身公钥发送的内容（彻底杜绝自环）",[610,829,830,835],{},[627,831,832],{},[441,833,834],{},"出站 @ 提及",[627,836,837,838,841,842,844],{},"出站内容按纯文本原样发布 — 中继端不对正文中的 ",[494,839,840],{},"@"," 符号进行预校验；",[494,843,430],{}," 标签填入当前对话原作者以及至多 7 位其他被提及者的公钥（单条上限 8 位）",[610,846,847,852],{},[627,848,849],{},[441,850,851],{},"私聊消息（DM）",[627,853,854,855,858],{},"依赖中继作用域内的明文受限频道（元数据标注 ",[494,856,857],{},"type: \"dm\"","） — 当前桥接实现中未引入 NIP-04\u002F44 复杂非对称端到端加密",[610,860,861,866],{},[627,862,863],{},[441,864,865],{},"媒体附件（入站）",[627,867,868,869,872,873,876,877,876,880,883],{},"NIP-92 ",[494,870,871],{},"imeta"," 规范（",[494,874,875],{},"url",", ",[494,878,879],{},"sha256",[494,881,882],{},"m","）→ 常规 HTTP(S) 流式下载，本地校验 SHA-256 完整性，单文件限制 20 MB，每条消息最多 4 张；出站图片发布暂无官方中继协议路径，现阶段不支持出站图片",[430,885,886],{},"Buzz 适配网关的启动引导时序图如下：",[433,888],{"src":889,"alt":890},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-bootstrap.webp","展示 Buzz 网关引导连接与 NIP-42 协议身份鉴权流程的时序图",[892,893,895],"h3",{"id":894},"基于-nostr-40003-事件原位编辑实现的实时流式输出","基于 Nostr 40003 事件原位编辑实现的实时流式输出",[430,897,898,899,492],{},"Nostr 协议缺乏原生打字中（Typing）状态通知，且底层事件设计为严格只增不改。为了让对话过程具备行云流水的实时交互感，Buzz 适配网关",[441,900,901],{},"通过原位编辑巧妙模拟了流式打字输出",[433,903],{"src":904,"alt":905},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-reply.webp","基于 kind 40003 事件原位编辑模拟打字流式响应的逻辑流程图",[484,907,908],{},[487,909,910],{},[911,912,913,914,916,917,919],"em",{},"网关首先秒级发出一条 ",[494,915,745],{}," 占位消息，随后在 Agent 推理过程中按设定的节流阈值连续发射 ",[494,918,770],{}," 原位编辑事件逐步追加渲染内容，并在推理终点落定最终文本。这一设计思路与 Telegram、Discord 桥接器的实现方式一脉相承。",[892,921,923],{"id":922},"通过聊天指令打通-deepseek-harness-本地工作区","通过聊天指令打通 DeepSeek Harness 本地工作区",[430,925,926,927,930,931,934],{},"DSH Web 界面所支持的“工作区（Workspaces）”核心能力依赖于底层 ",[494,928,929],{},"@deepseek-ai\u002Fdsh-workspace"," 模块中的 ",[494,932,933],{},"workspaceRegistry"," 服务：",[936,937,941],"pre",{"className":938,"code":939,"language":940,"meta":425,"style":425},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const existing = await ctx.workspaceRegistry.resolveByPath(request.path);\n","typescript",[494,942,943],{"__ignoreMap":425},[944,945,948,952,956,960,964,967,970,972,974,978,981,983,986],"span",{"class":946,"line":947},"line",1,[944,949,951],{"class":950},"spNyl","const",[944,953,955],{"class":954},"sTEyZ"," existing ",[944,957,959],{"class":958},"sMK4o","=",[944,961,963],{"class":962},"s7zQu"," await",[944,965,966],{"class":954}," ctx",[944,968,969],{"class":958},".",[944,971,933],{"class":954},[944,973,969],{"class":958},[944,975,977],{"class":976},"s2Zo4","resolveByPath",[944,979,980],{"class":954},"(request",[944,982,969],{"class":958},[944,984,985],{"class":954},"path)",[944,987,988],{"class":958},";\n",[430,990,991,992,995],{},"Buzz 桥接器通过引入全新的聊天斜杠指令 ",[494,993,994],{},"\u002Fworkspace \u003C目录路径>","，允许在群聊中直接向 DSH 注册并绑定本地现存的文件夹。在此之后，该会话下的所有交互都将牢牢锚定在此目录中，并能实时无缝同步在 DSH Web UI 端查看。",[433,997],{"src":998,"alt":999},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace.webp","通过网关聊天指令动态注册并绑定 DeepSeek Harness 本地工作区的架构示意图",[430,1001,1002],{},"开发与使用过程中需重点明确的三大设计机制：",[484,1004,1005,1015,1025],{},[487,1006,1007,1010,1011,1014],{},[441,1008,1009],{},"变更目录等同于开启全新会话","：会话的工作目录（",[494,1012,1013],{},"cwd","）在初始化生成 Session Header 时即完成写入，后续在生命周期内不可直接原地篡改。",[487,1016,1017,1020,1021,1024],{},[441,1018,1019],{},"目标本地目录必须预先存在","：底层 ",[494,1022,1023],{},"create"," 注册函数会对路径进行强校验，若路径在宿主机不存在将直接抛出异常拒绝绑定。",[487,1026,1027,1030,1031,1034],{},[441,1028,1029],{},"高度安全敏感指令","：通过网关衍生的会话均赋予 ",[441,1032,1033],{},"auto-approve","（自动批准命令执行）特权，拥有对目标文件夹直接进行读写和工具操作的完全访问权。",[474,1036,1037],{"id":1037},"安装与配置全流程指南",[532,1039,1040],{},[487,1041,1042],{},"在终端运行以下指令完成插件拉取与启动：",[936,1044,1048],{"className":1045,"code":1046,"language":1047,"meta":425,"style":425},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dsh plugin --profile web add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n\n# Start DSH web\ndsh web\n","bash",[494,1049,1050,1072,1079,1086],{"__ignoreMap":425},[944,1051,1052,1056,1060,1063,1066,1069],{"class":946,"line":947},[944,1053,1055],{"class":1054},"sBMFI","dsh",[944,1057,1059],{"class":1058},"sfazB"," plugin",[944,1061,1062],{"class":1058}," --profile",[944,1064,1065],{"class":1058}," web",[944,1067,1068],{"class":1058}," add",[944,1070,1071],{"class":1058}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n",[944,1073,1075],{"class":946,"line":1074},2,[944,1076,1078],{"emptyLinePlaceholder":1077},true,"\n",[944,1080,1082],{"class":946,"line":1081},3,[944,1083,1085],{"class":1084},"sHwdD","# Start DSH web\n",[944,1087,1089,1091],{"class":946,"line":1088},4,[944,1090,1055],{"class":1054},[944,1092,1093],{"class":1058}," web\n",[532,1095,1096],{"start":1074},[487,1097,1098,1099,1101],{},"待 DSH Web 界面启动并用浏览器打开后，点击界面侧边栏中的“",[441,1100,526],{},"”图标：",[430,1103,1104],{},[433,1105],{"alt":1106,"src":1107},"DeepSeek Harness Web UI 侧边栏高亮显示的 Message platforms 配置菜单项","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-message-platforms-sidebar-icon.webp",[532,1109,1110],{"start":1081},[487,1111,1112,1113,1116],{},"在左侧平台列表中选择“",[441,1114,1115],{},"Buzz","”：",[430,1118,1119],{},[433,1120],{"alt":1121,"src":1122},"DeepSeek Harness 消息网关内的 Buzz 协议参数与密钥对配置面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-message-gateway-buzz-config-panel.webp",[532,1124,1125,1136,1147],{"start":1088},[487,1126,1127,1128,1131,1132,1135],{},"点击“",[441,1129,1130],{},"Generate keypair","”按钮即时生成全新的 Nostr 身份密钥对。请务必将生成的 ",[494,1133,1134],{},"npub"," 公钥妥善复制暂存，后续步骤将作为关键身份凭证。",[487,1137,1138,1139,1142,1143,1146],{},"准确填入您的 ",[441,1140,1141],{},"Relay URL","（中继地址）以及需要监听订阅的 ",[441,1144,1145],{},"Channels","（允许访问的频道 UUID 白名单列表）。",[487,1148,1149,1150,1153],{},"点击底部的“",[441,1151,1152],{},"Save","”按钮完成保存。",[430,1155,1156,1157,1160,1161,1164,1165,1167],{},"表单提交后，系统将持久化保存配置并",[441,1158,1159],{},"立即启动 Buzz 网关服务","。私钥 ",[494,1162,1163],{},"nsec"," 作为最高机密凭证被自动保护，仅独立存放在宿主机本地的 ",[494,1166,500],{}," 文件中。",[892,1169,1171],{"id":1170},"将-dsh-智能体注册至-buzz-nostr-中继服务","将 DSH 智能体注册至 Buzz Nostr 中继服务",[430,1173,1174,1177,1178,1180],{},[441,1175,1176],{},"将 DSH 助手作为新成员注册加入中继","。此处公钥填入上文所生成的 ",[494,1179,1134],{}," 字符串：",[936,1182,1184],{"className":1045,"code":1183,"language":1047,"meta":425,"style":425},"docker compose exec relay buzz-admin add-member --pubkey npub123123123\n",[494,1185,1186],{"__ignoreMap":425},[944,1187,1188,1191,1194,1197,1200,1203,1206,1209],{"class":946,"line":947},[944,1189,1190],{"class":1054},"docker",[944,1192,1193],{"class":1058}," compose",[944,1195,1196],{"class":1058}," exec",[944,1198,1199],{"class":1058}," relay",[944,1201,1202],{"class":1058}," buzz-admin",[944,1204,1205],{"class":1058}," add-member",[944,1207,1208],{"class":1058}," --pubkey",[944,1210,1211],{"class":1058}," npub123123123\n",[430,1213,1214,1217,1218,1221,1222,1225,1226,1229,1230,1233],{},[441,1215,1216],{},"将 DSH 助手加入特定的沟通频道","。仅加入中继并不会让助手自动出现在频道成员列表中。需要通过 ",[494,1219,1220],{},"buzz-cli"," 进一步执行入群操作。注意此处 ",[494,1223,1224],{},"--pubkey"," 参数必须使用 ",[441,1227,1228],{},"HEX 16 进制公钥","格式，而非 npub 格式（在上一步执行 ",[494,1231,1232],{},"buzz-admin add-member"," 时，终端输出中会打印对应的 HEX 公钥）：",[936,1235,1237],{"className":1045,"code":1236,"language":1047,"meta":425,"style":425},"buzz channels add-member --channel \u003CCHANNEL_UUID> --pubkey \u003CAGENT_HEX> --role member\n",[494,1238,1239],{"__ignoreMap":425},[944,1240,1241,1244,1247,1249,1252,1255,1258,1261,1264,1266,1268,1271,1274,1276,1279],{"class":946,"line":947},[944,1242,1243],{"class":1054},"buzz",[944,1245,1246],{"class":1058}," channels",[944,1248,1205],{"class":1058},[944,1250,1251],{"class":1058}," --channel",[944,1253,1254],{"class":958}," \u003C",[944,1256,1257],{"class":1058},"CHANNEL_UUI",[944,1259,1260],{"class":954},"D",[944,1262,1263],{"class":958},">",[944,1265,1208],{"class":1058},[944,1267,1254],{"class":958},[944,1269,1270],{"class":1058},"AGENT_HE",[944,1272,1273],{"class":954},"X",[944,1275,1263],{"class":958},[944,1277,1278],{"class":1058}," --role",[944,1280,1281],{"class":1058}," member\n",[463,1283],{"description":1284,"image":466,"image-alt":467,"label":1285,"min-read":1286,"title":1287,"to":1288},"手把手教您安装和配置 buzz-cli，以便在 Nostr 中继上管理频道、成员密钥以及 AI 智能体的角色权限。","CLI 指南","5","如何安装并使用 buzz-cli","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#install-buzz-cli",[430,1290,1291,1292,1294],{},"随后可通过 ",[494,1293,1220],{}," 灵活更新 DSH 助手在 Nostr 中继中的公开资料，设置更具辨识度的昵称：",[430,1296,1297],{},[433,1298],{"alt":1299,"src":1300},"使用 buzz-cli 命令行工具更新 DSH 助手在 Nostr 中继上的公开个人资料","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-assistant-buzz-cli-profile-update.webp",[430,1302,1303,1304,1307],{},"在客户端向 DSH 助手发送一次 ",[441,1305,1306],{},"Wave","（Buzz 平台独特的 DM 私信打招呼动作）。助手随后返回回复，代表网关通讯已完全就绪：",[430,1309,1310],{},[433,1311],{"alt":1312,"src":1313},"在 Buzz 客户端向 DeepSeek Harness 助手发送 Wave 私信进行连通性验证","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-dm-wave-greeting-reply.webp",[430,1315,1316],{},[911,1317,1318],{},"向 DSH 助手发送 Wave 私信打招呼 — 桥接网关正常秒级响应。",[892,1320,1322,1323,1326],{"id":1321},"通过-workspace-指令开启本地工作区联动","通过 ",[494,1324,1325],{},"\u002Fworkspace"," 指令开启本地工作区联动",[430,1328,1329,1330,1333,1334,1337,1338,1340],{},"由于 ",[494,1331,1332],{},"allowWorkspace"," 配置项出于环境安全考虑默认处于禁用（",[494,1335,1336],{},"false","）状态，未经配置直接向助手发送 ",[494,1339,1325],{}," 命令会被系统拦截拒绝：",[430,1342,1343],{},[433,1344],{"alt":1345,"src":1346},"在未开启 allowWorkspace 权限时发送 \u002Fworkspace 命令被系统安全拦截的提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-rejected-error.webp",[430,1348,1349,1350,1353,1354,1356],{},"打开配置文件 ",[494,1351,1352],{},"~\u002F.dsh\u002Fprofiles\u002Fweb\u002Fcordis.patch.yml"," 添加开关配置，随后重启 ",[494,1355,590],{}," 服务即可：",[936,1358,1362],{"className":1359,"code":1360,"language":1361,"meta":425,"style":425},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- id: ui-message-gateway\n  config:\n    allowWorkspace: true\n","yml",[494,1363,1364,1379,1387],{"__ignoreMap":425},[944,1365,1366,1369,1373,1376],{"class":946,"line":947},[944,1367,1368],{"class":958},"-",[944,1370,1372],{"class":1371},"swJcz"," id",[944,1374,1375],{"class":958},":",[944,1377,1378],{"class":1058}," ui-message-gateway\n",[944,1380,1381,1384],{"class":946,"line":1074},[944,1382,1383],{"class":1371},"  config",[944,1385,1386],{"class":958},":\n",[944,1388,1389,1392,1394],{"class":946,"line":1081},[944,1390,1391],{"class":1371},"    allowWorkspace",[944,1393,1375],{"class":958},[944,1395,1397],{"class":1396},"sfNiH"," true\n",[430,1399,1400],{},"配置生效并重启后即可顺利绑定：",[430,1402,1403],{},[433,1404],{"alt":1405,"src":1406},"在 Buzz 频道成功执行 \u002Fworkspace 命令完成本地工作区绑定的确认消息","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-success-confirmation.webp",[430,1408,1409,1410,1413],{},"实用贴士：此命令默认假设工作区目录名（例如截图中的 ",[494,1411,1412],{},"TechVoyage","）直接位于当前用户的个人主目录之下；若目录处于其他深层路径，请务必传入完整绝对路径。通过 Buzz 频道中注册绑定好的新会话，也都会完全同步在 DeepSeek Harness Web 界面上显示。",[430,1415,1416],{},[433,1417],{"alt":1418,"src":1419},"DeepSeek Harness Web UI 中展示从 Buzz 频道自动同步关联的活跃工作区会话","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-synced-workspace-session.webp",[892,1421,1423],{"id":1422},"buzz-频道支持的完整可用指令","Buzz 频道支持的完整可用指令",[430,1425,1426],{},"其他平台支持的几乎全部原生功能在 Buzz 中均可顺畅运行：",[604,1428,1429,1439],{},[607,1430,1431],{},[610,1432,1433,1436],{},[613,1434,1435],{},"指令语法",[613,1437,1438],{},"功能说明",[622,1440,1441,1451,1461,1471,1481,1491,1501,1511,1521,1545,1565],{},[610,1442,1443,1448],{},[627,1444,1445],{},[494,1446,1447],{},"\u002Fworkspace \u003Cfolder>",[627,1449,1450],{},"将本地已存在的文件夹注册绑定为当前对话专属的工作区环境（受配置项开关保护）",[610,1452,1453,1458],{},[627,1454,1455],{},[494,1456,1457],{},"\u002Fhelp",[627,1459,1460],{},"打印并列出所有支持的命令清单",[610,1462,1463,1468],{},[627,1464,1465],{},[494,1466,1467],{},"\u002Ftime",[627,1469,1470],{},"获取并输出当前服务器系统时间",[610,1472,1473,1478],{},[627,1474,1475],{},[494,1476,1477],{},"\u002Fnew",[627,1479,1480],{},"丢弃旧上下文，原地重置开启全新会话",[610,1482,1483,1488],{},[627,1484,1485],{},[494,1486,1487],{},"\u002Fclear",[627,1489,1490],{},"清空当前上下文所有历史对话流",[610,1492,1493,1498],{},[627,1494,1495],{},[494,1496,1497],{},"\u002Fstatus",[627,1499,1500],{},"查看当前 Buzz 消息桥接器的实时在线状态",[610,1502,1503,1508],{},[627,1504,1505],{},[494,1506,1507],{},"\u002Fstats",[627,1509,1510],{},"查看当前系统活跃会话总量及所有接入平台（包含 Buzz）的桥接连接详细状态",[610,1512,1513,1518],{},[627,1514,1515],{},[494,1516,1517],{},"\u002Fcommands",[627,1519,1520],{},"输出全量指令的底层规范与参数描述文档",[610,1522,1523,1528],{},[627,1524,1525],{},[494,1526,1527],{},"@path\u002Fto\u002Ffile",[627,1529,1530,1531,1533,1534,1536,1537,1540,1541,1544],{},"与 Web 端的 ",[494,1532,840],{}," 文件提及功能完全一致：Agent 自动相对于工作区读取文件内容；单独发送 ",[494,1535,840],{},"、",[494,1538,1539],{},"@前缀"," 或使用 ",[494,1542,1543],{},"\u002Ffiles \u003C前缀>"," 可返回文件\u002F文件夹列表",[610,1546,1547,1552],{},[627,1548,1549],{},[494,1550,1551],{},"\u002Fmodel",[627,1553,1554,1557,1558,1560,1561,1564],{},[494,1555,1556],{},"[provider model effort]"," — 校验有效后实时切换该会话的底层推理大模型与思考深度；单独输入 ",[494,1559,1551],{}," 显示支持的候选列表，",[494,1562,1563],{},"\u002Fmodel reset"," 恢复系统默认设置",[610,1566,1567,1572],{},[627,1568,1569],{},[494,1570,1571],{},"\u002Feffort",[627,1573,1574,1577,1578,1581],{},[494,1575,1576],{},"\u003Cid>"," 仅针对支持思考深度的模型调整 reasoning effort；",[494,1579,1580],{},"\u002Feffort reset"," 恢复默认推理深度配置",[892,1583,1584],{"id":1584},"核心安全架构总结",[484,1586,1587,1599,1613],{},[487,1588,1589,1592,1593,1595,1596,1598],{},[441,1590,1591],{},"私钥资产隔离保护","：Agent 专属的私钥 ",[441,1594,1163],{}," 仅保存在宿主机的 ",[494,1597,500],{}," 中（0600 文件只读权限，原子写入机制） — 永远不会通过 API 端点对外暴露，也不会打印至日常调试日志中。",[487,1600,1601,1604,1605,1608,1609,1612],{},[441,1602,1603],{},"全链路加密签名验签","：每一个入站的 Nostr 事件在投递给 Agent 执行之前，都会严密执行",[441,1606,1607],{},"密码学数字签名检验","（",[494,1610,1611],{},"verifyEvent","）、消息防重放判重、自发自收环路过滤以及 @提及权限校验。",[487,1614,1615,1618,1619,1621,1622,1625],{},[441,1616,1617],{},"本地工作区指令受限保护","：由于网关会话默认开启特权自动批准机制，",[494,1620,1325],{}," 目录注册能力默认处于禁用状态，必须由开发者在配置文件中明确开启（",[494,1623,1624],{},"allowWorkspace: true","），严防非预期提权暴露敏感目录。",[474,1627,1629],{"id":1628},"结语拥抱-buzz-去中心化人机协作时代","结语：拥抱 Buzz 去中心化人机协作时代",[430,1631,1632,1633,1635],{},"在将 Buzz 接入 ",[494,1634,449],{}," 的探索过程中，最大的技术挑战在于严密契合 Nostr 协议的去中心化事件生命周期与事件约束规范。所幸插件本身优秀的架构底座已经将多 Agent 会话管理与命令分发高度抽象，一旦建立起可靠的事件监听与原位流式编辑链路，整个桥接网关便能呈现出超预期的流畅度与生产级稳定性。",[474,1637,1639],{"id":1638},"参考文献与资料","参考文献与资料：",[484,1641,1642,1650,1658],{},[487,1643,1644,1649],{},[444,1645,1648],{"href":1646,"rel":1647},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway\u002Fblob\u002Fmain\u002Fdocs\u002Farchitecture.md",[448],"dsh-message-gateway architecture guide"," — 官方网关架构指南、扩展实践与安全规范",[487,1651,1652,1657],{},[444,1653,1656],{"href":1654,"rel":1655},"https:\u002F\u002Fgithub.com\u002Fnbd-wtf\u002Fnostr-tools",[448],"nostr-tools"," — 底层调用的核心 Nostr JavaScript 客户端库",[487,1659,1660,1665],{},[444,1661,1664],{"href":1662,"rel":1663},"https:\u002F\u002Fgithub.com\u002Fbytedance\u002Fdeer-flow\u002Fblob\u002Fmain\u002Fbackend\u002Fdocs\u002FIM_CHANNEL_CONNECTIONS.md",[448],"deer-flow IM channel connections"," — 即时通讯平台多通道连接架构设计参考",[1667,1668,1669],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--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 .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 .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":425,"searchDepth":1074,"depth":1081,"links":1671},[1672,1673,1677,1684,1685],{"id":476,"depth":1074,"text":477},{"id":594,"depth":1074,"text":595,"children":1674},[1675,1676],{"id":894,"depth":1081,"text":895},{"id":922,"depth":1081,"text":923},{"id":1037,"depth":1074,"text":1037,"children":1678},[1679,1680,1682,1683],{"id":1170,"depth":1081,"text":1171},{"id":1321,"depth":1081,"text":1681},"通过 \u002Fworkspace 指令开启本地工作区联动",{"id":1422,"depth":1081,"text":1423},{"id":1584,"depth":1081,"text":1584},{"id":1628,"depth":1074,"text":1629},{"id":1638,"depth":1074,"text":1639},[1687,1688,1243,1689],"ai-agents","collaboration","deepseek-harness","2026-09-30","深入解析如何通过 Nostr 协议将 DeepSeek Harness 接入 Block Buzz 协作平台：手把手配置 NIP-42 鉴权认证、基于 40003 事件的原位流式编辑输出、频道独立会话管理与本地工作区指令联动，为开发团队构建起安全可控、开箱即用的人机协同智能体开发环境与全新工作流程。","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002FZH-Bringing-Buzz-to-DeepSeek-Harness.webp","一张高颜值的 16:9 科技质感卡片，具有深蓝色与琥珀色调，插图展示如何为 DeepSeek Harness 接入 Block Buzz 协作平台并构建自托管 Nostr 协议网关，中央配有高对比度毛玻璃面板与精致中文排版。",{"schemaOrg":1696,"robots":1721,"sitemap":1722},[1697,1699],{"@type":1698,"headline":424,"description":1691,"image":1693},"TechArticle",{"@type":1700,"name":424,"description":1691,"image":1693,"step":1701},"HowTo",[1702,1706,1709,1712,1715,1718],{"@type":1703,"name":1704,"text":1705},"HowToStep","阶段一：安装与启动消息网关插件","执行 dsh plugin add 命令安装 dsh-message-gateway 并启动 dsh web 服务。",{"@type":1703,"name":1707,"text":1708},"阶段二：访问 Message platforms 配置中心","通过浏览器打开 DSH Web 界面并导航至 Message platforms 菜单。",{"@type":1703,"name":1710,"text":1711},"阶段三：配置 Buzz 桥接参数与生成密钥对","即时生成 Nostr 身份密钥对，准确填入 Relay URL 与订阅频道 UUID 列表。",{"@type":1703,"name":1713,"text":1714},"阶段四：将智能体注册加入 Buzz 中继服务","使用 buzz-admin 命令行工具将 DSH 助手的 npub 公钥加入中继成员。",{"@type":1703,"name":1716,"text":1717},"阶段五：将智能体加入指定的团队频道","使用 buzz-cli 命令行工具将 16 进制 HEX 公钥加入频道成员名单。",{"@type":1703,"name":1719,"text":1720},"阶段六：开启本地工作区绑定权限","在 cordis.patch.yml 中开启 allowWorkspace 配置以允许目录挂载指令。","index, follow",{"lastmod":1690},13,{"title":1725,"description":1691,"ogTitle":424,"ogDescription":1691,"twitterTitle":424,"twitterDescription":1691},"DeepSeek Harness Buzz 插件开发：构建 Nostr 协议网关与实时流式输出的完整教程","zh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",[601,1115,1728,1729,449],"Nostr","AI智能体",null,"-Uv9S6aUiVlNLLDrGF-a3NbzGbjT5AnW8AjMaIbu1Ao",{"id":1733,"title":1734,"author":425,"body":1735,"category":2624,"date":2626,"description":2627,"extension":1692,"image":2628,"imageAlt":2629,"isPublished":1077,"meta":2630,"minRead":1948,"navigation":1077,"path":323,"seo":2635,"stem":2637,"tags":2638,"updatedAt":2634,"__hash__":2642},"article\u002Fzh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md","教程：使用 Cloudflare WARP 安全地将 Hermes Agent 暴露至私有网络",{"type":427,"value":1736,"toc":2606},[1737,1751,1761,1764,1767,1779,1782,1790,1793,1797,1847,1851,1988,1992,2025,2029,2032,2098,2101,2137,2140,2167,2171,2181,2185,2224,2313,2317,2322,2339,2348,2427,2432,2478,2482,2528,2543,2547,2590,2593,2603],[430,1738,1739,1740,1743,1744,575,1747,1750],{},"当我们希望通过笔记本电脑、平板或手机等其他设备访问 ",[441,1741,1742],{},"Hermes Agent","，同时又不想将其暴露在公共互联网上时，这往往是一个普遍的挑战。利用 ",[441,1745,1746],{},"Cloudflare WARP",[441,1748,1749],{},"Cloudflare Zero Trust","，您可以在无需打开任何防火墙入站端口的情况下，将其安全地暴露并在全球范围内进行访问。",[430,1752,1753,1754,1757,1758,1760],{},"如果您之前已经阅读并遵循了我们的指南 '",[444,1755,1756],{"href":375},"如何在 Linux VPS 上部署 Hermes Agent","'，那么您应该已经拥有了一个全天候运行的 Hermes Agent。相比于配置传统 VPN 带来的繁琐步骤，我们将使用 ",[441,1759,1746],{}," 客户端，通过互联网将 Hermes Agent 暴露到私有网络中。",[474,1762,1763],{"id":1763},"架构解析",[430,1765,1766],{},"此方案涉及的两个核心组件：",[532,1768,1769,1774],{},[487,1770,1771,1773],{},[441,1772,1749],{},"：Cloudflare 的云端仪表板，您可以在此定义路由规则和访问策略。",[487,1775,1776,1778],{},[441,1777,1746],{},"：安装在您的设备（VPS、笔记本电脑、手机）上的客户端应用程序。它能够拦截发往私有网络的流量，并安全地进行路由。",[892,1780,1781],{"id":1781},"前置条件",[484,1783,1784,1787],{},[487,1785,1786],{},"一台已经运行 Hermes Agent 的 VPS。",[487,1788,1789],{},"一个免费的 Cloudflare 账号。",[474,1791,1792],{"id":1792},"详细步骤指南",[892,1794,1796],{"id":1795},"第-1-步配置-cloudflare-zero-trust","第 1 步：配置 Cloudflare Zero Trust",[532,1798,1799,1808,1815,1826,1833,1840],{},[487,1800,1801,1802,1807],{},"登录您的 ",[444,1803,1806],{"href":1804,"rel":1805},"https:\u002F\u002Fdash.cloudflare.com\u002F",[448],"Cloudflare 仪表板 (Dashboard)","。",[487,1809,1810,1811],{},"点击左侧菜单栏中的 'Zero Trust'。\n",[433,1812],{"alt":1813,"src":1814},"Cloudflare 仪表板左侧侧边栏导航菜单中的 Zero Trust 选项","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-left-menu.webp",[487,1816,1817,1818,1821,1822],{},"如果这是您第一次使用，系统会提示您选择套餐（免费版对本教程完全足够）并为您的团队命名（例如，",[494,1819,1820],{},"ai-team","）。\n",[433,1823],{"alt":1824,"src":1825},"首次设置 Cloudflare Zero Trust 帐户并为团队命名","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-team-setup.webp",[487,1827,1828,1829],{},"点击 'Access'，然后点击 'Policies' 来创建访问策略，以定义谁有权限访问网络。\n",[433,1830],{"alt":1831,"src":1832},"Cloudflare Zero Trust Access 策略页面，显示新配置的访问规则","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-access-policies-page.webp",[487,1834,1835,1836],{},"点击 'Create new policy'。\n",[433,1837],{"alt":1838,"src":1839},"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",[487,1841,1842,1843],{},"选择 'Emails' 并在 'Policy rules' 下方输入您的电子邮件地址。\n",[433,1844],{"alt":1845,"src":1846},"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",[892,1848,1850],{"id":1849},"第-2-步在-vps-上配置-cloudflare-warp-客户端","第 2 步：在 VPS 上配置 Cloudflare WARP 客户端",[532,1852,1853,1863,1869,1876,1879,1894,1897,1981],{},[487,1854,1855,1856,1859,1860,1807],{},"在 VPS 终端中运行 ",[494,1857,1858],{},"sudo apt update"," 和 ",[494,1861,1862],{},"sudo apt install cloudflare-warp",[487,1864,1855,1865,1868],{},[494,1866,1867],{},"warp-cli registration new \u003CTEAM-NAME>","，该命令将输出一个 URL。",[487,1870,1871,1872,1875],{},"复制输出的 URL（其格式类似于 ",[494,1873,1874],{},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp","），并将其粘贴到浏览器中进行认证。",[487,1877,1878],{},"由于前面的策略设置中使用了电子邮件认证，请输入您的电子邮件以进行认证。",[487,1880,1881,1882,1885,1886,1889,1890,1893],{},"当浏览器中显示 '",[441,1883,1884],{},"Success","' 页面后，右键点击蓝色的 '",[441,1887,1888],{},"Open Cloudflare WARP","' 按钮并选择“",[441,1891,1892],{},"检查 (Inspect)","”。",[487,1895,1896],{},"复制该按钮链接中的长 Token 字符串。",[487,1898,1855,1899,1902,1903,1906,1907],{},[494,1900,1901],{},"warp-cli --accept-tos registration token \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\"","，将您的 VPS 连接到 Cloudflare Zero Trust。",[1904,1905],"br",{},"如果在 Ubuntu 26 上遇到 'Error: Failed to communicate with the WARP API'，请运行以下命令：",[936,1908,1910],{"className":1045,"code":1909,"language":1047,"meta":425,"style":425},"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",[494,1911,1912,1926,1930,1935,1946,1951,1957],{"__ignoreMap":425},[944,1913,1914,1917,1920,1923],{"class":946,"line":947},[944,1915,1916],{"class":1054},"sudo",[944,1918,1919],{"class":1058}," systemctl",[944,1921,1922],{"class":1058}," restart",[944,1924,1925],{"class":1058}," warp-svc.service\n",[944,1927,1928],{"class":946,"line":1074},[944,1929,1078],{"emptyLinePlaceholder":1077},[944,1931,1932],{"class":946,"line":1081},[944,1933,1934],{"class":1084},"# Check status\n",[944,1936,1937,1939,1941,1944],{"class":946,"line":1088},[944,1938,1916],{"class":1054},[944,1940,1919],{"class":1058},[944,1942,1943],{"class":1058}," status",[944,1945,1925],{"class":1058},[944,1947,1949],{"class":946,"line":1948},5,[944,1950,1078],{"emptyLinePlaceholder":1077},[944,1952,1954],{"class":946,"line":1953},6,[944,1955,1956],{"class":1084},"# Run the warp-cli registration token again\n",[944,1958,1960,1963,1966,1969,1972,1975,1978],{"class":946,"line":1959},7,[944,1961,1962],{"class":1054},"warp-cli",[944,1964,1965],{"class":1058}," --accept-tos",[944,1967,1968],{"class":1058}," registration",[944,1970,1971],{"class":1058}," token",[944,1973,1974],{"class":958},"   \"",[944,1976,1977],{"class":1058},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[944,1979,1980],{"class":958},"\"\n",[487,1982,1983,1984],{},"回到 Cloudflare Zero Trust 仪表板，点击 'Devices'。您现在应该能看到您的 VPS 设备。\n",[433,1985],{"alt":1986,"src":1987},"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",[892,1989,1991],{"id":1990},"第-3-步配置流量路由","第 3 步：配置流量路由",[532,1993,1994,2001,2008,2015],{},[487,1995,1996,1997],{},"在 Devices 仪表板中点击您 VPS 设备的配置文件。\n",[433,1998],{"alt":1999,"src":2000},"访问已注册 VPS 设备的详细信息与拆分隧道设置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-device-profile.webp",[487,2002,2003,2004],{},"向下滚动至 'Split Tunnels' 部分。\n",[433,2005],{"alt":2006,"src":2007},"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",[487,2009,2010,2011],{},"点击 'Manage' 按钮，并按照下图配置设置。如有需要请替换相应的 IP 地址。\n",[433,2012],{"alt":2013,"src":2014},"在 Cloudflare 设置中管理拆分隧道 IP 与主机名排除规则","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-manage-split-tunnels.webp",[487,2016,2017,2018,1859,2021,2024],{},"暴露 ",[494,2019,2020],{},"address",[494,2022,2023],{},"host"," 会将发往您服务的流量路由到该私有网络内。",[892,2026,2028],{"id":2027},"第-4-步配置-vps-防火墙","第 4 步：配置 VPS 防火墙",[430,2030,2031],{},"启用防火墙，仅允许 '100.96.0.0\u002F12' 子网的流量通过，并阻止其他所有公共入站访问。",[936,2033,2035],{"className":1045,"code":2034,"language":1047,"meta":425,"style":425},"sudo ufw enable \nsudo ufw default allow outgoing \nsudo ufw default deny incoming\nsudo ufw allow in from 100.96.0.0\u002F12\n",[494,2036,2037,2050,2067,2081],{"__ignoreMap":425},[944,2038,2039,2041,2044,2047],{"class":946,"line":947},[944,2040,1916],{"class":1054},[944,2042,2043],{"class":1058}," ufw",[944,2045,2046],{"class":1058}," enable",[944,2048,2049],{"class":954}," \n",[944,2051,2052,2054,2056,2059,2062,2065],{"class":946,"line":1074},[944,2053,1916],{"class":1054},[944,2055,2043],{"class":1058},[944,2057,2058],{"class":1058}," default",[944,2060,2061],{"class":1058}," allow",[944,2063,2064],{"class":1058}," outgoing",[944,2066,2049],{"class":954},[944,2068,2069,2071,2073,2075,2078],{"class":946,"line":1081},[944,2070,1916],{"class":1054},[944,2072,2043],{"class":1058},[944,2074,2058],{"class":1058},[944,2076,2077],{"class":1058}," deny",[944,2079,2080],{"class":1058}," incoming\n",[944,2082,2083,2085,2087,2089,2092,2095],{"class":946,"line":1088},[944,2084,1916],{"class":1054},[944,2086,2043],{"class":1058},[944,2088,2061],{"class":1058},[944,2090,2091],{"class":1058}," in",[944,2093,2094],{"class":1058}," from",[944,2096,2097],{"class":1058}," 100.96.0.0\u002F12\n",[430,2099,2100],{},"允许回环网络 (loopback) 的流量，避免导致本地服务异常：",[936,2102,2104],{"className":1045,"code":2103,"language":1047,"meta":425,"style":425},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[494,2105,2106,2122],{"__ignoreMap":425},[944,2107,2108,2110,2112,2114,2116,2119],{"class":946,"line":947},[944,2109,1916],{"class":1054},[944,2111,2043],{"class":1058},[944,2113,2061],{"class":1058},[944,2115,2091],{"class":1058},[944,2117,2118],{"class":1058}," on",[944,2120,2121],{"class":1058}," lo\n",[944,2123,2124,2126,2128,2130,2133,2135],{"class":946,"line":1074},[944,2125,1916],{"class":1054},[944,2127,2043],{"class":1058},[944,2129,2061],{"class":1058},[944,2131,2132],{"class":1058}," out",[944,2134,2118],{"class":1058},[944,2136,2121],{"class":1058},[430,2138,2139],{},"重载防火墙规则并验证状态：",[936,2141,2143],{"className":1045,"code":2142,"language":1047,"meta":425,"style":425},"sudo ufw reload \nsudo ufw status verbose\n",[494,2144,2145,2156],{"__ignoreMap":425},[944,2146,2147,2149,2151,2154],{"class":946,"line":947},[944,2148,1916],{"class":1054},[944,2150,2043],{"class":1058},[944,2152,2153],{"class":1058}," reload",[944,2155,2049],{"class":954},[944,2157,2158,2160,2162,2164],{"class":946,"line":1074},[944,2159,1916],{"class":1054},[944,2161,2043],{"class":1058},[944,2163,1943],{"class":1058},[944,2165,2166],{"class":1058}," verbose\n",[892,2168,2170],{"id":2169},"第-5-步将-hermes-agent-暴露至私有网络","第 5 步：将 Hermes Agent 暴露至私有网络",[430,2172,2173,2174,2177,2178,1807],{},"我们将把 ",[441,2175,2176],{},"Hermes Agent Web Dashboard"," 暴露至私有网络，并使用默认的认证提供商 ",[441,2179,2180],{},"Nous Research",[2182,2183,2184],"h4",{"id":2184},"配置认证提供商",[532,2186,2187,2196,2203,2210,2217],{},[487,2188,2189,2190,2195],{},"前往 ",[444,2191,2194],{"href":2192,"rel":2193},"https:\u002F\u002Fportal.nousresearch.com",[448],"portal.nousresearch.com"," 注册一个账号。",[487,2197,2198,2199],{},"选择 'Local Dashboards'。\n",[433,2200],{"alt":2201,"src":2202},"在 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",[487,2204,2205,2206],{},"点击 'Register Dashboard'。\n",[433,2207],{"alt":2208,"src":2209},"点击 Register Dashboard 按钮以创建新的仪表板项目","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-dashboard.webp",[487,2211,2212,2213],{},"将 VPS 在私有网络中的 IP 地址填入 'Dashboard redirect URI' 并点击 'Save'。\n",[433,2214],{"alt":2215,"src":2216},"在 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",[487,2218,2219,2220,2223],{},"复制 'OAuth client ID' 并将其粘贴到您的 ",[494,2221,2222],{},"config.yaml"," 文件中：",[936,2225,2229],{"className":2226,"code":2227,"language":2228,"meta":425,"style":425},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dashboard:\n  theme: default\n  show_token_analytics: false\n  oauth:\n    client_id: agent:cmq02x7ha0002jk0ba3kfnb\n    portal_url: https:\u002F\u002Fportal.nousresearch.com\n  basic_auth:\n    username: ''\n    password_hash: ''\n","yaml",[494,2230,2231,2238,2248,2258,2265,2275,2285,2292,2303],{"__ignoreMap":425},[944,2232,2233,2236],{"class":946,"line":947},[944,2234,2235],{"class":1371},"dashboard",[944,2237,1386],{"class":958},[944,2239,2240,2243,2245],{"class":946,"line":1074},[944,2241,2242],{"class":1371},"  theme",[944,2244,1375],{"class":958},[944,2246,2247],{"class":1058}," default\n",[944,2249,2250,2253,2255],{"class":946,"line":1081},[944,2251,2252],{"class":1371},"  show_token_analytics",[944,2254,1375],{"class":958},[944,2256,2257],{"class":1396}," false\n",[944,2259,2260,2263],{"class":946,"line":1088},[944,2261,2262],{"class":1371},"  oauth",[944,2264,1386],{"class":958},[944,2266,2267,2270,2272],{"class":946,"line":1948},[944,2268,2269],{"class":1371},"    client_id",[944,2271,1375],{"class":958},[944,2273,2274],{"class":1058}," agent:cmq02x7ha0002jk0ba3kfnb\n",[944,2276,2277,2280,2282],{"class":946,"line":1953},[944,2278,2279],{"class":1371},"    portal_url",[944,2281,1375],{"class":958},[944,2283,2284],{"class":1058}," https:\u002F\u002Fportal.nousresearch.com\n",[944,2286,2287,2290],{"class":946,"line":1959},[944,2288,2289],{"class":1371},"  basic_auth",[944,2291,1386],{"class":958},[944,2293,2295,2298,2300],{"class":946,"line":2294},8,[944,2296,2297],{"class":1371},"    username",[944,2299,1375],{"class":958},[944,2301,2302],{"class":958}," ''\n",[944,2304,2306,2309,2311],{"class":946,"line":2305},9,[944,2307,2308],{"class":1371},"    password_hash",[944,2310,1375],{"class":958},[944,2312,2302],{"class":958},[2182,2314,2316],{"id":2315},"使用-systemd-确保-hermes-dashboard-开机自启","使用 Systemd 确保 Hermes Dashboard 开机自启",[532,2318,2319],{},[487,2320,2321],{},"创建服务文件：",[936,2323,2327],{"className":2324,"code":2325,"language":2326,"meta":425,"style":425},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n","shell",[494,2328,2329],{"__ignoreMap":425},[944,2330,2331,2333,2336],{"class":946,"line":947},[944,2332,1916],{"class":1054},[944,2334,2335],{"class":1058}," nano",[944,2337,2338],{"class":1058}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[532,2340,2341],{"start":1074},[487,2342,2343,2344,2347],{},"粘贴以下配置，确保 ",[494,2345,2346],{},"--host 0.0.0.0"," 包含在命令中：",[936,2349,2353],{"className":2350,"code":2351,"language":2352,"meta":425,"style":425},"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",[494,2354,2355,2360,2365,2370,2374,2379,2384,2389,2394,2399,2405,2411,2416,2421],{"__ignoreMap":425},[944,2356,2357],{"class":946,"line":947},[944,2358,2359],{},"[Unit]\n",[944,2361,2362],{"class":946,"line":1074},[944,2363,2364],{},"Description=Hermes Dashboard\n",[944,2366,2367],{"class":946,"line":1081},[944,2368,2369],{},"After=network.target\n",[944,2371,2372],{"class":946,"line":1088},[944,2373,1078],{"emptyLinePlaceholder":1077},[944,2375,2376],{"class":946,"line":1948},[944,2377,2378],{},"[Service]\n",[944,2380,2381],{"class":946,"line":1953},[944,2382,2383],{},"User=hermes\n",[944,2385,2386],{"class":946,"line":1959},[944,2387,2388],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[944,2390,2391],{"class":946,"line":2294},[944,2392,2393],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[944,2395,2396],{"class":946,"line":2305},[944,2397,2398],{},"Restart=always\n",[944,2400,2402],{"class":946,"line":2401},10,[944,2403,2404],{},"RestartSec=10\n",[944,2406,2408],{"class":946,"line":2407},11,[944,2409,2410],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[944,2412,2414],{"class":946,"line":2413},12,[944,2415,1078],{"emptyLinePlaceholder":1077},[944,2417,2418],{"class":946,"line":1723},[944,2419,2420],{},"[Install]\n",[944,2422,2424],{"class":946,"line":2423},14,[944,2425,2426],{},"WantedBy=multi-user.target\n",[532,2428,2429],{"start":1081},[487,2430,2431],{},"启用并启动服务：",[936,2433,2435],{"className":2324,"code":2434,"language":2326,"meta":425,"style":425},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[494,2436,2437,2446,2457,2468],{"__ignoreMap":425},[944,2438,2439,2441,2443],{"class":946,"line":947},[944,2440,1916],{"class":1054},[944,2442,1919],{"class":1058},[944,2444,2445],{"class":1058}," daemon-reload\n",[944,2447,2448,2450,2452,2454],{"class":946,"line":1074},[944,2449,1916],{"class":1054},[944,2451,1919],{"class":1058},[944,2453,2046],{"class":1058},[944,2455,2456],{"class":1058}," hermes-dashboard\n",[944,2458,2459,2461,2463,2466],{"class":946,"line":1081},[944,2460,1916],{"class":1054},[944,2462,1919],{"class":1058},[944,2464,2465],{"class":1058}," start",[944,2467,2456],{"class":1058},[944,2469,2470,2472,2474,2476],{"class":946,"line":1088},[944,2471,1916],{"class":1054},[944,2473,1919],{"class":1058},[944,2475,1943],{"class":1058},[944,2477,2456],{"class":1058},[892,2479,2481],{"id":2480},"第-6-步在桌面上安装-cloudflare-warp-客户端","第 6 步：在桌面上安装 Cloudflare WARP 客户端",[532,2483,2484,2493,2496,2503,2510,2517],{},[487,2485,2486,2487,2492],{},"从 ",[444,2488,2491],{"href":2489,"rel":2490},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[448],"Cloudflare 官网"," 下载 Cloudflare WARP 客户端。",[487,2494,2495],{},"安装完成后打开并运行 Cloudflare WARP 客户端。",[487,2497,2498,2499],{},"按提示登录。\n",[433,2500],{"alt":2501,"src":2502},"台式电脑上的 Cloudflare WARP 客户端登录提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-prompt.webp",[487,2504,2505,2506],{},"登录成功后会显示 'Success' 页面。\n",[433,2507],{"alt":2508,"src":2509},"在台式电脑登录 Cloudflare Zero Trust 后的验证成功网页","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-success.webp",[487,2511,2512,2513],{},"此时 WARP 客户端应显示已连接至您的 Zero Trust 团队。\n",[433,2514],{"alt":2515,"src":2516},"桌面版 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",[487,2518,2519,2520,2523,2524],{},"在浏览器中输入您的私有 IP 地址（例如 ",[494,2521,2522],{},"100.96.0.3","），即可成功加载 Hermes Web Dashboard。\n",[433,2525],{"alt":2526,"src":2527},"在桌面浏览器中访问私有 Hermes Agent 网页仪表板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-desktop-view.webp",[2529,2530,2531],"blockquote",{},[430,2532,2533,2536,2537,2542],{},[441,2534,2535],{},"macOS 用户进阶提示："," 如果您需要使用 WARP 客户端访问多个 Cloudflare 账号，请参阅我们的快速指南 ",[441,2538,2539],{},[444,2540,2541],{"href":399},"使用MDM配置文件在macOS上无缝切换与配置多个Cloudflare WARP零信任组织的完整指南","，实现账号间的无缝切换。",[892,2544,2546],{"id":2545},"第-7-步在-ios-设备上安装-cloudflare-warp-客户端","第 7 步：在 iOS 设备上安装 Cloudflare WARP 客户端",[532,2548,2549,2555,2563,2571,2579],{},[487,2550,2551,2552,1807],{},"在 App Store 中安装 ",[441,2553,2554],{},"Cloudflare One",[487,2556,2557,2558],{},"打开 Cloudflare One 应用并在提示时输入您的团队名称。\n",[433,2559],{"alt":2560,"src":2561,"width":2562},"在 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,[487,2564,2565,2566],{},"使用前面在策略规则中配置的同一个电子邮箱地址进行登录。\n",[433,2567],{"alt":2568,"src":2569,"width":2570},"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,[487,2572,2573,2574],{},"连接成功后，界面应如下所示：\n",[433,2575],{"alt":2576,"src":2577,"width":2578},"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,[487,2580,2581,2582,2584,2585],{},"在手机浏览器中输入私有 IP ",[494,2583,2522],{}," 即可在移动设备上访问 Hermes Web Dashboard。\n",[433,2586],{"alt":2587,"src":2588,"width":2589},"在手机浏览器上访问 Hermes Agent 网页仪表板界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-mobile-view.webp",345,[474,2591,2592],{"id":2592},"结语",[430,2594,2595,2596,2598,2599,2602],{},"借助 ",[441,2597,1749],{}," 管理身份策略以及 ",[441,2600,2601],{},"WARP"," 客户端通过加密隧道路由流量，您的 Hermes Agent 现在可以被您的设备在全球范围内安全访问。该配置为构建并访问完全远程、私有的 AI 基础设施奠定了坚实而安全的根基。",[1667,2604,2605],{},"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":425,"searchDepth":1074,"depth":1081,"links":2607},[2608,2611,2623],{"id":1763,"depth":1074,"text":1763,"children":2609},[2610],{"id":1781,"depth":1081,"text":1781},{"id":1792,"depth":1074,"text":1792,"children":2612},[2613,2614,2615,2616,2617,2621,2622],{"id":1795,"depth":1081,"text":1796},{"id":1849,"depth":1081,"text":1850},{"id":1990,"depth":1081,"text":1991},{"id":2027,"depth":1081,"text":2028},{"id":2169,"depth":1081,"text":2170,"children":2618},[2619,2620],{"id":2184,"depth":1088,"text":2184},{"id":2315,"depth":1088,"text":2316},{"id":2480,"depth":1081,"text":2481},{"id":2545,"depth":1081,"text":2546},{"id":2592,"depth":1074,"text":2592},[1687,2625],"security","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":2631,"robots":1721,"sitemap":2633},[2632],{"@type":1700,"headline":1734,"description":2627,"name":1734,"image":2628},{"lastmod":2634},"2026-09-28",{"title":2636,"description":2627,"ogTitle":1734,"ogDescription":2627,"twitterTitle":1734,"twitterDescription":2627},"通过 Cloudflare Zero Trust 实现对 Hermes Agent 的安全访问","zh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[1746,2639,1742,2640,2641],"Zero Trust","私有网络","教程","ishCX4pAaZiNmcl6lotlFfav2RLbIjIFUuYwHpzosd4",{"id":2644,"title":2645,"author":425,"body":2646,"category":4079,"date":4081,"description":4082,"extension":1692,"image":4083,"imageAlt":4084,"isPublished":1077,"meta":4085,"minRead":2294,"navigation":1077,"path":339,"seo":4092,"stem":4094,"tags":4095,"updatedAt":1730,"__hash__":4099},"article\u002Fzh\u002Farticle\u002Fsync-obsidian-across-devices.md","如何在多台设备之间安全地同步 Obsidian 本地知识库",{"type":427,"value":2647,"toc":4057},[2648,2651,2656,2665,2674,2691,2696,2704,2708,2713,2727,2743,2746,2750,2753,2760,2765,2769,2773,2830,2838,2870,2874,2881,2887,2894,2956,2959,2976,2983,2995,2999,3003,3010,3015,3026,3047,3052,3065,3070,3075,3080,3095,3098,3103,3106,3111,3115,3120,3134,3138,3152,3162,3166,3171,3174,3181,3214,3218,3224,3366,3400,3406,3427,3438,3443,3447,3462,3533,3537,3542,3577,3708,3715,3721,3728,3734,3737,3743,3750,3765,3776,3783,3789,3800,3929,3935,3940,3943,3948,3951,3955,3961,3966,3972,3983,3993,3997,4008,4014,4021,4027,4031,4054],[430,2649,2650],{},"Obsidian 是一款本地优先的知识管理应用。每一个笔记在设备上都是一个本地 Markdown 文件，并完全处于您的掌控之中。然而，我们通常希望在笔记本电脑、手机和其他设备上共享同一个本地知识库，或者希望在某些时候能够通过网页浏览器远程访问它。",[433,2652],{"src":2653,"alt":2654,"style":2655},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-multi-device-sync-illustration.webp","跨多设备同步的 Obsidian 本地知识库的插图","max-width: 667px; width: 100%; height: auto;",[430,2657,2658,2659,2664],{},"市面上有很多针对 Obsidian 的同步方案，但在冲突处理、加密和数据自主权方面，它们或多或少都做出了一些妥协。",[444,2660,2663],{"href":2661,"rel":2662},"https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch",[448],"Synch"," 是一款开源应用，它可以在自建服务器上实现具备端到端加密和冲突解决机制的 Obsidian 知识库同步。",[430,2666,2667,2668,2673],{},"虽然 Obsidian 的本地优先方案在绝大多数情况下都能完美工作，但在某些场景下，我们可能仍需要通过网页浏览器远程访问并编辑笔记。",[444,2669,2672],{"href":2670,"rel":2671},"https:\u002F\u002Fgithub.com\u002FNystik-gh\u002Fignis",[448],"Ignis"," 是一款开源应用，它能够在网页浏览器中以接近原生的体验运行 Obsidian，让您能够直接读取和编辑知识库。",[430,2675,2676,2677,2680,2681,1859,2683,2685,2686,2690],{},"在本文中，我们将在一台 ",[441,2678,2679],{},"VPS","（虚拟专用服务器）上部署 ",[441,2682,2663],{},[441,2684,2672],{},"，并将它们安全地托管在 ",[441,2687,2688],{},[444,2689,1749],{"href":363}," 私有网络中，而无需将它们直接暴露在公网上。",[433,2692],{"src":2693,"alt":2694,"style":2695},"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;",[463,2697],{"description":2698,"image":2699,"image-alt":2700,"label":2701,"min-read":2702,"title":2703,"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",[474,2705,2707],{"id":2706},"使用-synch-安全同步-obsidian-知识库","使用 Synch 安全同步 Obsidian 知识库",[430,2709,2710,2712],{},[441,2711,2663],{}," 提供以下特性：",[484,2714,2715,2718,2721,2724],{},[487,2716,2717],{},"检测到更改时立即实时同步您的知识库",[487,2719,2720],{},"并在上传前对知识库数据进行端到端加密",[487,2722,2723],{},"支持从历史版本记录中进行恢复",[487,2725,2726],{},"内置自动冲突解决机制",[430,2728,2729,2731,2732,2735,2736,2739,2740,2742],{},[441,2730,2663],{}," 会在您的本地设备上生成一个随机的 32 字节",[441,2733,2734],{},"知识库密钥","（Vault Key），该密钥专门用于加密您的知识库数据。当您创建远程知识库时，您需要设置一个",[441,2737,2738],{},"知识库密码","。该密码用于保护您的",[441,2741,2734],{},"，以便能够将密钥安全地存储在服务器上，并在其他设备上进行解密。",[430,2744,2745],{},"笔记的冲突解决是在客户端设备上完成的，而不是在服务器端。如果两台设备同时编辑同一个笔记，服务器会保留最先到达的版本，并通知另一台设备其本地版本已过时。随后，该设备会自动将服务器上的最新版本与其本地更改进行合并，然后再将合并后的最终笔记上传。",[892,2747,2749],{"id":2748},"在您的-vps-上部署-synch","在您的 VPS 上部署 Synch",[2182,2751,2752],{"id":2752},"创建域名解析",[430,2754,2755,2756,2759],{},"在 Cloudflare 中创建一条 A 记录，并将其代理状态设置为",[441,2757,2758],{},"仅限 DNS","（绕过 Cloudflare CDN）。",[433,2761],{"src":2762,"alt":2763,"style":2764},"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;",[2182,2766,2768],{"id":2767},"在-ubuntu-上使用-docker-安装-synch","在 Ubuntu 上使用 Docker 安装 Synch",[2770,2771,2772],"h5",{"id":2772},"克隆仓库",[936,2774,2776],{"className":1045,"code":2775,"language":1047,"meta":425,"style":425},"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",[494,2777,2778,2792,2797,2802,2810,2814,2819],{"__ignoreMap":425},[944,2779,2780,2783,2786,2789],{"class":946,"line":947},[944,2781,2782],{"class":1054},"git",[944,2784,2785],{"class":1058}," clone",[944,2787,2788],{"class":1058}," https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git",[944,2790,2791],{"class":954},"       \n",[944,2793,2794],{"class":946,"line":1074},[944,2795,2796],{"class":954},"        \n",[944,2798,2799],{"class":946,"line":1081},[944,2800,2801],{"class":1084},"# Navigate to the API folder\n",[944,2803,2804,2807],{"class":946,"line":1088},[944,2805,2806],{"class":976},"cd",[944,2808,2809],{"class":1058}," synch\u002Fapps\u002Fapi\n",[944,2811,2812],{"class":946,"line":1948},[944,2813,2796],{"class":954},[944,2815,2816],{"class":946,"line":1953},[944,2817,2818],{"class":1084},"# Copy the example environment file:\n",[944,2820,2821,2824,2827],{"class":946,"line":1959},[944,2822,2823],{"class":1054},"cp",[944,2825,2826],{"class":1058}," .env.example",[944,2828,2829],{"class":1058}," .env\n",[2770,2831,2833,2834,2837],{"id":2832},"编辑-env-环境变量","编辑 ",[494,2835,2836],{},".env"," 环境变量",[484,2839,2840,2846,2864],{},[487,2841,2842,2845],{},[494,2843,2844],{},"PUBLIC_URL=synch.pafor.me","：输入您的 Synch 服务器公网域名（即在上一步中创建的域名）。",[487,2847,2848,1859,2851,2854,2855,2859,2860,2863],{},[494,2849,2850],{},"BETTER_AUTH_SECRET",[494,2852,2853],{},"SYNC_TOKEN_SECRET","：请使用此 ",[444,2856,2858],{"href":2857},"\u002Fzh\u002Ftools\u002Fsecret-key-hex","在线秘钥生成工具"," 或在终端中运行两次 ",[494,2861,2862],{},"openssl rand -hex 32"," 来生成高强度的随机秘钥。",[487,2865,2866,2869],{},[494,2867,2868],{},"AUTH_ALLOWED_EMAILS","：允许注册并创建账户的邮箱地址列表（用英文逗号分隔）。",[2770,2871,2873],{"id":2872},"将域名添加至-caddyfile","将域名添加至 Caddyfile",[430,2875,2876,2877,1807],{},"有关如何将 Cloudflare DNS 模块集成到 Caddy 中并使用 Docker 容器启动的详细配置方法，请参阅我们的 ",[444,2878,2880],{"href":2879},"\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#_4-enable-https-with-caddy","自建 Buzz 协作平台文章",[463,2882],{"description":2883,"image":2884,"image-alt":2885,"label":2886,"min-read":469,"title":455,"to":2879},"学习如何在 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 证书的自动申请与管理","自建指南",[430,2888,2889,2890,2893],{},"在您的 Caddyfile 中添加 ",[494,2891,2892],{},"SYNCH_DOMAIN"," 配置，并将其反向代理指向 8787 端口（Synch 容器内部运行的端口）：",[936,2895,2899],{"className":2896,"code":2897,"language":2898,"meta":425,"style":425},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n\n{$SYNCH_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:8787\n}\n","json",[494,2900,2901,2906,2914,2918,2922,2936,2941,2952],{"__ignoreMap":425},[944,2902,2903],{"class":946,"line":947},[944,2904,2905],{"class":958},"{\n",[944,2907,2908,2911],{"class":946,"line":1074},[944,2909,2910],{"class":954},"  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN",[944,2912,2913],{"class":958},"}\n",[944,2915,2916],{"class":946,"line":1081},[944,2917,2913],{"class":954},[944,2919,2920],{"class":946,"line":1088},[944,2921,1078],{"emptyLinePlaceholder":1077},[944,2923,2924,2927,2930,2933],{"class":946,"line":1948},[944,2925,2926],{"class":958},"{",[944,2928,2929],{"class":954},"$SYNCH_DOMAIN",[944,2931,2932],{"class":958},"}",[944,2934,2935],{"class":958}," {\n",[944,2937,2938],{"class":946,"line":1953},[944,2939,2940],{"class":954},"  encode zstd gzip\n",[944,2942,2943,2946,2948],{"class":946,"line":1959},[944,2944,2945],{"class":954},"  reverse_proxy host.docker.internal",[944,2947,1375],{"class":958},[944,2949,2951],{"class":2950},"sbssI","8787\n",[944,2953,2954],{"class":946,"line":2294},[944,2955,2913],{"class":958},[430,2957,2958],{},"启动容器：",[936,2960,2962],{"className":1045,"code":2961,"language":1047,"meta":425,"style":425},"docker compose up -d\n",[494,2963,2964],{"__ignoreMap":425},[944,2965,2966,2968,2970,2973],{"class":946,"line":947},[944,2967,1190],{"class":1054},[944,2969,1193],{"class":1058},[944,2971,2972],{"class":1058}," up",[944,2974,2975],{"class":1058}," -d\n",[430,2977,2978,2979,2982],{},"运行以下 ",[494,2980,2981],{},"curl"," 命令以验证服务的可用性：",[936,2984,2986],{"className":1045,"code":2985,"language":1047,"meta":425,"style":425},"curl https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[494,2987,2988],{"__ignoreMap":425},[944,2989,2990,2992],{"class":946,"line":947},[944,2991,2981],{"class":1054},[944,2993,2994],{"class":1058}," https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[892,2996,2998],{"id":2997},"将-obsidian-客户端连接至您的-synch-服务器","将 Obsidian 客户端连接至您的 Synch 服务器",[2182,3000,3002],{"id":3001},"在-obsidian-中安装-synch-插件","在 Obsidian 中安装 Synch 插件",[430,3004,3005,3006,3009],{},"打开 Obsidian 的“设置”（Settings），导航至“第三方插件”（Community plugins），然后点击 ",[441,3007,3008],{},"“浏览”（Browse）"," 按钮：",[433,3011],{"src":3012,"alt":3013,"style":3014},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-community-plugins-browse.webp","在 Obsidian 设置中浏览第三方社区插件","max-width: 523px; width: 100%; height: auto;",[430,3016,3017,3018,3021,3022],{},"搜索并安装 ",[441,3019,3020],{},"'Synchrun'"," 插件：\n",[433,3023],{"src":3024,"alt":3025,"style":2764},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-install-synchrun-plugin.webp","在 Obsidian 中安装 Synchrun 同步插件",[430,3027,3028,3029,3031,3032,3035,3036,3039,3040,3043,3044,1807],{},"安装完成后，打开 ",[441,3030,3020],{}," 插件设置，并启用 ",[441,3033,3034],{},"“使用自建服务器”（Use a self-hosted server）","。随后，在 ",[441,3037,3038],{},"“服务器 URL”（Server URL）"," 字段中输入 ",[494,3041,3042],{},"https:\u002F\u002Fsynch.pafor.me","，并点击 ",[441,3045,3046],{},"“保存”（Save）",[433,3048],{"src":3049,"alt":3050,"style":3051},"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;",[430,3053,3054,3055,3058,3059,3061,3062,3064],{},"点击 ",[441,3056,3057],{},"“在当前设备上登录”（Sign in on this device）"," 按钮。接着，使用您在 ",[494,3060,2836],{}," 中 ",[494,3063,2868],{}," 列表中指定的邮箱地址进行注册，注册成功后您将看到以下授权页面：",[433,3066],{"src":3067,"alt":3068,"style":3069},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-account-authorization-page.webp","Synchrun 插件的账户授权登录页面","max-width: 494px; width: 100%; height: auto;",[430,3071,3054,3072,3009],{},[441,3073,3074],{},"“允许 Obsidian 登录”（Allow Obsidian sign-in）",[433,3076],{"src":3077,"alt":3078,"style":3079},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-allow-obsidian-signin.webp","允许 Obsidian 通过 Synch 登录","max-width: 498px; width: 100%; height: auto;",[430,3081,3054,3082,3085,3086,3089,3090],{},[441,3083,3084],{},"“返回 Obsidian”（Return to Obsidian）"," 按钮，随后点击 ",[441,3087,3088],{},"“创建知识库”（Create vault）","：\n",[433,3091],{"src":3092,"alt":3093,"style":3094},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-create-remote-vault.webp","在 Synchrun 中创建新的远程同步知识库","max-width: 496px; width: 100%; height: auto;",[430,3096,3097],{},"输入您自定义的知识库名称与高强度密码来创建远程知识库。",[433,3099],{"src":3100,"alt":3101,"style":3102},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-vault-password-setup.webp","为 Obsidian 远程知识库设置高强度安全密码","max-width: 500px; width: 100%; height: auto;",[430,3104,3105],{},"同步过程将立即开始，根据您的知识库文件大小，这可能会需要一些时间。同步完成后，界面将显示您所使用的总存储空间。",[433,3107],{"src":3108,"alt":3109,"style":3110},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-sync-completed-storage.webp","Synchrun 同步完成并显示所使用的总存储空间","max-width: 508px; width: 100%; height: auto;",[474,3112,3114],{"id":3113},"使用-ignis-实现基于浏览器的-obsidian-访问","使用 Ignis 实现基于浏览器的 Obsidian 访问",[430,3116,3117,3119],{},[441,3118,2672],{}," 通过将 Obsidian 的 Electron API 替换为 Web API，使得 Obsidian 的 JavaScript 代码能够直接在标准网页浏览器中运行。您所有的 Markdown 笔记和附件都将直接存储在托管服务器的本地文件系统中。",[430,3121,3122,3123,3128,3129,1807],{},"不过，相比于独立运行的 Obsidian 桌面客户端，网页端还存在一些局限性。由于浏览器沙箱环境的限制，某些依赖于 Electron 或 Node.js 特有 API 的功能或第三方插件将无法正常工作。详情请参阅 Ignis 官方文档中的 ",[444,3124,3127],{"href":3125,"rel":3126},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Flimitations\u002F",[448],"局限性说明"," 以及 ",[444,3130,3133],{"href":3131,"rel":3132},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Fplugin-compatibility\u002F",[448],"插件兼容性列表",[892,3135,3137],{"id":3136},"部署-ignis","部署 Ignis",[430,3139,3140,3141,3143,3144,3147,3148,3151],{},"我们将使用 Docker 在 VPS 上安装 ",[441,3142,2672],{},"，并将其映射挂载到本地的 ",[494,3145,3146],{},".\u002Fvaults"," 文件夹中。随后，我们将在服务器上通过 ",[441,3149,3150],{},"Synch CLI"," 命令行客户端将该本地目录与我们之前设置 of 远程同步知识库进行实时同步。",[430,3153,1329,3154,3156,3157,3161],{},[441,3155,2672],{}," 本身没有内置的身份验证机制，为了确保隐私，我们必须将其安全地隐藏在 ",[441,3158,3159],{},[444,3160,1749],{"href":363}," 私有网络中。",[2182,3163,3165],{"id":3164},"创建-dns-记录","创建 DNS 记录",[433,3167],{"src":3168,"alt":3169,"style":3170},"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;",[2182,3172,2873],{"id":3173},"将域名添加至-caddyfile-1",[430,3175,3176,3177,3180],{},"在您的 Caddyfile 中以相同的方式为 ",[494,3178,3179],{},"obsidian.pafor.me"," 配置反向代理：",[936,3182,3184],{"className":2896,"code":3183,"language":2898,"meta":425,"style":425},"{$OBSIDIAN_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:9898\n}\n",[494,3185,3186,3197,3201,3210],{"__ignoreMap":425},[944,3187,3188,3190,3193,3195],{"class":946,"line":947},[944,3189,2926],{"class":958},[944,3191,3192],{"class":954},"$OBSIDIAN_DOMAIN",[944,3194,2932],{"class":958},[944,3196,2935],{"class":958},[944,3198,3199],{"class":946,"line":1074},[944,3200,2940],{"class":954},[944,3202,3203,3205,3207],{"class":946,"line":1081},[944,3204,2945],{"class":954},[944,3206,1375],{"class":958},[944,3208,3209],{"class":2950},"9898\n",[944,3211,3212],{"class":946,"line":1088},[944,3213,2913],{"class":958},[2182,3215,3217],{"id":3216},"使用-docker-启动-ignis","使用 Docker 启动 Ignis",[430,3219,3220,3221,492],{},"在 VPS 上将以下 Docker Compose 配置保存为 ",[494,3222,3223],{},"ignis-docker-compose.yml",[936,3225,3227],{"className":1359,"code":3226,"language":1361,"meta":425,"style":425},"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",[494,3228,3229,3236,3243,3253,3260,3273,3280,3285,3292,3299,3306,3313,3320,3327,3334,3345,3350,3358],{"__ignoreMap":425},[944,3230,3231,3234],{"class":946,"line":947},[944,3232,3233],{"class":1371},"services",[944,3235,1386],{"class":958},[944,3237,3238,3241],{"class":946,"line":1074},[944,3239,3240],{"class":1371},"  ignis",[944,3242,1386],{"class":958},[944,3244,3245,3248,3250],{"class":946,"line":1081},[944,3246,3247],{"class":1371},"    image",[944,3249,1375],{"class":958},[944,3251,3252],{"class":1058}," nobbe\u002Fignis:latest\n",[944,3254,3255,3258],{"class":946,"line":1088},[944,3256,3257],{"class":1371},"    ports",[944,3259,1386],{"class":958},[944,3261,3262,3265,3268,3271],{"class":946,"line":1948},[944,3263,3264],{"class":958},"      -",[944,3266,3267],{"class":958}," \"",[944,3269,3270],{"class":1058},"9898:8080",[944,3272,1980],{"class":958},[944,3274,3275,3278],{"class":946,"line":1953},[944,3276,3277],{"class":1371},"    environment",[944,3279,1386],{"class":958},[944,3281,3282],{"class":946,"line":1959},[944,3283,3284],{"class":1084},"      # match these to your host user (run: id)\n",[944,3286,3287,3289],{"class":946,"line":2294},[944,3288,3264],{"class":958},[944,3290,3291],{"class":1058}," PUID=1000\n",[944,3293,3294,3296],{"class":946,"line":2305},[944,3295,3264],{"class":958},[944,3297,3298],{"class":1058}," PGID=1000\n",[944,3300,3301,3303],{"class":946,"line":2401},[944,3302,3264],{"class":958},[944,3304,3305],{"class":1058}," WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n",[944,3307,3308,3311],{"class":946,"line":2407},[944,3309,3310],{"class":1371},"    volumes",[944,3312,1386],{"class":958},[944,3314,3315,3317],{"class":946,"line":2413},[944,3316,3264],{"class":958},[944,3318,3319],{"class":1058}," .\u002Fvaults:\u002Fvaults\n",[944,3321,3322,3324],{"class":946,"line":1723},[944,3323,3264],{"class":958},[944,3325,3326],{"class":1058}," .\u002Fdata:\u002Fapp\u002Fdata\n",[944,3328,3329,3331],{"class":946,"line":2423},[944,3330,3264],{"class":958},[944,3332,3333],{"class":1058}," obsidian-app:\u002Fapp\u002Fobsidian-app\n",[944,3335,3337,3340,3342],{"class":946,"line":3336},15,[944,3338,3339],{"class":1371},"    restart",[944,3341,1375],{"class":958},[944,3343,3344],{"class":1058}," unless-stopped\n",[944,3346,3348],{"class":946,"line":3347},16,[944,3349,1078],{"emptyLinePlaceholder":1077},[944,3351,3353,3356],{"class":946,"line":3352},17,[944,3354,3355],{"class":1371},"volumes",[944,3357,1386],{"class":958},[944,3359,3361,3364],{"class":946,"line":3360},18,[944,3362,3363],{"class":1371},"  obsidian-app",[944,3365,1386],{"class":958},[484,3367,3368,3379,3393],{},[487,3369,3370,3371,3374,3375,3378],{},"在主机端使用 ",[494,3372,3373],{},"9898"," 端口，因为 ",[494,3376,3377],{},"8080"," 是一个非常常用且容易冲突的端口。",[487,3380,3381,3382,3385,3386,1859,3389,3392],{},"在您的 VPS 上运行 ",[494,3383,3384],{},"id"," 命令，获取当前主机用户的 ",[494,3387,3388],{},"UID",[494,3390,3391],{},"GID","，并将其填写到配置文件中，以确保文件系统具备正确的读写权限。",[487,3394,3395,3396,3399],{},"配置 ",[494,3397,3398],{},"WS_ORIGINS","，仅允许来自您指定域名的 WebSocket 连接，提高安全性。",[430,3401,3402,3403,3405],{},"启动 ",[441,3404,2672],{}," 容器：",[936,3407,3409],{"className":1045,"code":3408,"language":1047,"meta":425,"style":425},"docker compose -f ignis-docker-compose.yml up -d\n",[494,3410,3411],{"__ignoreMap":425},[944,3412,3413,3415,3417,3420,3423,3425],{"class":946,"line":947},[944,3414,1190],{"class":1054},[944,3416,1193],{"class":1058},[944,3418,3419],{"class":1058}," -f",[944,3421,3422],{"class":1058}," ignis-docker-compose.yml",[944,3424,2972],{"class":1058},[944,3426,2975],{"class":1058},[430,3428,3429,3430,3433,3434,3437],{},"当您在网页浏览器中访问您的域名时，将会弹出 ",[441,3431,3432],{},"'Vault Manager'","（知识库管理器）。由于此时文件夹为空，它不会显示任何本地知识库。在下一节中，我们将配置 ",[441,3435,3436],{},"'Synch CLI'","，从我们之前配置的远程同步服务器中拉取笔记。",[433,3439],{"src":3440,"alt":3441,"style":3442},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-vault-manager-empty.webp","Ignis 网页客户端中当前为空的知识库管理器","max-width: 466px; width: 100%; height: auto;",[2182,3444,3446],{"id":3445},"解决-docker-带来的防火墙失效问题","解决 Docker 带来的防火墙失效问题",[430,3448,3449,3450,3453,3454,3457,3458,3461],{},"默认情况下，Docker 会自动在系统底层插入自己的 DNAT 与 FORWARD 链规则，直接将外部公网流量转发至活动的容器端口。这会完全绕过 Ubuntu 默认的 UFW 或 iptables ",[494,3451,3452],{},"INPUT"," 链防火墙保护。为了阻止外部未经授权的访问并保持容器的绝对私有，我们需要手动将以下规则添加至 ",[494,3455,3456],{},"iptables"," 中的 ",[494,3459,3460],{},"DOCKER-USER"," 链：",[936,3463,3465],{"className":1045,"code":3464,"language":1047,"meta":425,"style":425},"# 阻断所有外部公网流量的直接访问\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",[494,3466,3467,3472,3499,3503,3508],{"__ignoreMap":425},[944,3468,3469],{"class":946,"line":947},[944,3470,3471],{"class":1084},"# 阻断所有外部公网流量的直接访问\n",[944,3473,3474,3476,3479,3482,3485,3488,3491,3494,3497],{"class":946,"line":1074},[944,3475,1916],{"class":1054},[944,3477,3478],{"class":1058}," iptables",[944,3480,3481],{"class":1058}," -I",[944,3483,3484],{"class":1058}," DOCKER-USER",[944,3486,3487],{"class":1058}," -i",[944,3489,3490],{"class":1058}," ext_if",[944,3492,3493],{"class":1058}," -j",[944,3495,3496],{"class":1058}," DROP",[944,3498,2049],{"class":954},[944,3500,3501],{"class":946,"line":1081},[944,3502,1078],{"emptyLinePlaceholder":1077},[944,3504,3505],{"class":946,"line":1088},[944,3506,3507],{"class":1084},"# 仅允许来自您的 Cloudflare WARP 客户端私有 IP 的访问流量\n",[944,3509,3510,3512,3514,3516,3518,3520,3522,3525,3528,3530],{"class":946,"line":1948},[944,3511,1916],{"class":1054},[944,3513,3478],{"class":1058},[944,3515,3481],{"class":1058},[944,3517,3484],{"class":1058},[944,3519,3487],{"class":1058},[944,3521,3490],{"class":1058},[944,3523,3524],{"class":1058}," -s",[944,3526,3527],{"class":2950}," 100.96.0.10",[944,3529,3493],{"class":1058},[944,3531,3532],{"class":1058}," ACCEPT\n",[2182,3534,3536],{"id":3535},"配置-synch-cli-命令行同步工具","配置 Synch CLI 命令行同步工具",[430,3538,3539,3541],{},[441,3540,3150],{}," 是一款无界面的命令行工具，即使在没有安装 Obsidian 桌面应用的远程服务器上，它也能让本地目录与远程知识库进行实时同步。",[430,3543,3544,3545,3548,3549,3551,3552,3555,3556,3128,3559,1536,3562,1859,3565,3568,3569,3572,3573,3576],{},"从您之前克隆的 ",[494,3546,3547],{},"synch"," 仓库源码中构建 ",[441,3550,3150],{},"。构建过程需要 ",[441,3553,3554],{},"Node.js >= 22.5","（因为 CLI 依赖于 ",[494,3557,3558],{},"node:sqlite",[494,3560,3561],{},"fetch",[494,3563,3564],{},"WebSocket",[494,3566,3567],{},"WebCrypto"," 等全局浏览器原生 API）和 ",[441,3570,3571],{},"pnpm","（由于整个仓库是一个使用了 ",[494,3574,3575],{},"pnpm@10.33.0"," 版本管理器的 pnpm 工作区）：",[936,3578,3580],{"className":1045,"code":3579,"language":1047,"meta":425,"style":425},"# 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",[494,3581,3582,3587,3598,3605,3609,3614,3621,3625,3630,3643,3647,3652,3663,3692,3696,3701],{"__ignoreMap":425},[944,3583,3584],{"class":946,"line":947},[944,3585,3586],{"class":1084},"# Check versions\n",[944,3588,3589,3592,3595],{"class":946,"line":1074},[944,3590,3591],{"class":1054},"node",[944,3593,3594],{"class":1058}," --version",[944,3596,3597],{"class":1084},"   # must be >= 22.5\n",[944,3599,3600,3602],{"class":946,"line":1081},[944,3601,3571],{"class":1054},[944,3603,3604],{"class":1058}," --version\n",[944,3606,3607],{"class":946,"line":1088},[944,3608,1078],{"emptyLinePlaceholder":1077},[944,3610,3611],{"class":946,"line":1948},[944,3612,3613],{"class":1084},"# In the repos root\n",[944,3615,3616,3618],{"class":946,"line":1953},[944,3617,3571],{"class":1054},[944,3619,3620],{"class":1058}," install\n",[944,3622,3623],{"class":946,"line":1959},[944,3624,1078],{"emptyLinePlaceholder":1077},[944,3626,3627],{"class":946,"line":2294},[944,3628,3629],{"class":1084},"# Build the CLI bundle\n",[944,3631,3632,3634,3637,3640],{"class":946,"line":2305},[944,3633,3571],{"class":1054},[944,3635,3636],{"class":1058}," -C",[944,3638,3639],{"class":1058}," apps\u002Fcli",[944,3641,3642],{"class":1058}," build\n",[944,3644,3645],{"class":946,"line":2401},[944,3646,1078],{"emptyLinePlaceholder":1077},[944,3648,3649],{"class":946,"line":2407},[944,3650,3651],{"class":1084},"# After a successful build you have `apps\u002Fcli\u002Fdist\u002Fsynch.js`. Make it executable and put it on your PATH\n",[944,3653,3654,3657,3660],{"class":946,"line":2413},[944,3655,3656],{"class":1054},"chmod",[944,3658,3659],{"class":1058}," +x",[944,3661,3662],{"class":1058}," apps\u002Fcli\u002Fdist\u002Fsynch.js\n",[944,3664,3665,3668,3671,3673,3676,3679,3682,3684,3687,3690],{"class":946,"line":1723},[944,3666,3667],{"class":1054},"ln",[944,3669,3670],{"class":1058}," -sf",[944,3672,3267],{"class":958},[944,3674,3675],{"class":954},"$PWD",[944,3677,3678],{"class":1058},"\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js",[944,3680,3681],{"class":958},"\"",[944,3683,3267],{"class":958},[944,3685,3686],{"class":954},"$HOME",[944,3688,3689],{"class":1058},"\u002F.local\u002Fbin\u002Fsynch",[944,3691,1980],{"class":958},[944,3693,3694],{"class":946,"line":2423},[944,3695,1078],{"emptyLinePlaceholder":1077},[944,3697,3698],{"class":946,"line":3336},[944,3699,3700],{"class":1084},"# Verification\n",[944,3702,3703,3705],{"class":946,"line":3347},[944,3704,3547],{"class":1054},[944,3706,3707],{"class":1058}," --help\n",[430,3709,3710,3711,3714],{},"由于 Synch CLI 运行在与您的 Synch remote 虚拟同步服务端相同的 VPS 上，它能够直接自动连接至本地的 API 服务端口。如果您将它们部署在不同的服务器上，请运行 ",[494,3712,3713],{},"synch login --api-url \u003Cremote-synch-api-url>"," 来手动定义您的远程目标 API 端点。",[430,3716,3717],{},[433,3718],{"alt":3719,"src":3720},"在终端中输入自定义 API URL 运行 synch login 登录命令","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-api-url-terminal.webp",[430,3722,3723,3724,3727],{},"在您的 VPS 终端中运行 ",[494,3725,3726],{},"synch login"," 命令，您将获得一个用于身份验证的登录 URL：",[430,3729,3730],{},[433,3731],{"alt":3732,"src":3733},"终端输出显示的 Synch CLI 认证 URL","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-auth-url-terminal.webp",[430,3735,3736],{},"使用与您在 Obsidian 桌面端 Synchrun 插件中注册的相同邮箱地址，通过该网页链接进行登录授权。",[430,3738,3739],{},[433,3740],{"alt":3741,"src":3742},"Synch CLI 授权网页端登录成功","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-web-login-success.webp",[430,3744,3745,3746,3749],{},"运行 ",[494,3747,3748],{},"synch vault connect --vault ~\u002Fvaults\u002F\u003Cvaultname> --vault-id asadqe-7b29-4677-fsad-234asdafasd"," 来将您 VPS 上的本地知识库目录与远程自建服务器上的知识库进行关联：",[430,3751,3752,3753,3756,3757,3760,3761,3764],{},"您可以通过打开桌面端 Obsidian 中的 ",[441,3754,3755],{},"Synchrun"," 插件设置，点击 ",[441,3758,3759],{},"“管理远程知识库”（Manage remote vaults）"," 来找到您的远程知识库 ID。该操作会打开一个网页并列出您所有的远程知识库，每个库旁边都附带有一个 GUID 格式的唯一标识符（例如：",[494,3762,3763],{},"123e4567-e89b-12d3-a456-426614174000","）：",[430,3766,3767,3772],{},[433,3768],{"src":3769,"alt":3770,"style":3771},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-manage-remote-vaults.webp","在 Synchrun 插件中管理远程知识库","max-width: 582px; width: 100%; height: auto;",[433,3773],{"alt":3774,"src":3775},"在 Synchrun 中定位唯一的远程知识库 ID","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-remote-vault-id.webp",[430,3777,3778,3779,3782],{},"在提示时输入您的知识库密码以确立关联。关联成功后，运行 ",[494,3780,3781],{},"synch sync --vault ~\u002Fvaults\u002F\u003Cvault-name>"," 来进行您的首次全量同步。首次同步根据您的文件大小，可能会耗费一些时间。",[430,3784,3785],{},[433,3786],{"alt":3787,"src":3788},"Synch CLI 中显示首次拉取同步知识库的进度","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-cli-initial-sync-progress.webp",[430,3790,3791,3792,3795,3796,3799],{},"为了让同步全自动进行，我们可以配置并启用一个 ",[494,3793,3794],{},"systemd"," 系统守护服务，在后台持续运行 ",[494,3797,3798],{},"synch watch"," 监听文件变化，以确保 VPS 上的笔记在系统开机时即可实现毫秒级自动同步：",[936,3801,3803],{"className":1045,"code":3802,"language":1047,"meta":425,"style":425},"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",[494,3804,3805,3821,3825,3830,3835,3840,3844,3848,3853,3858,3863,3868,3873,3878,3882,3887,3891,3895,3899,3905,3914],{"__ignoreMap":425},[944,3806,3807,3809,3812,3815,3818],{"class":946,"line":947},[944,3808,1916],{"class":1054},[944,3810,3811],{"class":1058}," tee",[944,3813,3814],{"class":1058}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service",[944,3816,3817],{"class":958}," \u003C\u003C",[944,3819,3820],{"class":958},"'EOF'\n",[944,3822,3823],{"class":946,"line":1074},[944,3824,2359],{"class":1058},[944,3826,3827],{"class":946,"line":1081},[944,3828,3829],{"class":1058},"Description=Synch vault watcher\n",[944,3831,3832],{"class":946,"line":1088},[944,3833,3834],{"class":1058},"After=network-online.target\n",[944,3836,3837],{"class":946,"line":1948},[944,3838,3839],{"class":1058},"Wants=network-online.target\n",[944,3841,3842],{"class":946,"line":1953},[944,3843,1078],{"emptyLinePlaceholder":1077},[944,3845,3846],{"class":946,"line":1959},[944,3847,2378],{"class":1058},[944,3849,3850],{"class":946,"line":2294},[944,3851,3852],{"class":1058},"Type=simple\n",[944,3854,3855],{"class":946,"line":2305},[944,3856,3857],{"class":1058},"User=\u003Cusername>\n",[944,3859,3860],{"class":946,"line":2401},[944,3861,3862],{"class":1058},"ExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\n",[944,3864,3865],{"class":946,"line":2407},[944,3866,3867],{"class":1058},"WorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\n",[944,3869,3870],{"class":946,"line":2413},[944,3871,3872],{"class":1058},"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",[944,3874,3875],{"class":946,"line":1723},[944,3876,3877],{"class":1058},"Environment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\n",[944,3879,3880],{"class":946,"line":2423},[944,3881,2398],{"class":1058},[944,3883,3884],{"class":946,"line":3336},[944,3885,3886],{"class":1058},"RestartSec=5\n",[944,3888,3889],{"class":946,"line":3347},[944,3890,1078],{"emptyLinePlaceholder":1077},[944,3892,3893],{"class":946,"line":3352},[944,3894,2420],{"class":1058},[944,3896,3897],{"class":946,"line":3360},[944,3898,2426],{"class":1058},[944,3900,3902],{"class":946,"line":3901},19,[944,3903,3904],{"class":958},"EOF\n",[944,3906,3908,3910,3912],{"class":946,"line":3907},20,[944,3909,1916],{"class":1054},[944,3911,1919],{"class":1058},[944,3913,2445],{"class":1058},[944,3915,3917,3919,3921,3923,3926],{"class":946,"line":3916},21,[944,3918,1916],{"class":1054},[944,3920,1919],{"class":1058},[944,3922,2046],{"class":1058},[944,3924,3925],{"class":1058}," --now",[944,3927,3928],{"class":1058}," synch-watch.service\n",[430,3930,3931,3932,3934],{},"现在，在浏览器中打开 ",[494,3933,3179],{},"，您会发现其用户界面和排版布局与桌面端原生 App 几乎完全一致：",[433,3936],{"src":3937,"alt":3938,"style":3939},"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;",[430,3941,3942],{},"点击左下角的设置图标可以发现，除了需要手动重新安装第三方社区插件外，几乎所有的 Obsidian 核心配置与功能均已完美保留：",[433,3944],{"src":3945,"alt":3946,"style":3947},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-settings-community-plugins.webp","Ignis 网页界面中的社区第三方插件设置","max-width: 597px; width: 100%; height: auto;",[430,3949,3950],{},"为了测试整个同步闭环，您可以通过 Ignis 网页端直接新建一篇笔记：",[433,3952],{"src":3953,"alt":3954,"style":3947},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-create-new-note-web.webp","通过 Ignis 网页界面新建一篇 Markdown 笔记",[430,3956,3957,3958,3960],{},"该笔记会立即被同步回您的 Obsidian 桌面客户端。需要注意的是，空白文件夹不会在 ",[441,3959,2672],{}," 网页端中显示。",[433,3962],{"src":3963,"alt":3964,"style":3965},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-desktop-synced-note.webp","新创建的笔记已成功同步到本地 Obsidian 桌面客户端","max-width: 502px; width: 100%; height: auto;",[430,3967,3968,3969,3971],{},"在移动端手机浏览器上访问 ",[494,3970,3179],{}," 的实际效果：",[430,3973,3974,3979],{},[433,3975],{"src":3976,"alt":3977,"style":3978},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-sidebar.webp","在移动端手机浏览器上访问 Ignis 网页客户端的侧边栏菜单","max-width: 269px; width: 100%; height: auto;",[433,3980],{"src":3981,"alt":3982,"style":3978},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-editor.webp","在移动端手机浏览器上访问 Ignis 网页客户端的 Markdown 编辑器",[430,3984,3985,3986,3988,3989,3992],{},"当您在 ",[441,3987,2672],{}," 网页端中删除笔记时，它们会被安全地移至本地知识库的 ",[494,3990,3991],{},"~\u002Fvaults\u002F\u003Cvault-name>\u002F.trash"," 垃圾桶文件夹中，以防误删。",[474,3994,3996],{"id":3995},"自建-obsidian-同步服务的一些结语","自建 Obsidian 同步服务的一些结语",[430,3998,3999,4000,575,4002,4004,4005,4007],{},"通过将 ",[441,4001,2663],{},[441,4003,2672],{}," 结合，您可以使用完全处于自己掌控之下的 VPS 服务器硬件，无缝地实现 Obsidian 笔记库的多端同步与网页端访问。而将这些服务整体托管于 ",[441,4006,1749],{}," 私有网络之中，又为您提供了极致的安全物理边界，从根本上阻断了公网暴露带来的安全隐患。",[430,4009,4010,4011,4013],{},"当然，",[441,4012,2672],{}," 的初衷 spiritual 并客套不是为了完全替代本地的 Obsidian 桌面客户端。相反，它更像是一个极其便利的临时桥梁，供您在没有携带主力电脑时，能够随时随地通过任意浏览器快速存取和编辑自己的笔记。对于日常高强度的写作与重度笔记库管理，本地原生客户端仍然是更加舒适、高效的选择。",[430,4015,4016,4017,4020],{},"由于 Synch 采用了坚固的端到端加密机制，您的远程知识库密码必须具备足够强的复杂度以抵御暴力破解攻击。同时，请务必牢记该密码，因为同步服务端不会存储任何未加密的",[441,4018,4019],{},"知识库秘钥","。一旦遗忘该密码，您的全部笔记数据将彻底无法恢复。此外，由于所有数据均保存在您的自建 VPS 上，您需要自行承担并妥善做好服务器的主机安全防护、以及自动快照与备份管理。",[430,4022,4023,4024,4026],{},"尽管 ",[441,4025,2663],{}," 内置了加密的历史版本管理和已删除文件恢复机制，能为您规避绝大多数意外数据丢失，但为了万无一失，我们依然强烈建议您在第三方物理介质上定期保留一份独立的 Obsidian 知识库离线备份。",[474,4028,4030],{"id":4029},"references","References",[484,4032,4033,4040,4047],{},[487,4034,4035],{},[444,4036,4039],{"href":4037,"rel":4038},"https:\u002F\u002Fsynch.run\u002Fself-hosting-docker\u002F",[448],"Synch Deploy with Docker Compose",[487,4041,4042],{},[444,4043,4046],{"href":4044,"rel":4045},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fserver\u002Fdeploy\u002F",[448],"Ignis Deploy with Docker",[487,4048,4049],{},[444,4050,4053],{"href":4051,"rel":4052},"https:\u002F\u002Fsynch.run\u002Fblog\u002Fencryption-and-decryption\u002F",[448],"How does end-to-end encryption work in Synch?",[1667,4055,4056],{},"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":425,"searchDepth":1074,"depth":1081,"links":4058},[4059,4068,4077,4078],{"id":2706,"depth":1074,"text":2707,"children":4060},[4061,4065],{"id":2748,"depth":1081,"text":2749,"children":4062},[4063,4064],{"id":2752,"depth":1088,"text":2752},{"id":2767,"depth":1088,"text":2768},{"id":2997,"depth":1081,"text":2998,"children":4066},[4067],{"id":3001,"depth":1088,"text":3002},{"id":3113,"depth":1074,"text":3114,"children":4069},[4070],{"id":3136,"depth":1081,"text":3137,"children":4071},[4072,4073,4074,4075,4076],{"id":3164,"depth":1088,"text":3165},{"id":3173,"depth":1088,"text":2873},{"id":3216,"depth":1088,"text":3217},{"id":3445,"depth":1088,"text":3446},{"id":3535,"depth":1088,"text":3536},{"id":3995,"depth":1074,"text":3996},{"id":4029,"depth":1074,"text":4030},[4080],"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":4086,"robots":1721,"sitemap":4090},[4087,4089],{"@type":4088,"headline":2645,"description":4082,"image":4083},"Article",{"@type":1700,"name":2645,"description":4082,"image":4083},{"lastmod":4091},"2026-09-16",{"title":4093,"description":4082,"ogTitle":2645,"ogDescription":4082,"twitterTitle":2645,"twitterDescription":4082},"基于自建 Synch 与 Ignis 实现 Obsidian 跨设备安全同步","zh\u002Farticle\u002Fsync-obsidian-across-devices",[4096,4097,4098,2639],"自建服务","Obsidian","云端同步","qUymzYxHVbtcLzhIfa6H_SfwK2NWnW9W0EcGJC30Pbc",{"id":4101,"title":455,"author":425,"body":4102,"category":6232,"date":6233,"description":465,"extension":1692,"image":466,"imageAlt":467,"isPublished":1077,"meta":6234,"minRead":2407,"navigation":1077,"path":331,"seo":6256,"stem":6258,"tags":6259,"updatedAt":1730,"__hash__":6263},"article\u002Fzh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md",{"type":427,"value":4103,"toc":6202},[4104,4107,4113,4118,4122,4125,4163,4167,4173,4211,4215,4219,4233,4239,4243,4247,4251,4264,4270,4319,4345,4349,4357,4363,4367,4370,4580,4584,4624,4629,4636,4644,4694,4700,4729,4733,4737,4756,4782,4795,4837,4845,5116,5120,5163,5168,5175,5179,5183,5207,5210,5216,5222,5226,5233,5239,5242,5248,5255,5279,5286,5292,5295,5301,5305,5308,5311,5314,5320,5323,5329,5335,5341,5346,5350,5361,5368,5374,5377,5383,5386,5393,5399,5405,5409,5417,5481,5490,5545,5548,5618,5624,5638,5644,5648,5693,5699,5702,5708,5711,5717,5721,5738,5754,5760,5857,5860,5866,5877,5923,5929,5935,5948,5964,5967,5973,5977,5984,6006,6016,6114,6124,6130,6137,6143,6146,6152,6155,6161,6163,6166,6169,6199],[430,4105,4106],{},"在与多个 AI 智能体（AI Agent）协同工作时，最让人头疼的障碍莫过于“上下文断片化（Context Fragmentation）”。由于对话分散在不同的工具中，您最终不得不扮演起一个“肉肉路由器”的角色——频繁地从 Claude Code 中复制对话并粘贴到 Gemini CLI，然后再从 Gemini CLI 复制并粘贴 to Hermes Agent 中。而当您身边还有人类团队成员一起协作时，这种繁琐的摩擦感更是成倍增长。",[430,4108,4109],{},[433,4110],{"alt":4111,"src":4112},"Buzz 协作工作空间的用户界面，显示聊天频道和活跃的 AI 智能体","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-workspace-interface.webp",[430,4114,4115,4117],{},[441,4116,1115],{}," 是一款开源的协同工作空间，它将人类团队和 AI 智能体凝聚在一个统一的环境中。在这里，人类同事与 AI 智能体能够共享相同的任务和项目历史，并实现天衣无缝的工作交接。",[474,4119,4121],{"id":4120},"什么是-block-旗下的-buzz人机协同的-ai-智能体共享空间","什么是 Block 旗下的 Buzz？人机协同的 AI 智能体共享空间",[430,4123,4124],{},"Buzz 是 Block 公司（由推特创始人杰克·多西创立）推出的开源协作工作空间，它让团队成员和 AI 智能体能够在相同的频道与项目中并肩工作。它具有以下几个核心亮点：",[484,4126,4127,4133,4139,4145,4151,4157],{},[487,4128,4129,4132],{},[441,4130,4131],{},"共享上下文："," 频道是团队成员与智能体开展协作的核心阵地。所有的对话记录和项目历史都完整保留在频道中。",[487,4134,4135,4138],{},[441,4136,4137],{},"智能体间通信："," 智能体之间能够跨机器直接进行交流。一个 AI 智能体可以 @ 另一个智能体，从而完成工作的转交或代码的交叉审查。",[487,4140,4141,4144],{},[441,4142,4143],{},"提及驱动激活："," AI 智能体仅在被 @ 提及时才会激活，平时则保持静默。被提及时，智能体将读取频道中的相关上下文并开始工作。",[487,4146,4147,4150],{},[441,4148,4149],{},"统一身份系统："," 团队成员与 AI 智能体使用同一套身份系统，并通过加密私钥\u002F公钥进行安全认证。",[487,4152,4153,4156],{},[441,4154,4155],{},"委派命令："," 您可以向人类同事授予指挥您的智能体的权限，让整个团队都能轻松指派和调用彼此的数字助手。",[487,4158,4159,4162],{},[441,4160,4161],{},"自托管服务器："," 因为您是该服务器的托管者，所以您的数据完全由您掌控。您可以自由决定谁能加入，并定义专属的运行规则。",[474,4164,4166],{"id":4165},"基于-nostr-的加密级-buzz-架构解析","基于 Nostr 的加密级 Buzz 架构解析",[430,4168,4169],{},[433,4170],{"alt":4171,"src":4172},"基于 Nostr 协议的 Buzz 协作空间加密级架构拓扑图","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-nostr-cryptographic-architecture.webp",[484,4174,4175,4181,4187,4193,4199,4205],{},[487,4176,4177,4180],{},[441,4178,4179],{},"Nostr 中继器充当服务器："," 消息、工作流、代码仓库以及其他事件都经过加密签名和验证，并存储在 Nostr 中继服务器（Relay）上。Nostr 协议原生支持通过 WebSockets 和 REST API 进行通信。",[487,4182,4183,4186],{},[441,4184,4185],{},"统一加密身份："," 人类和智能体都使用各自的加密密钥进行认证。此身份完全保留在客户端，绝不会存储在服务器上。",[487,4188,4189,4192],{},[441,4190,4191],{},"一等公民级智能体："," 每个智能体都拥有独立的身份、频道成员资格和审计跟踪（Audit Trail）。智能体使用智能体通信协议（ACP）连接到工作空间。",[487,4194,4195,4198],{},[441,4196,4197],{},"去中心化 Git 仓库："," 代码库存储在兼容 S3 的对象存储中，而任务、拉取请求（PR）和代码审查则在 Nostr 事件日志中进行追踪。因此，Buzz 的 Git 仓库实际上是托管在 Nostr 中继器上，而非 GitHub。",[487,4200,4201,4204],{},[441,4202,4203],{},"Buzz 客户端属于 Nostr 客户端："," Buzz 应用与 Nostr 中继器是分离的；它是一个桌面或移动端客户端，负责连接到中继器的 URL 节点。",[487,4206,4207,4210],{},[441,4208,4209],{},"基础技术栈："," 由 PostgreSQL 数据库处理事件存储与全文检索，Redis 负责管理发布\u002F订阅（Pub\u002FSub）消息队列，而兼容 S3 的 MinIO 用于存储媒体文件。",[474,4212,4214],{"id":4213},"如何在-linux-vps-上部署自托管的-block-旗下-buzz","如何在 Linux VPS 上部署自托管的 Block 旗下 Buzz",[892,4216,4218],{"id":4217},"_0-prerequisites","0. Prerequisites",[484,4220,4221,4224,4227,4230],{},[487,4222,4223],{},"一台 Linux VPS",[487,4225,4226],{},"域名已指向您的服务器 IP 地址",[487,4228,4229],{},"Docker 以及 Docker Compose 插件",[487,4231,4232],{},"Cloudflare 账户（免费服务计划）",[430,4234,4235,4236,4238],{},"在本指南中，我们将把 Nostr 中继器部署在 Ubuntu VPS 上，并通过 ",[444,4237,1734],{"href":363}," 保护其安全。整个基础技术栈包含 Docker Compose 中的四个服务：中继器（relay）、PostgreSQL、Redis 和 MinIO，并使用 Caddy 来提供 HTTPS 支持。",[463,4240],{"description":4241,"image":2628,"image-alt":4242,"label":2701,"min-read":2702,"title":1734,"to":363},"了解如何利用 Cloudflare WARP 和 Zero Trust（零信任）在不开放入站防火墙端口的情况下，安全地在全球范围内暴露和访问您的 Hermes Agent。","使用 Cloudflare Zero Trust 和 WARP 隧道安全地将 Hermes Agent 暴露到私有网络",[892,4244,4246],{"id":4245},"_1-cloudflare-dns-与-api-令牌","1. Cloudflare DNS 与 API 令牌",[2182,4248,4250],{"id":4249},"创建-cloudflare-api-令牌token","创建 Cloudflare API 令牌（Token）",[532,4252,4253,4259],{},[487,4254,4255,4256,1807],{},"点击右上角的个人头像，并在下拉菜单中选择 ",[441,4257,4258],{},"Profile",[487,4260,3054,4261,1807],{},[441,4262,4263],{},"API Tokens",[430,4265,4266],{},[433,4267],{"alt":4268,"src":4269},"Cloudflare 用户个人资料页面，显示 API 令牌创建菜单","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-profile-api-tokens.webp",[532,4271,4272,4278,4284,4304,4309,4313,4316],{"start":1081},[487,4273,3054,4274,4277],{},[441,4275,4276],{},"Create Token"," 按钮。",[487,4279,4280,4281,1807],{},"选择使用模板 ",[441,4282,4283],{},"Edit zone DNS",[487,4285,4286,4287],{},"配置模版如下：\n",[484,4288,4289,4295],{},[487,4290,4291,4294],{},[441,4292,4293],{},"Permissions",": Zone — DNS — Edit",[487,4296,4297,4300,4301],{},[441,4298,4299],{},"Zone Resources",": Include — Specific zone — ",[494,4302,4303],{},"example.com",[487,4305,3054,4306,1807],{},[441,4307,4308],{},"Continue to summary",[487,4310,3054,4311,1807],{},[441,4312,4276],{},[487,4314,4315],{},"拷贝生成的 API 令牌，因为页面关闭后它将不再显示。",[487,4317,4318],{},"在终端中验证生成的令牌，确保其能正常工作：",[936,4320,4322],{"className":1045,"code":4321,"language":1047,"meta":425,"style":425},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[494,4323,4324],{"__ignoreMap":425},[944,4325,4326,4328,4330,4333,4335,4338,4340,4343],{"class":946,"line":947},[944,4327,2981],{"class":1054},[944,4329,3267],{"class":958},[944,4331,4332],{"class":1058},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[944,4334,3681],{"class":958},[944,4336,4337],{"class":1058}," -H",[944,4339,3267],{"class":958},[944,4341,4342],{"class":1058},"Authorization: Bearer YOUR_TOKEN_HERE",[944,4344,1980],{"class":958},[2182,4346,4348],{"id":4347},"dns-解析记录","DNS 解析记录",[484,4350,4351],{},[487,4352,4353,4354,4356],{},"创建一条 A 记录，并将代理状态设置为 ",[441,4355,2758],{},"（DNS only）。",[430,4358,4359],{},[433,4360],{"alt":4361,"src":4362},"在 Cloudflare 控制台中配置 Buzz 域名的 DNS A 记录，并将代理状态设置为仅限 DNS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-dns-a-record-configuration.webp",[892,4364,4366],{"id":4365},"_2-在-ubuntu-上安装-docker","2. 在 Ubuntu 上安装 Docker",[430,4368,4369],{},"运行以下命令在 Ubuntu 上安装 Docker：",[936,4371,4373],{"className":1045,"code":4372,"language":1047,"meta":425,"style":425},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Start automatically when the system boots\nsudo systemctl enable docker\n\n# Verify docker is installed\ndocker --version\n\nsudo apt install -y docker-compose-plugin\n\n# Verify the compose plugin is installed\ndocker compose version\n\n",[494,4374,4375,4380,4408,4412,4417,4459,4463,4468,4478,4482,4487,4508,4512,4517,4528,4532,4537,4543,4547,4561,4565,4570],{"__ignoreMap":425},[944,4376,4377],{"class":946,"line":947},[944,4378,4379],{"class":1084},"# Add Docker's official GPG key and set up the Docker repository\n",[944,4381,4382,4384,4387,4390,4393,4396,4399,4402,4405],{"class":946,"line":1074},[944,4383,2981],{"class":1054},[944,4385,4386],{"class":1058}," -fsSL",[944,4388,4389],{"class":1058}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[944,4391,4392],{"class":958}," |",[944,4394,4395],{"class":1054}," sudo",[944,4397,4398],{"class":1058}," gpg",[944,4400,4401],{"class":1058}," --dearmor",[944,4403,4404],{"class":1058}," -o",[944,4406,4407],{"class":1058}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[944,4409,4410],{"class":946,"line":1081},[944,4411,1078],{"emptyLinePlaceholder":1077},[944,4413,4414],{"class":946,"line":1088},[944,4415,4416],{"class":1084},"# Add the official Docker repository\n",[944,4418,4419,4422,4424,4427,4430,4433,4436,4439,4442,4444,4446,4448,4450,4453,4456],{"class":946,"line":1948},[944,4420,4421],{"class":976},"echo",[944,4423,3267],{"class":958},[944,4425,4426],{"class":1058},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[944,4428,4429],{"class":958},"$(",[944,4431,4432],{"class":1054},"lsb_release",[944,4434,4435],{"class":1058}," -cs",[944,4437,4438],{"class":958},")",[944,4440,4441],{"class":1058}," stable",[944,4443,3681],{"class":958},[944,4445,4392],{"class":958},[944,4447,4395],{"class":1054},[944,4449,3811],{"class":1058},[944,4451,4452],{"class":1058}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[944,4454,4455],{"class":958}," >",[944,4457,4458],{"class":1058}," \u002Fdev\u002Fnull\n",[944,4460,4461],{"class":946,"line":1953},[944,4462,1078],{"emptyLinePlaceholder":1077},[944,4464,4465],{"class":946,"line":1959},[944,4466,4467],{"class":1084},"# Update package list\n",[944,4469,4470,4472,4475],{"class":946,"line":2294},[944,4471,1916],{"class":1054},[944,4473,4474],{"class":1058}," apt",[944,4476,4477],{"class":1058}," update\n",[944,4479,4480],{"class":946,"line":2305},[944,4481,1078],{"emptyLinePlaceholder":1077},[944,4483,4484],{"class":946,"line":2401},[944,4485,4486],{"class":1084},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[944,4488,4489,4491,4493,4496,4499,4502,4505],{"class":946,"line":2407},[944,4490,1916],{"class":1054},[944,4492,4474],{"class":1058},[944,4494,4495],{"class":1058}," install",[944,4497,4498],{"class":1058}," docker-ce",[944,4500,4501],{"class":1058}," docker-ce-cli",[944,4503,4504],{"class":1058}," containerd.io",[944,4506,4507],{"class":1058}," -y\n",[944,4509,4510],{"class":946,"line":2413},[944,4511,1078],{"emptyLinePlaceholder":1077},[944,4513,4514],{"class":946,"line":1723},[944,4515,4516],{"class":1084},"# Start automatically when the system boots\n",[944,4518,4519,4521,4523,4525],{"class":946,"line":2423},[944,4520,1916],{"class":1054},[944,4522,1919],{"class":1058},[944,4524,2046],{"class":1058},[944,4526,4527],{"class":1058}," docker\n",[944,4529,4530],{"class":946,"line":3336},[944,4531,1078],{"emptyLinePlaceholder":1077},[944,4533,4534],{"class":946,"line":3347},[944,4535,4536],{"class":1084},"# Verify docker is installed\n",[944,4538,4539,4541],{"class":946,"line":3352},[944,4540,1190],{"class":1054},[944,4542,3604],{"class":1058},[944,4544,4545],{"class":946,"line":3360},[944,4546,1078],{"emptyLinePlaceholder":1077},[944,4548,4549,4551,4553,4555,4558],{"class":946,"line":3901},[944,4550,1916],{"class":1054},[944,4552,4474],{"class":1058},[944,4554,4495],{"class":1058},[944,4556,4557],{"class":1058}," -y",[944,4559,4560],{"class":1058}," docker-compose-plugin\n",[944,4562,4563],{"class":946,"line":3907},[944,4564,1078],{"emptyLinePlaceholder":1077},[944,4566,4567],{"class":946,"line":3916},[944,4568,4569],{"class":1084},"# Verify the compose plugin is installed\n",[944,4571,4573,4575,4577],{"class":946,"line":4572},22,[944,4574,1190],{"class":1054},[944,4576,1193],{"class":1058},[944,4578,4579],{"class":1058}," version\n",[892,4581,4583],{"id":4582},"_3-克隆仓库并进行配置","3. 克隆仓库并进行配置",[936,4585,4587],{"className":1045,"code":4586,"language":1047,"meta":425,"style":425},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[494,4588,4589,4598,4602,4609,4617],{"__ignoreMap":425},[944,4590,4591,4593,4595],{"class":946,"line":947},[944,4592,2782],{"class":1054},[944,4594,2785],{"class":1058},[944,4596,4597],{"class":1058}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[944,4599,4600],{"class":946,"line":1074},[944,4601,1078],{"emptyLinePlaceholder":1077},[944,4603,4604,4606],{"class":946,"line":1081},[944,4605,2806],{"class":976},[944,4607,4608],{"class":1058}," buzz\u002Fdeploy\u002Fcompose\n",[944,4610,4611,4613,4615],{"class":946,"line":1088},[944,4612,2823],{"class":1054},[944,4614,2826],{"class":1058},[944,4616,2829],{"class":1058},[944,4618,4619,4622],{"class":946,"line":1948},[944,4620,4621],{"class":1054},"nano",[944,4623,2829],{"class":1058},[430,4625,2833,4626,4628],{},[494,4627,2836],{}," 文件：",[484,4630,4631],{},[487,4632,4633],{},[441,4634,4635],{},"域名配置:",[936,4637,4642],{"className":4638,"code":4640,"language":4641},[4639],"language-text","BUZZ_DOMAIN=buzz.pafor.me\nRELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\nBUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_MEDIA_BASE_URL=https:\u002F\u002Fbuzz.pafor.me\u002Fmedia\nBUZZ_MEDIA_SERVER_DOMAIN=buzz.pafor.me\nBUZZ_CORS_ORIGINS=https:\u002F\u002Fbuzz.pafor.me\n","text",[494,4643,4640],{"__ignoreMap":425},[484,4645,4646,4656],{},[487,4647,4648,4651,4652,4655],{},[441,4649,4650],{},"所有者公钥:"," ",[494,4653,4654],{},"RELAY_OWNER_PUBKEY"," 字段需要填入您的 64 位 16 进制公钥。请先在桌面客户端生成一个身份（选择 'Create a new identity key' → 复制以 npub 格式开头的公开 ID），然后将其转换为 16 进制格式。",[487,4657,4658,4661],{},[441,4659,4660],{},"密钥安全（Secrets）:",[484,4662,4663,4673,4687],{},[487,4664,4665,4666,4669,4670,4672],{},"使用该 ",[444,4667,4668],{"href":2857},"在线工具"," 或运行命令 ",[494,4671,2862],{},"（运行 7 次）来生成高强度的随机密钥。",[487,4674,4675,4676,4679,4680,1536,4683,4686],{},"将所有的 ",[494,4677,4678],{},"CHANGE_ME"," 占位符替换掉：包括 ",[494,4681,4682],{},"BUZZ_RELAY_PRIVATE_KEY",[494,4684,4685],{},"BUZZ_GIT_HOOK_HMAC_SECRET","、Postgres\u002FRedis\u002FTypesense 的密码以及 S3 的 Access\u002FSecret Key。",[487,4688,4689,4690,4693],{},"未替换的占位符是导致容器陷入无限重启循环的最常见原因；请通过命令 ",[494,4691,4692],{},"grep CHANGE_ME .env"," 来核对并排除隐患。",[936,4695,4698],{"className":4696,"code":4697,"language":4641},[4639],"    BUZZ_RELAY_PRIVATE_KEY=CHANGE_ME_64_HEX_PRIVATE_KEY\n    BUZZ_GIT_HOOK_HMAC_SECRET=CHANGE_ME_RANDOM_64_HEX\n    POSTGRES_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    REDIS_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    TYPESENSE_API_KEY=CHANGE_ME_RANDOM_API_KEY\n    BUZZ_S3_ACCESS_KEY=CHANGE_ME_RANDOM_ACCESS_KEY\n    BUZZ_S3_SECRET_KEY=CHANGE_ME_RANDOM_SECRET_KEY\n",[494,4699,4697],{"__ignoreMap":425},[484,4701,4702],{},[487,4703,4704,4707],{},[441,4705,4706],{},"其他配置项:",[484,4708,4709,4716],{},[487,4710,4711,4712,4715],{},"将环境变量 ",[494,4713,4714],{},"CLOUDFLARE_API_TOKEN"," 添加到您的配置中，并赋予先前生成的 API 令牌值。Caddy 将用其自动申请证书。",[487,4717,4718,4719,4721,4722,1859,4725,4728],{},"Buzz 的默认配置非常开放，任何知道您中继器地址的人都可以验证并加入。为了安全起见，请务必配置 ",[494,4720,4654],{},"，并将 ",[494,4723,4724],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",[494,4726,4727],{},"BUZZ_REQUIRE_AUTH_TOKEN=true"," 设为启用状态。",[892,4730,4732],{"id":4731},"_4-使用-caddy-开启-https-访问","4. 使用 Caddy 开启 HTTPS 访问",[2182,4734,4736],{"id":4735},"构建集成-cloudflare-dns-模块的自定义-caddy-镜像","构建集成 Cloudflare DNS 模块的自定义 Caddy 镜像",[484,4738,4739,4750,4753],{},[487,4740,4741,4742,4745,4746,4749],{},"我们在 Caddy 中配置基于 Cloudflare 的 DNS-01 挑战（Challenge）。DNS-01 验证的原理是让 Caddy 插件向您的",[441,4743,4744],{},"公网 DNS"," 写入一条 TXT 挑战记录 ",[494,4747,4748],{},"_acme-challenge.buzz.pafor.me","；",[487,4751,4752],{},"随后 Let's Encrypt 从公共互联网上查询该记录，以确权您的域名。这意味着您的域名必须是 Cloudflare 账户中的公网解析区域，而不能只是 Zero Trust \u002F WARP 局域网 DNS 内的私有域名。如果您的域名只在私网下分发解析而没有公网节点，DNS-01 将会失败，需要改用其他验证方式。",[487,4754,4755],{},"将以下配置加入到 Caddyfile 中：",[936,4757,4759],{"className":1359,"code":4758,"language":1361,"meta":425,"style":425},"{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n",[494,4760,4761,4765,4778],{"__ignoreMap":425},[944,4762,4763],{"class":946,"line":947},[944,4764,2905],{"class":958},[944,4766,4767,4770,4773,4776],{"class":946,"line":1074},[944,4768,4769],{"class":1058},"  acme_dns cloudflare",[944,4771,4772],{"class":958}," {",[944,4774,4775],{"class":1058},"env.CLOUDFLARE_API_TOKEN",[944,4777,2913],{"class":958},[944,4779,4780],{"class":946,"line":1081},[944,4781,2913],{"class":958},[484,4783,4784],{},[487,4785,4786,4787,4790,4791,4794],{},"创建一个 ",[494,4788,4789],{},"Dockerfile.caddy","，其内容如下，这是 ",[494,4792,4793],{},"compose.caddy.yml"," 运行所必需的：",[936,4796,4798],{"className":1359,"code":4797,"language":1361,"meta":425,"style":425},"FROM caddy:2-builder AS builder\n\nRUN xcaddy build \\\n    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n\nFROM caddy:2-alpine\n\nCOPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[494,4799,4800,4805,4809,4814,4819,4823,4828,4832],{"__ignoreMap":425},[944,4801,4802],{"class":946,"line":947},[944,4803,4804],{"class":1058},"FROM caddy:2-builder AS builder\n",[944,4806,4807],{"class":946,"line":1074},[944,4808,1078],{"emptyLinePlaceholder":1077},[944,4810,4811],{"class":946,"line":1081},[944,4812,4813],{"class":1058},"RUN xcaddy build \\\n",[944,4815,4816],{"class":946,"line":1088},[944,4817,4818],{"class":1058},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[944,4820,4821],{"class":946,"line":1948},[944,4822,1078],{"emptyLinePlaceholder":1077},[944,4824,4825],{"class":946,"line":1953},[944,4826,4827],{"class":1058},"FROM caddy:2-alpine\n",[944,4829,4830],{"class":946,"line":1959},[944,4831,1078],{"emptyLinePlaceholder":1077},[944,4833,4834],{"class":946,"line":2294},[944,4835,4836],{"class":1058},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[484,4838,4839],{},[487,4840,4841,4842,4844],{},"修改 ",[494,4843,4793],{},"，以使用我们刚生成的带有 Cloudflare 插件的 Caddy 镜像，并传入 API 令牌参数：",[936,4846,4848],{"className":1359,"code":4847,"language":1361,"meta":425,"style":425},"services:\n  relay:\n    ports: !reset []\n\n  caddy:\n    build:\n      context: .\n      dockerfile: Dockerfile.caddy\n    image: buzz-caddy:cloudflare\n    depends_on:\n      relay:\n        condition: service_healthy\n    environment:\n      BUZZ_DOMAIN: ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n    ports:\n      - \"${CADDY_HTTP_PORT:-80}:80\"\n      - \"${CADDY_HTTPS_PORT:-443}:443\"\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n      - buzz-caddy-data:\u002Fdata\n      - buzz-caddy-config:\u002Fconfig\n    restart: unless-stopped\n    networks:\n      - buzz-net\n\nvolumes:\n  buzz-caddy-data:\n    labels:\n      com.buzz.volume: caddy-data\n  buzz-caddy-config:\n    labels:\n      com.buzz.volume: caddy-config\n",[494,4849,4850,4856,4863,4875,4879,4886,4893,4903,4913,4922,4929,4936,4946,4952,4962,4972,4978,4989,5000,5006,5013,5020,5027,5036,5044,5052,5057,5064,5072,5080,5091,5099,5106],{"__ignoreMap":425},[944,4851,4852,4854],{"class":946,"line":947},[944,4853,3233],{"class":1371},[944,4855,1386],{"class":958},[944,4857,4858,4861],{"class":946,"line":1074},[944,4859,4860],{"class":1371},"  relay",[944,4862,1386],{"class":958},[944,4864,4865,4867,4869,4872],{"class":946,"line":1081},[944,4866,3257],{"class":1371},[944,4868,1375],{"class":958},[944,4870,4871],{"class":950}," !reset",[944,4873,4874],{"class":958}," []\n",[944,4876,4877],{"class":946,"line":1088},[944,4878,1078],{"emptyLinePlaceholder":1077},[944,4880,4881,4884],{"class":946,"line":1948},[944,4882,4883],{"class":1371},"  caddy",[944,4885,1386],{"class":958},[944,4887,4888,4891],{"class":946,"line":1953},[944,4889,4890],{"class":1371},"    build",[944,4892,1386],{"class":958},[944,4894,4895,4898,4900],{"class":946,"line":1959},[944,4896,4897],{"class":1371},"      context",[944,4899,1375],{"class":958},[944,4901,4902],{"class":2950}," .\n",[944,4904,4905,4908,4910],{"class":946,"line":2294},[944,4906,4907],{"class":1371},"      dockerfile",[944,4909,1375],{"class":958},[944,4911,4912],{"class":1058}," Dockerfile.caddy\n",[944,4914,4915,4917,4919],{"class":946,"line":2305},[944,4916,3247],{"class":1371},[944,4918,1375],{"class":958},[944,4920,4921],{"class":1058}," buzz-caddy:cloudflare\n",[944,4923,4924,4927],{"class":946,"line":2401},[944,4925,4926],{"class":1371},"    depends_on",[944,4928,1386],{"class":958},[944,4930,4931,4934],{"class":946,"line":2407},[944,4932,4933],{"class":1371},"      relay",[944,4935,1386],{"class":958},[944,4937,4938,4941,4943],{"class":946,"line":2413},[944,4939,4940],{"class":1371},"        condition",[944,4942,1375],{"class":958},[944,4944,4945],{"class":1058}," service_healthy\n",[944,4947,4948,4950],{"class":946,"line":1723},[944,4949,3277],{"class":1371},[944,4951,1386],{"class":958},[944,4953,4954,4957,4959],{"class":946,"line":2423},[944,4955,4956],{"class":1371},"      BUZZ_DOMAIN",[944,4958,1375],{"class":958},[944,4960,4961],{"class":1058}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[944,4963,4964,4967,4969],{"class":946,"line":3336},[944,4965,4966],{"class":1371},"      CLOUDFLARE_API_TOKEN",[944,4968,1375],{"class":958},[944,4970,4971],{"class":1058}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[944,4973,4974,4976],{"class":946,"line":3347},[944,4975,3257],{"class":1371},[944,4977,1386],{"class":958},[944,4979,4980,4982,4984,4987],{"class":946,"line":3352},[944,4981,3264],{"class":958},[944,4983,3267],{"class":958},[944,4985,4986],{"class":1058},"${CADDY_HTTP_PORT:-80}:80",[944,4988,1980],{"class":958},[944,4990,4991,4993,4995,4998],{"class":946,"line":3360},[944,4992,3264],{"class":958},[944,4994,3267],{"class":958},[944,4996,4997],{"class":1058},"${CADDY_HTTPS_PORT:-443}:443",[944,4999,1980],{"class":958},[944,5001,5002,5004],{"class":946,"line":3901},[944,5003,3310],{"class":1371},[944,5005,1386],{"class":958},[944,5007,5008,5010],{"class":946,"line":3907},[944,5009,3264],{"class":958},[944,5011,5012],{"class":1058}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[944,5014,5015,5017],{"class":946,"line":3916},[944,5016,3264],{"class":958},[944,5018,5019],{"class":1058}," buzz-caddy-data:\u002Fdata\n",[944,5021,5022,5024],{"class":946,"line":4572},[944,5023,3264],{"class":958},[944,5025,5026],{"class":1058}," buzz-caddy-config:\u002Fconfig\n",[944,5028,5030,5032,5034],{"class":946,"line":5029},23,[944,5031,3339],{"class":1371},[944,5033,1375],{"class":958},[944,5035,3344],{"class":1058},[944,5037,5039,5042],{"class":946,"line":5038},24,[944,5040,5041],{"class":1371},"    networks",[944,5043,1386],{"class":958},[944,5045,5047,5049],{"class":946,"line":5046},25,[944,5048,3264],{"class":958},[944,5050,5051],{"class":1058}," buzz-net\n",[944,5053,5055],{"class":946,"line":5054},26,[944,5056,1078],{"emptyLinePlaceholder":1077},[944,5058,5060,5062],{"class":946,"line":5059},27,[944,5061,3355],{"class":1371},[944,5063,1386],{"class":958},[944,5065,5067,5070],{"class":946,"line":5066},28,[944,5068,5069],{"class":1371},"  buzz-caddy-data",[944,5071,1386],{"class":958},[944,5073,5075,5078],{"class":946,"line":5074},29,[944,5076,5077],{"class":1371},"    labels",[944,5079,1386],{"class":958},[944,5081,5083,5086,5088],{"class":946,"line":5082},30,[944,5084,5085],{"class":1371},"      com.buzz.volume",[944,5087,1375],{"class":958},[944,5089,5090],{"class":1058}," caddy-data\n",[944,5092,5094,5097],{"class":946,"line":5093},31,[944,5095,5096],{"class":1371},"  buzz-caddy-config",[944,5098,1386],{"class":958},[944,5100,5102,5104],{"class":946,"line":5101},32,[944,5103,5077],{"class":1371},[944,5105,1386],{"class":958},[944,5107,5109,5111,5113],{"class":946,"line":5108},33,[944,5110,5085],{"class":1371},[944,5112,1375],{"class":958},[944,5114,5115],{"class":1058}," caddy-config\n",[2182,5117,5119],{"id":5118},"启动-docker-容器组合","启动 Docker 容器组合",[936,5121,5123],{"className":1045,"code":5122,"language":1047,"meta":425,"style":425},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[494,5124,5125,5145,5149,5154],{"__ignoreMap":425},[944,5126,5127,5129,5131,5133,5136,5138,5141,5143],{"class":946,"line":947},[944,5128,1190],{"class":1054},[944,5130,1193],{"class":1058},[944,5132,3419],{"class":1058},[944,5134,5135],{"class":1058}," compose.yml",[944,5137,3419],{"class":1058},[944,5139,5140],{"class":1058}," compose.caddy.yml",[944,5142,2972],{"class":1058},[944,5144,2975],{"class":1058},[944,5146,5147],{"class":946,"line":1074},[944,5148,1078],{"emptyLinePlaceholder":1077},[944,5150,5151],{"class":946,"line":1081},[944,5152,5153],{"class":1084},"#Check the Docker status\n",[944,5155,5156,5158,5160],{"class":946,"line":1088},[944,5157,1190],{"class":1054},[944,5159,1193],{"class":1058},[944,5161,5162],{"class":1058}," ps\n",[433,5164],{"src":5165,"alt":5166,"style":5167},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fdocker-compose-ps-status-terminal.webp","终端窗口显示通过 docker compose ps 运行的 Buzz 服务容器状态","max-width: 700px; width: 100%; height: auto;",[430,5169,5170,5171,5174],{},"打开您的网页浏览器并访问 ",[494,5172,5173],{},"http:\u002F\u002Fbuzz.pafor.me","，验证中继服务是否已顺利跑起来。",[433,5176],{"src":5177,"alt":5178,"style":3102},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-relay-running-browser-verification.webp","浏览器验证页面，显示自托管 Block's Buzz 中继服务器的成功运行响应",[892,5180,5182],{"id":5181},"步骤-5建立起首日备份机制","步骤 5：建立起首日备份机制",[936,5184,5186],{"className":1045,"code":5185,"language":1047,"meta":425,"style":425},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[494,5187,5188,5199],{"__ignoreMap":425},[944,5189,5190,5193,5196],{"class":946,"line":947},[944,5191,5192],{"class":1054},"mkdir",[944,5194,5195],{"class":1058}," -p",[944,5197,5198],{"class":1058}," \u002Fbuzz_backups\n",[944,5200,5201,5204],{"class":946,"line":1074},[944,5202,5203],{"class":1054},"crontab",[944,5205,5206],{"class":1058}," -e\n",[430,5208,5209],{},"添加一个每日凌晨自动执行的数据库快照定时任务（Cron Job）：",[936,5211,5214],{"className":5212,"code":5213,"language":4641},[4639],"0 3 * * * cd \u002Fhome\u002F\u003Cuser>\u002Fbuzz\u002Fdeploy\u002Fcompose && docker compose exec -T postgres pg_dump -U buzz buzz > \u002Fbuzz_backups\u002Fbuzz-$(date +\\%Y\\%m\\%d).sql\n",[494,5215,5213],{"__ignoreMap":425},[430,5217,5218,5219,5221],{},"注意：请将 ",[494,5220,4682],{}," 视为永久不可失配的密钥。由于中继器中的事件都与此密钥绑定，如果未来变更了私钥，旧事件将无法通过验证；即便您恢复了数据库备份，在新私钥下它也不会被 Nostr 网络视为同一个中继服务。",[474,5223,5225],{"id":5224},"配置-buzz-桌面客户端与-nostr-加密身份","配置 Buzz 桌面客户端与 Nostr 加密身份",[430,5227,2486,5228,5232],{},[444,5229,5230],{"href":5230,"rel":5231},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[448]," 下载最新版 Buzz 桌面客户端并运行。依次完善个人资料，直到您来到 “Join or create a community” 界面。",[430,5234,5235],{},[433,5236],{"alt":5237,"src":5238},"Buzz 桌面客户端初始设置界面，用于加入或创建社区","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-setup-community.webp",[430,5240,5241],{},"点击 “Join a community” 并拷贝您的公钥（Public Key）。",[430,5243,5244],{},[433,5245],{"alt":5246,"src":5247},"Buzz 客户端界面显示加入社区前的公钥数字身份","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-join-community-public-key.webp",[430,5249,5250,5251,5254],{},"在 ",[441,5252,5253],{},"VPS 上","运行以下命令行工具，将您自己添加为该平台的首位会员：",[936,5256,5258],{"className":1045,"code":5257,"language":1047,"meta":425,"style":425},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[494,5259,5260],{"__ignoreMap":425},[944,5261,5262,5264,5266,5268,5270,5272,5274,5276],{"class":946,"line":947},[944,5263,1190],{"class":1054},[944,5265,1193],{"class":1058},[944,5267,1196],{"class":1058},[944,5269,1199],{"class":1058},[944,5271,1202],{"class":1058},[944,5273,1205],{"class":1058},[944,5275,1208],{"class":1058},[944,5277,5278],{"class":1058}," npub1yourkeyhere\n",[430,5280,5281,5282,5285],{},"在客户端中填入 ",[494,5283,5284],{},"wss:\u002F\u002Fbuzz.pafor.me"," 作为社区接入 URL，然后点击 “Next”。",[430,5287,5288],{},[433,5289],{"alt":5290,"src":5291},"在 Buzz 桌面客户端中输入自托管社区中继服务器的 URL 地址","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-input-community-url.webp",[430,5293,5294],{},"起一个帅气的昵称，然后点击 “Next” 按钮。",[430,5296,5297],{},[433,5298],{"alt":5299,"src":5300},"Buzz 客户端个人资料配置界面，用于输入用户昵称","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-profile-name-input.webp",[892,5302,5304],{"id":5303},"协作频道与-ai-智能体","协作频道与 AI 智能体",[430,5306,5307],{},"频道是围绕特定任务或项目划分的群组。为您手头的每个任务或工程建立独立的频道，并将团队成员与所需的 AI 智能体拉入其中。",[430,5309,5310],{},"频道内的所有消息、代码与文档都会被自动分享，免去了逐一向新成员同步前因后果的烦恼。任何人都可以通过“@”来点名激活特定的 AI 智能体，智能体收到召唤后会读取相关历史消息并立刻着手处理。更妙的是，不同的 AI 智能体之间也能互相 @ 指派任务。",[430,5312,5313],{},"让我们试着给预置的智能体发一条私信（DM）",[430,5315,5316],{},[433,5317],{"alt":5318,"src":5319},"在 Buzz 协同桌面客户端中给 AI 智能体发送私信（DM）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-dm-agent.webp",[430,5321,5322],{},"创建一个新频道并拉几个 AI 智能体进来吧",[430,5324,5325],{},[433,5326],{"alt":5327,"src":5328},"在 Buzz 桌面客户端中创建新的任务或项目协作频道","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-create-channel-dialog.webp",[430,5330,5331],{},[433,5332],{"alt":5333,"src":5334},"将团队成员和 AI 智能体添加至新创建的协作频道中","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-agents-to-channel.webp",[430,5336,5337],{},[433,5338],{"alt":5339,"src":5340},"活跃协作频道视图，展示合并后的聊天历史和项目任务","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-view.webp",[433,5342],{"src":5343,"alt":5344,"style":5345},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-active-agents.webp","已集成到协同项目频道中的活跃 AI 智能体列表细节视图","max-width: 367px; width: 100%; height: auto;",[892,5347,5349],{"id":5348},"激活智能体运行时agent-runtimes","激活智能体运行时（Agent Runtimes）",[430,5351,5352,5353,5356,5357,5360],{},"平台自带的运行时预设依赖于“自动探测”来查找特定系统目录（例如 ",[494,5354,5355],{},"~\u002F.local\u002Fbin","）下的执行程序（如 ",[494,5358,5359],{},"hermes-acp","）。如果您的智能体软件安装在非标准路径下，Buzz 将无法正确识别。",[430,5362,5363,5364,5367],{},"以 Kimi Code 为例，它的智能体 ID 为 kimi，Buzz 默认会在 ",[494,5365,5366],{},"~\u002F.local\u002Fbin\u002Fkimi"," 寻找它。通过创建一个软链接（Symbolic Link）即可轻松搞定：",[936,5369,5372],{"className":5370,"code":5371,"language":4641},[4639],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[494,5373,5371],{"__ignoreMap":425},[430,5375,5376],{},"此时，Kimi Code 就会显示在“Agent runtimes”列表中。",[430,5378,5379],{},[433,5380],{"alt":5381,"src":5382},"Buzz 客户端设置界面，显示已配置的 AI 智能体运行时列表（包括 Kimi）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-agent-runtimes-list.webp",[892,5384,5385],{"id":5385},"项目与代码仓库管理",[430,5387,5388,5389,5392],{},"请先在 Settings → Experiments 菜单中激活“",[441,5390,5391],{},"Projects","”实验性功能：",[430,5394,5395],{},[433,5396],{"alt":5397,"src":5398},"在 Buzz 客户端设置的 Experiments 标签页中激活实验性 Projects 功能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-experiments-projects.webp",[430,5400,5401,5402,5404],{},"目前，一个项目（Project）必须使用 ",[494,5403,1220],{}," 命令行工具来创建（虽然在后续版本中会加入 UI 直接创建的支持）。",[2182,5406,5408],{"id":5407},"在-vps-上安装并部署-buzz-cli","在 VPS 上安装并部署 buzz-cli",[430,5410,5250,5411,5413,5414,5416],{},[441,5412,5253],{},"依次执行以下命令，编译并安装好 ",[494,5415,1220],{}," 客户端：",[936,5418,5420],{"className":1045,"code":5419,"language":1047,"meta":425,"style":425},"sudo apt install cargo\ncd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-cli\necho 'export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"' >> ~\u002F.bashrc && source ~\u002F.bashrc\n",[494,5421,5422,5433,5440,5453],{"__ignoreMap":425},[944,5423,5424,5426,5428,5430],{"class":946,"line":947},[944,5425,1916],{"class":1054},[944,5427,4474],{"class":1058},[944,5429,4495],{"class":1058},[944,5431,5432],{"class":1058}," cargo\n",[944,5434,5435,5437],{"class":946,"line":1074},[944,5436,2806],{"class":976},[944,5438,5439],{"class":1058}," ~\u002Fbuzz\n",[944,5441,5442,5445,5447,5450],{"class":946,"line":1081},[944,5443,5444],{"class":1054},"cargo",[944,5446,4495],{"class":1058},[944,5448,5449],{"class":1058}," --path",[944,5451,5452],{"class":1058}," crates\u002Fbuzz-cli\n",[944,5454,5455,5457,5460,5463,5466,5469,5472,5475,5478],{"class":946,"line":1088},[944,5456,4421],{"class":976},[944,5458,5459],{"class":958}," '",[944,5461,5462],{"class":1058},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[944,5464,5465],{"class":958},"'",[944,5467,5468],{"class":958}," >>",[944,5470,5471],{"class":1058}," ~\u002F.bashrc",[944,5473,5474],{"class":958}," &&",[944,5476,5477],{"class":976}," source",[944,5479,5480],{"class":1058}," ~\u002F.bashrc\n",[430,5482,5483,5484,5486,5487,5489],{},"使用在线工具或通过 ",[494,5485,1220],{}," 生成一对 Nostr 加密公私钥。这组密钥将代表该 ",[494,5488,1220],{}," 工具在 Nostr 网络中的数字身份。",[936,5491,5493],{"className":1045,"code":5492,"language":1047,"meta":425,"style":425},"docker run --rm --entrypoint \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin ghcr.io\u002Fblock\u002Fbuzz:main generate-key\n\n# Use the generated Public Key\ndocker compose exec relay buzz-admin add-member --pubkey generated_Public_key\n",[494,5494,5495,5517,5521,5526],{"__ignoreMap":425},[944,5496,5497,5499,5502,5505,5508,5511,5514],{"class":946,"line":947},[944,5498,1190],{"class":1054},[944,5500,5501],{"class":1058}," run",[944,5503,5504],{"class":1058}," --rm",[944,5506,5507],{"class":1058}," --entrypoint",[944,5509,5510],{"class":1058}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[944,5512,5513],{"class":1058}," ghcr.io\u002Fblock\u002Fbuzz:main",[944,5515,5516],{"class":1058}," generate-key\n",[944,5518,5519],{"class":946,"line":1074},[944,5520,1078],{"emptyLinePlaceholder":1077},[944,5522,5523],{"class":946,"line":1081},[944,5524,5525],{"class":1084},"# Use the generated Public Key\n",[944,5527,5528,5530,5532,5534,5536,5538,5540,5542],{"class":946,"line":1088},[944,5529,1190],{"class":1054},[944,5531,1193],{"class":1058},[944,5533,1196],{"class":1058},[944,5535,1199],{"class":1058},[944,5537,1202],{"class":1058},[944,5539,1205],{"class":1058},[944,5541,1208],{"class":1058},[944,5543,5544],{"class":1058}," generated_Public_key\n",[430,5546,5547],{},"配置您的 CLI 环境变量：",[936,5549,5551],{"className":1045,"code":5550,"language":1047,"meta":425,"style":425},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\necho 'export BUZZ_PRIVATE_KEY=\"nsec1...\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n\necho 'export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n",[494,5552,5553,5558,5589,5593],{"__ignoreMap":425},[944,5554,5555],{"class":946,"line":947},[944,5556,5557],{"class":1084},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[944,5559,5560,5562,5564,5567,5569,5572,5575,5578,5581,5584,5586],{"class":946,"line":1074},[944,5561,4421],{"class":976},[944,5563,5459],{"class":958},[944,5565,5566],{"class":1058},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[944,5568,5465],{"class":958},[944,5570,5571],{"class":958},"  >>",[944,5573,5574],{"class":1058}," \u002Fhome\u002F",[944,5576,5577],{"class":958},"\u003C",[944,5579,5580],{"class":1058},"use",[944,5582,5583],{"class":954},"r",[944,5585,1263],{"class":958},[944,5587,5588],{"class":1058},"\u002F.bashrc\n",[944,5590,5591],{"class":946,"line":1081},[944,5592,1078],{"emptyLinePlaceholder":1077},[944,5594,5595,5597,5599,5602,5604,5606,5608,5610,5612,5614,5616],{"class":946,"line":1088},[944,5596,4421],{"class":976},[944,5598,5459],{"class":958},[944,5600,5601],{"class":1058},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[944,5603,5465],{"class":958},[944,5605,5571],{"class":958},[944,5607,5574],{"class":1058},[944,5609,5577],{"class":958},[944,5611,5580],{"class":1058},[944,5613,5583],{"class":954},[944,5615,1263],{"class":958},[944,5617,5588],{"class":1058},[430,5619,5620,5621,5623],{},"运行以下命令来测试 ",[494,5622,1220],{}," 是否已经与您的中继器配对畅通：",[936,5625,5627],{"className":1045,"code":5626,"language":1047,"meta":425,"style":425},"buzz channels list\n",[494,5628,5629],{"__ignoreMap":425},[944,5630,5631,5633,5635],{"class":946,"line":947},[944,5632,1243],{"class":1054},[944,5634,1246],{"class":1058},[944,5636,5637],{"class":1058}," list\n",[430,5639,5640],{},[433,5641],{"alt":5642,"src":5643},"终端命令行运行验证，通过列出活跃频道来检查 buzz-cli 配置是否正确","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-cli-channels-list-terminal.webp",[2182,5645,5647],{"id":5646},"使用-buzz-cli-创建全新的项目","使用 buzz-cli 创建全新的项目",[936,5649,5651],{"className":1045,"code":5650,"language":1047,"meta":425,"style":425},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[494,5652,5653,5658],{"__ignoreMap":425},[944,5654,5655],{"class":946,"line":947},[944,5656,5657],{"class":1084},"# --channel refers to the UUID of the channel\n",[944,5659,5660,5662,5665,5668,5671,5674,5677,5679,5682,5684,5686,5688,5691],{"class":946,"line":1074},[944,5661,1243],{"class":1054},[944,5663,5664],{"class":1058}," repos",[944,5666,5667],{"class":1058}," create",[944,5669,5670],{"class":1058}," --id",[944,5672,5673],{"class":1058}," TestKOA",[944,5675,5676],{"class":1058}," --name",[944,5678,5459],{"class":958},[944,5680,5681],{"class":1058},"Display Name",[944,5683,5465],{"class":958},[944,5685,1251],{"class":1058},[944,5687,3267],{"class":958},[944,5689,5690],{"class":1058},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[944,5692,1980],{"class":958},[430,5694,5695,5696,5698],{},"项目的所有权极为严格，只有创建者才有权将其删除。由于该“Display Name”项目是由 ",[494,5697,1220],{}," 发起创建的，而目前的命令行版本尚未内置删除指令，因此该项目无法通过常规方式清空。",[430,5700,5701],{},"再次点开您的桌面客户端，验证该项目是否已显示在工作区中。",[430,5703,5704],{},[433,5705],{"alt":5706,"src":5707},"Buzz 桌面客户端项目视图页面，确认项目已成功创建","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-project-view.webp",[430,5709,5710],{},"一旦项目列表在界面中开启，后续您便可以直接通过右上角的 “+” 按钮随心所欲地添加更多子项目了。",[430,5712,5713],{},[433,5714],{"alt":5715,"src":5716},"在 Buzz 桌面客户端中点击右上角加号按钮来添加新项目","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-project-button.webp",[2182,5718,5720],{"id":5719},"拉入现有的-git-代码仓库","拉入现有的 Git 代码仓库",[430,5722,5723,5724,5727,5728,5731,5732,5737],{},"在您的本地开发机器上安装 ",[494,5725,5726],{},"git-credential-nostr"," 凭证辅助工具。这需要您的系统已安装 ",[441,5729,5730],{},"Git 2.46+"," 版本并配有 Rust 构建环境。详情可参考此项目的 ",[444,5733,5736],{"href":5734,"rel":5735},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[448],"Readme"," 描述：",[936,5739,5741],{"className":1045,"code":5740,"language":1047,"meta":425,"style":425},"cargo install --path crates\u002Fgit-credential-nostr\n",[494,5742,5743],{"__ignoreMap":425},[944,5744,5745,5747,5749,5751],{"class":946,"line":947},[944,5746,5444],{"class":1054},[944,5748,4495],{"class":1058},[944,5750,5449],{"class":1058},[944,5752,5753],{"class":1058}," crates\u002Fgit-credential-nostr\n",[430,5755,5756,5757,5759],{},"对 ",[494,5758,5726],{}," 进行配置，使其获得 Buzz 中继器的授权权限：",[936,5761,5763],{"className":1045,"code":5762,"language":1047,"meta":425,"style":425},"# 1. Register the helper and enable per-path credentials.\ngit config --global credential.helper nostr\ngit config --global credential.useHttpPath true\n\n# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\nmkdir -p ~\u002F.nostr\necho \"nsec1...\" > ~\u002F.nostr\u002Fkey && chmod 600 ~\u002F.nostr\u002Fkey\ngit config --global nostr.keyfile ~\u002F.nostr\u002Fkey\n",[494,5764,5765,5770,5786,5799,5803,5808,5817,5844],{"__ignoreMap":425},[944,5766,5767],{"class":946,"line":947},[944,5768,5769],{"class":1084},"# 1. Register the helper and enable per-path credentials.\n",[944,5771,5772,5774,5777,5780,5783],{"class":946,"line":1074},[944,5773,2782],{"class":1054},[944,5775,5776],{"class":1058}," config",[944,5778,5779],{"class":1058}," --global",[944,5781,5782],{"class":1058}," credential.helper",[944,5784,5785],{"class":1058}," nostr\n",[944,5787,5788,5790,5792,5794,5797],{"class":946,"line":1081},[944,5789,2782],{"class":1054},[944,5791,5776],{"class":1058},[944,5793,5779],{"class":1058},[944,5795,5796],{"class":1058}," credential.useHttpPath",[944,5798,1397],{"class":958},[944,5800,5801],{"class":946,"line":1088},[944,5802,1078],{"emptyLinePlaceholder":1077},[944,5804,5805],{"class":946,"line":1948},[944,5806,5807],{"class":1084},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[944,5809,5810,5812,5814],{"class":946,"line":1953},[944,5811,5192],{"class":1054},[944,5813,5195],{"class":1058},[944,5815,5816],{"class":1058}," ~\u002F.nostr\n",[944,5818,5819,5821,5823,5826,5828,5830,5833,5835,5838,5841],{"class":946,"line":1959},[944,5820,4421],{"class":976},[944,5822,3267],{"class":958},[944,5824,5825],{"class":1058},"nsec1...",[944,5827,3681],{"class":958},[944,5829,4455],{"class":958},[944,5831,5832],{"class":1058}," ~\u002F.nostr\u002Fkey",[944,5834,5474],{"class":958},[944,5836,5837],{"class":1054}," chmod",[944,5839,5840],{"class":2950}," 600",[944,5842,5843],{"class":1058}," ~\u002F.nostr\u002Fkey\n",[944,5845,5846,5848,5850,5852,5855],{"class":946,"line":2294},[944,5847,2782],{"class":1054},[944,5849,5776],{"class":1058},[944,5851,5779],{"class":1058},[944,5853,5854],{"class":1058}," nostr.keyfile",[944,5856,5843],{"class":1058},[430,5858,5859],{},"在 Buzz 中继上开辟出该 Git 库的存储节点：",[936,5861,5864],{"className":5862,"code":5863,"language":4641},[4639],"buzz repos create --id koa-email-routing --name \"KOA Email Routing\" --clone \"https:\u002F\u002Fbuzz.pafor.me\u002Fgit\u002F\u003Cpub_key>\u002Fkoa-email-routing\" --nostr-relay \"wss:\u002F\u002Fbuzz.pafor.me\"\n",[494,5865,5863],{"__ignoreMap":425},[430,5867,5868,5869,5872,5873,5876],{},"在第一次执行 ",[494,5870,5871],{},"git push"," 时，您可能会被拦截并报错 ",[494,5874,5875],{},"remote: missing Authorization header","。这是由于 Git 写入控制（ACL）是由频道成员资格决定的，您必须先将该仓库 ID 与一个具体的 Buzz 频道进行绑定，从而授权合规写入：",[936,5878,5880],{"className":1045,"code":5879,"language":1047,"meta":425,"style":425},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[494,5881,5882,5907,5911,5916],{"__ignoreMap":425},[944,5883,5884,5886,5888,5891,5893,5896,5898,5900,5902,5904],{"class":946,"line":947},[944,5885,1243],{"class":1054},[944,5887,5664],{"class":1058},[944,5889,5890],{"class":1058}," bind",[944,5892,5670],{"class":1058},[944,5894,5895],{"class":1058}," koa-email-routing",[944,5897,1251],{"class":1058},[944,5899,1254],{"class":958},[944,5901,1257],{"class":1058},[944,5903,1260],{"class":954},[944,5905,5906],{"class":958},">\n",[944,5908,5909],{"class":946,"line":1074},[944,5910,1078],{"emptyLinePlaceholder":1077},[944,5912,5913],{"class":946,"line":1081},[944,5914,5915],{"class":1084},"# push the code again\n",[944,5917,5918,5920],{"class":946,"line":1088},[944,5919,2782],{"class":1054},[944,5921,5922],{"class":1058}," push\n",[430,5924,5925,5926,5928],{},"在某些情况下，在 Buzz 桌面版中查阅项目进度时会遇到类似下方的 Git 模块拉取失败提示。这是由于该桌面应用要求系统必须搭载 ",[441,5927,5730],{}," 版本，而应用直接启动时可能默认寻址到了系统中的旧版 Git 引擎：",[430,5930,5931],{},[433,5932],{"alt":5933,"src":5934},"Buzz 客户端展示由于本地 Git 版本低于 2.46 导致的 Git 库加载失败报错界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-git-version-error.webp",[430,5936,5937,5938,5941,5942,5947],{},"请在您的 shell 配置文件中通过执行 ",[494,5939,5940],{},"launchctl setenv PATH \"\u002Fopt\u002Fhomebrew\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin:\u002Fusr\u002Fsbin:\u002Fsbin\""," 声明新版 Git 所在的 PATH，并直接在终端中拉起 Buzz 应用。对此可参考该 ",[444,5943,5946],{"href":5944,"rel":5945},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[448],"Issue"," 的详细排查记录。",[936,5949,5951],{"className":1045,"code":5950,"language":1047,"meta":425,"style":425},"open -a Buzz\n",[494,5952,5953],{"__ignoreMap":425},[944,5954,5955,5958,5961],{"class":946,"line":947},[944,5956,5957],{"class":1054},"open",[944,5959,5960],{"class":1058}," -a",[944,5962,5963],{"class":1058}," Buzz\n",[430,5965,5966],{},"重新进入客户端中的 Projects 标签页，您会惊喜地发现代码库的所有提交与详情已经完美加载出来了。",[430,5968,5969],{},[433,5970],{"alt":5971,"src":5972},"代码库提交详情成功加载后的 Buzz 桌面客户端项目面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-repository-details-loaded.webp",[474,5974,5976],{"id":5975},"利用二维码将-ai-助手同步至手机端-buzz-app","利用二维码将 AI 助手同步至手机端 Buzz App",[430,5978,5979,5980,5983],{},"Buzz 手机端的“扫码配对”只认 HTTPS 协议，且 VPS 上的中继服务默认并不会在后台运行 ",[494,5981,5982],{},"buzz-pair-relay"," 组件。",[936,5985,5987],{"className":1045,"code":5986,"language":1047,"meta":425,"style":425},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[494,5988,5989,5995],{"__ignoreMap":425},[944,5990,5991,5993],{"class":946,"line":947},[944,5992,2806],{"class":976},[944,5994,5439],{"class":1058},[944,5996,5997,5999,6001,6003],{"class":946,"line":1074},[944,5998,5444],{"class":1054},[944,6000,4495],{"class":1058},[944,6002,5449],{"class":1058},[944,6004,6005],{"class":1058}," crates\u002Fbuzz-pair-relay\n",[430,6007,6008,6009,6012,6013,6015],{},"将以下配置注入到您的 ",[494,6010,6011],{},"compose.yml"," 文件中，声明并启动 ",[494,6014,5982],{}," 容器进程：",[936,6017,6019],{"className":1359,"code":6018,"language":1361,"meta":425,"style":425},"  pair:\n    image: ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n    entrypoint: [\"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay\"]\n    environment:\n      BUZZ_PAIR_RELAY_BIND_ADDR: 0.0.0.0:5000\n    ports:\n      - \"${BUZZ_PAIR_RELAY_PORT:-5000}:5000\"\n    restart: unless-stopped\n    networks:\n      [buzz-net]\n",[494,6020,6021,6028,6037,6057,6063,6073,6079,6090,6098,6104],{"__ignoreMap":425},[944,6022,6023,6026],{"class":946,"line":947},[944,6024,6025],{"class":1371},"  pair",[944,6027,1386],{"class":958},[944,6029,6030,6032,6034],{"class":946,"line":1074},[944,6031,3247],{"class":1371},[944,6033,1375],{"class":958},[944,6035,6036],{"class":1058}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[944,6038,6039,6042,6044,6047,6049,6052,6054],{"class":946,"line":1081},[944,6040,6041],{"class":1371},"    entrypoint",[944,6043,1375],{"class":958},[944,6045,6046],{"class":958}," [",[944,6048,3681],{"class":958},[944,6050,6051],{"class":1058},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[944,6053,3681],{"class":958},[944,6055,6056],{"class":958},"]\n",[944,6058,6059,6061],{"class":946,"line":1088},[944,6060,3277],{"class":1371},[944,6062,1386],{"class":958},[944,6064,6065,6068,6070],{"class":946,"line":1948},[944,6066,6067],{"class":1371},"      BUZZ_PAIR_RELAY_BIND_ADDR",[944,6069,1375],{"class":958},[944,6071,6072],{"class":1058}," 0.0.0.0:5000\n",[944,6074,6075,6077],{"class":946,"line":1953},[944,6076,3257],{"class":1371},[944,6078,1386],{"class":958},[944,6080,6081,6083,6085,6088],{"class":946,"line":1959},[944,6082,3264],{"class":958},[944,6084,3267],{"class":958},[944,6086,6087],{"class":1058},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[944,6089,1980],{"class":958},[944,6091,6092,6094,6096],{"class":946,"line":2294},[944,6093,3339],{"class":1371},[944,6095,1375],{"class":958},[944,6097,3344],{"class":1058},[944,6099,6100,6102],{"class":946,"line":2305},[944,6101,5041],{"class":1371},[944,6103,1386],{"class":958},[944,6105,6106,6109,6112],{"class":946,"line":2401},[944,6107,6108],{"class":958},"      [",[944,6110,6111],{"class":1058},"buzz-net",[944,6113,6056],{"class":958},[430,6115,6116,6117,6119,6120,6123],{},"在您的 ",[494,6118,2836],{}," 中声明 ",[494,6121,6122],{},"BUZZ_PAIRING_RELAY_URL"," 及其专用的运行端口号：",[936,6125,6128],{"className":6126,"code":6127,"language":4641},[4639],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[494,6129,6127],{"__ignoreMap":425},[430,6131,6132,6133,6136],{},"点击桌面端应用中的 Settings, 进入 “",[441,6134,6135],{},"Mobile","” 配对项：",[430,6138,6139],{},[433,6140],{"alt":6141,"src":6142},"Buzz 桌面客户端设置中展示的 Mobile 移动端配对配置标签页","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-mobile-tab.webp",[430,6144,6145],{},"点击 “Start pairing” —— 界面会生成专属的绑定二维码；打开手机端 App 扫一扫，接着在桌面端点击 “Code Match” 确认无误，双端便立即完成信任绑定。",[430,6147,6148],{},[433,6149],{"alt":6150,"src":6151},"在桌面客户端中生成安全的配对二维码，用于同步 Buzz 手机端 App","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-pairing-qr-code.webp",[430,6153,6154],{},"注意：手机端应用中的智能体之所以能随叫随到，是基于您的桌面端应用在后台持续维系运行。只有保障桌面机处于在线状态，手机端派发的智能体指令才能被顺利分发与执行。",[430,6156,6157],{},[433,6158],{"alt":6159,"src":6160},"在手机端 Buzz App 中成功加载同步后的活跃 AI 智能体列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-mobile-app-active-agents.webp",[474,6162,2592],{"id":2592},[430,6164,6165],{},"不可否认，作为一个还处于发展初期的技术方案，Buzz 在面对大规模生产环境时依然稍显稚嫩，伴随着一些偶发的系统 Bug 与界面交互上的限制。但对于小型团队或单兵作战的独立开发者而言，这无疑是一场令人血脉偾张的前沿探索。它为我们揭开了一幅波澜壮阔的人机无缝协奏画卷，让我们提前触碰到了“AI 智能体成为工作伙伴”的未来工作模式。",[474,6167,6168],{"id":6168},"参考资源",[484,6170,6171,6178,6185,6192],{},[487,6172,6173],{},[444,6174,6177],{"href":6175,"rel":6176},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[448],"Buzz releases",[487,6179,6180],{},[444,6181,6184],{"href":6182,"rel":6183},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[448],"Introducing Buzz",[487,6186,6187],{},[444,6188,6191],{"href":6189,"rel":6190},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[448],"What is buzz",[487,6193,6194],{},[444,6195,6198],{"href":6196,"rel":6197},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[448],"How to self-host Buzz (Miget)",[1667,6200,6201],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":425,"searchDepth":1074,"depth":1081,"links":6203},[6204,6205,6206,6220,6229,6230,6231],{"id":4120,"depth":1074,"text":4121},{"id":4165,"depth":1074,"text":4166},{"id":4213,"depth":1074,"text":4214,"children":6207},[6208,6209,6213,6214,6215,6219],{"id":4217,"depth":1081,"text":4218},{"id":4245,"depth":1081,"text":4246,"children":6210},[6211,6212],{"id":4249,"depth":1088,"text":4250},{"id":4347,"depth":1088,"text":4348},{"id":4365,"depth":1081,"text":4366},{"id":4582,"depth":1081,"text":4583},{"id":4731,"depth":1081,"text":4732,"children":6216},[6217,6218],{"id":4735,"depth":1088,"text":4736},{"id":5118,"depth":1088,"text":5119},{"id":5181,"depth":1081,"text":5182},{"id":5224,"depth":1074,"text":5225,"children":6221},[6222,6223,6224],{"id":5303,"depth":1081,"text":5304},{"id":5348,"depth":1081,"text":5349},{"id":5385,"depth":1081,"text":5385,"children":6225},[6226,6227,6228],{"id":5407,"depth":1088,"text":5408},{"id":5646,"depth":1088,"text":5647},{"id":5719,"depth":1088,"text":5720},{"id":5975,"depth":1074,"text":5976},{"id":2592,"depth":1074,"text":2592},{"id":6168,"depth":1074,"text":6168},[1688,1687,1243],"2026-09-08",{"schemaOrg":6235,"robots":1721,"sitemap":6254},[6236,6237],{"@type":1698,"headline":455,"description":465,"image":466},{"@type":1700,"name":455,"description":465,"image":466,"step":6238},[6239,6242,6245,6248,6251],{"@type":1703,"name":6240,"text":6241},"阶段 1：Cloudflare 设置","创建 Cloudflare API 令牌并配置 DNS 解析设置。",{"@type":1703,"name":6243,"text":6244},"阶段 2：安装 Docker","在 Ubuntu VPS 上设置并安装 Docker 容器引擎。",{"@type":1703,"name":6246,"text":6247},"阶段 3：克隆与配置","克隆仓库代码并配置 docker-compose 环境变量。",{"@type":1703,"name":6249,"text":6250},"阶段 4：集成 Caddy","编译带有 Cloudflare DNS 挑战模块的的自定义 Caddy 镜像。",{"@type":1703,"name":6252,"text":6253},"阶段 5：自动备份","配置 cron 定时任务以实现 PostgreSQL 数据库的自动备份。",{"lastmod":6255},"2026-09-03",{"title":6257,"description":465,"ogTitle":455,"ogDescription":465,"twitterTitle":455,"twitterDescription":465},"如何在 Ubuntu VPS 上自建 Block 旗下的 Buzz 协作中继服务器","zh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[1728,6260,1115,6261,6262],"Docker","Caddy","Cloudflare","Plt5qPXpCpnSq9t6cSV6VM3z9k3i2BkoxxI46S98hdM",{"id":6265,"title":6266,"author":1730,"body":6267,"category":8138,"date":8140,"description":8141,"extension":1692,"image":8142,"imageAlt":8143,"isPublished":1077,"meta":8144,"minRead":4572,"navigation":1077,"path":329,"seo":8150,"stem":8151,"tags":8152,"updatedAt":6255,"__hash__":8154},"article\u002Fzh\u002Farticle\u002Fself-hosted-travel-planner-trek.md","使用Docker与TREK自托管您的个性化智能旅行日程：一站式深度规划并轻松管理预订、财务和行李清单",{"type":427,"value":6268,"toc":8097},[6269,6272,6275,6278,6282,6286,6428,6431,6437,6456,6459,6462,6566,6577,6580,6585,6588,6599,6603,6607,6610,6613,6646,6650,6653,6686,6689,6729,6732,6737,6748,6752,6759,6763,6766,6857,6861,6864,6868,6875,6879,6882,6900,6911,6915,6918,6929,6933,6937,6948,6952,6956,6959,6963,6967,6970,6975,6978,6983,6989,6993,6997,7000,7004,7016,7021,7027,7032,7036,7039,7044,7049,7052,7059,7063,7066,7069,7079,7085,7090,7097,7102,7106,7111,7116,7119,7124,7128,7134,7138,7143,7147,7150,7153,7158,7163,7168,7172,7179,7184,7189,7194,7199,7203,7209,7214,7220,7224,7227,7231,7237,7242,7247,7253,7258,7263,7268,7282,7286,7291,7312,7317,7320,7324,7327,7332,7335,7383,7387,7394,7400,7405,7411,7416,7422,7427,7433,7436,7441,7448,7453,7459,7463,7470,7475,7478,7482,7486,7492,7496,7499,7506,7510,7517,7521,7532,7534,7538,7542,7552,7562,7567,7574,7579,7586,7590,7593,7758,7761,7765,7768,7773,7776,7782,7786,7793,7797,7800,7805,7812,7817,7821,7831,7902,7918,7921,7926,7930,7934,7945,8021,8035,8038,8042,8046,8049,8052,8055,8058,8067,8071,8094],[430,6270,6271],{},"在规划旅行时，最繁琐的部分莫过于那些零散的数据：机票预订PDF、酒店确认信、旅伴之间的聊天记录、想去的景点清单等，都散落在不同的角落。而当需要汇总总花销、拆分账单时，又得在海量的出行记录中不停翻找，极为耗费精力。",[430,6273,6274],{},"TREK是一款可以自托管的开源旅行规划系统，能够将您的行程、预订、财务预算和行李清单一站式整合到同一个平台中。其内置的MCP（Model Context Protocol）服务器还允许AI智能体（如Claude Desktop）直接操作您的出行数据。",[430,6276,6277],{},"本教程将带您一步步完成从系统部署到完整管理一次真实旅行的全过程。",[892,6279,6281],{"id":6280},"_1-如何使用docker部署trek旅行规划器","1. 如何使用Docker部署TREK旅行规划器",[2182,6283,6285],{"id":6284},"在ubuntu-vps上安装docker","在Ubuntu VPS上安装Docker",[936,6287,6289],{"className":1045,"code":6288,"language":1047,"meta":425,"style":425},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Verify docker is installed\ndocker --version\n\n# Starts automatically when your system boots\nsudo systemctl enable docker\n",[494,6290,6291,6295,6315,6319,6323,6355,6359,6363,6371,6375,6379,6395,6399,6403,6409,6413,6418],{"__ignoreMap":425},[944,6292,6293],{"class":946,"line":947},[944,6294,4379],{"class":1084},[944,6296,6297,6299,6301,6303,6305,6307,6309,6311,6313],{"class":946,"line":1074},[944,6298,2981],{"class":1054},[944,6300,4386],{"class":1058},[944,6302,4389],{"class":1058},[944,6304,4392],{"class":958},[944,6306,4395],{"class":1054},[944,6308,4398],{"class":1058},[944,6310,4401],{"class":1058},[944,6312,4404],{"class":1058},[944,6314,4407],{"class":1058},[944,6316,6317],{"class":946,"line":1081},[944,6318,1078],{"emptyLinePlaceholder":1077},[944,6320,6321],{"class":946,"line":1088},[944,6322,4416],{"class":1084},[944,6324,6325,6327,6329,6331,6333,6335,6337,6339,6341,6343,6345,6347,6349,6351,6353],{"class":946,"line":1948},[944,6326,4421],{"class":976},[944,6328,3267],{"class":958},[944,6330,4426],{"class":1058},[944,6332,4429],{"class":958},[944,6334,4432],{"class":1054},[944,6336,4435],{"class":1058},[944,6338,4438],{"class":958},[944,6340,4441],{"class":1058},[944,6342,3681],{"class":958},[944,6344,4392],{"class":958},[944,6346,4395],{"class":1054},[944,6348,3811],{"class":1058},[944,6350,4452],{"class":1058},[944,6352,4455],{"class":958},[944,6354,4458],{"class":1058},[944,6356,6357],{"class":946,"line":1953},[944,6358,1078],{"emptyLinePlaceholder":1077},[944,6360,6361],{"class":946,"line":1959},[944,6362,4467],{"class":1084},[944,6364,6365,6367,6369],{"class":946,"line":2294},[944,6366,1916],{"class":1054},[944,6368,4474],{"class":1058},[944,6370,4477],{"class":1058},[944,6372,6373],{"class":946,"line":2305},[944,6374,1078],{"emptyLinePlaceholder":1077},[944,6376,6377],{"class":946,"line":2401},[944,6378,4486],{"class":1084},[944,6380,6381,6383,6385,6387,6389,6391,6393],{"class":946,"line":2407},[944,6382,1916],{"class":1054},[944,6384,4474],{"class":1058},[944,6386,4495],{"class":1058},[944,6388,4498],{"class":1058},[944,6390,4501],{"class":1058},[944,6392,4504],{"class":1058},[944,6394,4507],{"class":1058},[944,6396,6397],{"class":946,"line":2413},[944,6398,1078],{"emptyLinePlaceholder":1077},[944,6400,6401],{"class":946,"line":1723},[944,6402,4536],{"class":1084},[944,6404,6405,6407],{"class":946,"line":2423},[944,6406,1190],{"class":1054},[944,6408,3604],{"class":1058},[944,6410,6411],{"class":946,"line":3336},[944,6412,1078],{"emptyLinePlaceholder":1077},[944,6414,6415],{"class":946,"line":3347},[944,6416,6417],{"class":1084},"# Starts automatically when your system boots\n",[944,6419,6420,6422,6424,6426],{"class":946,"line":3352},[944,6421,1916],{"class":1054},[944,6423,1919],{"class":1058},[944,6425,2046],{"class":1058},[944,6427,4527],{"class":1058},[2182,6429,6430],{"id":6430},"生成加密密钥",[430,6432,6433,6434,6436],{},"TREK使用一个专门的密钥来加密敏感数据。您可以使用以下命令或这个",[444,6435,4668],{"href":2857},"来生成加密密钥：",[936,6438,6440],{"className":1045,"code":6439,"language":1047,"meta":425,"style":425},"openssl rand -hex 32\n",[494,6441,6442],{"__ignoreMap":425},[944,6443,6444,6447,6450,6453],{"class":946,"line":947},[944,6445,6446],{"class":1054},"openssl",[944,6448,6449],{"class":1058}," rand",[944,6451,6452],{"class":1058}," -hex",[944,6454,6455],{"class":2950}," 32\n",[430,6457,6458],{},"请务必将其妥善保存在安全的地方。如果遗失该密钥，您将无法访问已加密的数据。",[2182,6460,6461],{"id":6461},"启动容器",[936,6463,6465],{"className":1045,"code":6464,"language":1047,"meta":425,"style":425},"docker run -d \\\n  --name trek \\\n  -p 3000:3000 \\\n  -e ENCRYPTION_KEY=\"\u003Cgenerated_key>\" \\\n  -e APP_URL=\"https:\u002F\u002Ftrek.pafor.me\" \\\n  -v .\u002Fdata:\u002Fapp\u002Fdata \\\n  -v .\u002Fuploads:\u002Fapp\u002Fuploads \\\n  --restart unless-stopped \\\n  mauriceboe\u002Ftrek:latest\n",[494,6466,6467,6479,6489,6499,6516,6532,6542,6551,6561],{"__ignoreMap":425},[944,6468,6469,6471,6473,6476],{"class":946,"line":947},[944,6470,1190],{"class":1054},[944,6472,5501],{"class":1058},[944,6474,6475],{"class":1058}," -d",[944,6477,6478],{"class":954}," \\\n",[944,6480,6481,6484,6487],{"class":946,"line":1074},[944,6482,6483],{"class":1058},"  --name",[944,6485,6486],{"class":1058}," trek",[944,6488,6478],{"class":954},[944,6490,6491,6494,6497],{"class":946,"line":1081},[944,6492,6493],{"class":1058},"  -p",[944,6495,6496],{"class":1058}," 3000:3000",[944,6498,6478],{"class":954},[944,6500,6501,6504,6507,6509,6512,6514],{"class":946,"line":1088},[944,6502,6503],{"class":1058},"  -e",[944,6505,6506],{"class":1058}," ENCRYPTION_KEY=",[944,6508,3681],{"class":958},[944,6510,6511],{"class":1058},"\u003Cgenerated_key>",[944,6513,3681],{"class":958},[944,6515,6478],{"class":954},[944,6517,6518,6520,6523,6525,6528,6530],{"class":946,"line":1948},[944,6519,6503],{"class":1058},[944,6521,6522],{"class":1058}," APP_URL=",[944,6524,3681],{"class":958},[944,6526,6527],{"class":1058},"https:\u002F\u002Ftrek.pafor.me",[944,6529,3681],{"class":958},[944,6531,6478],{"class":954},[944,6533,6534,6537,6540],{"class":946,"line":1953},[944,6535,6536],{"class":1058},"  -v",[944,6538,6539],{"class":1058}," .\u002Fdata:\u002Fapp\u002Fdata",[944,6541,6478],{"class":954},[944,6543,6544,6546,6549],{"class":946,"line":1959},[944,6545,6536],{"class":1058},[944,6547,6548],{"class":1058}," .\u002Fuploads:\u002Fapp\u002Fuploads",[944,6550,6478],{"class":954},[944,6552,6553,6556,6559],{"class":946,"line":2294},[944,6554,6555],{"class":1058},"  --restart",[944,6557,6558],{"class":1058}," unless-stopped",[944,6560,6478],{"class":954},[944,6562,6563],{"class":946,"line":2305},[944,6564,6565],{"class":1058},"  mauriceboe\u002Ftrek:latest\n",[484,6567,6568],{},[487,6569,6570,6576],{},[441,6571,6572,6573],{},"必须正确设置 ",[494,6574,6575],{},"APP_URL"," —— 因为MCP服务器的OAuth授权发现流程完全依赖于它。请在一开始就将其设置为您最终的公开HTTPS地址。",[430,6578,6579],{},"首次运行需要一些时间来拉取镜像：",[433,6581],{"src":6582,"alt":6583,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-pull-image.webp","TREK 的 Docker 拉取和运行日志","max-width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6586,6587],{},"验证容器是否成功运行：",[936,6589,6591],{"className":1045,"code":6590,"language":1047,"meta":425,"style":425},"docker ps\n",[494,6592,6593],{"__ignoreMap":425},[944,6594,6595,6597],{"class":946,"line":947},[944,6596,1190],{"class":1054},[944,6598,5162],{"class":1058},[433,6600],{"src":6601,"alt":6602,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-ps-status.webp","通过 docker ps 验证运行中的容器状态",[892,6604,6606],{"id":6605},"_2-使用caddy反向代理配置域名路由与ssl证书","2. 使用Caddy反向代理配置域名路由与SSL证书",[430,6608,6609],{},"通行密钥（Passkeys）功能和MCP所需的OAuth授权都强制要求HTTPS加密。我们的域名托管在提供免费SSL证书和DDoS保护的Cloudflare上。",[430,6611,6612],{},"我们将Caddy配置为安全的反向代理服务器，用来指向容器的3000端口。Caddyfile配置示例如下：",[936,6614,6616],{"className":2896,"code":6615,"language":2898,"meta":425,"style":425},"{$TREK_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:3000\n}\n",[494,6617,6618,6629,6633,6642],{"__ignoreMap":425},[944,6619,6620,6622,6625,6627],{"class":946,"line":947},[944,6621,2926],{"class":958},[944,6623,6624],{"class":954},"$TREK_DOMAIN",[944,6626,2932],{"class":958},[944,6628,2935],{"class":958},[944,6630,6631],{"class":946,"line":1074},[944,6632,2940],{"class":954},[944,6634,6635,6637,6639],{"class":946,"line":1081},[944,6636,2945],{"class":954},[944,6638,1375],{"class":958},[944,6640,6641],{"class":2950},"3000\n",[944,6643,6644],{"class":946,"line":1088},[944,6645,2913],{"class":958},[892,6647,6649],{"id":6648},"_3-初始配置与安全的管理员设置","3. 初始配置与安全的管理员设置",[430,6651,6652],{},"创建管理员账户有两种方式：",[484,6654,6655,6667],{},[487,6656,6657,6666],{},[441,6658,6659,6660,1859,6663],{},"在环境配置中直接设置 ",[494,6661,6662],{},"ADMIN_EMAIL",[494,6664,6665],{},"ADMIN_PASSWORD"," 变量，系统将直接使用该凭证。",[487,6668,6669,6670,6673,6674,6677,6678,6681,6682,6685],{},"TREK会自动生成一个邮箱 ",[494,6671,6672],{},"admin@trek.local","、用户名 ",[494,6675,6676],{},"admin","，以及一个",[441,6679,6680],{},"随机生成的密码，并打印到容器日志中","。运行 ",[494,6683,6684],{},"docker logs trek"," 即可获取。",[430,6687,6688],{},"如果您在日志中找不到密码，可以通过以下命令进行手动重置：",[936,6690,6692],{"className":1045,"code":6691,"language":1047,"meta":425,"style":425},"docker exec -it -e RESET_ADMIN_EMAIL=admin@trek.local -e RESET_ADMIN_PASSWORD='YourNewPassword' trek node server\u002Freset-admin.js\n",[494,6693,6694],{"__ignoreMap":425},[944,6695,6696,6698,6700,6703,6706,6709,6711,6714,6716,6719,6721,6723,6726],{"class":946,"line":947},[944,6697,1190],{"class":1054},[944,6699,1196],{"class":1058},[944,6701,6702],{"class":1058}," -it",[944,6704,6705],{"class":1058}," -e",[944,6707,6708],{"class":1058}," RESET_ADMIN_EMAIL=admin@trek.local",[944,6710,6705],{"class":1058},[944,6712,6713],{"class":1058}," RESET_ADMIN_PASSWORD=",[944,6715,5465],{"class":958},[944,6717,6718],{"class":1058},"YourNewPassword",[944,6720,5465],{"class":958},[944,6722,6486],{"class":1058},[944,6724,6725],{"class":1058}," node",[944,6727,6728],{"class":1058}," server\u002Freset-admin.js\n",[430,6730,6731],{},"在首次登录时，系统会提示您修改初始密码。",[433,6733],{"src":6734,"alt":6735,"style":6736},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-initial-login-password-prompt.webp","初始登录和管理员密码重置提示","max-width: 215px; width:100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6738,3054,6739,6742,6743],{},[441,6740,6741],{},"Admin（管理员）"," 选项卡并更新您的电子邮箱：",[433,6744],{"src":6745,"alt":6746,"style":6747},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-email-update-panel.webp","在 TREK 管理员设置中配置自定义电子邮件","max-width: 700px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,6749,6751],{"id":6750},"_31-备份策略","3.1 备份策略",[430,6753,6754,6755],{},"在管理员后台，可以非常方便地配置带有保留策略的自动备份方案：\n",[433,6756],{"src":6757,"alt":6758,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-backup-retention-policy.webp","配置自动备份计划和保留规则",[2182,6760,6762],{"id":6761},"_32-将上传的文件存储到cloudflare-r2","3.2 将上传的文件存储到Cloudflare R2",[430,6764,6765],{},"将上传的文件、照片和备份数据保存在Cloudflare R2中，能够让您的VPS磁盘保持干净和轻量。TREK全面支持S3兼容的存储后端，而Cloudflare R2正是这一需求的完美解决方案。",[532,6767,6768,6775,6787,6797,6808,6820,6831,6846],{},[487,6769,6770,6771,6774],{},"新建一个名为 ",[494,6772,6773],{},"trek"," 的R2存储桶。",[487,6776,5250,6777,6780,6781,6782],{},[441,6778,6779],{},"Account Details（账户详情）"," 区域，找到您的账户ID：","\n  ",[433,6783],{"src":6784,"alt":6785,"style":6786},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-account-details-id.webp","在控制台中定位 Cloudflare 帐户 ID","max-width: 325px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[487,6788,3054,6789,492,6781,6792],{},[441,6790,6791],{},"Manage API Tokens（管理API令牌）",[433,6793],{"src":6794,"alt":6795,"style":6796},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-manage-api-tokens-button.webp","Cloudflare 控制台中的管理 API 令牌界面","max-width: 282px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[487,6798,3054,6799,6802,6781,6803],{},[441,6800,6801],{},"Create Account API token（创建账户API令牌）","，并授予针对该桶的读写权限：",[433,6804],{"src":6805,"alt":6806,"style":6807},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-create-token-permissions.webp","创建具有读写权限的 R2 访问令牌","max-width: 360px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[487,6809,6810,6811,6814,6781,6815],{},"在管理员面板中，点击 ",[441,6812,6813],{},"Storage（存储）"," 配置页：",[433,6816],{"src":6817,"alt":6818,"style":6819},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-administration-storage-menu.webp","导航到 TREK 控制面板中的存储设置","max-width: 539px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[487,6821,3054,6822,6825,6781,6826],{},[441,6823,6824],{},"Add Backend（添加后端）"," 按钮，填入您的Endpoint（终结点）、Bucket（存储桶名称）和API凭证：",[433,6827],{"src":6828,"alt":6829,"style":6830},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-storage-backend-credentials.webp","配置 S3 兼容的 Cloudflare R2 存储后端","max-width: 445px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[487,6832,3054,6833,6836,6837,6840,6781,6841],{},[441,6834,6835],{},"Apply（应用）","，然后点击 ",[441,6838,6839],{},"Test（测试）"," 链接。当看到“Connection OK”字样时，说明连接测试成功：",[433,6842],{"src":6843,"alt":6844,"style":6845},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-test-storage-backend-connection-ok.webp","存储后端连接测试成功，显示 Connection OK","max-width: 677px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[487,6847,6848,6849,492,6781,6852],{},"将所有存储类别切换为Cloudflare R2并点击 ",[441,6850,6851],{},"Save changes（保存修改）",[433,6853],{"src":6854,"alt":6855,"style":6856},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-switch-storage-categories-r2.webp","将所有 file 存储分类路由到 Cloudflare R2","max-width: 653px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,6858,6860],{"id":6859},"_33-通行密钥passkey登录","3.3 通行密钥（Passkey）登录",[430,6862,6863],{},"TREK支持通行密钥、双重身份验证（2FA）以及基于OIDC的单点登录。如果想开启通行密钥，请在设置中输入您的域名和Allowed Origins（允许的源），然后保存即可：",[433,6865],{"src":6866,"alt":6867,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-passkey-allowed-origins-settings.webp","注册用于安全金钥（Passkey）身份验证的允许源",[430,6869,6870,6871,6874],{},"如果没有正确配置 ",[441,6872,6873],{},"Allowed Origins","，通行密钥注册将会失败。",[2182,6876,6878],{"id":6877},"_34-google-maps-api密钥","3.4 Google Maps API密钥",[430,6880,6881],{},"配置Google Maps密钥可以让您的地点检索功能变得更丰富，自动补充评分、营业时间和地点实景图。如果您不配置密钥，TREK会默认降级使用免费的OpenStreetMap（只是不显示评分和实景照片）。",[430,6883,6884,6885,6890,6891,6894,6895],{},"访问此",[444,6886,6889],{"href":6887,"rel":6888},"https:\u002F\u002Fmapsplatform.google.com\u002Fmaps-demo-key\u002F",[448],"链接","并点击 ",[441,6892,6893],{},"Get demo key"," 即可申请一个测试密钥：                                                  ",[433,6896],{"src":6897,"alt":6898,"style":6899},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgoogle-maps-get-demo-api-key.webp","申请 Google Maps Platform API 密钥","max-width: 176px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6901,6902,6903,6906,6907],{},"将获取到的API Key粘贴到设置中，然后点击 ",[441,6904,6905],{},"Test"," 验证连接是否通畅：\n",[433,6908],{"src":6909,"alt":6910,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-key-test-connection.webp","在设置中验证 Google Maps API 密钥的连通性",[2182,6912,6914],{"id":6913},"_35-ai集成","3.5 AI集成",[430,6916,6917],{},"内置的AI解析引擎主要用于处理您的预订确认邮件和PDF，将它们自动转换为结构化的预订数据。",[430,6919,6920,6921,6924,6925,6928],{},"点击左侧菜单中的 ",[441,6922,6923],{},"Addons（附加组件）"," 并启用 ",[441,6926,6927],{},"AI Parsing","。选择“OpenAI”（或其它兼容的AI提供商）并填写相应的凭证信息：",[433,6930],{"src":6931,"alt":6932,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-ai-parsing-openai.webp","启用带有 OpenAI 集成的 AI 解析插件",[2182,6934,6936],{"id":6935},"_36-mcp访问权限","3.6 MCP访问权限",[430,6938,6939,6940,6943,6944,6947],{},"同样在 ",[441,6941,6942],{},"Addons"," 选项中，开启 ",[441,6945,6946],{},"MCP"," 协议：",[433,6949],{"src":6950,"alt":6951,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-mcp.webp","启用 Model Context Protocol MCP 服务器插件",[2182,6953,6955],{"id":6954},"_37-插件推荐","3.7 插件推荐",[430,6957,6958],{},"以下几款官方插件非常推荐您顺手激活：",[433,6960],{"src":6961,"alt":6962,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-recommended-addons-plugins-activation.webp","活跃的推荐插件和扩展列表",[2182,6964,6966],{"id":6965},"_38-创建您的日常使用账户","3.8 创建您的日常使用账户",[430,6968,6969],{},"在平时规划旅行时，建议使用普通用户账户，而非管理员账户。让我们在后台创建一个日常账户并登录：",[433,6971],{"src":6972,"alt":6973,"style":6974},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-regular-user-form.webp","在 TREK 面板中创建普通用户账户","max-width: 420px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6976,6977],{},"登录后，建议立刻绑定通行密钥或设置2FA来强化该账户的安全级别：",[433,6979],{"src":6980,"alt":6981,"style":6982},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-user-security-passkey-2fa-setup.webp","使用安全金钥（Passkey）和双重认证配置用户安全设置","max-width: 381px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6984,3054,6985,6988],{},[441,6986,6987],{},"+ Add a passkey","，输入当前密码，然后按照浏览器提示完成安全确认：",[433,6990],{"src":6991,"alt":6992,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-passkey-confirm-password.webp","确认密码以注册新的硬件安全金钥",[892,6994,6996],{"id":6995},"_4-测试您的部署导入历史出行数据","4. 测试您的部署：导入历史出行数据",[430,6998,6999],{},"快速上手并熟悉TREK系统的一个极佳方式是，将您过去走过的旅行足迹录入其中。",[2182,7001,7003],{"id":7002},"_41-创建旅行计划","4.1 创建旅行计划",[430,7005,3054,7006,7009,7010,1859,7013,492],{},[441,7007,7008],{},"+ New Trip（新建旅行）","，并根据那次历史旅行的真实起止时间设定 ",[441,7011,7012],{},"Start Date",[441,7014,7015],{},"End Date",[433,7017],{"src":7018,"alt":7019,"style":7020},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-trip-details.webp","创建具有自定义日期范围的新旅行","max-width: 334px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7022,7023,7024,492],{},"上传一张好看的封面图（可以直接将图片拖入或从剪贴板粘贴），接着点击 ",[441,7025,7026],{},"Create New Trip",[433,7028],{"src":7029,"alt":7030,"style":7031},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-cover-image-upload.webp","配置高质量的旅行封面图片","max-width: 608px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,7033,7035],{"id":7034},"_42-导入预订信息","4.2 导入预订信息",[430,7037,7038],{},"将您当时留存的机票、火车票和其它交通工具预订确认文件直接拖放到上传区域：",[433,7040],{"src":7041,"alt":7042,"style":7043},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-travel-booking-files.webp","用于导入旅行 PDF 和预订文件的拖拽区域","max-width: 570px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7045],{"src":7046,"alt":7047,"style":7048},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-booking-pdf-processing-status.webp","已上传预订的处理窗口，显示提取状态","max-width: 377px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7050,7051],{},"由于我们已经启用了AI解析引擎，预订确认PDF文件会被自动分析，提取出结构化的预订日程。",[430,7053,7054,7055,7058],{},"检查解析结果无误后，点击 ",[441,7056,7057],{},"Add"," 将其正式写入预订数据中：",[433,7060],{"src":7061,"alt":7062,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-review-parsed-booking-details.webp","审查由 AI 提取的结构化预订细节",[430,7064,7065],{},"如果有些预订确认仅保存在邮件中，您可以将其导出为PDF格式并上传，同样可以走这套提取流程。",[430,7067,7068],{},"在系统中，已导入的预订信息会以极具现代感的方式呈现：",[430,7070,7071,7075],{},[433,7072],{"src":7073,"alt":7074,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-bookings-timeline-view.webp","旅行预订的完整时间线展示",[433,7076],{"src":7077,"alt":7078,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-booking-confirmation-details.webp","已确认交通预订的详细视图",[430,7080,5250,7081,7084],{},[441,7082,7083],{},"Plan（日程规划）"," 页面中，所有的酒店和住宿点都会在地图上被优雅地标注出来：",[433,7086],{"src":7087,"alt":7088,"style":7089},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-plan-accommodations-map-display.webp","标有所有酒店住宿的交互式地图","max-width: 546px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7091,7092,7093,7096],{},"点击上方的 ",[441,7094,7095],{},"Atlas（旅行足迹）","，您将能从清单和世界地图上直观地看到所有已拜访的国家：",[433,7098],{"src":7099,"alt":7100,"style":7101},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-atlas-countries-visited-summary.webp","个人 Atlas 追踪器中的旅行历史概述","max-width: 407px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,7103,7105],{"id":7104},"_43-添加旅行同伴","4.3 添加旅行同伴",[430,7107,3054,7108,3009],{},[441,7109,7110],{},"Share（分享）",[433,7112],{"src":7113,"alt":7114,"style":7115},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-share-options-button.webp","在 TREK 中打开旅行分享对话框","max-width: 224px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7117,7118],{},"在弹出的对话框底部，可以直接添加旅行同伴为Guest（嘉宾）：",[433,7120],{"src":7121,"alt":7122,"style":7123},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-add-companions-guests.webp","添加自定义旅行同伴和随行客人","max-width: 635px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,7125,7127],{"id":7126},"_44-记录旅行费用","4.4 记录旅行费用",[430,7129,3054,7130,7133],{},[441,7131,7132],{},"Add expense（添加开销）","，来记录那些无法通过PDF预订单自动解析的杂项支出，例如境外险、当地公共交通费、临时SIM卡等：",[433,7135],{"src":7136,"alt":7137,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-custom-expense-form.webp","在支出表单中输入详细的花费数据",[433,7139],{"src":7140,"alt":7141,"style":7142},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-expenses-list-billing-split.webp","分摊账单明细和费用追踪账本","max-width: 526px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,7144,7146],{"id":7145},"_45-拆分旅行阶段","4.5 拆分旅行阶段",[430,7148,7149],{},"该功能需要提前在后台激活“Trip Segment”插件。",[430,7151,7152],{},"对于那些超长周期的旅程，将其拆分为不同的阶段能让脉络更清晰，每个阶段都可以有自己独立的预订项目、待办事项和成本账单：",[433,7154],{"src":7155,"alt":7156,"style":7157},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-overview-display.webp","将复杂的行程拆分为旅行段","max-width: 465px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7159],{"src":7160,"alt":7161,"style":7162},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segment-itinerary-details.webp","显示地点和计划的活跃旅行段","max-width: 596px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7164],{"src":7165,"alt":7166,"style":7167},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-interactive-map.webp","在时间线上绘制不同的旅行航段","max-width: 605px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,7169,7171],{"id":7170},"_46-创建journal日志并查看旅行足迹atlas","4.6 创建Journal（日志）并查看旅行足迹（Atlas）",[430,7173,7174,7175,7178],{},"您还可以将几次旅行串联成一个 ",[441,7176,7177],{},"Journey（旅程）","，并图文并茂地撰写游记故事，方便分享给您的朋友们：",[433,7180],{"src":7181,"alt":7182,"style":7183},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-journey-group.webp","将多次旅行合并为一个可视化的旅程","max-width: 441px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7185],{"src":7186,"alt":7187,"style":7188},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-timeline-story-writing.webp","在旅程面板中撰写可视化故事","max-width: 443px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7190],{"src":7191,"alt":7192,"style":7193},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-gallery-media-grid.webp","旅程内部的媒体收集和画廊网格","max-width: 440px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7195],{"src":7196,"alt":7197,"style":7198},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-public-share-link.webp","为协同旅程生成公开分享链接","max-width: 532px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[892,7200,7202],{"id":7201},"_5-设计自定义行程与行李清单","5. 设计自定义行程与行李清单",[430,7204,3054,7205,7208],{},[441,7206,7207],{},"+ New Trip","，输入旅行的专属名称并指定起止日期：",[433,7210],{"src":7211,"alt":7212,"style":7213},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-planning-new-trip-setup.webp","创建未定日期旅行的初始提示对话框","max-width: 432px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7215,7216,7219],{},[441,7217,7218],{},"如果具体的出行时间还没有敲定，可以将日期项留空。"," 此时系统会显示一个“天数配置（最高支持365天）”字段，您可以先设计每日的游玩内容，等后续买好机票后再一键锚定日期。",[2182,7221,7223],{"id":7222},"_51-添加地点景点","5.1 添加地点\u002F景点",[430,7225,7226],{},"这是旅行规划中最耗时的一步，但TREK提供了四种极具效率的方式来帮助您添加地点：",[433,7228],{"src":7229,"alt":7230,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-places-methods-overview.webp","向行程添加新地点的多种途径",[430,7232,7233,7236],{},[441,7234,7235],{},"1. 直接在地图上右键点击："," 会在该坐标处直接创建新地点，其标准地址会被系统自动逆地理编码解析出来：",[433,7238],{"src":7239,"alt":7240,"style":7241},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-map-location.webp","在地图界面右键点击以精确定位","max-width: 632px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7243],{"src":7244,"alt":7245,"style":7246},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-reverse-geocode-address.webp","所选地图坐标的自动逆地理编码","max-width: 628px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7248,7249,7252],{},[441,7250,7251],{},"2. 点击 + Add Place\u002FActivity："," 在搜索框中直接通过关键字进行检索",[433,7254],{"src":7255,"alt":7256,"style":7257},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-search-place-by-name-input.webp","使用文本输入搜索真实地点","max-width: 642px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7259],{"src":7260,"alt":7261,"style":7262},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-select-place-search-results-list.webp","显示带有地址标注的地点搜索结果列表","max-width: 594px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7264],{"src":7265,"alt":7266,"style":7267},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-place-details-rich-info-card.webp","包含评论和评分的完整地点信息卡","max-width: 568px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7269,7270,7273,7274,7277,7278,7281],{},[441,7271,7272],{},"3. 直接粘贴谷歌地图分享链接："," （如 ",[494,7275,7276],{},"maps.app.goo.gl\u002F…"," 或 ",[494,7279,7280],{},"maps.google.com\u002F…","）粘贴到检索栏中。TREK会自动抓取该地点的名称、地址和经纬度：",[433,7283],{"src":7284,"alt":7285,"style":6845},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-paste-google-maps-share-link.webp","直接从粘贴的 Google 地图分享链接解析地点",[433,7287],{"src":7288,"alt":7289,"style":7290},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-parsed-location.webp","成功从地图 URL 中提取坐标","max-width: 543px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7292,7293,7296,7297,7300,7301,7277,7304,7307,7308,7311],{},[441,7294,7295],{},"4. 批量导入数据："," 这是最轻松的方案。如果您在Google Maps中维护着自己的“想去清单”，可以将其导出为 ",[494,7298,7299],{},".gpx"," 文件（",[494,7302,7303],{},".kml",[494,7305,7306],{},".kmz"," 格式亦支持），然后点击右侧面板的 ",[441,7309,7310],{},"Import file","，一键拉取所有数据：",[433,7313],{"src":7314,"alt":7315,"style":7316},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-bulk-import-places-gpx-file.webp","使用 GPX 或 KML 文件批量导入地点","max-width: 389px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7318,7319],{},"推荐您可以先把所有感兴趣的项目都添加进来。至于如何将它们科学地归入到每一天的日程中，后续可以直接在面板里拖拽处理。",[2182,7321,7323],{"id":7322},"_52-每日日程与备注","5.2 每日日程与备注",[430,7325,7326],{},"Day Plan（每日计划）的核心逻辑是将所有的目的地按每日访问顺序进行排序。整个界面是一个可以折叠、支持任意拖放的模块：",[433,7328],{"src":7329,"alt":7330,"style":7331},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-drag-drop-ordering.webp","使用拖放操作自定义每日路线顺序","max-width: 496px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7333,7334],{},"这些细节机制设计得极其精妙实用：",[484,7336,7337,7347,7357,7367],{},[487,7338,7339,7342,7343],{},[441,7340,7341],{},"中间移动方式","：点击每日日程左上角的公共汽车图标，可以设定各节点之间的过渡交通方式（如地铁、自驾、甚至是直达航班）：\n",[433,7344],{"src":7345,"alt":7346,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-commuting-transport-button.webp","登记日行程各段之间的通勤交通方式",[487,7348,7349,7352,7353],{},[441,7350,7351],{},"每日备忘","：点击左下角的便签图标可以附加各种定制化提醒（例如：“今天需要提早出发”、“美术馆门票需提前预约”）：\n",[433,7354],{"src":7355,"alt":7356,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-icon-tagged-notes-button.webp","为天行程添加显眼的、带有图标的自定义备注",[487,7358,7359,7362,7363],{},[441,7360,7361],{},"指定时间段","：从右侧拖拽地点并给它分配一个开始时间。设置了时间的地点会自动在地图上生成推荐的行进路线：\n",[433,7364],{"src":7365,"alt":7366,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-timed-places-routing.webp","带时间点的地点之间自动计算的交通路线",[487,7368,7369,7370,7373,7374,7377,7378,1807],{},"关于智能路线优化（",[441,7371,7372],{},"Route optimisation","）以及气候（",[441,7375,7376],{},"Weather","），您可以查阅 ",[444,7379,7382],{"href":7380,"rel":7381},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FDay-Plans-and-Notes",[448],"Day Plans and Notes的Wiki文档",[2182,7384,7386],{"id":7385},"_53-收藏夹可重复使用的地点清单","5.3 收藏夹：可重复使用的地点清单",[430,7388,7389,7390,7393],{},"Collections（收藏夹）允许用户在具体的旅行项目之外，保存并分类管理自己精心收集的宝藏地点。您可以将其打包分享给朋友。这些地点在加入旅行时是采用",[441,7391,7392],{},"复制","的方式，因此在旅行日程中对其进行的任何个性化标注，都不会破坏您收藏夹里的原始干净数据。",[430,7395,7396,7397,492],{},"点击顶部菜单栏中的 ",[441,7398,7399],{},"Collections",[433,7401],{"src":7402,"alt":7403,"style":7404},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-dashboard-view.webp","访问保存地点的自定义用户收藏夹","max-width: 495px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7406,3054,7407,7410],{},[441,7408,7409],{},"+ New list"," 建立新的分类列表：",[433,7412],{"src":7413,"alt":7414,"style":7415},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-create-new-list.webp","在收藏夹中创建自定义列表","max-width: 269px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7417,3054,7418,7421],{},[441,7419,7420],{},"+ Add a place"," 并填入该地点的详细情况：",[433,7423],{"src":7424,"alt":7425,"style":7426},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-add-place-manually-form.webp","手动输入表单以填充自定义收藏列表","max-width: 271px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7428,7429,7432],{},[441,7430,7431],{},"注意："," 收藏夹内的搜索组件偶尔可能会因网络原因失效，如果发生该情况，您可以通过手动输入来创建。",[430,7434,7435],{},"当地点带有准确的GPS坐标时，它们会精美地展示在地图中：",[433,7437],{"src":7438,"alt":7439,"style":7440},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-map-places-display.webp","在交互式地图上可视化自定义收藏中的地点","max-width: 592px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7442,7443,7444,7447],{},"如需批量组织这些地标，可以点击 ",[441,7445,7446],{},"checkbox（勾选框）"," 图标：",[433,7449],{"src":7450,"alt":7451,"style":7452},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-select-places-tickbox.webp","批量标记已保存地点的选择模式","max-width: 662px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7454,7455,7456,492],{},"多选目标后，点击 ",[441,7457,7458],{},"Assign label（分配标签）",[433,7460],{"src":7461,"alt":7462,"style":7290},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-group-assign-label.webp","为选定的收藏地点分配描述性标签",[430,7464,7465,7466,7469],{},"在分配之前，先点击 ",[441,7467,7468],{},"Manage labels（管理标签）"," 来新建一些醒目的彩色分组标签：",[433,7471],{"src":7472,"alt":7473,"style":7474},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-manage-custom-labels.webp","创建和管理自定义标签","max-width: 411px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7476,7477],{},"点击一个具体标签，接着选择一键绑定：",[433,7479],{"src":7480,"alt":7481,"style":7101},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-confirm-label-selection.webp","应用自定义标签到成组的地点",[2182,7483,7485],{"id":7484},"_54-费用与预算","5.4 费用与预算",[430,7487,5250,7488,7491],{},[441,7489,7490],{},"Costs（财务管理）"," 页面中，我们可以录入其它的预备预算和旅途支出。",[433,7493],{"src":7494,"alt":7495,"style":7331},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-budget-overall-expenses-list.webp","完整的支出表格和余额结算账本",[430,7497,7498],{},"在结伴出行时，您可以在此页记录每个人的垫付账单，并选定分摊规则。",[430,7500,7501,7502,7505],{},"系统的结算后台采用了一种贪心匹配算法，计算并生成",[441,7503,7504],{},"最简化的转账精算方案","，帮大家用最少的转账次数轻松对齐账目。",[892,7507,7509],{"id":7508},"_6-利用model-context-protocolmcp实现ai驱动的旅行规划","6. 利用Model Context Protocol（MCP）实现AI驱动的旅行规划",[430,7511,7512,7513,7516],{},"TREK内置了 ",[441,7514,7515],{},"MCP（模型上下文协议）服务器","。这意味着，AI智能体可以直接“读写”您的行程规划数据。它提供了超过150个精细的原子工具和30个核心数据源，全方位覆盖行程、地点、账目、行李、预订和多人协作。",[2182,7518,7520],{"id":7519},"_61-cloudflare-zero-trust网络配置","6.1 Cloudflare Zero Trust网络配置",[430,7522,7523,7524,7526,7527,1807],{},"由于我们的自托管服务运行在 ",[444,7525,1749],{"href":363}," 内网环境下，我们需要在“Split Tunnels（分流隧道）”配置中，将该服务的域名加入到 Inclusion List（包含\u002F直连白名单）中。否则在进行 OAuth 登录授权发现时，接口调用会被网络策略阻断。具体的配置排障可以参考这个 GitHub 讨论贴：",[444,7528,7531],{"href":7529,"rel":7530},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fissues\u002F1463",[448],"GitHub Issue",[463,7533],{"description":2627,"image":2628,"image-alt":2629,"label":2701,"min-read":1286,"title":1734,"to":363},[433,7535],{"src":7536,"alt":7537,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-zero-trust-split-tunnels-domain.webp","向 Cloudflare Warp 分流隧道（Split Tunnels）添加自定义域名",[2182,7539,7541],{"id":7540},"_62-claude-desktop客户端配置","6.2 Claude Desktop客户端配置",[430,7543,3054,7544,7547,7548],{},[441,7545,7546],{},"+ New Client"," 创设一个新的 AI 客户端接口：\n",[433,7549],{"src":7550,"alt":7551,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-register-new-mcp-client.webp","在设置中注册新的自定义客户端令牌",[430,7553,7554,7555,7558,7559,492],{},"选择 ",[441,7556,7557],{},"Claude Desktop"," 选项卡，然后点击 ",[441,7560,7561],{},"Register Client（注册客户端）",[433,7563],{"src":7564,"alt":7565,"style":7566},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-claude-desktop-client-credentials.webp","生成 Claude Desktop 客户端凭据","max-width: 354px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7568,7569,7570,7573],{},"系统此时会展示唯一的 Client ID 和 Client Secret，请妥善保存。接着点击 ",[441,7571,7572],{},"Client Configuration（客户端配置）"," 调出我们需要在本地写入的 JSON 代码片段：",[433,7575],{"src":7576,"alt":7577,"style":7578},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-client-configuration-block.webp","获取预格式化的 MCP 服务器配置块","max-width: 508px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7580,7581,7582,7585],{},"在 Claude Desktop 软件中，点击 ",[441,7583,7584],{},"Edit Config"," 会在代码编辑器中打开您本地的 MCP server 配置文件：",[433,7587],{"src":7588,"alt":7589,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-config-json.webp","编辑 Claude Desktop 的本地 MCP 配置文件 json",[430,7591,7592],{},"将 TREK 的 MCP 代码块粘贴进去，并把占位符部分替换为上一步生成的客户端凭证：",[936,7594,7596],{"className":2896,"code":7595,"language":2898,"meta":425,"style":425},"  \"mcpServers\": {\n    \"trek\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n        \"--static-oauth-client-info\",\n        \"{\\\"client_id\\\": \\\"\u003Cyour_client_id>\\\", \\\"client_secret\\\": \\\"\u003Cyour_client_secret>\\\"}\"\n      ]\n    }\n  },\n",[494,7597,7598,7613,7626,7648,7662,7674,7685,7696,7741,7746,7751],{"__ignoreMap":425},[944,7599,7600,7603,7606,7608,7611],{"class":946,"line":947},[944,7601,7602],{"class":958},"  \"",[944,7604,7605],{"class":1058},"mcpServers",[944,7607,3681],{"class":958},[944,7609,7610],{"class":954},": ",[944,7612,2905],{"class":958},[944,7614,7615,7618,7620,7622,7624],{"class":946,"line":1074},[944,7616,7617],{"class":958},"    \"",[944,7619,6773],{"class":950},[944,7621,3681],{"class":958},[944,7623,1375],{"class":958},[944,7625,2935],{"class":958},[944,7627,7628,7631,7634,7636,7638,7640,7643,7645],{"class":946,"line":1081},[944,7629,7630],{"class":958},"      \"",[944,7632,7633],{"class":1054},"command",[944,7635,3681],{"class":958},[944,7637,1375],{"class":958},[944,7639,3267],{"class":958},[944,7641,7642],{"class":1058},"npx",[944,7644,3681],{"class":958},[944,7646,7647],{"class":958},",\n",[944,7649,7650,7652,7655,7657,7659],{"class":946,"line":1088},[944,7651,7630],{"class":958},[944,7653,7654],{"class":1054},"args",[944,7656,3681],{"class":958},[944,7658,1375],{"class":958},[944,7660,7661],{"class":958}," [\n",[944,7663,7664,7667,7670,7672],{"class":946,"line":1948},[944,7665,7666],{"class":958},"        \"",[944,7668,7669],{"class":1058},"mcp-remote",[944,7671,3681],{"class":958},[944,7673,7647],{"class":958},[944,7675,7676,7678,7681,7683],{"class":946,"line":1953},[944,7677,7666],{"class":958},[944,7679,7680],{"class":1058},"https:\u002F\u002Ftrek.pafor.me\u002Fmcp",[944,7682,3681],{"class":958},[944,7684,7647],{"class":958},[944,7686,7687,7689,7692,7694],{"class":946,"line":1959},[944,7688,7666],{"class":958},[944,7690,7691],{"class":1058},"--static-oauth-client-info",[944,7693,3681],{"class":958},[944,7695,7647],{"class":958},[944,7697,7698,7700,7702,7705,7708,7710,7712,7714,7717,7719,7721,7723,7726,7728,7730,7732,7735,7737,7739],{"class":946,"line":2294},[944,7699,7666],{"class":958},[944,7701,2926],{"class":1058},[944,7703,7704],{"class":954},"\\\"",[944,7706,7707],{"class":1058},"client_id",[944,7709,7704],{"class":954},[944,7711,7610],{"class":1058},[944,7713,7704],{"class":954},[944,7715,7716],{"class":1058},"\u003Cyour_client_id>",[944,7718,7704],{"class":954},[944,7720,876],{"class":1058},[944,7722,7704],{"class":954},[944,7724,7725],{"class":1058},"client_secret",[944,7727,7704],{"class":954},[944,7729,7610],{"class":1058},[944,7731,7704],{"class":954},[944,7733,7734],{"class":1058},"\u003Cyour_client_secret>",[944,7736,7704],{"class":954},[944,7738,2932],{"class":1058},[944,7740,1980],{"class":958},[944,7742,7743],{"class":946,"line":2305},[944,7744,7745],{"class":958},"      ]\n",[944,7747,7748],{"class":946,"line":2401},[944,7749,7750],{"class":958},"    }\n",[944,7752,7753,7756],{"class":946,"line":2407},[944,7754,7755],{"class":958},"  }",[944,7757,7647],{"class":954},[430,7759,7760],{},"重新启动 Claude Desktop 客户端。此时在 Local MCP servers（本地MCP服务）列表中就会看到 TREK 已经成功连接：",[433,7762],{"src":7763,"alt":7764,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-trek-server-connected.webp","在 Claude 界面中验证活跃的 TREK 连接状态",[430,7766,7767],{},"现在，您可以直接用日常口语来下达规划指令了：",[433,7769],{"src":7770,"alt":7771,"style":7772},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-natural-language-prompt.webp","使用自然语言提示 Claude 操作旅行数据","max-width: 550px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7774,7775],{},"例如，我们用纯中文录入一笔非标准化的日常开支：",[936,7777,7780],{"className":7778,"code":7779,"language":4641,"meta":425},[4639],"For the West Europe trip, the Grab from KLIA1 to the hotel cost RM115.90 on 26\u002F4\u002F2025. Please add it as an expense without split to the trip.\n",[494,7781,7779],{"__ignoreMap":425},[433,7783],{"src":7784,"alt":7785,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-expense-response.webp","Claude 调用工具自动记录一笔支出",[430,7787,7788,7789,7792],{},"回到后台，刷新 ",[441,7790,7791],{},"Costs"," 面板。我们可以看到这笔打车费用已经被精确地记录下来，且因为命令中并未提及“由谁付款”，系统体贴地将付款人项归纳为了“No one paid yet（尚未有人支付）”：",[433,7794],{"src":7795,"alt":7796,"style":6747},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-page-mcp-parsed-expense.webp","在费用视图中确认最新由 AI 解析的支出",[430,7798,7799],{},"管理行李清单的方式也完全一致：",[433,7801],{"src":7802,"alt":7803,"style":7804},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-packing-items.webp","Claude 使用自然语言提示添加打包清单物品","max-width: 631px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7806,7807,7808,7811],{},"再次刷新 ",[441,7809,7810],{},"Packing List"," 页面，指定的这三样出行装备已经被整齐地加入到了清单之中：",[433,7813],{"src":7814,"alt":7815,"style":7816},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-packing-list-mcp-parsed-items.webp","在打包清单页面中确认最新解析的打包物品","max-width: 312px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,7818,7820],{"id":7819},"_63-gemini-cli动态注册","6.3 Gemini CLI（动态注册）",[430,7822,7823,7824,7827,7828,2223],{},"Gemini CLI 对 ",[441,7825,7826],{},"Dynamic Registration（动态注册机制）"," 提供了极佳的支持，这使得您完全无需在系统后台手动预注册任何客户端凭证。直接将以下代码追加到您本地的 ",[494,7829,7830],{},".gemini\u002Fsettings.json",[936,7832,7834],{"className":2896,"code":7833,"language":2898,"meta":425,"style":425},"    \"trek\": {\n      \"httpUrl\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[494,7835,7836,7848,7867,7880,7893,7898],{"__ignoreMap":425},[944,7837,7838,7840,7842,7844,7846],{"class":946,"line":947},[944,7839,7617],{"class":958},[944,7841,6773],{"class":1058},[944,7843,3681],{"class":958},[944,7845,7610],{"class":954},[944,7847,2905],{"class":958},[944,7849,7850,7852,7855,7857,7859,7861,7863,7865],{"class":946,"line":1074},[944,7851,7630],{"class":958},[944,7853,7854],{"class":950},"httpUrl",[944,7856,3681],{"class":958},[944,7858,1375],{"class":958},[944,7860,3267],{"class":958},[944,7862,7680],{"class":1058},[944,7864,3681],{"class":958},[944,7866,7647],{"class":958},[944,7868,7869,7871,7874,7876,7878],{"class":946,"line":1081},[944,7870,7630],{"class":958},[944,7872,7873],{"class":950},"oauth",[944,7875,3681],{"class":958},[944,7877,1375],{"class":958},[944,7879,2935],{"class":958},[944,7881,7882,7884,7887,7889,7891],{"class":946,"line":1088},[944,7883,7666],{"class":958},[944,7885,7886],{"class":1054},"enabled",[944,7888,3681],{"class":958},[944,7890,1375],{"class":958},[944,7892,1397],{"class":958},[944,7894,7895],{"class":946,"line":1948},[944,7896,7897],{"class":958},"      }\n",[944,7899,7900],{"class":946,"line":1953},[944,7901,7750],{"class":958},[430,7903,7904,7905,7908,7909,7912,7913],{},"在终端运行 ",[494,7906,7907],{},"gemini"," 命令，并在随后拉起的网页授权页面中点击 ",[441,7910,7911],{},"Approve（批准）"," 即可：\n",[433,7914],{"src":7915,"alt":7916,"style":7917},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fmcp-client-oauth-authorization-prompt.webp","批准针对 TREK MCP 服务器的 OAuth 访问授权","max-width: 488px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7919,7920],{},"现在便可以通过极简的命令行终端向 AI 提问了：",[433,7922],{"src":7923,"alt":7924,"style":7925},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-prompt-itinerary.webp","使用 Gemini CLI 提示获取旅行行程","max-width: 415px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7927],{"src":7928,"alt":7929,"style":7193},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-display-itinerary.webp","Gemini CLI 成功展示结构化的旅行信息",[2182,7931,7933],{"id":7932},"_64-kimi-cli动态注册","6.4 Kimi CLI（动态注册）",[430,7935,7936,7937,7940,7941,7944],{},"原理基本相同。请在本地 ",[494,7938,7939],{},"\u002FUsers\u002F\u003C您的用户名>\u002F.kimi\u002F"," 目录下找到 ",[494,7942,7943],{},"mcp.json"," 并写入以下连接配置：",[936,7946,7948],{"className":2896,"code":7947,"language":2898,"meta":425,"style":425},"    \"trek\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"auth\": \"oauth\"\n    }\n",[494,7949,7950,7962,7982,8000,8017],{"__ignoreMap":425},[944,7951,7952,7954,7956,7958,7960],{"class":946,"line":947},[944,7953,7617],{"class":958},[944,7955,6773],{"class":1058},[944,7957,3681],{"class":958},[944,7959,7610],{"class":954},[944,7961,2905],{"class":958},[944,7963,7964,7966,7969,7971,7973,7975,7978,7980],{"class":946,"line":1074},[944,7965,7630],{"class":958},[944,7967,7968],{"class":950},"type",[944,7970,3681],{"class":958},[944,7972,1375],{"class":958},[944,7974,3267],{"class":958},[944,7976,7977],{"class":1058},"http",[944,7979,3681],{"class":958},[944,7981,7647],{"class":958},[944,7983,7984,7986,7988,7990,7992,7994,7996,7998],{"class":946,"line":1081},[944,7985,7630],{"class":958},[944,7987,875],{"class":950},[944,7989,3681],{"class":958},[944,7991,1375],{"class":958},[944,7993,3267],{"class":958},[944,7995,7680],{"class":1058},[944,7997,3681],{"class":958},[944,7999,7647],{"class":958},[944,8001,8002,8004,8007,8009,8011,8013,8015],{"class":946,"line":1088},[944,8003,7630],{"class":958},[944,8005,8006],{"class":950},"auth",[944,8008,3681],{"class":958},[944,8010,1375],{"class":958},[944,8012,3267],{"class":958},[944,8014,7873],{"class":1058},[944,8016,1980],{"class":958},[944,8018,8019],{"class":946,"line":1948},[944,8020,7750],{"class":958},[430,8022,8023,8024,8027,8028,8031,8032],{},"在终端执行 ",[494,8025,8026],{},"kimi mcp auth trek"," 并在网页上点击 ",[441,8029,8030],{},"Approve"," 完成快速授权：\n",[433,8033],{"src":7915,"alt":7916,"style":8034},"max-width: 453px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,8036,8037],{},"完成授权后，您将能够在命令行直接调用所有关联的微服务工具：",[433,8039],{"src":8040,"alt":8041,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fkimi-cli-mcp-authorized-tools-list.webp","授权成功后 Kimi CLI 显示的可用工具列表",[892,8043,8045],{"id":8044},"_7-移动端使用体验","7. 移动端使用体验",[430,8047,8048],{},"在手机和移动设备上，TREK是以 PWA（渐进式Web应用）的形式呈现的。其内置的 Service Worker 能够将地图网格瓦片和日程 API 数据离线缓存，确保在野外或没有网络信号的极佳状态下，您依然能够流畅查看已制定的全部行程。不过，离线状态下的推送通知响应速度相较原生应用会有微小的延迟。",[892,8050,8051],{"id":8051},"写在最后",[430,8053,8054],{},"通过 MCP 将 AI 智能体接入您的日常旅行规划，可以帮您省去那些因手动键入繁多的航班和酒店确认单而产生的大量枯燥劳动。不仅如此，AI 还能根据您指定的具体出行节点和所处季节，智能推荐周边的特色景点。仅仅通过几句随意的对话，AI 就能轻松打通从前期灵感检索、行程路线设计，再到后期预算拆分和行李打包的完整全链路。",[430,8056,8057],{},"不过在目前的版本中，依然存在一些微小的体验瑕疵。例如：通过 PDF 智能解析导入订单时，账单货币会默认对齐到旅行项目的主货币，而不是当时实际刷卡结算的付款货币。此外，在 Collections 收藏夹中新建清单列表时，如果在列表尚未保存时就给它配置封面，该封面可能在保存后失效（您需要在列表正式建立后，点击“编辑”来重新添加并保存，即可解决）。",[430,8059,8060,8061,8066],{},"此外，因为它需要您拥有一定的 VPS 运维基础来亲自运行这套程序，对一般用户确实存在一些上手门槛。TREK 更适合那些重度旅行爱好者、数字游民以及对于自身出行数据隐私和排版有着高水准要求的极客用户。我们由衷地建议您在下定决心搭建自托管服务之前，可以先在 ",[444,8062,8065],{"href":8063,"rel":8064},"https:\u002F\u002Fdemo.liketrek.com\u002F",[448],"demo.liketrek.com"," 上完整试用一下官方提供的公测 DEMO，看它是否切中您的日常痛点。",[892,8068,8070],{"id":8069},"参考资料","参考资料:",[484,8072,8073,8080,8087],{},[487,8074,8075],{},[444,8076,8079],{"href":8077,"rel":8078},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FQuick-Start",[448],"TREK Quick Start",[487,8081,8082],{},[444,8083,8086],{"href":8084,"rel":8085},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FTroubleshooting",[448],"TREK Troubleshooting",[487,8088,8089],{},[444,8090,8093],{"href":8091,"rel":8092},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FMCP-Scopes",[448],"TREK MCP Scopes",[1667,8095,8096],{},"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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":425,"searchDepth":1074,"depth":1081,"links":8098},[8099,8104,8105,8115,8123,8129,8135,8136,8137],{"id":6280,"depth":1081,"text":6281,"children":8100},[8101,8102,8103],{"id":6284,"depth":1088,"text":6285},{"id":6430,"depth":1088,"text":6430},{"id":6461,"depth":1088,"text":6461},{"id":6605,"depth":1081,"text":6606},{"id":6648,"depth":1081,"text":6649,"children":8106},[8107,8108,8109,8110,8111,8112,8113,8114],{"id":6750,"depth":1088,"text":6751},{"id":6761,"depth":1088,"text":6762},{"id":6859,"depth":1088,"text":6860},{"id":6877,"depth":1088,"text":6878},{"id":6913,"depth":1088,"text":6914},{"id":6935,"depth":1088,"text":6936},{"id":6954,"depth":1088,"text":6955},{"id":6965,"depth":1088,"text":6966},{"id":6995,"depth":1081,"text":6996,"children":8116},[8117,8118,8119,8120,8121,8122],{"id":7002,"depth":1088,"text":7003},{"id":7034,"depth":1088,"text":7035},{"id":7104,"depth":1088,"text":7105},{"id":7126,"depth":1088,"text":7127},{"id":7145,"depth":1088,"text":7146},{"id":7170,"depth":1088,"text":7171},{"id":7201,"depth":1081,"text":7202,"children":8124},[8125,8126,8127,8128],{"id":7222,"depth":1088,"text":7223},{"id":7322,"depth":1088,"text":7323},{"id":7385,"depth":1088,"text":7386},{"id":7484,"depth":1088,"text":7485},{"id":7508,"depth":1081,"text":7509,"children":8130},[8131,8132,8133,8134],{"id":7519,"depth":1088,"text":7520},{"id":7540,"depth":1088,"text":7541},{"id":7819,"depth":1088,"text":7820},{"id":7932,"depth":1088,"text":7933},{"id":8044,"depth":1081,"text":8045},{"id":8051,"depth":1081,"text":8051},{"id":8069,"depth":1081,"text":8070},[8139,1687],"travel","2026-09-01","本文详细介绍如何使用Docker部署开源旅行规划系统TREK。我们将带您配置Caddy反向代理和Cloudflare R2对象存储，实现数据的安全备份与图片的高效加载。此外，还将演示如何利用MCP（模型上下文协议）连接Claude等AI智能体，通过自然语言对话一键生成您的专属旅行日程，开启完美旅程。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002FZH-Self-hosted-travel-planner-TREK.webp","在一张温和的羊皮纸背景上，高质量极简风格的TREK自托管旅行规划器仪表盘3D插图。",{"schemaOrg":8145,"robots":1721,"sitemap":8149},[8146,8147],{"@type":1700,"headline":6266,"description":8141},{"@type":4088,"headline":8148,"description":8141},"如何自托管AI旅行规划器TREK：基于Docker、Caddy与Cloudflare R2的终极部署教程",{"lastmod":8140},{"title":8148,"description":8141,"ogTitle":6266,"ogDescription":8141,"twitterTitle":6266,"twitterDescription":8141},"zh\u002Farticle\u002Fself-hosted-travel-planner-trek",[6260,8153,6261,6262,6946],"TREK","YpXK5B3vw79VCnu8AAPsKrl-TJGMOOkDVTMlz2Tw_9Y",{"id":8156,"title":8157,"author":425,"body":8158,"category":8725,"date":8726,"description":8727,"extension":1692,"image":8728,"imageAlt":8729,"isPublished":1077,"meta":8730,"minRead":1074,"navigation":1077,"path":325,"seo":8734,"stem":8736,"tags":8737,"updatedAt":1730,"__hash__":8741},"article\u002Fzh\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts.md","从传统初始化模板脚本到智能体：AI Agent 技能如何优雅地取代 Nuxt 应用程序脚手架构建脚本",{"type":427,"value":8159,"toc":8718},[8160,8174,8178,8181,8277,8280,8308,8314,8318,8333,8336,8353,8357,8368,8538,8542,8625,8629,8638,8658,8665,8680,8690,8693,8699,8702,8707,8715],[430,8161,8162,8163,1859,8166,8169,8170,8173],{},"当我们使用 Nuxt 框架启动一个新应用时，总是需要经历一系列繁琐的初始化步骤，比如安装各种依赖模块，以及配置 ",[494,8164,8165],{},"nuxt.config.ts",[494,8167,8168],{},"wrangler.jsonc"," 等文件。传统的脚本固然可以解决一部分问题，但随着项目定制化需求的增加，脚本的局限性也迅速暴露出来。这正是我们探索并尝试用 ",[441,8171,8172],{},"AI 智能体技能 (Agent Skill)"," 取代传统脚本的原因。",[474,8175,8177],{"id":8176},"传统-shell-脚本擅长什么","传统 Shell 脚本擅长什么",[430,8179,8180],{},"传统的 Shell 脚本非常适合按顺序执行一组固定的指令，且其中的所有决策都是在代码中预先写死的（Hardcoded）。",[936,8182,8184],{"className":1045,"code":8183,"language":1047,"meta":425,"style":425},"#!\u002Fusr\u002Fbin\u002Fenv bash\nset -e\n\nnpx nuxi@latest init \"$1\" --template minimal --packageManager pnpm --no-gitInit -M @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n\ncd \"$1\"\n\ncp ~\u002Ftemplates\u002Fnuxt.config.ts .\ncp ~\u002Ftemplates\u002Fwrangler.jsonc .\n",[494,8185,8186,8191,8198,8202,8241,8245,8255,8259,8268],{"__ignoreMap":425},[944,8187,8188],{"class":946,"line":947},[944,8189,8190],{"class":1084},"#!\u002Fusr\u002Fbin\u002Fenv bash\n",[944,8192,8193,8196],{"class":946,"line":1074},[944,8194,8195],{"class":976},"set",[944,8197,5206],{"class":1058},[944,8199,8200],{"class":946,"line":1081},[944,8201,1078],{"emptyLinePlaceholder":1077},[944,8203,8204,8206,8209,8212,8214,8218,8220,8223,8226,8229,8232,8235,8238],{"class":946,"line":1088},[944,8205,7642],{"class":1054},[944,8207,8208],{"class":1058}," nuxi@latest",[944,8210,8211],{"class":1058}," init",[944,8213,3267],{"class":958},[944,8215,8217],{"class":8216},"sHdIc","$1",[944,8219,3681],{"class":958},[944,8221,8222],{"class":1058}," --template",[944,8224,8225],{"class":1058}," minimal",[944,8227,8228],{"class":1058}," --packageManager",[944,8230,8231],{"class":1058}," pnpm",[944,8233,8234],{"class":1058}," --no-gitInit",[944,8236,8237],{"class":1058}," -M",[944,8239,8240],{"class":1058}," @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n",[944,8242,8243],{"class":946,"line":1948},[944,8244,1078],{"emptyLinePlaceholder":1077},[944,8246,8247,8249,8251,8253],{"class":946,"line":1953},[944,8248,2806],{"class":976},[944,8250,3267],{"class":958},[944,8252,8217],{"class":8216},[944,8254,1980],{"class":958},[944,8256,8257],{"class":946,"line":1959},[944,8258,1078],{"emptyLinePlaceholder":1077},[944,8260,8261,8263,8266],{"class":946,"line":2294},[944,8262,2823],{"class":1054},[944,8264,8265],{"class":1058}," ~\u002Ftemplates\u002Fnuxt.config.ts",[944,8267,4902],{"class":1058},[944,8269,8270,8272,8275],{"class":946,"line":2305},[944,8271,2823],{"class":1054},[944,8273,8274],{"class":1058}," ~\u002Ftemplates\u002Fwrangler.jsonc",[944,8276,4902],{"class":1058},[430,8278,8279],{},"但在面对以下开发痛点时，这种脚本就无能为力了：",[484,8281,8282,8288,8298],{},[487,8283,8284,8287],{},[441,8285,8286],{},"固定的默认值。"," 该脚本将 Nuxt UI 模块写死了。如果我们想换成 Ant Design UI 呢？每增加一个可选的模块，就需要用户提供更多的命令行参数。",[487,8289,8290,8293,8294,8297],{},[441,8291,8292],{},"无法理解用户的真实意图。"," “帮我建一个博客网站”需要引入 ",[494,8295,8296],{},"@nuxt\u002Fcontent","；“帮我建一个带订阅邮件功能的网站”则需要 Cloudflare D1 和 Drizzle ORM。普通的 Shell 脚本根本无法识别这些细微的语义差别——针对每种细微的变体，你都必须重新写一个脚本。",[487,8299,8300,8303,8304,8307],{},[441,8301,8302],{},"在不知不觉中悄然过时。"," Nuxt 框架在大版本迭代时，其目录规范往往会发生显著改变。例如 Nuxt 4 将默认的源码目录更改为了 ",[494,8305,8306],{},"app\u002F","。如果你继续运行为 Nuxt 3 编写的脚手架脚本，它会在后台静默地生成错误的目录结构，且绝不会向用户发出任何警报。",[430,8309,8310,8313],{},[441,8311,8312],{},"应用脚手架的构建","本质上是一个需要“因地制宜做出决策”的问题，而不仅仅是“按步骤执行”。当决策变量增加时，传统的脚本机制完全无法实现规模化扩展。",[474,8315,8317],{"id":8316},"为什么要使用-ai-智能体技能取代传统脚本","为什么要使用 AI 智能体技能取代传统脚本？",[430,8319,8320,8321,8324,8325,8328,8329,8332],{},"智能体技能 (Agent Skill) 并非只是一段死板运行的程序代码，而是一套",[441,8322,8323],{},"供 AI 智能体遵循的结构化知识库","。它包含一个核心的 ",[494,8326,8327],{},"SKILL.md"," 指南，并可以无缝捆绑该任务所需的任何其他文件（如参考文档、配置模板和可执行脚本）。我们在 ",[444,8330,8331],{"href":351},"什么是AI Agent技能？深入探讨其工作原理并手把手教你如何构建高效、可复用的Agent技能"," 一文中详细剖析了智能体技能的工作原理。",[430,8334,8335],{},"智能体技能在保留了脚本执行力度的同时 upright 注入了脚本所匮乏的合理决策能力：",[484,8337,8338,8341,8344,8347,8350],{},[487,8339,8340],{},"能够推断用户的意图，自动评估该应用是否需要搭配数据库。",[487,8342,8343],{},"根据指定的候选清单，智能判断并按需安装可选模块。例如，只有在用户明确提出相关需求时，才会オプトイン (Opt-in) 导入 Nuxt Content、i18n 多语言和流量分析模块。",[487,8345,8346],{},"能够敏锐适应当前的开发生态，使用最新的 Nuxt 框架规范、针对 Cloudflare 绑定的 NuxtHub 以及用于部署的 Wrangler 命令行工具。",[487,8348,8349],{},"具备强大的自我修复能力，能够在某一步骤失败时自律分析原因并重新尝试。",[487,8351,8352],{},"在最终交付项目前，能够严格按照最终检查清单 (Checklist) 进行校验，确保交付质量。",[474,8354,8356],{"id":8355},"我们的-nuxt-cloudflare-脚手架智能体技能技术内幕","我们的 Nuxt & Cloudflare 脚手架智能体技能技术内幕",[430,8358,8359,8360,8367],{},"这个开源技能 ",[444,8361,8364],{"href":8362,"rel":8363},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill",[448],[494,8365,8366],{},"scaffold-nuxt-cloudflare-app-skill"," 包含了一整套面向生产环境的自律构建流程：",[532,8369,8370,8402,8422,8447,8477,8516,8524],{},[487,8371,8372,3089,8375],{},[441,8373,8374],{},"自动澄清无法推断的模糊要点",[484,8376,8377,8388,8394],{},[487,8378,8379,8380,8383,8384,8387],{},"确认首选的 UI 框架（默认是 ",[441,8381,8382],{},"Nuxt UI","，也可选择 ",[441,8385,8386],{},"Antdv Next","）；",[487,8389,8390,8391,8387],{},"确认是否需要数据库支持（如 ",[441,8392,8393],{},"Cloudflare D1",[487,8395,8396,8397,7277,8400,1807],{},"确认是否需要额外模块，例如用于构建 CMS 功能的 ",[494,8398,8399],{},"@nuxtjs\u002Fi18n",[494,8401,8296],{},[487,8403,8404,8407,8408,8411,8412,8414,8415,1859,8418,8421],{},[441,8405,8406],{},"初始化基础应用框架","：运行 ",[494,8409,8410],{},"pnpm dlx nuxi@latest init"," 命令，使用 ",[494,8413,3571],{}," 包管理器初始化最新版的 Nuxt 框架。随后配置原生构建白名单 (native-build allowlists)，以确保 Cloudflare 的构建环境能够顺利编译 ",[494,8416,8417],{},"better-sqlite3",[494,8419,8420],{},"sharp"," 等原生依赖包。",[487,8423,8424,8427,8428,7277,8431,1536,8434,1536,8437,1536,8440,1536,8443,8446],{},[441,8425,8426],{},"基于决策表按需安装模块","：自动安装 ",[494,8429,8430],{},"@nuxt\u002Fui",[494,8432,8433],{},"@antdv-next\u002Fnuxt",[494,8435,8436],{},"@nuxt\u002Fimage",[494,8438,8439],{},"@nuxtjs\u002Fseo",[494,8441,8442],{},"@nuxthub\u002Fcore",[494,8444,8445],{},"@vueuse\u002Fnuxt","，并在选中时条件分支安装 Drizzle\u002FD1、Nuxt Content 以及 i18n。",[487,8448,8449,3089,8452],{},[441,8450,8451],{},"科学合理的目录结构布局",[484,8453,8454,8459,8464,8469,8474],{},[487,8455,8456,8458],{},[494,8457,8306],{}," (Nuxt 4 规范)",[487,8460,8461],{},[494,8462,8463],{},"server\u002F",[487,8465,8466],{},[494,8467,8468],{},"shared\u002F",[487,8470,8471],{},[494,8472,8473],{},"tests\u002F",[487,8475,8476],{},"根目录下的各类标准配置文件。",[487,8478,8479,3089,8484],{},[441,8480,8481,8482],{},"精细配置 ",[494,8483,8165],{},[484,8485,8486,8495,8502,8509],{},[487,8487,8488,8489,1859,8492],{},"为 SEO 配置 ",[494,8490,8491],{},"site.url",[494,8493,8494],{},"site.name",[487,8496,8497,8498,8501],{},"写入用于 Cloudflare 绑定的 NuxtHub ",[494,8499,8500],{},"hub"," 配置块",[487,8503,8504,8505,8508],{},"自动配置 ",[494,8506,8507],{},"routeRules"," 路由与缓存规则",[487,8510,8511,8512,8515],{},"写入最新的 ",[494,8513,8514],{},"compatibilityDate"," 兼容性日期",[487,8517,8518],{},[441,8519,8520,8521,8523],{},"科学生成 ",[494,8522,8168],{}," 配置文件并进行云资源绑定",[487,8525,8526,8529,8530,8533,8534,8537],{},[441,8527,8528],{},"配置 Vitest 测试框架与 ESLint 代码规范","，随后运行",[441,8531,8532],{},"最终校验清单","，在后台实际执行 ",[494,8535,8536],{},"pnpm install && pnpm dev"," 进行沙箱运行测试，全部通过后方才宣告构建成功。",[474,8539,8541],{"id":8540},"传统-shell-脚本-vs-ai-智能体技能维度对比","传统 Shell 脚本 vs AI 智能体技能：维度对比",[604,8543,8544,8557],{},[607,8545,8546],{},[610,8547,8548,8551,8554],{},[613,8549,8550],{},"对比维度",[613,8552,8553],{},"传统 Shell 脚本",[613,8555,8556],{},"AI 智能体技能",[622,8558,8559,8570,8581,8592,8603,8614],{},[610,8560,8561,8564,8567],{},[627,8562,8563],{},"意图识别能力",[627,8565,8566],{},"❌ 行为完全写死",[627,8568,8569],{},"✅ 自动理解自然语言并按需适配",[610,8571,8572,8575,8578],{},[627,8573,8574],{},"动态决策能力",[627,8576,8577],{},"❌ 仅限硬编码的参数判断",[627,8579,8580],{},"✅ 运行时动态推敲最佳方案",[610,8582,8583,8586,8589],{},[627,8584,8585],{},"生态更新适应度",[627,8587,8588],{},"❌ 需开发者手动重写代码",[627,8590,8591],{},"✅ 自动感知当前技术栈规范并适配",[610,8593,8594,8597,8600],{},[627,8595,8596],{},"容错与恢复机制",[627,8598,8599],{},"❌ 一旦出错立即中断退出",[627,8601,8602],{},"✅ 自动定位错误、自愈并继续运行",[610,8604,8605,8608,8611],{},[627,8606,8607],{},"成果质量校验",[627,8609,8610],{},"❌ 缺乏质量校验机制",[627,8612,8613],{},"✅ 依托最终检查清单进行闭环测试",[610,8615,8616,8619,8622],{},[627,8617,8618],{},"长期维护成本",[627,8620,8621],{},"❌ 参数膨胀、逻辑混乱、易崩坏",[627,8623,8624],{},"✅ 只需维护人可读的 Markdown 设计文件",[474,8626,8628],{"id":8627},"如何使用-npx-skills-命令行工具安装-ai-智能体技能","如何使用 npx skills 命令行工具安装 AI 智能体技能",[430,8630,8631,8632,8637],{},"只需一行简单的命令，即可通过 ",[444,8633,8636],{"href":8634,"rel":8635},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fskills",[448],"skills CLI"," 工具完成该技能的无缝导入：",[936,8639,8641],{"className":1045,"code":8640,"language":1047,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git -g\n",[494,8642,8643],{"__ignoreMap":425},[944,8644,8645,8647,8650,8652,8655],{"class":946,"line":947},[944,8646,7642],{"class":1054},[944,8648,8649],{"class":1058}," skills",[944,8651,1068],{"class":1058},[944,8653,8654],{"class":1058}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git",[944,8656,8657],{"class":1058}," -g\n",[430,8659,8660,8661],{},"该工具会自动克隆仓库、定位技能文件，并询问您希望将此技能关联到本地系统所支持的 77 个智能体中的哪一个：\n",[433,8662],{"alt":8663,"src":8664},"在终端中运行 npx skills add 命令行工具来全局安装 Nuxt 脚手架构建技能的界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-add-scaffold-nuxt-installation.webp",[430,8666,8667,8668,8671,8672,8675,8676],{},"我们强烈推荐选择 ",[441,8669,8670],{},"Symlink (符号链接)"," 方式。这种模式下，技能只需在 ",[494,8673,8674],{},"~\u002F.agents\u002Fskills"," 目录中下载一次，所有被勾选的智能体都将指向这同一份原始文件。\n",[433,8677],{"alt":8678,"src":8679},"终端中显示的集中式 Agent 技能安装摘要以及软链接 (Symlink) 路径配置详情","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-installation-summary-details.webp",[484,8681,8682],{},[487,8683,8684],{},[911,8685,8686,8687,1807],{},"如果您希望深入了解如何有效避免技能碎片化并在一处集中管理它们，请参阅我们的这篇深度好文：",[444,8688,8689],{"href":359},"使用 npx skills 工具来彻底解决不同 AI 智能体（如 Claude Code 或 Kimi）技能碎片化问题",[430,8691,8692],{},"完成安装后，打开 Claude Code 终端，输入内置命令即可确认该技能已成功激活。",[430,8694,8695],{},[433,8696],{"alt":8697,"src":8698},"Claude Code 命令行终端中显示的全新安装且已激活可用的 \u002Fscaffold-nuxt 斜杠快捷命令","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fclaude-code-scaffold-nuxt-slash-command-active.webp",[430,8700,8701],{},"接下来，您只需输入一句简单的自然语言，即可瞬间搞定复杂的工程脚手架搭建：",[2529,8703,8704],{},[430,8705,8706],{},"\"Scaffold a new Nuxt app deployed to Cloudflare Workers — Nuxt UI, a blog section, and a D1 database\"",[430,8708,8709,8710,8714],{},"该脚手架技能完全开源，欢迎访问我们的 ",[444,8711,8713],{"href":8362,"rel":8712},[448],"GitHub 仓库"," 提交 Feedback 并上手体验！",[1667,8716,8717],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}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":425,"searchDepth":1074,"depth":1081,"links":8719},[8720,8721,8722,8723,8724],{"id":8176,"depth":1074,"text":8177},{"id":8316,"depth":1074,"text":8317},{"id":8355,"depth":1074,"text":8356},{"id":8540,"depth":1074,"text":8541},{"id":8627,"depth":1074,"text":8628},[1687],"2026-08-25","轻松在 Cloudflare Workers 上快速构建 Nuxt 应用程序脚手架。深入剖析并学习我们如何使用功能强大、极其灵活、支持自我修复且拥有决策能力的 AI 智能体技能来彻底取代脆弱的传统 Shell 脚本，并详细演示如何通过官方 the npx skills 命令行工具将其无缝安装到您的开发工作流中。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002FZH-How-AI-Agent-Skills-Replace-Nuxt-App-Scaffolding-Scripts.webp","Nuxt应用在Cloudflare及Serverless上的脚手架构建：传统Shell脚本与AI智能体技能对比。分析为什么智能体技能优于传统初始化脚本。",{"schemaOrg":8731,"robots":1721,"sitemap":8733},[8732],{"@type":1698,"headline":8157,"description":8727,"image":8728},{"lastmod":8726},{"title":8735,"description":8727,"ogTitle":8157,"ogDescription":8727,"twitterTitle":8157,"twitterDescription":8727},"Nuxt应用在Cloudflare及Serverless上的脚手架构建：传统Shell脚本与AI智能体技能对比","zh\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",[8738,6262,8739,8740],"Nuxt","AI Agent","Scaffolding","cjXSEDECxsBr5bmHuYXOSYY0oFEz98tTOLGuKo9KYag",{"id":8743,"title":8744,"author":1730,"body":8745,"category":9527,"date":9529,"description":9530,"extension":1692,"image":9531,"imageAlt":9532,"isPublished":1077,"meta":9533,"minRead":9538,"navigation":1077,"path":345,"seo":9539,"stem":9540,"tags":9541,"updatedAt":1730,"__hash__":9543},"article\u002Fzh\u002Farticle\u002Fuse-cloudflare-as-ai-memory.md","基于Cloudflare Workers与MCP协议构建个人专属的AI持久化记忆系统，解决Context空白痛点",{"type":427,"value":8746,"toc":9509},[8747,8751,8754,8757,8761,8764,8779,8783,8790,8804,8807,8810,8854,8858,8939,8943,8968,9065,9076,9080,9085,9125,9150,9154,9159,9226,9231,9235,9267,9273,9312,9315,9347,9351,9359,9363,9403,9407,9457,9460,9463,9466,9469,9472,9506],[474,8748,8750],{"id":8749},"持久化ai记忆对智能体agent的重要性","持久化AI记忆对智能体（Agent）的重要性",[430,8752,8753],{},"随着AI助手逐渐融入我们的日常生活与工作，我们经常会遇到“空白上下文”的问题（Blank Context Issue）。上周已经确认的决策在开启新对话后便被遗忘，这迫使我们不得不一遍又一遍地输入相同的技术栈细节，并在每个新会话中重新设置用户偏好。",[430,8755,8756],{},"与其每次都从零开始，我们需要构建一个能够持续演进、深入理解用户决策的记忆系统，从而彻底消除重复输入上下文的烦恼。",[474,8758,8760],{"id":8759},"自托管-ai-记忆系统-vs-内置-ai-记忆功能","自托管 AI 记忆系统 vs. 内置 AI 记忆功能",[430,8762,8763],{},"虽然许多AI智能体或客户端（如 ChatGPT、Claude 等）自带了内置记忆功能，但我们很少在所有场景下只使用单一智能体。我们可能会用 Claude 来设计和规划项目架构，用 Kimi 来编写代码，用 ChatGPT 进行深度的背景研究。然而，这些不同的智能体之间无法直接共享上下文，所有记忆依然被孤立在各自的生态黑盒中。",[430,8765,8766,8767,8772,8773,8778],{},"从软件工程的角度来看，我们并不信任无法控制的黑盒。我们需要的是一个可观察、可审计且完全处于自己掌控之下的 AI 记忆系统。开源项目 ",[444,8768,8771],{"href":8769,"rel":8770},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[448],"Second Brain","（Fork 自 ",[444,8774,8777],{"href":8775,"rel":8776},"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",[448],"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare）提供了一个支持模型上下文协议（Model"," Context Protocol，简称 MCP）的持久化自托管 AI 记忆系统。任何兼容 MCP 协议的 AI 智能体（如 Claude、ChatGPT、Kimi Code 等）都可以完美共享相同的上下文记忆库。",[474,8780,8782],{"id":8781},"如何在-cloudflare-上构建-second-brain-ai-记忆系统","如何在 Cloudflare 上构建 Second Brain AI 记忆系统",[430,8784,8785,8786,8789],{},"Second Brain 记忆系统部署在 ",[441,8787,8788],{},"Cloudflare Workers"," 之上，其提供了全球分布式、极低延迟的 Serverless 运行基础设施。这使得在 AI 的推理和决策循环中，检索记忆（Recall）及写入等操作能够以近乎零延迟的体验执行。",[430,8791,8792,8793,8796,8797,8800,8801,8803],{},"系统使用 ",[441,8794,8795],{},"Workers AI"," 的嵌入（Embedding）模型来生成高维向量。这些嵌入向量存储在 ",[441,8798,8799],{},"Cloudflare Vectorize"," 中，这是一项经过高度优化、全球分布式的高性能向量数据库服务。",[441,8802,8799],{}," 会执行余弦相似度（Cosine Similarity）搜索，以精准匹配具有语义相关性的记忆切片。",[430,8805,8806],{},"Second Brain 还内置了智能的去重与合并机制。只有在内容相似度低于 85% 时，系统才会将其作为新记忆存储；否则，该内容将被拦截或标记为潜在的重复候选。超过 1,600 字符的长文本会被系统在句子或换行符边界处进行合理切分，并保持相邻分片之间有 200 字符的重叠（Overlap），以防丢失上下文语境。随后，每个文本分片都会被单独向量化，从而实现极高精度的语义匹配。",[430,8808,8809],{},"系统为 AI 智能体直接暴露了以下 MCP 工具接口：",[484,8811,8812,8818,8824,8830,8836,8842,8848],{},[487,8813,8814,8817],{},[494,8815,8816],{},"remember","：存储想法、决策、偏好及项目整体上下文",[487,8819,8820,8823],{},[494,8821,8822],{},"append","：为已有的记忆内容追加新的更新或补充信息",[487,8825,8826,8829],{},[494,8827,8828],{},"update","：完全替换已有的某条记忆内容",[487,8831,8832,8835],{},[494,8833,8834],{},"recall","：基于语义相似度检索相关记忆，而非死板的关键词精确匹配",[487,8837,8838,8841],{},[494,8839,8840],{},"list_recent","：浏览最近保存的记忆记录",[487,8843,8844,8847],{},[494,8845,8846],{},"forget","：永久且彻底地删除某条记忆",[487,8849,8850,8853],{},[494,8851,8852],{},"link\u002Fconnections","：明示关联不同的记忆节点（V2 版本提供的图谱功能）",[892,8855,8857],{"id":8856},"在-cloudflare-上配置-second-brain","在 Cloudflare 上配置 Second Brain",[532,8859,8860,8877,8884,8891,8898,8905,8916,8923,8926,8933],{},[487,8861,5250,8862,8867,8868,8871,8872,8876],{},[444,8863,8866],{"href":8864,"rel":8865},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[448],"Github 仓库"," 页面，点击 ",[494,8869,8870],{},"Deploy to Cloudflare"," 按钮。 [[",[433,8873],{"alt":8874,"src":8875},"GitHub 页面上突出显示的 Deploy to Cloudflare 部署按钮","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fdeploy-to-cloudflare-button.webp","]]",[487,8878,8879,8880],{},"填写弹出的 Cloudflare Worker 配置表单。\n",[433,8881],{"alt":8882,"src":8883},"Cloudflare Workers 部署配置表单","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-deployment-form.webp",[487,8885,8886,8887],{},"在 Dimensions（维度）输入 '384'，Metric（度量指标）选择 'cosine'，然后点击 Deploy 按钮。\n",[433,8888],{"alt":8889,"src":8890},"Cloudflare Vectorize 向量数据库创建与维度设置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-vectorize-configuration.webp",[487,8892,8893,8894],{},"部署成功后，以下是 Cloudflare Workers 平台中 Second Brain 实例的概览信息：\n",[433,8895],{"alt":8896,"src":8897},"已部署的 Second Brain Worker 实例概览主页","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-second-brain-overview.webp",[487,8899,8900,8901],{},"点击 'Settings'（设置），然后点击 'AUTH_TOKEN' 环境变量旁的编辑图标，以创建一条高强度的访问令牌：\n",[433,8902],{"alt":8903,"src":8904},"Cloudflare Worker 变量设置中高亮显示的 AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-settings.webp",[487,8906,8907,8908,8912],{},"点击 'Rotate'（轮换）链接，以便能输入新的安全值： ",[433,8909],{"alt":8910,"src":8911},"AUTH_TOKEN 变量修改与秘钥轮换界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-rotate.webp",[433,8913],{"alt":8914,"src":8915},"在 AUTH_TOKEN 值字段中输入生成的随机安全字符串","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-value-input.webp",[487,8917,8918,8919,8922],{},"在 macOS 终端中运行 ",[494,8920,8921],{},"openssl rand -base64 32"," 命令来生成一个随机的安全字符串，并将其复制粘贴到 'Value' 输入框中。",[487,8924,8925],{},"点击 'Deploy' 按钮，使新配置的 'AUTH_TOKEN' 正式生效。",[487,8927,8928,8929],{},"在浏览器中打开您刚刚创建的 Second Brain Worker 访问域名：\n",[433,8930],{"alt":8931,"src":8932},"包含 Bearer Token 输入框的 Second Brain Web 登录界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-login.webp",[487,8934,5250,8935,8938],{},[494,8936,8937],{},"Bearer token"," 输入框中填入刚才创建的 'AUTH_TOKEN'，然后点击 'Connect' 按钮登录 Web 控制台。",[892,8940,8942],{"id":8941},"通过-mcp-协议集成-claude-desktop","通过 MCP 协议集成 Claude Desktop",[532,8944,8945,8952,8959],{},[487,8946,8947,8948],{},"在 Claude Desktop 客户端中点击 'Customize'（自定义）按钮。\n",[433,8949],{"alt":8950,"src":8951},"Claude Desktop 界面中指向 Customize 自定义按钮的位置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-customize-button.webp",[487,8953,8954,8955],{},"点击 'Developer'（开发者）选项，手动编辑本地的 MCP 配置文件：\n",[433,8956],{"alt":8957,"src":8958},"Claude Desktop 开发者设置菜单中用于打开 MCP 配置文件的选项","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-developer-menu.webp",[487,8960,5250,8961,8964,8965,8967],{},[494,8962,8963],{},"claude_desktop_config.json"," 的 ",[494,8966,7605],{}," 字段中加入以下配置代码块：",[936,8969,8971],{"className":2896,"code":8970,"language":2898,"meta":425,"style":425},"    \"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",[494,8972,8973,8986,9004,9016,9026,9037,9048,9057,9061],{"__ignoreMap":425},[944,8974,8975,8977,8980,8982,8984],{"class":946,"line":947},[944,8976,7617],{"class":958},[944,8978,8979],{"class":1058},"second-brain",[944,8981,3681],{"class":958},[944,8983,7610],{"class":954},[944,8985,2905],{"class":958},[944,8987,8988,8990,8992,8994,8996,8998,9000,9002],{"class":946,"line":1074},[944,8989,7630],{"class":958},[944,8991,7633],{"class":950},[944,8993,3681],{"class":958},[944,8995,1375],{"class":958},[944,8997,3267],{"class":958},[944,8999,7642],{"class":1058},[944,9001,3681],{"class":958},[944,9003,7647],{"class":958},[944,9005,9006,9008,9010,9012,9014],{"class":946,"line":1081},[944,9007,7630],{"class":958},[944,9009,7654],{"class":950},[944,9011,3681],{"class":958},[944,9013,1375],{"class":958},[944,9015,7661],{"class":958},[944,9017,9018,9020,9022,9024],{"class":946,"line":1088},[944,9019,7666],{"class":958},[944,9021,7669],{"class":1058},[944,9023,3681],{"class":958},[944,9025,7647],{"class":958},[944,9027,9028,9030,9033,9035],{"class":946,"line":1948},[944,9029,7666],{"class":958},[944,9031,9032],{"class":1058},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[944,9034,3681],{"class":958},[944,9036,7647],{"class":958},[944,9038,9039,9041,9044,9046],{"class":946,"line":1953},[944,9040,7666],{"class":958},[944,9042,9043],{"class":1058},"--header",[944,9045,3681],{"class":958},[944,9047,7647],{"class":958},[944,9049,9050,9052,9055],{"class":946,"line":1959},[944,9051,7666],{"class":958},[944,9053,9054],{"class":1058},"Authorization: Bearer \u003Cyour-token>",[944,9056,1980],{"class":958},[944,9058,9059],{"class":946,"line":2294},[944,9060,7745],{"class":958},[944,9062,9063],{"class":946,"line":2305},[944,9064,7750],{"class":958},[430,9066,9067,9071,9072],{},[433,9068],{"alt":9069,"src":9070},"包含 Second Brain 远程服务的 Claude Desktop MCP 配置文件","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-config-json.webp","\n4. 重启 Claude Desktop 并检查 'Local MCP servers' 列表，状态应显示为 'running'（运行中）。\n",[433,9073],{"alt":9074,"src":9075},"Claude Desktop 客户端中显示为运行（running）状态的的 Second Brain MCP 服务","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-status-running.webp",[892,9077,9079],{"id":9078},"通过-mcp-协议集成-claude-code","通过 MCP 协议集成 Claude Code",[484,9081,9082],{},[487,9083,9084],{},"在终端中运行以下命令以添加该远程 MCP 服务：",[936,9086,9088],{"className":2324,"code":9087,"language":2326,"meta":425,"style":425},"claude mcp add --transport http second-brain https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\n",[494,9089,9090],{"__ignoreMap":425},[944,9091,9092,9095,9098,9100,9103,9106,9109,9112,9114,9117,9120,9122],{"class":946,"line":947},[944,9093,9094],{"class":1054},"claude",[944,9096,9097],{"class":1058}," mcp",[944,9099,1068],{"class":1058},[944,9101,9102],{"class":1058}," --transport",[944,9104,9105],{"class":1058}," http",[944,9107,9108],{"class":1058}," second-brain",[944,9110,9111],{"class":1058}," https:\u002F\u002F",[944,9113,5577],{"class":958},[944,9115,9116],{"class":1058},"your-worker-ur",[944,9118,9119],{"class":954},"l",[944,9121,1263],{"class":958},[944,9123,9124],{"class":1058},"\u002Fmcp\n",[484,9126,9127,9133],{},[487,9128,9129,9130,1807],{},"Claude Code 会自动检测到该端点需要 OAuth 身份验证，并在您的默认浏览器中打开登录页面，供您输入并验证刚才创建的 ",[494,9131,9132],{},"AUTH_TOKEN",[487,9134,9135,9136,9139,9140,9143,9144,9149],{},"在本地的 ",[494,9137,9138],{},"~\u002F.claude"," 目录下创建 ",[494,9141,9142],{},"CLAUDE.md"," 文件，并将 ",[444,9145,9148],{"href":9146,"rel":9147},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[448],"CLAUDE_INSTRUCTIONS.md"," 文件中的引导词和规则完整写入其中。",[892,9151,9153],{"id":9152},"通过-mcp-协议集成-gemini-cli","通过 MCP 协议集成 Gemini CLI",[532,9155,9156],{},[487,9157,9158],{},"将以下 MCP 设定信息加入您本地的 '.\u002F.gemini\u002Fsettings.json' 文件：",[936,9160,9162],{"className":2896,"code":9161,"language":2898,"meta":425,"style":425},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[494,9163,9164,9176,9194,9206,9218,9222],{"__ignoreMap":425},[944,9165,9166,9168,9170,9172,9174],{"class":946,"line":947},[944,9167,7617],{"class":958},[944,9169,8979],{"class":1058},[944,9171,3681],{"class":958},[944,9173,7610],{"class":954},[944,9175,2905],{"class":958},[944,9177,9178,9180,9182,9184,9186,9188,9190,9192],{"class":946,"line":1074},[944,9179,7630],{"class":958},[944,9181,7854],{"class":950},[944,9183,3681],{"class":958},[944,9185,1375],{"class":958},[944,9187,3267],{"class":958},[944,9189,9032],{"class":1058},[944,9191,3681],{"class":958},[944,9193,7647],{"class":958},[944,9195,9196,9198,9200,9202,9204],{"class":946,"line":1081},[944,9197,7630],{"class":958},[944,9199,7873],{"class":950},[944,9201,3681],{"class":958},[944,9203,1375],{"class":958},[944,9205,2935],{"class":958},[944,9207,9208,9210,9212,9214,9216],{"class":946,"line":1088},[944,9209,7666],{"class":958},[944,9211,7886],{"class":1054},[944,9213,3681],{"class":958},[944,9215,1375],{"class":958},[944,9217,1397],{"class":958},[944,9219,9220],{"class":946,"line":1948},[944,9221,7897],{"class":958},[944,9223,9224],{"class":946,"line":1953},[944,9225,7750],{"class":958},[532,9227,9228],{"start":1074},[487,9229,9230],{},"启动 Gemini CLI 客户端。",[892,9232,9234],{"id":9233},"在不同-ai-智能体中测试-second-brain-效果","在不同 AI 智能体中测试 Second Brain 效果",[532,9236,9237,9246,9260],{},[487,9238,5250,9239,9241,9242],{},[441,9240,7557],{}," 中，如果我们只是进行简单的品牌色调偏好设置，此时默认并不会调用外部的 Second Brain 服务：\n",[433,9243],{"alt":9244,"src":9245},"在未启用 Second Brain 记忆层时在 Claude Desktop 中进行的首次偏好设置测试","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-first-run-brand-palette.webp",[487,9247,9248,9249,9251,9252,9255,9256],{},"如果我们只是输入 'remember' 等常规词，由于其尚未触发特定提示词引导，",[441,9250,7557],{}," 此时仅会调用本地内置的 ",[494,9253,9254],{},"memory_user-edits"," 工具，并不会同步到云端的持久化记忆层。\n",[433,9257],{"alt":9258,"src":9259},"Claude Desktop 默认调用本地内置用户编辑工具而忽略云端 Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-remember-built-in-tool-fallback.webp",[487,9261,9262,9263,9266],{},"而当我们在配置了规则引导的 ",[441,9264,9265],{},"Claude Code"," 终端中，输入以下具体指令时，系统便成功地在后台触发并调用了 Second Brain 工具：",[936,9268,9271],{"className":9269,"code":9270,"language":4641},[4639],"Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n",[494,9272,9270],{"__ignoreMap":425},[430,9274,9275,9279,9280,9283,9284,9288,9289,9292,9293,9295,9296,9300,9301,9304,9305,9288,9309],{},[433,9276],{"alt":9277,"src":9278},"Claude Code 终端窗口显示成功触发并写入 Second Brain 远程记忆","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-code-second-brain-mcp-called.webp","\n4. 登录 ",[441,9281,9282],{},"Cloudflare Workers 控制台"," 查看 Second Brain 的数据库，确认这些颜色信息已成功同步并存储在云端：\n",[433,9285],{"alt":9286,"src":9287},"在 Second Brain 控制台 Web UI 中验证已成功保存的品牌色配置数据","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-color-verification.webp","\n- ",[911,9290,9291],{},"Claude Code 之所以能够自动无缝工作，得益于项目目录下的 CLAUDE_INSTRUCTIONS.md 文件。该文件让智能体能够理解并关联包含 'Second Brain' 关键字的记忆流程。","\n5. 在 ",[441,9294,7557],{}," 中若想达到相同效果，我们需要在提示词中显式提及 'Second Brain' 相关的指引，以强制智能体读取或写入这一持久化记忆图层。\n",[433,9297],{"alt":9298,"src":9299},"在提示词中显式提及 'Second Brain' 关键字以触发远程记忆读写","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-second-brain-explicit-trigger.webp","\n6. 同样地，在 ",[441,9302,9303],{},"Gemini CLI"," 交互中，我们也需要提到 'Second Brain' 关键字，以唤醒并触发其对应的远程 MCP 工具。\n",[433,9306],{"alt":9307,"src":9308},"Gemini CLI 终端命令行交互中成功触发 Second Brain 读写","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fgemini-cli-second-brain-trigger.webp",[911,9310,9311],{},"如果您仿照 CLAUDE_INSTRUCTIONS.md 的做法，在本地的 GEMINI.md 文件中添加类似的上下文引导，AI 便可在后台静默调用 Second Brain 记忆层，不再需要您每次都手动输入触发关键字。",[892,9313,9314],{"id":9314},"浏览器插件与快捷剪辑",[484,9316,9317,9320],{},[487,9318,9319],{},"系统为 Chrome、Firefox 和 Microsoft Edge 浏览器提供了官方插件支持。",[487,9321,9322,9323],{},"通过该插件，您可以非常快捷地完成以下操作：\n",[484,9324,9325,9331,9337],{},[487,9326,9327,9330],{},[441,9328,9329],{},"网页一键剪辑"," — 一键将当前页面的网页标题与 URL 网址快捷归档到您的 Second Brain 中。",[487,9332,9333,9336],{},[441,9334,9335],{},"选中文本摘要剪辑"," — 选中网页中的任意精彩段落或技术细节后点击剪辑，该摘录便会配合网页标题和 URL 被一并存储。",[487,9338,9339,9342,9343,9346],{},[441,9340,9341],{},"自由文本速记"," — 在保存前直接在插件弹窗中输入额外的补充上下文，或直接附带 ",[494,9344,9345],{},"#标签","；这些标签会被系统自动识别并提取。",[892,9348,9350],{"id":9349},"通过-obsidian-插件同步个人本地知识库","通过 Obsidian 插件同步个人本地知识库",[484,9352,9353,9356],{},[487,9354,9355],{},"系统提供了一个 Obsidian 专属插件，支持将您本地 Obsidian Vault（保险库）中的特定笔记完美同步至 Cloudflare 端自托管的 Second Brain 记忆中心。",[487,9357,9358],{},"通过配置特定的同步标签，您可以精准控制哪些笔记能够写入您的持久化 AI 上下文库中。",[2182,9360,9362],{"id":9361},"安装-obsidian-插件","安装 Obsidian 插件",[532,9364,9365,9379,9389,9396],{},[487,9366,9367,9368,9371,9372,9375],{},"启动 Obsidian 客户端 → 点击 ",[944,9369,9370],{},"Settings（设置）"," → ",[944,9373,9374],{},"Community Plugins（第三方插件）",[433,9376],{"alt":9377,"src":9378},"Obsidian 系统设置面板中指向第三方社区插件的入口","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-settings-community-plugins.webp",[487,9380,3054,9381,9384,9385],{},[944,9382,9383],{},"Browse（浏览）"," 按钮。\n",[433,9386],{"alt":9387,"src":9388},"Obsidian 第三方插件应用中心并高亮显示的 Browse 浏览按钮","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-browse.webp",[487,9390,9391,9392],{},"检索关键词 'Second Brain Sync'。\n",[433,9393],{"alt":9394,"src":9395},"在 Obsidian 第三方插件市场中搜索 Second Brain Sync 插件","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-search-second-brain.webp",[487,9397,9398,9399],{},"点击 'Install' 进行安装，然后点击 'Enable' 启用该插件。\n",[433,9400],{"alt":9401,"src":9402},"在 Obsidian 中点击安装并启用 Second Brain Sync 插件","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-install-and-enable.webp",[2182,9404,9406],{"id":9405},"配置-obsidian-插件","配置 Obsidian 插件",[532,9408,9409,9419,9426,9433,9440,9450],{},[487,9410,9411,9412,9414,9415,9418],{},"进入 Obsidian 客户端 ",[944,9413,9370],{}," → 选中 ",[944,9416,9417],{},"Second Brain Sync"," 插件配置页面：",[487,9420,9421,9422],{},"准确填写您的 Worker 的端点「URL」和刚才创建的「Auth token（身份令牌）」：\n",[433,9423],{"alt":9424,"src":9425},"在 Obsidian 插件配置页面中输入 Worker URL 和 AUTH_TOKEN 身份凭证","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-configuration-credentials.webp",[487,9427,9428,9429],{},"点击 'Test' 按钮来验证网络连接是否畅通：\n",[433,9430],{"alt":9431,"src":9432},"Obsidian 插件连接测试返回成功（Success）提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-connection-test-success.webp",[487,9434,9435,9436],{},"配置具体的同步策略。设定您的同步标签「Sync tag」并开启「Auto-sync on save（保存时自动同步）」功能：\n",[433,9437],{"alt":9438,"src":9439},"在 Obsidian 插件中配置特定同步标签并启用保存时自动同步","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-sync-behavior-settings.webp",[487,9441,9442,9443,9445,9446],{},"在 Obsidian 知识库中新建一篇笔记，并为其附带您配置好的同步标签（例如： ",[494,9444,8979],{},"）：\n",[433,9447],{"alt":9448,"src":9449},"在 Obsidian 中创建一篇带有 'second-brain' 标签的待同步本地笔记","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-note-with-sync-tag.webp",[487,9451,9452,9453],{},"笔记保存后，其内容已成功触发并自动同步到在 Cloudflare 上运行的自托管 Second Brain 实例中：\n",[433,9454],{"alt":9455,"src":9456},"在云端 Second Brain 控制台 Web UI 中验证已成功同步过来的 Obsidian 笔记","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-synced-note-verification.webp",[474,9458,9459],{"id":9459},"总结与展望",[430,9461,9462],{},"Second Brain 记忆系统为困扰当前 AI 生态的最大痛点之一 —— 长期上下文遗忘与记忆断层，提供了一套极为优雅的开源解决方案。通过将自托管项目与 CloudflareWorkers 弹性、全球分布的 Serverless 基础设施深度结合，我们得以在边缘网络上轻松架设起一条低延迟、高响应速度的个人语义记忆网关。得益于 MCP 这一开放的标准，这条记忆脉络如今已能无缝流动、并被移植共享于各种主流的 AI 助手和开发终端之间。",[430,9464,9465],{},"Obsidian 专属同步插件的加入，更是将这套架构完美融合进了个人日常的知识管理（PKM）流程。您平时随手记录的杂乱卡片或开发速记，能被有选择地提炼并重构，转化为可被 AI 完美解析的结构化上下文。",[430,9467,9468],{},"将私有化部署、高精度的语义向量搜索以及开放式的 MCP 集成标准相融合，Second Brain 不仅仅是一层记忆的外挂，它正向我们展示着一个由用户个人掌握核心数据所有权，安全、独立、互联的未来 Agent 生态系统基石。",[474,9470,9471],{"id":8069},"参考资料：",[484,9473,9474,9480,9486,9493,9500],{},[487,9475,9476],{},[444,9477,9478],{"href":9478,"rel":9479},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[448],[487,9481,9482],{},[444,9483,9484],{"href":9484,"rel":9485},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[448],[487,9487,9488],{},[444,9489,9492],{"href":9490,"rel":9491},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[448],"Connect to AI Clients",[487,9494,9495],{},[444,9496,9499],{"href":9497,"rel":9498},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[448],"Second Brain Obsidian Plugin",[487,9501,9502],{},[444,9503,9504],{"href":9504,"rel":9505},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[448],[1667,9507,9508],{},"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":425,"searchDepth":1074,"depth":1081,"links":9510},[9511,9512,9513,9525,9526],{"id":8749,"depth":1074,"text":8750},{"id":8759,"depth":1074,"text":8760},{"id":8781,"depth":1074,"text":8782,"children":9514},[9515,9516,9517,9518,9519,9520,9521],{"id":8856,"depth":1081,"text":8857},{"id":8941,"depth":1081,"text":8942},{"id":9078,"depth":1081,"text":9079},{"id":9152,"depth":1081,"text":9153},{"id":9233,"depth":1081,"text":9234},{"id":9314,"depth":1081,"text":9314},{"id":9349,"depth":1081,"text":9350,"children":9522},[9523,9524],{"id":9361,"depth":1088,"text":9362},{"id":9405,"depth":1088,"text":9406},{"id":9459,"depth":1074,"text":9459},{"id":8069,"depth":1074,"text":9471},[9528,1687],"cloudflare","2026-08-07","学习如何利用Cloudflare Workers、Vectorize与MCP协议构建自托管的AI持久化记忆系统（Second Brain）。在Claude、Gemini和Obsidian之间实现多Agent上下文共享。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002FZH-Use-Cloudflare-as-AI-memory.webp","基于 Cloudflare Workers 和 Vectorize 构建的自托管 AI 持久化记忆系统，支持 MCP 协议与 Obsidian 笔记双向同步。",{"schemaOrg":9534,"robots":1721,"sitemap":9537},[9535],{"@type":1698,"headline":9536,"description":9530},"基于Cloudflare与MCP构建自托管AI持久化记忆系统",{"lastmod":9529},35,{"title":9536,"description":9530,"ogTitle":8744,"ogDescription":9530,"twitterTitle":8744,"twitterDescription":9530},"zh\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[6262,6946,9542,8771,4097],"AI 记忆","GcIodpT98ONAwkuIbWbfMhCB1u7m4jUIxYtKqcXxO9c",{"id":9545,"title":2541,"author":425,"body":9546,"category":10060,"date":10061,"description":10062,"extension":1692,"image":10063,"imageAlt":10064,"isPublished":1077,"meta":10065,"minRead":1074,"navigation":1077,"path":337,"seo":10069,"stem":10070,"tags":10071,"updatedAt":1730,"__hash__":10074},"article\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac.md",{"type":427,"value":9547,"toc":10053},[9548,9552,9555,9562,9566,9569,9572,9575,9579,9582,9589,9605,9898,10012,10015,10018,10020,10050],[474,9549,9551],{"id":9550},"什么是-cloudflare-warp","什么是 Cloudflare WARP？",[430,9553,9554],{},"Cloudflare WARP 是一款客户端应用程序，它将指定设备的数据流量通过 Cloudflare 的全球网络进行路由，而不是直接发送到公共互联网。",[430,9556,9557,9558,9561],{},"它基于 ",[441,9559,9560],{},"WireGuard"," 协议建立一条加密隧道，从而保护从设备到最近的 Cloudflare 数据中心之间的流量安全。随后，您可以在 Cloudflare 控制面板中创建策略，对这些流入的流量进行过滤、记录、检查或路由。",[474,9563,9565],{"id":9564},"为什么我们需要-cloudflare-warp","为什么我们需要 Cloudflare WARP？",[430,9567,9568],{},"为了向员工、承包商和其他利益相关者安全地公开内部资源（如私有 Web 服务或 SaaS 应用程序），Cloudflare WARP 客户端被用作**零信任网络访问 (ZTNA)**的客户端强制执行点。",[430,9570,9571],{},"Cloudflare WARP 客户端安装在用户的笔记本电脑或手机上。它要求用户在授予访问权限之前进行身份验证，并满足特定的安全状态检查（例如来自经过批准的 IP 范围、使用已注册的邮箱域名或运行处于活动状态的防火墙）。",[430,9573,9574],{},"通过将设备流量直接隧道化传输到 Cloudflare，用户的身份、设备和策略将在请求到达内部资源之前得到验证。因此，内部资源永远不会暴露在公共互联网上，每一次请求都将得到完整的记录和审计。",[474,9576,9578],{"id":9577},"在单台设备上支持多个-warp-配置文件","在单台设备上支持多个 WARP 配置文件",[430,9580,9581],{},"当用户需要在个人和企业 Cloudflare 账户之间进行切换，或者当系统管理员需要管理多个租户（tenant）时，在单台设备上支持多个 WARP 配置文件就显得至关重要。",[430,9583,9584,9585,9588],{},"要在 macOS 上实现这一目标，我们可以使用 ",[494,9586,9587],{},".mobileconfig"," MDM 配置文件来定义和注册不同的 WARP 环境。",[484,9590,9591,9602],{},[487,9592,9593,9594,1807],{},"直接从 Cloudflare ",[444,9595,9598,9599,9601],{"href":9596,"rel":9597},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fstatic\u002Fmdm\u002Fmultiple-orgs\u002FCloudflareWARP.mobileconfig",[448],"下载 ",[494,9600,9587],{}," 示例文件",[487,9603,9604],{},"以下是该配置文件的示例文本：",[936,9606,9610],{"className":9607,"code":9608,"language":9609,"meta":425,"style":425},"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",[494,9611,9612,9617,9622,9627,9632,9637,9642,9647,9652,9657,9662,9667,9672,9677,9682,9687,9692,9697,9702,9707,9712,9717,9722,9727,9732,9737,9742,9747,9751,9755,9760,9764,9769,9773,9779,9784,9790,9796,9802,9808,9814,9820,9826,9832,9838,9844,9850,9856,9862,9868,9874,9880,9886,9892],{"__ignoreMap":425},[944,9613,9614],{"class":946,"line":947},[944,9615,9616],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[944,9618,9619],{"class":946,"line":1074},[944,9620,9621],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[944,9623,9624],{"class":946,"line":1081},[944,9625,9626],{},"\u003Cplist version=\"1.0\">\n",[944,9628,9629],{"class":946,"line":1088},[944,9630,9631],{},"\u003Cdict>\n",[944,9633,9634],{"class":946,"line":1948},[944,9635,9636],{},"  \u003Ckey>PayloadContent\u003C\u002Fkey>\n",[944,9638,9639],{"class":946,"line":1953},[944,9640,9641],{},"  \u003Carray>\n",[944,9643,9644],{"class":946,"line":1959},[944,9645,9646],{},"    \u003Cdict>\n",[944,9648,9649],{"class":946,"line":2294},[944,9650,9651],{},"      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[944,9653,9654],{"class":946,"line":2305},[944,9655,9656],{},"      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n",[944,9658,9659],{"class":946,"line":2401},[944,9660,9661],{},"      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[944,9663,9664],{"class":946,"line":2407},[944,9665,9666],{},"      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[944,9668,9669],{"class":946,"line":2413},[944,9670,9671],{},"      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[944,9673,9674],{"class":946,"line":1723},[944,9675,9676],{},"      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n",[944,9678,9679],{"class":946,"line":2423},[944,9680,9681],{},"      \u003Ckey>PayloadType\u003C\u002Fkey>\n",[944,9683,9684],{"class":946,"line":3336},[944,9685,9686],{},"      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n",[944,9688,9689],{"class":946,"line":3347},[944,9690,9691],{},"      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[944,9693,9694],{"class":946,"line":3352},[944,9695,9696],{},"      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[944,9698,9699],{"class":946,"line":3360},[944,9700,9701],{},"      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[944,9703,9704],{"class":946,"line":3901},[944,9705,9706],{},"      \u003Cinteger>1\u003C\u002Finteger>\n",[944,9708,9709],{"class":946,"line":3907},[944,9710,9711],{},"      \u003Ckey>configs\u003C\u002Fkey>\n",[944,9713,9714],{"class":946,"line":3916},[944,9715,9716],{},"      \u003Carray>\n",[944,9718,9719],{"class":946,"line":4572},[944,9720,9721],{},"        \u003Cdict>\n",[944,9723,9724],{"class":946,"line":5029},[944,9725,9726],{},"          \u003Ckey>organization\u003C\u002Fkey>\n",[944,9728,9729],{"class":946,"line":5038},[944,9730,9731],{},"          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n",[944,9733,9734],{"class":946,"line":5046},[944,9735,9736],{},"          \u003Ckey>display_name\u003C\u002Fkey>\n",[944,9738,9739],{"class":946,"line":5054},[944,9740,9741],{},"          \u003Cstring>Team 1\u003C\u002Fstring>\n",[944,9743,9744],{"class":946,"line":5059},[944,9745,9746],{},"        \u003C\u002Fdict>\n",[944,9748,9749],{"class":946,"line":5066},[944,9750,9721],{},[944,9752,9753],{"class":946,"line":5074},[944,9754,9726],{},[944,9756,9757],{"class":946,"line":5082},[944,9758,9759],{},"          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n",[944,9761,9762],{"class":946,"line":5093},[944,9763,9736],{},[944,9765,9766],{"class":946,"line":5101},[944,9767,9768],{},"          \u003Cstring>Team 2\u003C\u002Fstring>\n",[944,9770,9771],{"class":946,"line":5108},[944,9772,9746],{},[944,9774,9776],{"class":946,"line":9775},34,[944,9777,9778],{},"      \u003C\u002Farray>\n",[944,9780,9781],{"class":946,"line":9538},[944,9782,9783],{},"    \u003C\u002Fdict>\n",[944,9785,9787],{"class":946,"line":9786},36,[944,9788,9789],{},"  \u003C\u002Farray>\n",[944,9791,9793],{"class":946,"line":9792},37,[944,9794,9795],{},"  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[944,9797,9799],{"class":946,"line":9798},38,[944,9800,9801],{},"  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n",[944,9803,9805],{"class":946,"line":9804},39,[944,9806,9807],{},"  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[944,9809,9811],{"class":946,"line":9810},40,[944,9812,9813],{},"  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n",[944,9815,9817],{"class":946,"line":9816},41,[944,9818,9819],{},"  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[944,9821,9823],{"class":946,"line":9822},42,[944,9824,9825],{},"  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n",[944,9827,9829],{"class":946,"line":9828},43,[944,9830,9831],{},"  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n",[944,9833,9835],{"class":946,"line":9834},44,[944,9836,9837],{},"  \u003Cfalse\u002F>\n",[944,9839,9841],{"class":946,"line":9840},45,[944,9842,9843],{},"  \u003Ckey>PayloadScope\u003C\u002Fkey>\n",[944,9845,9847],{"class":946,"line":9846},46,[944,9848,9849],{},"  \u003Cstring>System\u003C\u002Fstring>\n",[944,9851,9853],{"class":946,"line":9852},47,[944,9854,9855],{},"  \u003Ckey>PayloadType\u003C\u002Fkey>\n",[944,9857,9859],{"class":946,"line":9858},48,[944,9860,9861],{},"  \u003Cstring>Configuration\u003C\u002Fstring>\n",[944,9863,9865],{"class":946,"line":9864},49,[944,9866,9867],{},"  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[944,9869,9871],{"class":946,"line":9870},50,[944,9872,9873],{},"  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n",[944,9875,9877],{"class":946,"line":9876},51,[944,9878,9879],{},"  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[944,9881,9883],{"class":946,"line":9882},52,[944,9884,9885],{},"  \u003Cinteger>1\u003C\u002Finteger>\n",[944,9887,9889],{"class":946,"line":9888},53,[944,9890,9891],{},"\u003C\u002Fdict>\n",[944,9893,9895],{"class":946,"line":9894},54,[944,9896,9897],{},"\u003C\u002Fplist>\n",[484,9899,9900,9910,9924,9934,9940,9957,9970,9988,10003],{},[487,9901,9902,9903,1859,9906,9909],{},"将 ",[494,9904,9905],{},"your-team-name-1",[494,9907,9908],{},"your-team-name-2"," 替换为您各自的 Cloudflare Zero Trust 团队名称。",[487,9911,9912,9913,9916,9917,9919,9920,9923],{},"在终端中运行命令 ",[494,9914,9915],{},"uuidgen"," 生成唯一的 UUID，并使用它们替换 ",[494,9918,9587],{}," 文件中的占位符 ",[494,9921,9922],{},"PayloadUUID"," 值。",[487,9925,9926,9927,9930,9931,9933],{},"确保 ",[494,9928,9929],{},"PayloadIdentifier"," 字符串中也包含更新后的 ",[494,9932,9922],{},"，以保证配置文件的唯一性。",[487,9935,9936,9937,9939],{},"保存编辑后的 ",[494,9938,9587],{}," 文件。",[487,9941,9942,9943,9946,9947,9950,9951,9953],{},"打开 Mac 上的",[441,9944,9945],{},"系统设置","，搜索并选择",[441,9948,9949],{},"描述文件","（Profiles）。",[1904,9952],{},[433,9954],{"alt":9955,"src":9956},"macOS 系统设置中的描述档面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-system-settings-profiles.webp",[487,9958,9959,9960,9963,9964,9966],{},"点击",[441,9961,9962],{},"安装、查看或移除...","（Install, view or remove...）开始添加您的新配置文件。",[1904,9965],{},[433,9967],{"alt":9968,"src":9969},"macOS 描述档安装、查看或移除按钮","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-view-remove.webp",[487,9971,9972,9973,9975,9976,9939,9978,9980,9984],{},"点击左下角的 ",[441,9974,725],{},"（加号）图标，并选择您保存的 ",[494,9977,9587],{},[1904,9979],{},[433,9981],{"alt":9982,"src":9983},"macOS 描述档左下角新增（+）按钮","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-add-profile.webp",[433,9985],{"alt":9986,"src":9987},"在 macOS 上选择 .mobileconfig 配置文件","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-select-mobileconfig-file.webp",[487,9989,7554,9990,9992,9993,9996,9997,9999],{},[441,9991,1746],{}," 并点击",[441,9994,9995],{},"安装","以应用此配置。",[1904,9998],{},[433,10000],{"alt":10001,"src":10002},"在 macOS 上确认安装 Cloudflare WARP 描述档","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-install-cloudflare-warp-profile.webp",[487,10004,10005,10006,10008],{},"重新启动您的 Cloudflare WARP 客户端。您现在应该可以在用户界面中看到多组织切换器：",[1904,10007],{},[433,10009],{"alt":10010,"src":10011},"macOS 上支持多组织切换的 Cloudflare WARP 客户端界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fcloudflare-warp-multi-profile-switcher.webp",[474,10013,10014],{"id":10014},"结论",[430,10016,10017],{},"Cloudflare WARP 客户端在用户设备上扮演着关键的安全边界角色，使零信任网络访问（ZTNA）既稳固又极具实用性。通过将内部资源与公共互联网隔离开来，可确保每一次连接尝试都经过安全的身份验证、评估与审计。",[474,10019,8069],{"id":8069},[484,10021,10022,10029,10036,10043],{},[487,10023,10024],{},[444,10025,10028],{"href":10026,"rel":10027},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002F#prepare-file-for-mdm-deployment",[448],"Managed Deployment Preparation",[487,10030,10031],{},[444,10032,10035],{"href":10033,"rel":10034},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002Fswitch-organizations\u002F",[448],"Switch Between Zero Trust Organizations",[487,10037,10038],{},[444,10039,10042],{"href":10040,"rel":10041},"https:\u002F\u002Fblog.cloudflare.com\u002Fintroducing-warp-connector-paving-the-path-to-any-to-any-connectivity-2\u002F",[448],"Introducing WARP Connector: Paving the Path to Any-to-Any Connectivity",[487,10044,10045],{},[444,10046,10049],{"href":10047,"rel":10048},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002F",[448],"Cloudflare One Client Documentation",[1667,10051,10052],{},"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":425,"searchDepth":1074,"depth":1081,"links":10054},[10055,10056,10057,10058,10059],{"id":9550,"depth":1074,"text":9551},{"id":9564,"depth":1074,"text":9565},{"id":9577,"depth":1074,"text":9578},{"id":10014,"depth":1074,"text":10014},{"id":8069,"depth":1074,"text":8069},[2625,9528],"2026-07-04","本指南将详细介绍如何在macOS系统上，通过使用MDM .mobileconfig配置文件，实现多个Cloudflare WARP零信任组织或账户之间的无缝切换。本文为企业IT系统管理员提供了一套完整的、可直接落地部署的操作指南与配置步骤模板，帮助企业轻松管理并确保终端用户的网络安全与合规审计要求。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002FZH-Switch-Between-Multiple-Cloudflare-WARP-Orgs-on-Mac.webp","在Mac上配置和切换多个Cloudflare WARP组织账户",{"schemaOrg":10066,"robots":1721,"sitemap":10068},[10067],{"@type":1700,"headline":2541,"description":10062},{"lastmod":10061},{"title":10064,"description":10062,"ogTitle":2541,"ogDescription":10062,"twitterTitle":2541,"twitterDescription":10062},"zh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",[10072,1746,10073,2639],"macOS","MDM","PqQ8V7tDnvy35zbYhRFeP2qlFyG5TcvpZCHoKbf9GqU",{"id":10076,"title":8331,"author":425,"body":10077,"category":10453,"date":10454,"description":10455,"extension":1692,"image":10456,"imageAlt":10457,"isPublished":1077,"meta":10458,"minRead":1074,"navigation":1077,"path":317,"seo":10462,"stem":10463,"tags":10464,"updatedAt":1730,"__hash__":10469},"article\u002Fzh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them.md",{"type":427,"value":10078,"toc":10443},[10079,10083,10093,10104,10165,10170,10174,10177,10186,10192,10195,10250,10261,10267,10270,10326,10330,10333,10340,10343,10354,10358,10403,10406,10423,10426,10437,10440],[474,10080,10082],{"id":10081},"什么是-ai-agent-技能","什么是 AI Agent 技能？",[430,10084,10085,10086,10089,10090,10092],{},"智能体技能（agent skill）是一种可复用的",[441,10087,10088],{},"指令集"," —— 它是一个标准化的流程，旨在指导 Agent 如何卓越地完成某一特定类型的任务。一个技能通常由单个 Markdown 文件 ",[494,10091,8327],{}," 构成，并且可以打包该任务所需的任何其他文件，例如参考文档、模板或可执行脚本。",[430,10094,10095,10096,10103],{},"以 ",[444,10097,10100],{"href":10098,"rel":10099},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002F733d312884b3878a9a9cff693c5886943753a741\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[448],[494,10101,10102],{},"grill-me"," 技能为例：",[936,10105,10107],{"className":2226,"code":10106,"language":2228,"meta":425,"style":425},"---\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",[494,10108,10109,10114,10124,10134,10138,10142,10147,10151,10156,10160],{"__ignoreMap":425},[944,10110,10111],{"class":946,"line":947},[944,10112,10113],{"class":1054},"---\n",[944,10115,10116,10119,10121],{"class":946,"line":1074},[944,10117,10118],{"class":1371},"name",[944,10120,1375],{"class":958},[944,10122,10123],{"class":1058}," grill-me\n",[944,10125,10126,10129,10131],{"class":946,"line":1081},[944,10127,10128],{"class":1371},"description",[944,10130,1375],{"class":958},[944,10132,10133],{"class":1058}," 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",[944,10135,10136],{"class":946,"line":1088},[944,10137,10113],{"class":1054},[944,10139,10140],{"class":946,"line":1948},[944,10141,1078],{"emptyLinePlaceholder":1077},[944,10143,10144],{"class":946,"line":1953},[944,10145,10146],{"class":1058},"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",[944,10148,10149],{"class":946,"line":1959},[944,10150,1078],{"emptyLinePlaceholder":1077},[944,10152,10153],{"class":946,"line":2294},[944,10154,10155],{"class":1058},"Ask the questions one at a time.\n",[944,10157,10158],{"class":946,"line":2305},[944,10159,1078],{"emptyLinePlaceholder":1077},[944,10161,10162],{"class":946,"line":2401},[944,10163,10164],{"class":1058},"If a question can be answered by exploring the codebase, explore the codebase instead.\n",[430,10166,10167,10169],{},[494,10168,8327],{}," 文件包含一小块元数据（metadata）和指令的正文。元数据由技能的名称（name）和描述（description）组成，AI Agent 会在启动时将其加载。",[474,10171,10173],{"id":10172},"ai-agent-技能的工作原理渐进式披露progressive-disclosure","AI Agent 技能的工作原理：渐进式披露（Progressive Disclosure）",[430,10175,10176],{},"在初始阶段，只有技能的名称 and 描述会被加载到上下文（Context）中。当用户的请求与技能的描述相匹配时，该技能的完整指令正文才会被加载到相同的上下文中。",[430,10178,10179,10180,10185],{},"让我们来看看在实际使用中，",[444,10181,10183],{"href":10098,"rel":10182},[448],[494,10184,10102],{}," 技能是如何工作的。",[430,10187,10188],{},[433,10189],{"alt":10190,"src":10191},"展示 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",[892,10193,10194],{"id":10194},"逐步流程",[532,10196,10197,10203,10209,10215,10221,10234,10244],{},[487,10198,10199,10202],{},[441,10200,10201],{},"请求（Request）"," —— 用户向 Agent 提出需求（例如：“对我的工作流设计进行压力测试剖析”）。",[487,10204,10205,10208],{},[441,10206,10207],{},"选择提示词（Selection prompt）"," —— 用户的请求与所有可用技能的描述一起发送给 LLM。",[487,10210,10211,10214],{},[441,10212,10213],{},"LLM 做出选择"," —— LLM 将请求与每个描述进行对比，并返回匹配的技能。",[487,10216,10217,10220],{},[441,10218,10219],{},"确认（Confirmation）"," —— Agent 将推荐的技能呈现给用户，由用户进行确认（或拒绝\u002F调整）该选择。",[487,10222,10223,10226,10227,10230,10231,10233],{},[441,10224,10225],{},"加载指令"," —— Agent 获取已确认技能的",[911,10228,10229],{},"完整","指令：即 ",[494,10232,8327],{}," 的正文内容。",[487,10235,10236,10239,10240,10243],{},[441,10237,10238],{},"执行提示词（Execution prompt）"," —— 用户的请求",[441,10241,10242],{},"加上所选技能的具体指令","一起发送给 LLM。",[487,10245,10246,10249],{},[441,10247,10248],{},"响应（Response）"," —— LLM 生成输出，即压力测试面谈中的第一个剖析问题。",[430,10251,10252,10253,10260],{},"现在，我们使用 ",[444,10254,10257],{"href":10255,"rel":10256},"https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[448],[494,10258,10259],{},"excalidraw-diagram-skill"," 来演示带参考文档的技能是如何工作的：",[430,10262,10263],{},[433,10264],{"alt":10265,"src":10266},"展示 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",[892,10268,10194],{"id":10269},"逐步流程-1",[532,10271,10272,10277,10282,10291,10296,10308,10316],{},[487,10273,10274,10276],{},[441,10275,10201],{}," —— 用户向 Agent 提出需求（“绘制部署流程的工作流图”）。",[487,10278,10279,10208],{},[441,10280,10281],{},"选择提示词",[487,10283,10284,10286,10287,10290],{},[441,10285,10213],{}," —— LLM 将请求与每个描述进行对比，并返回匹配的技能。在这里，“绘制工作流图”与 ",[494,10288,10289],{},"excalidraw-diagram"," 的描述匹配，因此该技能被选中。",[487,10292,10293,10220],{},[441,10294,10295],{},"确认",[487,10297,10298,10226,10300,10230,10302,10304,10305,10307],{},[441,10299,10225],{},[911,10301,10229],{},[494,10303,8327],{}," 的正文内容以及任何引用的参考文件（对于 ",[494,10306,10289],{},"，这包括调色板、JSON Schema 和图表元素模板）。",[487,10309,10310,10239,10313,10315],{},[441,10311,10312],{},"执行提示词",[441,10314,10242],{},"一起发送给 LLM。模型现在拥有了它所需的详细方法论。",[487,10317,10318,10321,10322,10325],{},[441,10319,10320],{},"响应"," —— LLM 生成输出（一个 ",[494,10323,10324],{},".excalidraw"," 的 JSON 文件），由 Agent 将其返回给用户。",[474,10327,10329],{"id":10328},"ai-agent-技能-vs-工具与-mcp","AI Agent 技能 vs. 工具与 MCP",[430,10331,10332],{},"技能并不能替代提示词、普通工具（Tools） or MCP。工具和 MCP 集成扩展了 Agent 对外部系统的访问范围 —— 例如查询数据库、调用 API 等等。而技能则加深了 Agent 完成特定任务的实战诀窍（Know-how）和专业深度。",[430,10334,10335,10336,10339],{},"诸如 ",[444,10337,10338],{"href":395},"在ChatGPT和Claude中配置NetSuite MCP"," 的 MCP 集成，能够让 Agent 通过访问 NetSuite 中的实时财务和运营数据来回答用户问题。而 NetSuite 业务报告技能则会进一步引导 Agent 如何去撰写这份报告，并以规范的报表形式呈现给用户。",[430,10341,10342],{},"使用技能的典型场景包括：",[484,10344,10345,10348,10351],{},[487,10346,10347],{},"多步骤复杂工作流",[487,10349,10350],{},"文档处理，例如从 PDF 中提取特定数据结构",[487,10352,10353],{},"代码生成规范与标准",[474,10355,10357],{"id":10356},"如何创建-ai-agent-技能","如何创建 AI Agent 技能",[532,10359,10360,10370,10384,10393],{},[487,10361,10362,10365,10366,10369],{},[441,10363,10364],{},"创建一个文件夹","，并以技能名称命名（例如 ",[494,10367,10368],{},"netsuite-operation-report\u002F","）。",[487,10371,10372,10377,10378,10380,10381,10383],{},[441,10373,10374,10375],{},"编写 ",[494,10376,8327],{},"，包含 ",[494,10379,10118],{},"、精准的 ",[494,10382,10128],{},"，以及精炼的指令正文（控制在 200 字以内）。",[487,10385,10386,10389,10390,10392],{},[441,10387,10388],{},"添加任务所需资源"," —— 包括参考文档、模板、脚本。保持 ",[494,10391,8327],{}," 短小精悍，并将细节链接至其他文件。",[487,10394,10395,10398,10399,10402],{},[441,10396,10397],{},"进行安装","，让 Agent 能够发现它。参考 ",[444,10400,10401],{"href":359},"解决AI智能体技能碎片化：集中化管理技能"," 以了解如何在多个 Agent 之间集中管理技能。",[430,10404,10405],{},"编写优秀技能的几个技巧：",[484,10407,10408,10411,10417,10420],{},[487,10409,10410],{},"技能描述（description）应当面向系统触发器（Trigger）来写，而不是给人类阅读。",[487,10412,10413,10414,10416],{},"保持 ",[494,10415,8327],{}," 极其精简 —— 限制在 200 字以内。在正文中写下通用流程，将边缘情况和细节留给参考文档。",[487,10418,10419],{},"凡是确定性的任务，应当使用脚本（Script）来处理。不要让 LLM 去做算术。",[487,10421,10422],{},"做好版本控制，将其提交进 Git 中。",[474,10424,10425],{"id":10425},"总结",[430,10427,10428,10429,10432,10433,10436],{},"与定义“",[911,10430,10431],{},"连接到什么","”的工具和 MCP 不同，智能体技能封装了“",[911,10434,10435],{},"如何去完成工作","”。它们是不可或缺的互补，而非替代关系。",[430,10438,10439],{},"通过利用渐进式披露（Progressive Disclosure），技能可以使 Agent 的上下文窗口保持整洁和高效 —— 仅在用户请求触发时，才会加载详细的指令、参考文档和可执行脚本。",[1667,10441,10442],{},"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":425,"searchDepth":1074,"depth":1081,"links":10444},[10445,10446,10450,10451,10452],{"id":10081,"depth":1074,"text":10082},{"id":10172,"depth":1074,"text":10173,"children":10447},[10448,10449],{"id":10194,"depth":1081,"text":10194},{"id":10269,"depth":1081,"text":10194},{"id":10328,"depth":1074,"text":10329},{"id":10356,"depth":1074,"text":10357},{"id":10425,"depth":1074,"text":10425},[1687],"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":10459,"robots":1721,"sitemap":10461},[10460],{"@type":1700,"headline":8331,"description":10455},{"lastmod":10454},{"title":10457,"description":10455,"ogTitle":8331,"ogDescription":10455,"twitterTitle":8331,"twitterDescription":10455},"zh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",[10465,10466,10467,10468],"AI 智能体","智能体技能","可重复使用的工作流程","AI 教程","_atZh5i-Jgvruah38ZkG41QGU4DTktOc6AYeZmiwxKo",{"id":10471,"title":10472,"author":425,"body":10473,"category":11077,"date":11078,"description":11079,"extension":1692,"image":11080,"imageAlt":11081,"isPublished":1077,"meta":11082,"minRead":1088,"navigation":1077,"path":327,"seo":11096,"stem":11098,"tags":11099,"updatedAt":1730,"__hash__":11103},"article\u002Fzh\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server.md","如何在 Linux VPS 远程服务器上从零开始安装、部署与配置 Hermes Agent",{"type":427,"value":10474,"toc":11066},[10475,10479,10482,10485,10489,10493,10496,10509,10515,10518,10543,10550,10577,10584,10589,10603,10615,10621,10626,10642,10646,10649,10668,10674,10677,10688,10698,10709,10740,10744,10755,10765,10775,10789,10796,10806,10812,10841,10857,10861,10867,10879,10884,10918,10922,10925,10939,10948,11011,11014,11058,11060,11063],[474,10476,10478],{"id":10477},"为什么在远程-vps-上托管-hermes-agent","为什么在远程 VPS 上托管 Hermes Agent？",[430,10480,10481],{},"由于 Hermes Agent 能够执行后台任务、调度作业以及响应 webhook 调用，我们需要一台机器保持 24\u002F7 全天候待命。本地设备可能会断电、断网，或者面临硬件资源耗尽的风险。而远程服务器（VPS）则能保证 99% 以上的在线率（Uptime），并在需要时轻松对计算资源进行弹性扩容。",[430,10483,10484],{},"目前市面上有好几家性价比极高的虚拟专用服务器（VPS）提供商，比如 Hetzner、Hostinger 和 Contabo。我们已经使用 Contabo 有一段时间了，到目前为止，它的表现非常稳定和出色。",[474,10486,10488],{"id":10487},"如何在-linux-vps-上配置-hermes-agent","如何在 Linux VPS 上配置 Hermes Agent",[892,10490,10492],{"id":10491},"第一步连接到您的-vps","第一步：连接到您的 VPS",[430,10494,10495],{},"打开终端并使用 SSH 登录您的远程服务器：",[936,10497,10499],{"className":1045,"code":10498,"language":1047,"meta":425,"style":425},"ssh root@your_server_ip\n",[494,10500,10501],{"__ignoreMap":425},[944,10502,10503,10506],{"class":946,"line":947},[944,10504,10505],{"class":1054},"ssh",[944,10507,10508],{"class":1058}," root@your_server_ip\n",[430,10510,10511],{},[433,10512],{"alt":10513,"src":10514},"在终端中通过 SSH 连接到 Linux VPS 服务器","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fvps-terminal-ssh-connection.webp",[430,10516,10517],{},"确保服务器的软件包都是最新的：",[936,10519,10521],{"className":1045,"code":10520,"language":1047,"meta":425,"style":425},"sudo apt update && sudo apt upgrade -y\n",[494,10522,10523],{"__ignoreMap":425},[944,10524,10525,10527,10529,10532,10534,10536,10538,10541],{"class":946,"line":947},[944,10526,1916],{"class":1054},[944,10528,4474],{"class":1058},[944,10530,10531],{"class":1058}," update",[944,10533,5474],{"class":958},[944,10535,4395],{"class":1054},[944,10537,4474],{"class":1058},[944,10539,10540],{"class":1058}," upgrade",[944,10542,4507],{"class":1058},[430,10544,10545,10546,10549],{},"添加一个新用户 ",[494,10547,10548],{},"hermes","，或者您自定义的其他用户名：",[936,10551,10553],{"className":1045,"code":10552,"language":1047,"meta":425,"style":425},"sudo adduser hermes \nsudo passwd hermes\n",[494,10554,10555,10567],{"__ignoreMap":425},[944,10556,10557,10559,10562,10565],{"class":946,"line":947},[944,10558,1916],{"class":1054},[944,10560,10561],{"class":1058}," adduser",[944,10563,10564],{"class":1058}," hermes",[944,10566,2049],{"class":954},[944,10568,10569,10571,10574],{"class":946,"line":1074},[944,10570,1916],{"class":1054},[944,10572,10573],{"class":1058}," passwd",[944,10575,10576],{"class":1058}," hermes\n",[430,10578,10579,10580,10583],{},"关闭 ",[494,10581,10582],{},"root"," 用户的密码登录以增强安全性：",[532,10585,10586],{},[487,10587,10588],{},"打开 SSH 配置文件：",[936,10590,10592],{"className":1045,"code":10591,"language":1047,"meta":425,"style":425},"sudo nano \u002Fetc\u002Fssh\u002Fsshd_config\n",[494,10593,10594],{"__ignoreMap":425},[944,10595,10596,10598,10600],{"class":946,"line":947},[944,10597,1916],{"class":1054},[944,10599,2335],{"class":1058},[944,10601,10602],{"class":1058}," \u002Fetc\u002Fssh\u002Fsshd_config\n",[532,10604,10605],{"start":1074},[487,10606,10607,10608,10611,10612,492],{},"找到 ",[494,10609,10610],{},"PermitRootLogin"," 这一行，将其值修改为 ",[494,10613,10614],{},"no",[936,10616,10619],{"className":10617,"code":10618,"language":4641,"meta":425},[4639],"PermitRootLogin no\n",[494,10620,10618],{"__ignoreMap":425},[532,10622,10623],{"start":1081},[487,10624,10625],{},"保存文件并重启 SSH 服务：",[936,10627,10629],{"className":1045,"code":10628,"language":1047,"meta":425,"style":425},"sudo systemctl restart ssh\n",[494,10630,10631],{"__ignoreMap":425},[944,10632,10633,10635,10637,10639],{"class":946,"line":947},[944,10634,1916],{"class":1054},[944,10636,1919],{"class":1058},[944,10638,1922],{"class":1058},[944,10640,10641],{"class":1058}," ssh\n",[892,10643,10645],{"id":10644},"第二步安装-hermes-agent","第二步：安装 Hermes Agent",[430,10647,10648],{},"运行以下命令：",[936,10650,10652],{"className":1045,"code":10651,"language":1047,"meta":425,"style":425},"curl -fsSL https:\u002F\u002Fhermes-agent.nousresearch.com\u002Finstall.sh | bash\n",[494,10653,10654],{"__ignoreMap":425},[944,10655,10656,10658,10660,10663,10665],{"class":946,"line":947},[944,10657,2981],{"class":1054},[944,10659,4386],{"class":1058},[944,10661,10662],{"class":1058}," https:\u002F\u002Fhermes-agent.nousresearch.com\u002Finstall.sh",[944,10664,4392],{"class":958},[944,10666,10667],{"class":1054}," bash\n",[430,10669,10670],{},[433,10671],{"alt":10672,"src":10673},"在终端中运行 Hermes Agent 的一键安装脚本","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-agent-installation-terminal.webp",[430,10675,10676],{},"安装完成后，输入以下命令验证是否安装成功：",[936,10678,10680],{"className":1045,"code":10679,"language":1047,"meta":425,"style":425},"hermes --version\n",[494,10681,10682],{"__ignoreMap":425},[944,10683,10684,10686],{"class":946,"line":947},[944,10685,10548],{"class":1054},[944,10687,3604],{"class":1058},[430,10689,3745,10690,10693,10694],{},[494,10691,10692],{},"hermes setup"," 命令行工具来配置 Hermes Agent：\n",[433,10695],{"alt":10696,"src":10697},"在终端中运行 hermes setup 命令开始向导配置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-agent-setup-wizard.webp",[430,10699,10700,10701,10704,10705],{},"选择大语言模型（LLM）提供商，我们可以先选择 ",[494,10702,10703],{},"DeepSeek","，后续再根据需要添加其他模型。\n",[433,10706],{"alt":10707,"src":10708},"在 Hermes 设置中选择 DeepSeek 作为 LLM 大模型提供商","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-llm-provider-selection.webp",[430,10710,10711,10712,10714,10715,10719,10723,10724,3089,10727,10731,10732,10735,10736],{},"输入您的 ",[494,10713,10703],{}," API 密钥：\n",[433,10716],{"alt":10717,"src":10718},"在终端命令行中输入 DeepSeek API 密钥","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-enter-api-key.webp",[433,10720],{"alt":10721,"src":10722},"成功验证并确认大模型提供商的 API 密钥","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-api-key-success.webp","\n在运行 Hermes Agent 的环境选项中选择 ",[494,10725,10726],{},"local machine",[433,10728],{"alt":10729,"src":10730},"选择 local machine 本地设备作为 Hermes Agent 的执行环境","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-select-local-machine.webp","\n在通信渠道（Channels）中选择 ",[494,10733,10734],{},"Telegram","，其他渠道可以在后续随时配置。\n",[433,10737],{"alt":10738,"src":10739},"在 Hermes 设置中选择 Telegram 作为通信管道渠道","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-select-telegram-channel.webp",[892,10741,10743],{"id":10742},"第三步与-telegram-进行集成","第三步：与 Telegram 进行集成",[430,10745,10746,10747,10750,10751],{},"选择选项 ",[494,10748,10749],{},"[2]"," 来使用 Telegram 机器人。\n",[433,10752],{"alt":10753,"src":10754},"选择选项开始集成并配置 Telegram 机器人","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-bot-integration-option.webp",[430,10756,10757,10758,10760,10761],{},"打开 ",[494,10759,10734],{}," 并搜索 'BotFather' 官方账号。\n",[433,10762],{"alt":10763,"src":10764},"在 Telegram 应用中搜索官方 BotFather 账号","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-search-botfather.webp",[430,10766,3054,10767,10770,10771],{},[494,10768,10769],{},"Open"," 打开与 'BotFather' 的对话框。\n",[433,10772],{"alt":10773,"src":10774},"在 Telegram 中打开与 BotFather 的对话框","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-open-botfather-chat.webp",[430,10776,3054,10777,10780,10781,10784,10785],{},[494,10778,10779],{},"Create a New Bot","（或输入 ",[494,10782,10783],{},"\u002Fnewbot"," 指令）。\n",[433,10786],{"alt":10787,"src":10788},"向 BotFather 发送 \u002Fnewbot 指令以创建全新的机器人","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-create-new-bot.webp",[430,10790,10791,10792],{},"按照提示填写名称和用户名，完成机器人的创建。\n",[433,10793],{"alt":10794,"src":10795},"配置新 Telegram 机器人的昵称和唯一用户名","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-bot-details-configured.webp",[430,10797,3054,10798,10801,10802],{},[494,10799,10800],{},"Copy"," 复制机器人 Token（令牌），并将其粘贴回终端中。\n",[433,10803],{"alt":10804,"src":10805},"复制新创建的 Telegram 机器人的 HTTP API 访问 Token","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-copy-http-api-token.webp",[430,10807,10808,10809,10811],{},"获取您的 ",[494,10810,10734],{}," 账号 ID 并将其添加到允许访问的用户列表（'Allowed user list'）中：",[484,10813,10814,10823,10838],{},[487,10815,5250,10816,10818,10819],{},[494,10817,10734],{}," 中搜索 '@raw_data_bot'。\n",[433,10820],{"alt":10821,"src":10822},"在 Telegram 中搜索 raw data bot 机器人以检索账号 ID","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-search-raw-data-bot.webp",[487,10824,10825,10826,10829,10830,10833,10834],{},"点击进入 ",[494,10827,10828],{},"RawDataBot"," 并点击 Start（开始）按钮。您的用户 ID 将显示在 ",[494,10831,10832],{},"P.S. Your ID:"," 后面。\n",[433,10835],{"alt":10836,"src":10837},"启动 RawDataBot 机器人以获取当前用户的账号 ID","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-raw-data-bot-user-id.webp",[487,10839,10840],{},"复制该用户 ID 并粘贴到终端中。",[430,10842,10843,10844,10848,10849,10853],{},"由于我们在云端运行此服务，我们希望它能在系统启动时自动运行。\n",[433,10845],{"alt":10846,"src":10847},"配置 Hermes systemd 服务开机自启自动运行的选项","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-autostart-service-option.webp","\n将其他设置均保持默认值即可：\n",[433,10850],{"alt":10851,"src":10852},"在终端设置中将各项基础配置保持默认推荐值","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-leave-defaults-1.webp",[433,10854],{"alt":10855,"src":10856},"在 Hermes 配置向导中完成默认选项的设置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-leave-defaults-2.webp",[474,10858,10860],{"id":10859},"使用-telegram-机器人测试您的-hermes-agent","使用 Telegram 机器人测试您的 Hermes Agent",[430,10862,10863,10864,934],{},"运行以下命令启动 ",[494,10865,10866],{},"hermes gateway",[936,10868,10870],{"className":1045,"code":10869,"language":1047,"meta":425,"style":425},"hermes gateway\n",[494,10871,10872],{"__ignoreMap":425},[944,10873,10874,10876],{"class":946,"line":947},[944,10875,10548],{"class":1054},[944,10877,10878],{"class":1058}," gateway\n",[430,10880,10757,10881,10883],{},[494,10882,10734],{},"，将刚刚创建的机器人，例如 '@tech_cloud_hermes_bot'，添加到对话中。",[484,10885,10886,10899,10909],{},[487,10887,10888,10889,10891,10892,10894,10895],{},"在对话框中输入 ",[494,10890,1477],{}," 启动一个新的 ",[494,10893,1742],{}," 对话会话。\n",[433,10896],{"alt":10897,"src":10898},"在 Telegram 聊天框中输入 \u002Fnew 指令开启新的智能体对话会话","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-new-session.webp",[487,10900,10901,10902,10904,10905],{},"输入 ",[494,10903,1517],{}," 指令将列出所有可用的操作命令。\n",[433,10906],{"alt":10907,"src":10908},"在 Telegram 聊天框中输入 \u002Fcommands 指令查看可用操作指令列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-commands-list.webp",[487,10910,10901,10911,10913,10914],{},[494,10912,1551],{}," 指令即可查看当前可用的 LLM 大模型列表。\n",[433,10915],{"alt":10916,"src":10917},"在 Telegram 聊天框中输入 \u002Fmodel 指令查看可切换的 LLM 列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-model-selection.webp",[474,10919,10921],{"id":10920},"将-hermes-gateway-配置为后台常驻服务","将 Hermes Gateway 配置为后台常驻服务",[430,10923,10924],{},"创建 systemd 守护进程服务文件：",[936,10926,10928],{"className":2324,"code":10927,"language":2326,"meta":425,"style":425},"sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-gateway.service\n",[494,10929,10930],{"__ignoreMap":425},[944,10931,10932,10934,10936],{"class":946,"line":947},[944,10933,1916],{"class":1054},[944,10935,2335],{"class":1058},[944,10937,10938],{"class":1058}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-gateway.service\n",[430,10940,10941,10942,3457,10945,10947],{},"粘贴以下配置，注意将 ",[494,10943,10944],{},"\u002Fhome\u002Fhermes",[494,10946,10548],{}," 替换为您自己的用户名：",[936,10949,10951],{"className":2350,"code":10950,"language":2352,"meta":425,"style":425},"[Unit]\nDescription=Hermes Gateway\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes gateway\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",[494,10952,10953,10957,10962,10966,10970,10974,10978,10982,10987,10991,10995,10999,11003,11007],{"__ignoreMap":425},[944,10954,10955],{"class":946,"line":947},[944,10956,2359],{},[944,10958,10959],{"class":946,"line":1074},[944,10960,10961],{},"Description=Hermes Gateway\n",[944,10963,10964],{"class":946,"line":1081},[944,10965,2369],{},[944,10967,10968],{"class":946,"line":1088},[944,10969,1078],{"emptyLinePlaceholder":1077},[944,10971,10972],{"class":946,"line":1948},[944,10973,2378],{},[944,10975,10976],{"class":946,"line":1953},[944,10977,2383],{},[944,10979,10980],{"class":946,"line":1959},[944,10981,2388],{},[944,10983,10984],{"class":946,"line":2294},[944,10985,10986],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes gateway\n",[944,10988,10989],{"class":946,"line":2305},[944,10990,2398],{},[944,10992,10993],{"class":946,"line":2401},[944,10994,2404],{},[944,10996,10997],{"class":946,"line":2407},[944,10998,2410],{},[944,11000,11001],{"class":946,"line":2413},[944,11002,1078],{"emptyLinePlaceholder":1077},[944,11004,11005],{"class":946,"line":1723},[944,11006,2420],{},[944,11008,11009],{"class":946,"line":2423},[944,11010,2426],{},[430,11012,11013],{},"启用并启动该背景服务：",[936,11015,11017],{"className":2324,"code":11016,"language":2326,"meta":425,"style":425},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-gateway\nsudo systemctl start hermes-gateway\nsudo systemctl status hermes-gateway\n",[494,11018,11019,11027,11038,11048],{"__ignoreMap":425},[944,11020,11021,11023,11025],{"class":946,"line":947},[944,11022,1916],{"class":1054},[944,11024,1919],{"class":1058},[944,11026,2445],{"class":1058},[944,11028,11029,11031,11033,11035],{"class":946,"line":1074},[944,11030,1916],{"class":1054},[944,11032,1919],{"class":1058},[944,11034,2046],{"class":1058},[944,11036,11037],{"class":1058}," hermes-gateway\n",[944,11039,11040,11042,11044,11046],{"class":946,"line":1081},[944,11041,1916],{"class":1054},[944,11043,1919],{"class":1058},[944,11045,2465],{"class":1058},[944,11047,11037],{"class":1058},[944,11049,11050,11052,11054,11056],{"class":946,"line":1088},[944,11051,1916],{"class":1054},[944,11053,1919],{"class":1058},[944,11055,1943],{"class":1058},[944,11057,11037],{"class":1058},[474,11059,9459],{"id":9459},[430,11061,11062],{},"在本文中，我们主要分享了如何在云端服务器上搭建并配置 Hermes Agent，并通过 Telegram 实现与其双向的高效沟通。让 Hermes Agent 运行在远程 VPS 上，能够为您打造一个 24 小时永不下线的、真正的 AI 数字化个人助手。",[1667,11064,11065],{},"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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":425,"searchDepth":1074,"depth":1081,"links":11067},[11068,11069,11074,11075,11076],{"id":10477,"depth":1074,"text":10478},{"id":10487,"depth":1074,"text":10488,"children":11070},[11071,11072,11073],{"id":10491,"depth":1081,"text":10492},{"id":10644,"depth":1081,"text":10645},{"id":10742,"depth":1081,"text":10743},{"id":10859,"depth":1074,"text":10860},{"id":10920,"depth":1074,"text":10921},{"id":9459,"depth":1074,"text":9459},[1687],"2026-06-19","在本篇非常详尽的实战教程中，我们将一步步向您展示如何在远程 Linux VPS 服务器上成功安装与部署 Hermes Agent，并实现 24 小时稳定常驻运行。我们还会手把手教您如何通过自定义的 Telegram 机器人，快速与Hermes进行无缝对接，轻松实现自动化的任务管理，确保系统能随时在线响应。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002FZH-How%20to%20Setup%20Hermes%20on%20Remote%20Server.webp","手把手教您如何在远程 Linux VPS 服务器上成功部署 Hermes Agent，并实现与自定义 Telegram 机器人的双向集成。",{"schemaOrg":11083,"robots":1721,"sitemap":11095},[11084],{"@type":1700,"name":10472,"description":11079,"image":11080,"step":11085},[11086,11089,11092],{"@type":1703,"name":10492,"text":11087,"image":10514,"url":11088},"打开终端并使用 SSH 登录您的远程服务器： 确保服务器的软件包都是最新的： 添加一个新用户 `hermes`，或者您自定义的其他用户名： 关闭 `root` 用户的密码登录以增强安全性： 1. 打开 SSH 配置文件： 2. 找到 `PermitRootLogin` 这一行，将其值修改为 `...","#-vps",{"@type":1703,"name":10645,"text":11090,"image":10673,"url":11091},"运行以下命令： 安装完成后，输入以下命令验证是否安装成功： 运行 `hermes setup` 命令行工具来配置 Hermes Agent： 选择大语言模型（LLM）提供商，我们可以先选择 `DeepSeek`，后续再根据需要添加其他模型。 输入您的 `DeepSeek` API 密钥： 在运...","#-hermes-agent",{"@type":1703,"name":10743,"text":11093,"image":10754,"url":11094},"选择选项 `[2]` 来使用 Telegram 机器人。 打开 `Telegram` 并搜索 'BotFather' 官方账号。 点击 `Open` 打开与 'BotFather' 的对话框。 点击 `Create a New Bot`（或输入 `\u002Fnewbot` 指令）。 按照提示填写名称和...","#-telegram-",{"lastmod":11078},{"title":11097,"description":11079,"ogTitle":10472,"ogDescription":11079,"twitterTitle":10472,"twitterDescription":11079},"Hermes Agent VPS 部署：Telegram 机器人双向集成指南","zh\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",[1742,11100,11101,11102,8739],"VPS Setup","Telegram Bot","Linux VPS","3W7iQIun_QDbvFC66RehnT4AHrYJJQhyta-BATtk8wc",{"id":11105,"title":11106,"author":1730,"body":11107,"category":11552,"date":11553,"description":11554,"extension":1692,"image":11555,"imageAlt":11556,"isPublished":1077,"meta":11557,"minRead":5101,"navigation":1077,"path":335,"seo":11561,"stem":11563,"tags":11564,"updatedAt":1730,"__hash__":11567},"article\u002Fzh\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude.md","NetSuite AI Connector集成与配置完全指南：模型上下文协议MCP设置与典型业务场景详解",{"type":427,"value":11108,"toc":11538},[11109,11112,11126,11130,11140,11157,11161,11298,11302,11356,11360,11412,11416,11420,11426,11431,11435,11441,11453,11457,11467,11483,11487,11493,11498,11502,11508,11511,11515],[430,11110,11111],{},"Oracle NetSuite 作为面向中小型企业的云端企业资源计划（ERP）平台，早已享誉业界。然而，其网页端用户界面（UI）也因其陡峭的学习曲线、繁琐的点击操作以及死板的报表结构而备受诟病。",[430,11113,11114,11115,11118,11119,1859,11122,11125],{},"随着近期 ",[441,11116,11117],{},"NetSuite AI Connector Service"," 的发布，用户现在可以借助 ",[441,11120,11121],{},"Model Context Protocol (MCP，模型上下文协议)",[441,11123,11124],{},"AI（人工智能）助手","，直接使用通俗的自然语言提问，并实时获取企业财务与运营数据的解答。",[474,11127,11129],{"id":11128},"netsuite-mcp-ai-连接器的工作原理","NetSuite MCP AI 连接器的工作原理",[430,11131,11132,11135,11136,11139],{},[441,11133,11134],{},"NetSuite 的 MCP"," 向 ",[441,11137,11138],{},"AI"," 开放了一系列工具，例如运行 SuiteQL 查询、读取已保存搜索（Saved Searches）和报表，或者执行记录操作（如创建新的客户记录）。所有工具的操作权限都严格受控于 NetSuite 原生的基于角色的权限控制（RBAC）。",[430,11141,11142,11143,11145,11146,11149,11150,11153,11154,11156],{},"当用户用日常语言提出问题时，",[441,11144,11138],{}," 会使用 ",[441,11147,11148],{},"Model Context Protocol (MCP)"," 将该请求转化为 NetSuite 能够理解的结构化操作。",[441,11151,11152],{},"NetSuite"," 将使用该用户的权限执行这些操作，然后将结果返回给 ",[441,11155,11138],{}," 进行分析和可视化呈现。",[474,11158,11160],{"id":11159},"netsuite-ai-connector-配置指南","NetSuite AI Connector 配置指南",[532,11162,11163,11219,11234,11243,11250,11257,11279],{},[487,11164,11165,11166,11169,11170,11173,11174],{},"启用 ",[441,11167,11168],{},"Server SuiteScript","（服务器端 SuiteScript）和 ",[441,11171,11172],{},"REST Web Services","（REST Web 服务）\n",[532,11175,11176,11187,11214],{},[487,11177,11178,11179,11182,11183],{},"访问 ",[911,11180,11181],{},"Setup > Company > Enable Features","（设置 > 公司 > 启用功能）。\n",[433,11184],{"alt":11185,"src":11186},"Oracle NetSuite“启用功能”设置页面（位于“设置 > 公司”菜单下）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-setup-company-enable-features.webp",[487,11188,5250,11189,11192,11193],{},[441,11190,11191],{},"SuiteCloud"," 子页签中：\n",[484,11194,11195,11205],{},[487,11196,11197,11198,11200,11201],{},"在 SuiteScript 栏目下，勾选 ",[441,11199,11168],{},"。\n",[433,11202],{"alt":11203,"src":11204},"在 NetSuite SuiteCloud 选项卡中勾选启用“服务器 SuiteScript”复选框","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-enable-features-server-suitescript.webp",[487,11206,11207,11208,11200,11210],{},"在 SuiteTalk (Web Services) 栏目下，勾选 ",[441,11209,11172],{},[433,11211],{"alt":11212,"src":11213},"在 NetSuite SuiteCloud 选项卡中勾选启用“REST Web 服务”复选框","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-enable-features-rest-web-services.webp",[487,11215,3054,11216,11218],{},[441,11217,1152],{},"（保存）。",[487,11220,11221,11222,11225,11226,11229,11230],{},"首先安装 ",[441,11223,11224],{},"NetSuite MCP Standard Tools","。点击 ",[911,11227,11228],{},"Customization > SuiteCloud Development > SuiteApp Marketplace","（定制 > SuiteCloud 开发 > SuiteApp 市场）。\n",[433,11231],{"alt":11232,"src":11233},"在 NetSuite 中经由“定制 > SuiteCloud 开发”导航至 SuiteApp 应用商店","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-marketplace-navigation.webp",[487,11235,11236,11237,11200,11239],{},"搜索 ",[441,11238,11224],{},[433,11240],{"alt":11241,"src":11242},"在 SuiteApp 应用商店中搜索“NetSuite MCP Standard Tools”","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-marketplace-search-mcp-tools.webp",[487,11244,11245,11246],{},"安装完成后，您将在右侧看到“Installed”（已安装）状态。\n",[433,11247],{"alt":11248,"src":11249},"在应用商店中确认“NetSuite MCP Standard Tools”状态显示为“已安装”","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-installed-status-mcp-tools.webp",[487,11251,11252,11253],{},"按照相同步骤安装“NetSuite AI Connector Service Companion”。\n",[433,11254],{"alt":11255,"src":11256},"确认“NetSuite AI Connector Service Companion”已成功安装的状态页面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-installed-ai-connector-companion.webp",[487,11258,11259,11260],{},"创建集成记录（Integration Record）\n",[532,11261,11262,11272],{},[487,11263,11178,11264,11267,11268],{},[911,11265,11266],{},"Setup > Integration > Manage Integrations","（设置 > 集成 > 管理集成）。\n",[433,11269],{"alt":11270,"src":11271},"导航至 NetSuite 设置菜单中的“集成 > 管理集成”页面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-integration-manage-integrations-navigation.webp",[487,11273,11274,11275],{},"为 ChatGPT 创建一个 Integration Record，稍后我们将回来填入实际生成的 token_id：\n",[433,11276],{"alt":11277,"src":11278},"在 NetSuite 中为 ChatGPT 连接创建全新的集成记录（Integration Record）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-create-integration-record-chatgpt.webp",[487,11280,11281,11282,11286,11290,11294],{},"为 MCP 创建一个具备最小化权限的自定义角色并分配给对应用户，例如：\n",[433,11283],{"alt":11284,"src":11285},"为 NetSuite MCP 集成配置专属自定义角色的权限设置 - 步骤 1","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-1.webp",[433,11287],{"alt":11288,"src":11289},"为 NetSuite MCP 集成配置专属自定义角色的权限设置 - 步骤 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-2.webp",[433,11291],{"alt":11292,"src":11293},"为 NetSuite MCP 集成配置专属自定义角色的权限设置 - 步骤 3","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-3.webp",[433,11295],{"alt":11296,"src":11297},"为 NetSuite MCP 集成配置专属自定义角色的权限设置 - 步骤 4","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-4.webp",[474,11299,11301],{"id":11300},"如何在-chatgpt-中集成并配置-netsuite-mcp","如何在 ChatGPT 中集成并配置 NetSuite MCP",[532,11303,11304,11311,11318,11325,11335,11342,11349],{},[487,11305,11306,11307],{},"点击 ChatGPT 的“Settings”（设置）。\n",[433,11308],{"alt":11309,"src":11310},"导航至 ChatGPT 用户界面中的“设置（Settings）”","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-settings-navigation.webp",[487,11312,11313,11314],{},"依次点击“Apps”（应用）>“Advanced settings”（高级设置）。\n",[433,11315],{"alt":11316,"src":11317},"在 ChatGPT 设置菜单中点击“应用程序（Apps）”与“高级设置”","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-apps-advanced-settings.webp",[487,11319,11320,11321],{},"开启“Developer mode”（开发者模式），然后点击“Create app”（创建应用）。\n",[433,11322],{"alt":11323,"src":11324},"在 ChatGPT 设置中启用“开发者模式”并点击“创建应用程序”","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-developer-mode-create-app.webp",[487,11326,11327,11328,11200,11331],{},"填写相关细节。在“Connection”（连接）中，输入 ",[494,11329,11330],{},"https:\u002F\u002F\u003Caccount_id>.suitetalk.api.netsuite.com\u002Fservices\u002Fmcp\u002Fv1\u002Fall",[433,11332],{"alt":11333,"src":11334},"输入 NetSuite MCP 连接网址等详细信息以在 ChatGPT 中创建连接","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-create-app-netsuite-mcp-connection.webp",[487,11336,11337,11338],{},"点击“Create”（创建）。集成成功后，您会看到如下弹窗。\n",[433,11339],{"alt":11340,"src":11341},"ChatGPT 弹出窗口确认 NetSuite MCP 已成功集成与串接","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-netsuite-mcp-integrated-popup.webp",[487,11343,11344,11345],{},"点击“Sign in with NetSuite MCP”（登录 NetSuite MCP）。\n",[433,11346],{"alt":11347,"src":11348},"ChatGPT 提示要求登录与授权“NetSuite MCP Standard Tools”连接","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-sign-in-with-netsuite-mcp.webp",[487,11350,11351,11352],{},"点击“Continue”（继续）按钮授予权限。\n",[433,11353],{"alt":11354,"src":11355},"在 ChatGPT 授权页面中允许并授予 NetSuite MCP 的访问权限","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-grant-permissions-netsuite-mcp.webp",[474,11357,11359],{"id":11358},"如何在-claude-ai-中集成并配置-netsuite-mcp","如何在 Claude AI 中集成并配置 NetSuite MCP",[532,11361,11362,11369,11376,11383,11398,11405],{},[487,11363,11364,11365],{},"点击 Claude 的“Customize”（自定义）。\n",[433,11366],{"alt":11367,"src":11368},"在 Claude AI 界面中点击“自定义（Customize）”选项","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-customize-navigation.webp",[487,11370,11371,11372],{},"点击“Connect your apps”（连接您的应用）。\n",[433,11373],{"alt":11374,"src":11375},"在 Claude AI 自定义设置中点击“连接您的应用程序（Connect your apps）”","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-connect-your-apps.webp",[487,11377,11378,11379],{},"搜索“NetSuite”。\n",[433,11380],{"alt":11381,"src":11382},"在 Claude AI 连接应用列表中搜索“NetSuite”","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-search-netsuite-app.webp",[487,11384,11385,11386,11389,11390,11393,11394],{},"点击“NetSuite”并输入服务器 URL：",[494,11387,11388],{},"https:\u002F\u002F\u003Caccount_id>.suitetalk.api.netsuite.com\u002Fservices\u002Fmcp\u002Fv1\u002Fsuiteapp\u002Fcom.netsuite.mcpstandardtools","（请将 ",[494,11391,11392],{},"\u003Caccount_id>"," 替换为您实际的 NetSuite 账户 ID）。\n",[433,11395],{"alt":11396,"src":11397},"在 Claude AI 设置中输入 NetSuite MCP 服务器的连接网址","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-server-url-setup.webp",[487,11399,11400,11401],{},"点击“Continue”（继续）按钮。\n",[433,11402],{"alt":11403,"src":11404},"在 Claude AI 中点击“继续”以认证 NetSuite MCP 服务器连接","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-continue-authentication.webp",[487,11406,11407,11408],{},"再次点击“Continue”（继续）以授权并验证连接器。\n",[433,11409],{"alt":11410,"src":11411},"在 Claude AI 中完成 NetSuite MCP 连接器的最终授权与认证步骤","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-authenticate-connector.webp",[474,11413,11415],{"id":11414},"netsuite-ai-实际应用场景","NetSuite AI 实际应用场景",[892,11417,11419],{"id":11418},"chatgpt-场景示例展示-netsuite-中逾期超过-30-天的账单应收账款","ChatGPT 场景示例：展示 NetSuite 中逾期超过 30 天的账单（应收账款）",[430,11421,11422],{},[433,11423],{"alt":11424,"src":11425},"ChatGPT 执行 SuiteQL 查询以筛选并显示 NetSuite 中逾期超过 30 天的发票","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-netsuite-overdue-invoices-query-result.webp",[484,11427,11428],{},[487,11429,11430],{},"ChatGPT 自动创建并运行了 SuiteQL 查询。与使用传统的 NetSuite 网页端 UI 去配置复杂的报表相比，这非常方便且节省了大量时间。",[892,11432,11434],{"id":11433},"chatgpt-和-claude-场景示例能否用折线图绘制过去-30-天的销售业绩","ChatGPT 和 Claude 场景示例：能否用折线图绘制过去 30 天的销售业绩？",[430,11436,11437],{},[433,11438],{"alt":11439,"src":11440},"ChatGPT 尝试根据 NetSuite 数据绘制销售折线图却输出失败的画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-failed-render-netsuite-sales-line-graph.webp",[484,11442,11443,11446],{},[487,11444,11445],{},"在我们的测试中，ChatGPT 无法直接生成并显示该折线图。",[487,11447,11448,11449],{},"随后我在 Claude 上进行了尝试，成功绘制出了图表。这种差异主要源于各大语言模型（LLM）的数据可视化和原生代码执行能力的区别。\n",[433,11450],{"alt":11451,"src":11452},"Claude AI 成功根据 NetSuite 销售数据绘制出直观的折线图","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-successfully-rendered-netsuite-sales-line-graph.webp",[892,11454,11456],{"id":11455},"claude-场景示例创建客户记录","Claude 场景示例：创建客户记录",[430,11458,11459,11463],{},[433,11460],{"alt":11461,"src":11462},"向 Claude AI 发送自然语言指令以在 NetSuite 中新建一笔客户记录","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-create-netsuite-customer-record-prompt.webp",[433,11464],{"alt":11465,"src":11466},"Claude AI 回复确认已成功在 NetSuite 中建立客户记录","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-create-netsuite-customer-record-success.webp",[484,11468,11469,11476],{},[487,11470,11471,11472],{},"登录 NetSuite 自动后台核对，确认该客户记录已正确创建并录入系统。\n",[433,11473],{"alt":11474,"src":11475},"在 NetSuite 网页端界面中双重检查并确认新客户记录已成功新建","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-ui-verify-new-customer-record-created.webp",[487,11477,11478,11479],{},"在 ChatGPT 中运行查询，同样能正常读取到该条刚创建的客户记录：\n",[433,11480],{"alt":11481,"src":11482},"在 ChatGPT 中执行查询并确认刚刚新建的 NetSuite 客户记录可正常读取","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-verify-netsuite-customer-record-available.webp",[892,11484,11486],{"id":11485},"claude-场景示例直接执行-suiteql-查询","Claude 场景示例：直接执行 SuiteQL 查询",[430,11488,11489],{},[433,11490],{"alt":11491,"src":11492},"Claude AI 直接执行 NetSuite SuiteQL 查询并以表格呈现报表结果","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-run-suiteql-query-result.webp",[484,11494,11495],{},[487,11496,11497],{},"AI 助手可以直接向 NetSuite 数据库运行 SuiteQL 查询，瞬间返回所需数据。",[474,11499,11501],{"id":11500},"netsuite-ai-connector-总结与展望","NetSuite AI Connector 总结与展望",[430,11503,11504,11505,11507],{},"引入 MCP 的最大赢家是那些缺乏技术背景、无法编写复杂 SQL 或报表的用户。他们现在只需使用日常的大白话对数据提问，并让 ",[441,11506,11138],{}," 按照其期望的格式（如表格、图表等）完美呈现出来，极大地降低了数据获取的门槛。",[430,11509,11510],{},"需要特别注意的是，为了防范提示词注入（Prompt Injection）攻击和恶意的「写入」操作，建议对 AI connector 所对应的系统角色仅授予最小限度的写入权限。当 AI 通过 MCP 接口在后台更新或创建记录时，它是在服务器端作为 SuiteScript 执行的，这将完全绕过浏览器前端（客户端）的所有脚本限制和表单输入校验。因此，权限管控必须要严密。",[474,11512,11514],{"id":11513},"参考资源英文","参考资源（英文）:",[484,11516,11517,11524,11531],{},[487,11518,11519],{},[444,11520,11523],{"href":11521,"rel":11522},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Farticle_0902023450.html#subsect_90090238176",[448],"安装 MCP Standard Tools SuiteApp（官方文档）",[487,11525,11526],{},[444,11527,11530],{"href":11528,"rel":11529},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Farticle_4160616848.html#subsect_0419123151",[448],"NetSuite AI Connector 常见问题解答（官方文档）",[487,11532,11533],{},[444,11534,11537],{"href":11535,"rel":11536},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Fsection_0714082142.html#bridgehead_0804033331",[448],"连接到 NetSuite AI Connector 服务步骤（官方文档）",{"title":425,"searchDepth":1074,"depth":1081,"links":11539},[11540,11541,11542,11543,11544,11550,11551],{"id":11128,"depth":1074,"text":11129},{"id":11159,"depth":1074,"text":11160},{"id":11300,"depth":1074,"text":11301},{"id":11358,"depth":1074,"text":11359},{"id":11414,"depth":1074,"text":11415,"children":11545},[11546,11547,11548,11549],{"id":11418,"depth":1081,"text":11419},{"id":11433,"depth":1081,"text":11434},{"id":11455,"depth":1081,"text":11456},{"id":11485,"depth":1081,"text":11486},{"id":11500,"depth":1074,"text":11501},{"id":11513,"depth":1074,"text":11514},[1687],"2026-06-13","本教程详细介绍如何配置NetSuite AI Connector (MCP)服务并与ChatGPT和Claude进行集成。您将学习如何通过自然语言直接向AI提问、快速执行SuiteQL查询ERP财务与业务数据、实现自动化业务流程以及客户数据记录创建，轻松打破传统复杂企业ERP的操作门槛。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002FZH-Setup-NetSuite-MCP-on-ChatGPT-%26-Claude.webp","NetSuite MCP AI 集成缩略图，采用深蓝色企业背景，展示 ChatGPT 和 Claude 图标连接至 NetSuite 云端数据库",{"schemaOrg":11558,"robots":1721,"sitemap":11560},[11559],{"@type":1698,"headline":11106,"description":11554},{"lastmod":11553},{"title":11562,"description":11554,"ogTitle":11106,"ogDescription":11554,"twitterTitle":11106,"twitterDescription":11554},"NetSuite MCP AI集成教程：连接 ChatGPT 与 Claude 实现 ERP 数据查询","zh\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",[11152,6946,11565,11566,11138],"ChatGPT","Claude","9jdmdfqTRXLqn9Xe5PM8qP-td0BRqhOK3PacmSrGU9M",{"id":11569,"title":11570,"author":1730,"body":11571,"category":11764,"date":11765,"description":11766,"extension":1692,"image":11767,"imageAlt":11768,"isPublished":1077,"meta":11769,"minRead":3336,"navigation":1077,"path":341,"seo":11773,"stem":11774,"tags":11775,"updatedAt":1730,"__hash__":11779},"article\u002Fzh\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis.md","深度评测全新AI Claude Fable 5：高度复杂的企业财务与金融投资分析能力全面实测与深入对比",{"type":427,"value":11572,"toc":11762},[11573,11584,11595,11598,11604,11620,11630,11636,11642,11648,11670,11680,11694,11702,11720,11723,11734,11743,11746,11759],[430,11574,11575,11576,11579,11580],{},"2026年6月9日，Anthropic 发布了 ",[441,11577,11578],{},"Claude Fable 5","，这是一款“神话级”（Mythos-Class）模型，在网络安全、知识提炼、化学和生物学等特定领域配备了更先进的安全防护机制。\n",[433,11581],{"alt":11582,"src":11583},"Anthropic 官方发布 Claude Fable 5 智能体模型的公告与其核心安全能力介绍","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-launch-announcement.webp",[430,11585,11586,11587,11590,11591],{},"Anthropic 官方公布的数据显示，Fable 5 在多项关键基准测试中均领先于 Opus 4.8 和 GPT-5.5。特别是在评估知识工作能力的 ",[441,11588,11589],{},"GDPval-AA"," 测试中，它明显领先于 Opus 4.8、GPT 5.5 以及 Gemini 3.1 Pro。\n",[433,11592],{"alt":11593,"src":11594},"Claude Fable 5 在多项关键基准测试中的对比图表，包含 GDPval-AA 知识工作评分","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-benchmarks-gdpval-aa.webp",[430,11596,11597],{},"根据 Claude 的自述：“Fable 5 在处理复杂的分析任务时展现出了强大的性能。”",[430,11599,11600],{},[433,11601],{"alt":11602,"src":11603},"关于 Claude Fable 5 在处理高度复杂的分析任务时表现强劲的性能评测陈述","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-analytical-performance-statement.webp",[430,11605,11606,11607,11610,11611,11614,11615,1807],{},"为了测试 ",[441,11608,11609],{},"Fable 5"," 的实际水平，我们决定以投资研究为目的，使用“",[441,11612,11613],{},"comps-analysis","”（可比公司分析）技能对 SpaceX（Space Exploration Technologies Corporation）进行分析。该分析所用的 'skill.md' 文件来源于 ",[444,11616,11619],{"href":11617,"rel":11618},"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Ffinancial-services\u002Fblob\u002Fmain\u002Fplugins\u002Fagent-plugins\u002Fmarket-researcher\u002Fskills\u002Fcomps-analysis\u002FSKILL.md",[448],"Anthropic 官方的金融服务 GitHub 仓库",[430,11621,11622,11626],{},[433,11623],{"alt":11624,"src":11625},"在 Claude 桌面聊天窗口中加载并调用 SpaceX 财务数据对比分析的技能接口","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-skill-initiation.webp",[433,11627],{"alt":11628,"src":11629},"Claude Fable 5 正在高效运行针对 SpaceX 与其同业公司的自动化财务比率计算","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-running-progress.webp",[430,11631,11632],{},[433,11633],{"alt":11634,"src":11635},"SpaceX 自动化金融可比公司分析工作流的运行结果和终端输出完成状态","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-skill-results-terminal.webp",[430,11637,11638,11639,11641],{},"整个任务耗时约 25 分钟。期间，Claude 除了请求访问外部网站的权限外，没有提出任何需要澄清的问题。令人印象深刻的是，",[441,11640,11609],{}," 能够完全自主地找到用于对比的同业竞争公司。",[430,11643,11644],{},[433,11645],{"alt":11646,"src":11647},"Claude Fable 5 安全沙箱弹出询问，请求允许访问外部实时财经新闻和市场数据网站","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-external-site-access-permission.webp",[430,11649,11650,11654,11655,11658,11659,11664,11665,1807],{},[433,11651],{"alt":11652,"src":11653},"Claude Fable 5 凭借网络搜索能力自主识别并匹配的 SpaceX 核心竞争对手公司列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-spacex-comps-excel-memo.webp","\n*",[441,11656,11657],{},"请注意："," 本评测仅用于研究与教学目的，不构成任何投资建议。实际生成的原始文件可在此下载：Excel 表格 ",[444,11660,11663],{"href":11661,"rel":11662},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Comps_Analysis_2026-06-10.xlsx",[448],"SpaceX_Comps_Analysis_2026-06-10.xlsx"," 以及分析备忘录 ",[444,11666,11669],{"href":11667,"rel":11668},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Comps_Memo_2026-06-10.pdf",[448],"SpaceX_Comps_Memo_2026-06-10.pdf",[430,11671,11672,11673,11676,11677,11679],{},"当我们使用 ",[441,11674,11675],{},"Qwen deep research","（千问深度搜索）测试相同的技能时，我们必须手动输入对比的同业公司。并且在最终生成的数值上，Qwen 与 ",[441,11678,11609],{}," 相比存在轻微的差异。",[430,11681,11682,11686,11690],{},[433,11683],{"alt":11684,"src":11685},"在阿里 Qwen deep research（深度搜索）界面中启动针对 SpaceX 的商业估值对比分析","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-initiation.webp",[433,11687],{"alt":11688,"src":11689},"在 Qwen 深度搜索中手动输入匹配的同业公司名单以启动 SpaceX 数据收集和对标分析","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-running.webp",[433,11691],{"alt":11692,"src":11693},"由 Qwen deep research 自动生成的 SpaceX 企业对标和财务统计基准分析报告预览","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-report-preview.webp",[430,11695,11696,11697,1807],{},"*由 Qwen 生成的报告可在此处下载：",[444,11698,11701],{"href":11699,"rel":11700},"https:\u002F\u002Ftechvoyage.dev\u002FThe_SpaceX_Comp_Analysis_A_Statistical_Benchmark_of_Growth_Efficiency_and_Valuation_Against_Public_Peers.pdf",[448],"The_SpaceX_Comp_Analysis_A_Statistical_Benchmark_of_Growth_Efficiency_and_Valuation_Against_Public_Peers.pdf",[430,11703,11704,11705,11708,11709,11200,11712,11716],{},"尽管 Claude 和 Qwen 的报告都是基于该技能中指定的相同方法生成的，但由于它们提取的数据源不同，数据依然存在偏差。例如，Claude Fable 5 使用了 ",[441,11706,11707],{},"Stock Analysis"," 网站，而 Qwen 则使用了美国证券交易委员会官网 ",[441,11710,11711],{},"SEC.gov",[433,11713],{"alt":11714,"src":11715},"Claude Fable 5 引用并抓取自第三方 Stock Analysis 网站的实时金融财报底层数据","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-data-source-stock-analysis.webp",[433,11717],{"alt":11718,"src":11719},"Qwen deep research 所采信并解析的美国证券交易委员会官网 SEC.gov 官方财务申报文件","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-data-source-sec-gov.webp",[430,11721,11722],{},"此外，Qwen 生成的报告中包含更多关于 SpaceX 商业模式、资本结构和日常运营的详细信息。",[430,11724,11725,11726,11729,11730],{},"在对比了两份报告后，我们决定在 Claude 桌面应用中尝试使用 ",[494,11727,11728],{},"\u002Fresearch"," 命令重新生成一份报告。\n",[433,11731],{"alt":11732,"src":11733},"在 Claude 桌面客户端中执行全新 research 深度研究指令以自动撰写企业估值分析备忘录","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-desktop-research-command-spacex.webp",[430,11735,11736,11737,11742],{},"新生成的分析报告 ",[444,11738,11741],{"href":11739,"rel":11740},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Analysis.pdf",[448],"SpaceX_Analysis.pdf"," 增加了额外的投资建议和注意事项（免责声明）部分。但与 Qwen 的深度搜索报告相比，它依然缺乏关于公司具体日常运营和资本结构等层面的详细企业背景信息。",[430,11744,11745],{},"Fable 5 是否值得其昂贵的订阅价格？如果是针对高难度、长周期的任务或自主代码编写，它确实物有所值。但对于某些知识型工作（如企业财务分析），它可能还不是性价比最高的选择。",[430,11747,11748,11749,11751,11752,11200,11755],{},"最后，我们测试了 ",[441,11750,11609],{}," 在翻译任务中的表现。然而奇怪的是，该模型在翻译时自动切回了 ",[441,11753,11754],{},"Opus 4.8",[433,11756],{"alt":11757,"src":11758},"在调用大上下文长文本翻译任务时，Claude 客户端自动将模型从 Fable 5 切换回 Opus 4.8","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-translation-opus-switching.webp",[430,11760,11761],{},"这是否意味着所有涉及长上下文的转换任务都会被强制退回到 Opus 4.8？这只是 6 月 22 日产品上线前的使用期内临时出现的特殊状况，还是系统本身足够智能，能够自动判断翻译任务并不需要如此强大的模型算力？",{"title":425,"searchDepth":1074,"depth":1081,"links":11763},[],[1687],"2026-06-11","我们针对Anthropic最新发布的Claude Fable 5与Qwen Deep Research在SpaceX企业对比分析（Comps Analysis）等复杂金融财务分析任务中的表现进行了深度实测。本文将为您详细评估和解答，这款备受瞩目的高阶大模型是否真的值得金融从业者与企业级用户付费升级。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002FZH-Testing-Claude-Fable-5-in-Financial-Analysis.webp","Claude Fable 5对比Qwen：AI企业财务分析能力实测",{"schemaOrg":11770,"robots":1721,"sitemap":11772},[11771],{"@type":1698,"headline":11570,"description":11766},{"lastmod":11765},{"title":11768,"description":11766,"ogTitle":11570,"ogDescription":11766,"twitterTitle":11570,"twitterDescription":11766},"zh\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",[11578,11776,11777,11778],"财务分析","Qwen Deep Research","AI基准测试","c9GaLvtj-UwR0XPNTjgWkorzDqYigmU9bgdac8KNdUE",{"id":11781,"title":11782,"author":1730,"body":11783,"category":11990,"date":11991,"description":11992,"extension":1692,"image":11993,"imageAlt":11994,"isPublished":1077,"meta":11995,"minRead":1081,"navigation":1077,"path":343,"seo":11999,"stem":12000,"tags":12001,"updatedAt":1730,"__hash__":12002},"article\u002Fzh\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2.md","Google Antigravity 2 自动化指南：深入掌握 Browser 与 Scheduler 核心指令",{"type":427,"value":11784,"toc":11985},[11785,11797,11801,11806,11815,11830,11836,11839,11850,11854,11857,11864,11871,11882,11885,11891,11902,11908,11918,11931,11941,11951,11954,11960,11963,11974],[430,11786,11787,3457,11790,1859,11793,11796],{},[441,11788,11789],{},"Google Antigravity 2",[494,11791,11792],{},"\u002Fbrowser",[494,11794,11795],{},"\u002Fschedule"," 指令重新定义了我们与 AI 交互的方式。这两个指令将 Antigravity 转化为一个主动型自动化平台，使其能够与实时网页交互并运行周期性工作流。",[474,11798,11800],{"id":11799},"browser-run","Browser Run",[430,11802,11803,11805],{},[494,11804,11792],{}," 指令会强制使用 Chrome 浏览器来完成任务。在整个工作流中，用户可以完全控制智能体何时以及如何访问网页。在此过程中，系统会自动截取屏幕截图和视频片段。",[430,11807,11808,11811],{},[441,11809,11810],{},"使用场景：",[433,11812],{"alt":11813,"src":11814},"使用 \u002Fbrowser 命令提交病假","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-command-sick-leave-prompt.webp",[430,11816,11817,11818,11822,11826],{},"以下是智能体的输出结果：\n",[433,11819],{"alt":11820,"src":11821},"浏览器自动化子代理开始病假提交任务","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-subagent-delegation.webp",[433,11823],{"alt":11824,"src":11825},"浏览器自动化工具设置具有远程调试和权限的Chrome","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-permissions-and-chrome-setup.webp",[433,11827],{"alt":11828,"src":11829},"浏览器子代理在请求用户凭据的登录页面暂停","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-login-wall-encountered.webp",[430,11831,11832],{},[433,11833],{"alt":11834,"src":11835},"浏览器子代理等待用户完成登录流程","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-waiting-for-user-login.webp",[430,11837,11838],{},"Antigravity 能够成功打开页面并提交表单。当网页需要登录时，智能体会耐心等待，直到您完成网站登录。",[430,11840,11841,11846,11847,11849],{},[11842,11843],"video",{"alt":11844,"src":11845,"controls":1077},"浏览器子代理执行病假提交流程的视频","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-sick-leave-process.webm","\n当我们需要获取网页上最新的文档、查看变更日志（changelog）、测试 Web 应用或检查 API 状态以完成特定任务时，",[494,11848,11792],{}," 指令将非常有用。",[474,11851,11853],{"id":11852},"schedule-task","Schedule Task",[430,11855,11856],{},"Antigravity 2 内置了定时任务调度功能。我们将通过每 10 分钟自动填写一次工时表（timesheet）来对其进行测试。",[430,11858,11859,11860],{},"点击“Scheduled Tasks”（定时任务）：\n",[433,11861],{"alt":11862,"src":11863},"侧边栏中的计划任务菜单选项","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-menu-item.webp",[430,11865,11866,11867],{},"点击“+ New”按钮创建一个新的定时任务：\n",[433,11868],{"alt":11869,"src":11870},"带有新建任务按钮的空白计划任务视图","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-empty-state-new-button.webp",[430,11872,11873,11874,11878],{},"填写表单，并将任务调度设置为每 10 分钟运行一次：\n",[433,11875],{"alt":11876,"src":11877},"为自动填写时间表而填写的新计划任务表单","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-new-task-form.webp",[433,11879],{"alt":11880,"src":11881},"计划任务列表中的活动自动时间表输入任务","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-active-task-list.webp",[430,11883,11884],{},"任务虽然被触发了，但最终运行出错。",[430,11886,11887],{},[433,11888],{"alt":11889,"src":11890},"指示未找到闪存层的可用模型的错误消息","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-error-no-models.webp",[430,11892,11893,11894,11897,11898,11901],{},"我们曾尝试将“env”环境变量添加到 ",[494,11895,11896],{},"sidecar.json"," 文件中（该文件位于 ",[494,11899,11900],{},".gemini\u002Fconfig\u002Fsidecars\u002Fauto-timesheet-entry","），但依然遇到相同的错误。",[936,11903,11906],{"className":11904,"code":11905,"language":4641},[4639],"    \"env\": {\n        \"GEMINI_MODEL\": \"gemini-3.5-flash\",\n        \"GOOGLE_CLOUD_PROJECT\": \"your-gcp-project-id\"\n    }\n",[494,11907,11905],{"__ignoreMap":425},[430,11909,11910,11911,11914,11915,1807],{},"检查位于 ",[494,11912,11913],{},".gemini\u002Fantigravity\u002Fsidecar_data\u002F"," 的定时任务日志，我们可以看到 ",[494,11916,11917],{},"[schedule] Triggering command: \"agentapi\" [new-conversation]",[430,11919,11920,11921,11926,11927,11930],{},"我们在 ",[444,11922,11925],{"href":11923,"rel":11924},"https:\u002F\u002Fdiscuss.ai.google.dev\u002Ft\u002Fscheduled-tasks-in-antigravity-2-ended-with-errors\u002F168013",[448],"Build with Google AI 技术论坛","上发布了该问题，得到的回复建议是 ",[494,11928,11929],{},"agentapi"," 需要配置 API 密钥。我们尝试配置了 API 密钥，但仍未能解决问题。",[430,11932,11933,11934,11936,11937],{},"我们尝试直接在对话框中运行 ",[494,11935,11795],{}," 指令。\n",[433,11938],{"alt":11939,"src":11940},"使用 \u002Fschedule 命令来提示时间表自动化任务","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fschedule-command-timesheet-prompt.webp",[430,11942,11943,11944,11946,11947],{},"使用 ",[494,11945,11795],{}," 指令调度的任务不会显示在“Scheduled Tasks”菜单栏中。\n",[433,11948],{"alt":11949,"src":11950},"计划任务列表未显示通过CLI命令创建的任务","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-list-missing-cli-task.webp",[430,11952,11953],{},"不过，cron 定时任务确实成功触发了。",[430,11955,11956],{},[433,11957],{"alt":11958,"src":11959},"Cron作业日志确认已触发","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fcron-job-triggered-log.webp",[474,11961,11962],{"id":11962},"总结与思考",[430,11964,11965,11966,1859,11968,11970,11971,11973],{},"Antigravity 2 中的 ",[494,11967,11792],{},[494,11969,11795],{}," 指令并不是孤立的功能，将它们结合使用将释放出极大的威力。例如，您可以调度一个智能体，让其在每周一早上 6:00 自动运行 ",[494,11972,11792],{}," 浏览新闻与资讯网站，对信息进行归纳提炼，并为您呈上一份详尽的每日简报。",[430,11975,11976,11977,11980,11981,11984],{},"在设计新的定时任务时，您还可以结合使用其他指令，例如 ",[494,11978,11979],{},"\u002Fgrill-me","（这在文章《",[444,11982,11983],{"href":419},"Antigravity 2 深度实战：如何通过 AI 智能体、内置 Skill 与 MCP 打造全栈应用","》中有所提及）。它会促使智能体主动向用户提问以澄清模糊之处，并在最终确定方案前捕捉边缘情况。",{"title":425,"searchDepth":1074,"depth":1081,"links":11986},[11987,11988,11989],{"id":11799,"depth":1074,"text":11800},{"id":11852,"depth":1074,"text":11853},{"id":11962,"depth":1074,"text":11962},[1687],"2026-06-07","深入探索 Google Antigravity 2 的 \u002Fbrowser 与 \u002Fschedule 指令，实现实时网页交互与定时任务的无缝 AI 自动化。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002FZH-Use-Browser-and-Scheduler-in-Antigravity-2.webp","Google Antigravity 2：如何使用 Browser 与 Schedule 自动运行",{"schemaOrg":11996,"robots":1721,"sitemap":11998},[11997],{"@type":1698,"headline":11994,"description":11992},{"lastmod":11991},{"title":11994,"description":11992,"ogTitle":11782,"ogDescription":11992,"twitterTitle":11782,"twitterDescription":11992},"zh\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",[],"mnfOoh_-B13NcatjYTIMWPulaZPVOx1GCDjyE48np9o",{"id":12004,"title":11983,"author":425,"body":12005,"category":12329,"date":12330,"description":12331,"extension":1692,"image":12332,"imageAlt":12333,"isPublished":1077,"meta":12334,"minRead":1081,"navigation":1077,"path":347,"seo":12338,"stem":12339,"tags":12340,"updatedAt":1730,"__hash__":12341},"article\u002Fzh\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2.md",{"type":427,"value":12006,"toc":12319},[12007,12010,12016,12019,12025,12028,12033,12039,12042,12048,12054,12060,12070,12075,12079,12087,12091,12097,12103,12109,12112,12118,12124,12129,12134,12137,12141,12150,12156,12160,12166,12172,12178,12181,12185,12188,12192,12198,12204,12210,12213,12293,12299,12311,12313,12316],[430,12008,12009],{},"作为一款以智能体为核心（Agent-first）的桌面应用程序，Antigravity 2 能够让用户编排协同多个子智能体，自动处理日常事务（例如从邮件 and 日历中生成每日简报），或直接进行应用程序的构建、测试与部署。但在实际开发与应用中，它的表现究竟如何？",[430,12011,12012,12013,1807],{},"让我们一起深入探索 Antigravity 2 的强大功能 —— 从内置命令、精选 Skill（技能）到能够让开发者摇身一变成为全栈架构师的 Firebase Model Context Protocol (MCP) 服务器集成。关于 Skill 和 MCP 服务器的安装与详细配置，请参考这篇教程：",[444,12014,12015],{"href":391},"Google Antigravity 2 深度实测：手把手教你从零开始部署 AI 智能体与首发体验测评",[474,12017,12018],{"id":12018},"内置命令",[892,12020,12022],{"id":12021},"goal",[494,12023,12024],{},"\u002Fgoal",[430,12026,12027],{},"通过此命令，你可以向智能体下达指令，使其持续运行直到特定任务完全结束。",[430,12029,12030],{},[441,12031,12032],{},"应用场景：",[430,12034,12035],{},[433,12036],{"alt":12037,"src":12038},"使用 Antigravity 2 的 goal 指令创建 Textris 游戏的提示词","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-goal-command-prompt.webp",[430,12040,12041],{},"当我们请求动态子智能体时，系统会生成三个智能体协同配合来完成该任务。",[430,12043,12044],{},[433,12045],{"alt":12046,"src":12047},"Antigravity 2 生成子代理以自主完成任务","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-1.webp",[430,12049,12050],{},[433,12051],{"alt":12052,"src":12053},"Antigravity 2 子代理执行步骤的详细进度","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-2.webp",[430,12055,12056],{},[433,12057],{"alt":12058,"src":12059},"Antigravity 2 子代理完成自主任务","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-3.webp",[430,12061,12062,12063,3089,12066],{},"若想试玩由智能体自动生成的 HTML 版 Textris（俄罗斯方块）游戏，请点击此",[444,12064,6889],{"href":12065},"\u002Ftextris",[11842,12067],{"alt":12068,"src":12069,"controls":1077},"AI generated Textris game in HTML","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fai-generated-textri-game-html.webm",[430,12071,12072,12074],{},[494,12073,12024],{}," 命令会先制定详尽的执行规划，随后按部就班地予以实施，并在每个阶段实时向你汇报最新进展。此外，智能体还会自动优化与管理自身的上下文窗口，防止其超出 Token 限制。这极大地适用于需要多轮迭代、耗时较长的重头任务，例如性能优化或模块重构等。",[892,12076,12077],{"id":10102},[494,12078,11979],{},[430,12080,12081,12082,12086],{},"此命令会触发由 Matt Pocock 倾力打造的实用 Skill：",[444,12083,10102],{"href":12084,"rel":12085},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[448],"。它短小精悍却无比强大，其核心逻辑在于从系统架构的多个维度对你进行“刨根问底式”的提问，以此理清边缘情况、对齐业务结构，并在开始代码实现前最终敲定执行方案。",[430,12088,12089],{},[441,12090,12032],{},[430,12092,12093],{},[433,12094],{"alt":12095,"src":12096},"在 Antigravity 2 中触发 Cloudflare 架构的 grill-me 指令","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-command-prompt.webp",[430,12098,12099],{},[433,12100],{"alt":12101,"src":12102},"使用 grill-me 技能的交互式问答阶段","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-interaction-1.webp",[430,12104,12105],{},[433,12106],{"alt":12107,"src":12108},"澄清边界情况并使用 grill-me 架构计划","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-interaction-2.webp",[430,12110,12111],{},"它还完美支持多选交互：",[430,12113,12114],{},[433,12115],{"alt":12116,"src":12117},"在 grill-me 过程中使用多选功能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-multi-select-1.webp",[430,12119,12120],{},[433,12121],{"alt":12122,"src":12123},"使用 grill-me 多选功能确定选择","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-multi-select-2.webp",[430,12125,12126,12128],{},[494,12127,11979],{}," 命令的表现令人叹为观止。它几乎涵盖了部署至 Cloudflare 时所需考虑的所有架构设计细节，极为适合应用软件的架构规划、跨领域的模块重构以及其它高度复杂的业务设计。",[892,12130,12131],{"id":425},[494,12132,12133],{},"@\u002F ",[430,12135,12136],{},"虽然此命令并未出现在公开的可用命令列表中，但在精细化管理上下文窗口时，它却必不可少。它被用于向对话框中快速引入特定文件夹或文件（非多媒体文件）。",[474,12138,12140],{"id":12139},"skills-技能","Skills (技能)",[430,12142,12143,12144,12147,12148,1807],{},"我们可以输入 ",[494,12145,12146],{},"\u002F"," 来呼出快捷弹窗并选择特定 Skill。下面我们来测试 ",[494,12149,10289],{},[430,12151,12152],{},[433,12153],{"alt":12154,"src":12155},"从 Antigravity 弹出窗口中选择 Excalidraw 图表技能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-skill-selection-excalidraw.webp",[430,12157,12158],{},[441,12159,12032],{},[430,12161,12162],{},[433,12163],{"alt":12164,"src":12165},"提供生成 Excalidraw 图表的指示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-excalidraw-diagram-prompt.webp",[430,12167,12168],{},[433,12169],{"alt":12170,"src":12171},"成功生成 Excalidraw 架构图","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-excalidraw-diagram-generation.webp",[430,12173,12174],{},[433,12175],{"alt":12176,"src":12177},"Antigravity architecture diagram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-architecture.webp",[430,12179,12180],{},"在经历了两轮系统权限确认后，该 Skill 成功完成了图表的绘制与输出。",[474,12182,12184],{"id":12183},"mcp-服务器","MCP 服务器",[430,12186,12187],{},"以往当智能体试图构建后端服务时，你通常必须亲自打开网页控制台、创建数据库、复制 API 密钥再将其手动粘贴回配置中。而当直接在 Antigravity 中引入 MCP 服务器后，智能体便拥有了直接操作云端基础设施的“双手”。",[430,12189,12190],{},[441,12191,12032],{},[430,12193,12194],{},[433,12195],{"alt":12196,"src":12197},"指示 MCP 服务器创建 Firebase 网页应用程序","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-prompt.webp",[430,12199,12200],{},[433,12201],{"alt":12202,"src":12203},"Antigravity 使用 MCP 服务器操作 Firebase 基础架构","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-execution-1.webp",[430,12205,12206],{},[433,12207],{"alt":12208,"src":12209},"通过 Antigravity MCP 服务器成功创建 Firebase 应用程序","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-execution-2.webp",[430,12211,12212],{},"智能体成功通过 MCP 服务器在 Firebase 中直接创建了 Web 应用。让我们来看看相关的 GitHub 仓库。",[936,12214,12216],{"className":1045,"code":12215,"language":1047,"meta":425,"style":425},"Create a new public GitHub repository called ‘to-do-app-techvoyage’. Then push all the current project files to it with the commit message ‘Initial commit — to-do-app’.\n",[494,12217,12218],{"__ignoreMap":425},[944,12219,12220,12223,12226,12229,12232,12235,12238,12241,12244,12247,12250,12253,12256,12259,12262,12265,12268,12271,12274,12276,12279,12282,12285,12287,12290],{"class":946,"line":947},[944,12221,12222],{"class":1054},"Create",[944,12224,12225],{"class":1058}," a",[944,12227,12228],{"class":1058}," new",[944,12230,12231],{"class":1058}," public",[944,12233,12234],{"class":1058}," GitHub",[944,12236,12237],{"class":1058}," repository",[944,12239,12240],{"class":1058}," called",[944,12242,12243],{"class":1058}," ‘to-do-app-techvoyage’.",[944,12245,12246],{"class":1058}," Then",[944,12248,12249],{"class":1058}," push",[944,12251,12252],{"class":1058}," all",[944,12254,12255],{"class":1058}," the",[944,12257,12258],{"class":1058}," current",[944,12260,12261],{"class":1058}," project",[944,12263,12264],{"class":1058}," files",[944,12266,12267],{"class":1058}," to",[944,12269,12270],{"class":1058}," it",[944,12272,12273],{"class":1058}," with",[944,12275,12255],{"class":1058},[944,12277,12278],{"class":1058}," commit",[944,12280,12281],{"class":1058}," message",[944,12283,12284],{"class":1058}," ‘Initial",[944,12286,12278],{"class":1058},[944,12288,12289],{"class":1058}," —",[944,12291,12292],{"class":1058}," to-do-app’.\n",[430,12294,12295],{},[433,12296],{"alt":12297,"src":12298},"代理自动将项目文件推送到新的 GitHub 存储库","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-github-repository-push.webp",[430,12300,12301,12302,12306,12307,12310],{},"您可以通过此",[444,12303,6889],{"href":12304,"rel":12305},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fto-do-app-techvoyage",[448],"访问 GitHub 上的 ",[494,12308,12309],{},"to-do-app-techvoyage"," 仓库。",[474,12312,2592],{"id":2592},[430,12314,12315],{},"尽管在 Gemini 3.5 Flash 的强力驱动下，Antigravity 2 中的 MCP 与 Skill 展现出了令人惊叹的速度，但目前智能体的工作流仍面临一些瓶颈，如频繁的权限确认中断，以及缺乏用于回滚的版本控制检查点等。在官方正式引入检查点功能之前，养成频繁进行 Git commit 的习惯依然是保障开发安全的唯一防线。",[1667,12317,12318],{},"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 .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":425,"searchDepth":1074,"depth":1081,"links":12320},[12321,12326,12327,12328],{"id":12018,"depth":1074,"text":12018,"children":12322},[12323,12324,12325],{"id":12021,"depth":1081,"text":12024},{"id":10102,"depth":1081,"text":11979},{"id":425,"depth":1081,"text":12133},{"id":12139,"depth":1074,"text":12140},{"id":12183,"depth":1074,"text":12184},{"id":2592,"depth":1074,"text":2592},[1687],"2026-06-06","深入探索 Agent-first 桌面应用 Antigravity 2。学习如何协同 AI 子智能体、运用内置 Skill 并借助 MCP 服务器高效构建全栈应用。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002FZH-What-can-we-do-with-Antigravity-2.webp","Antigravity 2 教程：AI 智能体、Skill 与 MCP 服务器实战指南",{"schemaOrg":12335,"robots":1721,"sitemap":12337},[12336],{"@type":1698,"headline":11983,"description":12331},{"lastmod":12330},{"title":12333,"description":12331,"ogTitle":11983,"ogDescription":12331,"twitterTitle":11983,"twitterDescription":12331},"zh\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[],"zGLDetPD6zTNJpl3O8hG9XfFjHdCdYWZlMuqWbo4xn4",{"id":12343,"title":12015,"author":1730,"body":12344,"category":13023,"date":13024,"description":13025,"extension":1692,"image":13026,"imageAlt":13027,"isPublished":1077,"meta":13028,"minRead":1953,"navigation":1077,"path":333,"seo":13032,"stem":13033,"tags":13034,"updatedAt":1730,"__hash__":13035},"article\u002Fzh\u002Farticle\u002Fsetup-antigravity-2.md",{"type":427,"value":12345,"toc":13012},[12346,12357,12360,12363,12374,12377,12381,12389,12395,12402,12408,12411,12421,12423,12427,12434,12440,12443,12449,12453,12456,12468,12482,12489,12501,12511,12525,12527,12531,12534,12547,12550,12855,12866,12872,12882,12888,12894,12900,12902,12906,12917,12930,12936,12942,12948,12965,12968,12974,12976,12980,12983,12989,12992,12998,13000,13003,13006,13009],[430,12347,12348,12349,12352,12353,12356],{},"在 Google I\u002FO 2026 大会上，Google 宣布推出 ",[441,12350,12351],{},"Antigravity 2","，这是一款将 ",[441,12354,12355],{},"AI 智能体（Agent）"," 作为首要用户界面的独立桌面应用程序。用户只需描述想要达成的目标，智能体就会自动生成方案，将其拆解为易于管理的小任务并执行。",[892,12358,12359],{"id":12359},"前期准备",[430,12361,12362],{},"在开始之前，你需要准备：",[484,12364,12365,12368,12371],{},[487,12366,12367],{},"一台电脑（本指南以 macOS 为例）",[487,12369,12370],{},"现代网页浏览器",[487,12372,12373],{},"一个 Gmail 账号",[12375,12376],"hr",{},[474,12378,12380],{"id":12379},"_1-安装-antigravity-2","1. 安装 Antigravity 2",[430,12382,2486,12383,12388],{},[444,12384,12387],{"href":12385,"rel":12386},"https:\u002F\u002Fantigravity.google\u002Fdownload",[448],"antigravity.google"," 下载 Antigravity 2 并安装到你的电脑上。首次启动时，系统会提示你使用 Gmail 账号登录。",[430,12390,12391],{},[433,12392],{"alt":12393,"src":12394},"Antigravity 2 首次启动时的 Google 账号登录界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-gmail-login.webp",[430,12396,12397,12398,12401],{},"登录成功后，你会注意到输入框中多了一个",[441,12399,12400],{},"语音按钮","，让你能够直接录制语音指令，而无需手动输入。",[430,12403,12404],{},[433,12405],{"alt":12406,"src":12407},"Antigravity 2 输入框中的语音听写与录音按钮","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-voice-input-field.webp",[430,12409,12410],{},"Antigravity 2 还引入了**项目（Project）**的概念。一个项目可以跨越多个本地文件夹，并拥有独立且特定的智能体设置与权限。",[430,12412,12413,12417],{},[433,12414],{"alt":12415,"src":12416},"Antigravity 2 设置中的项目选择与配置菜单","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-project-menu.webp",[433,12418],{"alt":12419,"src":12420},"在 Antigravity 2 中指定文件夹路径创建新的 AI 项目","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-project-creation.webp",[12375,12422],{},[474,12424,12426],{"id":12425},"_2-配置-mcp-和插件","2. 配置 MCP 和插件",[430,12428,12429,12430,12433],{},"所有的模型上下文协议（MCP）服务器、插件和技能（Skills）都可以在设置菜单的 ",[441,12431,12432],{},"Customizations（定制）"," 选项下进行管理：",[430,12435,12436],{},[433,12437],{"alt":12438,"src":12439},"用于管理 MCP 服务器和技能的 Customizations 定制设置面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-settings-customizations.webp",[430,12441,12442],{},"目前，唯一可用的插件全部来自 Google 官方，但相信未来会有更多第三方插件陆续推出。",[430,12444,12445],{},[433,12446],{"alt":12447,"src":12448},"Antigravity 2 中可用的 Google 官方插件与集成列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-google-plugins-list.webp",[2182,12450,12452],{"id":12451},"添加现有的-mcp-服务器","添加现有的 MCP 服务器",[430,12454,12455],{},"安装预先配置好的 MCP 服务器（例如 GitHub）：",[532,12457,12458,12463],{},[487,12459,3054,12460,1807],{},[441,12461,12462],{},"Add MCP+",[487,12464,7554,12465,1807],{},[441,12466,12467],{},"GitHub MCP Server",[430,12469,12470,12474,12478],{},[433,12471],{"alt":12472,"src":12473},"点击 Add MCP plus 按钮添加预先配置好的 MCP 服务器","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-mcp-button.webp",[433,12475],{"alt":12476,"src":12477},"从可用集成列表中选择 GitHub MCP 智能体服务器","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-select-github-mcp.webp",[433,12479],{"alt":12480,"src":12481},"GitHub MCP 服务器授权与安装配置向导","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-github-mcp-setup.webp",[430,12483,12484,12485],{},"GitHub MCP 服务器的安装最终报错：\n",[433,12486],{"alt":12487,"src":12488},"安装 GitHub MCP 服务器时出现的配置错误提示界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-github-mcp-error.webp",[430,12490,12491,12492,12494,12495,12497,12498,12500],{},"由于我们已在 macOS 上安装了 ",[494,12493,2782],{},"，我们可以直接在对话中执行 ",[494,12496,2782],{}," 命令来绕过这个报错。不过在此之前，我们需要显式地在 Antigravity 权限设置中添加 ",[494,12499,2782],{}," 命令。",[430,12502,12503,12507],{},[433,12504],{"alt":12505,"src":12506},"请求将 git 命令添加到沙箱终端执行权限的对话框","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-git-permission-1.webp",[433,12508],{"alt":12509,"src":12510},"在设置菜单中显式授予 git 命令运行权限的界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-git-permission-2.webp",[430,12512,12513,12514,12516,12517,12521],{},"让我们测试一下该指令，看看 ",[494,12515,2782],{}," 命令现在是否可以正常工作：\n",[433,12518],{"alt":12519,"src":12520},"在 AI 智能体对话框中输入并提交 git status 请求","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-git-command-test-1.webp",[433,12522],{"alt":12523,"src":12524},"对话中成功运行终端 git status 命令并返回结果的界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-git-command-test-2.webp",[12375,12526],{},[474,12528,12530],{"id":12529},"_3-添加自定义-mcp-服务器","3. 添加自定义 MCP 服务器",[430,12532,12533],{},"如果你想要添加的 MCP 服务器不在默认列表中，可以直接通过编辑 MCP 配置文件来手动添加。配置文件位于：",[936,12535,12537],{"className":1045,"code":12536,"language":1047,"meta":425,"style":425},"~\u002F.gemini\u002Fconfig\u002Fmcp_config.json\n",[494,12538,12539],{"__ignoreMap":425},[944,12540,12541,12544],{"class":946,"line":947},[944,12542,12543],{"class":958},"~",[944,12545,12546],{"class":954},"\u002F.gemini\u002Fconfig\u002Fmcp_config.json\n",[430,12548,12549],{},"我们以添加一些 Cloudflare MCP 服务器为例。由于 Cloudflare 支持动态客户端注册，我们只需启用 OAuth 即可。请将以下内容添加到你的 JSON 配置中：",[936,12551,12553],{"className":2896,"code":12552,"language":2898,"meta":425,"style":425},"    \"cloudflare-api\": {\n      \"serverUrl\": \"https:\u002F\u002Fmcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-docs\": {\n      \"serverUrl\": \"https:\u002F\u002Fdocs.mcp.cloudflare.com\u002Fmcp\"\n    },\n    \"cloudflare-bindings\": {\n      \"serverUrl\": \"https:\u002F\u002Fbindings.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-builds\": {\n      \"serverUrl\": \"https:\u002F\u002Fbuilds.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-observability\": {\n      \"serverUrl\": \"https:\u002F\u002Fobservability.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[494,12554,12555,12568,12588,12600,12612,12616,12623,12636,12653,12659,12672,12691,12703,12715,12719,12725,12738,12757,12769,12781,12785,12791,12804,12823,12835,12847,12851],{"__ignoreMap":425},[944,12556,12557,12559,12562,12564,12566],{"class":946,"line":947},[944,12558,7617],{"class":958},[944,12560,12561],{"class":1058},"cloudflare-api",[944,12563,3681],{"class":958},[944,12565,7610],{"class":954},[944,12567,2905],{"class":958},[944,12569,12570,12572,12575,12577,12579,12581,12584,12586],{"class":946,"line":1074},[944,12571,7630],{"class":958},[944,12573,12574],{"class":950},"serverUrl",[944,12576,3681],{"class":958},[944,12578,1375],{"class":958},[944,12580,3267],{"class":958},[944,12582,12583],{"class":1058},"https:\u002F\u002Fmcp.cloudflare.com\u002Fmcp",[944,12585,3681],{"class":958},[944,12587,7647],{"class":958},[944,12589,12590,12592,12594,12596,12598],{"class":946,"line":1081},[944,12591,7630],{"class":958},[944,12593,7873],{"class":950},[944,12595,3681],{"class":958},[944,12597,1375],{"class":958},[944,12599,2935],{"class":958},[944,12601,12602,12604,12606,12608,12610],{"class":946,"line":1088},[944,12603,7666],{"class":958},[944,12605,7886],{"class":1054},[944,12607,3681],{"class":958},[944,12609,1375],{"class":958},[944,12611,1397],{"class":958},[944,12613,12614],{"class":946,"line":1948},[944,12615,7897],{"class":958},[944,12617,12618,12621],{"class":946,"line":1953},[944,12619,12620],{"class":958},"    }",[944,12622,7647],{"class":954},[944,12624,12625,12627,12630,12632,12634],{"class":946,"line":1959},[944,12626,7617],{"class":958},[944,12628,12629],{"class":1058},"cloudflare-docs",[944,12631,3681],{"class":958},[944,12633,7610],{"class":954},[944,12635,2905],{"class":958},[944,12637,12638,12640,12642,12644,12646,12648,12651],{"class":946,"line":2294},[944,12639,7630],{"class":958},[944,12641,12574],{"class":950},[944,12643,3681],{"class":958},[944,12645,1375],{"class":958},[944,12647,3267],{"class":958},[944,12649,12650],{"class":1058},"https:\u002F\u002Fdocs.mcp.cloudflare.com\u002Fmcp",[944,12652,1980],{"class":958},[944,12654,12655,12657],{"class":946,"line":2305},[944,12656,12620],{"class":958},[944,12658,7647],{"class":954},[944,12660,12661,12663,12666,12668,12670],{"class":946,"line":2401},[944,12662,7617],{"class":958},[944,12664,12665],{"class":1058},"cloudflare-bindings",[944,12667,3681],{"class":958},[944,12669,7610],{"class":954},[944,12671,2905],{"class":958},[944,12673,12674,12676,12678,12680,12682,12684,12687,12689],{"class":946,"line":2407},[944,12675,7630],{"class":958},[944,12677,12574],{"class":950},[944,12679,3681],{"class":958},[944,12681,1375],{"class":958},[944,12683,3267],{"class":958},[944,12685,12686],{"class":1058},"https:\u002F\u002Fbindings.mcp.cloudflare.com\u002Fmcp",[944,12688,3681],{"class":958},[944,12690,7647],{"class":958},[944,12692,12693,12695,12697,12699,12701],{"class":946,"line":2413},[944,12694,7630],{"class":958},[944,12696,7873],{"class":950},[944,12698,3681],{"class":958},[944,12700,1375],{"class":958},[944,12702,2935],{"class":958},[944,12704,12705,12707,12709,12711,12713],{"class":946,"line":1723},[944,12706,7666],{"class":958},[944,12708,7886],{"class":1054},[944,12710,3681],{"class":958},[944,12712,1375],{"class":958},[944,12714,1397],{"class":958},[944,12716,12717],{"class":946,"line":2423},[944,12718,7897],{"class":958},[944,12720,12721,12723],{"class":946,"line":3336},[944,12722,12620],{"class":958},[944,12724,7647],{"class":954},[944,12726,12727,12729,12732,12734,12736],{"class":946,"line":3347},[944,12728,7617],{"class":958},[944,12730,12731],{"class":1058},"cloudflare-builds",[944,12733,3681],{"class":958},[944,12735,7610],{"class":954},[944,12737,2905],{"class":958},[944,12739,12740,12742,12744,12746,12748,12750,12753,12755],{"class":946,"line":3352},[944,12741,7630],{"class":958},[944,12743,12574],{"class":950},[944,12745,3681],{"class":958},[944,12747,1375],{"class":958},[944,12749,3267],{"class":958},[944,12751,12752],{"class":1058},"https:\u002F\u002Fbuilds.mcp.cloudflare.com\u002Fmcp",[944,12754,3681],{"class":958},[944,12756,7647],{"class":958},[944,12758,12759,12761,12763,12765,12767],{"class":946,"line":3360},[944,12760,7630],{"class":958},[944,12762,7873],{"class":950},[944,12764,3681],{"class":958},[944,12766,1375],{"class":958},[944,12768,2935],{"class":958},[944,12770,12771,12773,12775,12777,12779],{"class":946,"line":3901},[944,12772,7666],{"class":958},[944,12774,7886],{"class":1054},[944,12776,3681],{"class":958},[944,12778,1375],{"class":958},[944,12780,1397],{"class":958},[944,12782,12783],{"class":946,"line":3907},[944,12784,7897],{"class":958},[944,12786,12787,12789],{"class":946,"line":3916},[944,12788,12620],{"class":958},[944,12790,7647],{"class":954},[944,12792,12793,12795,12798,12800,12802],{"class":946,"line":4572},[944,12794,7617],{"class":958},[944,12796,12797],{"class":1058},"cloudflare-observability",[944,12799,3681],{"class":958},[944,12801,7610],{"class":954},[944,12803,2905],{"class":958},[944,12805,12806,12808,12810,12812,12814,12816,12819,12821],{"class":946,"line":5029},[944,12807,7630],{"class":958},[944,12809,12574],{"class":950},[944,12811,3681],{"class":958},[944,12813,1375],{"class":958},[944,12815,3267],{"class":958},[944,12817,12818],{"class":1058},"https:\u002F\u002Fobservability.mcp.cloudflare.com\u002Fmcp",[944,12820,3681],{"class":958},[944,12822,7647],{"class":958},[944,12824,12825,12827,12829,12831,12833],{"class":946,"line":5038},[944,12826,7630],{"class":958},[944,12828,7873],{"class":950},[944,12830,3681],{"class":958},[944,12832,1375],{"class":958},[944,12834,2935],{"class":958},[944,12836,12837,12839,12841,12843,12845],{"class":946,"line":5046},[944,12838,7666],{"class":958},[944,12840,7886],{"class":1054},[944,12842,3681],{"class":958},[944,12844,1375],{"class":958},[944,12846,1397],{"class":958},[944,12848,12849],{"class":946,"line":5054},[944,12850,7897],{"class":958},[944,12852,12853],{"class":946,"line":5059},[944,12854,7750],{"class":958},[430,12856,12857,12858,12861,12862,12865],{},"回到应用中的 ",[441,12859,12860],{},"Customizations"," 界面，点击 ",[441,12863,12864],{},"Refresh（刷新）"," 按钮。现在，你会在列表中看到 Cloudflare MCP 服务器，其状态显示为等待授权。",[430,12867,12868],{},[433,12869],{"alt":12870,"src":12871},"在定制菜单中列出的等待授权的 Cloudflare MCP 服务器列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-mcp-pending.webp",[430,12873,12874,12875,12878,12879,1807],{},"点击 MCP 服务器旁边的 ",[441,12876,12877],{},"Authenticate（认证）","。系统会在浏览器中打开一个认证页面。登录授权后，会生成一个",[441,12880,12881],{},"授权码（auth code）",[430,12883,12884],{},[433,12885],{"alt":12886,"src":12887},"浏览器中显示的用于 Cloudflare MCP 服务的动态 OAuth 授权码","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-auth-code.webp",[430,12889,12890,12891,1807],{},"复制该授权码，并将其粘贴回 Antigravity 的文本输入框中，最后点击 ",[441,12892,12893],{},"Submit（提交）",[430,12895,12896],{},[433,12897],{"alt":12898,"src":12899},"在 Antigravity 配置界面中提交 OAuth 验证授权码","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-auth-submit.webp",[12375,12901],{},[474,12903,12905],{"id":12904},"_4-添加自定义技能","4. 添加自定义技能",[430,12907,12908,12909,12912,12913,12916],{},"目前，",[441,12910,12911],{},"无法","直接通过桌面应用的 UI 界面添加自定义技能。它们必须被直接放入 ",[494,12914,12915],{},"~\u002F.gemini\u002Fconfig\u002Fskills"," 文件夹中。",[430,12918,12919,12920,12923,12924],{},"由于我们使用 ",[494,12921,12922],{},"npx skills"," 命令行工具来统一管理所有智能体技能，因此任何新添加的技能都可以无缝对接给包括 Antigravity 在内的所有智能体。",[911,12925,12926,12927,12929],{},"(想深入了解相关内容，请参阅我们的文章：",[444,12928,8689],{"href":359},")。",[430,12931,12932,12933,12935],{},"最开始，在对话框中输入 ",[494,12934,12146],{}," 时，技能列表显示为空：",[430,12937,12938],{},[433,12939],{"alt":12940,"src":12941},"在对话框中输入斜杠快捷键时显示为空的自定义技能列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-empty-skills-list.webp",[430,12943,12944,12945,12947],{},"看来 Antigravity 2 并不会自动读取全局技能文件夹（",[494,12946,8674],{},"）。为了解决这个问题，我们需要在 Antigravity 配置文件目录下创建一个指向全局技能文件夹的符号链接（软链接）：",[936,12949,12951],{"className":1045,"code":12950,"language":1047,"meta":425,"style":425},"ln -s ~\u002F.agents\u002Fskills\u002Fexcalidraw-diagram ~\u002F.gemini\u002Fconfig\u002Fskills\u002Fexcalidraw-diagram\n",[494,12952,12953],{"__ignoreMap":425},[944,12954,12955,12957,12959,12962],{"class":946,"line":947},[944,12956,3667],{"class":1054},[944,12958,3524],{"class":1058},[944,12960,12961],{"class":1058}," ~\u002F.agents\u002Fskills\u002Fexcalidraw-diagram",[944,12963,12964],{"class":1058}," ~\u002F.gemini\u002Fconfig\u002Fskills\u002Fexcalidraw-diagram\n",[430,12966,12967],{},"软链接创建成功后，该技能即可在应用中直接使用！",[430,12969,12970],{},[433,12971],{"alt":12972,"src":12973},"软链接成功后在 Antigravity 命令列表中正常显示的 Excalidraw 绘图技能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-excalidraw-skill-available.webp",[12375,12975],{},[474,12977,12979],{"id":12978},"_5-测试简易任务","5. 测试简易任务",[430,12981,12982],{},"配置好一切后，让我们来运行一个测试。",[430,12984,12985],{},[433,12986],{"alt":12987,"src":12988},"提交测试任务让智能体通过 Cloudflare 服务列出 D1 数据库列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-test-simple-task-prompt.webp",[430,12990,12991],{},"如下图所示，模型成功检测并调用了新添加的 Cloudflare MCP 服务器来处理该请求。",[430,12993,12994],{},[433,12995],{"alt":12996,"src":12997},"AI 智能体通过 Cloudflare MCP 服务成功运行并返回 D1 数据库列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-test-task-success.webp",[12375,12999],{},[474,13001,13002],{"id":13002},"总结与感悟",[430,13004,13005],{},"Antigravity 2 代表了从传统 IDE 向开箱即用桌面应用的重大转变，让普通用户也能成为各种任务的幕后协调者和指挥官。",[430,13007,13008],{},"不过，Antigravity 2 仍有一些细节亟待打磨。当功能运行失败时，模糊不清的错误处理会让调试过程变得相当令人沮丧。此外，官方文档显得不够精细（极有可能是 AI 生成的），其中好几处引用和文件路径目前都是错误的。",[1667,13010,13011],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":425,"searchDepth":1074,"depth":1081,"links":13013},[13014,13015,13016,13019,13020,13021,13022],{"id":12359,"depth":1081,"text":12359},{"id":12379,"depth":1074,"text":12380},{"id":12425,"depth":1074,"text":12426,"children":13017},[13018],{"id":12451,"depth":1088,"text":12452},{"id":12529,"depth":1074,"text":12530},{"id":12904,"depth":1074,"text":12905},{"id":12978,"depth":1074,"text":12979},{"id":13002,"depth":1074,"text":13002},[1687],"2026-06-05","探索 Google Antigravity 2 的全新功能。阅读本篇手把手实测指南，轻松掌握应用安装、AI 智能体任务测试以及手动添加自定义 MCP 服务的完整流程。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002FZH-Setup-Antigravity-2.0.webp","Google Antigravity 2 配置与评测：AI 智能体、MCP 服务与插件全面指南",{"schemaOrg":13029,"robots":1721,"sitemap":13031},[13030],{"@type":1698,"headline":13027,"description":13025},{"lastmod":13024},{"title":13027,"description":13025,"ogTitle":12015,"ogDescription":13025,"twitterTitle":12015,"twitterDescription":13025},"zh\u002Farticle\u002Fsetup-antigravity-2",[],"L0qCntI8nNOwJikKIe8BW8KqgDWHiugiYRwQHYUN-ik",{"id":13037,"title":8689,"author":1730,"body":13038,"category":13455,"date":13456,"description":13457,"extension":1692,"image":13458,"imageAlt":13459,"isPublished":1077,"meta":13460,"minRead":1959,"navigation":1077,"path":321,"seo":13466,"stem":13467,"tags":13468,"updatedAt":1730,"__hash__":13469},"article\u002Fzh\u002Farticle\u002Fcentralised-the-skills-for-agents.md",{"type":427,"value":13039,"toc":13445},[13040,13051,13054,13077,13093,13096,13106,13122,13132,13139,13142,13164,13170,13181,13199,13209,13219,13222,13229,13250,13253,13259,13269,13276,13279,13299,13308,13312,13318,13390,13397,13401,13437,13442],[430,13041,13042,13043,13046,13047,13050],{},"如果你在电脑上运行了多个 AI 智能体（Agent）或 CLI 工具——无论是 Hermes、Claude Code、Codex、Antigravity、Kimi 还是其他受支持的工具，你可能都遇到过一个极其令人沮丧的问题：",[441,13044,13045],{},"技能碎片化（skills fragmentation）","。每个智能体或 CLI 都会维护自己独立的 ",[494,13048,13049],{},"skills"," 文件夹，这会导致重复安装、版本偏差以及极高的管理维护成本。",[430,13052,13053],{},"在日常使用 AI 智能体的过程中，我们经常会遇到以下痛点：",[484,13055,13056,13062,13068],{},[487,13057,13058,13061],{},[441,13059,13060],{},"重复安装","：为一个智能体安装了新技能后，还必须为其他智能体一次又一次地重复安装。",[487,13063,13064,13067],{},[441,13065,13066],{},"版本偏差（Version Drift）","：在某个智能体中定制或修复了某个技能，却忘记同步更新其他智能体，导致不同的智能体表现出不一致的行为。",[487,13069,13070,13073,13074,13076],{},[441,13071,13072],{},"技能管理混乱","：必须逐个翻看系统里每个智能体的 ",[494,13075,13049],{}," 文件夹，才能知道到底安装了哪些技能。",[430,13078,13079,13080,13082,13083,13085,13086,13092],{},"由 Vercel 推出的开源 CLI 工具 ",[494,13081,12922],{}," 完美地解决了这个问题。它允许你建立并管理一个统一的、中央化的 ",[494,13084,13049],{}," 文件夹，并无缝共享给所有的智能体。你可以前往 ",[444,13087,13089,13091],{"href":8634,"rel":13088},[448],[494,13090,12922],{}," 的 GitHub 仓库","了解更多信息。",[474,13094,13095],{"id":13095},"技能一元化管理",[430,13097,13098,13099,13101,13102,13105],{},"这个方案的核心概念非常简单：如果我们把每个智能体的 ",[494,13100,13049],{}," 文件夹都指向",[441,13103,13104],{},"同一个物理文件夹","，那么碎片化问题就会迎刃而解。",[430,13107,13108,13109,13111,13112,13114,13115,13117,13118,13121],{},"当你使用 ",[494,13110,12922],{}," CLI 安装技能时，该技能会被下载到你电脑上的中央统一文件夹（",[494,13113,8674],{},"）。接着，CLI 会自动在各个智能体的 ",[494,13116,13049],{}," 文件夹中创建",[441,13119,13120],{},"软链接（Symlink，即指向实际文件夹的快捷方式）","，直接导向该中央文件夹。",[430,13123,13124,13125,13128,13129,13131],{},"例如，当 Claude Code 在 ",[494,13126,13127],{},"~\u002F.claude\u002Fskills\u002F"," 中寻找技能时，它会被透明地重定向到 ",[494,13130,8674],{},"。只要你对中央文件夹中的技能进行任何微调，所有智能体都会立刻同步应用。无需手动复制，无需编写同步脚本，更不会浪费任何硬盘空间。",[474,13133,13135,13136,13138],{"id":13134},"安装-npx-skills-并添加技能","安装 ",[494,13137,12922],{}," 并添加技能",[430,13140,13141],{},"运行以下命令来开始并添加我们的第一个技能：",[936,13143,13145],{"className":1045,"code":13144,"language":1047,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill --skill excalidraw-diagram\n",[494,13146,13147],{"__ignoreMap":425},[944,13148,13149,13151,13153,13155,13158,13161],{"class":946,"line":947},[944,13150,7642],{"class":1054},[944,13152,8649],{"class":1058},[944,13154,1068],{"class":1058},[944,13156,13157],{"class":1058}," https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[944,13159,13160],{"class":1058}," --skill",[944,13162,13163],{"class":1058}," excalidraw-diagram\n",[430,13165,13166],{},[433,13167],{"alt":13168,"src":13169},"使用 npx skills add 命令从 GitHub 安装 AI 智能体技能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-add-command.webp",[430,13171,13172,13173,13176,13177],{},"CLI 会询问是将此配置应用于特定项目还是全局（globally）。我们通常推荐选择 ",[441,13174,13175],{},"global","（全局），以便所有受支持的智能体都能访问它：\n",[433,13178],{"alt":13179,"src":13180},"在 npx skills CLI 中选择全局（global）安装选项","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-install-global-prompt.webp",[430,13182,13183,13184,13187,13188,3089,13191,13195],{},"接下来，请务必选择 ",[494,13185,13186],{},"Symlink"," 以确保",[441,13189,13190],{},"唯一可信数据源（Single Source of Truth）",[433,13192],{"alt":13193,"src":13194},"选择软链接（Symlink）方式以确保单一事实来源","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-symlink-option.webp",[433,13196],{"alt":13197,"src":13198},"CLI 显示技能安装完成与软链接创建成功确认","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-installation-completed.webp",[430,13200,13201,13202,13204,13205],{},"完成后，我们可以验证该技能是否已经正确安装在中央统一文件夹 ",[494,13203,8674],{}," 中：\n",[433,13206],{"alt":13207,"src":13208},"验证中央统一文件夹中已安装的 AI 智能体技能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-directory-verification.webp",[430,13210,13211,13212,13214,13215],{},"打开 Kimi CLI（或任何其他智能体），你会发现 ",[494,13213,10289],{}," 技能已经立即可用！\n",[433,13216],{"alt":13217,"src":13218},"Kimi CLI 显示已成功加载并可立即使用的中央统一技能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fkimi-cli-skills-integration.webp",[474,13220,13221],{"id":13221},"从零开始创建技能",[430,13223,13224,13225,13228],{},"如果你想自建专属技能，可以使用 Anthropic 的 ",[494,13226,13227],{},"skill-creator"," 工具。通过以下命令进行安装：",[936,13230,13232],{"className":1045,"code":13231,"language":1047,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills --skill skill-creator\n",[494,13233,13234],{"__ignoreMap":425},[944,13235,13236,13238,13240,13242,13245,13247],{"class":946,"line":947},[944,13237,7642],{"class":1054},[944,13239,8649],{"class":1058},[944,13241,1068],{"class":1058},[944,13243,13244],{"class":1058}," https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills",[944,13246,13160],{"class":1058},[944,13248,13249],{"class":1058}," skill-creator\n",[430,13251,13252],{},"现在，在 Kimi 或任何其他智能体中，输入以下提示词（Prompt）：",[936,13254,13257],{"className":13255,"code":13256,"language":4641},[4639],"Use the skill-creator to help me build a skill for creating a product landing page\n",[494,13258,13256],{"__ignoreMap":425},[430,13260,13261,13262,13264,13265],{},"Kimi 或你的智能体会自动识别 ",[494,13263,13227],{}," 并引导你一步步完成创建过程：\n",[433,13266],{"alt":13267,"src":13268},"在 Kimi CLI 中运行交互式 skill-creator 引导创建新技能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fkimi-cli-skill-creator-setup.webp",[474,13270,13272,13273,13275],{"id":13271},"其他实用的-npx-skills-命令","其他实用的 ",[494,13274,12922],{}," 命令",[430,13277,13278],{},"以下是一些常用的便捷命令：",[484,13280,13281,13287,13293],{},[487,13282,13283,13286],{},[494,13284,13285],{},"npx skills ls -g","：列出所有全局安装的技能",[487,13288,13289,13292],{},[494,13290,13291],{},"npx skills update","：仅需一条命令即可将所有技能一键更新到最新版本",[487,13294,13295,13298],{},[494,13296,13297],{},"npx skills remove","：以交互式的方式卸载\u002F移除某个技能",[430,13300,13301,13302,13307],{},"请参阅 ",[444,13303,13305,13091],{"href":8634,"rel":13304},[448],[494,13306,12922],{},"以获取更多命令和参考文档。",[474,13309,13311],{"id":13310},"进阶玩法结合-git-管理","进阶玩法：结合 Git 管理",[430,13313,13314,13315,13317],{},"由于现在所有的技能都集中在一个地方（",[494,13316,8674],{},"），我们可以将其初始化为一个 Git 仓库，并推送到 GitHub 或 GitLab 进行备份与版本控制。",[936,13319,13321],{"className":1045,"code":13320,"language":1047,"meta":425,"style":425},"cd ~\u002F.agents\u002Fskills\ngit init\ngit add .\ngit commit -m \"Initial skills folder\"\ngit remote add origin https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fskills\ngit push -u origin main\n",[494,13322,13323,13330,13337,13345,13361,13376],{"__ignoreMap":425},[944,13324,13325,13327],{"class":946,"line":947},[944,13326,2806],{"class":976},[944,13328,13329],{"class":1058}," ~\u002F.agents\u002Fskills\n",[944,13331,13332,13334],{"class":946,"line":1074},[944,13333,2782],{"class":1054},[944,13335,13336],{"class":1058}," init\n",[944,13338,13339,13341,13343],{"class":946,"line":1081},[944,13340,2782],{"class":1054},[944,13342,1068],{"class":1058},[944,13344,4902],{"class":1058},[944,13346,13347,13349,13351,13354,13356,13359],{"class":946,"line":1088},[944,13348,2782],{"class":1054},[944,13350,12278],{"class":1058},[944,13352,13353],{"class":1058}," -m",[944,13355,3267],{"class":958},[944,13357,13358],{"class":1058},"Initial skills folder",[944,13360,1980],{"class":958},[944,13362,13363,13365,13368,13370,13373],{"class":946,"line":1948},[944,13364,2782],{"class":1054},[944,13366,13367],{"class":1058}," remote",[944,13369,1068],{"class":1058},[944,13371,13372],{"class":1058}," origin",[944,13374,13375],{"class":1058}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fskills\n",[944,13377,13378,13380,13382,13385,13387],{"class":946,"line":1953},[944,13379,2782],{"class":1054},[944,13381,12249],{"class":1058},[944,13383,13384],{"class":1058}," -u",[944,13386,13372],{"class":1058},[944,13388,13389],{"class":1058}," main\n",[430,13391,13392,13393,13396],{},"这样，我们就拥有了技能修改的完整历史记录。万一某次更新破坏了功能，我们可以非常轻松地回滚（Rollback）。此外，如果你有多台电脑（例如笔记本和台式机），只需运行一次快速的 ",[494,13394,13395],{},"git pull","，即可在不同设备间无缝同步所有技能。",[474,13398,13400],{"id":13399},"几点注意事项安全与风险","几点注意事项（安全与风险）",[484,13402,13403,13409,13415,13425,13431],{},[487,13404,13405,13408],{},[441,13406,13407],{},"兼容性差异","：并非所有的智能体平台都完全支持所有功能（例如自定义钩子 custom hooks 或特定的授权工具）。某个技能在 A 智能体上运行顺畅，在 B 智能体上可能会遇到功能限制。",[487,13410,13411,13414],{},[441,13412,13413],{},"来源可信度","：请务必只从信任的来源安装技能。",[487,13416,13417,13420,13421,13424],{},[441,13418,13419],{},"运行前代码审查","：如果你使用的是自定义或第三方的技能，在授权智能体运行 it 之前，请务必先审查其代码文件（尤其是 ",[494,13422,13423],{},"scripts\u002F"," 文件夹下的内容）。",[487,13426,13427,13430],{},[441,13428,13429],{},"最小权限原则","：尽量不要给技能授予超出其核心功能所需的工具权限或系统访问权限。",[487,13432,13433,13436],{},[441,13434,13435],{},"切勿硬编码敏感信息","：千万不要在技能文件中直接写入 API 密钥（API Keys）或其他敏感凭证。",[430,13438,11943,13439,13441],{},[494,13440,12922],{}," 建立“唯一可信数据源”后，我们的团队彻底摆脱了版本混乱和重复配置的烦恼。强烈建议你尝试一下——随着技能库的不断丰富， AI 智能体的能力也将迎来爆发式增长！",[1667,13443,13444],{},"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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":425,"searchDepth":1074,"depth":1081,"links":13446},[13447,13448,13450,13451,13453,13454],{"id":13095,"depth":1074,"text":13095},{"id":13134,"depth":1074,"text":13449},"安装 npx skills 并添加技能",{"id":13221,"depth":1074,"text":13221},{"id":13271,"depth":1074,"text":13452},"其他实用的 npx skills 命令",{"id":13310,"depth":1074,"text":13311},{"id":13399,"depth":1074,"text":13400},[1687],"2026-06-04","正在运行 Claude Code、Kimi 等多个 AI 智能体？本文教你如何使用开源 npx skills CLI 建立统一的中央文件夹，彻底解决技能文件碎片化与多版本冲突。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002F%E4%BD%BF%E7%94%A8-npx-skills-%E5%B7%A5%E5%85%B7%E6%9D%A5%E5%BD%BB%E5%BA%95%E8%A7%A3%E5%86%B3%E4%B8%8D%E5%90%8C-AI-%E6%99%BA%E8%83%BD%E4%BD%93%EF%BC%88%E5%A6%82-Claude-Code-%E6%88%96-Kimi%EF%BC%89%E6%8A%80%E8%83%BD%E7%A2%8E%E7%89%87%E5%8C%96%E9%97%AE%E9%A2%98.webp","使用 npx skills 解决 AI 智能体（Agent）技能碎片化与重复安装问题",{"schemaOrg":13461,"robots":1721,"sitemap":13464},[13462],{"@type":1698,"headline":13463,"description":13457},"使用 npx skills 统一管理 AI 智能体（Agent）的技能",{"lastmod":13465},"2026-06-03",{"title":13463,"description":13457,"ogTitle":8689,"ogDescription":13457,"twitterTitle":8689,"twitterDescription":13457},"zh\u002Farticle\u002Fcentralised-the-skills-for-agents",[],"LbyuZ5p7uSGhLOrLBvlySAjG01nUa1AlLxJw-FdWG5U",1792489977606]