[{"data":1,"prerenderedAt":5274},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness":421,"\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness-surround":1712},[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":1666,"date":1670,"description":1671,"extension":1672,"image":1673,"imageAlt":1674,"isPublished":1073,"meta":1675,"minRead":1703,"navigation":1073,"path":283,"seo":1704,"stem":1706,"tags":1707,"updatedAt":1710,"__hash__":1711},"article\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness.md","Kết nối DeepSeek Harness với Buzz qua Gateway Nostr","",{"type":426,"value":427,"toc":1650},"minimark",[428,436,461,469,472,477,483,528,531,591,595,601,880,883,887,892,899,903,917,921,931,984,991,995,998,1030,1034,1039,1090,1098,1104,1113,1119,1149,1162,1166,1175,1206,1228,1276,1283,1288,1294,1301,1307,1312,1319,1333,1339,1348,1388,1391,1397,1404,1410,1414,1417,1568,1572,1606,1610,1616,1620,1646],[429,430,431],"p",{},[432,433],"img",{"alt":434,"src":435},"Tổng quan về cổng tin nhắn DeepSeek Harness kết nối với kênh 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],{},"Plugin 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",", mở rộng trợ lý DeepSeek Harness tới nhiều nền tảng nhắn tin phổ biến như Discord, Telegram và WeChat. Kho lưu trữ plugin này đã được fork và phát triển mở rộng để đưa nền tảng ",[440,451,452],{},[443,453,454],{"href":383},"Tự host Buzz của Block: Không gian cộng tác giữa người và AI"," vào danh sách hỗ trợ. Kho lưu trữ được fork hiện có sẵn công khai trên GitHub tại ",[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},"Tìm hiểu cách tự host Block's Buzz trên VPS Linux phía sau Cloudflare. Vận hành không gian làm việc Nostr bảo mật giúp con người và AI cộng tác hiệu quả.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FVI-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","Một thẻ công nghệ 16:9 cao cấp với các điểm nhấn màu xanh đậm và màu cam minh họa cách tự lưu trữ (self-host) cổng relay Buzz của Block trên Ubuntu VPS, có bảng glassmorphic sạch sẽ với kiểu chữ chính giữa.","Hướng dẫn điều kiện tiên quyết","12",[429,470,471],{},"Trợ lý DSH tham gia vào relay Buzz như một thành viên chính thức, nhận tin nhắn trực tiếp (DM) cũng như tin nhắn trong các kênh mà nó được @mention, và phản hồi thông qua cùng một quy trình agent pipeline theo từng phiên trò chuyện tương tự giao diện Web.",[473,474,476],"h2",{"id":475},"kiến-trúc-của-plugin-dsh-message-gateway","Kiến trúc của Plugin dsh-message-gateway",[429,478,479,480,482],{},"Kiến trúc của plugin ",[440,481,448],{}," được chia làm hai phần cốt lõi:",[484,485,486,518],"ul",{},[487,488,489,492,493,497,498,501,502,505,506,509,510,513,514,517],"li",{},[440,490,491],{},"Host"," (môi trường Node): ",[494,495,496],"code",{},"gateway-store"," (quản lý thông tin xác thực tại ",[494,499,500],{},"~\u002F.dsh\u002Fgateway.json","), ",[494,503,504],{},"platforms.ts"," (định nghĩa nền tảng và kiểm tra kết nối), ",[494,507,508],{},"routes.ts"," (các endpoint ",[494,511,512],{},"\u002Fgateway\u002F*","), và ",[494,515,516],{},"bridge-manager.ts"," (các cầu nối thường trú: quản lý phiên tác nhân độc lập cho từng cuộc trò chuyện và luồng phản hồi streaming).",[487,519,520,523,524,527],{},[440,521,522],{},"Client"," (phía trình duyệt): trang \"",[440,525,526],{},"Message platforms","\" ở thanh bên nơi bạn lưu thông tin đăng nhập, kiểm tra kết nối mạng và giám sát trạng thái hoạt động.",[429,529,530],{},"Việc tích hợp một nền tảng mới bao gồm các bước sau:",[532,533,534,551,565],"ol",{},[487,535,536,539,540,543,544,547,548,460],{},[440,537,538],{},"Lớp cầu nối (bridge class)",": cung cấp các phương thức ",[494,541,542],{},"start\u002Fstop\u002Fstatus"," kèm theo một hàm gọi lại (callback) ",[494,545,546],{},"onText(text, frame)",", tương tự mẫu thiết kế của ",[494,549,550],{},"wecom-bridge.ts",[487,552,553,556,557,560,561,564],{},[440,554,555],{},"Đấu nối vào bridge-manager",": tái sử dụng pipeline theo từng đoạn chat sẵn có (",[494,558,559],{},"ensureAgentForKey"," + ",[494,562,563],{},"pendingMap",") và gắn kết luồng trả lời của nền tảng vào.",[487,566,567,570,571,574,575,578,579,582,583,586,587,590],{},[440,568,569],{},"Lưu trữ và định tuyến",": trong ",[494,572,573],{},"\u002Fgateway\u002Fsave"," và ",[494,576,577],{},"\u002Fgateway\u002Fdelete",": ",[440,580,581],{},"lưu thông tin đăng nhập sẽ khởi động cầu nối, xóa sẽ dừng cầu nối"," — kèm theo cờ ",[494,584,585],{},"autoStartXxx"," để ",[494,588,589],{},"dsh web"," tự động kết nối lại khi hệ thống khởi động.",[473,592,594],{"id":593},"hiện-thực-cầu-nối-buzz-giao-thức-nostr-vòng-đời-sự-kiện","Hiện thực Cầu nối Buzz: Giao thức Nostr & Vòng đời sự kiện",[429,596,597,600],{},[440,598,599],{},"DeepSeek Harness"," đã được sử dụng trực tiếp để hiện thực hóa cầu nối Buzz. Quá trình triển khai tuân thủ nghiêm ngặt các đặc tả kỹ thuật của giao thức Nostr sau:",[602,603,604,619],"table",{},[605,606,607],"thead",{},[608,609,610,616],"tr",{},[611,612,613],"th",{},[440,614,615],{},"Hạng mục",[611,617,618],{},"Đặc tả chi tiết",[620,621,622,644,662,690,708,732,756,781,794,807,826,843,857],"tbody",{},[608,623,624,630],{},[625,626,627],"td",{},[440,628,629],{},"Giao vận (Transport)",[625,631,632,633,636,637,640,641],{},"Một kết nối WebSocket duy nhất có xác thực NIP-42; mặc định ",[494,634,635],{},"ws:\u002F\u002Flocalhost:3000","; ",[494,638,639],{},"http(s):\u002F\u002F"," được chuẩn hóa thành ",[494,642,643],{},"ws(s):\u002F\u002F",[608,645,646,651],{},[625,647,648],{},[440,649,650],{},"Xác thực (Auth)",[625,652,653,654,657,658,661],{},"Sự kiện AUTH ",[494,655,656],{},"kind 22242",", gắn thẻ ",[494,659,660],{},"[[\"relay\", url], [\"challenge\", challenge]]",", nội dung trống, ký bằng khóa riêng của tác nhân",[608,663,664,669],{},[625,665,666],{},[440,667,668],{},"Đăng ký nhận tin",[625,670,671,578,674,677,678,681,682,685,686,689],{},[440,672,673],{},"Theo từng kênh",[494,675,676],{},"REQ {\"kinds\":[9], \"#h\":[\u003Cuuid>]}"," — một REQ cho mỗi kênh. Lệnh REQ toàn cục ",[494,679,680],{},"kinds:[9]"," nhận EOSE nhưng không phân phối sự kiện; bộ lọc ",[494,683,684],{},"#h"," đa giá trị ",[440,687,688],{},"không"," chạy",[608,691,692,697],{},[625,693,694],{},[440,695,696],{},"Khám phá (Discovery)",[625,698,699,700,703,704,707],{},"Truy vấn lịch sử ",[494,701,702],{},"REQ {kinds:[39000]}"," để lấy metadata của kênh (",[494,705,706],{},"type == \"dm\""," đánh dấu kênh tin nhắn trực tiếp)",[608,709,710,715],{},[625,711,712],{},[440,713,714],{},"Tư cách thành viên",[625,716,717,718,721,722,724,725,728,729],{},"Lắng nghe trực tiếp ",[494,719,720],{},"REQ {kinds:[44100,44101], \"#p\":[pubkey của ta], since: now-60s}"," — 44100 = thêm, 44101 = xóa (chứa ",[494,723,429],{},"+",[494,726,727],{},"h","); cập nhật gói đăng ký ",[440,730,731],{},"không cần kết nối lại",[608,733,734,739],{},[625,735,736],{},[440,737,738],{},"Sự kiện trò chuyện",[625,740,741,744,745,748,749,752,753],{},[494,742,743],{},"kind 9"," với thẻ ",[494,746,747],{},"[\"h\", channel]",", tùy chọn ",[494,750,751],{},"[\"e\", replyTo]",", ",[494,754,755],{},"[\"p\", mention]",[608,757,758,763],{},[625,759,760],{},[440,761,762],{},"Chỉnh sửa tại chỗ",[625,764,765,768,769,560,771,774,775,777,778,780],{},[494,766,767],{},"kind 40003"," với ",[494,770,727],{},[494,772,773],{},"e","→mục tiêu; thay thế nội dung; giới hạn relay 64 KB → giữ tải ≤ 60.000 B; phản hồi dài được cắt mảnh — mảnh 0 ghi đè, phần dư nối tiếp dạng luồng ",[494,776,743],{}," (",[494,779,773],{},"→gốc)",[608,782,783,788],{},[625,784,785],{},[440,786,787],{},"Khung CLOSED",[625,789,790,793],{},[494,791,792],{},"auth-required"," trước AUTH là khởi động bình thường (hoàn tất AUTH, mở lại đăng ký); sau AUTH → thử lại có giới hạn (3 lần, lùi 0\u002F1\u002F2 giây); kết nối lại sẽ dựng lại toàn bộ trạng thái",[608,795,796,801],{},[625,797,798],{},[440,799,800],{},"Giới hạn relay",[625,802,803,804],{},"Tối đa 2000 sự kiện lịch sử trên mỗi đăng ký, sắp xếp mới nhất trước ngay cả khi sử dụng bộ lọc ",[494,805,806],{},"since",[608,808,809,814],{},[625,810,811],{},[440,812,813],{},"Kiểm soát mention",[625,815,816,817,819,820,822,823,825],{},"Chỉ xử lý ",[494,818,743],{}," gửi đến khi: (a) thẻ ",[494,821,429],{}," có pubkey của ta, (b) kênh là DM, hoặc (c) gốc ",[494,824,773],{}," là sự kiện của chính ta. Bỏ qua pubkey của bản thân (chống lặp vô tận)",[608,827,828,833],{},[625,829,830],{},[440,831,832],{},"Mention gửi đi",[625,834,835,836,839,840,842],{},"Văn bản gửi đi được xuất bản nguyên văn — relay không kiểm tra cú pháp ",[494,837,838],{},"@","; thẻ ",[494,841,429],{}," mang tác giả nguồn cùng tối đa 7 pubkey khác được nhắc đến (tổng tối đa 8)",[608,844,845,850],{},[625,846,847],{},[440,848,849],{},"Tin nhắn riêng (DM)",[625,851,852,853,856],{},"Kênh văn bản thuần túy trong phạm vi relay (metadata ",[494,854,855],{},"type: \"dm\"",") — không áp dụng mã hóa NIP-04\u002F44 trong cầu nối này",[608,858,859,864],{},[625,860,861],{},[440,862,863],{},"Tệp đính kèm (Đến)",[625,865,866,867,777,870,752,873,752,876,879],{},"NIP-92 ",[494,868,869],{},"imeta",[494,871,872],{},"url",[494,874,875],{},"sha256",[494,877,878],{},"m",") → tải xuống qua http(s), kiểm tra mã băm SHA-256, giới hạn 20 MB, tối đa 4 tệp\u002Ftin; hình ảnh gửi đi hiện không được hỗ trợ",[429,881,882],{},"Sơ đồ dưới đây minh họa toàn bộ quy trình khởi tạo (bootstrap) kết nối của cầu nối Buzz:",[432,884],{"src":885,"alt":886},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-bootstrap.webp","Sơ đồ trình tự minh họa quy trình khởi tạo bootstrap và xác thực NIP-42 của cầu nối Buzz",[888,889,891],"h3",{"id":890},"truyền-phát-thời-gian-thực-thông-qua-chỉnh-sửa-tại-chỗ-nostr-kind-40003","Truyền phát thời gian thực thông qua chỉnh sửa tại chỗ Nostr (Kind 40003)",[429,893,894,895,898],{},"Do Nostr không có chỉ báo đang gõ tin nhắn tự nhiên và các sự kiện đều là dạng ghi tiếp (append-only), cầu nối Buzz ",[440,896,897],{},"mô phỏng hiệu ứng truyền phát streaming bằng cách chỉnh sửa tại chỗ",":",[432,900],{"src":901,"alt":902},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-reply.webp","Sơ đồ luồng chỉnh sửa tại chỗ mô phỏng phản hồi truyền phát streaming với sự kiện kind 40003",[484,904,905],{},[487,906,907],{},[908,909,910,911,913,914,916],"em",{},"Cầu nối Buzz xuất bản trước một sự kiện giữ chỗ ",[494,912,743],{},", sau đó liên tục ghi đè nội dung theo tốc độ định sẵn bằng các sự kiện chỉnh sửa tại chỗ ",[494,915,767],{},", và thực hiện lần chỉnh sửa cuối cùng khi tác nhân hoàn tất phản hồi. Điều này tái hiện chính xác mô hình \"gửi rồi sửa\" đã được kiểm chứng trên các cầu nối Telegram và Discord.",[888,918,920],{"id":919},"kết-nối-workspace-của-deepseek-harness-thông-qua-lệnh-chat","Kết nối Workspace của DeepSeek Harness thông qua lệnh chat",[429,922,923,924,777,927,930],{},"Tính năng \"Workspaces\" trên giao diện Web DSH được quản lý bởi dịch vụ nền tảng ",[494,925,926],{},"workspaceRegistry",[494,928,929],{},"@deepseek-ai\u002Fdsh-workspace","):",[932,933,937],"pre",{"className":934,"code":935,"language":936,"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",[494,938,939],{"__ignoreMap":424},[940,941,944,948,952,956,960,963,965,967,969,973,976,978,981],"span",{"class":942,"line":943},"line",1,[940,945,947],{"class":946},"spNyl","const",[940,949,951],{"class":950},"sTEyZ"," existing ",[940,953,955],{"class":954},"sMK4o","=",[940,957,959],{"class":958},"s7zQu"," await",[940,961,962],{"class":950}," ctx",[940,964,460],{"class":954},[940,966,926],{"class":950},[940,968,460],{"class":954},[940,970,972],{"class":971},"s2Zo4","resolveByPath",[940,974,975],{"class":950},"(request",[940,977,460],{"class":954},[940,979,980],{"class":950},"path)",[940,982,983],{"class":954},";\n",[429,985,986,987,990],{},"Cầu nối Buzz cung cấp lệnh trò chuyện ",[494,988,989],{},"\u002Fworkspace \u003Cthư mục>",", cho phép đăng ký một thư mục sẵn có vào DSH. Mọi phiên làm việc mới được tạo qua gateway sẽ tự động gắn vào thư mục này và xuất hiện đồng bộ trên giao diện Web.",[432,992],{"src":993,"alt":994},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace.webp","Kiến trúc đăng ký workspace DeepSeek Harness từ các lệnh trò chuyện qua gateway",[429,996,997],{},"Ba lưu ý quan trọng về mặt thiết kế:",[484,999,1000,1010,1020],{},[487,1001,1002,1005,1006,1009],{},[440,1003,1004],{},"Đổi thư mục = Tạo phiên mới."," Tham số ",[494,1007,1008],{},"cwd"," được ghi cố định vào tiêu đề phiên khi khởi tạo và không thể chỉnh sửa về sau.",[487,1011,1012,1015,1016,1019],{},[440,1013,1014],{},"Thư mục bắt buộc phải tồn tại."," Hàm ",[494,1017,1018],{},"create"," sẽ từ chối các đường dẫn không có thực trên ổ đĩa.",[487,1021,1022,1025,1026,1029],{},[440,1023,1024],{},"Lệnh có yêu cầu bảo mật cao."," Mỗi phiên làm việc đều hoạt động theo chính sách ",[440,1027,1028],{},"auto-approve"," (tự động phê duyệt), cấp quyền truy cập tệp trong thư mục mục tiêu.",[473,1031,1033],{"id":1032},"hướng-dẫn-cài-đặt-và-cấu-hình-từng-bước","Hướng dẫn cài đặt và cấu hình từng bước",[532,1035,1036],{},[487,1037,1038],{},"Chạy các lệnh sau trong cửa sổ dòng lệnh terminal của bạn:",[932,1040,1044],{"className":1041,"code":1042,"language":1043,"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",[494,1045,1046,1068,1075,1082],{"__ignoreMap":424},[940,1047,1048,1052,1056,1059,1062,1065],{"class":942,"line":943},[940,1049,1051],{"class":1050},"sBMFI","dsh",[940,1053,1055],{"class":1054},"sfazB"," plugin",[940,1057,1058],{"class":1054}," --profile",[940,1060,1061],{"class":1054}," web",[940,1063,1064],{"class":1054}," add",[940,1066,1067],{"class":1054}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n",[940,1069,1071],{"class":942,"line":1070},2,[940,1072,1074],{"emptyLinePlaceholder":1073},true,"\n",[940,1076,1078],{"class":942,"line":1077},3,[940,1079,1081],{"class":1080},"sHwdD","# Start DSH web\n",[940,1083,1085,1087],{"class":942,"line":1084},4,[940,1086,1051],{"class":1050},[940,1088,1089],{"class":1054}," web\n",[532,1091,1092],{"start":1070},[487,1093,1094,1095,1097],{},"Khi giao diện Web DSH mở ra trong trình duyệt web, nhấp vào biểu tượng \"",[440,1096,526],{},"\":",[429,1099,1100],{},[432,1101],{"alt":1102,"src":1103},"Thanh bên giao diện Web DeepSeek Harness làm nổi bật menu cấu hình Message platforms","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-message-platforms-sidebar-icon.webp",[532,1105,1106],{"start":1077},[487,1107,1108,1109,1112],{},"Chọn mục \"",[440,1110,1111],{},"Buzz","\" ở bảng điều khiển bên trái:",[429,1114,1115],{},[432,1116],{"alt":1117,"src":1118},"Bảng cài đặt cấu hình cầu nối Buzz trong cổng tin nhắn DeepSeek Harness","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-message-gateway-buzz-config-panel.webp",[532,1120,1121,1132,1142],{"start":1084},[487,1122,1123,1124,1127,1128,1131],{},"Nhấp vào \"",[440,1125,1126],{},"Generate keypair","\" để tạo cặp khóa Nostr mới. Hãy sao chép khóa công khai ",[494,1129,1130],{},"npub"," vào nơi an toàn.",[487,1133,1134,1135,574,1138,1141],{},"Điền thông tin vào ô ",[440,1136,1137],{},"Relay URL",[440,1139,1140],{},"Channels"," (danh sách UUID các kênh cho phép đăng ký).",[487,1143,1144,1145,1148],{},"Nhấp vào nút \"",[440,1146,1147],{},"Save","\".",[429,1150,1151,1152,1155,1156,1159,1160,460],{},"Lưu biểu mẫu sẽ lưu trữ thông tin đăng nhập và ",[440,1153,1154],{},"kích hoạt cầu nối khởi chạy",". Khóa bí mật ",[494,1157,1158],{},"nsec"," được coi là thông tin mật tuyệt đối và chỉ lưu trữ duy nhất trong tệp ",[494,1161,500],{},[888,1163,1165],{"id":1164},"đăng-ký-cặp-khóa-tác-nhân-lên-buzz-nostr-relay","Đăng ký cặp khóa tác nhân lên Buzz Nostr Relay",[429,1167,1168,1171,1172,1174],{},[440,1169,1170],{},"Thêm trợ lý DSH vào relay với tư cách là một thành viên."," Sử dụng khóa công khai ",[494,1173,1130],{}," vừa tạo ở bước trên:",[932,1176,1178],{"className":1041,"code":1177,"language":1043,"meta":424,"style":424},"docker compose exec relay buzz-admin add-member --pubkey npub123123123\n",[494,1179,1180],{"__ignoreMap":424},[940,1181,1182,1185,1188,1191,1194,1197,1200,1203],{"class":942,"line":943},[940,1183,1184],{"class":1050},"docker",[940,1186,1187],{"class":1054}," compose",[940,1189,1190],{"class":1054}," exec",[940,1192,1193],{"class":1054}," relay",[940,1195,1196],{"class":1054}," buzz-admin",[940,1198,1199],{"class":1054}," add-member",[940,1201,1202],{"class":1054}," --pubkey",[940,1204,1205],{"class":1054}," npub123123123\n",[429,1207,1208,1211,1212,1215,1216,1219,1220,1223,1224,1227],{},[440,1209,1210],{},"Thêm trợ lý DSH vào một kênh cụ thể."," Việc thêm thành viên vào relay chỉ mới đưa tác nhân lên máy chủ, nó sẽ chưa tự động hiển thị hay tìm kiếm được trong các kênh. Khi thực hiện bước này bằng công cụ ",[494,1213,1214],{},"buzz-cli",", cần lưu ý rằng tham số ",[494,1217,1218],{},"--pubkey"," phải ở định dạng ",[440,1221,1222],{},"HEX",", không phải npub (lệnh ",[494,1225,1226],{},"buzz-admin add-member"," trước đó sẽ in ra khóa HEX tương ứng):",[932,1229,1231],{"className":1041,"code":1230,"language":1043,"meta":424,"style":424},"buzz channels add-member --channel \u003CCHANNEL_UUID> --pubkey \u003CAGENT_HEX> --role member\n",[494,1232,1233],{"__ignoreMap":424},[940,1234,1235,1238,1241,1243,1246,1249,1252,1255,1258,1260,1262,1265,1268,1270,1273],{"class":942,"line":943},[940,1236,1237],{"class":1050},"buzz",[940,1239,1240],{"class":1054}," channels",[940,1242,1199],{"class":1054},[940,1244,1245],{"class":1054}," --channel",[940,1247,1248],{"class":954}," \u003C",[940,1250,1251],{"class":1054},"CHANNEL_UUI",[940,1253,1254],{"class":950},"D",[940,1256,1257],{"class":954},">",[940,1259,1202],{"class":1054},[940,1261,1248],{"class":954},[940,1263,1264],{"class":1054},"AGENT_HE",[940,1266,1267],{"class":950},"X",[940,1269,1257],{"class":954},[940,1271,1272],{"class":1054}," --role",[940,1274,1275],{"class":1054}," member\n",[462,1277],{"description":1278,"image":465,"image-alt":466,"label":1279,"min-read":1280,"title":1281,"to":1282},"Hướng dẫn từng bước để cài đặt và định cấu hình buzz-cli nhằm quản lý các kênh Nostr, khóa thành viên và quyền của tác nhân AI.","Hướng dẫn CLI","5","Cách cài đặt và sử dụng buzz-cli","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#install-buzz-cli",[429,1284,1285,1286,898],{},"Cập nhật hồ sơ của trợ lý DSH trên Nostr relay thành một tên hiển thị trực quan và thân thiện hơn bằng ",[494,1287,1214],{},[429,1289,1290],{},[432,1291],{"alt":1292,"src":1293},"Cập nhật tên hiển thị của trợ lý DeepSeek Harness trên Nostr relay bằng buzz-cli","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-assistant-buzz-cli-profile-update.webp",[429,1295,1296,1297,1300],{},"Gửi một lời chào ",[440,1298,1299],{},"Wave"," (hành động vẫy tay chào qua DM của Buzz) tới trợ lý DSH. Phản hồi gửi ngược lại báo hiệu hệ thống đã vận hành trơn tru:",[429,1302,1303],{},[432,1304],{"alt":1305,"src":1306},"Kiểm tra kết nối bằng cách gửi tin nhắn Wave dạng DM tới trợ lý DeepSeek Harness trong Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-dm-wave-greeting-reply.webp",[429,1308,1309],{},[908,1310,1311],{},"Gửi tin nhắn Wave dạng DM tới trợ lý DSH — cầu nối phản hồi ngay lập tức.",[888,1313,1315,1316],{"id":1314},"cho-phép-mở-quyền-thư-mục-cục-bộ-với-lệnh-workspace","Cho phép mở quyền thư mục cục bộ với lệnh ",[494,1317,1318],{},"\u002Fworkspace",[429,1320,1321,1322,1325,1326,1329,1330,1332],{},"Do thiết lập ",[494,1323,1324],{},"allowWorkspace"," được đặt mặc định là ",[494,1327,1328],{},"false"," để bảo vệ an toàn, lệnh ",[494,1331,1318],{}," ban đầu sẽ bị từ chối:",[429,1334,1335],{},[432,1336],{"alt":1337,"src":1338},"Thông báo lỗi lệnh workspace bị từ chối khi tùy chọn allowWorkspace đang bị tắt","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-rejected-error.webp",[429,1340,1341,1342,1345,1346,898],{},"Bật tính năng này trong tệp ",[494,1343,1344],{},"~\u002F.dsh\u002Fprofiles\u002Fweb\u002Fcordis.patch.yml",", sau đó khởi động lại ",[494,1347,589],{},[932,1349,1353],{"className":1350,"code":1351,"language":1352,"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",[494,1354,1355,1369,1377],{"__ignoreMap":424},[940,1356,1357,1360,1364,1366],{"class":942,"line":943},[940,1358,1359],{"class":954},"-",[940,1361,1363],{"class":1362},"swJcz"," id",[940,1365,898],{"class":954},[940,1367,1368],{"class":1054}," ui-message-gateway\n",[940,1370,1371,1374],{"class":942,"line":1070},[940,1372,1373],{"class":1362},"  config",[940,1375,1376],{"class":954},":\n",[940,1378,1379,1382,1384],{"class":942,"line":1077},[940,1380,1381],{"class":1362},"    allowWorkspace",[940,1383,898],{"class":954},[940,1385,1387],{"class":1386},"sfNiH"," true\n",[429,1389,1390],{},"Sau khi khởi động lại:",[429,1392,1393],{},[432,1394],{"alt":1395,"src":1396},"Thông báo xác nhận thành công sau khi thực thi lệnh đăng ký workspace trong Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-success-confirmation.webp",[429,1398,1399,1400,1403],{},"Điểm cần nhớ: cấu hình mặc định này giả định thư mục không gian làm việc (",[494,1401,1402],{},"TechVoyage"," trong hình minh họa) nằm trong thư mục gốc của người dùng hiện tại. Nếu nằm ở vị trí khác, hãy điền đầy đủ đường dẫn tuyệt đối. Bất kỳ phiên làm việc mới nào được tạo dưới workspace này qua Buzz cũng sẽ đồng bộ hiển thị trên giao diện Web của DeepSeek Harness.",[429,1405,1406],{},[432,1407],{"alt":1408,"src":1409},"Giao diện Web DeepSeek Harness hiển thị phiên làm việc được đồng bộ hóa từ Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-synced-workspace-session.webp",[888,1411,1413],{"id":1412},"danh-sách-các-lệnh-khả-dụng-trên-buzz","Danh sách các lệnh khả dụng trên Buzz",[429,1415,1416],{},"Tất cả các lệnh mà các nền tảng khác hỗ trợ đều hoạt động mượt mà trên Buzz:",[602,1418,1419,1429],{},[605,1420,1421],{},[608,1422,1423,1426],{},[611,1424,1425],{},"Lệnh",[611,1427,1428],{},"Chức năng",[620,1430,1431,1441,1451,1461,1471,1481,1491,1501,1511,1531,1551],{},[608,1432,1433,1438],{},[625,1434,1435],{},[494,1436,1437],{},"\u002Fworkspace \u003Cfolder>",[625,1439,1440],{},"Đăng ký một thư mục sẵn có làm workspace cho cuộc hội thoại (yêu cầu bật quyền trong cấu hình)",[608,1442,1443,1448],{},[625,1444,1445],{},[494,1446,1447],{},"\u002Fhelp",[625,1449,1450],{},"Liệt kê tất cả các lệnh khả dụng",[608,1452,1453,1458],{},[625,1454,1455],{},[494,1456,1457],{},"\u002Ftime",[625,1459,1460],{},"Hiển thị thời gian hiện tại của hệ thống",[608,1462,1463,1468],{},[625,1464,1465],{},[494,1466,1467],{},"\u002Fnew",[625,1469,1470],{},"Khởi tạo một phiên trò chuyện hoàn toàn mới",[608,1472,1473,1478],{},[625,1474,1475],{},[494,1476,1477],{},"\u002Fclear",[625,1479,1480],{},"Xóa trắng lịch sử trò chuyện hiện tại",[608,1482,1483,1488],{},[625,1484,1485],{},[494,1486,1487],{},"\u002Fstatus",[625,1489,1490],{},"Kiểm tra trạng thái hoạt động của cầu nối",[608,1492,1493,1498],{},[625,1494,1495],{},[494,1496,1497],{},"\u002Fstats",[625,1499,1500],{},"Xem số lượng đoạn chat và dòng trạng thái chi tiết của từng bridge (trên tất cả nền tảng, bao gồm cả Buzz)",[608,1502,1503,1508],{},[625,1504,1505],{},[494,1506,1507],{},"\u002Fcommands",[625,1509,1510],{},"Xem bảng mô tả chi tiết của từng lệnh",[608,1512,1513,1518],{},[625,1514,1515],{},[494,1516,1517],{},"@path\u002Fto\u002Ffile",[625,1519,1520,1521,752,1523,1526,1527,1530],{},"Hoạt động hệt như tính năng mention tệp trên Web: mô hình đọc nội dung tệp tương đối theo workspace; gõ ",[494,1522,838],{},[494,1524,1525],{},"@tiền_tố"," hoặc ",[494,1528,1529],{},"\u002Ffiles \u003Ctiền_tố>"," để hiển thị danh sách tệp\u002Fthư mục phù hợp",[608,1532,1533,1538],{},[625,1534,1535],{},[494,1536,1537],{},"\u002Fmodel",[625,1539,1540,1543,1544,1546,1547,1550],{},[494,1541,1542],{},"[provider model effort]"," — xác thực với danh mục LLM đang kích hoạt để đổi mô hình và mức suy luận; gõ ",[494,1545,1537],{}," để xem tùy chọn, ",[494,1548,1549],{},"\u002Fmodel reset"," để khôi phục mặc định",[608,1552,1553,1558],{},[625,1554,1555],{},[494,1556,1557],{},"\u002Feffort",[625,1559,1560,1563,1564,1567],{},[494,1561,1562],{},"\u003Cid>"," chỉ điều chỉnh mức độ suy luận (reasoning effort); ",[494,1565,1566],{},"\u002Feffort reset"," khôi phục lại giá trị mặc định",[888,1569,1571],{"id":1570},"tóm-lược-về-bảo-mật","Tóm lược về bảo mật",[484,1573,1574,1587,1597],{},[487,1575,1576,1577,1579,1580,1582,1583,1586],{},"Khóa riêng ",[440,1578,1158],{}," chỉ nằm duy nhất trong ",[494,1581,500],{}," (phân quyền tệp 0600, ghi nguyên tử) — không bao giờ bị lộ ra ngoài qua endpoint ",[494,1584,1585],{},"\u002Fgateway\u002Flist"," hay tệp nhật ký log.",[487,1588,1589,1590,777,1593,1596],{},"Mọi sự kiện gửi đến đều được ",[440,1591,1592],{},"xác thực chữ ký mật mã",[494,1594,1595],{},"verifyEvent","), loại bỏ tin trùng lặp, lọc thông điệp tự phát và kiểm tra đề cập @mention trước khi chuyển tiếp tới tác nhân.",[487,1598,1599,777,1602,1605],{},[440,1600,1601],{},"Việc đăng ký workspace được kiểm soát chặt bằng cấu hình",[494,1603,1604],{},"allowWorkspace: false"," theo mặc định) nhằm ngăn ngừa tình trạng các phiên gateway tự động phê duyệt quyền mở tệp ngoài ý muốn.",[473,1607,1609],{"id":1608},"lời-kết-cộng-tác-ai-phi-tập-trung-cùng-buzz","Lời kết: Cộng tác AI phi tập trung cùng Buzz",[429,1611,1612,1613,1615],{},"Khía cạnh phức tạp nhất khi tích hợp Buzz vào ",[494,1614,448],{}," nằm ở việc đáp ứng chuẩn xác quy chuẩn giao thức Nostr. Nhờ nền tảng plugin sẵn có đã trừu tượng hóa rất tốt việc quản lý phiên và điều hướng lệnh, quá trình xây dựng cầu nối diễn ra vô cùng thuận lợi và ổn định ngay khi cơ chế xử lý sự kiện và truyền phát luồng chỉnh sửa tại chỗ được thiết lập.",[473,1617,1619],{"id":1618},"tài-liệu-tham-khảo","Tài liệu tham khảo:",[484,1621,1622,1630,1638],{},[487,1623,1624,1629],{},[443,1625,1628],{"href":1626,"rel":1627},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway\u002Fblob\u002Fmain\u002Fdocs\u002Farchitecture.md",[447],"dsh-message-gateway architecture guide"," — tài liệu kiến trúc, hướng dẫn viết extension và lưu ý bảo mật",[487,1631,1632,1637],{},[443,1633,1636],{"href":1634,"rel":1635},"https:\u002F\u002Fgithub.com\u002Fnbd-wtf\u002Fnostr-tools",[447],"nostr-tools"," — thư viện Nostr cốt lõi được sử dụng bên dưới",[487,1639,1640,1645],{},[443,1641,1644],{"href":1642,"rel":1643},"https:\u002F\u002Fgithub.com\u002Fbytedance\u002Fdeer-flow\u002Fblob\u002Fmain\u002Fbackend\u002Fdocs\u002FIM_CHANNEL_CONNECTIONS.md",[447],"deer-flow IM channel connections"," — mô hình tham khảo cho kết nối kênh nhắn tin tức thời",[1647,1648,1649],"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":1070,"depth":1077,"links":1651},[1652,1653,1657,1664,1665],{"id":475,"depth":1070,"text":476},{"id":593,"depth":1070,"text":594,"children":1654},[1655,1656],{"id":890,"depth":1077,"text":891},{"id":919,"depth":1077,"text":920},{"id":1032,"depth":1070,"text":1033,"children":1658},[1659,1660,1662,1663],{"id":1164,"depth":1077,"text":1165},{"id":1314,"depth":1077,"text":1661},"Cho phép mở quyền thư mục cục bộ với lệnh \u002Fworkspace",{"id":1412,"depth":1077,"text":1413},{"id":1570,"depth":1077,"text":1571},{"id":1608,"depth":1070,"text":1609},{"id":1618,"depth":1070,"text":1619},[1667,1668,1237,1669],"ai-agents","collaboration","deepseek-harness","2026-09-30","Tích hợp DeepSeek Harness với Block Buzz bằng cầu nối Nostr. Thiết lập xác thực NIP-42, truyền phát tin nhắn chỉnh sửa tại chỗ và workspace đa tác nhân AI.","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002FVI-Bringing-Buzz-to-DeepSeek-Harness.webp","Thẻ công nghệ 16:9 cao cấp với điểm nhấn màu chàm đậm và hổ phách minh họa cách kết nối DeepSeek Harness với Block Buzz thông qua cầu nối Nostr, có bảng glassmorphic sạch sẽ với kiểu chữ chính giữa.",{"schemaOrg":1676,"robots":1701,"sitemap":1702},[1677,1679],{"@type":1678,"headline":423,"description":1671,"image":1673},"TechArticle",{"@type":1680,"name":423,"description":1671,"image":1673,"step":1681},"HowTo",[1682,1686,1689,1692,1695,1698],{"@type":1683,"name":1684,"text":1685},"HowToStep","Giai đoạn 1: Cài đặt plugin cổng kết nối","Cài đặt plugin dsh-message-gateway và khởi động dịch vụ dsh web.",{"@type":1683,"name":1687,"text":1688},"Giai đoạn 2: Truy cập cài đặt Message platforms","Mở giao diện Web DSH và điều hướng đến mục Message platforms.",{"@type":1683,"name":1690,"text":1691},"Giai đoạn 3: Định cấu hình cầu nối Buzz","Tạo cặp khóa Nostr, nhập Relay URL và danh sách kênh cần theo dõi.",{"@type":1683,"name":1693,"text":1694},"Giai đoạn 4: Đăng ký tác tử lên relay","Thêm trợ lý DSH vào Buzz Nostr relay bằng lệnh buzz-admin.",{"@type":1683,"name":1696,"text":1697},"Giai đoạn 5: Thêm tác tử vào kênh","Gán khóa HEX của tác tử vào các kênh cụ thể bằng buzz-cli.",{"@type":1683,"name":1699,"text":1700},"Giai đoạn 6: Kích hoạt liên kết workspace","Định cấu hình allowWorkspace trong cordis.patch.yml để cho phép lệnh thư mục cục bộ.","index, follow",{"lastmod":1670},14,{"title":1705,"description":1671,"ogTitle":423,"ogDescription":1671,"twitterTitle":423,"twitterDescription":1671},"Plugin Buzz cho DeepSeek Harness: Tạo Cầu Nối Nostr","vi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",[599,1111,1708,1709,448],"Nostr","Tác tử AI",null,"ZIProBuceyP_EtpE4Ozv_jHRd4oXizYxQLd5TQo7Fjg",{"surround":1713,"related":2660},[1714,1710],{"id":1715,"title":1716,"author":424,"body":1717,"category":2612,"date":2614,"description":2615,"extension":1672,"image":2616,"imageAlt":2617,"isPublished":1073,"meta":2618,"minRead":2388,"navigation":1073,"path":287,"seo":2652,"stem":2654,"tags":2655,"updatedAt":2651,"__hash__":2659},"article\u002Fvi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md","Cách hiển thị riêng tư Hermes Agent với Cloudflare WARP",{"type":426,"value":1718,"toc":2594},[1719,1734,1744,1748,1751,1763,1767,1775,1779,1783,1833,1837,1974,1978,2011,2015,2018,2084,2087,2123,2126,2153,2157,2167,2172,2211,2300,2304,2309,2326,2335,2414,2419,2465,2469,2514,2529,2533,2577,2581,2591],[429,1720,1721,1722,1725,1726,1729,1730,1733],{},"Một thách thức phổ biến nảy sinh khi bạn muốn truy cập ",[440,1723,1724],{},"Hermes Agent"," của mình từ các thiết bị khác như máy tính xách tay, máy tính bảng hoặc điện thoại mà không làm lộ nó với mạng internet công cộng. Việc tận dụng ",[440,1727,1728],{},"Cloudflare WARP"," cùng với ",[440,1731,1732],{},"Cloudflare Zero Trust"," cho phép bạn hiển thị Hermes Agent trên toàn cầu mà không cần mở bất kỳ cổng đến (inbound port) nào trên tường lửa của mình.",[429,1735,1736,1737,1740,1741,1743],{},"Nếu bạn đã làm theo hướng dẫn trước đây của chúng tôi, '",[443,1738,1739],{"href":375},"Hướng dẫn cài đặt và triển khai Hermes Agent trên VPS Linux","', thì Hermes Agent của bạn đã được thiết lập và chạy 24\u002F7. Thay vì phải xử lý sự phức tạp của VPN truyền thống, chúng ta sẽ sử dụng máy khách ",[440,1742,1728],{}," để kết nối Hermes Agent vào mạng riêng (private network) qua internet.",[473,1745,1747],{"id":1746},"hiểu-về-kiến-trúc","Hiểu về Kiến trúc",[429,1749,1750],{},"Các thành phần đang hoạt động:",[532,1752,1753,1758],{},[487,1754,1755,1757],{},[440,1756,1732],{},": Bảng điều khiển tại Cloudflare, nơi bạn xác định các quy tắc định tuyến và chính sách truy cập.",[487,1759,1760,1762],{},[440,1761,1728],{},": Ứng dụng máy khách được cài đặt trên các thiết bị của bạn (VPS, máy tính xách tay, điện thoại). Nó sẽ chặn lưu lượng truy cập được gửi tới mạng riêng của bạn và định tuyến nó một cách an toàn.",[888,1764,1766],{"id":1765},"điều-kiện-tiên-quyết","Điều kiện tiên quyết",[484,1768,1769,1772],{},[487,1770,1771],{},"Một Hermes Agent đang chạy trên VPS của bạn.",[487,1773,1774],{},"Một tài khoản Cloudflare miễn phí.",[473,1776,1778],{"id":1777},"hướng-dẫn-từng-bước","Hướng dẫn Từng bước",[888,1780,1782],{"id":1781},"bước-1-thiết-lập-cloudflare-zero-trust","Bước 1: Thiết lập Cloudflare Zero Trust",[532,1784,1785,1794,1801,1812,1819,1826],{},[487,1786,1787,1788,1793],{},"Đăng nhập vào ",[443,1789,1792],{"href":1790,"rel":1791},"https:\u002F\u002Fdash.cloudflare.com\u002F",[447],"Bảng điều khiển Cloudflare"," của bạn.",[487,1795,1796,1797],{},"Nhấp vào 'Zero Trust' từ menu bên trái.\n",[432,1798],{"alt":1799,"src":1800},"Trình đơn điều hướng thanh bên trái bảng điều khiển Cloudflare với tùy chọn Zero Trust","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-left-menu.webp",[487,1802,1803,1804,1807,1808],{},"Nếu đây là lần đầu tiên, bạn akan được nhắc chọn một gói (bản Miễn phí hoàn toàn phù hợp cho thiết lập này) và đặt tên cho nhóm của bạn (ví dụ: ",[494,1805,1806],{},"ai-team",").\n",[432,1809],{"alt":1810,"src":1811},"Thiết lập tài khoản Cloudflare Zero Trust lần đầu tiên và đặt tên nhóm","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-team-setup.webp",[487,1813,1814,1815],{},"Nhấp vào 'Access' rồi chọn 'Policies' để tạo một chính sách truy cập, xác định những ai có quyền truy cập vào mạng.\n",[432,1816],{"alt":1817,"src":1818},"Trang chính sách truy cập Cloudflare Zero Trust hiển thị các quy tắc truy cập mới cấu hình","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-access-policies-page.webp",[487,1820,1821,1822],{},"Nhấp vào 'Create new policy'.\n",[432,1823],{"alt":1824,"src":1825},"Cloudflare Access policies page showing no policies added and a button to create a new policy.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-no-policies-create-button.png",[487,1827,1828,1829],{},"Chọn 'Emails' và nhập email của bạn dưới mục 'Policy rules'.\n",[432,1830],{"alt":1831,"src":1832},"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",[888,1834,1836],{"id":1835},"bước-2-thiết-lập-máy-khách-cloudflare-warp-trên-vps","Bước 2: Thiết lập máy khách Cloudflare WARP trên VPS",[532,1838,1839,1849,1855,1862,1865,1880,1883,1967],{},[487,1840,1841,1842,574,1845,1848],{},"Chạy ",[494,1843,1844],{},"sudo apt update",[494,1846,1847],{},"sudo apt install cloudflare-warp"," trong terminal trên VPS của bạn.",[487,1850,1841,1851,1854],{},[494,1852,1853],{},"warp-cli registration new \u003CTEAM-NAME>"," trong terminal trên VPS của bạn, một URL sẽ được in ra.",[487,1856,1857,1858,1861],{},"Sao chép URL vừa được in, nó sẽ có dạng ",[494,1859,1860],{},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp",", và dán vào trình duyệt của bạn để tiến hành xác thực.",[487,1863,1864],{},"Vì phương thức xác thực bằng email đã được cấu hình trong bước trước, hãy nhập email của bạn để xác thực.",[487,1866,1867,1868,1871,1872,1875,1876,1879],{},"Trên trang '",[440,1869,1870],{},"Success","' (Thành công) trong trình duyệt, hãy nhấp chuột phải và chọn '",[440,1873,1874],{},"Inspect","' (Kiểm tra) ở nút màu xanh '",[440,1877,1878],{},"Open Cloudflare WARP","'.",[487,1881,1882],{},"Sao chép chuỗi mã token dài nằm trong liên kết của nút.",[487,1884,1841,1885,1888,1889,1892,1893],{},[494,1886,1887],{},"warp-cli --accept-tos registration token \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\""," trong terminal trên VPS của bạn để kết nối nó với Cloudflare Zero Trust.",[1890,1891],"br",{},"Nếu gặp lỗi 'Error: Failed to communicate with the WARP API' trên Ubuntu 26, hãy chạy các lệnh sau:",[932,1894,1896],{"className":1041,"code":1895,"language":1043,"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",[494,1897,1898,1912,1916,1921,1932,1937,1943],{"__ignoreMap":424},[940,1899,1900,1903,1906,1909],{"class":942,"line":943},[940,1901,1902],{"class":1050},"sudo",[940,1904,1905],{"class":1054}," systemctl",[940,1907,1908],{"class":1054}," restart",[940,1910,1911],{"class":1054}," warp-svc.service\n",[940,1913,1914],{"class":942,"line":1070},[940,1915,1074],{"emptyLinePlaceholder":1073},[940,1917,1918],{"class":942,"line":1077},[940,1919,1920],{"class":1080},"# Check status\n",[940,1922,1923,1925,1927,1930],{"class":942,"line":1084},[940,1924,1902],{"class":1050},[940,1926,1905],{"class":1054},[940,1928,1929],{"class":1054}," status",[940,1931,1911],{"class":1054},[940,1933,1935],{"class":942,"line":1934},5,[940,1936,1074],{"emptyLinePlaceholder":1073},[940,1938,1940],{"class":942,"line":1939},6,[940,1941,1942],{"class":1080},"# Run the warp-cli registration token again\n",[940,1944,1946,1949,1952,1955,1958,1961,1964],{"class":942,"line":1945},7,[940,1947,1948],{"class":1050},"warp-cli",[940,1950,1951],{"class":1054}," --accept-tos",[940,1953,1954],{"class":1054}," registration",[940,1956,1957],{"class":1054}," token",[940,1959,1960],{"class":954},"   \"",[940,1962,1963],{"class":1054},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[940,1965,1966],{"class":954},"\"\n",[487,1968,1969,1970],{},"Quay trở lại bảng điều khiển Cloudflare Zero Trust, và nhấp vào 'Devices' (Thiết bị). Thiết bị VPS của bạn lúc này sẽ được hiển thị.\n",[432,1971],{"alt":1972,"src":1973},"Bảng điều khiển thiết bị Zero Trust xác nhận máy chủ Linux VPS đã kết nối","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-devices-vps-connected.webp",[888,1975,1977],{"id":1976},"bước-3-thiết-lập-định-tuyến-lưu-lượng","Bước 3: Thiết lập Định tuyến Lưu lượng",[532,1979,1980,1987,1994,2001],{},[487,1981,1982,1983],{},"Nhấp vào cấu hình VPS của bạn trên bảng điều khiển Devices.\n",[432,1984],{"alt":1985,"src":1986},"Truy cập chi tiết và cài đặt đường hầm phân tách cho thiết bị VPS đã đăng ký","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-device-profile.webp",[487,1988,1989,1990],{},"Cuộn xuống phần 'Split Tunnels'.\n",[432,1991],{"alt":1992,"src":1993},"Phần Đường hầm phân tách (Split Tunnels) dưới cài đặt hồ sơ VPS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-split-tunnels-section.webp",[487,1995,1996,1997],{},"Nhấp vào nút 'Manage' (Quản lý) và định cấu hình các thiết lập như minh họa bên dưới. Thay thế địa chỉ IP nếu cần.\n",[432,1998],{"alt":1999,"src":2000},"Quản lý ngoại lệ IP và tên máy chủ Split Tunnels trong cài đặt Cloudflare","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-manage-split-tunnels.webp",[487,2002,2003,2004,574,2007,2010],{},"Hiển thị ",[494,2005,2006],{},"address",[494,2008,2009],{},"host"," sẽ định tuyến lưu lượng truy cập tới các dịch vụ của bạn trên cùng một mạng riêng.",[888,2012,2014],{"id":2013},"bước-4-cấu-hình-tường-lửa-trên-vps","Bước 4: Cấu hình Tường lửa trên VPS",[429,2016,2017],{},"Bật tường lửa để chỉ cho phép mạng con '100.96.0.0\u002F12', đồng thời chặn tất cả các quyền truy cập công cộng đến khác.",[932,2019,2021],{"className":1041,"code":2020,"language":1043,"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",[494,2022,2023,2036,2053,2067],{"__ignoreMap":424},[940,2024,2025,2027,2030,2033],{"class":942,"line":943},[940,2026,1902],{"class":1050},[940,2028,2029],{"class":1054}," ufw",[940,2031,2032],{"class":1054}," enable",[940,2034,2035],{"class":950}," \n",[940,2037,2038,2040,2042,2045,2048,2051],{"class":942,"line":1070},[940,2039,1902],{"class":1050},[940,2041,2029],{"class":1054},[940,2043,2044],{"class":1054}," default",[940,2046,2047],{"class":1054}," allow",[940,2049,2050],{"class":1054}," outgoing",[940,2052,2035],{"class":950},[940,2054,2055,2057,2059,2061,2064],{"class":942,"line":1077},[940,2056,1902],{"class":1050},[940,2058,2029],{"class":1054},[940,2060,2044],{"class":1054},[940,2062,2063],{"class":1054}," deny",[940,2065,2066],{"class":1054}," incoming\n",[940,2068,2069,2071,2073,2075,2078,2081],{"class":942,"line":1084},[940,2070,1902],{"class":1050},[940,2072,2029],{"class":1054},[940,2074,2047],{"class":1054},[940,2076,2077],{"class":1054}," in",[940,2079,2080],{"class":1054}," from",[940,2082,2083],{"class":1054}," 100.96.0.0\u002F12\n",[429,2085,2086],{},"Cho phép lưu lượng loopback (quay vòng) để tránh làm hỏng các dịch vụ cục bộ:",[932,2088,2090],{"className":1041,"code":2089,"language":1043,"meta":424,"style":424},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[494,2091,2092,2108],{"__ignoreMap":424},[940,2093,2094,2096,2098,2100,2102,2105],{"class":942,"line":943},[940,2095,1902],{"class":1050},[940,2097,2029],{"class":1054},[940,2099,2047],{"class":1054},[940,2101,2077],{"class":1054},[940,2103,2104],{"class":1054}," on",[940,2106,2107],{"class":1054}," lo\n",[940,2109,2110,2112,2114,2116,2119,2121],{"class":942,"line":1070},[940,2111,1902],{"class":1050},[940,2113,2029],{"class":1054},[940,2115,2047],{"class":1054},[940,2117,2118],{"class":1054}," out",[940,2120,2104],{"class":1054},[940,2122,2107],{"class":1054},[429,2124,2125],{},"Tải lại tường lửa và xác minh trạng thái:",[932,2127,2129],{"className":1041,"code":2128,"language":1043,"meta":424,"style":424},"sudo ufw reload \nsudo ufw status verbose\n",[494,2130,2131,2142],{"__ignoreMap":424},[940,2132,2133,2135,2137,2140],{"class":942,"line":943},[940,2134,1902],{"class":1050},[940,2136,2029],{"class":1054},[940,2138,2139],{"class":1054}," reload",[940,2141,2035],{"class":950},[940,2143,2144,2146,2148,2150],{"class":942,"line":1070},[940,2145,1902],{"class":1050},[940,2147,2029],{"class":1054},[940,2149,1929],{"class":1054},[940,2151,2152],{"class":1054}," verbose\n",[888,2154,2156],{"id":2155},"bước-5-hiển-thị-hermes-agent-vào-mạng-riêng","Bước 5: Hiển thị Hermes Agent vào Mạng Riêng",[429,2158,2159,2160,2163,2164,460],{},"Chúng ta sẽ hiển thị ",[440,2161,2162],{},"Hermes Agent Web Dashboard"," vào mạng riêng của mình và sử dụng nhà cung cấp xác thực mặc định là ",[440,2165,2166],{},"Nous Research",[2168,2169,2171],"h4",{"id":2170},"thiết-lập-nhà-cung-cấp-xác-thực","Thiết lập Nhà cung cấp Xác thực",[532,2173,2174,2183,2190,2197,2204],{},[487,2175,2176,2177,2182],{},"Đi tới ",[443,2178,2181],{"href":2179,"rel":2180},"https:\u002F\u002Fportal.nousresearch.com",[447],"portal.nousresearch.com"," để đăng ký một tài khoản.",[487,2184,2185,2186],{},"Chọn 'Local Dashboards'.\n",[432,2187],{"alt":2188,"src":2189},"Chọn tùy chọn Bảng điều khiển cục bộ (Local Dashboards) trên cổng thông tin Nous Research","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-local-dashboards-selection.webp",[487,2191,2192,2193],{},"Nhấp vào 'Register Dashboard'.\n",[432,2194],{"alt":2195,"src":2196},"Nhấp vào nút Đăng ký bảng điều khiển để tạo mới một thực thể bảng điều khiển","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-dashboard.webp",[487,2198,2199,2200],{},"Nhập địa chỉ IP mạng riêng của VPS của bạn làm 'Dashboard redirect URI' và nhấp vào 'Save'.\n",[432,2201],{"alt":2202,"src":2203},"Đăng ký địa chỉ IP riêng của máy chủ VPS làm URI chuyển hướng trong cổng Nous Research","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-redirect-uri.webp",[487,2205,2206,2207,2210],{},"Sao chép 'OAuth client ID' và dán nó vào tệp ",[494,2208,2209],{},"config.yaml"," của bạn:",[932,2212,2216],{"className":2213,"code":2214,"language":2215,"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",[494,2217,2218,2225,2235,2245,2252,2262,2272,2279,2290],{"__ignoreMap":424},[940,2219,2220,2223],{"class":942,"line":943},[940,2221,2222],{"class":1362},"dashboard",[940,2224,1376],{"class":954},[940,2226,2227,2230,2232],{"class":942,"line":1070},[940,2228,2229],{"class":1362},"  theme",[940,2231,898],{"class":954},[940,2233,2234],{"class":1054}," default\n",[940,2236,2237,2240,2242],{"class":942,"line":1077},[940,2238,2239],{"class":1362},"  show_token_analytics",[940,2241,898],{"class":954},[940,2243,2244],{"class":1386}," false\n",[940,2246,2247,2250],{"class":942,"line":1084},[940,2248,2249],{"class":1362},"  oauth",[940,2251,1376],{"class":954},[940,2253,2254,2257,2259],{"class":942,"line":1934},[940,2255,2256],{"class":1362},"    client_id",[940,2258,898],{"class":954},[940,2260,2261],{"class":1054}," agent:cmq02x7ha0002jk0ba3kfnb\n",[940,2263,2264,2267,2269],{"class":942,"line":1939},[940,2265,2266],{"class":1362},"    portal_url",[940,2268,898],{"class":954},[940,2270,2271],{"class":1054}," https:\u002F\u002Fportal.nousresearch.com\n",[940,2273,2274,2277],{"class":942,"line":1945},[940,2275,2276],{"class":1362},"  basic_auth",[940,2278,1376],{"class":954},[940,2280,2282,2285,2287],{"class":942,"line":2281},8,[940,2283,2284],{"class":1362},"    username",[940,2286,898],{"class":954},[940,2288,2289],{"class":954}," ''\n",[940,2291,2293,2296,2298],{"class":942,"line":2292},9,[940,2294,2295],{"class":1362},"    password_hash",[940,2297,898],{"class":954},[940,2299,2289],{"class":954},[2168,2301,2303],{"id":2302},"thiết-lập-systemd-để-tự-khởi-động-bảng-điều-khiển-hermes","Thiết lập Systemd để Tự khởi động Bảng điều khiển Hermes",[532,2305,2306],{},[487,2307,2308],{},"Tạo một tệp dịch vụ:",[932,2310,2314],{"className":2311,"code":2312,"language":2313,"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",[494,2315,2316],{"__ignoreMap":424},[940,2317,2318,2320,2323],{"class":942,"line":943},[940,2319,1902],{"class":1050},[940,2321,2322],{"class":1054}," nano",[940,2324,2325],{"class":1054}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[532,2327,2328],{"start":1070},[487,2329,2330,2331,2334],{},"Dán cấu hình sau, đảm bảo ",[494,2332,2333],{},"--host 0.0.0.0"," là một phần của lệnh:",[932,2336,2340],{"className":2337,"code":2338,"language":2339,"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",[494,2341,2342,2347,2352,2357,2361,2366,2371,2376,2381,2386,2392,2398,2403,2409],{"__ignoreMap":424},[940,2343,2344],{"class":942,"line":943},[940,2345,2346],{},"[Unit]\n",[940,2348,2349],{"class":942,"line":1070},[940,2350,2351],{},"Description=Hermes Dashboard\n",[940,2353,2354],{"class":942,"line":1077},[940,2355,2356],{},"After=network.target\n",[940,2358,2359],{"class":942,"line":1084},[940,2360,1074],{"emptyLinePlaceholder":1073},[940,2362,2363],{"class":942,"line":1934},[940,2364,2365],{},"[Service]\n",[940,2367,2368],{"class":942,"line":1939},[940,2369,2370],{},"User=hermes\n",[940,2372,2373],{"class":942,"line":1945},[940,2374,2375],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[940,2377,2378],{"class":942,"line":2281},[940,2379,2380],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[940,2382,2383],{"class":942,"line":2292},[940,2384,2385],{},"Restart=always\n",[940,2387,2389],{"class":942,"line":2388},10,[940,2390,2391],{},"RestartSec=10\n",[940,2393,2395],{"class":942,"line":2394},11,[940,2396,2397],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[940,2399,2401],{"class":942,"line":2400},12,[940,2402,1074],{"emptyLinePlaceholder":1073},[940,2404,2406],{"class":942,"line":2405},13,[940,2407,2408],{},"[Install]\n",[940,2410,2411],{"class":942,"line":1703},[940,2412,2413],{},"WantedBy=multi-user.target\n",[532,2415,2416],{"start":1077},[487,2417,2418],{},"Bật và khởi động dịch vụ:",[932,2420,2422],{"className":2311,"code":2421,"language":2313,"meta":424,"style":424},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[494,2423,2424,2433,2444,2455],{"__ignoreMap":424},[940,2425,2426,2428,2430],{"class":942,"line":943},[940,2427,1902],{"class":1050},[940,2429,1905],{"class":1054},[940,2431,2432],{"class":1054}," daemon-reload\n",[940,2434,2435,2437,2439,2441],{"class":942,"line":1070},[940,2436,1902],{"class":1050},[940,2438,1905],{"class":1054},[940,2440,2032],{"class":1054},[940,2442,2443],{"class":1054}," hermes-dashboard\n",[940,2445,2446,2448,2450,2453],{"class":942,"line":1077},[940,2447,1902],{"class":1050},[940,2449,1905],{"class":1054},[940,2451,2452],{"class":1054}," start",[940,2454,2443],{"class":1054},[940,2456,2457,2459,2461,2463],{"class":942,"line":1084},[940,2458,1902],{"class":1050},[940,2460,1905],{"class":1054},[940,2462,1929],{"class":1054},[940,2464,2443],{"class":1054},[888,2466,2468],{"id":2467},"bước-6-cài-đặt-máy-khách-cloudflare-warp-trên-máy-tính-bàn","Bước 6: Cài đặt Máy khách Cloudflare WARP trên Máy tính bàn",[532,2470,2471,2479,2482,2489,2496,2503],{},[487,2472,2473,2474,460],{},"Tải xuống máy khách Cloudflare WARP từ ",[443,2475,2478],{"href":2476,"rel":2477},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[447],"cổng thông tin của Cloudflare",[487,2480,2481],{},"Mở và khởi chạy máy khách Cloudflare WARP sau khi cài đặt.",[487,2483,2484,2485],{},"Đăng nhập khi được nhắc.\n",[432,2486],{"alt":2487,"src":2488},"Yêu cầu đăng nhập của ứng dụng khách Cloudflare WARP trên máy tính để bàn","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-prompt.webp",[487,2490,2491,2492],{},"Một trang 'Success' (Thành công) sẽ được hiển thị sau khi đăng nhập thành công.\n",[432,2493],{"alt":2494,"src":2495},"Trang web xác thực thành công sau khi đăng nhập vào Cloudflare Zero Trust trên máy tính","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-success.webp",[487,2497,2498,2499],{},"Máy khách WARP hiện sẽ cho thấy nó đã được kết nối với nhóm Zero Trust của bạn.\n",[432,2500],{"alt":2501,"src":2502},"Khách hàng Cloudflare WARP máy tính xác nhận kết nối đang hoạt động tới mạng riêng","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-client-connected.webp",[487,2504,2505,2506,2509,2510],{},"Điều hướng đến trình duyệt web của bạn và nhập IP riêng (ví dụ: ",[494,2507,2508],{},"100.96.0.3","). Bảng điều khiển Hermes Web sẽ tải thành công.\n",[432,2511],{"alt":2512,"src":2513},"Truy cập giao diện Web Dashboard riêng tư của Hermes Agent trên trình duyệt máy tính","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-desktop-view.webp",[2515,2516,2517],"blockquote",{},[429,2518,2519,2522,2523,2528],{},[440,2520,2521],{},"Mẹo hữu ích cho Người dùng macOS:"," Nếu bạn đang sử dụng máy khách WARP để truy cập nhiều tài khoản Cloudflare, hãy xem hướng dẫn nhanh của chúng tôi về ",[440,2524,2525],{},[443,2526,2527],{"href":399},"Chuyển đổi giữa các tổ chức Cloudflare WARP trên máy Mac"," để chuyển đổi giữa các tài khoản một cách liền mạch.",[888,2530,2532],{"id":2531},"bước-7-cài-đặt-máy-khách-cloudflare-warp-trên-thiết-bị-ios","Bước 7: Cài đặt Máy khách Cloudflare WARP trên Thiết bị iOS",[532,2534,2535,2542,2550,2558,2566],{},[487,2536,2537,2538,2541],{},"Cài đặt ",[440,2539,2540],{},"Cloudflare One"," từ App Store.",[487,2543,2544,2545],{},"Mở ứng dụng Cloudflare One và nhập tên nhóm của bạn khi được nhắc.\n",[432,2546],{"alt":2547,"src":2548,"width":2549},"Nhập tên nhóm Cloudflare Zero Trust trong ứng dụng Cloudflare One trên thiết bị iOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-team-name-prompt.webp",239,[487,2551,2552,2553],{},"Đăng nhập bằng cùng một địa chỉ email đã được định cấu hình trong quy tắc chính sách ở trên.\n",[432,2554],{"alt":2555,"src":2556,"width":2557},"Yêu cầu xác thực email cho hệ thống Cloudflare Zero Trust trên thiết bị iOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-email-login.webp",229,[487,2559,2560,2561],{},"Sau khi được kết nối, nó sẽ trông giống như sau:\n",[432,2562],{"alt":2563,"src":2564,"width":2565},"Ứng dụng Cloudflare One hiển thị trạng thái kết nối trên thiết bị di động iOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-client-connected.webp",322,[487,2567,2568,2569,2571,2572],{},"Điều hướng đến trình duyệt web của bạn và nhập IP riêng ",[494,2570,2508],{}," để truy cập Bảng điều khiển Hermes Web trên thiết bị di động của bạn.\n",[432,2573],{"alt":2574,"src":2575,"width":2576},"Truy cập vào giao diện web điều khiển Hermes Agent trên trình duyệt điện thoại di động","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-mobile-view.webp",345,[473,2578,2580],{"id":2579},"phần-kết-luận","Phần Kết luận",[429,2582,2583,2584,2586,2587,2590],{},"Với ",[440,2585,1732],{}," xử lý các chính sách nhận dạng và máy khách ",[440,2588,2589],{},"WARP"," định tuyến lưu lượng truy cập qua một đường hầm mã hóa, Hermes Agent của bạn đã có thể được truy cập an toàn từ các thiết bị của bạn trên phạm vi toàn cầu. Thiết lập này đặt nền móng an toàn và vững chắc cho việc xây dựng và truy cập một cơ sở hạ tầng AI riêng tư, vận hành hoàn toàn từ xa.",[1647,2592,2593],{},"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":1070,"depth":1077,"links":2595},[2596,2599,2611],{"id":1746,"depth":1070,"text":1747,"children":2597},[2598],{"id":1765,"depth":1077,"text":1766},{"id":1777,"depth":1070,"text":1778,"children":2600},[2601,2602,2603,2604,2605,2609,2610],{"id":1781,"depth":1077,"text":1782},{"id":1835,"depth":1077,"text":1836},{"id":1976,"depth":1077,"text":1977},{"id":2013,"depth":1077,"text":2014},{"id":2155,"depth":1077,"text":2156,"children":2606},[2607,2608],{"id":2170,"depth":1084,"text":2171},{"id":2302,"depth":1084,"text":2303},{"id":2467,"depth":1077,"text":2468},{"id":2531,"depth":1077,"text":2532},{"id":2579,"depth":1070,"text":2580},[1667,2613],"security","2026-07-09","Tìm hiểu cách hiển thị và truy cập an toàn Hermes Agent trên toàn cầu bằng nền tảng Cloudflare WARP và Zero Trust mà không cần mở bất kỳ cổng tường lửa nào.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FVI-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","Hiển thị an toàn Hermes Agent vào mạng riêng bằng Cloudflare Zero Trust và đường hầm WARP",{"schemaOrg":2619,"robots":1701,"sitemap":2650},[2620],{"@type":1680,"headline":1716,"description":2615,"name":1716,"image":2616,"step":2621},[2622,2626,2630,2634,2638,2642,2646],{"@type":1683,"name":2623,"text":2624,"url":2625,"image":1800},"Thiết lập Cloudflare Zero Trust","Đăng nhập vào Bảng điều khiển Cloudflare của bạn. Nhấp vào 'Zero Trust' từ menu bên trái. Nếu đây là lần đầu tiên, bạn akan được nhắc chọn một gói (bản Miễn phí hoàn toàn phù hợp cho thiết lập này) và đặt tên cho nhóm của bạn (ví dụ: ai-team). Nhấp v","#step-1",{"@type":1683,"name":2627,"text":2628,"url":2629,"image":1973},"Thiết lập máy khách Cloudflare WARP trên VPS","Chạy sudo apt update và sudo apt install cloudflare-warp trong terminal trên VPS của bạn. Chạy warp-cli registration new \u003CTEAM-NAME> trong terminal trên VPS của bạn, một URL sẽ được in ra. Sao chép URL vừa được in, nó sẽ có dạng https:\u002F\u002F\u003Cteam>.cloudf","#step-2",{"@type":1683,"name":2631,"text":2632,"url":2633,"image":1986},"Thiết lập Định tuyến Lưu lượng","Nhấp vào cấu hình VPS của bạn trên bảng điều khiển Devices. Cuộn xuống phần 'Split Tunnels'. Nhấp vào nút 'Manage' (Quản lý) và định cấu hình các thiết lập như minh họa bên dưới. Thay thế địa chỉ IP nếu cần. Hiển thị address và host sẽ định tuyến lưu","#step-3",{"@type":1683,"name":2635,"text":2636,"url":2637},"Cấu hình Tường lửa trên VPS","Bật tường lửa để chỉ cho phép mạng con '100.96.0.0\u002F12', đồng thời chặn tất cả các quyền truy cập công cộng đến khác. bash Cho phép lưu lượng loopback (quay vòng) để tránh làm hỏng các dịch vụ cục bộ: bash Tải lại tường lửa và xác minh trạng thái: bas","#step-4",{"@type":1683,"name":2639,"text":2640,"url":2641},"Hiển thị Hermes Agent vào Mạng Riêng","Chúng ta sẽ hiển thị Hermes Agent Web Dashboard vào mạng riêng của mình và sử dụng nhà cung cấp xác thực mặc định là Nous Research.","#step-5",{"@type":1683,"name":2643,"text":2644,"url":2645,"image":2488},"Cài đặt Máy khách Cloudflare WARP trên Máy tính bàn","Tải xuống máy khách Cloudflare WARP từ cổng thông tin của Cloudflare. Mở và khởi chạy máy khách Cloudflare WARP sau khi cài đặt. Đăng nhập khi được nhắc. Một trang 'Success' (Thành công) sẽ được hiển thị sau khi đăng nhập thành công. Máy khách WARP h","#step-6",{"@type":1683,"name":2647,"text":2648,"url":2649,"image":2548},"Cài đặt Máy khách Cloudflare WARP trên Thiết bị iOS","Cài đặt Cloudflare One từ App Store. Mở ứng dụng Cloudflare One và nhập tên nhóm của bạn khi được nhắc. Đăng nhập bằng cùng một địa chỉ email đã được định cấu hình trong quy tắc chính sách ở trên. Sau khi được kết nối, nó sẽ trông giống như sau: Điều","#step-7",{"lastmod":2651},"2026-09-28",{"title":2653,"description":2615,"ogTitle":1716,"ogDescription":2615,"twitterTitle":1716,"twitterDescription":2615},"Truy cập an toàn Hermes Agent bằng Cloudflare Zero Trust","vi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[1728,2656,1724,2657,2658],"Zero Trust","Mạng riêng","Hướng dẫn","cj9xDUr4OU-vTUS6m18q2Qy2nRQKSVmUduRnaiOxXEc",[2661,4871,5273],{"id":2662,"title":454,"author":424,"body":2663,"category":4839,"date":4840,"description":464,"extension":1672,"image":465,"imageAlt":466,"isPublished":1073,"meta":4841,"minRead":3143,"navigation":1073,"path":383,"seo":4863,"stem":4865,"tags":4866,"updatedAt":1710,"__hash__":4870},"article\u002Fvi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md",{"type":426,"value":2664,"toc":4809},[2665,2668,2674,2679,2683,2686,2724,2728,2734,2772,2776,2780,2794,2800,2806,2810,2814,2828,2834,2884,2913,2917,2925,2931,2935,2938,3157,3161,3207,3214,3221,3229,3279,3285,3314,3318,3322,3349,3377,3382,3424,3433,3714,3718,3764,3769,3776,3781,3785,3809,3812,3818,3824,3828,3836,3842,3845,3851,3858,3882,3889,3895,3898,3904,3908,3911,3914,3917,3923,3926,3932,3938,3944,3949,3953,3964,3971,3977,3980,3986,3990,3997,4003,4009,4013,4021,4085,4094,4149,4152,4222,4228,4242,4248,4252,4297,4303,4306,4312,4315,4321,4325,4341,4357,4363,4460,4463,4469,4480,4526,4533,4539,4552,4568,4571,4577,4581,4588,4610,4619,4717,4729,4735,4742,4748,4751,4757,4760,4766,4770,4773,4776,4806],[429,2666,2667],{},"Sự phân mảnh ngữ cảnh là một trở ngại vô cùng khó chịu khi làm việc với nhiều tác nhân AI (AI agent). Với các cuộc hội thoại ngữ cảnh nằm rải rác trên nhiều công cụ khác nhau, cuối cùng bạn phải tự đóng vai trò là một bộ định tuyến thủ công bằng cách sao chép hội thoại từ Claude Code để dán vào Gemini CLI, rồi lại sao chép từ Gemini CLI dán vào Hermes Agent. Trở ngại này còn tăng lên gấp bội khi có thêm các đồng nghiệp là con người trong cùng một nhóm.",[429,2669,2670],{},[432,2671],{"alt":2672,"src":2673},"Giao diện người dùng của không gian làm việc cộng tác Buzz hiển thị các kênh trò chuyện và tác nhân AI đang hoạt động","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-workspace-interface.webp",[429,2675,2676,2678],{},[440,2677,1111],{},", một không gian làm việc cộng tác nguồn mở, kết nối các nhóm làm việc giữa con người và tác nhân AI vào cùng một môi trường thống nhất. Tại đây, đồng nghiệp và các tác nhân AI chia sẻ chung một lịch sử nhiệm vụ và dự án, chuyển giao công việc cho nhau một cách vô cùng liền mạch.",[473,2680,2682],{"id":2681},"blocks-buzz-là-gì-không-gian-làm-việc-cộng-tác-cùng-ai-agent","Block's Buzz là gì? Không gian làm việc cộng tác cùng AI Agent",[429,2684,2685],{},"Buzz là một không gian làm việc cộng tác nguồn mở từ Block (công ty của Jack Dorsey), nơi con người và các tác nhân AI cùng chia sẻ chung các kênh và dự án. Buzz cung cấp các tính năng nổi bật sau:",[484,2687,2688,2694,2700,2706,2712,2718],{},[487,2689,2690,2693],{},[440,2691,2692],{},"Ngữ cảnh chia sẻ:"," Các kênh là nơi con người và tác nhân AI cộng tác với nhau. Tất cả lịch sử trò chuyện và dự án đều được lưu trữ đầy đủ trong kênh.",[487,2695,2696,2699],{},[440,2697,2698],{},"Giao tiếp giữa tác nhân với tác nhân:"," Các tác nhân AI có thể giao tiếp trực tiếp với nhau, ngay cả trên các thiết bị khác nhau. Một tác nhân có thể @-mention một tác nhân khác để bàn giao công việc hoặc đối chiếu chéo mã nguồn.",[487,2701,2702,2705],{},[440,2703,2704],{},"Kích hoạt bằng lượt nhắc (mention-driven):"," Các tác nhân AI chỉ hoạt động khi được @-mention, nếu không sẽ luôn ở trạng thái tĩnh. Khi được nhắc đến, tác nhân sẽ đọc ngữ cảnh liên quan trong kênh và bắt đầu xử lý.",[487,2707,2708,2711],{},[440,2709,2710],{},"Hệ thống danh tính thống nhất:"," Con người và tác nhân AI sử dụng chung một hệ thống danh tính, được xác thực thông qua các khóa mật mã (cryptographic keys).",[487,2713,2714,2717],{},[440,2715,2716],{},"Ủy quyền ra lệnh:"," Bạn có thể cấp quyền cho các đồng nghiệp là con người để điều khiển tác nhân của mình, cho phép cả nhóm cùng giao việc và tận dụng các trợ lý kỹ thuật số của nhau.",[487,2719,2720,2723],{},[440,2721,2722],{},"Máy chủ tự lưu trữ (self-hosted):"," Vì tự vận hành máy chủ, dữ liệu của bạn hoàn toàn nằm dưới quyền kiểm soát của riêng bạn. Bạn có thể chọn ai được tham gia và tự định nghĩa các quy tắc hoạt động.",[473,2725,2727],{"id":2726},"kiến-trúc-mật-mã-dựa-trên-giao-thức-nostr-của-buzz","Kiến trúc mật mã dựa trên giao thức Nostr của Buzz",[429,2729,2730],{},[432,2731],{"alt":2732,"src":2733},"Sơ đồ kiến trúc mật mã dựa trên giao thức Nostr của không gian làm việc cộng tác Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-nostr-cryptographic-architecture.webp",[484,2735,2736,2742,2748,2754,2760,2766],{},[487,2737,2738,2741],{},[440,2739,2740],{},"Nostr relay đóng vai trò là máy chủ:"," Các tin nhắn, quy trình làm việc, kho lưu trữ và các sự kiện khác được ký bằng mật mã, xác thực và lưu trữ trên một máy chủ Nostr relay. Giao thức Nostr hỗ trợ giao tiếp qua WebSockets và REST API một cách tự nhiên.",[487,2743,2744,2747],{},[440,2745,2746],{},"Danh tính mật mã thống nhất:"," Cả con người và tác nhân AI đều xác thực bằng khóa mật mã riêng của mình. Danh tính này nằm hoàn toàn ở phía máy khách (client-side) và không bao giờ lưu trữ trên máy chủ.",[487,2749,2750,2753],{},[440,2751,2752],{},"Thành viên tác nhân hạng nhất:"," Mỗi tác nhân sở hữu danh tính riêng, quyền thành viên kênh và nhật ký kiểm tra (audit trail). Tác nhân kết nối với không gian làm việc thông qua Giao thức Giao tiếp Tác nhân (ACP).",[487,2755,2756,2759],{},[440,2757,2758],{},"Kho lưu trữ Git phi tập trung:"," Kho lưu trữ mã nguồn được lưu trên bộ nhớ đối tượng tương thích với S3, trong khi các tác vụ, pull request và đánh giá mã (code review) được theo dõi trong nhật ký sự kiện của Nostr. Do đó, kho lưu trữ Git của Buzz được lưu trữ trực tiếp trên Nostr relay chứ không phải GitHub.",[487,2761,2762,2765],{},[440,2763,2764],{},"Ứng dụng Buzz là một Nostr client:"," Buzz độc lập với Nostr relay; đây là ứng dụng khách trên máy tính\u002Fđiện thoại kết nối đến URL của relay.",[487,2767,2768,2771],{},[440,2769,2770],{},"Cấu trúc hạ tầng:"," Cơ sở dữ liệu PostgreSQL xử lý lưu trữ sự kiện và tìm kiếm toàn văn, Redis quản lý hệ thống tin nhắn pub\u002Fsub, và MinIO tương thích S3 được dùng làm bộ nhớ lưu trữ tệp đa phương tiện.",[473,2773,2775],{"id":2774},"cách-tự-host-blocks-buzz-relay-trên-máy-chủ-linux-vps","Cách tự host Block's Buzz Relay trên máy chủ Linux VPS",[888,2777,2779],{"id":2778},"_0-điều-kiện-tiên-quyết","0. Điều kiện tiên quyết",[484,2781,2782,2785,2788,2791],{},[487,2783,2784],{},"Một máy chủ Linux VPS",[487,2786,2787],{},"Tên miền đã trỏ về địa chỉ IP máy chủ của bạn",[487,2789,2790],{},"Docker và Docker Compose plugin",[487,2792,2793],{},"Tài khoản Cloudflare (gói dịch vụ miễn phí)",[429,2795,2796,2797,2799],{},"Trong hướng dẫn này, chúng ta sẽ chạy Nostr relay trên VPS Ubuntu phía sau một mạng riêng tư của ",[443,2798,1716],{"href":363},". Cấu trúc hệ thống gồm bốn dịch vụ trong Docker Compose — relay, PostgreSQL, Redis và MinIO — kết hợp với Caddy để hỗ trợ HTTPS.",[462,2801],{"description":2802,"image":2616,"image-alt":2803,"label":2804,"min-read":2805,"title":1716,"to":363},"Tìm hiểu cách hiển thị và truy cập an toàn tác nhân Hermes của bạn trên toàn cầu bằng Cloudflare WARP và Zero Trust mà không cần mở cổng tường lửa đến.","Hiển thị an toàn tác nhân Hermes cho mạng riêng bằng Cloudflare Zero Trust và đường hầm WARP","Hướng dẫn liên quan","8",[888,2807,2809],{"id":2808},"_1-cloudflare-dns-và-api-token","1. Cloudflare DNS và API Token",[2168,2811,2813],{"id":2812},"tạo-cloudflare-api-token","Tạo Cloudflare API Token",[532,2815,2816,2822],{},[487,2817,2818,2819,460],{},"Nhấp vào biểu tượng người dùng ở góc trên cùng bên phải và chọn mục ",[440,2820,2821],{},"Profile",[487,2823,2824,2825,460],{},"Nhấp vào mục ",[440,2826,2827],{},"API Tokens",[429,2829,2830],{},[432,2831],{"alt":2832,"src":2833},"Trang hồ sơ người dùng Cloudflare hiển thị menu tạo API Tokens","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-profile-api-tokens.webp",[532,2835,2836,2842,2848,2868,2874,2878,2881],{"start":1077},[487,2837,2838,2839,460],{},"Nhấp vào nút ",[440,2840,2841],{},"Create Token",[487,2843,2844,2845,460],{},"Chọn sử dụng mẫu ",[440,2846,2847],{},"Edit zone DNS",[487,2849,2850,2851],{},"Cấu hình các thông số cho mẫu như sau:\n",[484,2852,2853,2859],{},[487,2854,2855,2858],{},[440,2856,2857],{},"Permissions",": Zone — DNS — Edit",[487,2860,2861,2864,2865],{},[440,2862,2863],{},"Zone Resources",": Include — Specific zone — ",[494,2866,2867],{},"example.com",[487,2869,2870,2871,460],{},"Nhấp chọn ",[440,2872,2873],{},"Continue to summary",[487,2875,2870,2876,460],{},[440,2877,2841],{},[487,2879,2880],{},"Hãy sao chép chuỗi mã thông báo vừa được tạo, vì nó sẽ không hiển thị lại sau khi bạn đóng trang này.",[487,2882,2883],{},"Kiểm tra xem mã thông báo vừa tạo có hoạt động hay không bằng terminal:",[932,2885,2887],{"className":1041,"code":2886,"language":1043,"meta":424,"style":424},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[494,2888,2889],{"__ignoreMap":424},[940,2890,2891,2894,2897,2900,2903,2906,2908,2911],{"class":942,"line":943},[940,2892,2893],{"class":1050},"curl",[940,2895,2896],{"class":954}," \"",[940,2898,2899],{"class":1054},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[940,2901,2902],{"class":954},"\"",[940,2904,2905],{"class":1054}," -H",[940,2907,2896],{"class":954},[940,2909,2910],{"class":1054},"Authorization: Bearer YOUR_TOKEN_HERE",[940,2912,1966],{"class":954},[2168,2914,2916],{"id":2915},"bản-ghi-dns","Bản ghi DNS",[484,2918,2919],{},[487,2920,2921,2922,460],{},"Tạo một bản ghi A mới và thiết lập ở trạng thái ",[440,2923,2924],{},"DNS only",[429,2926,2927],{},[432,2928],{"alt":2929,"src":2930},"Cấu hình bản ghi DNS A cho tên miền Buzz trong bảng điều khiển Cloudflare với trạng thái proxy là DNS only","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-dns-a-record-configuration.webp",[888,2932,2934],{"id":2933},"_2-cài-đặt-docker-trên-ubuntu","2. Cài đặt Docker trên Ubuntu",[429,2936,2937],{},"Chạy các lệnh sau trực tiếp trên Ubuntu để thực hiện cài đặt Docker:",[932,2939,2941],{"className":1041,"code":2940,"language":1043,"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",[494,2942,2943,2948,2976,2980,2985,3028,3032,3037,3047,3051,3056,3077,3081,3086,3097,3102,3108,3116,3121,3136,3141,3147],{"__ignoreMap":424},[940,2944,2945],{"class":942,"line":943},[940,2946,2947],{"class":1080},"# Add Docker's official GPG key and set up the Docker repository\n",[940,2949,2950,2952,2955,2958,2961,2964,2967,2970,2973],{"class":942,"line":1070},[940,2951,2893],{"class":1050},[940,2953,2954],{"class":1054}," -fsSL",[940,2956,2957],{"class":1054}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[940,2959,2960],{"class":954}," |",[940,2962,2963],{"class":1050}," sudo",[940,2965,2966],{"class":1054}," gpg",[940,2968,2969],{"class":1054}," --dearmor",[940,2971,2972],{"class":1054}," -o",[940,2974,2975],{"class":1054}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[940,2977,2978],{"class":942,"line":1077},[940,2979,1074],{"emptyLinePlaceholder":1073},[940,2981,2982],{"class":942,"line":1084},[940,2983,2984],{"class":1080},"# Add the official Docker repository\n",[940,2986,2987,2990,2992,2995,2998,3001,3004,3007,3010,3012,3014,3016,3019,3022,3025],{"class":942,"line":1934},[940,2988,2989],{"class":971},"echo",[940,2991,2896],{"class":954},[940,2993,2994],{"class":1054},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[940,2996,2997],{"class":954},"$(",[940,2999,3000],{"class":1050},"lsb_release",[940,3002,3003],{"class":1054}," -cs",[940,3005,3006],{"class":954},")",[940,3008,3009],{"class":1054}," stable",[940,3011,2902],{"class":954},[940,3013,2960],{"class":954},[940,3015,2963],{"class":1050},[940,3017,3018],{"class":1054}," tee",[940,3020,3021],{"class":1054}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[940,3023,3024],{"class":954}," >",[940,3026,3027],{"class":1054}," \u002Fdev\u002Fnull\n",[940,3029,3030],{"class":942,"line":1939},[940,3031,1074],{"emptyLinePlaceholder":1073},[940,3033,3034],{"class":942,"line":1945},[940,3035,3036],{"class":1080},"# Update package list\n",[940,3038,3039,3041,3044],{"class":942,"line":2281},[940,3040,1902],{"class":1050},[940,3042,3043],{"class":1054}," apt",[940,3045,3046],{"class":1054}," update\n",[940,3048,3049],{"class":942,"line":2292},[940,3050,1074],{"emptyLinePlaceholder":1073},[940,3052,3053],{"class":942,"line":2388},[940,3054,3055],{"class":1080},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[940,3057,3058,3060,3062,3065,3068,3071,3074],{"class":942,"line":2394},[940,3059,1902],{"class":1050},[940,3061,3043],{"class":1054},[940,3063,3064],{"class":1054}," install",[940,3066,3067],{"class":1054}," docker-ce",[940,3069,3070],{"class":1054}," docker-ce-cli",[940,3072,3073],{"class":1054}," containerd.io",[940,3075,3076],{"class":1054}," -y\n",[940,3078,3079],{"class":942,"line":2400},[940,3080,1074],{"emptyLinePlaceholder":1073},[940,3082,3083],{"class":942,"line":2405},[940,3084,3085],{"class":1080},"# Start automatically when the system boots\n",[940,3087,3088,3090,3092,3094],{"class":942,"line":1703},[940,3089,1902],{"class":1050},[940,3091,1905],{"class":1054},[940,3093,2032],{"class":1054},[940,3095,3096],{"class":1054}," docker\n",[940,3098,3100],{"class":942,"line":3099},15,[940,3101,1074],{"emptyLinePlaceholder":1073},[940,3103,3105],{"class":942,"line":3104},16,[940,3106,3107],{"class":1080},"# Verify docker is installed\n",[940,3109,3111,3113],{"class":942,"line":3110},17,[940,3112,1184],{"class":1050},[940,3114,3115],{"class":1054}," --version\n",[940,3117,3119],{"class":942,"line":3118},18,[940,3120,1074],{"emptyLinePlaceholder":1073},[940,3122,3124,3126,3128,3130,3133],{"class":942,"line":3123},19,[940,3125,1902],{"class":1050},[940,3127,3043],{"class":1054},[940,3129,3064],{"class":1054},[940,3131,3132],{"class":1054}," -y",[940,3134,3135],{"class":1054}," docker-compose-plugin\n",[940,3137,3139],{"class":942,"line":3138},20,[940,3140,1074],{"emptyLinePlaceholder":1073},[940,3142,3144],{"class":942,"line":3143},21,[940,3145,3146],{"class":1080},"# Verify the compose plugin is installed\n",[940,3148,3150,3152,3154],{"class":942,"line":3149},22,[940,3151,1184],{"class":1050},[940,3153,1187],{"class":1054},[940,3155,3156],{"class":1054}," version\n",[888,3158,3160],{"id":3159},"_3-tải-mã-nguồn-clone-và-cấu-hình","3. Tải mã nguồn (Clone) và cấu hình",[932,3162,3164],{"className":1041,"code":3163,"language":1043,"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",[494,3165,3166,3177,3181,3189,3200],{"__ignoreMap":424},[940,3167,3168,3171,3174],{"class":942,"line":943},[940,3169,3170],{"class":1050},"git",[940,3172,3173],{"class":1054}," clone",[940,3175,3176],{"class":1054}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[940,3178,3179],{"class":942,"line":1070},[940,3180,1074],{"emptyLinePlaceholder":1073},[940,3182,3183,3186],{"class":942,"line":1077},[940,3184,3185],{"class":971},"cd",[940,3187,3188],{"class":1054}," buzz\u002Fdeploy\u002Fcompose\n",[940,3190,3191,3194,3197],{"class":942,"line":1084},[940,3192,3193],{"class":1050},"cp",[940,3195,3196],{"class":1054}," .env.example",[940,3198,3199],{"class":1054}," .env\n",[940,3201,3202,3205],{"class":942,"line":1934},[940,3203,3204],{"class":1050},"nano",[940,3206,3199],{"class":1054},[429,3208,3209,3210,3213],{},"Chỉnh sửa tệp cấu hình ",[494,3211,3212],{},".env"," theo từng nhóm thông số:",[484,3215,3216],{},[487,3217,3218],{},[440,3219,3220],{},"Cấu hình Domain:",[932,3222,3227],{"className":3223,"code":3225,"language":3226},[3224],"language-text","BUZZ_DOMAIN=buzz.pafor.me\nRELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\nBUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_MEDIA_BASE_URL=https:\u002F\u002Fbuzz.pafor.me\u002Fmedia\nBUZZ_MEDIA_SERVER_DOMAIN=buzz.pafor.me\nBUZZ_CORS_ORIGINS=https:\u002F\u002Fbuzz.pafor.me\n","text",[494,3228,3225],{"__ignoreMap":424},[484,3230,3231,3241],{},[487,3232,3233,3236,3237,3240],{},[440,3234,3235],{},"Khóa chủ sở hữu:"," ",[494,3238,3239],{},"RELAY_OWNER_PUBKEY"," yêu cầu khóa công khai dạng hex dài 64 ký tự của bạn. Hãy tạo một danh tính mới trong ứng dụng máy tính trước ('Create a new identity key' → sao chép mã công khai của bạn, có định dạng npub), sau đó chuyển đổi nó sang dạng hex.",[487,3242,3243,3246],{},[440,3244,3245],{},"Khóa bí mật (Secrets):",[484,3247,3248,3260,3273],{},[487,3249,3250,3251,3255,3256,3259],{},"Tạo các khóa bí mật bằng cách sử dụng ",[443,3252,3254],{"href":3253},"\u002Fvi\u002Ftools\u002Fsecret-key-hex","công cụ trực tuyến"," này hoặc chạy lệnh ",[494,3257,3258],{},"openssl rand -hex 32"," (thực hiện bảy lần).",[487,3261,3262,3263,578,3266,752,3269,3272],{},"Thay thế mọi chỗ trống ",[494,3264,3265],{},"CHANGE_ME",[494,3267,3268],{},"BUZZ_RELAY_PRIVATE_KEY",[494,3270,3271],{},"BUZZ_GIT_HOOK_HMAC_SECRET",", mật khẩu Postgres\u002FRedis\u002FTypesense, cũng như khóa truy cập\u002Fbí mật của S3.",[487,3274,3275,3276,460],{},"Việc quên thay đổi các placeholder này là nguyên nhân phổ biến nhất khiến container bị lặp lại quá trình khởi động; hãy kiểm tra lại bằng lệnh ",[494,3277,3278],{},"grep CHANGE_ME .env",[932,3280,3283],{"className":3281,"code":3282,"language":3226},[3224],"    BUZZ_RELAY_PRIVATE_KEY=CHANGE_ME_64_HEX_PRIVATE_KEY\n    BUZZ_GIT_HOOK_HMAC_SECRET=CHANGE_ME_RANDOM_64_HEX\n    POSTGRES_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    REDIS_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    TYPESENSE_API_KEY=CHANGE_ME_RANDOM_API_KEY\n    BUZZ_S3_ACCESS_KEY=CHANGE_ME_RANDOM_ACCESS_KEY\n    BUZZ_S3_SECRET_KEY=CHANGE_ME_RANDOM_SECRET_KEY\n",[494,3284,3282],{"__ignoreMap":424},[484,3286,3287],{},[487,3288,3289,3292],{},[440,3290,3291],{},"Cấu hình khác:",[484,3293,3294,3301],{},[487,3295,3296,3297,3300],{},"Thêm biến môi trường ",[494,3298,3299],{},"CLOUDFLARE_API_TOKEN"," và gán giá trị API token đã tạo ở bước trước. Việc này là bắt buộc đối với Caddy.",[487,3302,3303,3304,752,3306,3309,3310,3313],{},"Buzz mặc định mở quyền tự do tham gia — bất kỳ ai biết URL relay của bạn đều có thể xác thực và kết nối. Hãy thiết lập ",[494,3305,3239],{},[494,3307,3308],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",", và ",[494,3311,3312],{},"BUZZ_REQUIRE_AUTH_TOKEN=true"," để tăng tính bảo mật.",[888,3315,3317],{"id":3316},"_4-kích-hoạt-https-với-caddy","4. Kích hoạt HTTPS với Caddy",[2168,3319,3321],{"id":3320},"xây-dựng-hình-ảnh-caddy-tùy-chỉnh-kèm-theo-mô-đun-dns-cloudflare","Xây dựng hình ảnh Caddy tùy chỉnh kèm theo mô-đun DNS Cloudflare",[484,3323,3324,3335,3346],{},[487,3325,3326,3327,3330,3331,3334],{},"Chúng ta thiết lập DNS-01 của Cloudflare cho Caddy. Phương thức DNS-01 hoạt động bằng cách yêu cầu plugin viết một bản ghi TXT ",[494,3328,3329],{},"_acme-challenge.buzz.pafor.me"," lên ",[440,3332,3333],{},"DNS công khai",";",[487,3336,3337,3338,3341,3342,3345],{},"Sau đó Let's Encrypt sẽ truy vấn bản ghi này từ internet để xác minh quyền sở hữu tên miền của bạn. Điều này nghĩa là ",[494,3339,3340],{},"pafor.me"," phải là một vùng (zone) công khai trong tài khoản Cloudflare của bạn — không thể chỉ là một hostname nội bộ chỉ tồn tại trong DNS riêng tư của Zero Trust \u002F WARP. Nếu ",[494,3343,3344],{},"buzz.pafor.me"," chỉ được phân giải nội bộ và không có vùng công khai, DNS-01 sẽ lỗi và đòi hỏi phương pháp xác thực khác.",[487,3347,3348],{},"Thêm cấu hình sau vào tệp Caddyfile:",[932,3350,3352],{"className":1350,"code":3351,"language":1352,"meta":424,"style":424},"{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n",[494,3353,3354,3359,3373],{"__ignoreMap":424},[940,3355,3356],{"class":942,"line":943},[940,3357,3358],{"class":954},"{\n",[940,3360,3361,3364,3367,3370],{"class":942,"line":1070},[940,3362,3363],{"class":1054},"  acme_dns cloudflare",[940,3365,3366],{"class":954}," {",[940,3368,3369],{"class":1054},"env.CLOUDFLARE_API_TOKEN",[940,3371,3372],{"class":954},"}\n",[940,3374,3375],{"class":942,"line":1077},[940,3376,3372],{"class":954},[484,3378,3379],{},[487,3380,3381],{},"Tạo một tệp Dockerfile.caddy với nội dung sau, tệp này được yêu cầu bởi compose.caddy.yml:",[932,3383,3385],{"className":1350,"code":3384,"language":1352,"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",[494,3386,3387,3392,3396,3401,3406,3410,3415,3419],{"__ignoreMap":424},[940,3388,3389],{"class":942,"line":943},[940,3390,3391],{"class":1054},"FROM caddy:2-builder AS builder\n",[940,3393,3394],{"class":942,"line":1070},[940,3395,1074],{"emptyLinePlaceholder":1073},[940,3397,3398],{"class":942,"line":1077},[940,3399,3400],{"class":1054},"RUN xcaddy build \\\n",[940,3402,3403],{"class":942,"line":1084},[940,3404,3405],{"class":1054},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[940,3407,3408],{"class":942,"line":1934},[940,3409,1074],{"emptyLinePlaceholder":1073},[940,3411,3412],{"class":942,"line":1939},[940,3413,3414],{"class":1054},"FROM caddy:2-alpine\n",[940,3416,3417],{"class":942,"line":1945},[940,3418,1074],{"emptyLinePlaceholder":1073},[940,3420,3421],{"class":942,"line":2281},[940,3422,3423],{"class":1054},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[484,3425,3426],{},[487,3427,3428,3429,3432],{},"Chỉnh sửa ",[494,3430,3431],{},"compose.caddy.yml"," để sử dụng image với mô-đun Cloudflare và gán API token của Cloudflare:",[932,3434,3436],{"className":1350,"code":3435,"language":1352,"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",[494,3437,3438,3445,3452,3465,3469,3476,3483,3494,3504,3514,3521,3528,3538,3545,3555,3565,3571,3583,3594,3601,3608,3615,3622,3633,3641,3649,3654,3662,3670,3678,3689,3697,3704],{"__ignoreMap":424},[940,3439,3440,3443],{"class":942,"line":943},[940,3441,3442],{"class":1362},"services",[940,3444,1376],{"class":954},[940,3446,3447,3450],{"class":942,"line":1070},[940,3448,3449],{"class":1362},"  relay",[940,3451,1376],{"class":954},[940,3453,3454,3457,3459,3462],{"class":942,"line":1077},[940,3455,3456],{"class":1362},"    ports",[940,3458,898],{"class":954},[940,3460,3461],{"class":946}," !reset",[940,3463,3464],{"class":954}," []\n",[940,3466,3467],{"class":942,"line":1084},[940,3468,1074],{"emptyLinePlaceholder":1073},[940,3470,3471,3474],{"class":942,"line":1934},[940,3472,3473],{"class":1362},"  caddy",[940,3475,1376],{"class":954},[940,3477,3478,3481],{"class":942,"line":1939},[940,3479,3480],{"class":1362},"    build",[940,3482,1376],{"class":954},[940,3484,3485,3488,3490],{"class":942,"line":1945},[940,3486,3487],{"class":1362},"      context",[940,3489,898],{"class":954},[940,3491,3493],{"class":3492},"sbssI"," .\n",[940,3495,3496,3499,3501],{"class":942,"line":2281},[940,3497,3498],{"class":1362},"      dockerfile",[940,3500,898],{"class":954},[940,3502,3503],{"class":1054}," Dockerfile.caddy\n",[940,3505,3506,3509,3511],{"class":942,"line":2292},[940,3507,3508],{"class":1362},"    image",[940,3510,898],{"class":954},[940,3512,3513],{"class":1054}," buzz-caddy:cloudflare\n",[940,3515,3516,3519],{"class":942,"line":2388},[940,3517,3518],{"class":1362},"    depends_on",[940,3520,1376],{"class":954},[940,3522,3523,3526],{"class":942,"line":2394},[940,3524,3525],{"class":1362},"      relay",[940,3527,1376],{"class":954},[940,3529,3530,3533,3535],{"class":942,"line":2400},[940,3531,3532],{"class":1362},"        condition",[940,3534,898],{"class":954},[940,3536,3537],{"class":1054}," service_healthy\n",[940,3539,3540,3543],{"class":942,"line":2405},[940,3541,3542],{"class":1362},"    environment",[940,3544,1376],{"class":954},[940,3546,3547,3550,3552],{"class":942,"line":1703},[940,3548,3549],{"class":1362},"      BUZZ_DOMAIN",[940,3551,898],{"class":954},[940,3553,3554],{"class":1054}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[940,3556,3557,3560,3562],{"class":942,"line":3099},[940,3558,3559],{"class":1362},"      CLOUDFLARE_API_TOKEN",[940,3561,898],{"class":954},[940,3563,3564],{"class":1054}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[940,3566,3567,3569],{"class":942,"line":3104},[940,3568,3456],{"class":1362},[940,3570,1376],{"class":954},[940,3572,3573,3576,3578,3581],{"class":942,"line":3110},[940,3574,3575],{"class":954},"      -",[940,3577,2896],{"class":954},[940,3579,3580],{"class":1054},"${CADDY_HTTP_PORT:-80}:80",[940,3582,1966],{"class":954},[940,3584,3585,3587,3589,3592],{"class":942,"line":3118},[940,3586,3575],{"class":954},[940,3588,2896],{"class":954},[940,3590,3591],{"class":1054},"${CADDY_HTTPS_PORT:-443}:443",[940,3593,1966],{"class":954},[940,3595,3596,3599],{"class":942,"line":3123},[940,3597,3598],{"class":1362},"    volumes",[940,3600,1376],{"class":954},[940,3602,3603,3605],{"class":942,"line":3138},[940,3604,3575],{"class":954},[940,3606,3607],{"class":1054}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[940,3609,3610,3612],{"class":942,"line":3143},[940,3611,3575],{"class":954},[940,3613,3614],{"class":1054}," buzz-caddy-data:\u002Fdata\n",[940,3616,3617,3619],{"class":942,"line":3149},[940,3618,3575],{"class":954},[940,3620,3621],{"class":1054}," buzz-caddy-config:\u002Fconfig\n",[940,3623,3625,3628,3630],{"class":942,"line":3624},23,[940,3626,3627],{"class":1362},"    restart",[940,3629,898],{"class":954},[940,3631,3632],{"class":1054}," unless-stopped\n",[940,3634,3636,3639],{"class":942,"line":3635},24,[940,3637,3638],{"class":1362},"    networks",[940,3640,1376],{"class":954},[940,3642,3644,3646],{"class":942,"line":3643},25,[940,3645,3575],{"class":954},[940,3647,3648],{"class":1054}," buzz-net\n",[940,3650,3652],{"class":942,"line":3651},26,[940,3653,1074],{"emptyLinePlaceholder":1073},[940,3655,3657,3660],{"class":942,"line":3656},27,[940,3658,3659],{"class":1362},"volumes",[940,3661,1376],{"class":954},[940,3663,3665,3668],{"class":942,"line":3664},28,[940,3666,3667],{"class":1362},"  buzz-caddy-data",[940,3669,1376],{"class":954},[940,3671,3673,3676],{"class":942,"line":3672},29,[940,3674,3675],{"class":1362},"    labels",[940,3677,1376],{"class":954},[940,3679,3681,3684,3686],{"class":942,"line":3680},30,[940,3682,3683],{"class":1362},"      com.buzz.volume",[940,3685,898],{"class":954},[940,3687,3688],{"class":1054}," caddy-data\n",[940,3690,3692,3695],{"class":942,"line":3691},31,[940,3693,3694],{"class":1362},"  buzz-caddy-config",[940,3696,1376],{"class":954},[940,3698,3700,3702],{"class":942,"line":3699},32,[940,3701,3675],{"class":1362},[940,3703,1376],{"class":954},[940,3705,3707,3709,3711],{"class":942,"line":3706},33,[940,3708,3683],{"class":1362},[940,3710,898],{"class":954},[940,3712,3713],{"class":1054}," caddy-config\n",[2168,3715,3717],{"id":3716},"khởi-động-các-docker-container","Khởi động các Docker container",[932,3719,3721],{"className":1041,"code":3720,"language":1043,"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",[494,3722,3723,3746,3750,3755],{"__ignoreMap":424},[940,3724,3725,3727,3729,3732,3735,3737,3740,3743],{"class":942,"line":943},[940,3726,1184],{"class":1050},[940,3728,1187],{"class":1054},[940,3730,3731],{"class":1054}," -f",[940,3733,3734],{"class":1054}," compose.yml",[940,3736,3731],{"class":1054},[940,3738,3739],{"class":1054}," compose.caddy.yml",[940,3741,3742],{"class":1054}," up",[940,3744,3745],{"class":1054}," -d\n",[940,3747,3748],{"class":942,"line":1070},[940,3749,1074],{"emptyLinePlaceholder":1073},[940,3751,3752],{"class":942,"line":1077},[940,3753,3754],{"class":1080},"#Check the Docker status\n",[940,3756,3757,3759,3761],{"class":942,"line":1084},[940,3758,1184],{"class":1050},[940,3760,1187],{"class":1054},[940,3762,3763],{"class":1054}," ps\n",[432,3765],{"src":3766,"alt":3767,"style":3768},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fdocker-compose-ps-status-terminal.webp","Cửa sổ terminal hiển thị các container đang chạy cho dịch vụ Buzz qua lệnh docker compose ps","max-width: 700px; width: 100%; height: auto;",[429,3770,3771,3772,3775],{},"Mở trình duyệt web của bạn và truy cập ",[494,3773,3774],{},"http:\u002F\u002Fbuzz.pafor.me"," để kiểm tra xem relay đã hoạt động bình thường chưa.",[432,3777],{"src":3778,"alt":3779,"style":3780},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-relay-running-browser-verification.webp","Xác minh trên trình duyệt hiển thị phản hồi thành công từ Block's Buzz relay tự lưu trữ","max-width: 500px; width: 100%; height: auto;",[888,3782,3784],{"id":3783},"bước-5-thiết-lập-sao-lưu-tự-động-ngay-từ-ngày-đầu","Bước 5: Thiết lập sao lưu tự động ngay từ ngày đầu",[932,3786,3788],{"className":1041,"code":3787,"language":1043,"meta":424,"style":424},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[494,3789,3790,3801],{"__ignoreMap":424},[940,3791,3792,3795,3798],{"class":942,"line":943},[940,3793,3794],{"class":1050},"mkdir",[940,3796,3797],{"class":1054}," -p",[940,3799,3800],{"class":1054}," \u002Fbuzz_backups\n",[940,3802,3803,3806],{"class":942,"line":1070},[940,3804,3805],{"class":1050},"crontab",[940,3807,3808],{"class":1054}," -e\n",[429,3810,3811],{},"Cài đặt cron job sao lưu cơ sở dữ liệu hàng đêm:",[932,3813,3816],{"className":3814,"code":3815,"language":3226},[3224],"0 3 * * * cd \u002Fhome\u002F\u003Cuser>\u002Fbuzz\u002Fdeploy\u002Fcompose && docker compose exec -T postgres pg_dump -U buzz buzz > \u002Fbuzz_backups\u002Fbuzz-$(date +\\%Y\\%m\\%d).sql\n",[494,3817,3815],{"__ignoreMap":424},[429,3819,3820,3821,3823],{},"Lưu ý: Hãy coi ",[494,3822,3268],{}," là vĩnh viễn. Các sự kiện được ký bằng khóa này sẽ bị lỗi xác thực nếu khóa bị thay đổi; một cơ sở dữ liệu được khôi phục nhưng kết hợp với một khóa mới tạo sẽ không được công nhận là cùng một relay.",[473,3825,3827],{"id":3826},"thiết-lập-buzz-desktop-client-và-danh-tính-nostr","Thiết lập Buzz Desktop Client và Danh tính Nostr",[429,3829,3830,3831,3835],{},"Tải ứng dụng khách Buzz cho máy tính từ ",[443,3832,3833],{"href":3833,"rel":3834},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[447]," và cài đặt. Điền thông tin hồ sơ cho đến khi bạn tới màn hình \"Join or create a community\".",[429,3837,3838],{},[432,3839],{"alt":3840,"src":3841},"Màn hình thiết lập ban đầu của Buzz Desktop Client để tham gia hoặc tạo cộng đồng","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-setup-community.webp",[429,3843,3844],{},"Nhấp vào \"Join a community\" và sao chép khóa công khai của bạn.",[429,3846,3847],{},[432,3848],{"alt":3849,"src":3850},"Ứng dụng khách Buzz hiển thị danh tính khóa công khai trước khi tham gia cộng đồng","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,3852,3853,3854,3857],{},"Chạy lệnh sau trên ",[440,3855,3856],{},"VPS"," để tự thêm mình làm thành viên đầu tiên:",[932,3859,3861],{"className":1041,"code":3860,"language":1043,"meta":424,"style":424},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[494,3862,3863],{"__ignoreMap":424},[940,3864,3865,3867,3869,3871,3873,3875,3877,3879],{"class":942,"line":943},[940,3866,1184],{"class":1050},[940,3868,1187],{"class":1054},[940,3870,1190],{"class":1054},[940,3872,1193],{"class":1054},[940,3874,1196],{"class":1054},[940,3876,1199],{"class":1054},[940,3878,1202],{"class":1054},[940,3880,3881],{"class":1054}," npub1yourkeyhere\n",[429,3883,3884,3885,3888],{},"Nhập ",[494,3886,3887],{},"wss:\u002F\u002Fbuzz.pafor.me"," vào mục URL cộng đồng và nhấn \"Next\".",[429,3890,3891],{},[432,3892],{"alt":3893,"src":3894},"Nhập URL relay cộng đồng tự lưu trữ vào ứng dụng Buzz trên máy tính","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,3896,3897],{},"Nhập tên hiển thị và nhấn nút Next.",[429,3899,3900],{},[432,3901],{"alt":3902,"src":3903},"Màn hình cấu hình hồ sơ trong ứng dụng Buzz để nhập tên hiển thị","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-profile-name-input.webp",[888,3905,3907],{"id":3906},"kênh-channels-và-tác-nhân","Kênh (Channels) và Tác nhân",[429,3909,3910],{},"Kênh là các nhóm nhiệm vụ hoặc nhóm dự án. Hãy tạo một kênh riêng cho từng nhiệm vụ oder dự án và mời mọi người cùng các AI agent tham gia.",[429,3912,3913],{},"Mọi thông tin trong kênh được chia sẻ hoàn toàn tự động, loại bỏ việc phải giải thích lại yêu cầu cho từng thành viên một. Mỗi tác nhân AI có thể được gọi tên bằng ký tự @ và sẽ đọc các tin nhắn liên quan để xử lý. Ngoài ra, các tác nhân AI cũng có thể @ nhắc đến nhau.",[429,3915,3916],{},"Hãy thử gửi tin nhắn trực tiếp (DM) cho một tác nhân AI đã cấu hình sẵn",[429,3918,3919],{},[432,3920],{"alt":3921,"src":3922},"Gửi tin nhắn trực tiếp cho tác nhân AI trong ứng dụng khách Buzz trên máy tính","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-dm-agent.webp",[429,3924,3925],{},"Hãy thử tạo một kênh mới và thêm một số tác nhân AI vào kênh",[429,3927,3928],{},[432,3929],{"alt":3930,"src":3931},"Tạo kênh nhiệm vụ hoặc dự án mới trong ứng dụng Buzz trên máy tính","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,3933,3934],{},[432,3935],{"alt":3936,"src":3937},"Thêm thành viên con người và tác nhân AI vào kênh vừa tạo","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,3939,3940],{},[432,3941],{"alt":3942,"src":3943},"Chế độ xem kênh hoạt động hiển thị lịch sử trò chuyện tổng hợp và nhiệm vụ dự án","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-view.webp",[432,3945],{"src":3946,"alt":3947,"style":3948},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-active-agents.webp","Xem chi tiết các tác nhân AI đang hoạt động được tích hợp vào kênh dự án cộng tác","max-width: 367px; width: 100%; height: auto;",[888,3950,3952],{"id":3951},"kích-hoạt-môi-trường-chạy-runtimes-của-tác-nhân","Kích hoạt môi trường chạy (Runtimes) của tác nhân",[429,3954,3955,3956,3959,3960,3963],{},"Môi trường chạy mặc định dựa trên cơ chế tự phát hiện tệp chạy nhị phân (chẳng hạn như ",[494,3957,3958],{},"hermes-acp",") trong các thư mục chuẩn như ",[494,3961,3962],{},"~\u002F.local\u002Fbin",". Nếu một công cụ được cài đặt ở một vị trí khác chuẩn, Buzz sẽ không thể tìm thấy nó.",[429,3965,3966,3967,3970],{},"Đối với Kimi Code, mã định danh tác nhân là kimi, và Buzz sẽ tìm kiếm tệp nhị phân tại ",[494,3968,3969],{},"~\u002F.local\u002Fbin\u002Fkimi",". Tạo một liên kết tượng trưng (symbolic link) sẽ giải quyết được vấn đề:",[932,3972,3975],{"className":3973,"code":3974,"language":3226},[3224],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[494,3976,3974],{"__ignoreMap":424},[429,3978,3979],{},"Giờ đây, Kimi Code sẽ xuất hiện trong danh sách Runtimes của tác nhân.",[429,3981,3982],{},[432,3983],{"alt":3984,"src":3985},"Cài đặt ứng dụng Buzz hiển thị các runtimes của tác nhân AI đã cấu hình bao gồm Kimi","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-agent-runtimes-list.webp",[888,3987,3989],{"id":3988},"dự-án-và-kho-lưu-trữ","Dự án và Kho lưu trữ",[429,3991,3992,3993,3996],{},"Kích hoạt tính năng '",[440,3994,3995],{},"Projects","' trong Settings → Experiments trước tiên:",[429,3998,3999],{},[432,4000],{"alt":4001,"src":4002},"Kích hoạt tính năng thử nghiệm Projects trong tab cài đặt của Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-experiments-projects.webp",[429,4004,4005,4006,4008],{},"Hiện tại, dự án phải được tạo thông qua công cụ ",[494,4007,1214],{}," (tuy nhiên tính năng tạo dự án trực tiếp trên giao diện người dùng đang được lên kế hoạch cho phiên bản tiếp theo).",[2168,4010,4012],{"id":4011},"cài-đặt-buzz-cli","Cài đặt buzz-cli",[429,4014,4015,4016,4018,4019,898],{},"Chạy các lệnh sau để cài đặt ",[494,4017,1214],{}," trên máy chủ ",[440,4020,3856],{},[932,4022,4024],{"className":1041,"code":4023,"language":1043,"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",[494,4025,4026,4037,4044,4057],{"__ignoreMap":424},[940,4027,4028,4030,4032,4034],{"class":942,"line":943},[940,4029,1902],{"class":1050},[940,4031,3043],{"class":1054},[940,4033,3064],{"class":1054},[940,4035,4036],{"class":1054}," cargo\n",[940,4038,4039,4041],{"class":942,"line":1070},[940,4040,3185],{"class":971},[940,4042,4043],{"class":1054}," ~\u002Fbuzz\n",[940,4045,4046,4049,4051,4054],{"class":942,"line":1077},[940,4047,4048],{"class":1050},"cargo",[940,4050,3064],{"class":1054},[940,4052,4053],{"class":1054}," --path",[940,4055,4056],{"class":1054}," crates\u002Fbuzz-cli\n",[940,4058,4059,4061,4064,4067,4070,4073,4076,4079,4082],{"class":942,"line":1084},[940,4060,2989],{"class":971},[940,4062,4063],{"class":954}," '",[940,4065,4066],{"class":1054},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[940,4068,4069],{"class":954},"'",[940,4071,4072],{"class":954}," >>",[940,4074,4075],{"class":1054}," ~\u002F.bashrc",[940,4077,4078],{"class":954}," &&",[940,4080,4081],{"class":971}," source",[940,4083,4084],{"class":1054}," ~\u002F.bashrc\n",[429,4086,4087,4088,4090,4091,4093],{},"Tạo một cặp khóa riêng tư và khóa công khai bằng công cụ trực tuyến hoặc thông qua ",[494,4089,1214],{},". Cặp khóa này là danh tính đại diện của ",[494,4092,1214],{}," trên Nostr relay.",[932,4095,4097],{"className":1041,"code":4096,"language":1043,"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",[494,4098,4099,4121,4125,4130],{"__ignoreMap":424},[940,4100,4101,4103,4106,4109,4112,4115,4118],{"class":942,"line":943},[940,4102,1184],{"class":1050},[940,4104,4105],{"class":1054}," run",[940,4107,4108],{"class":1054}," --rm",[940,4110,4111],{"class":1054}," --entrypoint",[940,4113,4114],{"class":1054}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[940,4116,4117],{"class":1054}," ghcr.io\u002Fblock\u002Fbuzz:main",[940,4119,4120],{"class":1054}," generate-key\n",[940,4122,4123],{"class":942,"line":1070},[940,4124,1074],{"emptyLinePlaceholder":1073},[940,4126,4127],{"class":942,"line":1077},[940,4128,4129],{"class":1080},"# Use the generated Public Key\n",[940,4131,4132,4134,4136,4138,4140,4142,4144,4146],{"class":942,"line":1084},[940,4133,1184],{"class":1050},[940,4135,1187],{"class":1054},[940,4137,1190],{"class":1054},[940,4139,1193],{"class":1054},[940,4141,1196],{"class":1054},[940,4143,1199],{"class":1054},[940,4145,1202],{"class":1054},[940,4147,4148],{"class":1054}," generated_Public_key\n",[429,4150,4151],{},"Cấu hình giao diện dòng lệnh (CLI):",[932,4153,4155],{"className":1041,"code":4154,"language":1043,"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",[494,4156,4157,4162,4193,4197],{"__ignoreMap":424},[940,4158,4159],{"class":942,"line":943},[940,4160,4161],{"class":1080},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[940,4163,4164,4166,4168,4171,4173,4176,4179,4182,4185,4188,4190],{"class":942,"line":1070},[940,4165,2989],{"class":971},[940,4167,4063],{"class":954},[940,4169,4170],{"class":1054},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[940,4172,4069],{"class":954},[940,4174,4175],{"class":954},"  >>",[940,4177,4178],{"class":1054}," \u002Fhome\u002F",[940,4180,4181],{"class":954},"\u003C",[940,4183,4184],{"class":1054},"use",[940,4186,4187],{"class":950},"r",[940,4189,1257],{"class":954},[940,4191,4192],{"class":1054},"\u002F.bashrc\n",[940,4194,4195],{"class":942,"line":1077},[940,4196,1074],{"emptyLinePlaceholder":1073},[940,4198,4199,4201,4203,4206,4208,4210,4212,4214,4216,4218,4220],{"class":942,"line":1084},[940,4200,2989],{"class":971},[940,4202,4063],{"class":954},[940,4204,4205],{"class":1054},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[940,4207,4069],{"class":954},[940,4209,4175],{"class":954},[940,4211,4178],{"class":1054},[940,4213,4181],{"class":954},[940,4215,4184],{"class":1054},[940,4217,4187],{"class":950},[940,4219,1257],{"class":954},[940,4221,4192],{"class":1054},[429,4223,4224,4225,4227],{},"Chạy lệnh sau để xác minh rằng ",[494,4226,1214],{}," đã được cấu hình chính xác:",[932,4229,4231],{"className":1041,"code":4230,"language":1043,"meta":424,"style":424},"buzz channels list\n",[494,4232,4233],{"__ignoreMap":424},[940,4234,4235,4237,4239],{"class":942,"line":943},[940,4236,1237],{"class":1050},[940,4238,1240],{"class":1054},[940,4240,4241],{"class":1054}," list\n",[429,4243,4244],{},[432,4245],{"alt":4246,"src":4247},"Thực thi lệnh terminal xác minh cấu hình buzz-cli bằng cách liệt kê các kênh đang hoạt động","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-cli-channels-list-terminal.webp",[2168,4249,4251],{"id":4250},"tạo-một-dự-án-bằng-buzz-cli","Tạo một dự án bằng buzz-cli",[932,4253,4255],{"className":1041,"code":4254,"language":1043,"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",[494,4256,4257,4262],{"__ignoreMap":424},[940,4258,4259],{"class":942,"line":943},[940,4260,4261],{"class":1080},"# --channel refers to the UUID of the channel\n",[940,4263,4264,4266,4269,4272,4275,4278,4281,4283,4286,4288,4290,4292,4295],{"class":942,"line":1070},[940,4265,1237],{"class":1050},[940,4267,4268],{"class":1054}," repos",[940,4270,4271],{"class":1054}," create",[940,4273,4274],{"class":1054}," --id",[940,4276,4277],{"class":1054}," TestKOA",[940,4279,4280],{"class":1054}," --name",[940,4282,4063],{"class":954},[940,4284,4285],{"class":1054},"Display Name",[940,4287,4069],{"class":954},[940,4289,1245],{"class":1054},[940,4291,2896],{"class":954},[940,4293,4294],{"class":1054},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[940,4296,1966],{"class":954},[429,4298,4299,4300,4302],{},"Một dự án chỉ có thể xóa bởi chủ sở hữu. Do dự án \"Display Name\" được tạo bằng ",[494,4301,1214],{}," (vốn chưa hỗ trợ lệnh xóa), nó sẽ không thể xóa theo cách này.",[429,4304,4305],{},"Mở lại ứng dụng Buzz trên máy tính để kiểm tra xem dự án đã được tạo thành công hay chưa.",[429,4307,4308],{},[432,4309],{"alt":4310,"src":4311},"Chế độ xem dự án trên ứng dụng Buzz máy tính xác nhận việc tạo dự án thành công","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-project-view.webp",[429,4313,4314],{},"Khi dự án xuất hiện trong phần Projects, bạn có thể dễ dàng thêm nhiều dự án khác bằng cách nhấn nút \"+\" ở góc trên bên phải.",[429,4316,4317],{},[432,4318],{"alt":4319,"src":4320},"Thêm dự án nhà phát triển mới bằng biểu tượng dấu cộng trong ứng dụng khách 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",[2168,4322,4324],{"id":4323},"đưa-vào-các-kho-lưu-trữ-git-hiện-có","Đưa vào các kho lưu trữ Git hiện có",[429,4326,2537,4327,4330,4331,4334,4335,4340],{},[494,4328,4329],{},"git-credential-nostr"," trên thiết bị chứa các kho Git của bạn. Công cụ này yêu cầu ",[440,4332,4333],{},"git phiên bản 2.46 trở lên"," và bộ công cụ Rust. Hãy tham khảo tài liệu hướng dẫn ",[443,4336,4339],{"href":4337,"rel":4338},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[447],"Readme"," này:",[932,4342,4344],{"className":1041,"code":4343,"language":1043,"meta":424,"style":424},"cargo install --path crates\u002Fgit-credential-nostr\n",[494,4345,4346],{"__ignoreMap":424},[940,4347,4348,4350,4352,4354],{"class":942,"line":943},[940,4349,4048],{"class":1050},[940,4351,3064],{"class":1054},[940,4353,4053],{"class":1054},[940,4355,4356],{"class":1054}," crates\u002Fgit-credential-nostr\n",[429,4358,4359,4360,4362],{},"Siết chặt cơ chế bảo mật bằng cách cấu hình ",[494,4361,4329],{}," để cấp quyền truy cập qua Buzz relay:",[932,4364,4366],{"className":1041,"code":4365,"language":1043,"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",[494,4367,4368,4373,4389,4402,4406,4411,4420,4447],{"__ignoreMap":424},[940,4369,4370],{"class":942,"line":943},[940,4371,4372],{"class":1080},"# 1. Register the helper and enable per-path credentials.\n",[940,4374,4375,4377,4380,4383,4386],{"class":942,"line":1070},[940,4376,3170],{"class":1050},[940,4378,4379],{"class":1054}," config",[940,4381,4382],{"class":1054}," --global",[940,4384,4385],{"class":1054}," credential.helper",[940,4387,4388],{"class":1054}," nostr\n",[940,4390,4391,4393,4395,4397,4400],{"class":942,"line":1077},[940,4392,3170],{"class":1050},[940,4394,4379],{"class":1054},[940,4396,4382],{"class":1054},[940,4398,4399],{"class":1054}," credential.useHttpPath",[940,4401,1387],{"class":954},[940,4403,4404],{"class":942,"line":1084},[940,4405,1074],{"emptyLinePlaceholder":1073},[940,4407,4408],{"class":942,"line":1934},[940,4409,4410],{"class":1080},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[940,4412,4413,4415,4417],{"class":942,"line":1939},[940,4414,3794],{"class":1050},[940,4416,3797],{"class":1054},[940,4418,4419],{"class":1054}," ~\u002F.nostr\n",[940,4421,4422,4424,4426,4429,4431,4433,4436,4438,4441,4444],{"class":942,"line":1945},[940,4423,2989],{"class":971},[940,4425,2896],{"class":954},[940,4427,4428],{"class":1054},"nsec1...",[940,4430,2902],{"class":954},[940,4432,3024],{"class":954},[940,4434,4435],{"class":1054}," ~\u002F.nostr\u002Fkey",[940,4437,4078],{"class":954},[940,4439,4440],{"class":1050}," chmod",[940,4442,4443],{"class":3492}," 600",[940,4445,4446],{"class":1054}," ~\u002F.nostr\u002Fkey\n",[940,4448,4449,4451,4453,4455,4458],{"class":942,"line":2281},[940,4450,3170],{"class":1050},[940,4452,4379],{"class":1054},[940,4454,4382],{"class":1054},[940,4456,4457],{"class":1054}," nostr.keyfile",[940,4459,4446],{"class":1054},[429,4461,4462],{},"Tạo một kho lưu trữ mới trên Buzz relay:",[932,4464,4467],{"className":4465,"code":4466,"language":3226},[3224],"buzz repos create --id koa-email-routing --name \"KOA Email Routing\" --clone \"https:\u002F\u002Fbuzz.pafor.me\u002Fgit\u002F\u003Cpub_key>\u002Fkoa-email-routing\" --nostr-relay \"wss:\u002F\u002Fbuzz.pafor.me\"\n",[494,4468,4466],{"__ignoreMap":424},[429,4470,4471,4472,4475,4476,4479],{},"Trong lần ",[494,4473,4474],{},"git push"," đầu tiên, bạn sẽ gặp lỗi ",[494,4477,4478],{},"remote: missing Authorization header",". Để giải quyết lỗi này, bạn cần liên kết ID kho lưu trữ với một kênh của Buzz, vì quyền ghi Git (ACL) được quản lý dựa trên danh sách thành viên của kênh:",[932,4481,4483],{"className":1041,"code":4482,"language":1043,"meta":424,"style":424},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[494,4484,4485,4510,4514,4519],{"__ignoreMap":424},[940,4486,4487,4489,4491,4494,4496,4499,4501,4503,4505,4507],{"class":942,"line":943},[940,4488,1237],{"class":1050},[940,4490,4268],{"class":1054},[940,4492,4493],{"class":1054}," bind",[940,4495,4274],{"class":1054},[940,4497,4498],{"class":1054}," koa-email-routing",[940,4500,1245],{"class":1054},[940,4502,1248],{"class":954},[940,4504,1251],{"class":1054},[940,4506,1254],{"class":950},[940,4508,4509],{"class":954},">\n",[940,4511,4512],{"class":942,"line":1070},[940,4513,1074],{"emptyLinePlaceholder":1073},[940,4515,4516],{"class":942,"line":1077},[940,4517,4518],{"class":1080},"# push the code again\n",[940,4520,4521,4523],{"class":942,"line":1084},[940,4522,3170],{"class":1050},[940,4524,4525],{"class":1054}," push\n",[429,4527,4528,4529,4532],{},"Khi kiểm tra dự án trên ứng dụng Buzz máy tính, bạn có thể thấy lỗi hiển thị do ứng dụng yêu cầu ",[440,4530,4531],{},"git 2.46 trở lên"," — việc khởi chạy trực tiếp ứng dụng đôi khi nhận diện sai phiên bản Git cũ hơn hệ thống:",[429,4534,4535],{},[432,4536],{"alt":4537,"src":4538},"Ứng dụng khách Buzz hiển thị lỗi tải Git do phiên bản Git cục bộ cũ dưới 2.46","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,4540,4541,4542,4545,4546,4551],{},"Hãy xuất biến PATH bằng lệnh ",[494,4543,4544],{},"launchctl setenv PATH \"\u002Fopt\u002Fhomebrew\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin:\u002Fusr\u002Fsbin:\u002Fsbin\""," trong cấu hình shell của bạn và khởi động ứng dụng Buzz trực tiếp từ terminal. Tham khảo ",[443,4547,4550],{"href":4548,"rel":4549},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[447],"lỗi này"," để biết thêm chi tiết.",[932,4553,4555],{"className":1041,"code":4554,"language":1043,"meta":424,"style":424},"open -a Buzz\n",[494,4556,4557],{"__ignoreMap":424},[940,4558,4559,4562,4565],{"class":942,"line":943},[940,4560,4561],{"class":1050},"open",[940,4563,4564],{"class":1054}," -a",[940,4566,4567],{"class":1054}," Buzz\n",[429,4569,4570],{},"Kiểm tra lại mục Projects trên ứng dụng Buzz, thông tin chi tiết của kho lưu trữ hiện đã được tải lên đầy đủ.",[429,4572,4573],{},[432,4574],{"alt":4575,"src":4576},"Giao diện Buzz máy tính với thông tin chi tiết về kho lưu trữ Git và nhật ký commit đã tải thành công","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,4578,4580],{"id":4579},"đồng-bộ-hóa-các-tác-nhân-ai-với-ứng-dụng-di-động-buzz-bằng-mã-qr","Đồng bộ hóa các tác nhân AI với ứng dụng di động Buzz bằng mã QR",[429,4582,4583,4584,4587],{},"Việc ghép đôi với ứng dụng di động Buzz yêu cầu giao thức HTTPS bảo mật và dịch vụ ",[494,4585,4586],{},"buzz-pair-relay"," mặc định sẽ không khởi chạy trên VPS.",[932,4589,4591],{"className":1041,"code":4590,"language":1043,"meta":424,"style":424},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[494,4592,4593,4599],{"__ignoreMap":424},[940,4594,4595,4597],{"class":942,"line":943},[940,4596,3185],{"class":971},[940,4598,4043],{"class":1054},[940,4600,4601,4603,4605,4607],{"class":942,"line":1070},[940,4602,4048],{"class":1050},[940,4604,3064],{"class":1054},[940,4606,4053],{"class":1054},[940,4608,4609],{"class":1054}," crates\u002Fbuzz-pair-relay\n",[429,4611,4612,4613,4616,4617,898],{},"Thêm khối cấu hình sau vào tệp ",[494,4614,4615],{},"compose.yml"," để kích hoạt dịch vụ ",[494,4618,4586],{},[932,4620,4622],{"className":1350,"code":4621,"language":1352,"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",[494,4623,4624,4631,4640,4660,4666,4676,4682,4693,4701,4707],{"__ignoreMap":424},[940,4625,4626,4629],{"class":942,"line":943},[940,4627,4628],{"class":1362},"  pair",[940,4630,1376],{"class":954},[940,4632,4633,4635,4637],{"class":942,"line":1070},[940,4634,3508],{"class":1362},[940,4636,898],{"class":954},[940,4638,4639],{"class":1054}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[940,4641,4642,4645,4647,4650,4652,4655,4657],{"class":942,"line":1077},[940,4643,4644],{"class":1362},"    entrypoint",[940,4646,898],{"class":954},[940,4648,4649],{"class":954}," [",[940,4651,2902],{"class":954},[940,4653,4654],{"class":1054},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[940,4656,2902],{"class":954},[940,4658,4659],{"class":954},"]\n",[940,4661,4662,4664],{"class":942,"line":1084},[940,4663,3542],{"class":1362},[940,4665,1376],{"class":954},[940,4667,4668,4671,4673],{"class":942,"line":1934},[940,4669,4670],{"class":1362},"      BUZZ_PAIR_RELAY_BIND_ADDR",[940,4672,898],{"class":954},[940,4674,4675],{"class":1054}," 0.0.0.0:5000\n",[940,4677,4678,4680],{"class":942,"line":1939},[940,4679,3456],{"class":1362},[940,4681,1376],{"class":954},[940,4683,4684,4686,4688,4691],{"class":942,"line":1945},[940,4685,3575],{"class":954},[940,4687,2896],{"class":954},[940,4689,4690],{"class":1054},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[940,4692,1966],{"class":954},[940,4694,4695,4697,4699],{"class":942,"line":2281},[940,4696,3627],{"class":1362},[940,4698,898],{"class":954},[940,4700,3632],{"class":1054},[940,4702,4703,4705],{"class":942,"line":2292},[940,4704,3638],{"class":1362},[940,4706,1376],{"class":954},[940,4708,4709,4712,4715],{"class":942,"line":2388},[940,4710,4711],{"class":954},"      [",[940,4713,4714],{"class":1054},"buzz-net",[940,4716,4659],{"class":954},[429,4718,4719,4720,574,4723,4726,4727,898],{},"Thêm ",[494,4721,4722],{},"BUZZ_PAIRING_RELAY_URL",[494,4724,4725],{},"BUZZ_PAIR_RELAY_PORT"," vào tệp cấu hình ",[494,4728,3212],{},[932,4730,4733],{"className":4731,"code":4732,"language":3226},[3224],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[494,4734,4732],{"__ignoreMap":424},[429,4736,4737,4738,4741],{},"Truy cập mục '",[440,4739,4740],{},"Mobile","' trong phần cài đặt của Buzz desktop:",[429,4743,4744],{},[432,4745],{"alt":4746,"src":4747},"Hộp thoại cài đặt trong ứng dụng Buzz hiển thị tab cấu hình thiết bị di động","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-mobile-tab.webp",[429,4749,4750],{},"Nhấp vào \"Start pairing\" — một mã QR sẽ hiển thị; hãy dùng ứng dụng Buzz trên điện thoại để quét mã này. Quá trình ghép đôi hoàn tất sau khi bạn nhấn \"Code Match\".",[429,4752,4753],{},[432,4754],{"alt":4755,"src":4756},"Tạo mã QR ghép đôi an toàn trên ứng dụng máy tính để đồng bộ hóa di động Buzz","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,4758,4759],{},"Các tác nhân AI trên ứng dụng di động Buzz chỉ có thể sử dụng nếu chúng đang chạy đồng thời trên ứng dụng Buzz máy tính. Thiết bị máy tính của bạn phải luôn hoạt động để các tác nhân AI có thể xử lý yêu cầu.",[429,4761,4762],{},[432,4763],{"alt":4764,"src":4765},"Giao diện ứng dụng di động Buzz hiển thị các tác nhân AI đồng hành hoạt động đã đồng bộ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-mobile-app-active-agents.webp",[473,4767,4769],{"id":4768},"lời-kết","Lời kết",[429,4771,4772],{},"Mặc dù Buzz vẫn còn quá sớm để áp dụng vào các môi trường sản xuất quy mô lớn do tồn tại một số lỗi và giới hạn về giao diện, đây thực sự là một trải nghiệm đột phá cho các đội nhóm nhỏ và các nhà phát triển độc lập. Nó mở ra một tầm nhìn chân thực về không gian làm việc ưu tiên AI và mang tính cộng tác cao trong tương lai.",[473,4774,4775],{"id":1618},"Tài liệu tham khảo",[484,4777,4778,4785,4792,4799],{},[487,4779,4780],{},[443,4781,4784],{"href":4782,"rel":4783},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[447],"Buzz releases",[487,4786,4787],{},[443,4788,4791],{"href":4789,"rel":4790},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[447],"Introducing Buzz",[487,4793,4794],{},[443,4795,4798],{"href":4796,"rel":4797},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[447],"What is buzz",[487,4800,4801],{},[443,4802,4805],{"href":4803,"rel":4804},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[447],"How to self-host Buzz (Miget)",[1647,4807,4808],{},"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":1070,"depth":1077,"links":4810},[4811,4812,4813,4827,4836,4837,4838],{"id":2681,"depth":1070,"text":2682},{"id":2726,"depth":1070,"text":2727},{"id":2774,"depth":1070,"text":2775,"children":4814},[4815,4816,4820,4821,4822,4826],{"id":2778,"depth":1077,"text":2779},{"id":2808,"depth":1077,"text":2809,"children":4817},[4818,4819],{"id":2812,"depth":1084,"text":2813},{"id":2915,"depth":1084,"text":2916},{"id":2933,"depth":1077,"text":2934},{"id":3159,"depth":1077,"text":3160},{"id":3316,"depth":1077,"text":3317,"children":4823},[4824,4825],{"id":3320,"depth":1084,"text":3321},{"id":3716,"depth":1084,"text":3717},{"id":3783,"depth":1077,"text":3784},{"id":3826,"depth":1070,"text":3827,"children":4828},[4829,4830,4831],{"id":3906,"depth":1077,"text":3907},{"id":3951,"depth":1077,"text":3952},{"id":3988,"depth":1077,"text":3989,"children":4832},[4833,4834,4835],{"id":4011,"depth":1084,"text":4012},{"id":4250,"depth":1084,"text":4251},{"id":4323,"depth":1084,"text":4324},{"id":4579,"depth":1070,"text":4580},{"id":4768,"depth":1070,"text":4769},{"id":1618,"depth":1070,"text":4775},[1668,1667,1237],"2026-09-08",{"schemaOrg":4842,"robots":1701,"sitemap":4861},[4843,4844],{"@type":1678,"headline":454,"description":464,"image":465},{"@type":1680,"name":454,"description":464,"image":465,"step":4845},[4846,4849,4852,4855,4858],{"@type":1683,"name":4847,"text":4848},"Giai đoạn 1: Thiết lập Cloudflare","Tạo API Token Cloudflare và định cấu hình cài đặt DNS.",{"@type":1683,"name":4850,"text":4851},"Giai đoạn 2: Cài đặt Docker","Thiết lập và cài đặt Docker Engine trên VPS Ubuntu.",{"@type":1683,"name":4853,"text":4854},"Giai đoạn 3: Nhân bản và Cấu hình","Nhân bản kho lưu trữ và định cấu hình các biến compose.",{"@type":1683,"name":4856,"text":4857},"Giai đoạn 4: Tích hợp Caddy","Xây dựng Caddy tùy chỉnh với mô-đun thử thách DNS Cloudflare.",{"@type":1683,"name":4859,"text":4860},"Giai đoạn 5: Sao lưu tự động","Định cấu hình cron job để tự động sao lưu PostgreSQL.",{"lastmod":4862},"2026-09-03",{"title":4864,"description":464,"ogTitle":454,"ogDescription":464,"twitterTitle":454,"twitterDescription":464},"Hướng dẫn tự host Block Buzz Relay trên VPS Ubuntu","vi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[1708,4867,1111,4868,4869],"Docker","Caddy","Cloudflare","4n6TAwckx54GT3WMA-sqwXdGcmS8qZxFUgRYb8qCjWk",{"id":4872,"title":4873,"author":424,"body":4874,"category":5257,"date":5258,"description":5259,"extension":1672,"image":5260,"imageAlt":5261,"isPublished":1073,"meta":5262,"minRead":1945,"navigation":1073,"path":351,"seo":5266,"stem":5267,"tags":5268,"updatedAt":1710,"__hash__":5272},"article\u002Fvi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them.md","Kỹ năng của Agent AI: Chúng là gì và cách tạo lập chi tiết",{"type":426,"value":4875,"toc":5247},[4876,4880,4891,4902,4963,4969,4973,4976,4985,4991,4995,5049,5060,5066,5069,5125,5129,5136,5143,5146,5157,5161,5206,5209,5226,5230,5241,5244],[473,4877,4879],{"id":4878},"kỹ-năng-của-agent-ai-là-gì","Kỹ năng của Agent AI là gì?",[429,4881,4882,4883,4886,4887,4890],{},"Một kỹ năng của agent (agent skill) là một ",[440,4884,4885],{},"tập hợp hướng dẫn"," có thể tái sử dụng — một quy trình chuẩn hóa chỉ dẫn cho agent cách hoàn thành xuất sắc một loại tác vụ cụ thể. Kỹ năng này bao gồm một tệp Markdown duy nhất có tên ",[494,4888,4889],{},"SKILL.md"," và có thể đóng gói kèm theo bất kỳ tệp nào khác mà tác vụ yêu cầu, chẳng hạn như tài liệu tham chiếu, tệp mẫu (template) hoặc các tập lệnh thực thi (executable script).",[429,4892,4893,4894,4901],{},"Hãy lấy kỹ năng chất vấn ",[443,4895,4898],{"href":4896,"rel":4897},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002F733d312884b3878a9a9cff693c5886943753a741\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[447],[494,4899,4900],{},"grill-me"," làm ví dụ:",[932,4903,4905],{"className":2213,"code":4904,"language":2215,"meta":424,"style":424},"---\nname: grill-me\ndescription: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n---\n\nInterview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n\nAsk the questions one at a time.\n\nIf a question can be answered by exploring the codebase, explore the codebase instead.\n",[494,4906,4907,4912,4922,4932,4936,4940,4945,4949,4954,4958],{"__ignoreMap":424},[940,4908,4909],{"class":942,"line":943},[940,4910,4911],{"class":1050},"---\n",[940,4913,4914,4917,4919],{"class":942,"line":1070},[940,4915,4916],{"class":1362},"name",[940,4918,898],{"class":954},[940,4920,4921],{"class":1054}," grill-me\n",[940,4923,4924,4927,4929],{"class":942,"line":1077},[940,4925,4926],{"class":1362},"description",[940,4928,898],{"class":954},[940,4930,4931],{"class":1054}," Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n",[940,4933,4934],{"class":942,"line":1084},[940,4935,4911],{"class":1050},[940,4937,4938],{"class":942,"line":1934},[940,4939,1074],{"emptyLinePlaceholder":1073},[940,4941,4942],{"class":942,"line":1939},[940,4943,4944],{"class":1054},"Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n",[940,4946,4947],{"class":942,"line":1945},[940,4948,1074],{"emptyLinePlaceholder":1073},[940,4950,4951],{"class":942,"line":2281},[940,4952,4953],{"class":1054},"Ask the questions one at a time.\n",[940,4955,4956],{"class":942,"line":2292},[940,4957,1074],{"emptyLinePlaceholder":1073},[940,4959,4960],{"class":942,"line":2388},[940,4961,4962],{"class":1054},"If a question can be answered by exploring the codebase, explore the codebase instead.\n",[429,4964,4965,4966,4968],{},"Tệp ",[494,4967,4889],{}," chứa một khối siêu dữ liệu (metadata) nhỏ và phần nội dung hướng dẫn. Siêu dữ liệu bao gồm tên và mô tả của kỹ năng, được agent AI tải khi khởi động.",[473,4970,4972],{"id":4971},"cách-thức-kỹ-năng-hoạt-động-công-bố-lũy-tiến-progressive-disclosure","Cách thức kỹ năng hoạt động: Công bố lũy tiến (Progressive Disclosure)",[429,4974,4975],{},"Ban đầu, chỉ có tên và mô tả của kỹ năng được tải vào ngữ cảnh (context). Khi yêu cầu của người dùng khớp với mô tả của một kỹ năng, phần nội dung hướng dẫn chi tiết mới được tải vào cùng một ngữ cảnh đó.",[429,4977,4978,4979,4984],{},"Hãy xem kỹ năng chất vấn ",[443,4980,4982],{"href":4896,"rel":4981},[447],[494,4983,4900],{}," được sử dụng như thế nào trong thực tế.",[429,4986,4987],{},[432,4988],{"alt":4989,"src":4990},"Biểu đồ trình tự minh họa cơ chế tiết lộ dần dần (progressive disclosure) khi thực thi kỹ năng của tác tử AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002Fai-agent-skill-progressive-disclosure-sequence-diagram.webp",[888,4992,4994],{"id":4993},"các-bước-chi-tiết","Các bước chi tiết",[532,4996,4997,5003,5009,5015,5021,5033,5043],{},[487,4998,4999,5002],{},[440,5000,5001],{},"Yêu cầu (Request)"," — Người dùng yêu cầu agent thực hiện một việc (\"hãy chất vấn tôi về thiết kế workflow\").",[487,5004,5005,5008],{},[440,5006,5007],{},"Gợi ý lựa chọn (Selection prompt)"," — Yêu cầu của người dùng, cùng với mô tả của tất cả các kỹ năng hiện có, được gửi đến LLM.",[487,5010,5011,5014],{},[440,5012,5013],{},"LLM lựa chọn"," — LLM so sánh yêu cầu với từng mô tả kỹ năng và trả về (các) kỹ năng phù hợp.",[487,5016,5017,5020],{},[440,5018,5019],{},"Xác nhận"," — Agent hiển thị kỹ năng được đề xuất cho người dùng để xác nhận (hoặc từ chối\u002Fđiều chỉnh) lựa chọn.",[487,5022,5023,5026,5027,5030,5031,460],{},[440,5024,5025],{},"Tải hướng dẫn"," — Agent truy xuất hướng dẫn ",[908,5028,5029],{},"đầy đủ"," cho kỹ năng đã xác nhận: chính là phần nội dung của ",[494,5032,4889],{},[487,5034,5035,5038,5039,5042],{},[440,5036,5037],{},"Gợi ý thực thi (Execution prompt)"," — Yêu cầu của người dùng ",[440,5040,5041],{},"cộng với hướng dẫn của kỹ năng đã chọn"," được gửi đến LLM.",[487,5044,5045,5048],{},[440,5046,5047],{},"Phản hồi"," — LLM tạo ra kết quả đầu ra, chính là câu hỏi chất vấn đầu tiên.",[429,5050,5051,5052,5059],{},"Bây giờ, hãy sử dụng kỹ năng ",[443,5053,5056],{"href":5054,"rel":5055},"https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[447],[494,5057,5058],{},"excalidraw-diagram-skill"," để minh họa cách một kỹ năng có kèm theo tài liệu tham chiếu hoạt động:",[429,5061,5062],{},[432,5063],{"alt":5064,"src":5065},"Biểu đồ trình tự thể hiện tác tử AI thực thi một kỹ năng được tải cùng với các tệp tham chiếu và mẫu bên ngoài","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002Fai-agent-skill-with-reference-files-sequence-diagram.webp",[888,5067,4994],{"id":5068},"các-bước-chi-tiết-1",[532,5070,5071,5076,5081,5090,5095,5108,5116],{},[487,5072,5073,5075],{},[440,5074,5001],{}," — Người dùng yêu cầu agent thực hiện một việc (\"vẽ sơ đồ workflow của quy trình triển khai\").",[487,5077,5078,5008],{},[440,5079,5080],{},"Gợi ý lựa chọn",[487,5082,5083,5085,5086,5089],{},[440,5084,5013],{}," — LLM so sánh yêu cầu với từng mô tả và trả về kỹ năng phù hợp. Ở đây, yêu cầu \"vẽ sơ đồ workflow\" khớp với mô tả của ",[494,5087,5088],{},"excalidraw-diagram",", vì vậy nó được chọn.",[487,5091,5092,5094],{},[440,5093,5019],{}," — Agent hiển thị kỹ năng được đề xuất cho người dùng, người dùng sẽ xác nhận hoặc điều chỉnh lựa chọn đó.",[487,5096,5097,5026,5099,5101,5102,5104,5105,5107],{},[440,5098,5025],{},[908,5100,5029],{}," cho kỹ năng đã xác nhận: phần nội dung của ",[494,5103,4889],{}," và bất kỳ tệp tham chiếu nào (đối với ",[494,5106,5088],{},", tệp này bao gồm bảng màu, lược đồ JSON và các mẫu phần tử).",[487,5109,5110,5038,5113,5115],{},[440,5111,5112],{},"Gợi ý thực thi",[440,5114,5041],{}," được gửi đến LLM. Mô hình hiện đã có phương pháp luận chi tiết cần thiết.",[487,5117,5118,5120,5121,5124],{},[440,5119,5047],{}," — LLM tạo ra kết quả đầu ra (một tệp JSON ",[494,5122,5123],{},".excalidraw","), tệp này được agent gửi lại cho người dùng.",[473,5126,5128],{"id":5127},"kỹ-năng-của-agent-ai-so-với-công-cụ-tools-và-mcp","Kỹ năng của Agent AI so với Công cụ (Tools) và MCP",[429,5130,5131,5132,5135],{},"Kỹ năng không thay thế cho gợi ý (prompts), công cụ (tools) hay MCP. Công cụ và tích hợp MCP giúp mở rộng phạm vi tiếp cận của agent tới các hệ thống bên ngoài — chẳng hạn như truy vấn cơ sở dữ liệu, gọi một API, v.v. Trong khi đó, kỹ năng giúp làm sâu sắc thêm kiến thức chuyên môn (",[908,5133,5134],{},"know-how",") của agent để hoàn thành một tác vụ cụ thể.",[429,5137,5138,5139,5142],{},"Một MCP như ",[443,5140,5141],{"href":395},"Thiết lập NetSuite MCP trên ChatGPT và Claude"," cho phép agent trả lời các câu hỏi của người dùng bằng cách truy cập dữ liệu tài chính và hoạt động trực tiếp trong NetSuite. Sau đó, một kỹ năng báo cáo hoạt động NetSuite sẽ hướng dẫn agent cách biên soạn báo cáo đó và trình bày câu trả lời dưới dạng báo cáo hoàn chỉnh cho người dùng.",[429,5144,5145],{},"Một số kịch bản điển hình để sử dụng kỹ năng bao gồm:",[484,5147,5148,5151,5154],{},[487,5149,5150],{},"Quy trình làm việc nhiều bước (multi-step workflows)",[487,5152,5153],{},"Xử lý tài liệu, chẳng hạn như trích xuất dữ liệu từ tệp PDF",[487,5155,5156],{},"Quy chuẩn tạo mã nguồn (code-generation)",[473,5158,5160],{"id":5159},"cách-tạo-kỹ-năng-cho-agent-ai","Cách tạo kỹ năng cho Agent AI",[532,5162,5163,5173,5187,5196],{},[487,5164,5165,5168,5169,5172],{},[440,5166,5167],{},"Tạo một thư mục"," được đặt tên theo kỹ năng (ví dụ: ",[494,5170,5171],{},"netsuite-operation-report\u002F",").",[487,5174,5175,5180,5181,5183,5184,5186],{},[440,5176,5177,5178],{},"Viết tệp ",[494,5179,4889],{}," bao gồm một trường ",[494,5182,4916],{},", một ",[494,5185,4926],{}," sắc bén và một phần nội dung hướng dẫn ngắn gọn (dưới 200 từ).",[487,5188,5189,5192,5193,5195],{},[440,5190,5191],{},"Thêm tài nguyên"," mà tác vụ cần — tài liệu tham chiếu, biểu mẫu (templates), tập lệnh (scripts). Giữ cho tệp ",[494,5194,4889],{}," ngắn gọn và tạo liên kết đến các tài liệu chi tiết.",[487,5197,5198,5201,5202,5205],{},[440,5199,5200],{},"Cài đặt kỹ năng"," ở nơi agent có thể phát hiện ra nó. Tham khảo bài viết ",[443,5203,5204],{"href":359},"Quản lý tập trung các kỹ năng cho Agent AI"," để biết cách quản lý các kỹ năng trên nhiều agent khác nhau.",[429,5207,5208],{},"Một số mẹo để viết kỹ năng hiệu quả:",[484,5210,5211,5214,5220,5223],{},[487,5212,5213],{},"Hãy viết mô tả hướng đến cơ chế kích hoạt của hệ thống (trigger), thay vì hướng tới người đọc là con người.",[487,5215,5216,5217,5219],{},"Giữ cho tệp ",[494,5218,4889],{}," tinh gọn — dưới 200 từ. Đặt các trường hợp tổng quát trong nội dung chính; chuyển các trường hợp đặc biệt sang tài liệu tham chiếu bên ngoài.",[487,5221,5222],{},"Sử dụng tập lệnh (scripts) cho bất kỳ tác vụ có tính xác định nào. Đừng yêu cầu LLM thực hiện các phép tính số học thuần túy.",[487,5224,5225],{},"Quản lý phiên bản chặt chẽ. Đưa tệp vào hệ thống Git của bạn.",[473,5227,5229],{"id":5228},"kết-luận","Kết luận",[429,5231,5232,5233,5236,5237,5240],{},"Khác với các công cụ và MCP định nghĩa ",[908,5234,5235],{},"những gì cần kết nối",", kỹ năng của agent đóng gói ",[908,5238,5239],{},"cách thức thực hiện công việc",". Chúng là một phần bổ sung thiết yếu chứ không phải là sự thay thế.",[429,5242,5243],{},"Bằng cách tận dụng cơ chế công bố lũy tiến, các kỹ năng giúp cửa sổ ngữ cảnh của agent luôn sạch sẽ và hoạt động hiệu quả — chỉ tải các hướng dẫn chi tiết, tài liệu tham chiếu và tập lệnh thực thi khi yêu cầu của người dùng thực sự kích hoạt chúng.",[1647,5245,5246],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":424,"searchDepth":1070,"depth":1077,"links":5248},[5249,5250,5254,5255,5256],{"id":4878,"depth":1070,"text":4879},{"id":4971,"depth":1070,"text":4972,"children":5251},[5252,5253],{"id":4993,"depth":1077,"text":4994},{"id":5068,"depth":1077,"text":4994},{"id":5127,"depth":1070,"text":5128},{"id":5159,"depth":1070,"text":5160},{"id":5228,"depth":1070,"text":5229},[1667],"2026-06-26","Khám phá khái niệm kỹ năng của Agent AI, cơ chế công bố lũy tiến và hướng dẫn thực tế để tự xây dựng các kỹ năng tùy chỉnh có thể tái sử dụng hiệu quả hơn.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002FVI-AI-Agent-Skills-What-They-Are-%26-How-to-Create-Them.webp","Hướng dẫn kỹ năng Agent AI: Tạo workflow tái sử dụng",{"schemaOrg":5263,"robots":1701,"sitemap":5265},[5264],{"@type":1680,"headline":4873,"description":5259},{"lastmod":5258},{"title":5261,"description":5259,"ogTitle":4873,"ogDescription":5259,"twitterTitle":4873,"twitterDescription":5259},"vi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",[1709,5269,5270,5271],"Kỹ năng tác tử","Quy trình làm việc tái sử dụng","Hướng dẫn AI","EXntbaG3b7-3Jj5AQqtzIBwpIcSdxcAlZbj79FPeteY",{"id":1715,"title":1716,"author":424,"body":1717,"category":2612,"date":2614,"description":2615,"extension":1672,"image":2616,"imageAlt":2617,"isPublished":1073,"meta":2618,"minRead":2388,"navigation":1073,"path":363,"seo":2652,"stem":2654,"tags":2655,"updatedAt":2651,"__hash__":2659},1792489999408]