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