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