[{"data":1,"prerenderedAt":6752},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness":421,"\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness-surround":1731},[4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346],{"path":5},"\u002Fde\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":7},"\u002Fde\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":9},"\u002Fde\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":11},"\u002Fde\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":13},"\u002Fde\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":15},"\u002Fde\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":17},"\u002Fde\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":19},"\u002Fde\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":21},"\u002Fde\u002Farticle\u002Fsetup-antigravity-2",{"path":23},"\u002Fde\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":25},"\u002Fde\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":27},"\u002Fde\u002Farticle\u002Fsync-obsidian-across-devices",{"path":29},"\u002Fde\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":31},"\u002Fde\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":33},"\u002Fde\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":35},"\u002Fde\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":37},"\u002Fen\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":39},"\u002Fen\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":41},"\u002Fen\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":43},"\u002Fen\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":45},"\u002Fen\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":47},"\u002Fen\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":49},"\u002Fen\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":51},"\u002Fen\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":53},"\u002Fen\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":55},"\u002Fen\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":57},"\u002Fen\u002Farticle\u002Fsetup-antigravity-2",{"path":59},"\u002Fen\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":61},"\u002Fen\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":63},"\u002Fen\u002Farticle\u002Fsync-obsidian-across-devices",{"path":65},"\u002Fen\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":67},"\u002Fen\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":69},"\u002Fen\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":71},"\u002Fen\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":73},"\u002Fes\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":75},"\u002Fes\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":77},"\u002Fes\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":79},"\u002Fes\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":81},"\u002Fes\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":83},"\u002Fes\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":85},"\u002Fes\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":87},"\u002Fes\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":89},"\u002Fes\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":91},"\u002Fes\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":93},"\u002Fes\u002Farticle\u002Fsetup-antigravity-2",{"path":95},"\u002Fes\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":97},"\u002Fes\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":99},"\u002Fes\u002Farticle\u002Fsync-obsidian-across-devices",{"path":101},"\u002Fes\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":103},"\u002Fes\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":105},"\u002Fes\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":107},"\u002Fes\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":109},"\u002Ffr\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":111},"\u002Ffr\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":113},"\u002Ffr\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":115},"\u002Ffr\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":117},"\u002Ffr\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":119},"\u002Ffr\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":121},"\u002Ffr\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":123},"\u002Ffr\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":125},"\u002Ffr\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":127},"\u002Ffr\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":129},"\u002Ffr\u002Farticle\u002Fsetup-antigravity-2",{"path":131},"\u002Ffr\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":133},"\u002Ffr\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":135},"\u002Ffr\u002Farticle\u002Fsync-obsidian-across-devices",{"path":137},"\u002Ffr\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":139},"\u002Ffr\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":141},"\u002Ffr\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":143},"\u002Ffr\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":145},"\u002Fid\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":147},"\u002Fid\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":149},"\u002Fid\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":151},"\u002Fid\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":153},"\u002Fid\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":155},"\u002Fid\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":157},"\u002Fid\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":159},"\u002Fid\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":161},"\u002Fid\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":163},"\u002Fid\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":165},"\u002Fid\u002Farticle\u002Fsetup-antigravity-2",{"path":167},"\u002Fid\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":169},"\u002Fid\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":171},"\u002Fid\u002Farticle\u002Fsync-obsidian-across-devices",{"path":173},"\u002Fid\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":175},"\u002Fid\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":177},"\u002Fid\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":179},"\u002Fid\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":181},"\u002Fja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":183},"\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":185},"\u002Fja\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":187},"\u002Fja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":189},"\u002Fja\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":191},"\u002Fja\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":193},"\u002Fja\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":195},"\u002Fja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":197},"\u002Fja\u002Farticle\u002Fsetup-antigravity-2",{"path":199},"\u002Fja\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":201},"\u002Fja\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":203},"\u002Fja\u002Farticle\u002Fsync-obsidian-across-devices",{"path":205},"\u002Fja\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":207},"\u002Fja\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":209},"\u002Fja\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":211},"\u002Fja\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":213},"\u002Fpt\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":215},"\u002Fpt\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":217},"\u002Fpt\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":219},"\u002Fpt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":221},"\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":223},"\u002Fpt\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":225},"\u002Fpt\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":227},"\u002Fpt\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":229},"\u002Fpt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":231},"\u002Fpt\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":233},"\u002Fpt\u002Farticle\u002Fsetup-antigravity-2",{"path":235},"\u002Fpt\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":237},"\u002Fpt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":239},"\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices",{"path":241},"\u002Fpt\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":243},"\u002Fpt\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":245},"\u002Fpt\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":247},"\u002Fpt\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":249},"\u002Ftw\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":251},"\u002Ftw\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":253},"\u002Ftw\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":255},"\u002Ftw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":257},"\u002Ftw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":259},"\u002Ftw\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":261},"\u002Ftw\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":263},"\u002Ftw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":265},"\u002Ftw\u002Farticle\u002Fsetup-antigravity-2",{"path":267},"\u002Ftw\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":269},"\u002Ftw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":271},"\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices",{"path":273},"\u002Ftw\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":275},"\u002Ftw\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":277},"\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":279},"\u002Ftw\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":281},"\u002Fvi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":283},"\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":285},"\u002Fvi\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":287},"\u002Fvi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":289},"\u002Fvi\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":291},"\u002Fvi\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":293},"\u002Fvi\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":295},"\u002Fvi\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":297},"\u002Fvi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":299},"\u002Fvi\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":301},"\u002Fvi\u002Farticle\u002Fsetup-antigravity-2",{"path":303},"\u002Fvi\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":305},"\u002Fvi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":307},"\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices",{"path":309},"\u002Fvi\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":311},"\u002Fvi\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":313},"\u002Fvi\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":315},"\u002Fvi\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":317},"\u002Fzh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":319},"\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":321},"\u002Fzh\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":323},"\u002Fzh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":325},"\u002Fzh\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":327},"\u002Fzh\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":329},"\u002Fzh\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":331},"\u002Fzh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":333},"\u002Fzh\u002Farticle\u002Fsetup-antigravity-2",{"path":335},"\u002Fzh\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":337},"\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":339},"\u002Fzh\u002Farticle\u002Fsync-obsidian-across-devices",{"path":341},"\u002Fzh\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":343},"\u002Fzh\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":345},"\u002Fzh\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":347},"\u002Fzh\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417],{"title":350,"path":351,"stem":352},"AI Agent Skills: What They Are & How to Create Them","\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them","en\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"title":354,"path":355,"stem":356},"Bringing Buzz to DeepSeek Harness: Taught to Speak Nostr","\u002Farticle\u002Fbringing-buzz-to-deepseek-harness","en\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"title":358,"path":359,"stem":360},"Solving AI Agent Skills Fragmentation with npx skills","\u002Farticle\u002Fcentralised-the-skills-for-agents","en\u002Farticle\u002Fcentralised-the-skills-for-agents",{"title":362,"path":363,"stem":364},"How to Expose Hermes Agent Privately with Cloudflare WARP","\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp","en\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"title":366,"path":367,"stem":368},"How AI Agent Skills Replace Nuxt App Scaffolding Scripts","\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts","en\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"title":370,"path":371,"stem":372},"Stop Exposing Your Vault: Secure NodeWarden with Cloudflare","\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare","en\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"title":374,"path":375,"stem":376},"How to Deploy Hermes Agent on a Linux VPS","\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server","en\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"title":378,"path":379,"stem":380},"Self-Host Your Travel Itineraries with TREK and Docker","\u002Farticle\u002Fself-hosted-travel-planner-trek","en\u002Farticle\u002Fself-hosted-travel-planner-trek",{"title":382,"path":383,"stem":384},"Self-Host Block's Buzz: Shared AI Agent Workspace","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues","en\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"title":386,"path":387,"stem":388},"How to Self-Host a BitWarden Compatible Server Nodewarden","\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare","en\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"title":390,"path":391,"stem":392},"Google Antigravity 2 Hands-On: Setup & First Impressions","\u002Farticle\u002Fsetup-antigravity-2","en\u002Farticle\u002Fsetup-antigravity-2",{"title":394,"path":395,"stem":396},"NetSuite AI Connector Guide: MCP Setup & Use Cases","\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude","en\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"title":398,"path":399,"stem":400},"Switch Between Multiple Cloudflare WARP Orgs on Mac","\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac","en\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"title":402,"path":403,"stem":404},"How to Sync Obsidian Vaults Across Devices Securely","\u002Farticle\u002Fsync-obsidian-across-devices","en\u002Farticle\u002Fsync-obsidian-across-devices",{"title":406,"path":407,"stem":408},"Testing Claude Fable 5: A Financial Analysis Review","\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis","en\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"title":410,"path":411,"stem":412},"Guide to Browser and Scheduler in Antigravity 2","\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2","en\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"title":414,"path":415,"stem":416},"Build a Persistent AI Memory System on Cloudflare","\u002Farticle\u002Fuse-cloudflare-as-ai-memory","en\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"title":418,"path":419,"stem":420},"Antigravity 2 in Action: AI Agents, Skills, and MCP","\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2","en\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"id":422,"title":423,"author":424,"body":425,"category":1685,"date":1689,"description":1690,"extension":1691,"image":1692,"imageAlt":1693,"isPublished":1076,"meta":1694,"minRead":1722,"navigation":1076,"path":319,"seo":1723,"stem":1725,"tags":1726,"updatedAt":1729,"__hash__":1730},"article\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness.md","为 DeepSeek Harness 接入 Buzz 协作平台：构建自托管 Nostr 消息网关的完整实践","",{"type":426,"value":427,"toc":1669},"minimark",[428,436,461,469,472,477,482,527,530,591,595,602,883,886,890,895,901,905,919,923,934,988,995,999,1002,1034,1037,1042,1093,1101,1107,1116,1122,1153,1167,1171,1180,1211,1233,1281,1288,1294,1300,1307,1313,1318,1326,1340,1346,1356,1397,1400,1406,1413,1419,1423,1426,1581,1584,1625,1629,1635,1639,1665],[429,430,431],"p",{},[432,433],"img",{"alt":434,"src":435},"DeepSeek Harness 消息网关连接至 Block Buzz 频道的运行概览","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-nostr-gateway-overview.webp",[429,437,438,439,449,450,455,456,460],{},"DeepSeek Harness（DSH）的官方插件 ",[440,441,442],"strong",{},[443,444,448],"a",{"href":445,"rel":446},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway",[447],"nofollow","dsh-message-gateway","，能够将 DeepSeek Harness 助手无缝扩展至 Discord、Telegram、微信等多种主流即时通讯平台。该插件仓库已被 Fork 并进行了二次开发，旨在将 ",[440,451,452],{},[443,453,454],{"href":383},"自建 Block 旗下 Buzz 协作平台：轻松构建人类与 AI 智能体高效协同工作的全新共享工作空间"," 接入支持列表。Fork 后的开源代码仓库位于 GitHub：",[443,457,458],{"href":458,"rel":459},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway",[447]," 。",[462,463],"article-card",{"description":464,"image":465,"image-alt":466,"label":467,"min-read":468,"title":454,"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",[429,470,471],{},"DSH 助手作为一个全功能成员加入 Buzz Nostr 中继，既能接收私信（DM），也能接收被 @mention 提及的频道消息，并通过与 Web UI 完全相同的独立会话智能体管线输出响应。",[473,474,476],"h2",{"id":475},"dsh-message-gateway-插件架构剖析","dsh-message-gateway 插件架构剖析",[429,478,479,481],{},[440,480,448],{}," 插件的系统架构清晰划分为宿主端与客户端两大部分：",[483,484,485,517],"ul",{},[486,487,488,491,492,496,497,500,501,504,505,508,509,512,513,516],"li",{},[440,489,490],{},"宿主端（Node 环境）","：",[493,494,495],"code",{},"gateway-store","（凭证与配置持久化存储，位于 ",[493,498,499],{},"~\u002F.dsh\u002Fgateway.json","）、",[493,502,503],{},"platforms.ts","（支持平台定义与连通性自检）、",[493,506,507],{},"routes.ts","（对外暴露的 ",[493,510,511],{},"\u002Fgateway\u002F*"," 路由端点）以及 ",[493,514,515],{},"bridge-manager.ts","（常驻网关桥接器：负责按会话维护独立 Agent 实例并统一管理流式响应推送）。",[486,518,519,522,523,526],{},[440,520,521],{},"客户端（浏览器前端）","：侧边栏的“",[440,524,525],{},"Message platforms","”可视化配置页面，负责录入密钥参数、发起连通性测试以及直观监控网关实时在线状态。",[429,528,529],{},"为网关接入一个全新通讯平台通常需要经历以下三步：",[531,532,533,551,565],"ol",{},[486,534,535,538,539,542,543,546,547,550],{},[440,536,537],{},"实现 Bridge 桥接类","：提供 ",[493,540,541],{},"start\u002Fstop\u002Fstatus"," 生命周期方法以及 ",[493,544,545],{},"onText(text, frame)"," 消息回调，结构规范与现有的 ",[493,548,549],{},"wecom-bridge.ts"," 完全一致。",[486,552,553,556,557,560,561,564],{},[440,554,555],{},"接入 bridge-manager 调度器","：复用既有的多会话调度管线（",[493,558,559],{},"ensureAgentForKey"," + ",[493,562,563],{},"pendingMap","），并将底层文本输出流挂载至该平台的专用回复接收器。",[486,566,567,570,571,574,575,578,579,582,583,586,587,590],{},[440,568,569],{},"对接持久化存储与配置路由","：在 ",[493,572,573],{},"\u002Fgateway\u002Fsave"," 与 ",[493,576,577],{},"\u002Fgateway\u002Fdelete"," 逻辑中实现：",[440,580,581],{},"保存配置即自动启动桥接服务，删除配置则优雅停止桥接服务","，配合 ",[493,584,585],{},"autoStartXxx"," 状态标记确保 ",[493,588,589],{},"dsh web"," 守护进程开机自动重连。",[473,592,594],{"id":593},"buzz-网关桥接实现nostr-协议标准与事件生命周期","Buzz 网关桥接实现：Nostr 协议标准与事件生命周期",[429,596,597,598,601],{},"本次接入直接使用 ",[440,599,600],{},"DeepSeek Harness"," 自行编写完成了完整的 Buzz 适配桥接器。底层严格遵循了如下 Nostr 协议规范标准：",[603,604,605,620],"table",{},[606,607,608],"thead",{},[609,610,611,617],"tr",{},[612,613,614],"th",{},[440,615,616],{},"维度 \u002F 阶段",[612,618,619],{},"协议实现规范与技术细节",[621,622,623,645,663,690,708,733,758,780,794,808,827,844,858],"tbody",{},[609,624,625,631],{},[626,627,628],"td",{},[440,629,630],{},"底层传输（Transport）",[626,632,633,634,637,638,641,642],{},"单条经过 NIP-42 鉴权认证的 WebSocket 链路；默认中继连接地址为 ",[493,635,636],{},"ws:\u002F\u002Flocalhost:3000","；输入的 ",[493,639,640],{},"http(s):\u002F\u002F"," 会自动规整为 ",[493,643,644],{},"ws(s):\u002F\u002F",[609,646,647,652],{},[626,648,649],{},[440,650,651],{},"鉴权认证（Auth）",[626,653,654,655,658,659,662],{},"AUTH 事件 ",[493,656,657],{},"kind 22242","，携带标签 ",[493,660,661],{},"[[\"relay\", url], [\"challenge\", challenge]]","，内容为空字符串，由 Agent 的私钥完成签名",[609,664,665,670],{},[626,666,667],{},[440,668,669],{},"订阅机制（Subs）",[626,671,672,491,675,678,679,682,683,686,687],{},[440,673,674],{},"严格基于频道隔离",[493,676,677],{},"REQ {\"kinds\":[9], \"#h\":[\u003Cuuid>]}"," — 每个频道独立建立一条订阅。全局性的 ",[493,680,681],{},"kinds:[9]"," 虽能收到 EOSE 但绝不广播推送；多值 ",[493,684,685],{},"#h"," 标签过滤在协议中",[440,688,689],{},"无法正常分发",[609,691,692,697],{},[626,693,694],{},[440,695,696],{},"频道发现（Discovery）",[626,698,699,700,703,704,707],{},"历史元数据回溯查询 ",[493,701,702],{},"REQ {kinds:[39000]}"," 提取频道详情（其中 ",[493,705,706],{},"type == \"dm\""," 用于标记单聊私信频道）",[609,709,710,715],{},[626,711,712],{},[440,713,714],{},"成员变动订阅",[626,716,717,718,721,722,724,725,728,729,732],{},"实时长连接订阅 ",[493,719,720],{},"REQ {kinds:[44100,44101], \"#p\":[Agent 公钥], since: now-60s}"," — 44100 为入群，44101 为被移出，均附带 ",[493,723,429],{},"+",[493,726,727],{},"h","；成员关系变更时",[440,730,731],{},"无需重连","即可动态热更新订阅状态",[609,734,735,740],{},[626,736,737],{},[440,738,739],{},"即时聊天事件",[626,741,742,745,746,749,750,753,754,757],{},[493,743,744],{},"kind 9"," 事件，携带 ",[493,747,748],{},"[\"h\", channel]"," 频道标签，可选附带 ",[493,751,752],{},"[\"e\", replyTo]"," 回复目标与 ",[493,755,756],{},"[\"p\", mention]"," 被提及者标签",[609,759,760,765],{},[626,761,762],{},[440,763,764],{},"原位更新编辑",[626,766,767,770,771,574,773,776,777,779],{},[493,768,769],{},"kind 40003"," 事件，附带 ",[493,772,727],{},[493,774,775],{},"e"," 目标标签；内容完全替换；中继单包上限 64 KB → 严控载荷 ≤ 60,000 B；超长回复分块处理 — 首块用于原位编辑替换，超出部分作为回复串线程的 ",[493,778,744],{}," 消息追加",[609,781,782,787],{},[626,783,784],{},[440,785,786],{},"CLOSED 异常帧处理",[626,788,789,790,793],{},"鉴权未完成前收到 ",[493,791,792],{},"auth-required"," 属于正常引导阶段（完成 AUTH 后重新拉起订阅）；鉴权完成后遇断连 → 阶梯式限次重试（最多 3 次，间隔 0\u002F1\u002F2 秒退避）；整链重连时全量重构上下文",[609,795,796,801],{},[626,797,798],{},[440,799,800],{},"中继拉取上限",[626,802,803,804,807],{},"每次订阅最多拉取 2000 条历史事件，即使配置了 ",[493,805,806],{},"since"," 过滤参数，中继仍按自最新向过去的时间倒序返回",[609,809,810,815],{},[626,811,812],{},[440,813,814],{},"消息命中判定",[626,816,817,818,820,821,823,824,826],{},"仅当满足以下任一条件时才激活处理入站 ",[493,819,744],{},"：(a) ",[493,822,429],{}," 标签明确包含自身公钥，(b) 处于 DM 私信频道，(c) 回复关联的 ",[493,825,775],{}," 根事件为自身发出的消息。自动过滤自身公钥发送的内容（彻底杜绝自环）",[609,828,829,834],{},[626,830,831],{},[440,832,833],{},"出站 @ 提及",[626,835,836,837,840,841,843],{},"出站内容按纯文本原样发布 — 中继端不对正文中的 ",[493,838,839],{},"@"," 符号进行预校验；",[493,842,429],{}," 标签填入当前对话原作者以及至多 7 位其他被提及者的公钥（单条上限 8 位）",[609,845,846,851],{},[626,847,848],{},[440,849,850],{},"私聊消息（DM）",[626,852,853,854,857],{},"依赖中继作用域内的明文受限频道（元数据标注 ",[493,855,856],{},"type: \"dm\"","） — 当前桥接实现中未引入 NIP-04\u002F44 复杂非对称端到端加密",[609,859,860,865],{},[626,861,862],{},[440,863,864],{},"媒体附件（入站）",[626,866,867,868,871,872,875,876,875,879,882],{},"NIP-92 ",[493,869,870],{},"imeta"," 规范（",[493,873,874],{},"url",", ",[493,877,878],{},"sha256",[493,880,881],{},"m","）→ 常规 HTTP(S) 流式下载，本地校验 SHA-256 完整性，单文件限制 20 MB，每条消息最多 4 张；出站图片发布暂无官方中继协议路径，现阶段不支持出站图片",[429,884,885],{},"Buzz 适配网关的启动引导时序图如下：",[432,887],{"src":888,"alt":889},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-bootstrap.webp","展示 Buzz 网关引导连接与 NIP-42 协议身份鉴权流程的时序图",[891,892,894],"h3",{"id":893},"基于-nostr-40003-事件原位编辑实现的实时流式输出","基于 Nostr 40003 事件原位编辑实现的实时流式输出",[429,896,897,898,491],{},"Nostr 协议缺乏原生打字中（Typing）状态通知，且底层事件设计为严格只增不改。为了让对话过程具备行云流水的实时交互感，Buzz 适配网关",[440,899,900],{},"通过原位编辑巧妙模拟了流式打字输出",[432,902],{"src":903,"alt":904},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-reply.webp","基于 kind 40003 事件原位编辑模拟打字流式响应的逻辑流程图",[483,906,907],{},[486,908,909],{},[910,911,912,913,915,916,918],"em",{},"网关首先秒级发出一条 ",[493,914,744],{}," 占位消息，随后在 Agent 推理过程中按设定的节流阈值连续发射 ",[493,917,769],{}," 原位编辑事件逐步追加渲染内容，并在推理终点落定最终文本。这一设计思路与 Telegram、Discord 桥接器的实现方式一脉相承。",[891,920,922],{"id":921},"通过聊天指令打通-deepseek-harness-本地工作区","通过聊天指令打通 DeepSeek Harness 本地工作区",[429,924,925,926,929,930,933],{},"DSH Web 界面所支持的“工作区（Workspaces）”核心能力依赖于底层 ",[493,927,928],{},"@deepseek-ai\u002Fdsh-workspace"," 模块中的 ",[493,931,932],{},"workspaceRegistry"," 服务：",[935,936,940],"pre",{"className":937,"code":938,"language":939,"meta":424,"style":424},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const existing = await ctx.workspaceRegistry.resolveByPath(request.path);\n","typescript",[493,941,942],{"__ignoreMap":424},[943,944,947,951,955,959,963,966,969,971,973,977,980,982,985],"span",{"class":945,"line":946},"line",1,[943,948,950],{"class":949},"spNyl","const",[943,952,954],{"class":953},"sTEyZ"," existing ",[943,956,958],{"class":957},"sMK4o","=",[943,960,962],{"class":961},"s7zQu"," await",[943,964,965],{"class":953}," ctx",[943,967,968],{"class":957},".",[943,970,932],{"class":953},[943,972,968],{"class":957},[943,974,976],{"class":975},"s2Zo4","resolveByPath",[943,978,979],{"class":953},"(request",[943,981,968],{"class":957},[943,983,984],{"class":953},"path)",[943,986,987],{"class":957},";\n",[429,989,990,991,994],{},"Buzz 桥接器通过引入全新的聊天斜杠指令 ",[493,992,993],{},"\u002Fworkspace \u003C目录路径>","，允许在群聊中直接向 DSH 注册并绑定本地现存的文件夹。在此之后，该会话下的所有交互都将牢牢锚定在此目录中，并能实时无缝同步在 DSH Web UI 端查看。",[432,996],{"src":997,"alt":998},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace.webp","通过网关聊天指令动态注册并绑定 DeepSeek Harness 本地工作区的架构示意图",[429,1000,1001],{},"开发与使用过程中需重点明确的三大设计机制：",[483,1003,1004,1014,1024],{},[486,1005,1006,1009,1010,1013],{},[440,1007,1008],{},"变更目录等同于开启全新会话","：会话的工作目录（",[493,1011,1012],{},"cwd","）在初始化生成 Session Header 时即完成写入，后续在生命周期内不可直接原地篡改。",[486,1015,1016,1019,1020,1023],{},[440,1017,1018],{},"目标本地目录必须预先存在","：底层 ",[493,1021,1022],{},"create"," 注册函数会对路径进行强校验，若路径在宿主机不存在将直接抛出异常拒绝绑定。",[486,1025,1026,1029,1030,1033],{},[440,1027,1028],{},"高度安全敏感指令","：通过网关衍生的会话均赋予 ",[440,1031,1032],{},"auto-approve","（自动批准命令执行）特权，拥有对目标文件夹直接进行读写和工具操作的完全访问权。",[473,1035,1036],{"id":1036},"安装与配置全流程指南",[531,1038,1039],{},[486,1040,1041],{},"在终端运行以下指令完成插件拉取与启动：",[935,1043,1047],{"className":1044,"code":1045,"language":1046,"meta":424,"style":424},"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",[493,1048,1049,1071,1078,1085],{"__ignoreMap":424},[943,1050,1051,1055,1059,1062,1065,1068],{"class":945,"line":946},[943,1052,1054],{"class":1053},"sBMFI","dsh",[943,1056,1058],{"class":1057},"sfazB"," plugin",[943,1060,1061],{"class":1057}," --profile",[943,1063,1064],{"class":1057}," web",[943,1066,1067],{"class":1057}," add",[943,1069,1070],{"class":1057}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n",[943,1072,1074],{"class":945,"line":1073},2,[943,1075,1077],{"emptyLinePlaceholder":1076},true,"\n",[943,1079,1081],{"class":945,"line":1080},3,[943,1082,1084],{"class":1083},"sHwdD","# Start DSH web\n",[943,1086,1088,1090],{"class":945,"line":1087},4,[943,1089,1054],{"class":1053},[943,1091,1092],{"class":1057}," web\n",[531,1094,1095],{"start":1073},[486,1096,1097,1098,1100],{},"待 DSH Web 界面启动并用浏览器打开后，点击界面侧边栏中的“",[440,1099,525],{},"”图标：",[429,1102,1103],{},[432,1104],{"alt":1105,"src":1106},"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",[531,1108,1109],{"start":1080},[486,1110,1111,1112,1115],{},"在左侧平台列表中选择“",[440,1113,1114],{},"Buzz","”：",[429,1117,1118],{},[432,1119],{"alt":1120,"src":1121},"DeepSeek Harness 消息网关内的 Buzz 协议参数与密钥对配置面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-message-gateway-buzz-config-panel.webp",[531,1123,1124,1135,1146],{"start":1087},[486,1125,1126,1127,1130,1131,1134],{},"点击“",[440,1128,1129],{},"Generate keypair","”按钮即时生成全新的 Nostr 身份密钥对。请务必将生成的 ",[493,1132,1133],{},"npub"," 公钥妥善复制暂存，后续步骤将作为关键身份凭证。",[486,1136,1137,1138,1141,1142,1145],{},"准确填入您的 ",[440,1139,1140],{},"Relay URL","（中继地址）以及需要监听订阅的 ",[440,1143,1144],{},"Channels","（允许访问的频道 UUID 白名单列表）。",[486,1147,1148,1149,1152],{},"点击底部的“",[440,1150,1151],{},"Save","”按钮完成保存。",[429,1154,1155,1156,1159,1160,1163,1164,1166],{},"表单提交后，系统将持久化保存配置并",[440,1157,1158],{},"立即启动 Buzz 网关服务","。私钥 ",[493,1161,1162],{},"nsec"," 作为最高机密凭证被自动保护，仅独立存放在宿主机本地的 ",[493,1165,499],{}," 文件中。",[891,1168,1170],{"id":1169},"将-dsh-智能体注册至-buzz-nostr-中继服务","将 DSH 智能体注册至 Buzz Nostr 中继服务",[429,1172,1173,1176,1177,1179],{},[440,1174,1175],{},"将 DSH 助手作为新成员注册加入中继","。此处公钥填入上文所生成的 ",[493,1178,1133],{}," 字符串：",[935,1181,1183],{"className":1044,"code":1182,"language":1046,"meta":424,"style":424},"docker compose exec relay buzz-admin add-member --pubkey npub123123123\n",[493,1184,1185],{"__ignoreMap":424},[943,1186,1187,1190,1193,1196,1199,1202,1205,1208],{"class":945,"line":946},[943,1188,1189],{"class":1053},"docker",[943,1191,1192],{"class":1057}," compose",[943,1194,1195],{"class":1057}," exec",[943,1197,1198],{"class":1057}," relay",[943,1200,1201],{"class":1057}," buzz-admin",[943,1203,1204],{"class":1057}," add-member",[943,1206,1207],{"class":1057}," --pubkey",[943,1209,1210],{"class":1057}," npub123123123\n",[429,1212,1213,1216,1217,1220,1221,1224,1225,1228,1229,1232],{},[440,1214,1215],{},"将 DSH 助手加入特定的沟通频道","。仅加入中继并不会让助手自动出现在频道成员列表中。需要通过 ",[493,1218,1219],{},"buzz-cli"," 进一步执行入群操作。注意此处 ",[493,1222,1223],{},"--pubkey"," 参数必须使用 ",[440,1226,1227],{},"HEX 16 进制公钥","格式，而非 npub 格式（在上一步执行 ",[493,1230,1231],{},"buzz-admin add-member"," 时，终端输出中会打印对应的 HEX 公钥）：",[935,1234,1236],{"className":1044,"code":1235,"language":1046,"meta":424,"style":424},"buzz channels add-member --channel \u003CCHANNEL_UUID> --pubkey \u003CAGENT_HEX> --role member\n",[493,1237,1238],{"__ignoreMap":424},[943,1239,1240,1243,1246,1248,1251,1254,1257,1260,1263,1265,1267,1270,1273,1275,1278],{"class":945,"line":946},[943,1241,1242],{"class":1053},"buzz",[943,1244,1245],{"class":1057}," channels",[943,1247,1204],{"class":1057},[943,1249,1250],{"class":1057}," --channel",[943,1252,1253],{"class":957}," \u003C",[943,1255,1256],{"class":1057},"CHANNEL_UUI",[943,1258,1259],{"class":953},"D",[943,1261,1262],{"class":957},">",[943,1264,1207],{"class":1057},[943,1266,1253],{"class":957},[943,1268,1269],{"class":1057},"AGENT_HE",[943,1271,1272],{"class":953},"X",[943,1274,1262],{"class":957},[943,1276,1277],{"class":1057}," --role",[943,1279,1280],{"class":1057}," member\n",[462,1282],{"description":1283,"image":465,"image-alt":466,"label":1284,"min-read":1285,"title":1286,"to":1287},"手把手教您安装和配置 buzz-cli，以便在 Nostr 中继上管理频道、成员密钥以及 AI 智能体的角色权限。","CLI 指南","5","如何安装并使用 buzz-cli","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#install-buzz-cli",[429,1289,1290,1291,1293],{},"随后可通过 ",[493,1292,1219],{}," 灵活更新 DSH 助手在 Nostr 中继中的公开资料，设置更具辨识度的昵称：",[429,1295,1296],{},[432,1297],{"alt":1298,"src":1299},"使用 buzz-cli 命令行工具更新 DSH 助手在 Nostr 中继上的公开个人资料","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-assistant-buzz-cli-profile-update.webp",[429,1301,1302,1303,1306],{},"在客户端向 DSH 助手发送一次 ",[440,1304,1305],{},"Wave","（Buzz 平台独特的 DM 私信打招呼动作）。助手随后返回回复，代表网关通讯已完全就绪：",[429,1308,1309],{},[432,1310],{"alt":1311,"src":1312},"在 Buzz 客户端向 DeepSeek Harness 助手发送 Wave 私信进行连通性验证","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-dm-wave-greeting-reply.webp",[429,1314,1315],{},[910,1316,1317],{},"向 DSH 助手发送 Wave 私信打招呼 — 桥接网关正常秒级响应。",[891,1319,1321,1322,1325],{"id":1320},"通过-workspace-指令开启本地工作区联动","通过 ",[493,1323,1324],{},"\u002Fworkspace"," 指令开启本地工作区联动",[429,1327,1328,1329,1332,1333,1336,1337,1339],{},"由于 ",[493,1330,1331],{},"allowWorkspace"," 配置项出于环境安全考虑默认处于禁用（",[493,1334,1335],{},"false","）状态，未经配置直接向助手发送 ",[493,1338,1324],{}," 命令会被系统拦截拒绝：",[429,1341,1342],{},[432,1343],{"alt":1344,"src":1345},"在未开启 allowWorkspace 权限时发送 \u002Fworkspace 命令被系统安全拦截的提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-rejected-error.webp",[429,1347,1348,1349,1352,1353,1355],{},"打开配置文件 ",[493,1350,1351],{},"~\u002F.dsh\u002Fprofiles\u002Fweb\u002Fcordis.patch.yml"," 添加开关配置，随后重启 ",[493,1354,589],{}," 服务即可：",[935,1357,1361],{"className":1358,"code":1359,"language":1360,"meta":424,"style":424},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- id: ui-message-gateway\n  config:\n    allowWorkspace: true\n","yml",[493,1362,1363,1378,1386],{"__ignoreMap":424},[943,1364,1365,1368,1372,1375],{"class":945,"line":946},[943,1366,1367],{"class":957},"-",[943,1369,1371],{"class":1370},"swJcz"," id",[943,1373,1374],{"class":957},":",[943,1376,1377],{"class":1057}," ui-message-gateway\n",[943,1379,1380,1383],{"class":945,"line":1073},[943,1381,1382],{"class":1370},"  config",[943,1384,1385],{"class":957},":\n",[943,1387,1388,1391,1393],{"class":945,"line":1080},[943,1389,1390],{"class":1370},"    allowWorkspace",[943,1392,1374],{"class":957},[943,1394,1396],{"class":1395},"sfNiH"," true\n",[429,1398,1399],{},"配置生效并重启后即可顺利绑定：",[429,1401,1402],{},[432,1403],{"alt":1404,"src":1405},"在 Buzz 频道成功执行 \u002Fworkspace 命令完成本地工作区绑定的确认消息","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-success-confirmation.webp",[429,1407,1408,1409,1412],{},"实用贴士：此命令默认假设工作区目录名（例如截图中的 ",[493,1410,1411],{},"TechVoyage","）直接位于当前用户的个人主目录之下；若目录处于其他深层路径，请务必传入完整绝对路径。通过 Buzz 频道中注册绑定好的新会话，也都会完全同步在 DeepSeek Harness Web 界面上显示。",[429,1414,1415],{},[432,1416],{"alt":1417,"src":1418},"DeepSeek Harness Web UI 中展示从 Buzz 频道自动同步关联的活跃工作区会话","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-synced-workspace-session.webp",[891,1420,1422],{"id":1421},"buzz-频道支持的完整可用指令","Buzz 频道支持的完整可用指令",[429,1424,1425],{},"其他平台支持的几乎全部原生功能在 Buzz 中均可顺畅运行：",[603,1427,1428,1438],{},[606,1429,1430],{},[609,1431,1432,1435],{},[612,1433,1434],{},"指令语法",[612,1436,1437],{},"功能说明",[621,1439,1440,1450,1460,1470,1480,1490,1500,1510,1520,1544,1564],{},[609,1441,1442,1447],{},[626,1443,1444],{},[493,1445,1446],{},"\u002Fworkspace \u003Cfolder>",[626,1448,1449],{},"将本地已存在的文件夹注册绑定为当前对话专属的工作区环境（受配置项开关保护）",[609,1451,1452,1457],{},[626,1453,1454],{},[493,1455,1456],{},"\u002Fhelp",[626,1458,1459],{},"打印并列出所有支持的命令清单",[609,1461,1462,1467],{},[626,1463,1464],{},[493,1465,1466],{},"\u002Ftime",[626,1468,1469],{},"获取并输出当前服务器系统时间",[609,1471,1472,1477],{},[626,1473,1474],{},[493,1475,1476],{},"\u002Fnew",[626,1478,1479],{},"丢弃旧上下文，原地重置开启全新会话",[609,1481,1482,1487],{},[626,1483,1484],{},[493,1485,1486],{},"\u002Fclear",[626,1488,1489],{},"清空当前上下文所有历史对话流",[609,1491,1492,1497],{},[626,1493,1494],{},[493,1495,1496],{},"\u002Fstatus",[626,1498,1499],{},"查看当前 Buzz 消息桥接器的实时在线状态",[609,1501,1502,1507],{},[626,1503,1504],{},[493,1505,1506],{},"\u002Fstats",[626,1508,1509],{},"查看当前系统活跃会话总量及所有接入平台（包含 Buzz）的桥接连接详细状态",[609,1511,1512,1517],{},[626,1513,1514],{},[493,1515,1516],{},"\u002Fcommands",[626,1518,1519],{},"输出全量指令的底层规范与参数描述文档",[609,1521,1522,1527],{},[626,1523,1524],{},[493,1525,1526],{},"@path\u002Fto\u002Ffile",[626,1528,1529,1530,1532,1533,1535,1536,1539,1540,1543],{},"与 Web 端的 ",[493,1531,839],{}," 文件提及功能完全一致：Agent 自动相对于工作区读取文件内容；单独发送 ",[493,1534,839],{},"、",[493,1537,1538],{},"@前缀"," 或使用 ",[493,1541,1542],{},"\u002Ffiles \u003C前缀>"," 可返回文件\u002F文件夹列表",[609,1545,1546,1551],{},[626,1547,1548],{},[493,1549,1550],{},"\u002Fmodel",[626,1552,1553,1556,1557,1559,1560,1563],{},[493,1554,1555],{},"[provider model effort]"," — 校验有效后实时切换该会话的底层推理大模型与思考深度；单独输入 ",[493,1558,1550],{}," 显示支持的候选列表，",[493,1561,1562],{},"\u002Fmodel reset"," 恢复系统默认设置",[609,1565,1566,1571],{},[626,1567,1568],{},[493,1569,1570],{},"\u002Feffort",[626,1572,1573,1576,1577,1580],{},[493,1574,1575],{},"\u003Cid>"," 仅针对支持思考深度的模型调整 reasoning effort；",[493,1578,1579],{},"\u002Feffort reset"," 恢复默认推理深度配置",[891,1582,1583],{"id":1583},"核心安全架构总结",[483,1585,1586,1598,1612],{},[486,1587,1588,1591,1592,1594,1595,1597],{},[440,1589,1590],{},"私钥资产隔离保护","：Agent 专属的私钥 ",[440,1593,1162],{}," 仅保存在宿主机的 ",[493,1596,499],{}," 中（0600 文件只读权限，原子写入机制） — 永远不会通过 API 端点对外暴露，也不会打印至日常调试日志中。",[486,1599,1600,1603,1604,1607,1608,1611],{},[440,1601,1602],{},"全链路加密签名验签","：每一个入站的 Nostr 事件在投递给 Agent 执行之前，都会严密执行",[440,1605,1606],{},"密码学数字签名检验","（",[493,1609,1610],{},"verifyEvent","）、消息防重放判重、自发自收环路过滤以及 @提及权限校验。",[486,1613,1614,1617,1618,1620,1621,1624],{},[440,1615,1616],{},"本地工作区指令受限保护","：由于网关会话默认开启特权自动批准机制，",[493,1619,1324],{}," 目录注册能力默认处于禁用状态，必须由开发者在配置文件中明确开启（",[493,1622,1623],{},"allowWorkspace: true","），严防非预期提权暴露敏感目录。",[473,1626,1628],{"id":1627},"结语拥抱-buzz-去中心化人机协作时代","结语：拥抱 Buzz 去中心化人机协作时代",[429,1630,1631,1632,1634],{},"在将 Buzz 接入 ",[493,1633,448],{}," 的探索过程中，最大的技术挑战在于严密契合 Nostr 协议的去中心化事件生命周期与事件约束规范。所幸插件本身优秀的架构底座已经将多 Agent 会话管理与命令分发高度抽象，一旦建立起可靠的事件监听与原位流式编辑链路，整个桥接网关便能呈现出超预期的流畅度与生产级稳定性。",[473,1636,1638],{"id":1637},"参考文献与资料","参考文献与资料：",[483,1640,1641,1649,1657],{},[486,1642,1643,1648],{},[443,1644,1647],{"href":1645,"rel":1646},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway\u002Fblob\u002Fmain\u002Fdocs\u002Farchitecture.md",[447],"dsh-message-gateway architecture guide"," — 官方网关架构指南、扩展实践与安全规范",[486,1650,1651,1656],{},[443,1652,1655],{"href":1653,"rel":1654},"https:\u002F\u002Fgithub.com\u002Fnbd-wtf\u002Fnostr-tools",[447],"nostr-tools"," — 底层调用的核心 Nostr JavaScript 客户端库",[486,1658,1659,1664],{},[443,1660,1663],{"href":1661,"rel":1662},"https:\u002F\u002Fgithub.com\u002Fbytedance\u002Fdeer-flow\u002Fblob\u002Fmain\u002Fbackend\u002Fdocs\u002FIM_CHANNEL_CONNECTIONS.md",[447],"deer-flow IM channel connections"," — 即时通讯平台多通道连接架构设计参考",[1666,1667,1668],"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":424,"searchDepth":1073,"depth":1080,"links":1670},[1671,1672,1676,1683,1684],{"id":475,"depth":1073,"text":476},{"id":593,"depth":1073,"text":594,"children":1673},[1674,1675],{"id":893,"depth":1080,"text":894},{"id":921,"depth":1080,"text":922},{"id":1036,"depth":1073,"text":1036,"children":1677},[1678,1679,1681,1682],{"id":1169,"depth":1080,"text":1170},{"id":1320,"depth":1080,"text":1680},"通过 \u002Fworkspace 指令开启本地工作区联动",{"id":1421,"depth":1080,"text":1422},{"id":1583,"depth":1080,"text":1583},{"id":1627,"depth":1073,"text":1628},{"id":1637,"depth":1073,"text":1638},[1686,1687,1242,1688],"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":1695,"robots":1720,"sitemap":1721},[1696,1698],{"@type":1697,"headline":423,"description":1690,"image":1692},"TechArticle",{"@type":1699,"name":423,"description":1690,"image":1692,"step":1700},"HowTo",[1701,1705,1708,1711,1714,1717],{"@type":1702,"name":1703,"text":1704},"HowToStep","阶段一：安装与启动消息网关插件","执行 dsh plugin add 命令安装 dsh-message-gateway 并启动 dsh web 服务。",{"@type":1702,"name":1706,"text":1707},"阶段二：访问 Message platforms 配置中心","通过浏览器打开 DSH Web 界面并导航至 Message platforms 菜单。",{"@type":1702,"name":1709,"text":1710},"阶段三：配置 Buzz 桥接参数与生成密钥对","即时生成 Nostr 身份密钥对，准确填入 Relay URL 与订阅频道 UUID 列表。",{"@type":1702,"name":1712,"text":1713},"阶段四：将智能体注册加入 Buzz 中继服务","使用 buzz-admin 命令行工具将 DSH 助手的 npub 公钥加入中继成员。",{"@type":1702,"name":1715,"text":1716},"阶段五：将智能体加入指定的团队频道","使用 buzz-cli 命令行工具将 16 进制 HEX 公钥加入频道成员名单。",{"@type":1702,"name":1718,"text":1719},"阶段六：开启本地工作区绑定权限","在 cordis.patch.yml 中开启 allowWorkspace 配置以允许目录挂载指令。","index, follow",{"lastmod":1689},13,{"title":1724,"description":1690,"ogTitle":423,"ogDescription":1690,"twitterTitle":423,"twitterDescription":1690},"DeepSeek Harness Buzz 插件开发：构建 Nostr 协议网关与实时流式输出的完整教程","zh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",[600,1114,1727,1728,448],"Nostr","AI智能体",null,"-Uv9S6aUiVlNLLDrGF-a3NbzGbjT5AnW8AjMaIbu1Ao",{"surround":1732,"related":2644},[1733,1729],{"id":1734,"title":1735,"author":424,"body":1736,"category":2625,"date":2627,"description":2628,"extension":1691,"image":2629,"imageAlt":2630,"isPublished":1076,"meta":2631,"minRead":1949,"navigation":1076,"path":323,"seo":2636,"stem":2638,"tags":2639,"updatedAt":2635,"__hash__":2643},"article\u002Fzh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md","教程：使用 Cloudflare WARP 安全地将 Hermes Agent 暴露至私有网络",{"type":426,"value":1737,"toc":2607},[1738,1752,1762,1765,1768,1780,1783,1791,1794,1798,1848,1852,1989,1993,2026,2030,2033,2099,2102,2138,2141,2168,2172,2182,2186,2225,2314,2318,2323,2340,2349,2428,2433,2479,2483,2529,2544,2548,2591,2594,2604],[429,1739,1740,1741,1744,1745,574,1748,1751],{},"当我们希望通过笔记本电脑、平板或手机等其他设备访问 ",[440,1742,1743],{},"Hermes Agent","，同时又不想将其暴露在公共互联网上时，这往往是一个普遍的挑战。利用 ",[440,1746,1747],{},"Cloudflare WARP",[440,1749,1750],{},"Cloudflare Zero Trust","，您可以在无需打开任何防火墙入站端口的情况下，将其安全地暴露并在全球范围内进行访问。",[429,1753,1754,1755,1758,1759,1761],{},"如果您之前已经阅读并遵循了我们的指南 '",[443,1756,1757],{"href":375},"如何在 Linux VPS 上部署 Hermes Agent","'，那么您应该已经拥有了一个全天候运行的 Hermes Agent。相比于配置传统 VPN 带来的繁琐步骤，我们将使用 ",[440,1760,1747],{}," 客户端，通过互联网将 Hermes Agent 暴露到私有网络中。",[473,1763,1764],{"id":1764},"架构解析",[429,1766,1767],{},"此方案涉及的两个核心组件：",[531,1769,1770,1775],{},[486,1771,1772,1774],{},[440,1773,1750],{},"：Cloudflare 的云端仪表板，您可以在此定义路由规则和访问策略。",[486,1776,1777,1779],{},[440,1778,1747],{},"：安装在您的设备（VPS、笔记本电脑、手机）上的客户端应用程序。它能够拦截发往私有网络的流量，并安全地进行路由。",[891,1781,1782],{"id":1782},"前置条件",[483,1784,1785,1788],{},[486,1786,1787],{},"一台已经运行 Hermes Agent 的 VPS。",[486,1789,1790],{},"一个免费的 Cloudflare 账号。",[473,1792,1793],{"id":1793},"详细步骤指南",[891,1795,1797],{"id":1796},"第-1-步配置-cloudflare-zero-trust","第 1 步：配置 Cloudflare Zero Trust",[531,1799,1800,1809,1816,1827,1834,1841],{},[486,1801,1802,1803,1808],{},"登录您的 ",[443,1804,1807],{"href":1805,"rel":1806},"https:\u002F\u002Fdash.cloudflare.com\u002F",[447],"Cloudflare 仪表板 (Dashboard)","。",[486,1810,1811,1812],{},"点击左侧菜单栏中的 'Zero Trust'。\n",[432,1813],{"alt":1814,"src":1815},"Cloudflare 仪表板左侧侧边栏导航菜单中的 Zero Trust 选项","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-left-menu.webp",[486,1817,1818,1819,1822,1823],{},"如果这是您第一次使用，系统会提示您选择套餐（免费版对本教程完全足够）并为您的团队命名（例如，",[493,1820,1821],{},"ai-team","）。\n",[432,1824],{"alt":1825,"src":1826},"首次设置 Cloudflare Zero Trust 帐户并为团队命名","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-team-setup.webp",[486,1828,1829,1830],{},"点击 'Access'，然后点击 'Policies' 来创建访问策略，以定义谁有权限访问网络。\n",[432,1831],{"alt":1832,"src":1833},"Cloudflare Zero Trust Access 策略页面，显示新配置的访问规则","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-access-policies-page.webp",[486,1835,1836,1837],{},"点击 'Create new policy'。\n",[432,1838],{"alt":1839,"src":1840},"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",[486,1842,1843,1844],{},"选择 'Emails' 并在 'Policy rules' 下方输入您的电子邮件地址。\n",[432,1845],{"alt":1846,"src":1847},"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",[891,1849,1851],{"id":1850},"第-2-步在-vps-上配置-cloudflare-warp-客户端","第 2 步：在 VPS 上配置 Cloudflare WARP 客户端",[531,1853,1854,1864,1870,1877,1880,1895,1898,1982],{},[486,1855,1856,1857,1860,1861,1808],{},"在 VPS 终端中运行 ",[493,1858,1859],{},"sudo apt update"," 和 ",[493,1862,1863],{},"sudo apt install cloudflare-warp",[486,1865,1856,1866,1869],{},[493,1867,1868],{},"warp-cli registration new \u003CTEAM-NAME>","，该命令将输出一个 URL。",[486,1871,1872,1873,1876],{},"复制输出的 URL（其格式类似于 ",[493,1874,1875],{},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp","），并将其粘贴到浏览器中进行认证。",[486,1878,1879],{},"由于前面的策略设置中使用了电子邮件认证，请输入您的电子邮件以进行认证。",[486,1881,1882,1883,1886,1887,1890,1891,1894],{},"当浏览器中显示 '",[440,1884,1885],{},"Success","' 页面后，右键点击蓝色的 '",[440,1888,1889],{},"Open Cloudflare WARP","' 按钮并选择“",[440,1892,1893],{},"检查 (Inspect)","”。",[486,1896,1897],{},"复制该按钮链接中的长 Token 字符串。",[486,1899,1856,1900,1903,1904,1907,1908],{},[493,1901,1902],{},"warp-cli --accept-tos registration token \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\"","，将您的 VPS 连接到 Cloudflare Zero Trust。",[1905,1906],"br",{},"如果在 Ubuntu 26 上遇到 'Error: Failed to communicate with the WARP API'，请运行以下命令：",[935,1909,1911],{"className":1044,"code":1910,"language":1046,"meta":424,"style":424},"sudo systemctl restart warp-svc.service\n\n# Check status\nsudo systemctl status warp-svc.service\n\n# Run the warp-cli registration token again\nwarp-cli --accept-tos registration token   \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\"\n",[493,1912,1913,1927,1931,1936,1947,1952,1958],{"__ignoreMap":424},[943,1914,1915,1918,1921,1924],{"class":945,"line":946},[943,1916,1917],{"class":1053},"sudo",[943,1919,1920],{"class":1057}," systemctl",[943,1922,1923],{"class":1057}," restart",[943,1925,1926],{"class":1057}," warp-svc.service\n",[943,1928,1929],{"class":945,"line":1073},[943,1930,1077],{"emptyLinePlaceholder":1076},[943,1932,1933],{"class":945,"line":1080},[943,1934,1935],{"class":1083},"# Check status\n",[943,1937,1938,1940,1942,1945],{"class":945,"line":1087},[943,1939,1917],{"class":1053},[943,1941,1920],{"class":1057},[943,1943,1944],{"class":1057}," status",[943,1946,1926],{"class":1057},[943,1948,1950],{"class":945,"line":1949},5,[943,1951,1077],{"emptyLinePlaceholder":1076},[943,1953,1955],{"class":945,"line":1954},6,[943,1956,1957],{"class":1083},"# Run the warp-cli registration token again\n",[943,1959,1961,1964,1967,1970,1973,1976,1979],{"class":945,"line":1960},7,[943,1962,1963],{"class":1053},"warp-cli",[943,1965,1966],{"class":1057}," --accept-tos",[943,1968,1969],{"class":1057}," registration",[943,1971,1972],{"class":1057}," token",[943,1974,1975],{"class":957},"   \"",[943,1977,1978],{"class":1057},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[943,1980,1981],{"class":957},"\"\n",[486,1983,1984,1985],{},"回到 Cloudflare Zero Trust 仪表板，点击 'Devices'。您现在应该能看到您的 VPS 设备。\n",[432,1986],{"alt":1987,"src":1988},"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",[891,1990,1992],{"id":1991},"第-3-步配置流量路由","第 3 步：配置流量路由",[531,1994,1995,2002,2009,2016],{},[486,1996,1997,1998],{},"在 Devices 仪表板中点击您 VPS 设备的配置文件。\n",[432,1999],{"alt":2000,"src":2001},"访问已注册 VPS 设备的详细信息与拆分隧道设置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-device-profile.webp",[486,2003,2004,2005],{},"向下滚动至 'Split Tunnels' 部分。\n",[432,2006],{"alt":2007,"src":2008},"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",[486,2010,2011,2012],{},"点击 'Manage' 按钮，并按照下图配置设置。如有需要请替换相应的 IP 地址。\n",[432,2013],{"alt":2014,"src":2015},"在 Cloudflare 设置中管理拆分隧道 IP 与主机名排除规则","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-manage-split-tunnels.webp",[486,2017,2018,2019,1860,2022,2025],{},"暴露 ",[493,2020,2021],{},"address",[493,2023,2024],{},"host"," 会将发往您服务的流量路由到该私有网络内。",[891,2027,2029],{"id":2028},"第-4-步配置-vps-防火墙","第 4 步：配置 VPS 防火墙",[429,2031,2032],{},"启用防火墙，仅允许 '100.96.0.0\u002F12' 子网的流量通过，并阻止其他所有公共入站访问。",[935,2034,2036],{"className":1044,"code":2035,"language":1046,"meta":424,"style":424},"sudo ufw enable \nsudo ufw default allow outgoing \nsudo ufw default deny incoming\nsudo ufw allow in from 100.96.0.0\u002F12\n",[493,2037,2038,2051,2068,2082],{"__ignoreMap":424},[943,2039,2040,2042,2045,2048],{"class":945,"line":946},[943,2041,1917],{"class":1053},[943,2043,2044],{"class":1057}," ufw",[943,2046,2047],{"class":1057}," enable",[943,2049,2050],{"class":953}," \n",[943,2052,2053,2055,2057,2060,2063,2066],{"class":945,"line":1073},[943,2054,1917],{"class":1053},[943,2056,2044],{"class":1057},[943,2058,2059],{"class":1057}," default",[943,2061,2062],{"class":1057}," allow",[943,2064,2065],{"class":1057}," outgoing",[943,2067,2050],{"class":953},[943,2069,2070,2072,2074,2076,2079],{"class":945,"line":1080},[943,2071,1917],{"class":1053},[943,2073,2044],{"class":1057},[943,2075,2059],{"class":1057},[943,2077,2078],{"class":1057}," deny",[943,2080,2081],{"class":1057}," incoming\n",[943,2083,2084,2086,2088,2090,2093,2096],{"class":945,"line":1087},[943,2085,1917],{"class":1053},[943,2087,2044],{"class":1057},[943,2089,2062],{"class":1057},[943,2091,2092],{"class":1057}," in",[943,2094,2095],{"class":1057}," from",[943,2097,2098],{"class":1057}," 100.96.0.0\u002F12\n",[429,2100,2101],{},"允许回环网络 (loopback) 的流量，避免导致本地服务异常：",[935,2103,2105],{"className":1044,"code":2104,"language":1046,"meta":424,"style":424},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[493,2106,2107,2123],{"__ignoreMap":424},[943,2108,2109,2111,2113,2115,2117,2120],{"class":945,"line":946},[943,2110,1917],{"class":1053},[943,2112,2044],{"class":1057},[943,2114,2062],{"class":1057},[943,2116,2092],{"class":1057},[943,2118,2119],{"class":1057}," on",[943,2121,2122],{"class":1057}," lo\n",[943,2124,2125,2127,2129,2131,2134,2136],{"class":945,"line":1073},[943,2126,1917],{"class":1053},[943,2128,2044],{"class":1057},[943,2130,2062],{"class":1057},[943,2132,2133],{"class":1057}," out",[943,2135,2119],{"class":1057},[943,2137,2122],{"class":1057},[429,2139,2140],{},"重载防火墙规则并验证状态：",[935,2142,2144],{"className":1044,"code":2143,"language":1046,"meta":424,"style":424},"sudo ufw reload \nsudo ufw status verbose\n",[493,2145,2146,2157],{"__ignoreMap":424},[943,2147,2148,2150,2152,2155],{"class":945,"line":946},[943,2149,1917],{"class":1053},[943,2151,2044],{"class":1057},[943,2153,2154],{"class":1057}," reload",[943,2156,2050],{"class":953},[943,2158,2159,2161,2163,2165],{"class":945,"line":1073},[943,2160,1917],{"class":1053},[943,2162,2044],{"class":1057},[943,2164,1944],{"class":1057},[943,2166,2167],{"class":1057}," verbose\n",[891,2169,2171],{"id":2170},"第-5-步将-hermes-agent-暴露至私有网络","第 5 步：将 Hermes Agent 暴露至私有网络",[429,2173,2174,2175,2178,2179,1808],{},"我们将把 ",[440,2176,2177],{},"Hermes Agent Web Dashboard"," 暴露至私有网络，并使用默认的认证提供商 ",[440,2180,2181],{},"Nous Research",[2183,2184,2185],"h4",{"id":2185},"配置认证提供商",[531,2187,2188,2197,2204,2211,2218],{},[486,2189,2190,2191,2196],{},"前往 ",[443,2192,2195],{"href":2193,"rel":2194},"https:\u002F\u002Fportal.nousresearch.com",[447],"portal.nousresearch.com"," 注册一个账号。",[486,2198,2199,2200],{},"选择 'Local Dashboards'。\n",[432,2201],{"alt":2202,"src":2203},"在 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",[486,2205,2206,2207],{},"点击 'Register Dashboard'。\n",[432,2208],{"alt":2209,"src":2210},"点击 Register Dashboard 按钮以创建新的仪表板项目","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-dashboard.webp",[486,2212,2213,2214],{},"将 VPS 在私有网络中的 IP 地址填入 'Dashboard redirect URI' 并点击 'Save'。\n",[432,2215],{"alt":2216,"src":2217},"在 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",[486,2219,2220,2221,2224],{},"复制 'OAuth client ID' 并将其粘贴到您的 ",[493,2222,2223],{},"config.yaml"," 文件中：",[935,2226,2230],{"className":2227,"code":2228,"language":2229,"meta":424,"style":424},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dashboard:\n  theme: default\n  show_token_analytics: false\n  oauth:\n    client_id: agent:cmq02x7ha0002jk0ba3kfnb\n    portal_url: https:\u002F\u002Fportal.nousresearch.com\n  basic_auth:\n    username: ''\n    password_hash: ''\n","yaml",[493,2231,2232,2239,2249,2259,2266,2276,2286,2293,2304],{"__ignoreMap":424},[943,2233,2234,2237],{"class":945,"line":946},[943,2235,2236],{"class":1370},"dashboard",[943,2238,1385],{"class":957},[943,2240,2241,2244,2246],{"class":945,"line":1073},[943,2242,2243],{"class":1370},"  theme",[943,2245,1374],{"class":957},[943,2247,2248],{"class":1057}," default\n",[943,2250,2251,2254,2256],{"class":945,"line":1080},[943,2252,2253],{"class":1370},"  show_token_analytics",[943,2255,1374],{"class":957},[943,2257,2258],{"class":1395}," false\n",[943,2260,2261,2264],{"class":945,"line":1087},[943,2262,2263],{"class":1370},"  oauth",[943,2265,1385],{"class":957},[943,2267,2268,2271,2273],{"class":945,"line":1949},[943,2269,2270],{"class":1370},"    client_id",[943,2272,1374],{"class":957},[943,2274,2275],{"class":1057}," agent:cmq02x7ha0002jk0ba3kfnb\n",[943,2277,2278,2281,2283],{"class":945,"line":1954},[943,2279,2280],{"class":1370},"    portal_url",[943,2282,1374],{"class":957},[943,2284,2285],{"class":1057}," https:\u002F\u002Fportal.nousresearch.com\n",[943,2287,2288,2291],{"class":945,"line":1960},[943,2289,2290],{"class":1370},"  basic_auth",[943,2292,1385],{"class":957},[943,2294,2296,2299,2301],{"class":945,"line":2295},8,[943,2297,2298],{"class":1370},"    username",[943,2300,1374],{"class":957},[943,2302,2303],{"class":957}," ''\n",[943,2305,2307,2310,2312],{"class":945,"line":2306},9,[943,2308,2309],{"class":1370},"    password_hash",[943,2311,1374],{"class":957},[943,2313,2303],{"class":957},[2183,2315,2317],{"id":2316},"使用-systemd-确保-hermes-dashboard-开机自启","使用 Systemd 确保 Hermes Dashboard 开机自启",[531,2319,2320],{},[486,2321,2322],{},"创建服务文件：",[935,2324,2328],{"className":2325,"code":2326,"language":2327,"meta":424,"style":424},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n","shell",[493,2329,2330],{"__ignoreMap":424},[943,2331,2332,2334,2337],{"class":945,"line":946},[943,2333,1917],{"class":1053},[943,2335,2336],{"class":1057}," nano",[943,2338,2339],{"class":1057}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[531,2341,2342],{"start":1073},[486,2343,2344,2345,2348],{},"粘贴以下配置，确保 ",[493,2346,2347],{},"--host 0.0.0.0"," 包含在命令中：",[935,2350,2354],{"className":2351,"code":2352,"language":2353,"meta":424,"style":424},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=Hermes Dashboard\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\nRestart=always\nRestartSec=10\nEnvironment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n\n[Install]\nWantedBy=multi-user.target\n","ini",[493,2355,2356,2361,2366,2371,2375,2380,2385,2390,2395,2400,2406,2412,2417,2422],{"__ignoreMap":424},[943,2357,2358],{"class":945,"line":946},[943,2359,2360],{},"[Unit]\n",[943,2362,2363],{"class":945,"line":1073},[943,2364,2365],{},"Description=Hermes Dashboard\n",[943,2367,2368],{"class":945,"line":1080},[943,2369,2370],{},"After=network.target\n",[943,2372,2373],{"class":945,"line":1087},[943,2374,1077],{"emptyLinePlaceholder":1076},[943,2376,2377],{"class":945,"line":1949},[943,2378,2379],{},"[Service]\n",[943,2381,2382],{"class":945,"line":1954},[943,2383,2384],{},"User=hermes\n",[943,2386,2387],{"class":945,"line":1960},[943,2388,2389],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[943,2391,2392],{"class":945,"line":2295},[943,2393,2394],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[943,2396,2397],{"class":945,"line":2306},[943,2398,2399],{},"Restart=always\n",[943,2401,2403],{"class":945,"line":2402},10,[943,2404,2405],{},"RestartSec=10\n",[943,2407,2409],{"class":945,"line":2408},11,[943,2410,2411],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[943,2413,2415],{"class":945,"line":2414},12,[943,2416,1077],{"emptyLinePlaceholder":1076},[943,2418,2419],{"class":945,"line":1722},[943,2420,2421],{},"[Install]\n",[943,2423,2425],{"class":945,"line":2424},14,[943,2426,2427],{},"WantedBy=multi-user.target\n",[531,2429,2430],{"start":1080},[486,2431,2432],{},"启用并启动服务：",[935,2434,2436],{"className":2325,"code":2435,"language":2327,"meta":424,"style":424},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[493,2437,2438,2447,2458,2469],{"__ignoreMap":424},[943,2439,2440,2442,2444],{"class":945,"line":946},[943,2441,1917],{"class":1053},[943,2443,1920],{"class":1057},[943,2445,2446],{"class":1057}," daemon-reload\n",[943,2448,2449,2451,2453,2455],{"class":945,"line":1073},[943,2450,1917],{"class":1053},[943,2452,1920],{"class":1057},[943,2454,2047],{"class":1057},[943,2456,2457],{"class":1057}," hermes-dashboard\n",[943,2459,2460,2462,2464,2467],{"class":945,"line":1080},[943,2461,1917],{"class":1053},[943,2463,1920],{"class":1057},[943,2465,2466],{"class":1057}," start",[943,2468,2457],{"class":1057},[943,2470,2471,2473,2475,2477],{"class":945,"line":1087},[943,2472,1917],{"class":1053},[943,2474,1920],{"class":1057},[943,2476,1944],{"class":1057},[943,2478,2457],{"class":1057},[891,2480,2482],{"id":2481},"第-6-步在桌面上安装-cloudflare-warp-客户端","第 6 步：在桌面上安装 Cloudflare WARP 客户端",[531,2484,2485,2494,2497,2504,2511,2518],{},[486,2486,2487,2488,2493],{},"从 ",[443,2489,2492],{"href":2490,"rel":2491},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[447],"Cloudflare 官网"," 下载 Cloudflare WARP 客户端。",[486,2495,2496],{},"安装完成后打开并运行 Cloudflare WARP 客户端。",[486,2498,2499,2500],{},"按提示登录。\n",[432,2501],{"alt":2502,"src":2503},"台式电脑上的 Cloudflare WARP 客户端登录提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-prompt.webp",[486,2505,2506,2507],{},"登录成功后会显示 'Success' 页面。\n",[432,2508],{"alt":2509,"src":2510},"在台式电脑登录 Cloudflare Zero Trust 后的验证成功网页","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-success.webp",[486,2512,2513,2514],{},"此时 WARP 客户端应显示已连接至您的 Zero Trust 团队。\n",[432,2515],{"alt":2516,"src":2517},"桌面版 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",[486,2519,2520,2521,2524,2525],{},"在浏览器中输入您的私有 IP 地址（例如 ",[493,2522,2523],{},"100.96.0.3","），即可成功加载 Hermes Web Dashboard。\n",[432,2526],{"alt":2527,"src":2528},"在桌面浏览器中访问私有 Hermes Agent 网页仪表板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-desktop-view.webp",[2530,2531,2532],"blockquote",{},[429,2533,2534,2537,2538,2543],{},[440,2535,2536],{},"macOS 用户进阶提示："," 如果您需要使用 WARP 客户端访问多个 Cloudflare 账号，请参阅我们的快速指南 ",[440,2539,2540],{},[443,2541,2542],{"href":399},"使用MDM配置文件在macOS上无缝切换与配置多个Cloudflare WARP零信任组织的完整指南","，实现账号间的无缝切换。",[891,2545,2547],{"id":2546},"第-7-步在-ios-设备上安装-cloudflare-warp-客户端","第 7 步：在 iOS 设备上安装 Cloudflare WARP 客户端",[531,2549,2550,2556,2564,2572,2580],{},[486,2551,2552,2553,1808],{},"在 App Store 中安装 ",[440,2554,2555],{},"Cloudflare One",[486,2557,2558,2559],{},"打开 Cloudflare One 应用并在提示时输入您的团队名称。\n",[432,2560],{"alt":2561,"src":2562,"width":2563},"在 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,[486,2565,2566,2567],{},"使用前面在策略规则中配置的同一个电子邮箱地址进行登录。\n",[432,2568],{"alt":2569,"src":2570,"width":2571},"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,[486,2573,2574,2575],{},"连接成功后，界面应如下所示：\n",[432,2576],{"alt":2577,"src":2578,"width":2579},"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,[486,2581,2582,2583,2585,2586],{},"在手机浏览器中输入私有 IP ",[493,2584,2523],{}," 即可在移动设备上访问 Hermes Web Dashboard。\n",[432,2587],{"alt":2588,"src":2589,"width":2590},"在手机浏览器上访问 Hermes Agent 网页仪表板界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-mobile-view.webp",345,[473,2592,2593],{"id":2593},"结语",[429,2595,2596,2597,2599,2600,2603],{},"借助 ",[440,2598,1750],{}," 管理身份策略以及 ",[440,2601,2602],{},"WARP"," 客户端通过加密隧道路由流量，您的 Hermes Agent 现在可以被您的设备在全球范围内安全访问。该配置为构建并访问完全远程、私有的 AI 基础设施奠定了坚实而安全的根基。",[1666,2605,2606],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":424,"searchDepth":1073,"depth":1080,"links":2608},[2609,2612,2624],{"id":1764,"depth":1073,"text":1764,"children":2610},[2611],{"id":1782,"depth":1080,"text":1782},{"id":1793,"depth":1073,"text":1793,"children":2613},[2614,2615,2616,2617,2618,2622,2623],{"id":1796,"depth":1080,"text":1797},{"id":1850,"depth":1080,"text":1851},{"id":1991,"depth":1080,"text":1992},{"id":2028,"depth":1080,"text":2029},{"id":2170,"depth":1080,"text":2171,"children":2619},[2620,2621],{"id":2185,"depth":1087,"text":2185},{"id":2316,"depth":1087,"text":2317},{"id":2481,"depth":1080,"text":2482},{"id":2546,"depth":1080,"text":2547},{"id":2593,"depth":1073,"text":2593},[1686,2626],"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":2632,"robots":1720,"sitemap":2634},[2633],{"@type":1699,"headline":1735,"description":2628,"name":1735,"image":2629},{"lastmod":2635},"2026-09-28",{"title":2637,"description":2628,"ogTitle":1735,"ogDescription":2628,"twitterTitle":1735,"twitterDescription":2628},"通过 Cloudflare Zero Trust 实现对 Hermes Agent 的安全访问","zh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[1747,2640,1743,2641,2642],"Zero Trust","私有网络","教程","ishCX4pAaZiNmcl6lotlFfav2RLbIjIFUuYwHpzosd4",[2645,4851,4852],{"id":2646,"title":454,"author":424,"body":2647,"category":4819,"date":4820,"description":464,"extension":1691,"image":465,"imageAlt":466,"isPublished":1076,"meta":4821,"minRead":2408,"navigation":1076,"path":383,"seo":4843,"stem":4845,"tags":4846,"updatedAt":1729,"__hash__":4850},"article\u002Fzh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md",{"type":426,"value":2648,"toc":4789},[2649,2652,2658,2663,2667,2670,2708,2712,2718,2756,2760,2764,2778,2784,2790,2794,2798,2812,2818,2867,2896,2900,2909,2915,2919,2922,3141,3145,3191,3198,3205,3213,3265,3271,3300,3304,3308,3327,3355,3368,3410,3418,3699,3703,3749,3754,3761,3766,3770,3794,3797,3803,3809,3813,3820,3826,3829,3835,3842,3866,3873,3879,3882,3888,3892,3895,3898,3901,3907,3910,3916,3922,3928,3933,3937,3948,3955,3961,3964,3970,3973,3980,3986,3992,3996,4004,4068,4077,4132,4135,4205,4211,4225,4231,4235,4280,4286,4289,4295,4298,4304,4308,4325,4341,4347,4444,4447,4453,4464,4510,4516,4522,4535,4551,4554,4560,4564,4571,4593,4603,4701,4711,4717,4724,4730,4733,4739,4742,4748,4750,4753,4756,4786],[429,2650,2651],{},"在与多个 AI 智能体（AI Agent）协同工作时，最让人头疼的障碍莫过于“上下文断片化（Context Fragmentation）”。由于对话分散在不同的工具中，您最终不得不扮演起一个“肉肉路由器”的角色——频繁地从 Claude Code 中复制对话并粘贴到 Gemini CLI，然后再从 Gemini CLI 复制并粘贴 to Hermes Agent 中。而当您身边还有人类团队成员一起协作时，这种繁琐的摩擦感更是成倍增长。",[429,2653,2654],{},[432,2655],{"alt":2656,"src":2657},"Buzz 协作工作空间的用户界面，显示聊天频道和活跃的 AI 智能体","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-workspace-interface.webp",[429,2659,2660,2662],{},[440,2661,1114],{}," 是一款开源的协同工作空间，它将人类团队和 AI 智能体凝聚在一个统一的环境中。在这里，人类同事与 AI 智能体能够共享相同的任务和项目历史，并实现天衣无缝的工作交接。",[473,2664,2666],{"id":2665},"什么是-block-旗下的-buzz人机协同的-ai-智能体共享空间","什么是 Block 旗下的 Buzz？人机协同的 AI 智能体共享空间",[429,2668,2669],{},"Buzz 是 Block 公司（由推特创始人杰克·多西创立）推出的开源协作工作空间，它让团队成员和 AI 智能体能够在相同的频道与项目中并肩工作。它具有以下几个核心亮点：",[483,2671,2672,2678,2684,2690,2696,2702],{},[486,2673,2674,2677],{},[440,2675,2676],{},"共享上下文："," 频道是团队成员与智能体开展协作的核心阵地。所有的对话记录和项目历史都完整保留在频道中。",[486,2679,2680,2683],{},[440,2681,2682],{},"智能体间通信："," 智能体之间能够跨机器直接进行交流。一个 AI 智能体可以 @ 另一个智能体，从而完成工作的转交或代码的交叉审查。",[486,2685,2686,2689],{},[440,2687,2688],{},"提及驱动激活："," AI 智能体仅在被 @ 提及时才会激活，平时则保持静默。被提及时，智能体将读取频道中的相关上下文并开始工作。",[486,2691,2692,2695],{},[440,2693,2694],{},"统一身份系统："," 团队成员与 AI 智能体使用同一套身份系统，并通过加密私钥\u002F公钥进行安全认证。",[486,2697,2698,2701],{},[440,2699,2700],{},"委派命令："," 您可以向人类同事授予指挥您的智能体的权限，让整个团队都能轻松指派和调用彼此的数字助手。",[486,2703,2704,2707],{},[440,2705,2706],{},"自托管服务器："," 因为您是该服务器的托管者，所以您的数据完全由您掌控。您可以自由决定谁能加入，并定义专属的运行规则。",[473,2709,2711],{"id":2710},"基于-nostr-的加密级-buzz-架构解析","基于 Nostr 的加密级 Buzz 架构解析",[429,2713,2714],{},[432,2715],{"alt":2716,"src":2717},"基于 Nostr 协议的 Buzz 协作空间加密级架构拓扑图","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-nostr-cryptographic-architecture.webp",[483,2719,2720,2726,2732,2738,2744,2750],{},[486,2721,2722,2725],{},[440,2723,2724],{},"Nostr 中继器充当服务器："," 消息、工作流、代码仓库以及其他事件都经过加密签名和验证，并存储在 Nostr 中继服务器（Relay）上。Nostr 协议原生支持通过 WebSockets 和 REST API 进行通信。",[486,2727,2728,2731],{},[440,2729,2730],{},"统一加密身份："," 人类和智能体都使用各自的加密密钥进行认证。此身份完全保留在客户端，绝不会存储在服务器上。",[486,2733,2734,2737],{},[440,2735,2736],{},"一等公民级智能体："," 每个智能体都拥有独立的身份、频道成员资格和审计跟踪（Audit Trail）。智能体使用智能体通信协议（ACP）连接到工作空间。",[486,2739,2740,2743],{},[440,2741,2742],{},"去中心化 Git 仓库："," 代码库存储在兼容 S3 的对象存储中，而任务、拉取请求（PR）和代码审查则在 Nostr 事件日志中进行追踪。因此，Buzz 的 Git 仓库实际上是托管在 Nostr 中继器上，而非 GitHub。",[486,2745,2746,2749],{},[440,2747,2748],{},"Buzz 客户端属于 Nostr 客户端："," Buzz 应用与 Nostr 中继器是分离的；它是一个桌面或移动端客户端，负责连接到中继器的 URL 节点。",[486,2751,2752,2755],{},[440,2753,2754],{},"基础技术栈："," 由 PostgreSQL 数据库处理事件存储与全文检索，Redis 负责管理发布\u002F订阅（Pub\u002FSub）消息队列，而兼容 S3 的 MinIO 用于存储媒体文件。",[473,2757,2759],{"id":2758},"如何在-linux-vps-上部署自托管的-block-旗下-buzz","如何在 Linux VPS 上部署自托管的 Block 旗下 Buzz",[891,2761,2763],{"id":2762},"_0-prerequisites","0. Prerequisites",[483,2765,2766,2769,2772,2775],{},[486,2767,2768],{},"一台 Linux VPS",[486,2770,2771],{},"域名已指向您的服务器 IP 地址",[486,2773,2774],{},"Docker 以及 Docker Compose 插件",[486,2776,2777],{},"Cloudflare 账户（免费服务计划）",[429,2779,2780,2781,2783],{},"在本指南中，我们将把 Nostr 中继器部署在 Ubuntu VPS 上，并通过 ",[443,2782,1735],{"href":363}," 保护其安全。整个基础技术栈包含 Docker Compose 中的四个服务：中继器（relay）、PostgreSQL、Redis 和 MinIO，并使用 Caddy 来提供 HTTPS 支持。",[462,2785],{"description":2786,"image":2629,"image-alt":2787,"label":2788,"min-read":2789,"title":1735,"to":363},"了解如何利用 Cloudflare WARP 和 Zero Trust（零信任）在不开放入站防火墙端口的情况下，安全地在全球范围内暴露和访问您的 Hermes Agent。","使用 Cloudflare Zero Trust 和 WARP 隧道安全地将 Hermes Agent 暴露到私有网络","相关指南","8",[891,2791,2793],{"id":2792},"_1-cloudflare-dns-与-api-令牌","1. Cloudflare DNS 与 API 令牌",[2183,2795,2797],{"id":2796},"创建-cloudflare-api-令牌token","创建 Cloudflare API 令牌（Token）",[531,2799,2800,2806],{},[486,2801,2802,2803,1808],{},"点击右上角的个人头像，并在下拉菜单中选择 ",[440,2804,2805],{},"Profile",[486,2807,2808,2809,1808],{},"点击 ",[440,2810,2811],{},"API Tokens",[429,2813,2814],{},[432,2815],{"alt":2816,"src":2817},"Cloudflare 用户个人资料页面，显示 API 令牌创建菜单","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-profile-api-tokens.webp",[531,2819,2820,2826,2832,2852,2857,2861,2864],{"start":1080},[486,2821,2808,2822,2825],{},[440,2823,2824],{},"Create Token"," 按钮。",[486,2827,2828,2829,1808],{},"选择使用模板 ",[440,2830,2831],{},"Edit zone DNS",[486,2833,2834,2835],{},"配置模版如下：\n",[483,2836,2837,2843],{},[486,2838,2839,2842],{},[440,2840,2841],{},"Permissions",": Zone — DNS — Edit",[486,2844,2845,2848,2849],{},[440,2846,2847],{},"Zone Resources",": Include — Specific zone — ",[493,2850,2851],{},"example.com",[486,2853,2808,2854,1808],{},[440,2855,2856],{},"Continue to summary",[486,2858,2808,2859,1808],{},[440,2860,2824],{},[486,2862,2863],{},"拷贝生成的 API 令牌，因为页面关闭后它将不再显示。",[486,2865,2866],{},"在终端中验证生成的令牌，确保其能正常工作：",[935,2868,2870],{"className":1044,"code":2869,"language":1046,"meta":424,"style":424},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[493,2871,2872],{"__ignoreMap":424},[943,2873,2874,2877,2880,2883,2886,2889,2891,2894],{"class":945,"line":946},[943,2875,2876],{"class":1053},"curl",[943,2878,2879],{"class":957}," \"",[943,2881,2882],{"class":1057},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[943,2884,2885],{"class":957},"\"",[943,2887,2888],{"class":1057}," -H",[943,2890,2879],{"class":957},[943,2892,2893],{"class":1057},"Authorization: Bearer YOUR_TOKEN_HERE",[943,2895,1981],{"class":957},[2183,2897,2899],{"id":2898},"dns-解析记录","DNS 解析记录",[483,2901,2902],{},[486,2903,2904,2905,2908],{},"创建一条 A 记录，并将代理状态设置为 ",[440,2906,2907],{},"仅限 DNS","（DNS only）。",[429,2910,2911],{},[432,2912],{"alt":2913,"src":2914},"在 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",[891,2916,2918],{"id":2917},"_2-在-ubuntu-上安装-docker","2. 在 Ubuntu 上安装 Docker",[429,2920,2921],{},"运行以下命令在 Ubuntu 上安装 Docker：",[935,2923,2925],{"className":1044,"code":2924,"language":1046,"meta":424,"style":424},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Start automatically when the system boots\nsudo systemctl enable docker\n\n# Verify docker is installed\ndocker --version\n\nsudo apt install -y docker-compose-plugin\n\n# Verify the compose plugin is installed\ndocker compose version\n\n",[493,2926,2927,2932,2960,2964,2969,3012,3016,3021,3031,3035,3040,3061,3065,3070,3081,3086,3092,3100,3105,3120,3125,3131],{"__ignoreMap":424},[943,2928,2929],{"class":945,"line":946},[943,2930,2931],{"class":1083},"# Add Docker's official GPG key and set up the Docker repository\n",[943,2933,2934,2936,2939,2942,2945,2948,2951,2954,2957],{"class":945,"line":1073},[943,2935,2876],{"class":1053},[943,2937,2938],{"class":1057}," -fsSL",[943,2940,2941],{"class":1057}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[943,2943,2944],{"class":957}," |",[943,2946,2947],{"class":1053}," sudo",[943,2949,2950],{"class":1057}," gpg",[943,2952,2953],{"class":1057}," --dearmor",[943,2955,2956],{"class":1057}," -o",[943,2958,2959],{"class":1057}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[943,2961,2962],{"class":945,"line":1080},[943,2963,1077],{"emptyLinePlaceholder":1076},[943,2965,2966],{"class":945,"line":1087},[943,2967,2968],{"class":1083},"# Add the official Docker repository\n",[943,2970,2971,2974,2976,2979,2982,2985,2988,2991,2994,2996,2998,3000,3003,3006,3009],{"class":945,"line":1949},[943,2972,2973],{"class":975},"echo",[943,2975,2879],{"class":957},[943,2977,2978],{"class":1057},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[943,2980,2981],{"class":957},"$(",[943,2983,2984],{"class":1053},"lsb_release",[943,2986,2987],{"class":1057}," -cs",[943,2989,2990],{"class":957},")",[943,2992,2993],{"class":1057}," stable",[943,2995,2885],{"class":957},[943,2997,2944],{"class":957},[943,2999,2947],{"class":1053},[943,3001,3002],{"class":1057}," tee",[943,3004,3005],{"class":1057}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[943,3007,3008],{"class":957}," >",[943,3010,3011],{"class":1057}," \u002Fdev\u002Fnull\n",[943,3013,3014],{"class":945,"line":1954},[943,3015,1077],{"emptyLinePlaceholder":1076},[943,3017,3018],{"class":945,"line":1960},[943,3019,3020],{"class":1083},"# Update package list\n",[943,3022,3023,3025,3028],{"class":945,"line":2295},[943,3024,1917],{"class":1053},[943,3026,3027],{"class":1057}," apt",[943,3029,3030],{"class":1057}," update\n",[943,3032,3033],{"class":945,"line":2306},[943,3034,1077],{"emptyLinePlaceholder":1076},[943,3036,3037],{"class":945,"line":2402},[943,3038,3039],{"class":1083},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[943,3041,3042,3044,3046,3049,3052,3055,3058],{"class":945,"line":2408},[943,3043,1917],{"class":1053},[943,3045,3027],{"class":1057},[943,3047,3048],{"class":1057}," install",[943,3050,3051],{"class":1057}," docker-ce",[943,3053,3054],{"class":1057}," docker-ce-cli",[943,3056,3057],{"class":1057}," containerd.io",[943,3059,3060],{"class":1057}," -y\n",[943,3062,3063],{"class":945,"line":2414},[943,3064,1077],{"emptyLinePlaceholder":1076},[943,3066,3067],{"class":945,"line":1722},[943,3068,3069],{"class":1083},"# Start automatically when the system boots\n",[943,3071,3072,3074,3076,3078],{"class":945,"line":2424},[943,3073,1917],{"class":1053},[943,3075,1920],{"class":1057},[943,3077,2047],{"class":1057},[943,3079,3080],{"class":1057}," docker\n",[943,3082,3084],{"class":945,"line":3083},15,[943,3085,1077],{"emptyLinePlaceholder":1076},[943,3087,3089],{"class":945,"line":3088},16,[943,3090,3091],{"class":1083},"# Verify docker is installed\n",[943,3093,3095,3097],{"class":945,"line":3094},17,[943,3096,1189],{"class":1053},[943,3098,3099],{"class":1057}," --version\n",[943,3101,3103],{"class":945,"line":3102},18,[943,3104,1077],{"emptyLinePlaceholder":1076},[943,3106,3108,3110,3112,3114,3117],{"class":945,"line":3107},19,[943,3109,1917],{"class":1053},[943,3111,3027],{"class":1057},[943,3113,3048],{"class":1057},[943,3115,3116],{"class":1057}," -y",[943,3118,3119],{"class":1057}," docker-compose-plugin\n",[943,3121,3123],{"class":945,"line":3122},20,[943,3124,1077],{"emptyLinePlaceholder":1076},[943,3126,3128],{"class":945,"line":3127},21,[943,3129,3130],{"class":1083},"# Verify the compose plugin is installed\n",[943,3132,3134,3136,3138],{"class":945,"line":3133},22,[943,3135,1189],{"class":1053},[943,3137,1192],{"class":1057},[943,3139,3140],{"class":1057}," version\n",[891,3142,3144],{"id":3143},"_3-克隆仓库并进行配置","3. 克隆仓库并进行配置",[935,3146,3148],{"className":1044,"code":3147,"language":1046,"meta":424,"style":424},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[493,3149,3150,3161,3165,3173,3184],{"__ignoreMap":424},[943,3151,3152,3155,3158],{"class":945,"line":946},[943,3153,3154],{"class":1053},"git",[943,3156,3157],{"class":1057}," clone",[943,3159,3160],{"class":1057}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[943,3162,3163],{"class":945,"line":1073},[943,3164,1077],{"emptyLinePlaceholder":1076},[943,3166,3167,3170],{"class":945,"line":1080},[943,3168,3169],{"class":975},"cd",[943,3171,3172],{"class":1057}," buzz\u002Fdeploy\u002Fcompose\n",[943,3174,3175,3178,3181],{"class":945,"line":1087},[943,3176,3177],{"class":1053},"cp",[943,3179,3180],{"class":1057}," .env.example",[943,3182,3183],{"class":1057}," .env\n",[943,3185,3186,3189],{"class":945,"line":1949},[943,3187,3188],{"class":1053},"nano",[943,3190,3183],{"class":1057},[429,3192,3193,3194,3197],{},"编辑 ",[493,3195,3196],{},".env"," 文件：",[483,3199,3200],{},[486,3201,3202],{},[440,3203,3204],{},"域名配置:",[935,3206,3211],{"className":3207,"code":3209,"language":3210},[3208],"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",[493,3212,3209],{"__ignoreMap":424},[483,3214,3215,3225],{},[486,3216,3217,3220,3221,3224],{},[440,3218,3219],{},"所有者公钥:"," ",[493,3222,3223],{},"RELAY_OWNER_PUBKEY"," 字段需要填入您的 64 位 16 进制公钥。请先在桌面客户端生成一个身份（选择 'Create a new identity key' → 复制以 npub 格式开头的公开 ID），然后将其转换为 16 进制格式。",[486,3226,3227,3230],{},[440,3228,3229],{},"密钥安全（Secrets）:",[483,3231,3232,3244,3258],{},[486,3233,3234,3235,3239,3240,3243],{},"使用该 ",[443,3236,3238],{"href":3237},"\u002Fzh\u002Ftools\u002Fsecret-key-hex","在线工具"," 或运行命令 ",[493,3241,3242],{},"openssl rand -hex 32","（运行 7 次）来生成高强度的随机密钥。",[486,3245,3246,3247,3250,3251,1535,3254,3257],{},"将所有的 ",[493,3248,3249],{},"CHANGE_ME"," 占位符替换掉：包括 ",[493,3252,3253],{},"BUZZ_RELAY_PRIVATE_KEY",[493,3255,3256],{},"BUZZ_GIT_HOOK_HMAC_SECRET","、Postgres\u002FRedis\u002FTypesense 的密码以及 S3 的 Access\u002FSecret Key。",[486,3259,3260,3261,3264],{},"未替换的占位符是导致容器陷入无限重启循环的最常见原因；请通过命令 ",[493,3262,3263],{},"grep CHANGE_ME .env"," 来核对并排除隐患。",[935,3266,3269],{"className":3267,"code":3268,"language":3210},[3208],"    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",[493,3270,3268],{"__ignoreMap":424},[483,3272,3273],{},[486,3274,3275,3278],{},[440,3276,3277],{},"其他配置项:",[483,3279,3280,3287],{},[486,3281,3282,3283,3286],{},"将环境变量 ",[493,3284,3285],{},"CLOUDFLARE_API_TOKEN"," 添加到您的配置中，并赋予先前生成的 API 令牌值。Caddy 将用其自动申请证书。",[486,3288,3289,3290,3292,3293,1860,3296,3299],{},"Buzz 的默认配置非常开放，任何知道您中继器地址的人都可以验证并加入。为了安全起见，请务必配置 ",[493,3291,3223],{},"，并将 ",[493,3294,3295],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",[493,3297,3298],{},"BUZZ_REQUIRE_AUTH_TOKEN=true"," 设为启用状态。",[891,3301,3303],{"id":3302},"_4-使用-caddy-开启-https-访问","4. 使用 Caddy 开启 HTTPS 访问",[2183,3305,3307],{"id":3306},"构建集成-cloudflare-dns-模块的自定义-caddy-镜像","构建集成 Cloudflare DNS 模块的自定义 Caddy 镜像",[483,3309,3310,3321,3324],{},[486,3311,3312,3313,3316,3317,3320],{},"我们在 Caddy 中配置基于 Cloudflare 的 DNS-01 挑战（Challenge）。DNS-01 验证的原理是让 Caddy 插件向您的",[440,3314,3315],{},"公网 DNS"," 写入一条 TXT 挑战记录 ",[493,3318,3319],{},"_acme-challenge.buzz.pafor.me","；",[486,3322,3323],{},"随后 Let's Encrypt 从公共互联网上查询该记录，以确权您的域名。这意味着您的域名必须是 Cloudflare 账户中的公网解析区域，而不能只是 Zero Trust \u002F WARP 局域网 DNS 内的私有域名。如果您的域名只在私网下分发解析而没有公网节点，DNS-01 将会失败，需要改用其他验证方式。",[486,3325,3326],{},"将以下配置加入到 Caddyfile 中：",[935,3328,3330],{"className":1358,"code":3329,"language":1360,"meta":424,"style":424},"{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n",[493,3331,3332,3337,3351],{"__ignoreMap":424},[943,3333,3334],{"class":945,"line":946},[943,3335,3336],{"class":957},"{\n",[943,3338,3339,3342,3345,3348],{"class":945,"line":1073},[943,3340,3341],{"class":1057},"  acme_dns cloudflare",[943,3343,3344],{"class":957}," {",[943,3346,3347],{"class":1057},"env.CLOUDFLARE_API_TOKEN",[943,3349,3350],{"class":957},"}\n",[943,3352,3353],{"class":945,"line":1080},[943,3354,3350],{"class":957},[483,3356,3357],{},[486,3358,3359,3360,3363,3364,3367],{},"创建一个 ",[493,3361,3362],{},"Dockerfile.caddy","，其内容如下，这是 ",[493,3365,3366],{},"compose.caddy.yml"," 运行所必需的：",[935,3369,3371],{"className":1358,"code":3370,"language":1360,"meta":424,"style":424},"FROM caddy:2-builder AS builder\n\nRUN xcaddy build \\\n    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n\nFROM caddy:2-alpine\n\nCOPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[493,3372,3373,3378,3382,3387,3392,3396,3401,3405],{"__ignoreMap":424},[943,3374,3375],{"class":945,"line":946},[943,3376,3377],{"class":1057},"FROM caddy:2-builder AS builder\n",[943,3379,3380],{"class":945,"line":1073},[943,3381,1077],{"emptyLinePlaceholder":1076},[943,3383,3384],{"class":945,"line":1080},[943,3385,3386],{"class":1057},"RUN xcaddy build \\\n",[943,3388,3389],{"class":945,"line":1087},[943,3390,3391],{"class":1057},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[943,3393,3394],{"class":945,"line":1949},[943,3395,1077],{"emptyLinePlaceholder":1076},[943,3397,3398],{"class":945,"line":1954},[943,3399,3400],{"class":1057},"FROM caddy:2-alpine\n",[943,3402,3403],{"class":945,"line":1960},[943,3404,1077],{"emptyLinePlaceholder":1076},[943,3406,3407],{"class":945,"line":2295},[943,3408,3409],{"class":1057},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[483,3411,3412],{},[486,3413,3414,3415,3417],{},"修改 ",[493,3416,3366],{},"，以使用我们刚生成的带有 Cloudflare 插件的 Caddy 镜像，并传入 API 令牌参数：",[935,3419,3421],{"className":1358,"code":3420,"language":1360,"meta":424,"style":424},"services:\n  relay:\n    ports: !reset []\n\n  caddy:\n    build:\n      context: .\n      dockerfile: Dockerfile.caddy\n    image: buzz-caddy:cloudflare\n    depends_on:\n      relay:\n        condition: service_healthy\n    environment:\n      BUZZ_DOMAIN: ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n    ports:\n      - \"${CADDY_HTTP_PORT:-80}:80\"\n      - \"${CADDY_HTTPS_PORT:-443}:443\"\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n      - buzz-caddy-data:\u002Fdata\n      - buzz-caddy-config:\u002Fconfig\n    restart: unless-stopped\n    networks:\n      - buzz-net\n\nvolumes:\n  buzz-caddy-data:\n    labels:\n      com.buzz.volume: caddy-data\n  buzz-caddy-config:\n    labels:\n      com.buzz.volume: caddy-config\n",[493,3422,3423,3430,3437,3450,3454,3461,3468,3479,3489,3499,3506,3513,3523,3530,3540,3550,3556,3568,3579,3586,3593,3600,3607,3618,3626,3634,3639,3647,3655,3663,3674,3682,3689],{"__ignoreMap":424},[943,3424,3425,3428],{"class":945,"line":946},[943,3426,3427],{"class":1370},"services",[943,3429,1385],{"class":957},[943,3431,3432,3435],{"class":945,"line":1073},[943,3433,3434],{"class":1370},"  relay",[943,3436,1385],{"class":957},[943,3438,3439,3442,3444,3447],{"class":945,"line":1080},[943,3440,3441],{"class":1370},"    ports",[943,3443,1374],{"class":957},[943,3445,3446],{"class":949}," !reset",[943,3448,3449],{"class":957}," []\n",[943,3451,3452],{"class":945,"line":1087},[943,3453,1077],{"emptyLinePlaceholder":1076},[943,3455,3456,3459],{"class":945,"line":1949},[943,3457,3458],{"class":1370},"  caddy",[943,3460,1385],{"class":957},[943,3462,3463,3466],{"class":945,"line":1954},[943,3464,3465],{"class":1370},"    build",[943,3467,1385],{"class":957},[943,3469,3470,3473,3475],{"class":945,"line":1960},[943,3471,3472],{"class":1370},"      context",[943,3474,1374],{"class":957},[943,3476,3478],{"class":3477},"sbssI"," .\n",[943,3480,3481,3484,3486],{"class":945,"line":2295},[943,3482,3483],{"class":1370},"      dockerfile",[943,3485,1374],{"class":957},[943,3487,3488],{"class":1057}," Dockerfile.caddy\n",[943,3490,3491,3494,3496],{"class":945,"line":2306},[943,3492,3493],{"class":1370},"    image",[943,3495,1374],{"class":957},[943,3497,3498],{"class":1057}," buzz-caddy:cloudflare\n",[943,3500,3501,3504],{"class":945,"line":2402},[943,3502,3503],{"class":1370},"    depends_on",[943,3505,1385],{"class":957},[943,3507,3508,3511],{"class":945,"line":2408},[943,3509,3510],{"class":1370},"      relay",[943,3512,1385],{"class":957},[943,3514,3515,3518,3520],{"class":945,"line":2414},[943,3516,3517],{"class":1370},"        condition",[943,3519,1374],{"class":957},[943,3521,3522],{"class":1057}," service_healthy\n",[943,3524,3525,3528],{"class":945,"line":1722},[943,3526,3527],{"class":1370},"    environment",[943,3529,1385],{"class":957},[943,3531,3532,3535,3537],{"class":945,"line":2424},[943,3533,3534],{"class":1370},"      BUZZ_DOMAIN",[943,3536,1374],{"class":957},[943,3538,3539],{"class":1057}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[943,3541,3542,3545,3547],{"class":945,"line":3083},[943,3543,3544],{"class":1370},"      CLOUDFLARE_API_TOKEN",[943,3546,1374],{"class":957},[943,3548,3549],{"class":1057}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[943,3551,3552,3554],{"class":945,"line":3088},[943,3553,3441],{"class":1370},[943,3555,1385],{"class":957},[943,3557,3558,3561,3563,3566],{"class":945,"line":3094},[943,3559,3560],{"class":957},"      -",[943,3562,2879],{"class":957},[943,3564,3565],{"class":1057},"${CADDY_HTTP_PORT:-80}:80",[943,3567,1981],{"class":957},[943,3569,3570,3572,3574,3577],{"class":945,"line":3102},[943,3571,3560],{"class":957},[943,3573,2879],{"class":957},[943,3575,3576],{"class":1057},"${CADDY_HTTPS_PORT:-443}:443",[943,3578,1981],{"class":957},[943,3580,3581,3584],{"class":945,"line":3107},[943,3582,3583],{"class":1370},"    volumes",[943,3585,1385],{"class":957},[943,3587,3588,3590],{"class":945,"line":3122},[943,3589,3560],{"class":957},[943,3591,3592],{"class":1057}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[943,3594,3595,3597],{"class":945,"line":3127},[943,3596,3560],{"class":957},[943,3598,3599],{"class":1057}," buzz-caddy-data:\u002Fdata\n",[943,3601,3602,3604],{"class":945,"line":3133},[943,3603,3560],{"class":957},[943,3605,3606],{"class":1057}," buzz-caddy-config:\u002Fconfig\n",[943,3608,3610,3613,3615],{"class":945,"line":3609},23,[943,3611,3612],{"class":1370},"    restart",[943,3614,1374],{"class":957},[943,3616,3617],{"class":1057}," unless-stopped\n",[943,3619,3621,3624],{"class":945,"line":3620},24,[943,3622,3623],{"class":1370},"    networks",[943,3625,1385],{"class":957},[943,3627,3629,3631],{"class":945,"line":3628},25,[943,3630,3560],{"class":957},[943,3632,3633],{"class":1057}," buzz-net\n",[943,3635,3637],{"class":945,"line":3636},26,[943,3638,1077],{"emptyLinePlaceholder":1076},[943,3640,3642,3645],{"class":945,"line":3641},27,[943,3643,3644],{"class":1370},"volumes",[943,3646,1385],{"class":957},[943,3648,3650,3653],{"class":945,"line":3649},28,[943,3651,3652],{"class":1370},"  buzz-caddy-data",[943,3654,1385],{"class":957},[943,3656,3658,3661],{"class":945,"line":3657},29,[943,3659,3660],{"class":1370},"    labels",[943,3662,1385],{"class":957},[943,3664,3666,3669,3671],{"class":945,"line":3665},30,[943,3667,3668],{"class":1370},"      com.buzz.volume",[943,3670,1374],{"class":957},[943,3672,3673],{"class":1057}," caddy-data\n",[943,3675,3677,3680],{"class":945,"line":3676},31,[943,3678,3679],{"class":1370},"  buzz-caddy-config",[943,3681,1385],{"class":957},[943,3683,3685,3687],{"class":945,"line":3684},32,[943,3686,3660],{"class":1370},[943,3688,1385],{"class":957},[943,3690,3692,3694,3696],{"class":945,"line":3691},33,[943,3693,3668],{"class":1370},[943,3695,1374],{"class":957},[943,3697,3698],{"class":1057}," caddy-config\n",[2183,3700,3702],{"id":3701},"启动-docker-容器组合","启动 Docker 容器组合",[935,3704,3706],{"className":1044,"code":3705,"language":1046,"meta":424,"style":424},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[493,3707,3708,3731,3735,3740],{"__ignoreMap":424},[943,3709,3710,3712,3714,3717,3720,3722,3725,3728],{"class":945,"line":946},[943,3711,1189],{"class":1053},[943,3713,1192],{"class":1057},[943,3715,3716],{"class":1057}," -f",[943,3718,3719],{"class":1057}," compose.yml",[943,3721,3716],{"class":1057},[943,3723,3724],{"class":1057}," compose.caddy.yml",[943,3726,3727],{"class":1057}," up",[943,3729,3730],{"class":1057}," -d\n",[943,3732,3733],{"class":945,"line":1073},[943,3734,1077],{"emptyLinePlaceholder":1076},[943,3736,3737],{"class":945,"line":1080},[943,3738,3739],{"class":1083},"#Check the Docker status\n",[943,3741,3742,3744,3746],{"class":945,"line":1087},[943,3743,1189],{"class":1053},[943,3745,1192],{"class":1057},[943,3747,3748],{"class":1057}," ps\n",[432,3750],{"src":3751,"alt":3752,"style":3753},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fdocker-compose-ps-status-terminal.webp","终端窗口显示通过 docker compose ps 运行的 Buzz 服务容器状态","max-width: 700px; width: 100%; height: auto;",[429,3755,3756,3757,3760],{},"打开您的网页浏览器并访问 ",[493,3758,3759],{},"http:\u002F\u002Fbuzz.pafor.me","，验证中继服务是否已顺利跑起来。",[432,3762],{"src":3763,"alt":3764,"style":3765},"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 中继服务器的成功运行响应","max-width: 500px; width: 100%; height: auto;",[891,3767,3769],{"id":3768},"步骤-5建立起首日备份机制","步骤 5：建立起首日备份机制",[935,3771,3773],{"className":1044,"code":3772,"language":1046,"meta":424,"style":424},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[493,3774,3775,3786],{"__ignoreMap":424},[943,3776,3777,3780,3783],{"class":945,"line":946},[943,3778,3779],{"class":1053},"mkdir",[943,3781,3782],{"class":1057}," -p",[943,3784,3785],{"class":1057}," \u002Fbuzz_backups\n",[943,3787,3788,3791],{"class":945,"line":1073},[943,3789,3790],{"class":1053},"crontab",[943,3792,3793],{"class":1057}," -e\n",[429,3795,3796],{},"添加一个每日凌晨自动执行的数据库快照定时任务（Cron Job）：",[935,3798,3801],{"className":3799,"code":3800,"language":3210},[3208],"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",[493,3802,3800],{"__ignoreMap":424},[429,3804,3805,3806,3808],{},"注意：请将 ",[493,3807,3253],{}," 视为永久不可失配的密钥。由于中继器中的事件都与此密钥绑定，如果未来变更了私钥，旧事件将无法通过验证；即便您恢复了数据库备份，在新私钥下它也不会被 Nostr 网络视为同一个中继服务。",[473,3810,3812],{"id":3811},"配置-buzz-桌面客户端与-nostr-加密身份","配置 Buzz 桌面客户端与 Nostr 加密身份",[429,3814,2487,3815,3819],{},[443,3816,3817],{"href":3817,"rel":3818},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[447]," 下载最新版 Buzz 桌面客户端并运行。依次完善个人资料，直到您来到 “Join or create a community” 界面。",[429,3821,3822],{},[432,3823],{"alt":3824,"src":3825},"Buzz 桌面客户端初始设置界面，用于加入或创建社区","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-setup-community.webp",[429,3827,3828],{},"点击 “Join a community” 并拷贝您的公钥（Public Key）。",[429,3830,3831],{},[432,3832],{"alt":3833,"src":3834},"Buzz 客户端界面显示加入社区前的公钥数字身份","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-join-community-public-key.webp",[429,3836,3837,3838,3841],{},"在 ",[440,3839,3840],{},"VPS 上","运行以下命令行工具，将您自己添加为该平台的首位会员：",[935,3843,3845],{"className":1044,"code":3844,"language":1046,"meta":424,"style":424},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[493,3846,3847],{"__ignoreMap":424},[943,3848,3849,3851,3853,3855,3857,3859,3861,3863],{"class":945,"line":946},[943,3850,1189],{"class":1053},[943,3852,1192],{"class":1057},[943,3854,1195],{"class":1057},[943,3856,1198],{"class":1057},[943,3858,1201],{"class":1057},[943,3860,1204],{"class":1057},[943,3862,1207],{"class":1057},[943,3864,3865],{"class":1057}," npub1yourkeyhere\n",[429,3867,3868,3869,3872],{},"在客户端中填入 ",[493,3870,3871],{},"wss:\u002F\u002Fbuzz.pafor.me"," 作为社区接入 URL，然后点击 “Next”。",[429,3874,3875],{},[432,3876],{"alt":3877,"src":3878},"在 Buzz 桌面客户端中输入自托管社区中继服务器的 URL 地址","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-input-community-url.webp",[429,3880,3881],{},"起一个帅气的昵称，然后点击 “Next” 按钮。",[429,3883,3884],{},[432,3885],{"alt":3886,"src":3887},"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",[891,3889,3891],{"id":3890},"协作频道与-ai-智能体","协作频道与 AI 智能体",[429,3893,3894],{},"频道是围绕特定任务或项目划分的群组。为您手头的每个任务或工程建立独立的频道，并将团队成员与所需的 AI 智能体拉入其中。",[429,3896,3897],{},"频道内的所有消息、代码与文档都会被自动分享，免去了逐一向新成员同步前因后果的烦恼。任何人都可以通过“@”来点名激活特定的 AI 智能体，智能体收到召唤后会读取相关历史消息并立刻着手处理。更妙的是，不同的 AI 智能体之间也能互相 @ 指派任务。",[429,3899,3900],{},"让我们试着给预置的智能体发一条私信（DM）",[429,3902,3903],{},[432,3904],{"alt":3905,"src":3906},"在 Buzz 协同桌面客户端中给 AI 智能体发送私信（DM）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-dm-agent.webp",[429,3908,3909],{},"创建一个新频道并拉几个 AI 智能体进来吧",[429,3911,3912],{},[432,3913],{"alt":3914,"src":3915},"在 Buzz 桌面客户端中创建新的任务或项目协作频道","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-create-channel-dialog.webp",[429,3917,3918],{},[432,3919],{"alt":3920,"src":3921},"将团队成员和 AI 智能体添加至新创建的协作频道中","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-agents-to-channel.webp",[429,3923,3924],{},[432,3925],{"alt":3926,"src":3927},"活跃协作频道视图，展示合并后的聊天历史和项目任务","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-view.webp",[432,3929],{"src":3930,"alt":3931,"style":3932},"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;",[891,3934,3936],{"id":3935},"激活智能体运行时agent-runtimes","激活智能体运行时（Agent Runtimes）",[429,3938,3939,3940,3943,3944,3947],{},"平台自带的运行时预设依赖于“自动探测”来查找特定系统目录（例如 ",[493,3941,3942],{},"~\u002F.local\u002Fbin","）下的执行程序（如 ",[493,3945,3946],{},"hermes-acp","）。如果您的智能体软件安装在非标准路径下，Buzz 将无法正确识别。",[429,3949,3950,3951,3954],{},"以 Kimi Code 为例，它的智能体 ID 为 kimi，Buzz 默认会在 ",[493,3952,3953],{},"~\u002F.local\u002Fbin\u002Fkimi"," 寻找它。通过创建一个软链接（Symbolic Link）即可轻松搞定：",[935,3956,3959],{"className":3957,"code":3958,"language":3210},[3208],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[493,3960,3958],{"__ignoreMap":424},[429,3962,3963],{},"此时，Kimi Code 就会显示在“Agent runtimes”列表中。",[429,3965,3966],{},[432,3967],{"alt":3968,"src":3969},"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",[891,3971,3972],{"id":3972},"项目与代码仓库管理",[429,3974,3975,3976,3979],{},"请先在 Settings → Experiments 菜单中激活“",[440,3977,3978],{},"Projects","”实验性功能：",[429,3981,3982],{},[432,3983],{"alt":3984,"src":3985},"在 Buzz 客户端设置的 Experiments 标签页中激活实验性 Projects 功能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-experiments-projects.webp",[429,3987,3988,3989,3991],{},"目前，一个项目（Project）必须使用 ",[493,3990,1219],{}," 命令行工具来创建（虽然在后续版本中会加入 UI 直接创建的支持）。",[2183,3993,3995],{"id":3994},"在-vps-上安装并部署-buzz-cli","在 VPS 上安装并部署 buzz-cli",[429,3997,3837,3998,4000,4001,4003],{},[440,3999,3840],{},"依次执行以下命令，编译并安装好 ",[493,4002,1219],{}," 客户端：",[935,4005,4007],{"className":1044,"code":4006,"language":1046,"meta":424,"style":424},"sudo apt install cargo\ncd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-cli\necho 'export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"' >> ~\u002F.bashrc && source ~\u002F.bashrc\n",[493,4008,4009,4020,4027,4040],{"__ignoreMap":424},[943,4010,4011,4013,4015,4017],{"class":945,"line":946},[943,4012,1917],{"class":1053},[943,4014,3027],{"class":1057},[943,4016,3048],{"class":1057},[943,4018,4019],{"class":1057}," cargo\n",[943,4021,4022,4024],{"class":945,"line":1073},[943,4023,3169],{"class":975},[943,4025,4026],{"class":1057}," ~\u002Fbuzz\n",[943,4028,4029,4032,4034,4037],{"class":945,"line":1080},[943,4030,4031],{"class":1053},"cargo",[943,4033,3048],{"class":1057},[943,4035,4036],{"class":1057}," --path",[943,4038,4039],{"class":1057}," crates\u002Fbuzz-cli\n",[943,4041,4042,4044,4047,4050,4053,4056,4059,4062,4065],{"class":945,"line":1087},[943,4043,2973],{"class":975},[943,4045,4046],{"class":957}," '",[943,4048,4049],{"class":1057},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[943,4051,4052],{"class":957},"'",[943,4054,4055],{"class":957}," >>",[943,4057,4058],{"class":1057}," ~\u002F.bashrc",[943,4060,4061],{"class":957}," &&",[943,4063,4064],{"class":975}," source",[943,4066,4067],{"class":1057}," ~\u002F.bashrc\n",[429,4069,4070,4071,4073,4074,4076],{},"使用在线工具或通过 ",[493,4072,1219],{}," 生成一对 Nostr 加密公私钥。这组密钥将代表该 ",[493,4075,1219],{}," 工具在 Nostr 网络中的数字身份。",[935,4078,4080],{"className":1044,"code":4079,"language":1046,"meta":424,"style":424},"docker run --rm --entrypoint \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin ghcr.io\u002Fblock\u002Fbuzz:main generate-key\n\n# Use the generated Public Key\ndocker compose exec relay buzz-admin add-member --pubkey generated_Public_key\n",[493,4081,4082,4104,4108,4113],{"__ignoreMap":424},[943,4083,4084,4086,4089,4092,4095,4098,4101],{"class":945,"line":946},[943,4085,1189],{"class":1053},[943,4087,4088],{"class":1057}," run",[943,4090,4091],{"class":1057}," --rm",[943,4093,4094],{"class":1057}," --entrypoint",[943,4096,4097],{"class":1057}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[943,4099,4100],{"class":1057}," ghcr.io\u002Fblock\u002Fbuzz:main",[943,4102,4103],{"class":1057}," generate-key\n",[943,4105,4106],{"class":945,"line":1073},[943,4107,1077],{"emptyLinePlaceholder":1076},[943,4109,4110],{"class":945,"line":1080},[943,4111,4112],{"class":1083},"# Use the generated Public Key\n",[943,4114,4115,4117,4119,4121,4123,4125,4127,4129],{"class":945,"line":1087},[943,4116,1189],{"class":1053},[943,4118,1192],{"class":1057},[943,4120,1195],{"class":1057},[943,4122,1198],{"class":1057},[943,4124,1201],{"class":1057},[943,4126,1204],{"class":1057},[943,4128,1207],{"class":1057},[943,4130,4131],{"class":1057}," generated_Public_key\n",[429,4133,4134],{},"配置您的 CLI 环境变量：",[935,4136,4138],{"className":1044,"code":4137,"language":1046,"meta":424,"style":424},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\necho 'export BUZZ_PRIVATE_KEY=\"nsec1...\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n\necho 'export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n",[493,4139,4140,4145,4176,4180],{"__ignoreMap":424},[943,4141,4142],{"class":945,"line":946},[943,4143,4144],{"class":1083},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[943,4146,4147,4149,4151,4154,4156,4159,4162,4165,4168,4171,4173],{"class":945,"line":1073},[943,4148,2973],{"class":975},[943,4150,4046],{"class":957},[943,4152,4153],{"class":1057},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[943,4155,4052],{"class":957},[943,4157,4158],{"class":957},"  >>",[943,4160,4161],{"class":1057}," \u002Fhome\u002F",[943,4163,4164],{"class":957},"\u003C",[943,4166,4167],{"class":1057},"use",[943,4169,4170],{"class":953},"r",[943,4172,1262],{"class":957},[943,4174,4175],{"class":1057},"\u002F.bashrc\n",[943,4177,4178],{"class":945,"line":1080},[943,4179,1077],{"emptyLinePlaceholder":1076},[943,4181,4182,4184,4186,4189,4191,4193,4195,4197,4199,4201,4203],{"class":945,"line":1087},[943,4183,2973],{"class":975},[943,4185,4046],{"class":957},[943,4187,4188],{"class":1057},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[943,4190,4052],{"class":957},[943,4192,4158],{"class":957},[943,4194,4161],{"class":1057},[943,4196,4164],{"class":957},[943,4198,4167],{"class":1057},[943,4200,4170],{"class":953},[943,4202,1262],{"class":957},[943,4204,4175],{"class":1057},[429,4206,4207,4208,4210],{},"运行以下命令来测试 ",[493,4209,1219],{}," 是否已经与您的中继器配对畅通：",[935,4212,4214],{"className":1044,"code":4213,"language":1046,"meta":424,"style":424},"buzz channels list\n",[493,4215,4216],{"__ignoreMap":424},[943,4217,4218,4220,4222],{"class":945,"line":946},[943,4219,1242],{"class":1053},[943,4221,1245],{"class":1057},[943,4223,4224],{"class":1057}," list\n",[429,4226,4227],{},[432,4228],{"alt":4229,"src":4230},"终端命令行运行验证，通过列出活跃频道来检查 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",[2183,4232,4234],{"id":4233},"使用-buzz-cli-创建全新的项目","使用 buzz-cli 创建全新的项目",[935,4236,4238],{"className":1044,"code":4237,"language":1046,"meta":424,"style":424},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[493,4239,4240,4245],{"__ignoreMap":424},[943,4241,4242],{"class":945,"line":946},[943,4243,4244],{"class":1083},"# --channel refers to the UUID of the channel\n",[943,4246,4247,4249,4252,4255,4258,4261,4264,4266,4269,4271,4273,4275,4278],{"class":945,"line":1073},[943,4248,1242],{"class":1053},[943,4250,4251],{"class":1057}," repos",[943,4253,4254],{"class":1057}," create",[943,4256,4257],{"class":1057}," --id",[943,4259,4260],{"class":1057}," TestKOA",[943,4262,4263],{"class":1057}," --name",[943,4265,4046],{"class":957},[943,4267,4268],{"class":1057},"Display Name",[943,4270,4052],{"class":957},[943,4272,1250],{"class":1057},[943,4274,2879],{"class":957},[943,4276,4277],{"class":1057},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[943,4279,1981],{"class":957},[429,4281,4282,4283,4285],{},"项目的所有权极为严格，只有创建者才有权将其删除。由于该“Display Name”项目是由 ",[493,4284,1219],{}," 发起创建的，而目前的命令行版本尚未内置删除指令，因此该项目无法通过常规方式清空。",[429,4287,4288],{},"再次点开您的桌面客户端，验证该项目是否已显示在工作区中。",[429,4290,4291],{},[432,4292],{"alt":4293,"src":4294},"Buzz 桌面客户端项目视图页面，确认项目已成功创建","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-project-view.webp",[429,4296,4297],{},"一旦项目列表在界面中开启，后续您便可以直接通过右上角的 “+” 按钮随心所欲地添加更多子项目了。",[429,4299,4300],{},[432,4301],{"alt":4302,"src":4303},"在 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",[2183,4305,4307],{"id":4306},"拉入现有的-git-代码仓库","拉入现有的 Git 代码仓库",[429,4309,4310,4311,4314,4315,4318,4319,4324],{},"在您的本地开发机器上安装 ",[493,4312,4313],{},"git-credential-nostr"," 凭证辅助工具。这需要您的系统已安装 ",[440,4316,4317],{},"Git 2.46+"," 版本并配有 Rust 构建环境。详情可参考此项目的 ",[443,4320,4323],{"href":4321,"rel":4322},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[447],"Readme"," 描述：",[935,4326,4328],{"className":1044,"code":4327,"language":1046,"meta":424,"style":424},"cargo install --path crates\u002Fgit-credential-nostr\n",[493,4329,4330],{"__ignoreMap":424},[943,4331,4332,4334,4336,4338],{"class":945,"line":946},[943,4333,4031],{"class":1053},[943,4335,3048],{"class":1057},[943,4337,4036],{"class":1057},[943,4339,4340],{"class":1057}," crates\u002Fgit-credential-nostr\n",[429,4342,4343,4344,4346],{},"对 ",[493,4345,4313],{}," 进行配置，使其获得 Buzz 中继器的授权权限：",[935,4348,4350],{"className":1044,"code":4349,"language":1046,"meta":424,"style":424},"# 1. Register the helper and enable per-path credentials.\ngit config --global credential.helper nostr\ngit config --global credential.useHttpPath true\n\n# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\nmkdir -p ~\u002F.nostr\necho \"nsec1...\" > ~\u002F.nostr\u002Fkey && chmod 600 ~\u002F.nostr\u002Fkey\ngit config --global nostr.keyfile ~\u002F.nostr\u002Fkey\n",[493,4351,4352,4357,4373,4386,4390,4395,4404,4431],{"__ignoreMap":424},[943,4353,4354],{"class":945,"line":946},[943,4355,4356],{"class":1083},"# 1. Register the helper and enable per-path credentials.\n",[943,4358,4359,4361,4364,4367,4370],{"class":945,"line":1073},[943,4360,3154],{"class":1053},[943,4362,4363],{"class":1057}," config",[943,4365,4366],{"class":1057}," --global",[943,4368,4369],{"class":1057}," credential.helper",[943,4371,4372],{"class":1057}," nostr\n",[943,4374,4375,4377,4379,4381,4384],{"class":945,"line":1080},[943,4376,3154],{"class":1053},[943,4378,4363],{"class":1057},[943,4380,4366],{"class":1057},[943,4382,4383],{"class":1057}," credential.useHttpPath",[943,4385,1396],{"class":957},[943,4387,4388],{"class":945,"line":1087},[943,4389,1077],{"emptyLinePlaceholder":1076},[943,4391,4392],{"class":945,"line":1949},[943,4393,4394],{"class":1083},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[943,4396,4397,4399,4401],{"class":945,"line":1954},[943,4398,3779],{"class":1053},[943,4400,3782],{"class":1057},[943,4402,4403],{"class":1057}," ~\u002F.nostr\n",[943,4405,4406,4408,4410,4413,4415,4417,4420,4422,4425,4428],{"class":945,"line":1960},[943,4407,2973],{"class":975},[943,4409,2879],{"class":957},[943,4411,4412],{"class":1057},"nsec1...",[943,4414,2885],{"class":957},[943,4416,3008],{"class":957},[943,4418,4419],{"class":1057}," ~\u002F.nostr\u002Fkey",[943,4421,4061],{"class":957},[943,4423,4424],{"class":1053}," chmod",[943,4426,4427],{"class":3477}," 600",[943,4429,4430],{"class":1057}," ~\u002F.nostr\u002Fkey\n",[943,4432,4433,4435,4437,4439,4442],{"class":945,"line":2295},[943,4434,3154],{"class":1053},[943,4436,4363],{"class":1057},[943,4438,4366],{"class":1057},[943,4440,4441],{"class":1057}," nostr.keyfile",[943,4443,4430],{"class":1057},[429,4445,4446],{},"在 Buzz 中继上开辟出该 Git 库的存储节点：",[935,4448,4451],{"className":4449,"code":4450,"language":3210},[3208],"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",[493,4452,4450],{"__ignoreMap":424},[429,4454,4455,4456,4459,4460,4463],{},"在第一次执行 ",[493,4457,4458],{},"git push"," 时，您可能会被拦截并报错 ",[493,4461,4462],{},"remote: missing Authorization header","。这是由于 Git 写入控制（ACL）是由频道成员资格决定的，您必须先将该仓库 ID 与一个具体的 Buzz 频道进行绑定，从而授权合规写入：",[935,4465,4467],{"className":1044,"code":4466,"language":1046,"meta":424,"style":424},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[493,4468,4469,4494,4498,4503],{"__ignoreMap":424},[943,4470,4471,4473,4475,4478,4480,4483,4485,4487,4489,4491],{"class":945,"line":946},[943,4472,1242],{"class":1053},[943,4474,4251],{"class":1057},[943,4476,4477],{"class":1057}," bind",[943,4479,4257],{"class":1057},[943,4481,4482],{"class":1057}," koa-email-routing",[943,4484,1250],{"class":1057},[943,4486,1253],{"class":957},[943,4488,1256],{"class":1057},[943,4490,1259],{"class":953},[943,4492,4493],{"class":957},">\n",[943,4495,4496],{"class":945,"line":1073},[943,4497,1077],{"emptyLinePlaceholder":1076},[943,4499,4500],{"class":945,"line":1080},[943,4501,4502],{"class":1083},"# push the code again\n",[943,4504,4505,4507],{"class":945,"line":1087},[943,4506,3154],{"class":1053},[943,4508,4509],{"class":1057}," push\n",[429,4511,4512,4513,4515],{},"在某些情况下，在 Buzz 桌面版中查阅项目进度时会遇到类似下方的 Git 模块拉取失败提示。这是由于该桌面应用要求系统必须搭载 ",[440,4514,4317],{}," 版本，而应用直接启动时可能默认寻址到了系统中的旧版 Git 引擎：",[429,4517,4518],{},[432,4519],{"alt":4520,"src":4521},"Buzz 客户端展示由于本地 Git 版本低于 2.46 导致的 Git 库加载失败报错界面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-git-version-error.webp",[429,4523,4524,4525,4528,4529,4534],{},"请在您的 shell 配置文件中通过执行 ",[493,4526,4527],{},"launchctl setenv PATH \"\u002Fopt\u002Fhomebrew\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin:\u002Fusr\u002Fsbin:\u002Fsbin\""," 声明新版 Git 所在的 PATH，并直接在终端中拉起 Buzz 应用。对此可参考该 ",[443,4530,4533],{"href":4531,"rel":4532},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[447],"Issue"," 的详细排查记录。",[935,4536,4538],{"className":1044,"code":4537,"language":1046,"meta":424,"style":424},"open -a Buzz\n",[493,4539,4540],{"__ignoreMap":424},[943,4541,4542,4545,4548],{"class":945,"line":946},[943,4543,4544],{"class":1053},"open",[943,4546,4547],{"class":1057}," -a",[943,4549,4550],{"class":1057}," Buzz\n",[429,4552,4553],{},"重新进入客户端中的 Projects 标签页，您会惊喜地发现代码库的所有提交与详情已经完美加载出来了。",[429,4555,4556],{},[432,4557],{"alt":4558,"src":4559},"代码库提交详情成功加载后的 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",[473,4561,4563],{"id":4562},"利用二维码将-ai-助手同步至手机端-buzz-app","利用二维码将 AI 助手同步至手机端 Buzz App",[429,4565,4566,4567,4570],{},"Buzz 手机端的“扫码配对”只认 HTTPS 协议，且 VPS 上的中继服务默认并不会在后台运行 ",[493,4568,4569],{},"buzz-pair-relay"," 组件。",[935,4572,4574],{"className":1044,"code":4573,"language":1046,"meta":424,"style":424},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[493,4575,4576,4582],{"__ignoreMap":424},[943,4577,4578,4580],{"class":945,"line":946},[943,4579,3169],{"class":975},[943,4581,4026],{"class":1057},[943,4583,4584,4586,4588,4590],{"class":945,"line":1073},[943,4585,4031],{"class":1053},[943,4587,3048],{"class":1057},[943,4589,4036],{"class":1057},[943,4591,4592],{"class":1057}," crates\u002Fbuzz-pair-relay\n",[429,4594,4595,4596,4599,4600,4602],{},"将以下配置注入到您的 ",[493,4597,4598],{},"compose.yml"," 文件中，声明并启动 ",[493,4601,4569],{}," 容器进程：",[935,4604,4606],{"className":1358,"code":4605,"language":1360,"meta":424,"style":424},"  pair:\n    image: ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n    entrypoint: [\"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay\"]\n    environment:\n      BUZZ_PAIR_RELAY_BIND_ADDR: 0.0.0.0:5000\n    ports:\n      - \"${BUZZ_PAIR_RELAY_PORT:-5000}:5000\"\n    restart: unless-stopped\n    networks:\n      [buzz-net]\n",[493,4607,4608,4615,4624,4644,4650,4660,4666,4677,4685,4691],{"__ignoreMap":424},[943,4609,4610,4613],{"class":945,"line":946},[943,4611,4612],{"class":1370},"  pair",[943,4614,1385],{"class":957},[943,4616,4617,4619,4621],{"class":945,"line":1073},[943,4618,3493],{"class":1370},[943,4620,1374],{"class":957},[943,4622,4623],{"class":1057}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[943,4625,4626,4629,4631,4634,4636,4639,4641],{"class":945,"line":1080},[943,4627,4628],{"class":1370},"    entrypoint",[943,4630,1374],{"class":957},[943,4632,4633],{"class":957}," [",[943,4635,2885],{"class":957},[943,4637,4638],{"class":1057},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[943,4640,2885],{"class":957},[943,4642,4643],{"class":957},"]\n",[943,4645,4646,4648],{"class":945,"line":1087},[943,4647,3527],{"class":1370},[943,4649,1385],{"class":957},[943,4651,4652,4655,4657],{"class":945,"line":1949},[943,4653,4654],{"class":1370},"      BUZZ_PAIR_RELAY_BIND_ADDR",[943,4656,1374],{"class":957},[943,4658,4659],{"class":1057}," 0.0.0.0:5000\n",[943,4661,4662,4664],{"class":945,"line":1954},[943,4663,3441],{"class":1370},[943,4665,1385],{"class":957},[943,4667,4668,4670,4672,4675],{"class":945,"line":1960},[943,4669,3560],{"class":957},[943,4671,2879],{"class":957},[943,4673,4674],{"class":1057},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[943,4676,1981],{"class":957},[943,4678,4679,4681,4683],{"class":945,"line":2295},[943,4680,3612],{"class":1370},[943,4682,1374],{"class":957},[943,4684,3617],{"class":1057},[943,4686,4687,4689],{"class":945,"line":2306},[943,4688,3623],{"class":1370},[943,4690,1385],{"class":957},[943,4692,4693,4696,4699],{"class":945,"line":2402},[943,4694,4695],{"class":957},"      [",[943,4697,4698],{"class":1057},"buzz-net",[943,4700,4643],{"class":957},[429,4702,4703,4704,4706,4707,4710],{},"在您的 ",[493,4705,3196],{}," 中声明 ",[493,4708,4709],{},"BUZZ_PAIRING_RELAY_URL"," 及其专用的运行端口号：",[935,4712,4715],{"className":4713,"code":4714,"language":3210},[3208],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[493,4716,4714],{"__ignoreMap":424},[429,4718,4719,4720,4723],{},"点击桌面端应用中的 Settings, 进入 “",[440,4721,4722],{},"Mobile","” 配对项：",[429,4725,4726],{},[432,4727],{"alt":4728,"src":4729},"Buzz 桌面客户端设置中展示的 Mobile 移动端配对配置标签页","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-mobile-tab.webp",[429,4731,4732],{},"点击 “Start pairing” —— 界面会生成专属的绑定二维码；打开手机端 App 扫一扫，接着在桌面端点击 “Code Match” 确认无误，双端便立即完成信任绑定。",[429,4734,4735],{},[432,4736],{"alt":4737,"src":4738},"在桌面客户端中生成安全的配对二维码，用于同步 Buzz 手机端 App","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-pairing-qr-code.webp",[429,4740,4741],{},"注意：手机端应用中的智能体之所以能随叫随到，是基于您的桌面端应用在后台持续维系运行。只有保障桌面机处于在线状态，手机端派发的智能体指令才能被顺利分发与执行。",[429,4743,4744],{},[432,4745],{"alt":4746,"src":4747},"在手机端 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",[473,4749,2593],{"id":2593},[429,4751,4752],{},"不可否认，作为一个还处于发展初期的技术方案，Buzz 在面对大规模生产环境时依然稍显稚嫩，伴随着一些偶发的系统 Bug 与界面交互上的限制。但对于小型团队或单兵作战的独立开发者而言，这无疑是一场令人血脉偾张的前沿探索。它为我们揭开了一幅波澜壮阔的人机无缝协奏画卷，让我们提前触碰到了“AI 智能体成为工作伙伴”的未来工作模式。",[473,4754,4755],{"id":4755},"参考资源",[483,4757,4758,4765,4772,4779],{},[486,4759,4760],{},[443,4761,4764],{"href":4762,"rel":4763},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[447],"Buzz releases",[486,4766,4767],{},[443,4768,4771],{"href":4769,"rel":4770},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[447],"Introducing Buzz",[486,4773,4774],{},[443,4775,4778],{"href":4776,"rel":4777},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[447],"What is buzz",[486,4780,4781],{},[443,4782,4785],{"href":4783,"rel":4784},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[447],"How to self-host Buzz (Miget)",[1666,4787,4788],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":424,"searchDepth":1073,"depth":1080,"links":4790},[4791,4792,4793,4807,4816,4817,4818],{"id":2665,"depth":1073,"text":2666},{"id":2710,"depth":1073,"text":2711},{"id":2758,"depth":1073,"text":2759,"children":4794},[4795,4796,4800,4801,4802,4806],{"id":2762,"depth":1080,"text":2763},{"id":2792,"depth":1080,"text":2793,"children":4797},[4798,4799],{"id":2796,"depth":1087,"text":2797},{"id":2898,"depth":1087,"text":2899},{"id":2917,"depth":1080,"text":2918},{"id":3143,"depth":1080,"text":3144},{"id":3302,"depth":1080,"text":3303,"children":4803},[4804,4805],{"id":3306,"depth":1087,"text":3307},{"id":3701,"depth":1087,"text":3702},{"id":3768,"depth":1080,"text":3769},{"id":3811,"depth":1073,"text":3812,"children":4808},[4809,4810,4811],{"id":3890,"depth":1080,"text":3891},{"id":3935,"depth":1080,"text":3936},{"id":3972,"depth":1080,"text":3972,"children":4812},[4813,4814,4815],{"id":3994,"depth":1087,"text":3995},{"id":4233,"depth":1087,"text":4234},{"id":4306,"depth":1087,"text":4307},{"id":4562,"depth":1073,"text":4563},{"id":2593,"depth":1073,"text":2593},{"id":4755,"depth":1073,"text":4755},[1687,1686,1242],"2026-09-08",{"schemaOrg":4822,"robots":1720,"sitemap":4841},[4823,4824],{"@type":1697,"headline":454,"description":464,"image":465},{"@type":1699,"name":454,"description":464,"image":465,"step":4825},[4826,4829,4832,4835,4838],{"@type":1702,"name":4827,"text":4828},"阶段 1：Cloudflare 设置","创建 Cloudflare API 令牌并配置 DNS 解析设置。",{"@type":1702,"name":4830,"text":4831},"阶段 2：安装 Docker","在 Ubuntu VPS 上设置并安装 Docker 容器引擎。",{"@type":1702,"name":4833,"text":4834},"阶段 3：克隆与配置","克隆仓库代码并配置 docker-compose 环境变量。",{"@type":1702,"name":4836,"text":4837},"阶段 4：集成 Caddy","编译带有 Cloudflare DNS 挑战模块的的自定义 Caddy 镜像。",{"@type":1702,"name":4839,"text":4840},"阶段 5：自动备份","配置 cron 定时任务以实现 PostgreSQL 数据库的自动备份。",{"lastmod":4842},"2026-09-03",{"title":4844,"description":464,"ogTitle":454,"ogDescription":464,"twitterTitle":454,"twitterDescription":464},"如何在 Ubuntu VPS 上自建 Block 旗下的 Buzz 协作中继服务器","zh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[1727,4847,1114,4848,4849],"Docker","Caddy","Cloudflare","Plt5qPXpCpnSq9t6cSV6VM3z9k3i2BkoxxI46S98hdM",{"id":1734,"title":1735,"author":424,"body":1736,"category":2625,"date":2627,"description":2628,"extension":1691,"image":2629,"imageAlt":2630,"isPublished":1076,"meta":2631,"minRead":1949,"navigation":1076,"path":363,"seo":2636,"stem":2638,"tags":2639,"updatedAt":2635,"__hash__":2643},{"id":4853,"title":4854,"author":1729,"body":4855,"category":6734,"date":6736,"description":6737,"extension":1691,"image":6738,"imageAlt":6739,"isPublished":1076,"meta":6740,"minRead":3133,"navigation":1076,"path":379,"seo":6747,"stem":6748,"tags":6749,"updatedAt":4842,"__hash__":6751},"article\u002Fzh\u002Farticle\u002Fself-hosted-travel-planner-trek.md","使用Docker与TREK自托管您的个性化智能旅行日程：一站式深度规划并轻松管理预订、财务和行李清单",{"type":426,"value":4856,"toc":6693},[4857,4860,4863,4866,4870,4874,5016,5019,5025,5044,5047,5050,5154,5165,5168,5173,5176,5187,5191,5195,5198,5201,5241,5245,5248,5281,5284,5324,5327,5332,5343,5347,5354,5358,5361,5452,5456,5459,5463,5470,5474,5477,5495,5506,5510,5513,5524,5528,5532,5543,5547,5551,5554,5558,5562,5565,5570,5573,5578,5584,5588,5592,5595,5599,5611,5616,5622,5627,5631,5634,5639,5644,5647,5654,5658,5661,5664,5674,5680,5685,5692,5697,5701,5707,5712,5715,5720,5724,5730,5734,5739,5743,5746,5749,5754,5759,5764,5768,5775,5780,5785,5790,5795,5799,5805,5810,5816,5820,5823,5827,5833,5838,5843,5849,5854,5859,5864,5878,5882,5887,5908,5913,5916,5920,5923,5928,5931,5979,5983,5990,5996,6001,6007,6012,6018,6023,6029,6032,6037,6044,6049,6055,6059,6066,6071,6074,6078,6082,6088,6092,6095,6102,6106,6113,6117,6128,6130,6134,6138,6148,6158,6163,6170,6175,6182,6186,6189,6354,6357,6361,6364,6369,6372,6378,6382,6389,6393,6396,6401,6408,6413,6417,6427,6498,6514,6517,6522,6526,6530,6541,6617,6631,6634,6638,6642,6645,6648,6651,6654,6663,6667,6690],[429,4858,4859],{},"在规划旅行时，最繁琐的部分莫过于那些零散的数据：机票预订PDF、酒店确认信、旅伴之间的聊天记录、想去的景点清单等，都散落在不同的角落。而当需要汇总总花销、拆分账单时，又得在海量的出行记录中不停翻找，极为耗费精力。",[429,4861,4862],{},"TREK是一款可以自托管的开源旅行规划系统，能够将您的行程、预订、财务预算和行李清单一站式整合到同一个平台中。其内置的MCP（Model Context Protocol）服务器还允许AI智能体（如Claude Desktop）直接操作您的出行数据。",[429,4864,4865],{},"本教程将带您一步步完成从系统部署到完整管理一次真实旅行的全过程。",[891,4867,4869],{"id":4868},"_1-如何使用docker部署trek旅行规划器","1. 如何使用Docker部署TREK旅行规划器",[2183,4871,4873],{"id":4872},"在ubuntu-vps上安装docker","在Ubuntu VPS上安装Docker",[935,4875,4877],{"className":1044,"code":4876,"language":1046,"meta":424,"style":424},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Verify docker is installed\ndocker --version\n\n# Starts automatically when your system boots\nsudo systemctl enable docker\n",[493,4878,4879,4883,4903,4907,4911,4943,4947,4951,4959,4963,4967,4983,4987,4991,4997,5001,5006],{"__ignoreMap":424},[943,4880,4881],{"class":945,"line":946},[943,4882,2931],{"class":1083},[943,4884,4885,4887,4889,4891,4893,4895,4897,4899,4901],{"class":945,"line":1073},[943,4886,2876],{"class":1053},[943,4888,2938],{"class":1057},[943,4890,2941],{"class":1057},[943,4892,2944],{"class":957},[943,4894,2947],{"class":1053},[943,4896,2950],{"class":1057},[943,4898,2953],{"class":1057},[943,4900,2956],{"class":1057},[943,4902,2959],{"class":1057},[943,4904,4905],{"class":945,"line":1080},[943,4906,1077],{"emptyLinePlaceholder":1076},[943,4908,4909],{"class":945,"line":1087},[943,4910,2968],{"class":1083},[943,4912,4913,4915,4917,4919,4921,4923,4925,4927,4929,4931,4933,4935,4937,4939,4941],{"class":945,"line":1949},[943,4914,2973],{"class":975},[943,4916,2879],{"class":957},[943,4918,2978],{"class":1057},[943,4920,2981],{"class":957},[943,4922,2984],{"class":1053},[943,4924,2987],{"class":1057},[943,4926,2990],{"class":957},[943,4928,2993],{"class":1057},[943,4930,2885],{"class":957},[943,4932,2944],{"class":957},[943,4934,2947],{"class":1053},[943,4936,3002],{"class":1057},[943,4938,3005],{"class":1057},[943,4940,3008],{"class":957},[943,4942,3011],{"class":1057},[943,4944,4945],{"class":945,"line":1954},[943,4946,1077],{"emptyLinePlaceholder":1076},[943,4948,4949],{"class":945,"line":1960},[943,4950,3020],{"class":1083},[943,4952,4953,4955,4957],{"class":945,"line":2295},[943,4954,1917],{"class":1053},[943,4956,3027],{"class":1057},[943,4958,3030],{"class":1057},[943,4960,4961],{"class":945,"line":2306},[943,4962,1077],{"emptyLinePlaceholder":1076},[943,4964,4965],{"class":945,"line":2402},[943,4966,3039],{"class":1083},[943,4968,4969,4971,4973,4975,4977,4979,4981],{"class":945,"line":2408},[943,4970,1917],{"class":1053},[943,4972,3027],{"class":1057},[943,4974,3048],{"class":1057},[943,4976,3051],{"class":1057},[943,4978,3054],{"class":1057},[943,4980,3057],{"class":1057},[943,4982,3060],{"class":1057},[943,4984,4985],{"class":945,"line":2414},[943,4986,1077],{"emptyLinePlaceholder":1076},[943,4988,4989],{"class":945,"line":1722},[943,4990,3091],{"class":1083},[943,4992,4993,4995],{"class":945,"line":2424},[943,4994,1189],{"class":1053},[943,4996,3099],{"class":1057},[943,4998,4999],{"class":945,"line":3083},[943,5000,1077],{"emptyLinePlaceholder":1076},[943,5002,5003],{"class":945,"line":3088},[943,5004,5005],{"class":1083},"# Starts automatically when your system boots\n",[943,5007,5008,5010,5012,5014],{"class":945,"line":3094},[943,5009,1917],{"class":1053},[943,5011,1920],{"class":1057},[943,5013,2047],{"class":1057},[943,5015,3080],{"class":1057},[2183,5017,5018],{"id":5018},"生成加密密钥",[429,5020,5021,5022,5024],{},"TREK使用一个专门的密钥来加密敏感数据。您可以使用以下命令或这个",[443,5023,3238],{"href":3237},"来生成加密密钥：",[935,5026,5028],{"className":1044,"code":5027,"language":1046,"meta":424,"style":424},"openssl rand -hex 32\n",[493,5029,5030],{"__ignoreMap":424},[943,5031,5032,5035,5038,5041],{"class":945,"line":946},[943,5033,5034],{"class":1053},"openssl",[943,5036,5037],{"class":1057}," rand",[943,5039,5040],{"class":1057}," -hex",[943,5042,5043],{"class":3477}," 32\n",[429,5045,5046],{},"请务必将其妥善保存在安全的地方。如果遗失该密钥，您将无法访问已加密的数据。",[2183,5048,5049],{"id":5049},"启动容器",[935,5051,5053],{"className":1044,"code":5052,"language":1046,"meta":424,"style":424},"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",[493,5054,5055,5067,5077,5087,5104,5120,5130,5139,5149],{"__ignoreMap":424},[943,5056,5057,5059,5061,5064],{"class":945,"line":946},[943,5058,1189],{"class":1053},[943,5060,4088],{"class":1057},[943,5062,5063],{"class":1057}," -d",[943,5065,5066],{"class":953}," \\\n",[943,5068,5069,5072,5075],{"class":945,"line":1073},[943,5070,5071],{"class":1057},"  --name",[943,5073,5074],{"class":1057}," trek",[943,5076,5066],{"class":953},[943,5078,5079,5082,5085],{"class":945,"line":1080},[943,5080,5081],{"class":1057},"  -p",[943,5083,5084],{"class":1057}," 3000:3000",[943,5086,5066],{"class":953},[943,5088,5089,5092,5095,5097,5100,5102],{"class":945,"line":1087},[943,5090,5091],{"class":1057},"  -e",[943,5093,5094],{"class":1057}," ENCRYPTION_KEY=",[943,5096,2885],{"class":957},[943,5098,5099],{"class":1057},"\u003Cgenerated_key>",[943,5101,2885],{"class":957},[943,5103,5066],{"class":953},[943,5105,5106,5108,5111,5113,5116,5118],{"class":945,"line":1949},[943,5107,5091],{"class":1057},[943,5109,5110],{"class":1057}," APP_URL=",[943,5112,2885],{"class":957},[943,5114,5115],{"class":1057},"https:\u002F\u002Ftrek.pafor.me",[943,5117,2885],{"class":957},[943,5119,5066],{"class":953},[943,5121,5122,5125,5128],{"class":945,"line":1954},[943,5123,5124],{"class":1057},"  -v",[943,5126,5127],{"class":1057}," .\u002Fdata:\u002Fapp\u002Fdata",[943,5129,5066],{"class":953},[943,5131,5132,5134,5137],{"class":945,"line":1960},[943,5133,5124],{"class":1057},[943,5135,5136],{"class":1057}," .\u002Fuploads:\u002Fapp\u002Fuploads",[943,5138,5066],{"class":953},[943,5140,5141,5144,5147],{"class":945,"line":2295},[943,5142,5143],{"class":1057},"  --restart",[943,5145,5146],{"class":1057}," unless-stopped",[943,5148,5066],{"class":953},[943,5150,5151],{"class":945,"line":2306},[943,5152,5153],{"class":1057},"  mauriceboe\u002Ftrek:latest\n",[483,5155,5156],{},[486,5157,5158,5164],{},[440,5159,5160,5161],{},"必须正确设置 ",[493,5162,5163],{},"APP_URL"," —— 因为MCP服务器的OAuth授权发现流程完全依赖于它。请在一开始就将其设置为您最终的公开HTTPS地址。",[429,5166,5167],{},"首次运行需要一些时间来拉取镜像：",[432,5169],{"src":5170,"alt":5171,"style":5172},"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;",[429,5174,5175],{},"验证容器是否成功运行：",[935,5177,5179],{"className":1044,"code":5178,"language":1046,"meta":424,"style":424},"docker ps\n",[493,5180,5181],{"__ignoreMap":424},[943,5182,5183,5185],{"class":945,"line":946},[943,5184,1189],{"class":1053},[943,5186,3748],{"class":1057},[432,5188],{"src":5189,"alt":5190,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-ps-status.webp","通过 docker ps 验证运行中的容器状态",[891,5192,5194],{"id":5193},"_2-使用caddy反向代理配置域名路由与ssl证书","2. 使用Caddy反向代理配置域名路由与SSL证书",[429,5196,5197],{},"通行密钥（Passkeys）功能和MCP所需的OAuth授权都强制要求HTTPS加密。我们的域名托管在提供免费SSL证书和DDoS保护的Cloudflare上。",[429,5199,5200],{},"我们将Caddy配置为安全的反向代理服务器，用来指向容器的3000端口。Caddyfile配置示例如下：",[935,5202,5206],{"className":5203,"code":5204,"language":5205,"meta":424,"style":424},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{$TREK_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:3000\n}\n","json",[493,5207,5208,5222,5227,5237],{"__ignoreMap":424},[943,5209,5210,5213,5216,5219],{"class":945,"line":946},[943,5211,5212],{"class":957},"{",[943,5214,5215],{"class":953},"$TREK_DOMAIN",[943,5217,5218],{"class":957},"}",[943,5220,5221],{"class":957}," {\n",[943,5223,5224],{"class":945,"line":1073},[943,5225,5226],{"class":953},"  encode zstd gzip\n",[943,5228,5229,5232,5234],{"class":945,"line":1080},[943,5230,5231],{"class":953},"  reverse_proxy host.docker.internal",[943,5233,1374],{"class":957},[943,5235,5236],{"class":3477},"3000\n",[943,5238,5239],{"class":945,"line":1087},[943,5240,3350],{"class":957},[891,5242,5244],{"id":5243},"_3-初始配置与安全的管理员设置","3. 初始配置与安全的管理员设置",[429,5246,5247],{},"创建管理员账户有两种方式：",[483,5249,5250,5262],{},[486,5251,5252,5261],{},[440,5253,5254,5255,1860,5258],{},"在环境配置中直接设置 ",[493,5256,5257],{},"ADMIN_EMAIL",[493,5259,5260],{},"ADMIN_PASSWORD"," 变量，系统将直接使用该凭证。",[486,5263,5264,5265,5268,5269,5272,5273,5276,5277,5280],{},"TREK会自动生成一个邮箱 ",[493,5266,5267],{},"admin@trek.local","、用户名 ",[493,5270,5271],{},"admin","，以及一个",[440,5274,5275],{},"随机生成的密码，并打印到容器日志中","。运行 ",[493,5278,5279],{},"docker logs trek"," 即可获取。",[429,5282,5283],{},"如果您在日志中找不到密码，可以通过以下命令进行手动重置：",[935,5285,5287],{"className":1044,"code":5286,"language":1046,"meta":424,"style":424},"docker exec -it -e RESET_ADMIN_EMAIL=admin@trek.local -e RESET_ADMIN_PASSWORD='YourNewPassword' trek node server\u002Freset-admin.js\n",[493,5288,5289],{"__ignoreMap":424},[943,5290,5291,5293,5295,5298,5301,5304,5306,5309,5311,5314,5316,5318,5321],{"class":945,"line":946},[943,5292,1189],{"class":1053},[943,5294,1195],{"class":1057},[943,5296,5297],{"class":1057}," -it",[943,5299,5300],{"class":1057}," -e",[943,5302,5303],{"class":1057}," RESET_ADMIN_EMAIL=admin@trek.local",[943,5305,5300],{"class":1057},[943,5307,5308],{"class":1057}," RESET_ADMIN_PASSWORD=",[943,5310,4052],{"class":957},[943,5312,5313],{"class":1057},"YourNewPassword",[943,5315,4052],{"class":957},[943,5317,5074],{"class":1057},[943,5319,5320],{"class":1057}," node",[943,5322,5323],{"class":1057}," server\u002Freset-admin.js\n",[429,5325,5326],{},"在首次登录时，系统会提示您修改初始密码。",[432,5328],{"src":5329,"alt":5330,"style":5331},"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;",[429,5333,2808,5334,5337,5338],{},[440,5335,5336],{},"Admin（管理员）"," 选项卡并更新您的电子邮箱：",[432,5339],{"src":5340,"alt":5341,"style":5342},"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;",[2183,5344,5346],{"id":5345},"_31-备份策略","3.1 备份策略",[429,5348,5349,5350],{},"在管理员后台，可以非常方便地配置带有保留策略的自动备份方案：\n",[432,5351],{"src":5352,"alt":5353,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-backup-retention-policy.webp","配置自动备份计划和保留规则",[2183,5355,5357],{"id":5356},"_32-将上传的文件存储到cloudflare-r2","3.2 将上传的文件存储到Cloudflare R2",[429,5359,5360],{},"将上传的文件、照片和备份数据保存在Cloudflare R2中，能够让您的VPS磁盘保持干净和轻量。TREK全面支持S3兼容的存储后端，而Cloudflare R2正是这一需求的完美解决方案。",[531,5362,5363,5370,5382,5392,5403,5415,5426,5441],{},[486,5364,5365,5366,5369],{},"新建一个名为 ",[493,5367,5368],{},"trek"," 的R2存储桶。",[486,5371,3837,5372,5375,5376,5377],{},[440,5373,5374],{},"Account Details（账户详情）"," 区域，找到您的账户ID：","\n  ",[432,5378],{"src":5379,"alt":5380,"style":5381},"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;",[486,5383,2808,5384,491,5376,5387],{},[440,5385,5386],{},"Manage API Tokens（管理API令牌）",[432,5388],{"src":5389,"alt":5390,"style":5391},"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;",[486,5393,2808,5394,5397,5376,5398],{},[440,5395,5396],{},"Create Account API token（创建账户API令牌）","，并授予针对该桶的读写权限：",[432,5399],{"src":5400,"alt":5401,"style":5402},"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;",[486,5404,5405,5406,5409,5376,5410],{},"在管理员面板中，点击 ",[440,5407,5408],{},"Storage（存储）"," 配置页：",[432,5411],{"src":5412,"alt":5413,"style":5414},"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;",[486,5416,2808,5417,5420,5376,5421],{},[440,5418,5419],{},"Add Backend（添加后端）"," 按钮，填入您的Endpoint（终结点）、Bucket（存储桶名称）和API凭证：",[432,5422],{"src":5423,"alt":5424,"style":5425},"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;",[486,5427,2808,5428,5431,5432,5435,5376,5436],{},[440,5429,5430],{},"Apply（应用）","，然后点击 ",[440,5433,5434],{},"Test（测试）"," 链接。当看到“Connection OK”字样时，说明连接测试成功：",[432,5437],{"src":5438,"alt":5439,"style":5440},"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;",[486,5442,5443,5444,491,5376,5447],{},"将所有存储类别切换为Cloudflare R2并点击 ",[440,5445,5446],{},"Save changes（保存修改）",[432,5448],{"src":5449,"alt":5450,"style":5451},"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;",[2183,5453,5455],{"id":5454},"_33-通行密钥passkey登录","3.3 通行密钥（Passkey）登录",[429,5457,5458],{},"TREK支持通行密钥、双重身份验证（2FA）以及基于OIDC的单点登录。如果想开启通行密钥，请在设置中输入您的域名和Allowed Origins（允许的源），然后保存即可：",[432,5460],{"src":5461,"alt":5462,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-passkey-allowed-origins-settings.webp","注册用于安全金钥（Passkey）身份验证的允许源",[429,5464,5465,5466,5469],{},"如果没有正确配置 ",[440,5467,5468],{},"Allowed Origins","，通行密钥注册将会失败。",[2183,5471,5473],{"id":5472},"_34-google-maps-api密钥","3.4 Google Maps API密钥",[429,5475,5476],{},"配置Google Maps密钥可以让您的地点检索功能变得更丰富，自动补充评分、营业时间和地点实景图。如果您不配置密钥，TREK会默认降级使用免费的OpenStreetMap（只是不显示评分和实景照片）。",[429,5478,5479,5480,5485,5486,5489,5490],{},"访问此",[443,5481,5484],{"href":5482,"rel":5483},"https:\u002F\u002Fmapsplatform.google.com\u002Fmaps-demo-key\u002F",[447],"链接","并点击 ",[440,5487,5488],{},"Get demo key"," 即可申请一个测试密钥：                                                  ",[432,5491],{"src":5492,"alt":5493,"style":5494},"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;",[429,5496,5497,5498,5501,5502],{},"将获取到的API Key粘贴到设置中，然后点击 ",[440,5499,5500],{},"Test"," 验证连接是否通畅：\n",[432,5503],{"src":5504,"alt":5505,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-key-test-connection.webp","在设置中验证 Google Maps API 密钥的连通性",[2183,5507,5509],{"id":5508},"_35-ai集成","3.5 AI集成",[429,5511,5512],{},"内置的AI解析引擎主要用于处理您的预订确认邮件和PDF，将它们自动转换为结构化的预订数据。",[429,5514,5515,5516,5519,5520,5523],{},"点击左侧菜单中的 ",[440,5517,5518],{},"Addons（附加组件）"," 并启用 ",[440,5521,5522],{},"AI Parsing","。选择“OpenAI”（或其它兼容的AI提供商）并填写相应的凭证信息：",[432,5525],{"src":5526,"alt":5527,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-ai-parsing-openai.webp","启用带有 OpenAI 集成的 AI 解析插件",[2183,5529,5531],{"id":5530},"_36-mcp访问权限","3.6 MCP访问权限",[429,5533,5534,5535,5538,5539,5542],{},"同样在 ",[440,5536,5537],{},"Addons"," 选项中，开启 ",[440,5540,5541],{},"MCP"," 协议：",[432,5544],{"src":5545,"alt":5546,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-mcp.webp","启用 Model Context Protocol MCP 服务器插件",[2183,5548,5550],{"id":5549},"_37-插件推荐","3.7 插件推荐",[429,5552,5553],{},"以下几款官方插件非常推荐您顺手激活：",[432,5555],{"src":5556,"alt":5557,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-recommended-addons-plugins-activation.webp","活跃的推荐插件和扩展列表",[2183,5559,5561],{"id":5560},"_38-创建您的日常使用账户","3.8 创建您的日常使用账户",[429,5563,5564],{},"在平时规划旅行时，建议使用普通用户账户，而非管理员账户。让我们在后台创建一个日常账户并登录：",[432,5566],{"src":5567,"alt":5568,"style":5569},"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;",[429,5571,5572],{},"登录后，建议立刻绑定通行密钥或设置2FA来强化该账户的安全级别：",[432,5574],{"src":5575,"alt":5576,"style":5577},"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;",[429,5579,2808,5580,5583],{},[440,5581,5582],{},"+ Add a passkey","，输入当前密码，然后按照浏览器提示完成安全确认：",[432,5585],{"src":5586,"alt":5587,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-passkey-confirm-password.webp","确认密码以注册新的硬件安全金钥",[891,5589,5591],{"id":5590},"_4-测试您的部署导入历史出行数据","4. 测试您的部署：导入历史出行数据",[429,5593,5594],{},"快速上手并熟悉TREK系统的一个极佳方式是，将您过去走过的旅行足迹录入其中。",[2183,5596,5598],{"id":5597},"_41-创建旅行计划","4.1 创建旅行计划",[429,5600,2808,5601,5604,5605,1860,5608,491],{},[440,5602,5603],{},"+ New Trip（新建旅行）","，并根据那次历史旅行的真实起止时间设定 ",[440,5606,5607],{},"Start Date",[440,5609,5610],{},"End Date",[432,5612],{"src":5613,"alt":5614,"style":5615},"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;",[429,5617,5618,5619,491],{},"上传一张好看的封面图（可以直接将图片拖入或从剪贴板粘贴），接着点击 ",[440,5620,5621],{},"Create New Trip",[432,5623],{"src":5624,"alt":5625,"style":5626},"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;",[2183,5628,5630],{"id":5629},"_42-导入预订信息","4.2 导入预订信息",[429,5632,5633],{},"将您当时留存的机票、火车票和其它交通工具预订确认文件直接拖放到上传区域：",[432,5635],{"src":5636,"alt":5637,"style":5638},"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;",[432,5640],{"src":5641,"alt":5642,"style":5643},"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;",[429,5645,5646],{},"由于我们已经启用了AI解析引擎，预订确认PDF文件会被自动分析，提取出结构化的预订日程。",[429,5648,5649,5650,5653],{},"检查解析结果无误后，点击 ",[440,5651,5652],{},"Add"," 将其正式写入预订数据中：",[432,5655],{"src":5656,"alt":5657,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-review-parsed-booking-details.webp","审查由 AI 提取的结构化预订细节",[429,5659,5660],{},"如果有些预订确认仅保存在邮件中，您可以将其导出为PDF格式并上传，同样可以走这套提取流程。",[429,5662,5663],{},"在系统中，已导入的预订信息会以极具现代感的方式呈现：",[429,5665,5666,5670],{},[432,5667],{"src":5668,"alt":5669,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-bookings-timeline-view.webp","旅行预订的完整时间线展示",[432,5671],{"src":5672,"alt":5673,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-booking-confirmation-details.webp","已确认交通预订的详细视图",[429,5675,3837,5676,5679],{},[440,5677,5678],{},"Plan（日程规划）"," 页面中，所有的酒店和住宿点都会在地图上被优雅地标注出来：",[432,5681],{"src":5682,"alt":5683,"style":5684},"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;",[429,5686,5687,5688,5691],{},"点击上方的 ",[440,5689,5690],{},"Atlas（旅行足迹）","，您将能从清单和世界地图上直观地看到所有已拜访的国家：",[432,5693],{"src":5694,"alt":5695,"style":5696},"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;",[2183,5698,5700],{"id":5699},"_43-添加旅行同伴","4.3 添加旅行同伴",[429,5702,2808,5703,5706],{},[440,5704,5705],{},"Share（分享）"," 按钮：",[432,5708],{"src":5709,"alt":5710,"style":5711},"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;",[429,5713,5714],{},"在弹出的对话框底部，可以直接添加旅行同伴为Guest（嘉宾）：",[432,5716],{"src":5717,"alt":5718,"style":5719},"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;",[2183,5721,5723],{"id":5722},"_44-记录旅行费用","4.4 记录旅行费用",[429,5725,2808,5726,5729],{},[440,5727,5728],{},"Add expense（添加开销）","，来记录那些无法通过PDF预订单自动解析的杂项支出，例如境外险、当地公共交通费、临时SIM卡等：",[432,5731],{"src":5732,"alt":5733,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-custom-expense-form.webp","在支出表单中输入详细的花费数据",[432,5735],{"src":5736,"alt":5737,"style":5738},"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;",[2183,5740,5742],{"id":5741},"_45-拆分旅行阶段","4.5 拆分旅行阶段",[429,5744,5745],{},"该功能需要提前在后台激活“Trip Segment”插件。",[429,5747,5748],{},"对于那些超长周期的旅程，将其拆分为不同的阶段能让脉络更清晰，每个阶段都可以有自己独立的预订项目、待办事项和成本账单：",[432,5750],{"src":5751,"alt":5752,"style":5753},"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;",[432,5755],{"src":5756,"alt":5757,"style":5758},"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;",[432,5760],{"src":5761,"alt":5762,"style":5763},"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;",[2183,5765,5767],{"id":5766},"_46-创建journal日志并查看旅行足迹atlas","4.6 创建Journal（日志）并查看旅行足迹（Atlas）",[429,5769,5770,5771,5774],{},"您还可以将几次旅行串联成一个 ",[440,5772,5773],{},"Journey（旅程）","，并图文并茂地撰写游记故事，方便分享给您的朋友们：",[432,5776],{"src":5777,"alt":5778,"style":5779},"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;",[432,5781],{"src":5782,"alt":5783,"style":5784},"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;",[432,5786],{"src":5787,"alt":5788,"style":5789},"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;",[432,5791],{"src":5792,"alt":5793,"style":5794},"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;",[891,5796,5798],{"id":5797},"_5-设计自定义行程与行李清单","5. 设计自定义行程与行李清单",[429,5800,2808,5801,5804],{},[440,5802,5803],{},"+ New Trip","，输入旅行的专属名称并指定起止日期：",[432,5806],{"src":5807,"alt":5808,"style":5809},"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;",[429,5811,5812,5815],{},[440,5813,5814],{},"如果具体的出行时间还没有敲定，可以将日期项留空。"," 此时系统会显示一个“天数配置（最高支持365天）”字段，您可以先设计每日的游玩内容，等后续买好机票后再一键锚定日期。",[2183,5817,5819],{"id":5818},"_51-添加地点景点","5.1 添加地点\u002F景点",[429,5821,5822],{},"这是旅行规划中最耗时的一步，但TREK提供了四种极具效率的方式来帮助您添加地点：",[432,5824],{"src":5825,"alt":5826,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-places-methods-overview.webp","向行程添加新地点的多种途径",[429,5828,5829,5832],{},[440,5830,5831],{},"1. 直接在地图上右键点击："," 会在该坐标处直接创建新地点，其标准地址会被系统自动逆地理编码解析出来：",[432,5834],{"src":5835,"alt":5836,"style":5837},"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;",[432,5839],{"src":5840,"alt":5841,"style":5842},"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;",[429,5844,5845,5848],{},[440,5846,5847],{},"2. 点击 + Add Place\u002FActivity："," 在搜索框中直接通过关键字进行检索",[432,5850],{"src":5851,"alt":5852,"style":5853},"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;",[432,5855],{"src":5856,"alt":5857,"style":5858},"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;",[432,5860],{"src":5861,"alt":5862,"style":5863},"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;",[429,5865,5866,5869,5870,5873,5874,5877],{},[440,5867,5868],{},"3. 直接粘贴谷歌地图分享链接："," （如 ",[493,5871,5872],{},"maps.app.goo.gl\u002F…"," 或 ",[493,5875,5876],{},"maps.google.com\u002F…","）粘贴到检索栏中。TREK会自动抓取该地点的名称、地址和经纬度：",[432,5879],{"src":5880,"alt":5881,"style":5440},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-paste-google-maps-share-link.webp","直接从粘贴的 Google 地图分享链接解析地点",[432,5883],{"src":5884,"alt":5885,"style":5886},"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;",[429,5888,5889,5892,5893,5896,5897,5873,5900,5903,5904,5907],{},[440,5890,5891],{},"4. 批量导入数据："," 这是最轻松的方案。如果您在Google Maps中维护着自己的“想去清单”，可以将其导出为 ",[493,5894,5895],{},".gpx"," 文件（",[493,5898,5899],{},".kml",[493,5901,5902],{},".kmz"," 格式亦支持），然后点击右侧面板的 ",[440,5905,5906],{},"Import file","，一键拉取所有数据：",[432,5909],{"src":5910,"alt":5911,"style":5912},"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;",[429,5914,5915],{},"推荐您可以先把所有感兴趣的项目都添加进来。至于如何将它们科学地归入到每一天的日程中，后续可以直接在面板里拖拽处理。",[2183,5917,5919],{"id":5918},"_52-每日日程与备注","5.2 每日日程与备注",[429,5921,5922],{},"Day Plan（每日计划）的核心逻辑是将所有的目的地按每日访问顺序进行排序。整个界面是一个可以折叠、支持任意拖放的模块：",[432,5924],{"src":5925,"alt":5926,"style":5927},"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;",[429,5929,5930],{},"这些细节机制设计得极其精妙实用：",[483,5932,5933,5943,5953,5963],{},[486,5934,5935,5938,5939],{},[440,5936,5937],{},"中间移动方式","：点击每日日程左上角的公共汽车图标，可以设定各节点之间的过渡交通方式（如地铁、自驾、甚至是直达航班）：\n",[432,5940],{"src":5941,"alt":5942,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-commuting-transport-button.webp","登记日行程各段之间的通勤交通方式",[486,5944,5945,5948,5949],{},[440,5946,5947],{},"每日备忘","：点击左下角的便签图标可以附加各种定制化提醒（例如：“今天需要提早出发”、“美术馆门票需提前预约”）：\n",[432,5950],{"src":5951,"alt":5952,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-icon-tagged-notes-button.webp","为天行程添加显眼的、带有图标的自定义备注",[486,5954,5955,5958,5959],{},[440,5956,5957],{},"指定时间段","：从右侧拖拽地点并给它分配一个开始时间。设置了时间的地点会自动在地图上生成推荐的行进路线：\n",[432,5960],{"src":5961,"alt":5962,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-timed-places-routing.webp","带时间点的地点之间自动计算的交通路线",[486,5964,5965,5966,5969,5970,5973,5974,1808],{},"关于智能路线优化（",[440,5967,5968],{},"Route optimisation","）以及气候（",[440,5971,5972],{},"Weather","），您可以查阅 ",[443,5975,5978],{"href":5976,"rel":5977},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FDay-Plans-and-Notes",[447],"Day Plans and Notes的Wiki文档",[2183,5980,5982],{"id":5981},"_53-收藏夹可重复使用的地点清单","5.3 收藏夹：可重复使用的地点清单",[429,5984,5985,5986,5989],{},"Collections（收藏夹）允许用户在具体的旅行项目之外，保存并分类管理自己精心收集的宝藏地点。您可以将其打包分享给朋友。这些地点在加入旅行时是采用",[440,5987,5988],{},"复制","的方式，因此在旅行日程中对其进行的任何个性化标注，都不会破坏您收藏夹里的原始干净数据。",[429,5991,5992,5993,491],{},"点击顶部菜单栏中的 ",[440,5994,5995],{},"Collections",[432,5997],{"src":5998,"alt":5999,"style":6000},"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;",[429,6002,2808,6003,6006],{},[440,6004,6005],{},"+ New list"," 建立新的分类列表：",[432,6008],{"src":6009,"alt":6010,"style":6011},"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;",[429,6013,2808,6014,6017],{},[440,6015,6016],{},"+ Add a place"," 并填入该地点的详细情况：",[432,6019],{"src":6020,"alt":6021,"style":6022},"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;",[429,6024,6025,6028],{},[440,6026,6027],{},"注意："," 收藏夹内的搜索组件偶尔可能会因网络原因失效，如果发生该情况，您可以通过手动输入来创建。",[429,6030,6031],{},"当地点带有准确的GPS坐标时，它们会精美地展示在地图中：",[432,6033],{"src":6034,"alt":6035,"style":6036},"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;",[429,6038,6039,6040,6043],{},"如需批量组织这些地标，可以点击 ",[440,6041,6042],{},"checkbox（勾选框）"," 图标：",[432,6045],{"src":6046,"alt":6047,"style":6048},"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;",[429,6050,6051,6052,491],{},"多选目标后，点击 ",[440,6053,6054],{},"Assign label（分配标签）",[432,6056],{"src":6057,"alt":6058,"style":5886},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-group-assign-label.webp","为选定的收藏地点分配描述性标签",[429,6060,6061,6062,6065],{},"在分配之前，先点击 ",[440,6063,6064],{},"Manage labels（管理标签）"," 来新建一些醒目的彩色分组标签：",[432,6067],{"src":6068,"alt":6069,"style":6070},"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;",[429,6072,6073],{},"点击一个具体标签，接着选择一键绑定：",[432,6075],{"src":6076,"alt":6077,"style":5696},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-confirm-label-selection.webp","应用自定义标签到成组的地点",[2183,6079,6081],{"id":6080},"_54-费用与预算","5.4 费用与预算",[429,6083,3837,6084,6087],{},[440,6085,6086],{},"Costs（财务管理）"," 页面中，我们可以录入其它的预备预算和旅途支出。",[432,6089],{"src":6090,"alt":6091,"style":5927},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-budget-overall-expenses-list.webp","完整的支出表格和余额结算账本",[429,6093,6094],{},"在结伴出行时，您可以在此页记录每个人的垫付账单，并选定分摊规则。",[429,6096,6097,6098,6101],{},"系统的结算后台采用了一种贪心匹配算法，计算并生成",[440,6099,6100],{},"最简化的转账精算方案","，帮大家用最少的转账次数轻松对齐账目。",[891,6103,6105],{"id":6104},"_6-利用model-context-protocolmcp实现ai驱动的旅行规划","6. 利用Model Context Protocol（MCP）实现AI驱动的旅行规划",[429,6107,6108,6109,6112],{},"TREK内置了 ",[440,6110,6111],{},"MCP（模型上下文协议）服务器","。这意味着，AI智能体可以直接“读写”您的行程规划数据。它提供了超过150个精细的原子工具和30个核心数据源，全方位覆盖行程、地点、账目、行李、预订和多人协作。",[2183,6114,6116],{"id":6115},"_61-cloudflare-zero-trust网络配置","6.1 Cloudflare Zero Trust网络配置",[429,6118,6119,6120,6122,6123,1808],{},"由于我们的自托管服务运行在 ",[443,6121,1750],{"href":363}," 内网环境下，我们需要在“Split Tunnels（分流隧道）”配置中，将该服务的域名加入到 Inclusion List（包含\u002F直连白名单）中。否则在进行 OAuth 登录授权发现时，接口调用会被网络策略阻断。具体的配置排障可以参考这个 GitHub 讨论贴：",[443,6124,6127],{"href":6125,"rel":6126},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fissues\u002F1463",[447],"GitHub Issue",[462,6129],{"description":2628,"image":2629,"image-alt":2630,"label":2788,"min-read":1285,"title":1735,"to":363},[432,6131],{"src":6132,"alt":6133,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-zero-trust-split-tunnels-domain.webp","向 Cloudflare Warp 分流隧道（Split Tunnels）添加自定义域名",[2183,6135,6137],{"id":6136},"_62-claude-desktop客户端配置","6.2 Claude Desktop客户端配置",[429,6139,2808,6140,6143,6144],{},[440,6141,6142],{},"+ New Client"," 创设一个新的 AI 客户端接口：\n",[432,6145],{"src":6146,"alt":6147,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-register-new-mcp-client.webp","在设置中注册新的自定义客户端令牌",[429,6149,6150,6151,6154,6155,491],{},"选择 ",[440,6152,6153],{},"Claude Desktop"," 选项卡，然后点击 ",[440,6156,6157],{},"Register Client（注册客户端）",[432,6159],{"src":6160,"alt":6161,"style":6162},"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;",[429,6164,6165,6166,6169],{},"系统此时会展示唯一的 Client ID 和 Client Secret，请妥善保存。接着点击 ",[440,6167,6168],{},"Client Configuration（客户端配置）"," 调出我们需要在本地写入的 JSON 代码片段：",[432,6171],{"src":6172,"alt":6173,"style":6174},"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;",[429,6176,6177,6178,6181],{},"在 Claude Desktop 软件中，点击 ",[440,6179,6180],{},"Edit Config"," 会在代码编辑器中打开您本地的 MCP server 配置文件：",[432,6183],{"src":6184,"alt":6185,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-config-json.webp","编辑 Claude Desktop 的本地 MCP 配置文件 json",[429,6187,6188],{},"将 TREK 的 MCP 代码块粘贴进去，并把占位符部分替换为上一步生成的客户端凭证：",[935,6190,6192],{"className":5203,"code":6191,"language":5205,"meta":424,"style":424},"  \"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",[493,6193,6194,6209,6222,6244,6258,6270,6281,6292,6337,6342,6347],{"__ignoreMap":424},[943,6195,6196,6199,6202,6204,6207],{"class":945,"line":946},[943,6197,6198],{"class":957},"  \"",[943,6200,6201],{"class":1057},"mcpServers",[943,6203,2885],{"class":957},[943,6205,6206],{"class":953},": ",[943,6208,3336],{"class":957},[943,6210,6211,6214,6216,6218,6220],{"class":945,"line":1073},[943,6212,6213],{"class":957},"    \"",[943,6215,5368],{"class":949},[943,6217,2885],{"class":957},[943,6219,1374],{"class":957},[943,6221,5221],{"class":957},[943,6223,6224,6227,6230,6232,6234,6236,6239,6241],{"class":945,"line":1080},[943,6225,6226],{"class":957},"      \"",[943,6228,6229],{"class":1053},"command",[943,6231,2885],{"class":957},[943,6233,1374],{"class":957},[943,6235,2879],{"class":957},[943,6237,6238],{"class":1057},"npx",[943,6240,2885],{"class":957},[943,6242,6243],{"class":957},",\n",[943,6245,6246,6248,6251,6253,6255],{"class":945,"line":1087},[943,6247,6226],{"class":957},[943,6249,6250],{"class":1053},"args",[943,6252,2885],{"class":957},[943,6254,1374],{"class":957},[943,6256,6257],{"class":957}," [\n",[943,6259,6260,6263,6266,6268],{"class":945,"line":1949},[943,6261,6262],{"class":957},"        \"",[943,6264,6265],{"class":1057},"mcp-remote",[943,6267,2885],{"class":957},[943,6269,6243],{"class":957},[943,6271,6272,6274,6277,6279],{"class":945,"line":1954},[943,6273,6262],{"class":957},[943,6275,6276],{"class":1057},"https:\u002F\u002Ftrek.pafor.me\u002Fmcp",[943,6278,2885],{"class":957},[943,6280,6243],{"class":957},[943,6282,6283,6285,6288,6290],{"class":945,"line":1960},[943,6284,6262],{"class":957},[943,6286,6287],{"class":1057},"--static-oauth-client-info",[943,6289,2885],{"class":957},[943,6291,6243],{"class":957},[943,6293,6294,6296,6298,6301,6304,6306,6308,6310,6313,6315,6317,6319,6322,6324,6326,6328,6331,6333,6335],{"class":945,"line":2295},[943,6295,6262],{"class":957},[943,6297,5212],{"class":1057},[943,6299,6300],{"class":953},"\\\"",[943,6302,6303],{"class":1057},"client_id",[943,6305,6300],{"class":953},[943,6307,6206],{"class":1057},[943,6309,6300],{"class":953},[943,6311,6312],{"class":1057},"\u003Cyour_client_id>",[943,6314,6300],{"class":953},[943,6316,875],{"class":1057},[943,6318,6300],{"class":953},[943,6320,6321],{"class":1057},"client_secret",[943,6323,6300],{"class":953},[943,6325,6206],{"class":1057},[943,6327,6300],{"class":953},[943,6329,6330],{"class":1057},"\u003Cyour_client_secret>",[943,6332,6300],{"class":953},[943,6334,5218],{"class":1057},[943,6336,1981],{"class":957},[943,6338,6339],{"class":945,"line":2306},[943,6340,6341],{"class":957},"      ]\n",[943,6343,6344],{"class":945,"line":2402},[943,6345,6346],{"class":957},"    }\n",[943,6348,6349,6352],{"class":945,"line":2408},[943,6350,6351],{"class":957},"  }",[943,6353,6243],{"class":953},[429,6355,6356],{},"重新启动 Claude Desktop 客户端。此时在 Local MCP servers（本地MCP服务）列表中就会看到 TREK 已经成功连接：",[432,6358],{"src":6359,"alt":6360,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-trek-server-connected.webp","在 Claude 界面中验证活跃的 TREK 连接状态",[429,6362,6363],{},"现在，您可以直接用日常口语来下达规划指令了：",[432,6365],{"src":6366,"alt":6367,"style":6368},"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;",[429,6370,6371],{},"例如，我们用纯中文录入一笔非标准化的日常开支：",[935,6373,6376],{"className":6374,"code":6375,"language":3210,"meta":424},[3208],"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",[493,6377,6375],{"__ignoreMap":424},[432,6379],{"src":6380,"alt":6381,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-expense-response.webp","Claude 调用工具自动记录一笔支出",[429,6383,6384,6385,6388],{},"回到后台，刷新 ",[440,6386,6387],{},"Costs"," 面板。我们可以看到这笔打车费用已经被精确地记录下来，且因为命令中并未提及“由谁付款”，系统体贴地将付款人项归纳为了“No one paid yet（尚未有人支付）”：",[432,6390],{"src":6391,"alt":6392,"style":5342},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-page-mcp-parsed-expense.webp","在费用视图中确认最新由 AI 解析的支出",[429,6394,6395],{},"管理行李清单的方式也完全一致：",[432,6397],{"src":6398,"alt":6399,"style":6400},"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;",[429,6402,6403,6404,6407],{},"再次刷新 ",[440,6405,6406],{},"Packing List"," 页面，指定的这三样出行装备已经被整齐地加入到了清单之中：",[432,6409],{"src":6410,"alt":6411,"style":6412},"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;",[2183,6414,6416],{"id":6415},"_63-gemini-cli动态注册","6.3 Gemini CLI（动态注册）",[429,6418,6419,6420,6423,6424,2224],{},"Gemini CLI 对 ",[440,6421,6422],{},"Dynamic Registration（动态注册机制）"," 提供了极佳的支持，这使得您完全无需在系统后台手动预注册任何客户端凭证。直接将以下代码追加到您本地的 ",[493,6425,6426],{},".gemini\u002Fsettings.json",[935,6428,6430],{"className":5203,"code":6429,"language":5205,"meta":424,"style":424},"    \"trek\": {\n      \"httpUrl\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[493,6431,6432,6444,6463,6476,6489,6494],{"__ignoreMap":424},[943,6433,6434,6436,6438,6440,6442],{"class":945,"line":946},[943,6435,6213],{"class":957},[943,6437,5368],{"class":1057},[943,6439,2885],{"class":957},[943,6441,6206],{"class":953},[943,6443,3336],{"class":957},[943,6445,6446,6448,6451,6453,6455,6457,6459,6461],{"class":945,"line":1073},[943,6447,6226],{"class":957},[943,6449,6450],{"class":949},"httpUrl",[943,6452,2885],{"class":957},[943,6454,1374],{"class":957},[943,6456,2879],{"class":957},[943,6458,6276],{"class":1057},[943,6460,2885],{"class":957},[943,6462,6243],{"class":957},[943,6464,6465,6467,6470,6472,6474],{"class":945,"line":1080},[943,6466,6226],{"class":957},[943,6468,6469],{"class":949},"oauth",[943,6471,2885],{"class":957},[943,6473,1374],{"class":957},[943,6475,5221],{"class":957},[943,6477,6478,6480,6483,6485,6487],{"class":945,"line":1087},[943,6479,6262],{"class":957},[943,6481,6482],{"class":1053},"enabled",[943,6484,2885],{"class":957},[943,6486,1374],{"class":957},[943,6488,1396],{"class":957},[943,6490,6491],{"class":945,"line":1949},[943,6492,6493],{"class":957},"      }\n",[943,6495,6496],{"class":945,"line":1954},[943,6497,6346],{"class":957},[429,6499,6500,6501,6504,6505,6508,6509],{},"在终端运行 ",[493,6502,6503],{},"gemini"," 命令，并在随后拉起的网页授权页面中点击 ",[440,6506,6507],{},"Approve（批准）"," 即可：\n",[432,6510],{"src":6511,"alt":6512,"style":6513},"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;",[429,6515,6516],{},"现在便可以通过极简的命令行终端向 AI 提问了：",[432,6518],{"src":6519,"alt":6520,"style":6521},"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;",[432,6523],{"src":6524,"alt":6525,"style":5789},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-display-itinerary.webp","Gemini CLI 成功展示结构化的旅行信息",[2183,6527,6529],{"id":6528},"_64-kimi-cli动态注册","6.4 Kimi CLI（动态注册）",[429,6531,6532,6533,6536,6537,6540],{},"原理基本相同。请在本地 ",[493,6534,6535],{},"\u002FUsers\u002F\u003C您的用户名>\u002F.kimi\u002F"," 目录下找到 ",[493,6538,6539],{},"mcp.json"," 并写入以下连接配置：",[935,6542,6544],{"className":5203,"code":6543,"language":5205,"meta":424,"style":424},"    \"trek\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"auth\": \"oauth\"\n    }\n",[493,6545,6546,6558,6578,6596,6613],{"__ignoreMap":424},[943,6547,6548,6550,6552,6554,6556],{"class":945,"line":946},[943,6549,6213],{"class":957},[943,6551,5368],{"class":1057},[943,6553,2885],{"class":957},[943,6555,6206],{"class":953},[943,6557,3336],{"class":957},[943,6559,6560,6562,6565,6567,6569,6571,6574,6576],{"class":945,"line":1073},[943,6561,6226],{"class":957},[943,6563,6564],{"class":949},"type",[943,6566,2885],{"class":957},[943,6568,1374],{"class":957},[943,6570,2879],{"class":957},[943,6572,6573],{"class":1057},"http",[943,6575,2885],{"class":957},[943,6577,6243],{"class":957},[943,6579,6580,6582,6584,6586,6588,6590,6592,6594],{"class":945,"line":1080},[943,6581,6226],{"class":957},[943,6583,874],{"class":949},[943,6585,2885],{"class":957},[943,6587,1374],{"class":957},[943,6589,2879],{"class":957},[943,6591,6276],{"class":1057},[943,6593,2885],{"class":957},[943,6595,6243],{"class":957},[943,6597,6598,6600,6603,6605,6607,6609,6611],{"class":945,"line":1087},[943,6599,6226],{"class":957},[943,6601,6602],{"class":949},"auth",[943,6604,2885],{"class":957},[943,6606,1374],{"class":957},[943,6608,2879],{"class":957},[943,6610,6469],{"class":1057},[943,6612,1981],{"class":957},[943,6614,6615],{"class":945,"line":1949},[943,6616,6346],{"class":957},[429,6618,6619,6620,6623,6624,6627,6628],{},"在终端执行 ",[493,6621,6622],{},"kimi mcp auth trek"," 并在网页上点击 ",[440,6625,6626],{},"Approve"," 完成快速授权：\n",[432,6629],{"src":6511,"alt":6512,"style":6630},"max-width: 453px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,6632,6633],{},"完成授权后，您将能够在命令行直接调用所有关联的微服务工具：",[432,6635],{"src":6636,"alt":6637,"style":5172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fkimi-cli-mcp-authorized-tools-list.webp","授权成功后 Kimi CLI 显示的可用工具列表",[891,6639,6641],{"id":6640},"_7-移动端使用体验","7. 移动端使用体验",[429,6643,6644],{},"在手机和移动设备上，TREK是以 PWA（渐进式Web应用）的形式呈现的。其内置的 Service Worker 能够将地图网格瓦片和日程 API 数据离线缓存，确保在野外或没有网络信号的极佳状态下，您依然能够流畅查看已制定的全部行程。不过，离线状态下的推送通知响应速度相较原生应用会有微小的延迟。",[891,6646,6647],{"id":6647},"写在最后",[429,6649,6650],{},"通过 MCP 将 AI 智能体接入您的日常旅行规划，可以帮您省去那些因手动键入繁多的航班和酒店确认单而产生的大量枯燥劳动。不仅如此，AI 还能根据您指定的具体出行节点和所处季节，智能推荐周边的特色景点。仅仅通过几句随意的对话，AI 就能轻松打通从前期灵感检索、行程路线设计，再到后期预算拆分和行李打包的完整全链路。",[429,6652,6653],{},"不过在目前的版本中，依然存在一些微小的体验瑕疵。例如：通过 PDF 智能解析导入订单时，账单货币会默认对齐到旅行项目的主货币，而不是当时实际刷卡结算的付款货币。此外，在 Collections 收藏夹中新建清单列表时，如果在列表尚未保存时就给它配置封面，该封面可能在保存后失效（您需要在列表正式建立后，点击“编辑”来重新添加并保存，即可解决）。",[429,6655,6656,6657,6662],{},"此外，因为它需要您拥有一定的 VPS 运维基础来亲自运行这套程序，对一般用户确实存在一些上手门槛。TREK 更适合那些重度旅行爱好者、数字游民以及对于自身出行数据隐私和排版有着高水准要求的极客用户。我们由衷地建议您在下定决心搭建自托管服务之前，可以先在 ",[443,6658,6661],{"href":6659,"rel":6660},"https:\u002F\u002Fdemo.liketrek.com\u002F",[447],"demo.liketrek.com"," 上完整试用一下官方提供的公测 DEMO，看它是否切中您的日常痛点。",[891,6664,6666],{"id":6665},"参考资料","参考资料:",[483,6668,6669,6676,6683],{},[486,6670,6671],{},[443,6672,6675],{"href":6673,"rel":6674},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FQuick-Start",[447],"TREK Quick Start",[486,6677,6678],{},[443,6679,6682],{"href":6680,"rel":6681},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FTroubleshooting",[447],"TREK Troubleshooting",[486,6684,6685],{},[443,6686,6689],{"href":6687,"rel":6688},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FMCP-Scopes",[447],"TREK MCP Scopes",[1666,6691,6692],{},"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":424,"searchDepth":1073,"depth":1080,"links":6694},[6695,6700,6701,6711,6719,6725,6731,6732,6733],{"id":4868,"depth":1080,"text":4869,"children":6696},[6697,6698,6699],{"id":4872,"depth":1087,"text":4873},{"id":5018,"depth":1087,"text":5018},{"id":5049,"depth":1087,"text":5049},{"id":5193,"depth":1080,"text":5194},{"id":5243,"depth":1080,"text":5244,"children":6702},[6703,6704,6705,6706,6707,6708,6709,6710],{"id":5345,"depth":1087,"text":5346},{"id":5356,"depth":1087,"text":5357},{"id":5454,"depth":1087,"text":5455},{"id":5472,"depth":1087,"text":5473},{"id":5508,"depth":1087,"text":5509},{"id":5530,"depth":1087,"text":5531},{"id":5549,"depth":1087,"text":5550},{"id":5560,"depth":1087,"text":5561},{"id":5590,"depth":1080,"text":5591,"children":6712},[6713,6714,6715,6716,6717,6718],{"id":5597,"depth":1087,"text":5598},{"id":5629,"depth":1087,"text":5630},{"id":5699,"depth":1087,"text":5700},{"id":5722,"depth":1087,"text":5723},{"id":5741,"depth":1087,"text":5742},{"id":5766,"depth":1087,"text":5767},{"id":5797,"depth":1080,"text":5798,"children":6720},[6721,6722,6723,6724],{"id":5818,"depth":1087,"text":5819},{"id":5918,"depth":1087,"text":5919},{"id":5981,"depth":1087,"text":5982},{"id":6080,"depth":1087,"text":6081},{"id":6104,"depth":1080,"text":6105,"children":6726},[6727,6728,6729,6730],{"id":6115,"depth":1087,"text":6116},{"id":6136,"depth":1087,"text":6137},{"id":6415,"depth":1087,"text":6416},{"id":6528,"depth":1087,"text":6529},{"id":6640,"depth":1080,"text":6641},{"id":6647,"depth":1080,"text":6647},{"id":6665,"depth":1080,"text":6666},[6735,1686],"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":6741,"robots":1720,"sitemap":6746},[6742,6743],{"@type":1699,"headline":4854,"description":6737},{"@type":6744,"headline":6745,"description":6737},"Article","如何自托管AI旅行规划器TREK：基于Docker、Caddy与Cloudflare R2的终极部署教程",{"lastmod":6736},{"title":6745,"description":6737,"ogTitle":4854,"ogDescription":6737,"twitterTitle":4854,"twitterDescription":6737},"zh\u002Farticle\u002Fself-hosted-travel-planner-trek",[4847,6750,4848,4849,5541],"TREK","YpXK5B3vw79VCnu8AAPsKrl-TJGMOOkDVTMlz2Tw_9Y",1792490001141]