[{"data":1,"prerenderedAt":14293},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"category-articles-vi-deepseek-harness":421},[4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346],{"path":5},"\u002Fde\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":7},"\u002Fde\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":9},"\u002Fde\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":11},"\u002Fde\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":13},"\u002Fde\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":15},"\u002Fde\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":17},"\u002Fde\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":19},"\u002Fde\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":21},"\u002Fde\u002Farticle\u002Fsetup-antigravity-2",{"path":23},"\u002Fde\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":25},"\u002Fde\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":27},"\u002Fde\u002Farticle\u002Fsync-obsidian-across-devices",{"path":29},"\u002Fde\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":31},"\u002Fde\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":33},"\u002Fde\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":35},"\u002Fde\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":37},"\u002Fen\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":39},"\u002Fen\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":41},"\u002Fen\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":43},"\u002Fen\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":45},"\u002Fen\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":47},"\u002Fen\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":49},"\u002Fen\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":51},"\u002Fen\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":53},"\u002Fen\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":55},"\u002Fen\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":57},"\u002Fen\u002Farticle\u002Fsetup-antigravity-2",{"path":59},"\u002Fen\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":61},"\u002Fen\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":63},"\u002Fen\u002Farticle\u002Fsync-obsidian-across-devices",{"path":65},"\u002Fen\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":67},"\u002Fen\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":69},"\u002Fen\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":71},"\u002Fen\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":73},"\u002Fes\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":75},"\u002Fes\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":77},"\u002Fes\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":79},"\u002Fes\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":81},"\u002Fes\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":83},"\u002Fes\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":85},"\u002Fes\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":87},"\u002Fes\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":89},"\u002Fes\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":91},"\u002Fes\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":93},"\u002Fes\u002Farticle\u002Fsetup-antigravity-2",{"path":95},"\u002Fes\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":97},"\u002Fes\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":99},"\u002Fes\u002Farticle\u002Fsync-obsidian-across-devices",{"path":101},"\u002Fes\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":103},"\u002Fes\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":105},"\u002Fes\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":107},"\u002Fes\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":109},"\u002Ffr\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":111},"\u002Ffr\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":113},"\u002Ffr\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":115},"\u002Ffr\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":117},"\u002Ffr\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":119},"\u002Ffr\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":121},"\u002Ffr\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":123},"\u002Ffr\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":125},"\u002Ffr\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":127},"\u002Ffr\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":129},"\u002Ffr\u002Farticle\u002Fsetup-antigravity-2",{"path":131},"\u002Ffr\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":133},"\u002Ffr\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":135},"\u002Ffr\u002Farticle\u002Fsync-obsidian-across-devices",{"path":137},"\u002Ffr\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":139},"\u002Ffr\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":141},"\u002Ffr\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":143},"\u002Ffr\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":145},"\u002Fid\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":147},"\u002Fid\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":149},"\u002Fid\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":151},"\u002Fid\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":153},"\u002Fid\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":155},"\u002Fid\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":157},"\u002Fid\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":159},"\u002Fid\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":161},"\u002Fid\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":163},"\u002Fid\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":165},"\u002Fid\u002Farticle\u002Fsetup-antigravity-2",{"path":167},"\u002Fid\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":169},"\u002Fid\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":171},"\u002Fid\u002Farticle\u002Fsync-obsidian-across-devices",{"path":173},"\u002Fid\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":175},"\u002Fid\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":177},"\u002Fid\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":179},"\u002Fid\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":181},"\u002Fja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":183},"\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":185},"\u002Fja\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":187},"\u002Fja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":189},"\u002Fja\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":191},"\u002Fja\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":193},"\u002Fja\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":195},"\u002Fja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":197},"\u002Fja\u002Farticle\u002Fsetup-antigravity-2",{"path":199},"\u002Fja\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":201},"\u002Fja\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":203},"\u002Fja\u002Farticle\u002Fsync-obsidian-across-devices",{"path":205},"\u002Fja\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":207},"\u002Fja\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":209},"\u002Fja\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":211},"\u002Fja\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":213},"\u002Fpt\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":215},"\u002Fpt\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":217},"\u002Fpt\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":219},"\u002Fpt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":221},"\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":223},"\u002Fpt\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":225},"\u002Fpt\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":227},"\u002Fpt\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":229},"\u002Fpt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":231},"\u002Fpt\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":233},"\u002Fpt\u002Farticle\u002Fsetup-antigravity-2",{"path":235},"\u002Fpt\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":237},"\u002Fpt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":239},"\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices",{"path":241},"\u002Fpt\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":243},"\u002Fpt\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":245},"\u002Fpt\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":247},"\u002Fpt\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":249},"\u002Ftw\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":251},"\u002Ftw\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":253},"\u002Ftw\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":255},"\u002Ftw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":257},"\u002Ftw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":259},"\u002Ftw\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":261},"\u002Ftw\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":263},"\u002Ftw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":265},"\u002Ftw\u002Farticle\u002Fsetup-antigravity-2",{"path":267},"\u002Ftw\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":269},"\u002Ftw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":271},"\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices",{"path":273},"\u002Ftw\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":275},"\u002Ftw\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":277},"\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":279},"\u002Ftw\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":281},"\u002Fvi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":283},"\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":285},"\u002Fvi\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":287},"\u002Fvi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":289},"\u002Fvi\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":291},"\u002Fvi\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":293},"\u002Fvi\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":295},"\u002Fvi\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":297},"\u002Fvi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":299},"\u002Fvi\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":301},"\u002Fvi\u002Farticle\u002Fsetup-antigravity-2",{"path":303},"\u002Fvi\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":305},"\u002Fvi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":307},"\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices",{"path":309},"\u002Fvi\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":311},"\u002Fvi\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":313},"\u002Fvi\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":315},"\u002Fvi\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":317},"\u002Fzh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":319},"\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":321},"\u002Fzh\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":323},"\u002Fzh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":325},"\u002Fzh\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":327},"\u002Fzh\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":329},"\u002Fzh\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":331},"\u002Fzh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":333},"\u002Fzh\u002Farticle\u002Fsetup-antigravity-2",{"path":335},"\u002Fzh\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":337},"\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":339},"\u002Fzh\u002Farticle\u002Fsync-obsidian-across-devices",{"path":341},"\u002Fzh\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":343},"\u002Fzh\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":345},"\u002Fzh\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":347},"\u002Fzh\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417],{"title":350,"path":351,"stem":352},"AI Agent Skills: What They Are & How to Create Them","\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them","en\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"title":354,"path":355,"stem":356},"Bringing Buzz to DeepSeek Harness: Taught to Speak Nostr","\u002Farticle\u002Fbringing-buzz-to-deepseek-harness","en\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"title":358,"path":359,"stem":360},"Solving AI Agent Skills Fragmentation with npx skills","\u002Farticle\u002Fcentralised-the-skills-for-agents","en\u002Farticle\u002Fcentralised-the-skills-for-agents",{"title":362,"path":363,"stem":364},"How to Expose Hermes Agent Privately with Cloudflare WARP","\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp","en\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"title":366,"path":367,"stem":368},"How AI Agent Skills Replace Nuxt App Scaffolding Scripts","\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts","en\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"title":370,"path":371,"stem":372},"Stop Exposing Your Vault: Secure NodeWarden with Cloudflare","\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare","en\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"title":374,"path":375,"stem":376},"How to Deploy Hermes Agent on a Linux VPS","\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server","en\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"title":378,"path":379,"stem":380},"Self-Host Your Travel Itineraries with TREK and Docker","\u002Farticle\u002Fself-hosted-travel-planner-trek","en\u002Farticle\u002Fself-hosted-travel-planner-trek",{"title":382,"path":383,"stem":384},"Self-Host Block's Buzz: Shared AI Agent Workspace","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues","en\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"title":386,"path":387,"stem":388},"How to Self-Host a BitWarden Compatible Server Nodewarden","\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare","en\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"title":390,"path":391,"stem":392},"Google Antigravity 2 Hands-On: Setup & First Impressions","\u002Farticle\u002Fsetup-antigravity-2","en\u002Farticle\u002Fsetup-antigravity-2",{"title":394,"path":395,"stem":396},"NetSuite AI Connector Guide: MCP Setup & Use Cases","\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude","en\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"title":398,"path":399,"stem":400},"Switch Between Multiple Cloudflare WARP Orgs on Mac","\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac","en\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"title":402,"path":403,"stem":404},"How to Sync Obsidian Vaults Across Devices Securely","\u002Farticle\u002Fsync-obsidian-across-devices","en\u002Farticle\u002Fsync-obsidian-across-devices",{"title":406,"path":407,"stem":408},"Testing Claude Fable 5: A Financial Analysis Review","\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis","en\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"title":410,"path":411,"stem":412},"Guide to Browser and Scheduler in Antigravity 2","\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2","en\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"title":414,"path":415,"stem":416},"Build a Persistent AI Memory System on Cloudflare","\u002Farticle\u002Fuse-cloudflare-as-ai-memory","en\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"title":418,"path":419,"stem":420},"Antigravity 2 in Action: AI Agents, Skills, and MCP","\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2","en\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[422,1713,2659,4103,6270,8152,8726,9507,10039,10437,11063,11519,11730,11954,12296,12995,13427,13677],{"id":423,"title":424,"author":425,"body":426,"category":1667,"date":1671,"description":1672,"extension":1673,"image":1674,"imageAlt":1675,"isPublished":1074,"meta":1676,"minRead":1704,"navigation":1074,"path":283,"seo":1705,"stem":1707,"tags":1708,"updatedAt":1711,"__hash__":1712},"article\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness.md","Kết nối DeepSeek Harness với Buzz qua Gateway Nostr","",{"type":427,"value":428,"toc":1651},"minimark",[429,437,462,470,473,478,484,529,532,592,596,602,881,884,888,893,900,904,918,922,932,985,992,996,999,1031,1035,1040,1091,1099,1105,1114,1120,1150,1163,1167,1176,1207,1229,1277,1284,1289,1295,1302,1308,1313,1320,1334,1340,1349,1389,1392,1398,1405,1411,1415,1418,1569,1573,1607,1611,1617,1621,1647],[430,431,432],"p",{},[433,434],"img",{"alt":435,"src":436},"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",[430,438,439,440,450,451,456,457,461],{},"Plugin DeepSeek Harness (DSH), ",[441,442,443],"strong",{},[444,445,449],"a",{"href":446,"rel":447},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway",[448],"nofollow","dsh-message-gateway",", 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 ",[441,452,453],{},[444,454,455],{"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 ",[444,458,459],{"href":459,"rel":460},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway",[448],".",[463,464],"article-card",{"description":465,"image":466,"image-alt":467,"label":468,"min-read":469,"title":455,"to":383},"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",[430,471,472],{},"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.",[474,475,477],"h2",{"id":476},"kiến-trúc-của-plugin-dsh-message-gateway","Kiến trúc của Plugin dsh-message-gateway",[430,479,480,481,483],{},"Kiến trúc của plugin ",[441,482,449],{}," được chia làm hai phần cốt lõi:",[485,486,487,519],"ul",{},[488,489,490,493,494,498,499,502,503,506,507,510,511,514,515,518],"li",{},[441,491,492],{},"Host"," (môi trường Node): ",[495,496,497],"code",{},"gateway-store"," (quản lý thông tin xác thực tại ",[495,500,501],{},"~\u002F.dsh\u002Fgateway.json","), ",[495,504,505],{},"platforms.ts"," (định nghĩa nền tảng và kiểm tra kết nối), ",[495,508,509],{},"routes.ts"," (các endpoint ",[495,512,513],{},"\u002Fgateway\u002F*","), và ",[495,516,517],{},"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).",[488,520,521,524,525,528],{},[441,522,523],{},"Client"," (phía trình duyệt): trang \"",[441,526,527],{},"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.",[430,530,531],{},"Việc tích hợp một nền tảng mới bao gồm các bước sau:",[533,534,535,552,566],"ol",{},[488,536,537,540,541,544,545,548,549,461],{},[441,538,539],{},"Lớp cầu nối (bridge class)",": cung cấp các phương thức ",[495,542,543],{},"start\u002Fstop\u002Fstatus"," kèm theo một hàm gọi lại (callback) ",[495,546,547],{},"onText(text, frame)",", tương tự mẫu thiết kế của ",[495,550,551],{},"wecom-bridge.ts",[488,553,554,557,558,561,562,565],{},[441,555,556],{},"Đấu nối vào bridge-manager",": tái sử dụng pipeline theo từng đoạn chat sẵn có (",[495,559,560],{},"ensureAgentForKey"," + ",[495,563,564],{},"pendingMap",") và gắn kết luồng trả lời của nền tảng vào.",[488,567,568,571,572,575,576,579,580,583,584,587,588,591],{},[441,569,570],{},"Lưu trữ và định tuyến",": trong ",[495,573,574],{},"\u002Fgateway\u002Fsave"," và ",[495,577,578],{},"\u002Fgateway\u002Fdelete",": ",[441,581,582],{},"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ờ ",[495,585,586],{},"autoStartXxx"," để ",[495,589,590],{},"dsh web"," tự động kết nối lại khi hệ thống khởi động.",[474,593,595],{"id":594},"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",[430,597,598,601],{},[441,599,600],{},"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:",[603,604,605,620],"table",{},[606,607,608],"thead",{},[609,610,611,617],"tr",{},[612,613,614],"th",{},[441,615,616],{},"Hạng mục",[612,618,619],{},"Đặc tả chi tiết",[621,622,623,645,663,691,709,733,757,782,795,808,827,844,858],"tbody",{},[609,624,625,631],{},[626,627,628],"td",{},[441,629,630],{},"Giao vận (Transport)",[626,632,633,634,637,638,641,642],{},"Một kết nối WebSocket duy nhất có xác thực NIP-42; mặc định ",[495,635,636],{},"ws:\u002F\u002Flocalhost:3000","; ",[495,639,640],{},"http(s):\u002F\u002F"," được chuẩn hóa thành ",[495,643,644],{},"ws(s):\u002F\u002F",[609,646,647,652],{},[626,648,649],{},[441,650,651],{},"Xác thực (Auth)",[626,653,654,655,658,659,662],{},"Sự kiện AUTH ",[495,656,657],{},"kind 22242",", gắn thẻ ",[495,660,661],{},"[[\"relay\", url], [\"challenge\", challenge]]",", nội dung trống, ký bằng khóa riêng của tác nhân",[609,664,665,670],{},[626,666,667],{},[441,668,669],{},"Đăng ký nhận tin",[626,671,672,579,675,678,679,682,683,686,687,690],{},[441,673,674],{},"Theo từng kênh",[495,676,677],{},"REQ {\"kinds\":[9], \"#h\":[\u003Cuuid>]}"," — một REQ cho mỗi kênh. Lệnh REQ toàn cục ",[495,680,681],{},"kinds:[9]"," nhận EOSE nhưng không phân phối sự kiện; bộ lọc ",[495,684,685],{},"#h"," đa giá trị ",[441,688,689],{},"không"," chạy",[609,692,693,698],{},[626,694,695],{},[441,696,697],{},"Khám phá (Discovery)",[626,699,700,701,704,705,708],{},"Truy vấn lịch sử ",[495,702,703],{},"REQ {kinds:[39000]}"," để lấy metadata của kênh (",[495,706,707],{},"type == \"dm\""," đánh dấu kênh tin nhắn trực tiếp)",[609,710,711,716],{},[626,712,713],{},[441,714,715],{},"Tư cách thành viên",[626,717,718,719,722,723,725,726,729,730],{},"Lắng nghe trực tiếp ",[495,720,721],{},"REQ {kinds:[44100,44101], \"#p\":[pubkey của ta], since: now-60s}"," — 44100 = thêm, 44101 = xóa (chứa ",[495,724,430],{},"+",[495,727,728],{},"h","); cập nhật gói đăng ký ",[441,731,732],{},"không cần kết nối lại",[609,734,735,740],{},[626,736,737],{},[441,738,739],{},"Sự kiện trò chuyện",[626,741,742,745,746,749,750,753,754],{},[495,743,744],{},"kind 9"," với thẻ ",[495,747,748],{},"[\"h\", channel]",", tùy chọn ",[495,751,752],{},"[\"e\", replyTo]",", ",[495,755,756],{},"[\"p\", mention]",[609,758,759,764],{},[626,760,761],{},[441,762,763],{},"Chỉnh sửa tại chỗ",[626,765,766,769,770,561,772,775,776,778,779,781],{},[495,767,768],{},"kind 40003"," với ",[495,771,728],{},[495,773,774],{},"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 ",[495,777,744],{}," (",[495,780,774],{},"→gốc)",[609,783,784,789],{},[626,785,786],{},[441,787,788],{},"Khung CLOSED",[626,790,791,794],{},[495,792,793],{},"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",[609,796,797,802],{},[626,798,799],{},[441,800,801],{},"Giới hạn relay",[626,803,804,805],{},"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 ",[495,806,807],{},"since",[609,809,810,815],{},[626,811,812],{},[441,813,814],{},"Kiểm soát mention",[626,816,817,818,820,821,823,824,826],{},"Chỉ xử lý ",[495,819,744],{}," gửi đến khi: (a) thẻ ",[495,822,430],{}," có pubkey của ta, (b) kênh là DM, hoặc (c) gốc ",[495,825,774],{}," 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)",[609,828,829,834],{},[626,830,831],{},[441,832,833],{},"Mention gửi đi",[626,835,836,837,840,841,843],{},"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 ",[495,838,839],{},"@","; thẻ ",[495,842,430],{}," 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)",[609,845,846,851],{},[626,847,848],{},[441,849,850],{},"Tin nhắn riêng (DM)",[626,852,853,854,857],{},"Kênh văn bản thuần túy trong phạm vi relay (metadata ",[495,855,856],{},"type: \"dm\"",") — không áp dụng mã hóa NIP-04\u002F44 trong cầu nối này",[609,859,860,865],{},[626,861,862],{},[441,863,864],{},"Tệp đính kèm (Đến)",[626,866,867,868,778,871,753,874,753,877,880],{},"NIP-92 ",[495,869,870],{},"imeta",[495,872,873],{},"url",[495,875,876],{},"sha256",[495,878,879],{},"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ợ",[430,882,883],{},"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:",[433,885],{"src":886,"alt":887},"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",[889,890,892],"h3",{"id":891},"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)",[430,894,895,896,899],{},"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 ",[441,897,898],{},"mô phỏng hiệu ứng truyền phát streaming bằng cách chỉnh sửa tại chỗ",":",[433,901],{"src":902,"alt":903},"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",[485,905,906],{},[488,907,908],{},[909,910,911,912,914,915,917],"em",{},"Cầu nối Buzz xuất bản trước một sự kiện giữ chỗ ",[495,913,744],{},", 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ỗ ",[495,916,768],{},", 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.",[889,919,921],{"id":920},"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",[430,923,924,925,778,928,931],{},"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 ",[495,926,927],{},"workspaceRegistry",[495,929,930],{},"@deepseek-ai\u002Fdsh-workspace","):",[933,934,938],"pre",{"className":935,"code":936,"language":937,"meta":425,"style":425},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const existing = await ctx.workspaceRegistry.resolveByPath(request.path);\n","typescript",[495,939,940],{"__ignoreMap":425},[941,942,945,949,953,957,961,964,966,968,970,974,977,979,982],"span",{"class":943,"line":944},"line",1,[941,946,948],{"class":947},"spNyl","const",[941,950,952],{"class":951},"sTEyZ"," existing ",[941,954,956],{"class":955},"sMK4o","=",[941,958,960],{"class":959},"s7zQu"," await",[941,962,963],{"class":951}," ctx",[941,965,461],{"class":955},[941,967,927],{"class":951},[941,969,461],{"class":955},[941,971,973],{"class":972},"s2Zo4","resolveByPath",[941,975,976],{"class":951},"(request",[941,978,461],{"class":955},[941,980,981],{"class":951},"path)",[941,983,984],{"class":955},";\n",[430,986,987,988,991],{},"Cầu nối Buzz cung cấp lệnh trò chuyện ",[495,989,990],{},"\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.",[433,993],{"src":994,"alt":995},"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",[430,997,998],{},"Ba lưu ý quan trọng về mặt thiết kế:",[485,1000,1001,1011,1021],{},[488,1002,1003,1006,1007,1010],{},[441,1004,1005],{},"Đổi thư mục = Tạo phiên mới."," Tham số ",[495,1008,1009],{},"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.",[488,1012,1013,1016,1017,1020],{},[441,1014,1015],{},"Thư mục bắt buộc phải tồn tại."," Hàm ",[495,1018,1019],{},"create"," sẽ từ chối các đường dẫn không có thực trên ổ đĩa.",[488,1022,1023,1026,1027,1030],{},[441,1024,1025],{},"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 ",[441,1028,1029],{},"auto-approve"," (tự động phê duyệt), cấp quyền truy cập tệp trong thư mục mục tiêu.",[474,1032,1034],{"id":1033},"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",[533,1036,1037],{},[488,1038,1039],{},"Chạy các lệnh sau trong cửa sổ dòng lệnh terminal của bạn:",[933,1041,1045],{"className":1042,"code":1043,"language":1044,"meta":425,"style":425},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dsh plugin --profile web add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n\n# Start DSH web\ndsh web\n","bash",[495,1046,1047,1069,1076,1083],{"__ignoreMap":425},[941,1048,1049,1053,1057,1060,1063,1066],{"class":943,"line":944},[941,1050,1052],{"class":1051},"sBMFI","dsh",[941,1054,1056],{"class":1055},"sfazB"," plugin",[941,1058,1059],{"class":1055}," --profile",[941,1061,1062],{"class":1055}," web",[941,1064,1065],{"class":1055}," add",[941,1067,1068],{"class":1055}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n",[941,1070,1072],{"class":943,"line":1071},2,[941,1073,1075],{"emptyLinePlaceholder":1074},true,"\n",[941,1077,1079],{"class":943,"line":1078},3,[941,1080,1082],{"class":1081},"sHwdD","# Start DSH web\n",[941,1084,1086,1088],{"class":943,"line":1085},4,[941,1087,1052],{"class":1051},[941,1089,1090],{"class":1055}," web\n",[533,1092,1093],{"start":1071},[488,1094,1095,1096,1098],{},"Khi giao diện Web DSH mở ra trong trình duyệt web, nhấp vào biểu tượng \"",[441,1097,527],{},"\":",[430,1100,1101],{},[433,1102],{"alt":1103,"src":1104},"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",[533,1106,1107],{"start":1078},[488,1108,1109,1110,1113],{},"Chọn mục \"",[441,1111,1112],{},"Buzz","\" ở bảng điều khiển bên trái:",[430,1115,1116],{},[433,1117],{"alt":1118,"src":1119},"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",[533,1121,1122,1133,1143],{"start":1085},[488,1123,1124,1125,1128,1129,1132],{},"Nhấp vào \"",[441,1126,1127],{},"Generate keypair","\" để tạo cặp khóa Nostr mới. Hãy sao chép khóa công khai ",[495,1130,1131],{},"npub"," vào nơi an toàn.",[488,1134,1135,1136,575,1139,1142],{},"Điền thông tin vào ô ",[441,1137,1138],{},"Relay URL",[441,1140,1141],{},"Channels"," (danh sách UUID các kênh cho phép đăng ký).",[488,1144,1145,1146,1149],{},"Nhấp vào nút \"",[441,1147,1148],{},"Save","\".",[430,1151,1152,1153,1156,1157,1160,1161,461],{},"Lưu biểu mẫu sẽ lưu trữ thông tin đăng nhập và ",[441,1154,1155],{},"kích hoạt cầu nối khởi chạy",". Khóa bí mật ",[495,1158,1159],{},"nsec"," được coi là thông tin mật tuyệt đối và chỉ lưu trữ duy nhất trong tệp ",[495,1162,501],{},[889,1164,1166],{"id":1165},"đă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",[430,1168,1169,1172,1173,1175],{},[441,1170,1171],{},"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 ",[495,1174,1131],{}," vừa tạo ở bước trên:",[933,1177,1179],{"className":1042,"code":1178,"language":1044,"meta":425,"style":425},"docker compose exec relay buzz-admin add-member --pubkey npub123123123\n",[495,1180,1181],{"__ignoreMap":425},[941,1182,1183,1186,1189,1192,1195,1198,1201,1204],{"class":943,"line":944},[941,1184,1185],{"class":1051},"docker",[941,1187,1188],{"class":1055}," compose",[941,1190,1191],{"class":1055}," exec",[941,1193,1194],{"class":1055}," relay",[941,1196,1197],{"class":1055}," buzz-admin",[941,1199,1200],{"class":1055}," add-member",[941,1202,1203],{"class":1055}," --pubkey",[941,1205,1206],{"class":1055}," npub123123123\n",[430,1208,1209,1212,1213,1216,1217,1220,1221,1224,1225,1228],{},[441,1210,1211],{},"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ụ ",[495,1214,1215],{},"buzz-cli",", cần lưu ý rằng tham số ",[495,1218,1219],{},"--pubkey"," phải ở định dạng ",[441,1222,1223],{},"HEX",", không phải npub (lệnh ",[495,1226,1227],{},"buzz-admin add-member"," trước đó sẽ in ra khóa HEX tương ứng):",[933,1230,1232],{"className":1042,"code":1231,"language":1044,"meta":425,"style":425},"buzz channels add-member --channel \u003CCHANNEL_UUID> --pubkey \u003CAGENT_HEX> --role member\n",[495,1233,1234],{"__ignoreMap":425},[941,1235,1236,1239,1242,1244,1247,1250,1253,1256,1259,1261,1263,1266,1269,1271,1274],{"class":943,"line":944},[941,1237,1238],{"class":1051},"buzz",[941,1240,1241],{"class":1055}," channels",[941,1243,1200],{"class":1055},[941,1245,1246],{"class":1055}," --channel",[941,1248,1249],{"class":955}," \u003C",[941,1251,1252],{"class":1055},"CHANNEL_UUI",[941,1254,1255],{"class":951},"D",[941,1257,1258],{"class":955},">",[941,1260,1203],{"class":1055},[941,1262,1249],{"class":955},[941,1264,1265],{"class":1055},"AGENT_HE",[941,1267,1268],{"class":951},"X",[941,1270,1258],{"class":955},[941,1272,1273],{"class":1055}," --role",[941,1275,1276],{"class":1055}," member\n",[463,1278],{"description":1279,"image":466,"image-alt":467,"label":1280,"min-read":1281,"title":1282,"to":1283},"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",[430,1285,1286,1287,899],{},"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 ",[495,1288,1215],{},[430,1290,1291],{},[433,1292],{"alt":1293,"src":1294},"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",[430,1296,1297,1298,1301],{},"Gửi một lời chào ",[441,1299,1300],{},"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:",[430,1303,1304],{},[433,1305],{"alt":1306,"src":1307},"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",[430,1309,1310],{},[909,1311,1312],{},"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.",[889,1314,1316,1317],{"id":1315},"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 ",[495,1318,1319],{},"\u002Fworkspace",[430,1321,1322,1323,1326,1327,1330,1331,1333],{},"Do thiết lập ",[495,1324,1325],{},"allowWorkspace"," được đặt mặc định là ",[495,1328,1329],{},"false"," để bảo vệ an toàn, lệnh ",[495,1332,1319],{}," ban đầu sẽ bị từ chối:",[430,1335,1336],{},[433,1337],{"alt":1338,"src":1339},"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",[430,1341,1342,1343,1346,1347,899],{},"Bật tính năng này trong tệp ",[495,1344,1345],{},"~\u002F.dsh\u002Fprofiles\u002Fweb\u002Fcordis.patch.yml",", sau đó khởi động lại ",[495,1348,590],{},[933,1350,1354],{"className":1351,"code":1352,"language":1353,"meta":425,"style":425},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- id: ui-message-gateway\n  config:\n    allowWorkspace: true\n","yml",[495,1355,1356,1370,1378],{"__ignoreMap":425},[941,1357,1358,1361,1365,1367],{"class":943,"line":944},[941,1359,1360],{"class":955},"-",[941,1362,1364],{"class":1363},"swJcz"," id",[941,1366,899],{"class":955},[941,1368,1369],{"class":1055}," ui-message-gateway\n",[941,1371,1372,1375],{"class":943,"line":1071},[941,1373,1374],{"class":1363},"  config",[941,1376,1377],{"class":955},":\n",[941,1379,1380,1383,1385],{"class":943,"line":1078},[941,1381,1382],{"class":1363},"    allowWorkspace",[941,1384,899],{"class":955},[941,1386,1388],{"class":1387},"sfNiH"," true\n",[430,1390,1391],{},"Sau khi khởi động lại:",[430,1393,1394],{},[433,1395],{"alt":1396,"src":1397},"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",[430,1399,1400,1401,1404],{},"Đ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 (",[495,1402,1403],{},"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.",[430,1406,1407],{},[433,1408],{"alt":1409,"src":1410},"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",[889,1412,1414],{"id":1413},"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",[430,1416,1417],{},"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:",[603,1419,1420,1430],{},[606,1421,1422],{},[609,1423,1424,1427],{},[612,1425,1426],{},"Lệnh",[612,1428,1429],{},"Chức năng",[621,1431,1432,1442,1452,1462,1472,1482,1492,1502,1512,1532,1552],{},[609,1433,1434,1439],{},[626,1435,1436],{},[495,1437,1438],{},"\u002Fworkspace \u003Cfolder>",[626,1440,1441],{},"Đă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)",[609,1443,1444,1449],{},[626,1445,1446],{},[495,1447,1448],{},"\u002Fhelp",[626,1450,1451],{},"Liệt kê tất cả các lệnh khả dụng",[609,1453,1454,1459],{},[626,1455,1456],{},[495,1457,1458],{},"\u002Ftime",[626,1460,1461],{},"Hiển thị thời gian hiện tại của hệ thống",[609,1463,1464,1469],{},[626,1465,1466],{},[495,1467,1468],{},"\u002Fnew",[626,1470,1471],{},"Khởi tạo một phiên trò chuyện hoàn toàn mới",[609,1473,1474,1479],{},[626,1475,1476],{},[495,1477,1478],{},"\u002Fclear",[626,1480,1481],{},"Xóa trắng lịch sử trò chuyện hiện tại",[609,1483,1484,1489],{},[626,1485,1486],{},[495,1487,1488],{},"\u002Fstatus",[626,1490,1491],{},"Kiểm tra trạng thái hoạt động của cầu nối",[609,1493,1494,1499],{},[626,1495,1496],{},[495,1497,1498],{},"\u002Fstats",[626,1500,1501],{},"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)",[609,1503,1504,1509],{},[626,1505,1506],{},[495,1507,1508],{},"\u002Fcommands",[626,1510,1511],{},"Xem bảng mô tả chi tiết của từng lệnh",[609,1513,1514,1519],{},[626,1515,1516],{},[495,1517,1518],{},"@path\u002Fto\u002Ffile",[626,1520,1521,1522,753,1524,1527,1528,1531],{},"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õ ",[495,1523,839],{},[495,1525,1526],{},"@tiền_tố"," hoặc ",[495,1529,1530],{},"\u002Ffiles \u003Ctiền_tố>"," để hiển thị danh sách tệp\u002Fthư mục phù hợp",[609,1533,1534,1539],{},[626,1535,1536],{},[495,1537,1538],{},"\u002Fmodel",[626,1540,1541,1544,1545,1547,1548,1551],{},[495,1542,1543],{},"[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õ ",[495,1546,1538],{}," để xem tùy chọn, ",[495,1549,1550],{},"\u002Fmodel reset"," để khôi phục mặc định",[609,1553,1554,1559],{},[626,1555,1556],{},[495,1557,1558],{},"\u002Feffort",[626,1560,1561,1564,1565,1568],{},[495,1562,1563],{},"\u003Cid>"," chỉ điều chỉnh mức độ suy luận (reasoning effort); ",[495,1566,1567],{},"\u002Feffort reset"," khôi phục lại giá trị mặc định",[889,1570,1572],{"id":1571},"tóm-lược-về-bảo-mật","Tóm lược về bảo mật",[485,1574,1575,1588,1598],{},[488,1576,1577,1578,1580,1581,1583,1584,1587],{},"Khóa riêng ",[441,1579,1159],{}," chỉ nằm duy nhất trong ",[495,1582,501],{}," (phân quyền tệp 0600, ghi nguyên tử) — không bao giờ bị lộ ra ngoài qua endpoint ",[495,1585,1586],{},"\u002Fgateway\u002Flist"," hay tệp nhật ký log.",[488,1589,1590,1591,778,1594,1597],{},"Mọi sự kiện gửi đến đều được ",[441,1592,1593],{},"xác thực chữ ký mật mã",[495,1595,1596],{},"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.",[488,1599,1600,778,1603,1606],{},[441,1601,1602],{},"Việc đăng ký workspace được kiểm soát chặt bằng cấu hình",[495,1604,1605],{},"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.",[474,1608,1610],{"id":1609},"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",[430,1612,1613,1614,1616],{},"Khía cạnh phức tạp nhất khi tích hợp Buzz vào ",[495,1615,449],{}," 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.",[474,1618,1620],{"id":1619},"tài-liệu-tham-khảo","Tài liệu tham khảo:",[485,1622,1623,1631,1639],{},[488,1624,1625,1630],{},[444,1626,1629],{"href":1627,"rel":1628},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway\u002Fblob\u002Fmain\u002Fdocs\u002Farchitecture.md",[448],"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",[488,1632,1633,1638],{},[444,1634,1637],{"href":1635,"rel":1636},"https:\u002F\u002Fgithub.com\u002Fnbd-wtf\u002Fnostr-tools",[448],"nostr-tools"," — thư viện Nostr cốt lõi được sử dụng bên dưới",[488,1640,1641,1646],{},[444,1642,1645],{"href":1643,"rel":1644},"https:\u002F\u002Fgithub.com\u002Fbytedance\u002Fdeer-flow\u002Fblob\u002Fmain\u002Fbackend\u002Fdocs\u002FIM_CHANNEL_CONNECTIONS.md",[448],"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",[1648,1649,1650],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":425,"searchDepth":1071,"depth":1078,"links":1652},[1653,1654,1658,1665,1666],{"id":476,"depth":1071,"text":477},{"id":594,"depth":1071,"text":595,"children":1655},[1656,1657],{"id":891,"depth":1078,"text":892},{"id":920,"depth":1078,"text":921},{"id":1033,"depth":1071,"text":1034,"children":1659},[1660,1661,1663,1664],{"id":1165,"depth":1078,"text":1166},{"id":1315,"depth":1078,"text":1662},"Cho phép mở quyền thư mục cục bộ với lệnh \u002Fworkspace",{"id":1413,"depth":1078,"text":1414},{"id":1571,"depth":1078,"text":1572},{"id":1609,"depth":1071,"text":1610},{"id":1619,"depth":1071,"text":1620},[1668,1669,1238,1670],"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":1677,"robots":1702,"sitemap":1703},[1678,1680],{"@type":1679,"headline":424,"description":1672,"image":1674},"TechArticle",{"@type":1681,"name":424,"description":1672,"image":1674,"step":1682},"HowTo",[1683,1687,1690,1693,1696,1699],{"@type":1684,"name":1685,"text":1686},"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":1684,"name":1688,"text":1689},"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":1684,"name":1691,"text":1692},"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":1684,"name":1694,"text":1695},"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":1684,"name":1697,"text":1698},"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":1684,"name":1700,"text":1701},"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":1671},14,{"title":1706,"description":1672,"ogTitle":424,"ogDescription":1672,"twitterTitle":424,"twitterDescription":1672},"Plugin Buzz cho DeepSeek Harness: Tạo Cầu Nối Nostr","vi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",[600,1112,1709,1710,449],"Nostr","Tác tử AI",null,"ZIProBuceyP_EtpE4Ozv_jHRd4oXizYxQLd5TQo7Fjg",{"id":1714,"title":1715,"author":425,"body":1716,"category":2611,"date":2613,"description":2614,"extension":1673,"image":2615,"imageAlt":2616,"isPublished":1074,"meta":2617,"minRead":2387,"navigation":1074,"path":287,"seo":2651,"stem":2653,"tags":2654,"updatedAt":2650,"__hash__":2658},"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":427,"value":1717,"toc":2593},[1718,1733,1743,1747,1750,1762,1766,1774,1778,1782,1832,1836,1973,1977,2010,2014,2017,2083,2086,2122,2125,2152,2156,2166,2171,2210,2299,2303,2308,2325,2334,2413,2418,2464,2468,2513,2528,2532,2576,2580,2590],[430,1719,1720,1721,1724,1725,1728,1729,1732],{},"Một thách thức phổ biến nảy sinh khi bạn muốn truy cập ",[441,1722,1723],{},"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 ",[441,1726,1727],{},"Cloudflare WARP"," cùng với ",[441,1730,1731],{},"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.",[430,1734,1735,1736,1739,1740,1742],{},"Nếu bạn đã làm theo hướng dẫn trước đây của chúng tôi, '",[444,1737,1738],{"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 ",[441,1741,1727],{}," để kết nối Hermes Agent vào mạng riêng (private network) qua internet.",[474,1744,1746],{"id":1745},"hiểu-về-kiến-trúc","Hiểu về Kiến trúc",[430,1748,1749],{},"Các thành phần đang hoạt động:",[533,1751,1752,1757],{},[488,1753,1754,1756],{},[441,1755,1731],{},": 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.",[488,1758,1759,1761],{},[441,1760,1727],{},": Ứ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.",[889,1763,1765],{"id":1764},"điều-kiện-tiên-quyết","Điều kiện tiên quyết",[485,1767,1768,1771],{},[488,1769,1770],{},"Một Hermes Agent đang chạy trên VPS của bạn.",[488,1772,1773],{},"Một tài khoản Cloudflare miễn phí.",[474,1775,1777],{"id":1776},"hướng-dẫn-từng-bước","Hướng dẫn Từng bước",[889,1779,1781],{"id":1780},"bước-1-thiết-lập-cloudflare-zero-trust","Bước 1: Thiết lập Cloudflare Zero Trust",[533,1783,1784,1793,1800,1811,1818,1825],{},[488,1785,1786,1787,1792],{},"Đăng nhập vào ",[444,1788,1791],{"href":1789,"rel":1790},"https:\u002F\u002Fdash.cloudflare.com\u002F",[448],"Bảng điều khiển Cloudflare"," của bạn.",[488,1794,1795,1796],{},"Nhấp vào 'Zero Trust' từ menu bên trái.\n",[433,1797],{"alt":1798,"src":1799},"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",[488,1801,1802,1803,1806,1807],{},"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ụ: ",[495,1804,1805],{},"ai-team",").\n",[433,1808],{"alt":1809,"src":1810},"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",[488,1812,1813,1814],{},"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",[433,1815],{"alt":1816,"src":1817},"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",[488,1819,1820,1821],{},"Nhấp vào 'Create new policy'.\n",[433,1822],{"alt":1823,"src":1824},"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",[488,1826,1827,1828],{},"Chọn 'Emails' và nhập email của bạn dưới mục 'Policy rules'.\n",[433,1829],{"alt":1830,"src":1831},"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",[889,1833,1835],{"id":1834},"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",[533,1837,1838,1848,1854,1861,1864,1879,1882,1966],{},[488,1839,1840,1841,575,1844,1847],{},"Chạy ",[495,1842,1843],{},"sudo apt update",[495,1845,1846],{},"sudo apt install cloudflare-warp"," trong terminal trên VPS của bạn.",[488,1849,1840,1850,1853],{},[495,1851,1852],{},"warp-cli registration new \u003CTEAM-NAME>"," trong terminal trên VPS của bạn, một URL sẽ được in ra.",[488,1855,1856,1857,1860],{},"Sao chép URL vừa được in, nó sẽ có dạng ",[495,1858,1859],{},"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.",[488,1862,1863],{},"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.",[488,1865,1866,1867,1870,1871,1874,1875,1878],{},"Trên trang '",[441,1868,1869],{},"Success","' (Thành công) trong trình duyệt, hãy nhấp chuột phải và chọn '",[441,1872,1873],{},"Inspect","' (Kiểm tra) ở nút màu xanh '",[441,1876,1877],{},"Open Cloudflare WARP","'.",[488,1880,1881],{},"Sao chép chuỗi mã token dài nằm trong liên kết của nút.",[488,1883,1840,1884,1887,1888,1891,1892],{},[495,1885,1886],{},"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.",[1889,1890],"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:",[933,1893,1895],{"className":1042,"code":1894,"language":1044,"meta":425,"style":425},"sudo systemctl restart warp-svc.service\n\n# Check status\nsudo systemctl status warp-svc.service\n\n# Run the warp-cli registration token again\nwarp-cli --accept-tos registration token   \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\"\n",[495,1896,1897,1911,1915,1920,1931,1936,1942],{"__ignoreMap":425},[941,1898,1899,1902,1905,1908],{"class":943,"line":944},[941,1900,1901],{"class":1051},"sudo",[941,1903,1904],{"class":1055}," systemctl",[941,1906,1907],{"class":1055}," restart",[941,1909,1910],{"class":1055}," warp-svc.service\n",[941,1912,1913],{"class":943,"line":1071},[941,1914,1075],{"emptyLinePlaceholder":1074},[941,1916,1917],{"class":943,"line":1078},[941,1918,1919],{"class":1081},"# Check status\n",[941,1921,1922,1924,1926,1929],{"class":943,"line":1085},[941,1923,1901],{"class":1051},[941,1925,1904],{"class":1055},[941,1927,1928],{"class":1055}," status",[941,1930,1910],{"class":1055},[941,1932,1934],{"class":943,"line":1933},5,[941,1935,1075],{"emptyLinePlaceholder":1074},[941,1937,1939],{"class":943,"line":1938},6,[941,1940,1941],{"class":1081},"# Run the warp-cli registration token again\n",[941,1943,1945,1948,1951,1954,1957,1960,1963],{"class":943,"line":1944},7,[941,1946,1947],{"class":1051},"warp-cli",[941,1949,1950],{"class":1055}," --accept-tos",[941,1952,1953],{"class":1055}," registration",[941,1955,1956],{"class":1055}," token",[941,1958,1959],{"class":955},"   \"",[941,1961,1962],{"class":1055},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[941,1964,1965],{"class":955},"\"\n",[488,1967,1968,1969],{},"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",[433,1970],{"alt":1971,"src":1972},"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",[889,1974,1976],{"id":1975},"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",[533,1978,1979,1986,1993,2000],{},[488,1980,1981,1982],{},"Nhấp vào cấu hình VPS của bạn trên bảng điều khiển Devices.\n",[433,1983],{"alt":1984,"src":1985},"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",[488,1987,1988,1989],{},"Cuộn xuống phần 'Split Tunnels'.\n",[433,1990],{"alt":1991,"src":1992},"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",[488,1994,1995,1996],{},"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",[433,1997],{"alt":1998,"src":1999},"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",[488,2001,2002,2003,575,2006,2009],{},"Hiển thị ",[495,2004,2005],{},"address",[495,2007,2008],{},"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.",[889,2011,2013],{"id":2012},"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",[430,2015,2016],{},"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.",[933,2018,2020],{"className":1042,"code":2019,"language":1044,"meta":425,"style":425},"sudo ufw enable \nsudo ufw default allow outgoing \nsudo ufw default deny incoming\nsudo ufw allow in from 100.96.0.0\u002F12\n",[495,2021,2022,2035,2052,2066],{"__ignoreMap":425},[941,2023,2024,2026,2029,2032],{"class":943,"line":944},[941,2025,1901],{"class":1051},[941,2027,2028],{"class":1055}," ufw",[941,2030,2031],{"class":1055}," enable",[941,2033,2034],{"class":951}," \n",[941,2036,2037,2039,2041,2044,2047,2050],{"class":943,"line":1071},[941,2038,1901],{"class":1051},[941,2040,2028],{"class":1055},[941,2042,2043],{"class":1055}," default",[941,2045,2046],{"class":1055}," allow",[941,2048,2049],{"class":1055}," outgoing",[941,2051,2034],{"class":951},[941,2053,2054,2056,2058,2060,2063],{"class":943,"line":1078},[941,2055,1901],{"class":1051},[941,2057,2028],{"class":1055},[941,2059,2043],{"class":1055},[941,2061,2062],{"class":1055}," deny",[941,2064,2065],{"class":1055}," incoming\n",[941,2067,2068,2070,2072,2074,2077,2080],{"class":943,"line":1085},[941,2069,1901],{"class":1051},[941,2071,2028],{"class":1055},[941,2073,2046],{"class":1055},[941,2075,2076],{"class":1055}," in",[941,2078,2079],{"class":1055}," from",[941,2081,2082],{"class":1055}," 100.96.0.0\u002F12\n",[430,2084,2085],{},"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ộ:",[933,2087,2089],{"className":1042,"code":2088,"language":1044,"meta":425,"style":425},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[495,2090,2091,2107],{"__ignoreMap":425},[941,2092,2093,2095,2097,2099,2101,2104],{"class":943,"line":944},[941,2094,1901],{"class":1051},[941,2096,2028],{"class":1055},[941,2098,2046],{"class":1055},[941,2100,2076],{"class":1055},[941,2102,2103],{"class":1055}," on",[941,2105,2106],{"class":1055}," lo\n",[941,2108,2109,2111,2113,2115,2118,2120],{"class":943,"line":1071},[941,2110,1901],{"class":1051},[941,2112,2028],{"class":1055},[941,2114,2046],{"class":1055},[941,2116,2117],{"class":1055}," out",[941,2119,2103],{"class":1055},[941,2121,2106],{"class":1055},[430,2123,2124],{},"Tải lại tường lửa và xác minh trạng thái:",[933,2126,2128],{"className":1042,"code":2127,"language":1044,"meta":425,"style":425},"sudo ufw reload \nsudo ufw status verbose\n",[495,2129,2130,2141],{"__ignoreMap":425},[941,2131,2132,2134,2136,2139],{"class":943,"line":944},[941,2133,1901],{"class":1051},[941,2135,2028],{"class":1055},[941,2137,2138],{"class":1055}," reload",[941,2140,2034],{"class":951},[941,2142,2143,2145,2147,2149],{"class":943,"line":1071},[941,2144,1901],{"class":1051},[941,2146,2028],{"class":1055},[941,2148,1928],{"class":1055},[941,2150,2151],{"class":1055}," verbose\n",[889,2153,2155],{"id":2154},"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",[430,2157,2158,2159,2162,2163,461],{},"Chúng ta sẽ hiển thị ",[441,2160,2161],{},"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à ",[441,2164,2165],{},"Nous Research",[2167,2168,2170],"h4",{"id":2169},"thiết-lập-nhà-cung-cấp-xác-thực","Thiết lập Nhà cung cấp Xác thực",[533,2172,2173,2182,2189,2196,2203],{},[488,2174,2175,2176,2181],{},"Đi tới ",[444,2177,2180],{"href":2178,"rel":2179},"https:\u002F\u002Fportal.nousresearch.com",[448],"portal.nousresearch.com"," để đăng ký một tài khoản.",[488,2183,2184,2185],{},"Chọn 'Local Dashboards'.\n",[433,2186],{"alt":2187,"src":2188},"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",[488,2190,2191,2192],{},"Nhấp vào 'Register Dashboard'.\n",[433,2193],{"alt":2194,"src":2195},"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",[488,2197,2198,2199],{},"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",[433,2200],{"alt":2201,"src":2202},"Đă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",[488,2204,2205,2206,2209],{},"Sao chép 'OAuth client ID' và dán nó vào tệp ",[495,2207,2208],{},"config.yaml"," của bạn:",[933,2211,2215],{"className":2212,"code":2213,"language":2214,"meta":425,"style":425},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dashboard:\n  theme: default\n  show_token_analytics: false\n  oauth:\n    client_id: agent:cmq02x7ha0002jk0ba3kfnb\n    portal_url: https:\u002F\u002Fportal.nousresearch.com\n  basic_auth:\n    username: ''\n    password_hash: ''\n","yaml",[495,2216,2217,2224,2234,2244,2251,2261,2271,2278,2289],{"__ignoreMap":425},[941,2218,2219,2222],{"class":943,"line":944},[941,2220,2221],{"class":1363},"dashboard",[941,2223,1377],{"class":955},[941,2225,2226,2229,2231],{"class":943,"line":1071},[941,2227,2228],{"class":1363},"  theme",[941,2230,899],{"class":955},[941,2232,2233],{"class":1055}," default\n",[941,2235,2236,2239,2241],{"class":943,"line":1078},[941,2237,2238],{"class":1363},"  show_token_analytics",[941,2240,899],{"class":955},[941,2242,2243],{"class":1387}," false\n",[941,2245,2246,2249],{"class":943,"line":1085},[941,2247,2248],{"class":1363},"  oauth",[941,2250,1377],{"class":955},[941,2252,2253,2256,2258],{"class":943,"line":1933},[941,2254,2255],{"class":1363},"    client_id",[941,2257,899],{"class":955},[941,2259,2260],{"class":1055}," agent:cmq02x7ha0002jk0ba3kfnb\n",[941,2262,2263,2266,2268],{"class":943,"line":1938},[941,2264,2265],{"class":1363},"    portal_url",[941,2267,899],{"class":955},[941,2269,2270],{"class":1055}," https:\u002F\u002Fportal.nousresearch.com\n",[941,2272,2273,2276],{"class":943,"line":1944},[941,2274,2275],{"class":1363},"  basic_auth",[941,2277,1377],{"class":955},[941,2279,2281,2284,2286],{"class":943,"line":2280},8,[941,2282,2283],{"class":1363},"    username",[941,2285,899],{"class":955},[941,2287,2288],{"class":955}," ''\n",[941,2290,2292,2295,2297],{"class":943,"line":2291},9,[941,2293,2294],{"class":1363},"    password_hash",[941,2296,899],{"class":955},[941,2298,2288],{"class":955},[2167,2300,2302],{"id":2301},"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",[533,2304,2305],{},[488,2306,2307],{},"Tạo một tệp dịch vụ:",[933,2309,2313],{"className":2310,"code":2311,"language":2312,"meta":425,"style":425},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n","shell",[495,2314,2315],{"__ignoreMap":425},[941,2316,2317,2319,2322],{"class":943,"line":944},[941,2318,1901],{"class":1051},[941,2320,2321],{"class":1055}," nano",[941,2323,2324],{"class":1055}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[533,2326,2327],{"start":1071},[488,2328,2329,2330,2333],{},"Dán cấu hình sau, đảm bảo ",[495,2331,2332],{},"--host 0.0.0.0"," là một phần của lệnh:",[933,2335,2339],{"className":2336,"code":2337,"language":2338,"meta":425,"style":425},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=Hermes Dashboard\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\nRestart=always\nRestartSec=10\nEnvironment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n\n[Install]\nWantedBy=multi-user.target\n","ini",[495,2340,2341,2346,2351,2356,2360,2365,2370,2375,2380,2385,2391,2397,2402,2408],{"__ignoreMap":425},[941,2342,2343],{"class":943,"line":944},[941,2344,2345],{},"[Unit]\n",[941,2347,2348],{"class":943,"line":1071},[941,2349,2350],{},"Description=Hermes Dashboard\n",[941,2352,2353],{"class":943,"line":1078},[941,2354,2355],{},"After=network.target\n",[941,2357,2358],{"class":943,"line":1085},[941,2359,1075],{"emptyLinePlaceholder":1074},[941,2361,2362],{"class":943,"line":1933},[941,2363,2364],{},"[Service]\n",[941,2366,2367],{"class":943,"line":1938},[941,2368,2369],{},"User=hermes\n",[941,2371,2372],{"class":943,"line":1944},[941,2373,2374],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[941,2376,2377],{"class":943,"line":2280},[941,2378,2379],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[941,2381,2382],{"class":943,"line":2291},[941,2383,2384],{},"Restart=always\n",[941,2386,2388],{"class":943,"line":2387},10,[941,2389,2390],{},"RestartSec=10\n",[941,2392,2394],{"class":943,"line":2393},11,[941,2395,2396],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[941,2398,2400],{"class":943,"line":2399},12,[941,2401,1075],{"emptyLinePlaceholder":1074},[941,2403,2405],{"class":943,"line":2404},13,[941,2406,2407],{},"[Install]\n",[941,2409,2410],{"class":943,"line":1704},[941,2411,2412],{},"WantedBy=multi-user.target\n",[533,2414,2415],{"start":1078},[488,2416,2417],{},"Bật và khởi động dịch vụ:",[933,2419,2421],{"className":2310,"code":2420,"language":2312,"meta":425,"style":425},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[495,2422,2423,2432,2443,2454],{"__ignoreMap":425},[941,2424,2425,2427,2429],{"class":943,"line":944},[941,2426,1901],{"class":1051},[941,2428,1904],{"class":1055},[941,2430,2431],{"class":1055}," daemon-reload\n",[941,2433,2434,2436,2438,2440],{"class":943,"line":1071},[941,2435,1901],{"class":1051},[941,2437,1904],{"class":1055},[941,2439,2031],{"class":1055},[941,2441,2442],{"class":1055}," hermes-dashboard\n",[941,2444,2445,2447,2449,2452],{"class":943,"line":1078},[941,2446,1901],{"class":1051},[941,2448,1904],{"class":1055},[941,2450,2451],{"class":1055}," start",[941,2453,2442],{"class":1055},[941,2455,2456,2458,2460,2462],{"class":943,"line":1085},[941,2457,1901],{"class":1051},[941,2459,1904],{"class":1055},[941,2461,1928],{"class":1055},[941,2463,2442],{"class":1055},[889,2465,2467],{"id":2466},"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",[533,2469,2470,2478,2481,2488,2495,2502],{},[488,2471,2472,2473,461],{},"Tải xuống máy khách Cloudflare WARP từ ",[444,2474,2477],{"href":2475,"rel":2476},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[448],"cổng thông tin của Cloudflare",[488,2479,2480],{},"Mở và khởi chạy máy khách Cloudflare WARP sau khi cài đặt.",[488,2482,2483,2484],{},"Đăng nhập khi được nhắc.\n",[433,2485],{"alt":2486,"src":2487},"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",[488,2489,2490,2491],{},"Một trang 'Success' (Thành công) sẽ được hiển thị sau khi đăng nhập thành công.\n",[433,2492],{"alt":2493,"src":2494},"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",[488,2496,2497,2498],{},"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",[433,2499],{"alt":2500,"src":2501},"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",[488,2503,2504,2505,2508,2509],{},"Điều hướng đến trình duyệt web của bạn và nhập IP riêng (ví dụ: ",[495,2506,2507],{},"100.96.0.3","). Bảng điều khiển Hermes Web sẽ tải thành công.\n",[433,2510],{"alt":2511,"src":2512},"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",[2514,2515,2516],"blockquote",{},[430,2517,2518,2521,2522,2527],{},[441,2519,2520],{},"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ề ",[441,2523,2524],{},[444,2525,2526],{"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.",[889,2529,2531],{"id":2530},"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",[533,2533,2534,2541,2549,2557,2565],{},[488,2535,2536,2537,2540],{},"Cài đặt ",[441,2538,2539],{},"Cloudflare One"," từ App Store.",[488,2542,2543,2544],{},"Mở ứng dụng Cloudflare One và nhập tên nhóm của bạn khi được nhắc.\n",[433,2545],{"alt":2546,"src":2547,"width":2548},"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,[488,2550,2551,2552],{},"Đă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",[433,2553],{"alt":2554,"src":2555,"width":2556},"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,[488,2558,2559,2560],{},"Sau khi được kết nối, nó sẽ trông giống như sau:\n",[433,2561],{"alt":2562,"src":2563,"width":2564},"Ứ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,[488,2566,2567,2568,2570,2571],{},"Điều hướng đến trình duyệt web của bạn và nhập IP riêng ",[495,2569,2507],{}," để truy cập Bảng điều khiển Hermes Web trên thiết bị di động của bạn.\n",[433,2572],{"alt":2573,"src":2574,"width":2575},"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,[474,2577,2579],{"id":2578},"phần-kết-luận","Phần Kết luận",[430,2581,2582,2583,2585,2586,2589],{},"Với ",[441,2584,1731],{}," xử lý các chính sách nhận dạng và máy khách ",[441,2587,2588],{},"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.",[1648,2591,2592],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":425,"searchDepth":1071,"depth":1078,"links":2594},[2595,2598,2610],{"id":1745,"depth":1071,"text":1746,"children":2596},[2597],{"id":1764,"depth":1078,"text":1765},{"id":1776,"depth":1071,"text":1777,"children":2599},[2600,2601,2602,2603,2604,2608,2609],{"id":1780,"depth":1078,"text":1781},{"id":1834,"depth":1078,"text":1835},{"id":1975,"depth":1078,"text":1976},{"id":2012,"depth":1078,"text":2013},{"id":2154,"depth":1078,"text":2155,"children":2605},[2606,2607],{"id":2169,"depth":1085,"text":2170},{"id":2301,"depth":1085,"text":2302},{"id":2466,"depth":1078,"text":2467},{"id":2530,"depth":1078,"text":2531},{"id":2578,"depth":1071,"text":2579},[1668,2612],"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":2618,"robots":1702,"sitemap":2649},[2619],{"@type":1681,"headline":1715,"description":2614,"name":1715,"image":2615,"step":2620},[2621,2625,2629,2633,2637,2641,2645],{"@type":1684,"name":2622,"text":2623,"url":2624,"image":1799},"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":1684,"name":2626,"text":2627,"url":2628,"image":1972},"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":1684,"name":2630,"text":2631,"url":2632,"image":1985},"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":1684,"name":2634,"text":2635,"url":2636},"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":1684,"name":2638,"text":2639,"url":2640},"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":1684,"name":2642,"text":2643,"url":2644,"image":2487},"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":1684,"name":2646,"text":2647,"url":2648,"image":2547},"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":2650},"2026-09-28",{"title":2652,"description":2614,"ogTitle":1715,"ogDescription":2614,"twitterTitle":1715,"twitterDescription":2614},"Truy cập an toàn Hermes Agent bằng Cloudflare Zero Trust","vi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[1727,2655,1723,2656,2657],"Zero Trust","Mạng riêng","Hướng dẫn","cj9xDUr4OU-vTUS6m18q2Qy2nRQKSVmUduRnaiOxXEc",{"id":2660,"title":2661,"author":425,"body":2662,"category":4082,"date":4084,"description":4085,"extension":1673,"image":4086,"imageAlt":4087,"isPublished":1074,"meta":4088,"minRead":3371,"navigation":1074,"path":307,"seo":4095,"stem":4097,"tags":4098,"updatedAt":1711,"__hash__":4102},"article\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices.md","Cách đồng bộ vault Obsidian qua các thiết bị an toàn",{"type":427,"value":2663,"toc":4060},[2664,2667,2672,2681,2690,2707,2712,2720,2724,2729,2743,2759,2762,2766,2770,2777,2782,2786,2791,2848,2855,2887,2891,2898,2904,2911,2973,2976,2993,3000,3012,3016,3020,3026,3031,3041,3062,3067,3081,3086,3091,3096,3110,3113,3118,3121,3126,3130,3135,3149,3153,3167,3177,3181,3186,3189,3199,3232,3236,3243,3385,3418,3423,3444,3455,3460,3464,3474,3545,3549,3554,3589,3720,3727,3733,3739,3745,3748,3754,3760,3774,3785,3792,3798,3805,3934,3940,3945,3948,3953,3956,3960,3965,3970,3976,3987,3997,4001,4012,4018,4024,4030,4034,4057],[430,2665,2666],{},"Obsidian là một ứng dụng quản lý ghi chú\u002Ftri thức theo triết lý local-first (ưu tiên lưu trữ cục bộ). Mỗi ghi chú thực chất là một file markdown nằm trên thiết bị và hoàn toàn thuộc quyền kiểm soát của bạn. Tuy nhiên, chúng ta thường mong muốn đồng bộ cùng một vault (kho ghi chú) trên cả laptop, điện thoại và các thiết bị khác, hoặc có thể truy cập từ xa thông qua trình duyệt web khi cần thiết.",[433,2668],{"src":2669,"alt":2670,"style":2671},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-multi-device-sync-illustration.webp","Hình minh họa kho ghi chú Obsidian được đồng bộ trên nhiều thiết bị","max-width: 667px; width: 100%; height: auto;",[430,2673,2674,2675,2680],{},"Hiện có nhiều giải pháp đồng bộ hóa cho Obsidian, nhưng chúng đều phải đánh đổi giữa tính năng xử lý xung đột, bảo mật mã hóa và chủ quyền dữ liệu cá nhân. ",[444,2676,2679],{"href":2677,"rel":2678},"https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch",[448],"Synch"," là một ứng dụng mã nguồn mở giúp đồng bộ hóa các vault Obsidian với cơ chế mã hóa đầu cuối (E2E) và tự động giải quyết xung đột trên máy chủ tự host.",[430,2682,2683,2684,2689],{},"Mặc dù phương pháp local-first của Obsidian hoạt động hoàn hảo trong hầu hết thời gian, đôi khi chúng ta vẫn cần truy cập ghi chú từ xa qua trình duyệt web. ",[444,2685,2688],{"href":2686,"rel":2687},"https:\u002F\u002Fgithub.com\u002FNystik-gh\u002Fignis",[448],"Ignis"," là giải pháp mã nguồn mở cho phép chạy Obsidian trực tiếp trên trình duyệt web với trải nghiệm gần như ứng dụng gốc, giúp bạn dễ dàng đọc và chỉnh sửa ghi chú từ bất kỳ đâu.",[430,2691,2692,2693,575,2695,2697,2698,2701,2702,2706],{},"Trong hướng dẫn này, chúng ta sẽ thiết lập ",[441,2694,2679],{},[441,2696,2688],{}," trên một ",[441,2699,2700],{},"VPS",", đồng thời bảo mật chúng bên trong mạng riêng ",[441,2703,2704],{},[444,2705,1731],{"href":363}," thay vì mở trực tiếp ra internet công cộng.",[433,2708],{"src":2709,"alt":2710,"style":2711},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-sync-cloudflare-zero-trust-architecture.webp","Sơ đồ kiến trúc đồng bộ Obsidian sử dụng Cloudflare Zero Trust","max-width: 671px; width: 100%; height: auto;",[463,2713],{"description":2714,"image":2715,"image-alt":2716,"label":2717,"min-read":2718,"title":2719,"to":363},"Tìm hiểu cách expose và truy cập an toàn vào Hermes Agent 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 firewall inbound.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FEN-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","Thiết lập mạng riêng tư an toàn sử dụng Cloudflare Zero Trust và đường truyền WARP tunnel","Hướng dẫn liên quan","8","Cách expose Hermes Agent riêng tư bằng Cloudflare WARP",[474,2721,2723],{"id":2722},"đồng-bộ-hóa-vault-obsidian-bảo-mật-với-synch","Đồng bộ hóa Vault Obsidian bảo mật với Synch",[430,2725,2726,2728],{},[441,2727,2679],{}," cung cấp các tính năng nổi bật sau:",[485,2730,2731,2734,2737,2740],{},[488,2732,2733],{},"Đồng bộ hóa vault ngay khi phát hiện thay đổi",[488,2735,2736],{},"Mã hóa dữ liệu vault đầu cuối trước khi upload",[488,2738,2739],{},"Khôi phục từ lịch sử phiên bản",[488,2741,2742],{},"Tự động xử lý và giải quyết xung đột file",[430,2744,2745,2747,2748,2751,2752,2755,2756,2758],{},[441,2746,2679],{}," tạo ra một ",[441,2749,2750],{},"vault key"," (khóa giải mã) 32-byte ngẫu nhiên trên thiết bị của bạn, dùng để mã hóa toàn bộ dữ liệu ghi chú. Khi tạo vault từ xa, bạn sẽ chọn một ",[441,2753,2754],{},"vault password"," (mật khẩu vault); mật khẩu này dùng để bảo vệ ",[441,2757,2750],{}," để khóa có thể được lưu trữ an toàn trên server và giải mã trên các thiết bị khác của bạn.",[430,2760,2761],{},"Việc giải quyết xung đột ghi chú được xử lý trực tiếp trên thiết bị khách (client) thay vì trên server. Nếu hai thiết bị cùng chỉnh sửa một ghi chú đồng thời, server sẽ giữ phiên bản nào gửi đến trước và báo cho thiết bị còn lại rằng file của họ đã lỗi thời. Thiết bị đó sẽ tự động gộp phiên bản mới từ server vào các thay đổi cục bộ của mình rồi mới upload bản ghi chú cuối cùng lên.",[889,2763,2765],{"id":2764},"thiết-lập-synch-trên-vps","Thiết lập Synch trên VPS",[2167,2767,2769],{"id":2768},"tạo-bản-ghi-tên-miền-dns","Tạo Bản ghi Tên miền (DNS)",[430,2771,2772,2773,2776],{},"Tạo một bản ghi A trên Cloudflare và đặt trạng thái proxy là ",[441,2774,2775],{},"DNS only"," (bỏ qua CDN của Cloudflare).",[433,2778],{"src":2779,"alt":2780,"style":2781},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fcloudflare-dns-a-record-synch-server.webp","Cấu hình bản ghi DNS A cho máy chủ Synch trong Cloudflare","max-width: 538px; width: 100%; height: auto;",[2167,2783,2785],{"id":2784},"cài-đặt-synch-docker-trên-ubuntu","Cài đặt Synch Docker trên Ubuntu",[2787,2788,2790],"h5",{"id":2789},"clone-repository","Clone Repository",[933,2792,2794],{"className":1042,"code":2793,"language":1044,"meta":425,"style":425},"git clone https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git       \n        \n# Navigate to the API folder\ncd synch\u002Fapps\u002Fapi\n        \n# Copy the example environment file:\ncp .env.example .env\n",[495,2795,2796,2810,2815,2820,2828,2832,2837],{"__ignoreMap":425},[941,2797,2798,2801,2804,2807],{"class":943,"line":944},[941,2799,2800],{"class":1051},"git",[941,2802,2803],{"class":1055}," clone",[941,2805,2806],{"class":1055}," https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git",[941,2808,2809],{"class":951},"       \n",[941,2811,2812],{"class":943,"line":1071},[941,2813,2814],{"class":951},"        \n",[941,2816,2817],{"class":943,"line":1078},[941,2818,2819],{"class":1081},"# Navigate to the API folder\n",[941,2821,2822,2825],{"class":943,"line":1085},[941,2823,2824],{"class":972},"cd",[941,2826,2827],{"class":1055}," synch\u002Fapps\u002Fapi\n",[941,2829,2830],{"class":943,"line":1933},[941,2831,2814],{"class":951},[941,2833,2834],{"class":943,"line":1938},[941,2835,2836],{"class":1081},"# Copy the example environment file:\n",[941,2838,2839,2842,2845],{"class":943,"line":1944},[941,2840,2841],{"class":1051},"cp",[941,2843,2844],{"class":1055}," .env.example",[941,2846,2847],{"class":1055}," .env\n",[2787,2849,2851,2852],{"id":2850},"chỉnh-sửa-các-giá-trị-trong-env","Chỉnh sửa các giá trị trong ",[495,2853,2854],{},".env",[485,2856,2857,2863,2881],{},[488,2858,2859,2862],{},[495,2860,2861],{},"PUBLIC_URL=synch.pafor.me",": Điền tên miền công cộng của server Synch (tên miền bạn vừa cấu hình ở bước trên).",[488,2864,2865,575,2868,2871,2872,2876,2877,2880],{},[495,2866,2867],{},"BETTER_AUTH_SECRET",[495,2869,2870],{},"SYNC_TOKEN_SECRET",": Tạo các khóa bí mật bảo mật bằng cách sử dụng ",[444,2873,2875],{"href":2874},"\u002Fvi\u002Ftools\u002Fsecret-key-hex","công cụ tạo key online"," hoặc chạy lệnh ",[495,2878,2879],{},"openssl rand -hex 32"," hai lần trong terminal của bạn.",[488,2882,2883,2886],{},[495,2884,2885],{},"AUTH_ALLOWED_EMAILS",": Danh sách các email được phép đăng ký và tạo tài khoản (ngăn cách bằng dấu phẩy).",[2787,2888,2890],{"id":2889},"thêm-tên-miền-vào-caddyfile","Thêm Tên miền vào Caddyfile",[430,2892,2893,2894,461],{},"Thông tin chi tiết về cách tích hợp module Cloudflare DNS vào Caddy và chạy bằng Docker container được trình bày trong ",[444,2895,2897],{"href":2896},"\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#_4-enable-https-with-caddy","bài viết tự host Buzz của chúng tôi",[463,2899],{"description":2900,"image":2901,"image-alt":2902,"label":2903,"min-read":469,"title":455,"to":2896},"Tìm hiểu cách định cấu hình Caddy để tự động cấp chứng chỉ SSL\u002FTLS bằng cách sử dụng các thử thách DNS của Cloudflare trong các vùng chứa Docker.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FEN-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","Định cấu hình Caddy bằng token API Cloudflare DNS để tự động tạo chứng chỉ SSL\u002FTLS trong không gian làm việc tự host","Hướng dẫn tự host",[430,2905,2906,2907,2910],{},"Thêm biến môi trường ",[495,2908,2909],{},"SYNCH_DOMAIN"," vào file Caddyfile và trỏ về cổng 8787 của container Synch:",[933,2912,2916],{"className":2913,"code":2914,"language":2915,"meta":425,"style":425},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n\n{$SYNCH_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:8787\n}\n","json",[495,2917,2918,2923,2931,2935,2939,2953,2958,2969],{"__ignoreMap":425},[941,2919,2920],{"class":943,"line":944},[941,2921,2922],{"class":955},"{\n",[941,2924,2925,2928],{"class":943,"line":1071},[941,2926,2927],{"class":951},"  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN",[941,2929,2930],{"class":955},"}\n",[941,2932,2933],{"class":943,"line":1078},[941,2934,2930],{"class":951},[941,2936,2937],{"class":943,"line":1085},[941,2938,1075],{"emptyLinePlaceholder":1074},[941,2940,2941,2944,2947,2950],{"class":943,"line":1933},[941,2942,2943],{"class":955},"{",[941,2945,2946],{"class":951},"$SYNCH_DOMAIN",[941,2948,2949],{"class":955},"}",[941,2951,2952],{"class":955}," {\n",[941,2954,2955],{"class":943,"line":1938},[941,2956,2957],{"class":951},"  encode zstd gzip\n",[941,2959,2960,2963,2965],{"class":943,"line":1944},[941,2961,2962],{"class":951},"  reverse_proxy host.docker.internal",[941,2964,899],{"class":955},[941,2966,2968],{"class":2967},"sbssI","8787\n",[941,2970,2971],{"class":943,"line":2280},[941,2972,2930],{"class":955},[430,2974,2975],{},"Khởi chạy container:",[933,2977,2979],{"className":1042,"code":2978,"language":1044,"meta":425,"style":425},"docker compose up -d\n",[495,2980,2981],{"__ignoreMap":425},[941,2982,2983,2985,2987,2990],{"class":943,"line":944},[941,2984,1185],{"class":1051},[941,2986,1188],{"class":1055},[941,2988,2989],{"class":1055}," up",[941,2991,2992],{"class":1055}," -d\n",[430,2994,2995,2996,2999],{},"Chạy lệnh ",[495,2997,2998],{},"curl"," sau để kiểm tra xem hệ thống đã hoạt động chưa:",[933,3001,3003],{"className":1042,"code":3002,"language":1044,"meta":425,"style":425},"curl https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[495,3004,3005],{"__ignoreMap":425},[941,3006,3007,3009],{"class":943,"line":944},[941,3008,2998],{"class":1051},[941,3010,3011],{"class":1055}," https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[889,3013,3015],{"id":3014},"kết-nối-obsidian-với-server-synch","Kết nối Obsidian với Server Synch",[2167,3017,3019],{"id":3018},"cài-đặt-plugin-synch-trên-obsidian","Cài đặt Plugin Synch trên Obsidian",[430,3021,3022,3023,899],{},"Vào Cài đặt (Settings) -> Community plugins và nhấn nút ",[441,3024,3025],{},"'Browse'",[433,3027],{"src":3028,"alt":3029,"style":3030},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-community-plugins-browse.webp","Duyệt các plugin cộng đồng trong cài đặt Obsidian","max-width: 523px; width: 100%; height: auto;",[430,3032,3033,3034,1377,3037],{},"Tìm kiếm và cài đặt plugin ",[441,3035,3036],{},"'Synchrun'",[433,3038],{"src":3039,"alt":3040,"style":2781},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-install-synchrun-plugin.webp","Cài đặt plugin Synchrun trong Obsidian",[430,3042,3043,3044,3046,3047,3050,3051,3054,3055,3058,3059,461],{},"Sau khi cài đặt xong ",[441,3045,3036],{},", vào phần cài đặt của plugin này, kích hoạt tùy chọn ",[441,3048,3049],{},"'Use a self-hosted server'",". Điền địa chỉ ",[495,3052,3053],{},"https:\u002F\u002Fsynch.pafor.me"," vào trường ",[441,3056,3057],{},"'Server URL'"," và nhấn ",[441,3060,3061],{},"'Save'",[433,3063],{"src":3064,"alt":3065,"style":3066},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-plugin-settings-self-hosted.webp","Cấu hình URL máy chủ tự host trong cài đặt plugin Synchrun","max-width: 525px; width: 100%; height: auto;",[430,3068,3069,3070,3073,3074,3077,3078,3080],{},"Nhấn nút ",[441,3071,3072],{},"'Sign in on this device'"," bên dưới mục ",[441,3075,3076],{},"'Account'",". Tiến hành đăng ký tài khoản (hãy sử dụng đúng email bạn đã khai báo trong danh sách ",[495,3079,2885],{},"), bạn sẽ được chuyển đến trang ủy quyền sau:",[433,3082],{"src":3083,"alt":3084,"style":3085},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-account-authorization-page.webp","Trang ủy quyền tài khoản cho Synchrun","max-width: 494px; width: 100%; height: auto;",[430,3087,3069,3088,899],{},[441,3089,3090],{},"'Allow Obsidian sign-in'",[433,3092],{"src":3093,"alt":3094,"style":3095},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-allow-obsidian-signin.webp","Cho phép đăng nhập Obsidian cho Synch","max-width: 498px; width: 100%; height: auto;",[430,3097,3069,3098,3101,3102,1377,3105],{},[441,3099,3100],{},"'Return to Obsidian'"," rồi click chọn ",[441,3103,3104],{},"'Create vault'",[433,3106],{"src":3107,"alt":3108,"style":3109},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-create-remote-vault.webp","Tạo một kho ghi chú từ xa mới trong Synchrun","max-width: 496px; width: 100%; height: auto;",[430,3111,3112],{},"Đặt tên cho vault và mật khẩu để tạo vault mới.",[433,3114],{"src":3115,"alt":3116,"style":3117},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-vault-password-setup.webp","Thiết lập mật khẩu an toàn cho kho ghi chú từ xa Obsidian","max-width: 500px; width: 100%; height: auto;",[430,3119,3120],{},"Quá trình đồng bộ hóa sẽ bắt đầu ngay lập tức và có thể mất một thời gian tùy theo dung lượng vault của bạn. Khi đồng bộ hoàn tất, dung lượng bộ nhớ đã sử dụng sẽ được hiển thị.",[433,3122],{"src":3123,"alt":3124,"style":3125},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-sync-completed-storage.webp","Đồng bộ Synchrun hoàn tất hiển thị tổng dung lượng đã sử dụng","max-width: 508px; width: 100%; height: auto;",[474,3127,3129],{"id":3128},"truy-cập-obsidian-qua-web-bằng-ignis","Truy cập Obsidian qua Web bằng Ignis",[430,3131,3132,3134],{},[441,3133,2688],{}," thay thế các Electron API của Obsidian bằng Web API, cho phép mã nguồn JavaScript của Obsidian chạy trực tiếp trên trình duyệt web tiêu chuẩn. Tất cả các file markdown và tài liệu đính kèm đều được lưu trực tiếp trên hệ thống file của máy chủ host.",[430,3136,3137,3138,575,3143,3148],{},"Tuy nhiên, do hạn chế của môi trường sandbox trình duyệt, một số tính năng hoặc plugin yêu cầu truy cập API của Node.js hoặc Electron sẽ không thể hoạt động. Vui lòng tham khảo các hướng dẫn về ",[444,3139,3142],{"href":3140,"rel":3141},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Flimitations\u002F",[448],"Hạn chế của Ignis",[444,3144,3147],{"href":3145,"rel":3146},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Fplugin-compatibility\u002F",[448],"Khả năng tương thích plugin"," để biết thêm chi tiết.",[889,3150,3152],{"id":3151},"cài-đặt-ignis","Cài đặt Ignis",[430,3154,3155,3156,3158,3159,3162,3163,3166],{},"Chúng ta sẽ cài đặt ",[441,3157,2688],{}," trên VPS bằng Docker và mount thư mục lưu trữ vào ",[495,3160,3161],{},".\u002Fvaults",". Thư mục này sau đó sẽ được đồng bộ hóa tự động bằng ",[441,3164,3165],{},"Synch CLI"," với vault từ xa mà chúng ta đã thiết lập ở phần trước.",[430,3168,3169,3170,3172,3173,461],{},"Vì ",[441,3171,2688],{}," không có sẵn hệ thống xác thực người dùng, chúng ta sẽ giấu nó an toàn đằng sau mạng riêng ảo ",[441,3174,3175],{},[444,3176,1731],{"href":363},[2167,3178,3180],{"id":3179},"tạo-bản-ghi-dns","Tạo Bản ghi DNS",[433,3182],{"src":3183,"alt":3184,"style":3185},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fcloudflare-dns-a-record-ignis.webp","Cấu hình bản ghi DNS A cho ứng dụng web Ignis trong Cloudflare","max-width: 552px; width: 100%; height: auto;",[2167,3187,2890],{"id":3188},"thêm-tên-miền-vào-caddyfile-1",[430,3190,3191,3192,3195,3196,899],{},"Thêm tên miền ",[495,3193,3194],{},"obsidian.pafor.me"," vào Caddyfile tương tự như cách làm với ",[495,3197,3198],{},"synch.pafor.me",[933,3200,3202],{"className":2913,"code":3201,"language":2915,"meta":425,"style":425},"{$OBSIDIAN_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:9898\n}\n",[495,3203,3204,3215,3219,3228],{"__ignoreMap":425},[941,3205,3206,3208,3211,3213],{"class":943,"line":944},[941,3207,2943],{"class":955},[941,3209,3210],{"class":951},"$OBSIDIAN_DOMAIN",[941,3212,2949],{"class":955},[941,3214,2952],{"class":955},[941,3216,3217],{"class":943,"line":1071},[941,3218,2957],{"class":951},[941,3220,3221,3223,3225],{"class":943,"line":1078},[941,3222,2962],{"class":951},[941,3224,899],{"class":955},[941,3226,3227],{"class":2967},"9898\n",[941,3229,3230],{"class":943,"line":1085},[941,3231,2930],{"class":955},[2167,3233,3235],{"id":3234},"khởi-chạy-ignis-bằng-docker","Khởi chạy Ignis bằng Docker",[430,3237,3238,3239,3242],{},"Lưu file cấu hình Docker Compose sau thành ",[495,3240,3241],{},"ignis-docker-compose.yml"," trên VPS:",[933,3244,3246],{"className":1351,"code":3245,"language":1353,"meta":425,"style":425},"services:\n  ignis:\n    image: nobbe\u002Fignis:latest\n    ports:\n      - \"9898:8080\"\n    environment:\n      # match these to your host user (run: id)\n      - PUID=1000\n      - PGID=1000\n      - WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n    volumes:\n      - .\u002Fvaults:\u002Fvaults\n      - .\u002Fdata:\u002Fapp\u002Fdata\n      - obsidian-app:\u002Fapp\u002Fobsidian-app\n    restart: unless-stopped\n\nvolumes:\n  obsidian-app:\n",[495,3247,3248,3255,3262,3272,3279,3292,3299,3304,3311,3318,3325,3332,3339,3346,3353,3364,3369,3377],{"__ignoreMap":425},[941,3249,3250,3253],{"class":943,"line":944},[941,3251,3252],{"class":1363},"services",[941,3254,1377],{"class":955},[941,3256,3257,3260],{"class":943,"line":1071},[941,3258,3259],{"class":1363},"  ignis",[941,3261,1377],{"class":955},[941,3263,3264,3267,3269],{"class":943,"line":1078},[941,3265,3266],{"class":1363},"    image",[941,3268,899],{"class":955},[941,3270,3271],{"class":1055}," nobbe\u002Fignis:latest\n",[941,3273,3274,3277],{"class":943,"line":1085},[941,3275,3276],{"class":1363},"    ports",[941,3278,1377],{"class":955},[941,3280,3281,3284,3287,3290],{"class":943,"line":1933},[941,3282,3283],{"class":955},"      -",[941,3285,3286],{"class":955}," \"",[941,3288,3289],{"class":1055},"9898:8080",[941,3291,1965],{"class":955},[941,3293,3294,3297],{"class":943,"line":1938},[941,3295,3296],{"class":1363},"    environment",[941,3298,1377],{"class":955},[941,3300,3301],{"class":943,"line":1944},[941,3302,3303],{"class":1081},"      # match these to your host user (run: id)\n",[941,3305,3306,3308],{"class":943,"line":2280},[941,3307,3283],{"class":955},[941,3309,3310],{"class":1055}," PUID=1000\n",[941,3312,3313,3315],{"class":943,"line":2291},[941,3314,3283],{"class":955},[941,3316,3317],{"class":1055}," PGID=1000\n",[941,3319,3320,3322],{"class":943,"line":2387},[941,3321,3283],{"class":955},[941,3323,3324],{"class":1055}," WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n",[941,3326,3327,3330],{"class":943,"line":2393},[941,3328,3329],{"class":1363},"    volumes",[941,3331,1377],{"class":955},[941,3333,3334,3336],{"class":943,"line":2399},[941,3335,3283],{"class":955},[941,3337,3338],{"class":1055}," .\u002Fvaults:\u002Fvaults\n",[941,3340,3341,3343],{"class":943,"line":2404},[941,3342,3283],{"class":955},[941,3344,3345],{"class":1055}," .\u002Fdata:\u002Fapp\u002Fdata\n",[941,3347,3348,3350],{"class":943,"line":1704},[941,3349,3283],{"class":955},[941,3351,3352],{"class":1055}," obsidian-app:\u002Fapp\u002Fobsidian-app\n",[941,3354,3356,3359,3361],{"class":943,"line":3355},15,[941,3357,3358],{"class":1363},"    restart",[941,3360,899],{"class":955},[941,3362,3363],{"class":1055}," unless-stopped\n",[941,3365,3367],{"class":943,"line":3366},16,[941,3368,1075],{"emptyLinePlaceholder":1074},[941,3370,3372,3375],{"class":943,"line":3371},17,[941,3373,3374],{"class":1363},"volumes",[941,3376,1377],{"class":955},[941,3378,3380,3383],{"class":943,"line":3379},18,[941,3381,3382],{"class":1363},"  obsidian-app",[941,3384,1377],{"class":955},[485,3386,3387,3398,3411],{},[488,3388,3389,3390,3393,3394,3397],{},"Sử dụng cổng ",[495,3391,3392],{},"9898"," trên máy chủ host vì cổng ",[495,3395,3396],{},"8080"," rất dễ bị trùng lặp với các dịch vụ khác.",[488,3399,2995,3400,3403,3404,575,3407,3410],{},[495,3401,3402],{},"id"," trên VPS để lấy thông số ",[495,3405,3406],{},"UID",[495,3408,3409],{},"GID"," của user trên máy chủ nhằm đảm bảo phân quyền ghi đọc chính xác.",[488,3412,3413,3414,3417],{},"Đặt ",[495,3415,3416],{},"WS_ORIGINS"," chỉ cho phép kết nối WebSocket từ đúng tên miền của bạn để tăng độ bảo mật.",[430,3419,3420,3421,899],{},"Khởi chạy container ",[441,3422,2688],{},[933,3424,3426],{"className":1042,"code":3425,"language":1044,"meta":425,"style":425},"docker compose -f ignis-docker-compose.yml up -d\n",[495,3427,3428],{"__ignoreMap":425},[941,3429,3430,3432,3434,3437,3440,3442],{"class":943,"line":944},[941,3431,1185],{"class":1051},[941,3433,1188],{"class":1055},[941,3435,3436],{"class":1055}," -f",[941,3438,3439],{"class":1055}," ignis-docker-compose.yml",[941,3441,2989],{"class":1055},[941,3443,2992],{"class":1055},[430,3445,3446,3447,3450,3451,3454],{},"Khi bạn truy cập tên miền của mình trên trình duyệt web, giao diện ",[441,3448,3449],{},"'Vault Manager'"," sẽ hiện ra. Thư mục này hiện tại trống vì chưa có vault nào được liên kết. Ở phần tiếp theo, chúng ta sẽ cấu hình ",[441,3452,3453],{},"'Synch CLI'"," để đồng bộ dữ liệu từ vault từ xa về máy chủ.",[433,3456],{"src":3457,"alt":3458,"style":3459},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-vault-manager-empty.webp","Giao diện Vault Manager trống trong ứng dụng web Ignis","max-width: 466px; width: 100%; height: auto;",[2167,3461,3463],{"id":3462},"giải-quyết-vấn-đề-firewall-của-docker","Giải quyết Vấn đề Firewall của Docker",[430,3465,3466,3467,3470,3471,899],{},"Mặc định, Docker tự động chèn các quy tắc DNAT và FORWARD của riêng nó vào iptables, chuyển tiếp trực tiếp lưu lượng truy cập từ internet công cộng vào các cổng container đang hoạt động. Điều này bỏ qua hoàn toàn chuỗi bảo vệ ",[495,3468,3469],{},"INPUT"," thông thường của UFW hoặc iptables trên Ubuntu. Để chặn lưu lượng truy cập công cộng và giữ cho các container hoàn toàn riêng tư, hãy thêm các quy tắc sau vào ",[495,3472,3473],{},"iptables",[933,3475,3477],{"className":1042,"code":3476,"language":1044,"meta":425,"style":425},"# Chặn toàn bộ lưu lượng truy cập bên ngoài\nsudo iptables -I DOCKER-USER -i ext_if -j DROP \n\n# Chỉ cho phép lưu lượng truy cập từ địa chỉ IP riêng của client Cloudflare WARP\nsudo iptables -I DOCKER-USER -i ext_if -s 100.96.0.10 -j ACCEPT\n",[495,3478,3479,3484,3511,3515,3520],{"__ignoreMap":425},[941,3480,3481],{"class":943,"line":944},[941,3482,3483],{"class":1081},"# Chặn toàn bộ lưu lượng truy cập bên ngoài\n",[941,3485,3486,3488,3491,3494,3497,3500,3503,3506,3509],{"class":943,"line":1071},[941,3487,1901],{"class":1051},[941,3489,3490],{"class":1055}," iptables",[941,3492,3493],{"class":1055}," -I",[941,3495,3496],{"class":1055}," DOCKER-USER",[941,3498,3499],{"class":1055}," -i",[941,3501,3502],{"class":1055}," ext_if",[941,3504,3505],{"class":1055}," -j",[941,3507,3508],{"class":1055}," DROP",[941,3510,2034],{"class":951},[941,3512,3513],{"class":943,"line":1078},[941,3514,1075],{"emptyLinePlaceholder":1074},[941,3516,3517],{"class":943,"line":1085},[941,3518,3519],{"class":1081},"# Chỉ cho phép lưu lượng truy cập từ địa chỉ IP riêng của client Cloudflare WARP\n",[941,3521,3522,3524,3526,3528,3530,3532,3534,3537,3540,3542],{"class":943,"line":1933},[941,3523,1901],{"class":1051},[941,3525,3490],{"class":1055},[941,3527,3493],{"class":1055},[941,3529,3496],{"class":1055},[941,3531,3499],{"class":1055},[941,3533,3502],{"class":1055},[941,3535,3536],{"class":1055}," -s",[941,3538,3539],{"class":2967}," 100.96.0.10",[941,3541,3505],{"class":1055},[941,3543,3544],{"class":1055}," ACCEPT\n",[2167,3546,3548],{"id":3547},"cấu-hình-synch-cli","Cấu hình Synch CLI",[430,3550,3551,3553],{},[441,3552,3165],{}," là công cụ dòng lệnh chạy headless (không giao diện), cho phép bạn đồng bộ hóa dữ liệu vault trực tiếp trên các máy chủ từ xa mà không cần cài đặt ứng dụng Obsidian hoàn chỉnh.",[430,3555,3556,3557,3559,3560,3563,3564,3567,3568,3571,3572,753,3575,753,3578,3581,3582,3585,3586,931],{},"Build ",[441,3558,3165],{}," từ mã nguồn repository ",[495,3561,3562],{},"synch"," bạn đã clone. Quá trình build yêu cầu ",[441,3565,3566],{},"Node.js >= 22.5"," (vì CLI sử dụng thư viện ",[495,3569,3570],{},"node:sqlite"," và các API trình duyệt toàn cầu như ",[495,3573,3574],{},"fetch",[495,3576,3577],{},"WebSocket",[495,3579,3580],{},"WebCrypto",") và trình quản lý gói ",[441,3583,3584],{},"pnpm"," (repo là một pnpm workspace, sử dụng phiên bản ",[495,3587,3588],{},"pnpm@10.33.0",[933,3590,3592],{"className":1042,"code":3591,"language":1044,"meta":425,"style":425},"# Check versions\nnode --version   # must be >= 22.5\npnpm --version\n\n# In the repos root\npnpm install\n\n# Build the CLI bundle\npnpm -C apps\u002Fcli build\n\n# After a successful build you have `apps\u002Fcli\u002Fdist\u002Fsynch.js`. Make it executable and put it on your PATH\nchmod +x apps\u002Fcli\u002Fdist\u002Fsynch.js\nln -sf \"$PWD\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js\" \"$HOME\u002F.local\u002Fbin\u002Fsynch\"\n\n# Verification\nsynch --help\n",[495,3593,3594,3599,3610,3617,3621,3626,3633,3637,3642,3655,3659,3664,3675,3704,3708,3713],{"__ignoreMap":425},[941,3595,3596],{"class":943,"line":944},[941,3597,3598],{"class":1081},"# Check versions\n",[941,3600,3601,3604,3607],{"class":943,"line":1071},[941,3602,3603],{"class":1051},"node",[941,3605,3606],{"class":1055}," --version",[941,3608,3609],{"class":1081},"   # must be >= 22.5\n",[941,3611,3612,3614],{"class":943,"line":1078},[941,3613,3584],{"class":1051},[941,3615,3616],{"class":1055}," --version\n",[941,3618,3619],{"class":943,"line":1085},[941,3620,1075],{"emptyLinePlaceholder":1074},[941,3622,3623],{"class":943,"line":1933},[941,3624,3625],{"class":1081},"# In the repos root\n",[941,3627,3628,3630],{"class":943,"line":1938},[941,3629,3584],{"class":1051},[941,3631,3632],{"class":1055}," install\n",[941,3634,3635],{"class":943,"line":1944},[941,3636,1075],{"emptyLinePlaceholder":1074},[941,3638,3639],{"class":943,"line":2280},[941,3640,3641],{"class":1081},"# Build the CLI bundle\n",[941,3643,3644,3646,3649,3652],{"class":943,"line":2291},[941,3645,3584],{"class":1051},[941,3647,3648],{"class":1055}," -C",[941,3650,3651],{"class":1055}," apps\u002Fcli",[941,3653,3654],{"class":1055}," build\n",[941,3656,3657],{"class":943,"line":2387},[941,3658,1075],{"emptyLinePlaceholder":1074},[941,3660,3661],{"class":943,"line":2393},[941,3662,3663],{"class":1081},"# After a successful build you have `apps\u002Fcli\u002Fdist\u002Fsynch.js`. Make it executable and put it on your PATH\n",[941,3665,3666,3669,3672],{"class":943,"line":2399},[941,3667,3668],{"class":1051},"chmod",[941,3670,3671],{"class":1055}," +x",[941,3673,3674],{"class":1055}," apps\u002Fcli\u002Fdist\u002Fsynch.js\n",[941,3676,3677,3680,3683,3685,3688,3691,3694,3696,3699,3702],{"class":943,"line":2404},[941,3678,3679],{"class":1051},"ln",[941,3681,3682],{"class":1055}," -sf",[941,3684,3286],{"class":955},[941,3686,3687],{"class":951},"$PWD",[941,3689,3690],{"class":1055},"\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js",[941,3692,3693],{"class":955},"\"",[941,3695,3286],{"class":955},[941,3697,3698],{"class":951},"$HOME",[941,3700,3701],{"class":1055},"\u002F.local\u002Fbin\u002Fsynch",[941,3703,1965],{"class":955},[941,3705,3706],{"class":943,"line":1704},[941,3707,1075],{"emptyLinePlaceholder":1074},[941,3709,3710],{"class":943,"line":3355},[941,3711,3712],{"class":1081},"# Verification\n",[941,3714,3715,3717],{"class":943,"line":3366},[941,3716,3562],{"class":1051},[941,3718,3719],{"class":1055}," --help\n",[430,3721,3722,3723,3726],{},"Vì Synch CLI đang chạy trên cùng một máy chủ VPS với máy chủ lưu trữ Synch, nó có thể tự động kết nối trực tiếp với server API cục bộ. Nếu bạn cấu hình một server khác, hãy chạy lệnh ",[495,3724,3725],{},"synch login --api-url \u003Cremote-synch-api-url>"," để chỉ định máy chủ API đích.",[430,3728,3729],{},[433,3730],{"alt":3731,"src":3732},"Chạy lệnh synch login với URL API tùy chỉnh trong terminal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-api-url-terminal.webp",[430,3734,2995,3735,3738],{},[495,3736,3737],{},"synch login"," trong terminal của bạn, hệ thống sẽ trả về một đường link đăng nhập để xác thực:",[430,3740,3741],{},[433,3742],{"alt":3743,"src":3744},"Đầu ra terminal hiển thị URL xác thực cho Synch CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-auth-url-terminal.webp",[430,3746,3747],{},"Đăng nhập thông qua trình duyệt bằng tài khoản email trùng với tài khoản bạn đang sử dụng trên ứng dụng Obsidian desktop.",[430,3749,3750],{},[433,3751],{"alt":3752,"src":3753},"Đăng nhập web thành công để ủy quyền Synch CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-web-login-success.webp",[430,3755,2995,3756,3759],{},[495,3757,3758],{},"synch vault connect --vault ~\u002Fvaults\u002F\u003Cvaultname> --vault-id asadqe-7b29-4677-fsad-234asdafasd"," để liên kết thư mục vault cục bộ trên VPS với vault từ xa trên server của bạn.",[430,3761,3762,3763,3766,3767,3770,3771,931],{},"ID của vault từ xa có thể được tìm thấy bằng cách vào plugin ",[441,3764,3765],{},"Synchrun"," trên máy tính và nhấn ",[441,3768,3769],{},"'Manage remote vaults'",". Hệ thống sẽ mở một trang web hiển thị danh sách các vault từ xa của bạn, mỗi vault đi kèm với một dãy GUID duy nhất (ví dụ: ",[495,3772,3773],{},"123e4567-e89b-12d3-a456-426614174000",[430,3775,3776,3781],{},[433,3777],{"src":3778,"alt":3779,"style":3780},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-manage-remote-vaults.webp","Quản lý kho ghi chú từ xa trong plugin Synchrun","max-width: 582px; width: 100%; height: auto;",[433,3782],{"alt":3783,"src":3784},"Định vị ID kho ghi chú từ xa duy nhất trong Synchrun","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-remote-vault-id.webp",[430,3786,3787,3788,3791],{},"Nhập mật khẩu vault khi được yêu cầu để hoàn tất liên kết. Sau khi kết nối thành công, chạy lệnh ",[495,3789,3790],{},"synch sync --vault ~\u002Fvaults\u002F\u003Cvault-name>"," to bắt đầu đồng bộ lần đầu tiên. Quá trình này có thể mất một thời gian tùy theo lượng file ghi chú của bạn.",[430,3793,3794],{},[433,3795],{"alt":3796,"src":3797},"Tiến trình đồng bộ kho ghi chú ban đầu trong Synch CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-cli-initial-sync-progress.webp",[430,3799,3800,3801,3804],{},"Để tự động hóa hoàn toàn việc này, hãy tạo và kích hoạt một dịch vụ systemd chạy lệnh ",[495,3802,3803],{},"synch watch"," liên tục trong nền, giúp đồng bộ hóa ghi chú ngay lập tức khi máy chủ khởi động:",[933,3806,3808],{"className":1042,"code":3807,"language":1044,"meta":425,"style":425},"sudo tee \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service \u003C\u003C'EOF'\n[Unit]\nDescription=Synch vault watcher\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nUser=\u003Cusername>\nExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\nWorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\nEnvironment=\"PATH=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin:\u002Fhome\u002F\u003Cusername>\u002F.cargo\u002Fbin:\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fbin\"\nEnvironment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\nEOF\nsudo systemctl daemon-reload\nsudo systemctl enable --now synch-watch.service\n",[495,3809,3810,3826,3830,3835,3840,3845,3849,3853,3858,3863,3868,3873,3878,3883,3887,3892,3896,3900,3904,3910,3919],{"__ignoreMap":425},[941,3811,3812,3814,3817,3820,3823],{"class":943,"line":944},[941,3813,1901],{"class":1051},[941,3815,3816],{"class":1055}," tee",[941,3818,3819],{"class":1055}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service",[941,3821,3822],{"class":955}," \u003C\u003C",[941,3824,3825],{"class":955},"'EOF'\n",[941,3827,3828],{"class":943,"line":1071},[941,3829,2345],{"class":1055},[941,3831,3832],{"class":943,"line":1078},[941,3833,3834],{"class":1055},"Description=Synch vault watcher\n",[941,3836,3837],{"class":943,"line":1085},[941,3838,3839],{"class":1055},"After=network-online.target\n",[941,3841,3842],{"class":943,"line":1933},[941,3843,3844],{"class":1055},"Wants=network-online.target\n",[941,3846,3847],{"class":943,"line":1938},[941,3848,1075],{"emptyLinePlaceholder":1074},[941,3850,3851],{"class":943,"line":1944},[941,3852,2364],{"class":1055},[941,3854,3855],{"class":943,"line":2280},[941,3856,3857],{"class":1055},"Type=simple\n",[941,3859,3860],{"class":943,"line":2291},[941,3861,3862],{"class":1055},"User=\u003Cusername>\n",[941,3864,3865],{"class":943,"line":2387},[941,3866,3867],{"class":1055},"ExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\n",[941,3869,3870],{"class":943,"line":2393},[941,3871,3872],{"class":1055},"WorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\n",[941,3874,3875],{"class":943,"line":2399},[941,3876,3877],{"class":1055},"Environment=\"PATH=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin:\u002Fhome\u002F\u003Cusername>\u002F.cargo\u002Fbin:\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fbin\"\n",[941,3879,3880],{"class":943,"line":2404},[941,3881,3882],{"class":1055},"Environment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\n",[941,3884,3885],{"class":943,"line":1704},[941,3886,2384],{"class":1055},[941,3888,3889],{"class":943,"line":3355},[941,3890,3891],{"class":1055},"RestartSec=5\n",[941,3893,3894],{"class":943,"line":3366},[941,3895,1075],{"emptyLinePlaceholder":1074},[941,3897,3898],{"class":943,"line":3371},[941,3899,2407],{"class":1055},[941,3901,3902],{"class":943,"line":3379},[941,3903,2412],{"class":1055},[941,3905,3907],{"class":943,"line":3906},19,[941,3908,3909],{"class":955},"EOF\n",[941,3911,3913,3915,3917],{"class":943,"line":3912},20,[941,3914,1901],{"class":1051},[941,3916,1904],{"class":1055},[941,3918,2431],{"class":1055},[941,3920,3922,3924,3926,3928,3931],{"class":943,"line":3921},21,[941,3923,1901],{"class":1051},[941,3925,1904],{"class":1055},[941,3927,2031],{"class":1055},[941,3929,3930],{"class":1055}," --now",[941,3932,3933],{"class":1055}," synch-watch.service\n",[430,3935,3936,3937,3939],{},"Bây giờ, hãy mở tên miền ",[495,3938,3194],{}," trên trình duyệt. Bạn sẽ thấy giao diện sử dụng và bố cục layout gần như giống hệt với app Obsidian trên máy tính:",[433,3941],{"src":3942,"alt":3943,"style":3944},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-web-interface-desktop-view.webp","Giao diện web Ignis hiển thị kho ghi chú Obsidian trên màn hình máy tính","max-width: 593px; width: 100%; height: auto;",[430,3946,3947],{},"Bấm vào icon Cài đặt (Settings), bạn sẽ thấy hầu hết mọi cấu hình cốt lõi đều được giữ nguyên, chỉ có các community plugin là bạn cần cài đặt lại từ đầu:",[433,3949],{"src":3950,"alt":3951,"style":3952},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-settings-community-plugins.webp","Cài đặt plugin cộng đồng trong giao diện web Ignis","max-width: 597px; width: 100%; height: auto;",[430,3954,3955],{},"Để chạy thử nghiệm chu trình đồng bộ, bạn hãy thêm một ghi chú mới ngay trên trình duyệt:",[433,3957],{"src":3958,"alt":3959,"style":3952},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-create-new-note-web.webp","Tạo một ghi chú markdown mới thông qua giao diện web Ignis",[430,3961,3962,3963,461],{},"Ghi chú này sẽ ngay lập tức được đồng bộ ngược lại về ứng dụng Obsidian trên máy tính của bạn. Lưu ý rằng các thư mục trống sẽ không hiển thị trên giao diện của ",[441,3964,2688],{},[433,3966],{"src":3967,"alt":3968,"style":3969},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-desktop-synced-note.webp","Ghi chú mới tạo đã được đồng bộ thành công sang ứng dụng Obsidian máy tính","max-width: 502px; width: 100%; height: auto;",[430,3971,3972,3973,3975],{},"Giao diện hiển thị khi truy cập ",[495,3974,3194],{}," trên trình duyệt điện thoại di động:",[430,3977,3978,3983],{},[433,3979],{"src":3980,"alt":3981,"style":3982},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-sidebar.webp","Điều hướng thanh bên của ứng dụng web Ignis trên thiết bị di động","max-width: 269px; width: 100%; height: auto;",[433,3984],{"src":3985,"alt":3986,"style":3982},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-editor.webp","Trình chỉnh sửa ghi chú markdown của ứng dụng web Ignis trên thiết bị di động",[430,3988,3989,3990,3992,3993,3996],{},"Khi bạn xóa một ghi chú trên ",[441,3991,2688],{},", ghi chú đó sẽ được chuyển an toàn vào thư mục rác cục bộ ",[495,3994,3995],{},"~\u002Fvaults\u002F\u003Cvault-name>\u002F.trash"," để tránh mất mát dữ liệu ngoài ý muốn.",[474,3998,4000],{"id":3999},"lời-kết-cho-giải-pháp-tự-host-vault-obsidian","Lời kết cho giải pháp tự host Vault Obsidian",[430,4002,4003,4004,575,4006,4008,4009,4011],{},"Sự kết hợp giữa ",[441,4005,2679],{},[441,4007,2688],{}," giúp vault Obsidian của bạn luôn khả dụng trên mọi thiết bị, chạy hoàn toàn trên hạ tầng VPS do chính bạn kiểm soát. Việc đặt các dịch vụ này đằng sau mạng riêng ảo ",[441,4010,1731],{}," đem lại một hàng rào bảo mật tuyệt đối, ngăn chặn mọi nỗ lực xâm nhập từ internet công cộng.",[430,4013,4014,4015,4017],{},"Tất nhiên, ",[441,4016,2688],{}," không được thiết kế để thay thế hoàn toàn ứng dụng Obsidian gốc trên máy tính. Nó đóng vai trò như một giải pháp cứu cánh tạm thời, giúp bạn đọc và sửa ghi chú nhanh chóng qua bất kỳ trình duyệt nào khi không mang theo máy tính cá nhân. Đối với việc soạn thảo tài liệu lâu dài hay quản lý vault chuyên sâu, ứng dụng gốc trên máy tính vẫn là lựa chọn đem lại trải nghiệm tốt nhất.",[430,4019,4020,4021,4023],{},"Do cơ chế mã hóa đầu cuối cực kỳ mạnh mẽ của Synch, mật khẩu vault từ xa của bạn phải đủ phức tạp để tránh bị tấn công brute-force. Việc ghi nhớ mật khẩu này là vô cùng quan trọng vì server không hề lưu trữ ",[441,4022,2750],{}," giải mã; nếu quên mật khẩu, dữ liệu ghi chú của bạn sẽ vĩnh viễn không thể khôi phục. Ngoài ra, hãy chú ý bảo mật VPS của bạn thật tốt cùng với các bản snapshot và backup định kỳ.",[430,4025,4026,4027,4029],{},"Mặc dù tính năng lưu lịch sử phiên bản đã mã hóa và khôi phục file đã xóa của ",[441,4028,2679],{}," bảo vệ bạn khỏi hầu hết rủi ro mất dữ liệu, việc lưu trữ thêm một bản backup độc lập của vault Obsidian ở một nơi khác vẫn luôn là điều cần thiết.",[474,4031,4033],{"id":4032},"references","References",[485,4035,4036,4043,4050],{},[488,4037,4038],{},[444,4039,4042],{"href":4040,"rel":4041},"https:\u002F\u002Fsynch.run\u002Fself-hosting-docker\u002F",[448],"Synch Deploy with Docker Compose",[488,4044,4045],{},[444,4046,4049],{"href":4047,"rel":4048},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fserver\u002Fdeploy\u002F",[448],"Ignis Deploy with Docker",[488,4051,4052],{},[444,4053,4056],{"href":4054,"rel":4055},"https:\u002F\u002Fsynch.run\u002Fblog\u002Fencryption-and-decryption\u002F",[448],"How does end-to-end encryption work in Synch?",[1648,4058,4059],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":425,"searchDepth":1071,"depth":1078,"links":4061},[4062,4071,4080,4081],{"id":2722,"depth":1071,"text":2723,"children":4063},[4064,4068],{"id":2764,"depth":1078,"text":2765,"children":4065},[4066,4067],{"id":2768,"depth":1085,"text":2769},{"id":2784,"depth":1085,"text":2785},{"id":3014,"depth":1078,"text":3015,"children":4069},[4070],{"id":3018,"depth":1085,"text":3019},{"id":3128,"depth":1071,"text":3129,"children":4072},[4073],{"id":3151,"depth":1078,"text":3152,"children":4074},[4075,4076,4077,4078,4079],{"id":3179,"depth":1085,"text":3180},{"id":3188,"depth":1085,"text":2890},{"id":3234,"depth":1085,"text":3235},{"id":3462,"depth":1085,"text":3463},{"id":3547,"depth":1085,"text":3548},{"id":3999,"depth":1071,"text":4000},{"id":4032,"depth":1071,"text":4033},[4083],"productivity","2026-09-15","Học cách đồng bộ hóa an toàn vault Obsidian qua các thiết bị bằng cách tự host Synch và Ignis trong mạng riêng Cloudflare Zero Trust cực kỳ bảo mật.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002FVI-Sync-Obsidian-Across-Devices.webp","Sơ đồ kiến trúc đồng bộ hóa an toàn các vault Obsidian giữa nhiều thiết bị sử dụng Synch tự host và Ignis trong mạng Cloudflare Zero Trust bảo mật",{"schemaOrg":4089,"robots":1702,"sitemap":4093},[4090,4092],{"@type":4091,"headline":2661,"description":4085,"image":4086},"Article",{"@type":1681,"name":2661,"description":4085,"image":4086},{"lastmod":4094},"2026-09-16",{"title":4096,"description":4085,"ogTitle":2661,"ogDescription":4085,"twitterTitle":2661,"twitterDescription":4085},"Đồng bộ Obsidian tự host an toàn với Synch và Ignis","vi\u002Farticle\u002Fsync-obsidian-across-devices",[4099,4100,4101,2655],"Self-hosting","Obsidian","Đồng bộ","384lhiI8EJgp7zpAfkzfVEbp3fnozc75rkPBSiIpG_M",{"id":4104,"title":455,"author":425,"body":4105,"category":6238,"date":6239,"description":465,"extension":1673,"image":466,"imageAlt":467,"isPublished":1074,"meta":6240,"minRead":3921,"navigation":1074,"path":297,"seo":6262,"stem":6264,"tags":6265,"updatedAt":1711,"__hash__":6269},"article\u002Fvi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md",{"type":427,"value":4106,"toc":6208},[4107,4110,4116,4121,4125,4128,4166,4170,4176,4214,4218,4222,4236,4242,4246,4250,4254,4268,4274,4324,4350,4354,4361,4367,4371,4374,4584,4588,4628,4634,4641,4649,4697,4703,4731,4735,4739,4766,4792,4797,4839,4848,5119,5123,5166,5171,5178,5182,5186,5210,5213,5219,5225,5229,5237,5243,5246,5252,5258,5282,5289,5295,5298,5304,5308,5311,5314,5317,5323,5326,5332,5338,5344,5349,5353,5364,5371,5377,5380,5386,5390,5397,5403,5409,5413,5421,5485,5494,5549,5552,5622,5628,5642,5648,5652,5697,5703,5706,5712,5715,5721,5725,5741,5757,5763,5860,5863,5869,5880,5926,5933,5939,5951,5967,5970,5976,5980,5987,6009,6018,6116,6128,6134,6141,6147,6150,6156,6159,6165,6169,6172,6175,6205],[430,4108,4109],{},"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.",[430,4111,4112],{},[433,4113],{"alt":4114,"src":4115},"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",[430,4117,4118,4120],{},[441,4119,1112],{},", 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.",[474,4122,4124],{"id":4123},"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",[430,4126,4127],{},"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:",[485,4129,4130,4136,4142,4148,4154,4160],{},[488,4131,4132,4135],{},[441,4133,4134],{},"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.",[488,4137,4138,4141],{},[441,4139,4140],{},"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.",[488,4143,4144,4147],{},[441,4145,4146],{},"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ý.",[488,4149,4150,4153],{},[441,4151,4152],{},"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).",[488,4155,4156,4159],{},[441,4157,4158],{},"Ủ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.",[488,4161,4162,4165],{},[441,4163,4164],{},"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.",[474,4167,4169],{"id":4168},"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",[430,4171,4172],{},[433,4173],{"alt":4174,"src":4175},"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",[485,4177,4178,4184,4190,4196,4202,4208],{},[488,4179,4180,4183],{},[441,4181,4182],{},"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.",[488,4185,4186,4189],{},[441,4187,4188],{},"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ủ.",[488,4191,4192,4195],{},[441,4193,4194],{},"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).",[488,4197,4198,4201],{},[441,4199,4200],{},"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.",[488,4203,4204,4207],{},[441,4205,4206],{},"Ứ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.",[488,4209,4210,4213],{},[441,4211,4212],{},"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.",[474,4215,4217],{"id":4216},"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",[889,4219,4221],{"id":4220},"_0-điều-kiện-tiên-quyết","0. Điều kiện tiên quyết",[485,4223,4224,4227,4230,4233],{},[488,4225,4226],{},"Một máy chủ Linux VPS",[488,4228,4229],{},"Tên miền đã trỏ về địa chỉ IP máy chủ của bạn",[488,4231,4232],{},"Docker và Docker Compose plugin",[488,4234,4235],{},"Tài khoản Cloudflare (gói dịch vụ miễn phí)",[430,4237,4238,4239,4241],{},"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 ",[444,4240,1715],{"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.",[463,4243],{"description":4244,"image":2615,"image-alt":4245,"label":2717,"min-read":2718,"title":1715,"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",[889,4247,4249],{"id":4248},"_1-cloudflare-dns-và-api-token","1. Cloudflare DNS và API Token",[2167,4251,4253],{"id":4252},"tạo-cloudflare-api-token","Tạo Cloudflare API Token",[533,4255,4256,4262],{},[488,4257,4258,4259,461],{},"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 ",[441,4260,4261],{},"Profile",[488,4263,4264,4265,461],{},"Nhấp vào mục ",[441,4266,4267],{},"API Tokens",[430,4269,4270],{},[433,4271],{"alt":4272,"src":4273},"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",[533,4275,4276,4282,4288,4308,4314,4318,4321],{"start":1078},[488,4277,4278,4279,461],{},"Nhấp vào nút ",[441,4280,4281],{},"Create Token",[488,4283,4284,4285,461],{},"Chọn sử dụng mẫu ",[441,4286,4287],{},"Edit zone DNS",[488,4289,4290,4291],{},"Cấu hình các thông số cho mẫu như sau:\n",[485,4292,4293,4299],{},[488,4294,4295,4298],{},[441,4296,4297],{},"Permissions",": Zone — DNS — Edit",[488,4300,4301,4304,4305],{},[441,4302,4303],{},"Zone Resources",": Include — Specific zone — ",[495,4306,4307],{},"example.com",[488,4309,4310,4311,461],{},"Nhấp chọn ",[441,4312,4313],{},"Continue to summary",[488,4315,4310,4316,461],{},[441,4317,4281],{},[488,4319,4320],{},"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.",[488,4322,4323],{},"Kiểm tra xem mã thông báo vừa tạo có hoạt động hay không bằng terminal:",[933,4325,4327],{"className":1042,"code":4326,"language":1044,"meta":425,"style":425},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[495,4328,4329],{"__ignoreMap":425},[941,4330,4331,4333,4335,4338,4340,4343,4345,4348],{"class":943,"line":944},[941,4332,2998],{"class":1051},[941,4334,3286],{"class":955},[941,4336,4337],{"class":1055},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[941,4339,3693],{"class":955},[941,4341,4342],{"class":1055}," -H",[941,4344,3286],{"class":955},[941,4346,4347],{"class":1055},"Authorization: Bearer YOUR_TOKEN_HERE",[941,4349,1965],{"class":955},[2167,4351,4353],{"id":4352},"bản-ghi-dns","Bản ghi DNS",[485,4355,4356],{},[488,4357,4358,4359,461],{},"Tạo một bản ghi A mới và thiết lập ở trạng thái ",[441,4360,2775],{},[430,4362,4363],{},[433,4364],{"alt":4365,"src":4366},"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",[889,4368,4370],{"id":4369},"_2-cài-đặt-docker-trên-ubuntu","2. Cài đặt Docker trên Ubuntu",[430,4372,4373],{},"Chạy các lệnh sau trực tiếp trên Ubuntu để thực hiện cài đặt Docker:",[933,4375,4377],{"className":1042,"code":4376,"language":1044,"meta":425,"style":425},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Start automatically when the system boots\nsudo systemctl enable docker\n\n# Verify docker is installed\ndocker --version\n\nsudo apt install -y docker-compose-plugin\n\n# Verify the compose plugin is installed\ndocker compose version\n\n",[495,4378,4379,4384,4412,4416,4421,4463,4467,4472,4482,4486,4491,4512,4516,4521,4532,4536,4541,4547,4551,4565,4569,4574],{"__ignoreMap":425},[941,4380,4381],{"class":943,"line":944},[941,4382,4383],{"class":1081},"# Add Docker's official GPG key and set up the Docker repository\n",[941,4385,4386,4388,4391,4394,4397,4400,4403,4406,4409],{"class":943,"line":1071},[941,4387,2998],{"class":1051},[941,4389,4390],{"class":1055}," -fsSL",[941,4392,4393],{"class":1055}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[941,4395,4396],{"class":955}," |",[941,4398,4399],{"class":1051}," sudo",[941,4401,4402],{"class":1055}," gpg",[941,4404,4405],{"class":1055}," --dearmor",[941,4407,4408],{"class":1055}," -o",[941,4410,4411],{"class":1055}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[941,4413,4414],{"class":943,"line":1078},[941,4415,1075],{"emptyLinePlaceholder":1074},[941,4417,4418],{"class":943,"line":1085},[941,4419,4420],{"class":1081},"# Add the official Docker repository\n",[941,4422,4423,4426,4428,4431,4434,4437,4440,4443,4446,4448,4450,4452,4454,4457,4460],{"class":943,"line":1933},[941,4424,4425],{"class":972},"echo",[941,4427,3286],{"class":955},[941,4429,4430],{"class":1055},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[941,4432,4433],{"class":955},"$(",[941,4435,4436],{"class":1051},"lsb_release",[941,4438,4439],{"class":1055}," -cs",[941,4441,4442],{"class":955},")",[941,4444,4445],{"class":1055}," stable",[941,4447,3693],{"class":955},[941,4449,4396],{"class":955},[941,4451,4399],{"class":1051},[941,4453,3816],{"class":1055},[941,4455,4456],{"class":1055}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[941,4458,4459],{"class":955}," >",[941,4461,4462],{"class":1055}," \u002Fdev\u002Fnull\n",[941,4464,4465],{"class":943,"line":1938},[941,4466,1075],{"emptyLinePlaceholder":1074},[941,4468,4469],{"class":943,"line":1944},[941,4470,4471],{"class":1081},"# Update package list\n",[941,4473,4474,4476,4479],{"class":943,"line":2280},[941,4475,1901],{"class":1051},[941,4477,4478],{"class":1055}," apt",[941,4480,4481],{"class":1055}," update\n",[941,4483,4484],{"class":943,"line":2291},[941,4485,1075],{"emptyLinePlaceholder":1074},[941,4487,4488],{"class":943,"line":2387},[941,4489,4490],{"class":1081},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[941,4492,4493,4495,4497,4500,4503,4506,4509],{"class":943,"line":2393},[941,4494,1901],{"class":1051},[941,4496,4478],{"class":1055},[941,4498,4499],{"class":1055}," install",[941,4501,4502],{"class":1055}," docker-ce",[941,4504,4505],{"class":1055}," docker-ce-cli",[941,4507,4508],{"class":1055}," containerd.io",[941,4510,4511],{"class":1055}," -y\n",[941,4513,4514],{"class":943,"line":2399},[941,4515,1075],{"emptyLinePlaceholder":1074},[941,4517,4518],{"class":943,"line":2404},[941,4519,4520],{"class":1081},"# Start automatically when the system boots\n",[941,4522,4523,4525,4527,4529],{"class":943,"line":1704},[941,4524,1901],{"class":1051},[941,4526,1904],{"class":1055},[941,4528,2031],{"class":1055},[941,4530,4531],{"class":1055}," docker\n",[941,4533,4534],{"class":943,"line":3355},[941,4535,1075],{"emptyLinePlaceholder":1074},[941,4537,4538],{"class":943,"line":3366},[941,4539,4540],{"class":1081},"# Verify docker is installed\n",[941,4542,4543,4545],{"class":943,"line":3371},[941,4544,1185],{"class":1051},[941,4546,3616],{"class":1055},[941,4548,4549],{"class":943,"line":3379},[941,4550,1075],{"emptyLinePlaceholder":1074},[941,4552,4553,4555,4557,4559,4562],{"class":943,"line":3906},[941,4554,1901],{"class":1051},[941,4556,4478],{"class":1055},[941,4558,4499],{"class":1055},[941,4560,4561],{"class":1055}," -y",[941,4563,4564],{"class":1055}," docker-compose-plugin\n",[941,4566,4567],{"class":943,"line":3912},[941,4568,1075],{"emptyLinePlaceholder":1074},[941,4570,4571],{"class":943,"line":3921},[941,4572,4573],{"class":1081},"# Verify the compose plugin is installed\n",[941,4575,4577,4579,4581],{"class":943,"line":4576},22,[941,4578,1185],{"class":1051},[941,4580,1188],{"class":1055},[941,4582,4583],{"class":1055}," version\n",[889,4585,4587],{"id":4586},"_3-tải-mã-nguồn-clone-và-cấu-hình","3. Tải mã nguồn (Clone) và cấu hình",[933,4589,4591],{"className":1042,"code":4590,"language":1044,"meta":425,"style":425},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[495,4592,4593,4602,4606,4613,4621],{"__ignoreMap":425},[941,4594,4595,4597,4599],{"class":943,"line":944},[941,4596,2800],{"class":1051},[941,4598,2803],{"class":1055},[941,4600,4601],{"class":1055}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[941,4603,4604],{"class":943,"line":1071},[941,4605,1075],{"emptyLinePlaceholder":1074},[941,4607,4608,4610],{"class":943,"line":1078},[941,4609,2824],{"class":972},[941,4611,4612],{"class":1055}," buzz\u002Fdeploy\u002Fcompose\n",[941,4614,4615,4617,4619],{"class":943,"line":1085},[941,4616,2841],{"class":1051},[941,4618,2844],{"class":1055},[941,4620,2847],{"class":1055},[941,4622,4623,4626],{"class":943,"line":1933},[941,4624,4625],{"class":1051},"nano",[941,4627,2847],{"class":1055},[430,4629,4630,4631,4633],{},"Chỉnh sửa tệp cấu hình ",[495,4632,2854],{}," theo từng nhóm thông số:",[485,4635,4636],{},[488,4637,4638],{},[441,4639,4640],{},"Cấu hình Domain:",[933,4642,4647],{"className":4643,"code":4645,"language":4646},[4644],"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",[495,4648,4645],{"__ignoreMap":425},[485,4650,4651,4661],{},[488,4652,4653,4656,4657,4660],{},[441,4654,4655],{},"Khóa chủ sở hữu:"," ",[495,4658,4659],{},"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.",[488,4662,4663,4666],{},[441,4664,4665],{},"Khóa bí mật (Secrets):",[485,4667,4668,4678,4691],{},[488,4669,4670,4671,4674,4675,4677],{},"Tạo các khóa bí mật bằng cách sử dụng ",[444,4672,4673],{"href":2874},"công cụ trực tuyến"," này hoặc chạy lệnh ",[495,4676,2879],{}," (thực hiện bảy lần).",[488,4679,4680,4681,579,4684,753,4687,4690],{},"Thay thế mọi chỗ trống ",[495,4682,4683],{},"CHANGE_ME",[495,4685,4686],{},"BUZZ_RELAY_PRIVATE_KEY",[495,4688,4689],{},"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.",[488,4692,4693,4694,461],{},"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 ",[495,4695,4696],{},"grep CHANGE_ME .env",[933,4698,4701],{"className":4699,"code":4700,"language":4646},[4644],"    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",[495,4702,4700],{"__ignoreMap":425},[485,4704,4705],{},[488,4706,4707,4710],{},[441,4708,4709],{},"Cấu hình khác:",[485,4711,4712,4718],{},[488,4713,2906,4714,4717],{},[495,4715,4716],{},"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.",[488,4719,4720,4721,753,4723,4726,4727,4730],{},"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 ",[495,4722,4659],{},[495,4724,4725],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",", và ",[495,4728,4729],{},"BUZZ_REQUIRE_AUTH_TOKEN=true"," để tăng tính bảo mật.",[889,4732,4734],{"id":4733},"_4-kích-hoạt-https-với-caddy","4. Kích hoạt HTTPS với Caddy",[2167,4736,4738],{"id":4737},"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",[485,4740,4741,4752,4763],{},[488,4742,4743,4744,4747,4748,4751],{},"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 ",[495,4745,4746],{},"_acme-challenge.buzz.pafor.me"," lên ",[441,4749,4750],{},"DNS công khai",";",[488,4753,4754,4755,4758,4759,4762],{},"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à ",[495,4756,4757],{},"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 ",[495,4760,4761],{},"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.",[488,4764,4765],{},"Thêm cấu hình sau vào tệp Caddyfile:",[933,4767,4769],{"className":1351,"code":4768,"language":1353,"meta":425,"style":425},"{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n",[495,4770,4771,4775,4788],{"__ignoreMap":425},[941,4772,4773],{"class":943,"line":944},[941,4774,2922],{"class":955},[941,4776,4777,4780,4783,4786],{"class":943,"line":1071},[941,4778,4779],{"class":1055},"  acme_dns cloudflare",[941,4781,4782],{"class":955}," {",[941,4784,4785],{"class":1055},"env.CLOUDFLARE_API_TOKEN",[941,4787,2930],{"class":955},[941,4789,4790],{"class":943,"line":1078},[941,4791,2930],{"class":955},[485,4793,4794],{},[488,4795,4796],{},"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:",[933,4798,4800],{"className":1351,"code":4799,"language":1353,"meta":425,"style":425},"FROM caddy:2-builder AS builder\n\nRUN xcaddy build \\\n    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n\nFROM caddy:2-alpine\n\nCOPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[495,4801,4802,4807,4811,4816,4821,4825,4830,4834],{"__ignoreMap":425},[941,4803,4804],{"class":943,"line":944},[941,4805,4806],{"class":1055},"FROM caddy:2-builder AS builder\n",[941,4808,4809],{"class":943,"line":1071},[941,4810,1075],{"emptyLinePlaceholder":1074},[941,4812,4813],{"class":943,"line":1078},[941,4814,4815],{"class":1055},"RUN xcaddy build \\\n",[941,4817,4818],{"class":943,"line":1085},[941,4819,4820],{"class":1055},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[941,4822,4823],{"class":943,"line":1933},[941,4824,1075],{"emptyLinePlaceholder":1074},[941,4826,4827],{"class":943,"line":1938},[941,4828,4829],{"class":1055},"FROM caddy:2-alpine\n",[941,4831,4832],{"class":943,"line":1944},[941,4833,1075],{"emptyLinePlaceholder":1074},[941,4835,4836],{"class":943,"line":2280},[941,4837,4838],{"class":1055},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[485,4840,4841],{},[488,4842,4843,4844,4847],{},"Chỉnh sửa ",[495,4845,4846],{},"compose.caddy.yml"," để sử dụng image với mô-đun Cloudflare và gán API token của Cloudflare:",[933,4849,4851],{"className":1351,"code":4850,"language":1353,"meta":425,"style":425},"services:\n  relay:\n    ports: !reset []\n\n  caddy:\n    build:\n      context: .\n      dockerfile: Dockerfile.caddy\n    image: buzz-caddy:cloudflare\n    depends_on:\n      relay:\n        condition: service_healthy\n    environment:\n      BUZZ_DOMAIN: ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n    ports:\n      - \"${CADDY_HTTP_PORT:-80}:80\"\n      - \"${CADDY_HTTPS_PORT:-443}:443\"\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n      - buzz-caddy-data:\u002Fdata\n      - buzz-caddy-config:\u002Fconfig\n    restart: unless-stopped\n    networks:\n      - buzz-net\n\nvolumes:\n  buzz-caddy-data:\n    labels:\n      com.buzz.volume: caddy-data\n  buzz-caddy-config:\n    labels:\n      com.buzz.volume: caddy-config\n",[495,4852,4853,4859,4866,4878,4882,4889,4896,4906,4916,4925,4932,4939,4949,4955,4965,4975,4981,4992,5003,5009,5016,5023,5030,5039,5047,5055,5060,5067,5075,5083,5094,5102,5109],{"__ignoreMap":425},[941,4854,4855,4857],{"class":943,"line":944},[941,4856,3252],{"class":1363},[941,4858,1377],{"class":955},[941,4860,4861,4864],{"class":943,"line":1071},[941,4862,4863],{"class":1363},"  relay",[941,4865,1377],{"class":955},[941,4867,4868,4870,4872,4875],{"class":943,"line":1078},[941,4869,3276],{"class":1363},[941,4871,899],{"class":955},[941,4873,4874],{"class":947}," !reset",[941,4876,4877],{"class":955}," []\n",[941,4879,4880],{"class":943,"line":1085},[941,4881,1075],{"emptyLinePlaceholder":1074},[941,4883,4884,4887],{"class":943,"line":1933},[941,4885,4886],{"class":1363},"  caddy",[941,4888,1377],{"class":955},[941,4890,4891,4894],{"class":943,"line":1938},[941,4892,4893],{"class":1363},"    build",[941,4895,1377],{"class":955},[941,4897,4898,4901,4903],{"class":943,"line":1944},[941,4899,4900],{"class":1363},"      context",[941,4902,899],{"class":955},[941,4904,4905],{"class":2967}," .\n",[941,4907,4908,4911,4913],{"class":943,"line":2280},[941,4909,4910],{"class":1363},"      dockerfile",[941,4912,899],{"class":955},[941,4914,4915],{"class":1055}," Dockerfile.caddy\n",[941,4917,4918,4920,4922],{"class":943,"line":2291},[941,4919,3266],{"class":1363},[941,4921,899],{"class":955},[941,4923,4924],{"class":1055}," buzz-caddy:cloudflare\n",[941,4926,4927,4930],{"class":943,"line":2387},[941,4928,4929],{"class":1363},"    depends_on",[941,4931,1377],{"class":955},[941,4933,4934,4937],{"class":943,"line":2393},[941,4935,4936],{"class":1363},"      relay",[941,4938,1377],{"class":955},[941,4940,4941,4944,4946],{"class":943,"line":2399},[941,4942,4943],{"class":1363},"        condition",[941,4945,899],{"class":955},[941,4947,4948],{"class":1055}," service_healthy\n",[941,4950,4951,4953],{"class":943,"line":2404},[941,4952,3296],{"class":1363},[941,4954,1377],{"class":955},[941,4956,4957,4960,4962],{"class":943,"line":1704},[941,4958,4959],{"class":1363},"      BUZZ_DOMAIN",[941,4961,899],{"class":955},[941,4963,4964],{"class":1055}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[941,4966,4967,4970,4972],{"class":943,"line":3355},[941,4968,4969],{"class":1363},"      CLOUDFLARE_API_TOKEN",[941,4971,899],{"class":955},[941,4973,4974],{"class":1055}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[941,4976,4977,4979],{"class":943,"line":3366},[941,4978,3276],{"class":1363},[941,4980,1377],{"class":955},[941,4982,4983,4985,4987,4990],{"class":943,"line":3371},[941,4984,3283],{"class":955},[941,4986,3286],{"class":955},[941,4988,4989],{"class":1055},"${CADDY_HTTP_PORT:-80}:80",[941,4991,1965],{"class":955},[941,4993,4994,4996,4998,5001],{"class":943,"line":3379},[941,4995,3283],{"class":955},[941,4997,3286],{"class":955},[941,4999,5000],{"class":1055},"${CADDY_HTTPS_PORT:-443}:443",[941,5002,1965],{"class":955},[941,5004,5005,5007],{"class":943,"line":3906},[941,5006,3329],{"class":1363},[941,5008,1377],{"class":955},[941,5010,5011,5013],{"class":943,"line":3912},[941,5012,3283],{"class":955},[941,5014,5015],{"class":1055}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[941,5017,5018,5020],{"class":943,"line":3921},[941,5019,3283],{"class":955},[941,5021,5022],{"class":1055}," buzz-caddy-data:\u002Fdata\n",[941,5024,5025,5027],{"class":943,"line":4576},[941,5026,3283],{"class":955},[941,5028,5029],{"class":1055}," buzz-caddy-config:\u002Fconfig\n",[941,5031,5033,5035,5037],{"class":943,"line":5032},23,[941,5034,3358],{"class":1363},[941,5036,899],{"class":955},[941,5038,3363],{"class":1055},[941,5040,5042,5045],{"class":943,"line":5041},24,[941,5043,5044],{"class":1363},"    networks",[941,5046,1377],{"class":955},[941,5048,5050,5052],{"class":943,"line":5049},25,[941,5051,3283],{"class":955},[941,5053,5054],{"class":1055}," buzz-net\n",[941,5056,5058],{"class":943,"line":5057},26,[941,5059,1075],{"emptyLinePlaceholder":1074},[941,5061,5063,5065],{"class":943,"line":5062},27,[941,5064,3374],{"class":1363},[941,5066,1377],{"class":955},[941,5068,5070,5073],{"class":943,"line":5069},28,[941,5071,5072],{"class":1363},"  buzz-caddy-data",[941,5074,1377],{"class":955},[941,5076,5078,5081],{"class":943,"line":5077},29,[941,5079,5080],{"class":1363},"    labels",[941,5082,1377],{"class":955},[941,5084,5086,5089,5091],{"class":943,"line":5085},30,[941,5087,5088],{"class":1363},"      com.buzz.volume",[941,5090,899],{"class":955},[941,5092,5093],{"class":1055}," caddy-data\n",[941,5095,5097,5100],{"class":943,"line":5096},31,[941,5098,5099],{"class":1363},"  buzz-caddy-config",[941,5101,1377],{"class":955},[941,5103,5105,5107],{"class":943,"line":5104},32,[941,5106,5080],{"class":1363},[941,5108,1377],{"class":955},[941,5110,5112,5114,5116],{"class":943,"line":5111},33,[941,5113,5088],{"class":1363},[941,5115,899],{"class":955},[941,5117,5118],{"class":1055}," caddy-config\n",[2167,5120,5122],{"id":5121},"khởi-động-các-docker-container","Khởi động các Docker container",[933,5124,5126],{"className":1042,"code":5125,"language":1044,"meta":425,"style":425},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[495,5127,5128,5148,5152,5157],{"__ignoreMap":425},[941,5129,5130,5132,5134,5136,5139,5141,5144,5146],{"class":943,"line":944},[941,5131,1185],{"class":1051},[941,5133,1188],{"class":1055},[941,5135,3436],{"class":1055},[941,5137,5138],{"class":1055}," compose.yml",[941,5140,3436],{"class":1055},[941,5142,5143],{"class":1055}," compose.caddy.yml",[941,5145,2989],{"class":1055},[941,5147,2992],{"class":1055},[941,5149,5150],{"class":943,"line":1071},[941,5151,1075],{"emptyLinePlaceholder":1074},[941,5153,5154],{"class":943,"line":1078},[941,5155,5156],{"class":1081},"#Check the Docker status\n",[941,5158,5159,5161,5163],{"class":943,"line":1085},[941,5160,1185],{"class":1051},[941,5162,1188],{"class":1055},[941,5164,5165],{"class":1055}," ps\n",[433,5167],{"src":5168,"alt":5169,"style":5170},"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;",[430,5172,5173,5174,5177],{},"Mở trình duyệt web của bạn và truy cập ",[495,5175,5176],{},"http:\u002F\u002Fbuzz.pafor.me"," để kiểm tra xem relay đã hoạt động bình thường chưa.",[433,5179],{"src":5180,"alt":5181,"style":3117},"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ữ",[889,5183,5185],{"id":5184},"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",[933,5187,5189],{"className":1042,"code":5188,"language":1044,"meta":425,"style":425},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[495,5190,5191,5202],{"__ignoreMap":425},[941,5192,5193,5196,5199],{"class":943,"line":944},[941,5194,5195],{"class":1051},"mkdir",[941,5197,5198],{"class":1055}," -p",[941,5200,5201],{"class":1055}," \u002Fbuzz_backups\n",[941,5203,5204,5207],{"class":943,"line":1071},[941,5205,5206],{"class":1051},"crontab",[941,5208,5209],{"class":1055}," -e\n",[430,5211,5212],{},"Cài đặt cron job sao lưu cơ sở dữ liệu hàng đêm:",[933,5214,5217],{"className":5215,"code":5216,"language":4646},[4644],"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",[495,5218,5216],{"__ignoreMap":425},[430,5220,5221,5222,5224],{},"Lưu ý: Hãy coi ",[495,5223,4686],{}," 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.",[474,5226,5228],{"id":5227},"thiết-lập-buzz-desktop-client-và-danh-tính-nostr","Thiết lập Buzz Desktop Client và Danh tính Nostr",[430,5230,5231,5232,5236],{},"Tải ứng dụng khách Buzz cho máy tính từ ",[444,5233,5234],{"href":5234,"rel":5235},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[448]," 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\".",[430,5238,5239],{},[433,5240],{"alt":5241,"src":5242},"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",[430,5244,5245],{},"Nhấp vào \"Join a community\" và sao chép khóa công khai của bạn.",[430,5247,5248],{},[433,5249],{"alt":5250,"src":5251},"Ứ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",[430,5253,5254,5255,5257],{},"Chạy lệnh sau trên ",[441,5256,2700],{}," để tự thêm mình làm thành viên đầu tiên:",[933,5259,5261],{"className":1042,"code":5260,"language":1044,"meta":425,"style":425},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[495,5262,5263],{"__ignoreMap":425},[941,5264,5265,5267,5269,5271,5273,5275,5277,5279],{"class":943,"line":944},[941,5266,1185],{"class":1051},[941,5268,1188],{"class":1055},[941,5270,1191],{"class":1055},[941,5272,1194],{"class":1055},[941,5274,1197],{"class":1055},[941,5276,1200],{"class":1055},[941,5278,1203],{"class":1055},[941,5280,5281],{"class":1055}," npub1yourkeyhere\n",[430,5283,5284,5285,5288],{},"Nhập ",[495,5286,5287],{},"wss:\u002F\u002Fbuzz.pafor.me"," vào mục URL cộng đồng và nhấn \"Next\".",[430,5290,5291],{},[433,5292],{"alt":5293,"src":5294},"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",[430,5296,5297],{},"Nhập tên hiển thị và nhấn nút Next.",[430,5299,5300],{},[433,5301],{"alt":5302,"src":5303},"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",[889,5305,5307],{"id":5306},"kênh-channels-và-tác-nhân","Kênh (Channels) và Tác nhân",[430,5309,5310],{},"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.",[430,5312,5313],{},"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.",[430,5315,5316],{},"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",[430,5318,5319],{},[433,5320],{"alt":5321,"src":5322},"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",[430,5324,5325],{},"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",[430,5327,5328],{},[433,5329],{"alt":5330,"src":5331},"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",[430,5333,5334],{},[433,5335],{"alt":5336,"src":5337},"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",[430,5339,5340],{},[433,5341],{"alt":5342,"src":5343},"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",[433,5345],{"src":5346,"alt":5347,"style":5348},"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;",[889,5350,5352],{"id":5351},"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",[430,5354,5355,5356,5359,5360,5363],{},"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ư ",[495,5357,5358],{},"hermes-acp",") trong các thư mục chuẩn như ",[495,5361,5362],{},"~\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ó.",[430,5365,5366,5367,5370],{},"Đố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 ",[495,5368,5369],{},"~\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 đề:",[933,5372,5375],{"className":5373,"code":5374,"language":4646},[4644],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[495,5376,5374],{"__ignoreMap":425},[430,5378,5379],{},"Giờ đây, Kimi Code sẽ xuất hiện trong danh sách Runtimes của tác nhân.",[430,5381,5382],{},[433,5383],{"alt":5384,"src":5385},"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",[889,5387,5389],{"id":5388},"dự-án-và-kho-lưu-trữ","Dự án và Kho lưu trữ",[430,5391,5392,5393,5396],{},"Kích hoạt tính năng '",[441,5394,5395],{},"Projects","' trong Settings → Experiments trước tiên:",[430,5398,5399],{},[433,5400],{"alt":5401,"src":5402},"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",[430,5404,5405,5406,5408],{},"Hiện tại, dự án phải được tạo thông qua công cụ ",[495,5407,1215],{}," (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).",[2167,5410,5412],{"id":5411},"cài-đặt-buzz-cli","Cài đặt buzz-cli",[430,5414,5415,5416,5418,5419,899],{},"Chạy các lệnh sau để cài đặt ",[495,5417,1215],{}," trên máy chủ ",[441,5420,2700],{},[933,5422,5424],{"className":1042,"code":5423,"language":1044,"meta":425,"style":425},"sudo apt install cargo\ncd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-cli\necho 'export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"' >> ~\u002F.bashrc && source ~\u002F.bashrc\n",[495,5425,5426,5437,5444,5457],{"__ignoreMap":425},[941,5427,5428,5430,5432,5434],{"class":943,"line":944},[941,5429,1901],{"class":1051},[941,5431,4478],{"class":1055},[941,5433,4499],{"class":1055},[941,5435,5436],{"class":1055}," cargo\n",[941,5438,5439,5441],{"class":943,"line":1071},[941,5440,2824],{"class":972},[941,5442,5443],{"class":1055}," ~\u002Fbuzz\n",[941,5445,5446,5449,5451,5454],{"class":943,"line":1078},[941,5447,5448],{"class":1051},"cargo",[941,5450,4499],{"class":1055},[941,5452,5453],{"class":1055}," --path",[941,5455,5456],{"class":1055}," crates\u002Fbuzz-cli\n",[941,5458,5459,5461,5464,5467,5470,5473,5476,5479,5482],{"class":943,"line":1085},[941,5460,4425],{"class":972},[941,5462,5463],{"class":955}," '",[941,5465,5466],{"class":1055},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[941,5468,5469],{"class":955},"'",[941,5471,5472],{"class":955}," >>",[941,5474,5475],{"class":1055}," ~\u002F.bashrc",[941,5477,5478],{"class":955}," &&",[941,5480,5481],{"class":972}," source",[941,5483,5484],{"class":1055}," ~\u002F.bashrc\n",[430,5486,5487,5488,5490,5491,5493],{},"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 ",[495,5489,1215],{},". Cặp khóa này là danh tính đại diện của ",[495,5492,1215],{}," trên Nostr relay.",[933,5495,5497],{"className":1042,"code":5496,"language":1044,"meta":425,"style":425},"docker run --rm --entrypoint \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin ghcr.io\u002Fblock\u002Fbuzz:main generate-key\n\n# Use the generated Public Key\ndocker compose exec relay buzz-admin add-member --pubkey generated_Public_key\n",[495,5498,5499,5521,5525,5530],{"__ignoreMap":425},[941,5500,5501,5503,5506,5509,5512,5515,5518],{"class":943,"line":944},[941,5502,1185],{"class":1051},[941,5504,5505],{"class":1055}," run",[941,5507,5508],{"class":1055}," --rm",[941,5510,5511],{"class":1055}," --entrypoint",[941,5513,5514],{"class":1055}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[941,5516,5517],{"class":1055}," ghcr.io\u002Fblock\u002Fbuzz:main",[941,5519,5520],{"class":1055}," generate-key\n",[941,5522,5523],{"class":943,"line":1071},[941,5524,1075],{"emptyLinePlaceholder":1074},[941,5526,5527],{"class":943,"line":1078},[941,5528,5529],{"class":1081},"# Use the generated Public Key\n",[941,5531,5532,5534,5536,5538,5540,5542,5544,5546],{"class":943,"line":1085},[941,5533,1185],{"class":1051},[941,5535,1188],{"class":1055},[941,5537,1191],{"class":1055},[941,5539,1194],{"class":1055},[941,5541,1197],{"class":1055},[941,5543,1200],{"class":1055},[941,5545,1203],{"class":1055},[941,5547,5548],{"class":1055}," generated_Public_key\n",[430,5550,5551],{},"Cấu hình giao diện dòng lệnh (CLI):",[933,5553,5555],{"className":1042,"code":5554,"language":1044,"meta":425,"style":425},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\necho 'export BUZZ_PRIVATE_KEY=\"nsec1...\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n\necho 'export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n",[495,5556,5557,5562,5593,5597],{"__ignoreMap":425},[941,5558,5559],{"class":943,"line":944},[941,5560,5561],{"class":1081},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[941,5563,5564,5566,5568,5571,5573,5576,5579,5582,5585,5588,5590],{"class":943,"line":1071},[941,5565,4425],{"class":972},[941,5567,5463],{"class":955},[941,5569,5570],{"class":1055},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[941,5572,5469],{"class":955},[941,5574,5575],{"class":955},"  >>",[941,5577,5578],{"class":1055}," \u002Fhome\u002F",[941,5580,5581],{"class":955},"\u003C",[941,5583,5584],{"class":1055},"use",[941,5586,5587],{"class":951},"r",[941,5589,1258],{"class":955},[941,5591,5592],{"class":1055},"\u002F.bashrc\n",[941,5594,5595],{"class":943,"line":1078},[941,5596,1075],{"emptyLinePlaceholder":1074},[941,5598,5599,5601,5603,5606,5608,5610,5612,5614,5616,5618,5620],{"class":943,"line":1085},[941,5600,4425],{"class":972},[941,5602,5463],{"class":955},[941,5604,5605],{"class":1055},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[941,5607,5469],{"class":955},[941,5609,5575],{"class":955},[941,5611,5578],{"class":1055},[941,5613,5581],{"class":955},[941,5615,5584],{"class":1055},[941,5617,5587],{"class":951},[941,5619,1258],{"class":955},[941,5621,5592],{"class":1055},[430,5623,5624,5625,5627],{},"Chạy lệnh sau để xác minh rằng ",[495,5626,1215],{}," đã được cấu hình chính xác:",[933,5629,5631],{"className":1042,"code":5630,"language":1044,"meta":425,"style":425},"buzz channels list\n",[495,5632,5633],{"__ignoreMap":425},[941,5634,5635,5637,5639],{"class":943,"line":944},[941,5636,1238],{"class":1051},[941,5638,1241],{"class":1055},[941,5640,5641],{"class":1055}," list\n",[430,5643,5644],{},[433,5645],{"alt":5646,"src":5647},"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",[2167,5649,5651],{"id":5650},"tạo-một-dự-án-bằng-buzz-cli","Tạo một dự án bằng buzz-cli",[933,5653,5655],{"className":1042,"code":5654,"language":1044,"meta":425,"style":425},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[495,5656,5657,5662],{"__ignoreMap":425},[941,5658,5659],{"class":943,"line":944},[941,5660,5661],{"class":1081},"# --channel refers to the UUID of the channel\n",[941,5663,5664,5666,5669,5672,5675,5678,5681,5683,5686,5688,5690,5692,5695],{"class":943,"line":1071},[941,5665,1238],{"class":1051},[941,5667,5668],{"class":1055}," repos",[941,5670,5671],{"class":1055}," create",[941,5673,5674],{"class":1055}," --id",[941,5676,5677],{"class":1055}," TestKOA",[941,5679,5680],{"class":1055}," --name",[941,5682,5463],{"class":955},[941,5684,5685],{"class":1055},"Display Name",[941,5687,5469],{"class":955},[941,5689,1246],{"class":1055},[941,5691,3286],{"class":955},[941,5693,5694],{"class":1055},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[941,5696,1965],{"class":955},[430,5698,5699,5700,5702],{},"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 ",[495,5701,1215],{}," (vốn chưa hỗ trợ lệnh xóa), nó sẽ không thể xóa theo cách này.",[430,5704,5705],{},"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.",[430,5707,5708],{},[433,5709],{"alt":5710,"src":5711},"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",[430,5713,5714],{},"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.",[430,5716,5717],{},[433,5718],{"alt":5719,"src":5720},"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",[2167,5722,5724],{"id":5723},"đư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ó",[430,5726,2536,5727,5730,5731,5734,5735,5740],{},[495,5728,5729],{},"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 ",[441,5732,5733],{},"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 ",[444,5736,5739],{"href":5737,"rel":5738},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[448],"Readme"," này:",[933,5742,5744],{"className":1042,"code":5743,"language":1044,"meta":425,"style":425},"cargo install --path crates\u002Fgit-credential-nostr\n",[495,5745,5746],{"__ignoreMap":425},[941,5747,5748,5750,5752,5754],{"class":943,"line":944},[941,5749,5448],{"class":1051},[941,5751,4499],{"class":1055},[941,5753,5453],{"class":1055},[941,5755,5756],{"class":1055}," crates\u002Fgit-credential-nostr\n",[430,5758,5759,5760,5762],{},"Siết chặt cơ chế bảo mật bằng cách cấu hình ",[495,5761,5729],{}," để cấp quyền truy cập qua Buzz relay:",[933,5764,5766],{"className":1042,"code":5765,"language":1044,"meta":425,"style":425},"# 1. Register the helper and enable per-path credentials.\ngit config --global credential.helper nostr\ngit config --global credential.useHttpPath true\n\n# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\nmkdir -p ~\u002F.nostr\necho \"nsec1...\" > ~\u002F.nostr\u002Fkey && chmod 600 ~\u002F.nostr\u002Fkey\ngit config --global nostr.keyfile ~\u002F.nostr\u002Fkey\n",[495,5767,5768,5773,5789,5802,5806,5811,5820,5847],{"__ignoreMap":425},[941,5769,5770],{"class":943,"line":944},[941,5771,5772],{"class":1081},"# 1. Register the helper and enable per-path credentials.\n",[941,5774,5775,5777,5780,5783,5786],{"class":943,"line":1071},[941,5776,2800],{"class":1051},[941,5778,5779],{"class":1055}," config",[941,5781,5782],{"class":1055}," --global",[941,5784,5785],{"class":1055}," credential.helper",[941,5787,5788],{"class":1055}," nostr\n",[941,5790,5791,5793,5795,5797,5800],{"class":943,"line":1078},[941,5792,2800],{"class":1051},[941,5794,5779],{"class":1055},[941,5796,5782],{"class":1055},[941,5798,5799],{"class":1055}," credential.useHttpPath",[941,5801,1388],{"class":955},[941,5803,5804],{"class":943,"line":1085},[941,5805,1075],{"emptyLinePlaceholder":1074},[941,5807,5808],{"class":943,"line":1933},[941,5809,5810],{"class":1081},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[941,5812,5813,5815,5817],{"class":943,"line":1938},[941,5814,5195],{"class":1051},[941,5816,5198],{"class":1055},[941,5818,5819],{"class":1055}," ~\u002F.nostr\n",[941,5821,5822,5824,5826,5829,5831,5833,5836,5838,5841,5844],{"class":943,"line":1944},[941,5823,4425],{"class":972},[941,5825,3286],{"class":955},[941,5827,5828],{"class":1055},"nsec1...",[941,5830,3693],{"class":955},[941,5832,4459],{"class":955},[941,5834,5835],{"class":1055}," ~\u002F.nostr\u002Fkey",[941,5837,5478],{"class":955},[941,5839,5840],{"class":1051}," chmod",[941,5842,5843],{"class":2967}," 600",[941,5845,5846],{"class":1055}," ~\u002F.nostr\u002Fkey\n",[941,5848,5849,5851,5853,5855,5858],{"class":943,"line":2280},[941,5850,2800],{"class":1051},[941,5852,5779],{"class":1055},[941,5854,5782],{"class":1055},[941,5856,5857],{"class":1055}," nostr.keyfile",[941,5859,5846],{"class":1055},[430,5861,5862],{},"Tạo một kho lưu trữ mới trên Buzz relay:",[933,5864,5867],{"className":5865,"code":5866,"language":4646},[4644],"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",[495,5868,5866],{"__ignoreMap":425},[430,5870,5871,5872,5875,5876,5879],{},"Trong lần ",[495,5873,5874],{},"git push"," đầu tiên, bạn sẽ gặp lỗi ",[495,5877,5878],{},"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:",[933,5881,5883],{"className":1042,"code":5882,"language":1044,"meta":425,"style":425},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[495,5884,5885,5910,5914,5919],{"__ignoreMap":425},[941,5886,5887,5889,5891,5894,5896,5899,5901,5903,5905,5907],{"class":943,"line":944},[941,5888,1238],{"class":1051},[941,5890,5668],{"class":1055},[941,5892,5893],{"class":1055}," bind",[941,5895,5674],{"class":1055},[941,5897,5898],{"class":1055}," koa-email-routing",[941,5900,1246],{"class":1055},[941,5902,1249],{"class":955},[941,5904,1252],{"class":1055},[941,5906,1255],{"class":951},[941,5908,5909],{"class":955},">\n",[941,5911,5912],{"class":943,"line":1071},[941,5913,1075],{"emptyLinePlaceholder":1074},[941,5915,5916],{"class":943,"line":1078},[941,5917,5918],{"class":1081},"# push the code again\n",[941,5920,5921,5923],{"class":943,"line":1085},[941,5922,2800],{"class":1051},[941,5924,5925],{"class":1055}," push\n",[430,5927,5928,5929,5932],{},"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 ",[441,5930,5931],{},"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:",[430,5934,5935],{},[433,5936],{"alt":5937,"src":5938},"Ứ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",[430,5940,5941,5942,5945,5946,3148],{},"Hãy xuất biến PATH bằng lệnh ",[495,5943,5944],{},"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 ",[444,5947,5950],{"href":5948,"rel":5949},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[448],"lỗi này",[933,5952,5954],{"className":1042,"code":5953,"language":1044,"meta":425,"style":425},"open -a Buzz\n",[495,5955,5956],{"__ignoreMap":425},[941,5957,5958,5961,5964],{"class":943,"line":944},[941,5959,5960],{"class":1051},"open",[941,5962,5963],{"class":1055}," -a",[941,5965,5966],{"class":1055}," Buzz\n",[430,5968,5969],{},"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 đủ.",[430,5971,5972],{},[433,5973],{"alt":5974,"src":5975},"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",[474,5977,5979],{"id":5978},"đồ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",[430,5981,5982,5983,5986],{},"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ụ ",[495,5984,5985],{},"buzz-pair-relay"," mặc định sẽ không khởi chạy trên VPS.",[933,5988,5990],{"className":1042,"code":5989,"language":1044,"meta":425,"style":425},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[495,5991,5992,5998],{"__ignoreMap":425},[941,5993,5994,5996],{"class":943,"line":944},[941,5995,2824],{"class":972},[941,5997,5443],{"class":1055},[941,5999,6000,6002,6004,6006],{"class":943,"line":1071},[941,6001,5448],{"class":1051},[941,6003,4499],{"class":1055},[941,6005,5453],{"class":1055},[941,6007,6008],{"class":1055}," crates\u002Fbuzz-pair-relay\n",[430,6010,6011,6012,6015,6016,899],{},"Thêm khối cấu hình sau vào tệp ",[495,6013,6014],{},"compose.yml"," để kích hoạt dịch vụ ",[495,6017,5985],{},[933,6019,6021],{"className":1351,"code":6020,"language":1353,"meta":425,"style":425},"  pair:\n    image: ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n    entrypoint: [\"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay\"]\n    environment:\n      BUZZ_PAIR_RELAY_BIND_ADDR: 0.0.0.0:5000\n    ports:\n      - \"${BUZZ_PAIR_RELAY_PORT:-5000}:5000\"\n    restart: unless-stopped\n    networks:\n      [buzz-net]\n",[495,6022,6023,6030,6039,6059,6065,6075,6081,6092,6100,6106],{"__ignoreMap":425},[941,6024,6025,6028],{"class":943,"line":944},[941,6026,6027],{"class":1363},"  pair",[941,6029,1377],{"class":955},[941,6031,6032,6034,6036],{"class":943,"line":1071},[941,6033,3266],{"class":1363},[941,6035,899],{"class":955},[941,6037,6038],{"class":1055}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[941,6040,6041,6044,6046,6049,6051,6054,6056],{"class":943,"line":1078},[941,6042,6043],{"class":1363},"    entrypoint",[941,6045,899],{"class":955},[941,6047,6048],{"class":955}," [",[941,6050,3693],{"class":955},[941,6052,6053],{"class":1055},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[941,6055,3693],{"class":955},[941,6057,6058],{"class":955},"]\n",[941,6060,6061,6063],{"class":943,"line":1085},[941,6062,3296],{"class":1363},[941,6064,1377],{"class":955},[941,6066,6067,6070,6072],{"class":943,"line":1933},[941,6068,6069],{"class":1363},"      BUZZ_PAIR_RELAY_BIND_ADDR",[941,6071,899],{"class":955},[941,6073,6074],{"class":1055}," 0.0.0.0:5000\n",[941,6076,6077,6079],{"class":943,"line":1938},[941,6078,3276],{"class":1363},[941,6080,1377],{"class":955},[941,6082,6083,6085,6087,6090],{"class":943,"line":1944},[941,6084,3283],{"class":955},[941,6086,3286],{"class":955},[941,6088,6089],{"class":1055},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[941,6091,1965],{"class":955},[941,6093,6094,6096,6098],{"class":943,"line":2280},[941,6095,3358],{"class":1363},[941,6097,899],{"class":955},[941,6099,3363],{"class":1055},[941,6101,6102,6104],{"class":943,"line":2291},[941,6103,5044],{"class":1363},[941,6105,1377],{"class":955},[941,6107,6108,6111,6114],{"class":943,"line":2387},[941,6109,6110],{"class":955},"      [",[941,6112,6113],{"class":1055},"buzz-net",[941,6115,6058],{"class":955},[430,6117,6118,6119,575,6122,6125,6126,899],{},"Thêm ",[495,6120,6121],{},"BUZZ_PAIRING_RELAY_URL",[495,6123,6124],{},"BUZZ_PAIR_RELAY_PORT"," vào tệp cấu hình ",[495,6127,2854],{},[933,6129,6132],{"className":6130,"code":6131,"language":4646},[4644],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[495,6133,6131],{"__ignoreMap":425},[430,6135,6136,6137,6140],{},"Truy cập mục '",[441,6138,6139],{},"Mobile","' trong phần cài đặt của Buzz desktop:",[430,6142,6143],{},[433,6144],{"alt":6145,"src":6146},"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",[430,6148,6149],{},"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\".",[430,6151,6152],{},[433,6153],{"alt":6154,"src":6155},"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",[430,6157,6158],{},"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.",[430,6160,6161],{},[433,6162],{"alt":6163,"src":6164},"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",[474,6166,6168],{"id":6167},"lời-kết","Lời kết",[430,6170,6171],{},"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.",[474,6173,6174],{"id":1619},"Tài liệu tham khảo",[485,6176,6177,6184,6191,6198],{},[488,6178,6179],{},[444,6180,6183],{"href":6181,"rel":6182},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[448],"Buzz releases",[488,6185,6186],{},[444,6187,6190],{"href":6188,"rel":6189},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[448],"Introducing Buzz",[488,6192,6193],{},[444,6194,6197],{"href":6195,"rel":6196},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[448],"What is buzz",[488,6199,6200],{},[444,6201,6204],{"href":6202,"rel":6203},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[448],"How to self-host Buzz (Miget)",[1648,6206,6207],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":425,"searchDepth":1071,"depth":1078,"links":6209},[6210,6211,6212,6226,6235,6236,6237],{"id":4123,"depth":1071,"text":4124},{"id":4168,"depth":1071,"text":4169},{"id":4216,"depth":1071,"text":4217,"children":6213},[6214,6215,6219,6220,6221,6225],{"id":4220,"depth":1078,"text":4221},{"id":4248,"depth":1078,"text":4249,"children":6216},[6217,6218],{"id":4252,"depth":1085,"text":4253},{"id":4352,"depth":1085,"text":4353},{"id":4369,"depth":1078,"text":4370},{"id":4586,"depth":1078,"text":4587},{"id":4733,"depth":1078,"text":4734,"children":6222},[6223,6224],{"id":4737,"depth":1085,"text":4738},{"id":5121,"depth":1085,"text":5122},{"id":5184,"depth":1078,"text":5185},{"id":5227,"depth":1071,"text":5228,"children":6227},[6228,6229,6230],{"id":5306,"depth":1078,"text":5307},{"id":5351,"depth":1078,"text":5352},{"id":5388,"depth":1078,"text":5389,"children":6231},[6232,6233,6234],{"id":5411,"depth":1085,"text":5412},{"id":5650,"depth":1085,"text":5651},{"id":5723,"depth":1085,"text":5724},{"id":5978,"depth":1071,"text":5979},{"id":6167,"depth":1071,"text":6168},{"id":1619,"depth":1071,"text":6174},[1669,1668,1238],"2026-09-08",{"schemaOrg":6241,"robots":1702,"sitemap":6260},[6242,6243],{"@type":1679,"headline":455,"description":465,"image":466},{"@type":1681,"name":455,"description":465,"image":466,"step":6244},[6245,6248,6251,6254,6257],{"@type":1684,"name":6246,"text":6247},"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":1684,"name":6249,"text":6250},"Giai đoạn 2: Cài đặt Docker","Thiết lập và cài đặt Docker Engine trên VPS Ubuntu.",{"@type":1684,"name":6252,"text":6253},"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":1684,"name":6255,"text":6256},"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":1684,"name":6258,"text":6259},"Giai đoạn 5: Sao lưu tự động","Định cấu hình cron job để tự động sao lưu PostgreSQL.",{"lastmod":6261},"2026-09-03",{"title":6263,"description":465,"ogTitle":455,"ogDescription":465,"twitterTitle":455,"twitterDescription":465},"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",[1709,6266,1112,6267,6268],"Docker","Caddy","Cloudflare","4n6TAwckx54GT3WMA-sqwXdGcmS8qZxFUgRYb8qCjWk",{"id":6271,"title":6272,"author":1711,"body":6273,"category":8135,"date":8137,"description":8138,"extension":1673,"image":8139,"imageAlt":8140,"isPublished":1074,"meta":8141,"minRead":5096,"navigation":1074,"path":295,"seo":8147,"stem":8148,"tags":8149,"updatedAt":6261,"__hash__":8151},"article\u002Fvi\u002Farticle\u002Fself-hosted-travel-planner-trek.md","Tự host kế hoạch du lịch của bạn với TREK và Docker",{"type":427,"value":6274,"toc":8094},[6275,6278,6281,6284,6288,6292,6434,6438,6444,6463,6466,6470,6574,6585,6588,6593,6596,6607,6611,6615,6618,6621,6654,6658,6661,6693,6696,6736,6739,6744,6755,6759,6766,6770,6773,6867,6871,6876,6880,6887,6891,6894,6912,6922,6926,6929,6939,6943,6947,6956,6960,6964,6967,6971,6975,6978,6983,6986,6991,6997,7001,7005,7008,7012,7026,7031,7037,7042,7046,7049,7054,7059,7062,7069,7073,7076,7079,7089,7096,7101,7107,7112,7116,7121,7126,7129,7134,7138,7144,7148,7153,7157,7160,7163,7168,7173,7178,7182,7189,7194,7199,7204,7209,7213,7218,7223,7229,7233,7236,7240,7246,7251,7256,7262,7267,7272,7277,7289,7293,7298,7319,7324,7327,7331,7334,7339,7342,7389,7393,7400,7406,7411,7417,7422,7428,7433,7439,7442,7447,7453,7458,7464,7468,7474,7479,7484,7488,7492,7495,7499,7502,7509,7513,7520,7524,7535,7538,7542,7546,7556,7566,7571,7578,7583,7590,7594,7597,7761,7767,7771,7774,7779,7782,7788,7792,7799,7803,7806,7811,7818,7823,7827,7837,7908,7923,7926,7931,7935,7939,7949,8025,8035,8038,8042,8046,8049,8051,8054,8057,8066,8068,8091],[430,6276,6277],{},"Phần tẻ nhạt nhất của việc lập kế hoạch du lịch là các tệp PDF đặt vé máy bay, xác nhận khách sạn, các cuộc trò chuyện với bạn đồng hành và danh sách các địa điểm muốn ghé thăm thường bị rải rác ở nhiều nơi khác nhau. Khi đến lúc tính toán tổng chi tiêu và chia hóa đơn, bạn sẽ phải tốn rất nhiều công sức để lục lọi lại toàn bộ đống dữ liệu du lịch đó.",[430,6279,6280],{},"TREK là một công cụ lập kế hoạch du lịch mã nguồn mở có thể tự lưu trữ (self-host), giúp gom toàn bộ lịch trình, thông tin đặt chỗ, ngân sách và danh sách đồ dùng cần mang theo vào một nơi duy nhất. Server MCP tích hợp sẵn cho phép các tác nhân AI (chẳng hạn như Claude Desktop) thao tác trực tiếp với dữ liệu du lịch của bạn.",[430,6282,6283],{},"Hướng dẫn này sẽ đi cùng bạn qua mọi bước, từ triển khai cài đặt đến việc quản lý hoàn chỉnh một chuyến đi thực tế từ đầu đến cuối.",[889,6285,6287],{"id":6286},"_1-cách-triển-khai-công-cụ-lập-kế-hoạch-du-lịch-trek-bằng-docker","1. Cách triển khai công cụ lập kế hoạch du lịch TREK bằng Docker",[2167,6289,6291],{"id":6290},"cài-đặt-docker-trên-vps-ubuntu","Cài đặt Docker trên VPS Ubuntu",[933,6293,6295],{"className":1042,"code":6294,"language":1044,"meta":425,"style":425},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Verify docker is installed\ndocker --version\n\n# Starts automatically when your system boots\nsudo systemctl enable docker\n",[495,6296,6297,6301,6321,6325,6329,6361,6365,6369,6377,6381,6385,6401,6405,6409,6415,6419,6424],{"__ignoreMap":425},[941,6298,6299],{"class":943,"line":944},[941,6300,4383],{"class":1081},[941,6302,6303,6305,6307,6309,6311,6313,6315,6317,6319],{"class":943,"line":1071},[941,6304,2998],{"class":1051},[941,6306,4390],{"class":1055},[941,6308,4393],{"class":1055},[941,6310,4396],{"class":955},[941,6312,4399],{"class":1051},[941,6314,4402],{"class":1055},[941,6316,4405],{"class":1055},[941,6318,4408],{"class":1055},[941,6320,4411],{"class":1055},[941,6322,6323],{"class":943,"line":1078},[941,6324,1075],{"emptyLinePlaceholder":1074},[941,6326,6327],{"class":943,"line":1085},[941,6328,4420],{"class":1081},[941,6330,6331,6333,6335,6337,6339,6341,6343,6345,6347,6349,6351,6353,6355,6357,6359],{"class":943,"line":1933},[941,6332,4425],{"class":972},[941,6334,3286],{"class":955},[941,6336,4430],{"class":1055},[941,6338,4433],{"class":955},[941,6340,4436],{"class":1051},[941,6342,4439],{"class":1055},[941,6344,4442],{"class":955},[941,6346,4445],{"class":1055},[941,6348,3693],{"class":955},[941,6350,4396],{"class":955},[941,6352,4399],{"class":1051},[941,6354,3816],{"class":1055},[941,6356,4456],{"class":1055},[941,6358,4459],{"class":955},[941,6360,4462],{"class":1055},[941,6362,6363],{"class":943,"line":1938},[941,6364,1075],{"emptyLinePlaceholder":1074},[941,6366,6367],{"class":943,"line":1944},[941,6368,4471],{"class":1081},[941,6370,6371,6373,6375],{"class":943,"line":2280},[941,6372,1901],{"class":1051},[941,6374,4478],{"class":1055},[941,6376,4481],{"class":1055},[941,6378,6379],{"class":943,"line":2291},[941,6380,1075],{"emptyLinePlaceholder":1074},[941,6382,6383],{"class":943,"line":2387},[941,6384,4490],{"class":1081},[941,6386,6387,6389,6391,6393,6395,6397,6399],{"class":943,"line":2393},[941,6388,1901],{"class":1051},[941,6390,4478],{"class":1055},[941,6392,4499],{"class":1055},[941,6394,4502],{"class":1055},[941,6396,4505],{"class":1055},[941,6398,4508],{"class":1055},[941,6400,4511],{"class":1055},[941,6402,6403],{"class":943,"line":2399},[941,6404,1075],{"emptyLinePlaceholder":1074},[941,6406,6407],{"class":943,"line":2404},[941,6408,4540],{"class":1081},[941,6410,6411,6413],{"class":943,"line":1704},[941,6412,1185],{"class":1051},[941,6414,3616],{"class":1055},[941,6416,6417],{"class":943,"line":3355},[941,6418,1075],{"emptyLinePlaceholder":1074},[941,6420,6421],{"class":943,"line":3366},[941,6422,6423],{"class":1081},"# Starts automatically when your system boots\n",[941,6425,6426,6428,6430,6432],{"class":943,"line":3371},[941,6427,1901],{"class":1051},[941,6429,1904],{"class":1055},[941,6431,2031],{"class":1055},[941,6433,4531],{"class":1055},[2167,6435,6437],{"id":6436},"tạo-khóa-mã-hóa","Tạo khóa mã hóa",[430,6439,6440,6441,6443],{},"TREK sử dụng một khóa để mã hóa dữ liệu nhạy cảm. Hãy sử dụng lệnh sau hoặc ",[444,6442,4673],{"href":2874}," này để tạo khóa mã hóa:",[933,6445,6447],{"className":1042,"code":6446,"language":1044,"meta":425,"style":425},"openssl rand -hex 32\n",[495,6448,6449],{"__ignoreMap":425},[941,6450,6451,6454,6457,6460],{"class":943,"line":944},[941,6452,6453],{"class":1051},"openssl",[941,6455,6456],{"class":1055}," rand",[941,6458,6459],{"class":1055}," -hex",[941,6461,6462],{"class":2967}," 32\n",[430,6464,6465],{},"Hãy lưu khóa này ở nơi an toàn; việc mất khóa đồng nghĩa với việc bạn sẽ mất quyền truy cập vào dữ liệu đã được mã hóa.",[2167,6467,6469],{"id":6468},"khởi-chạy-container","Khởi chạy container",[933,6471,6473],{"className":1042,"code":6472,"language":1044,"meta":425,"style":425},"docker run -d \\\n  --name trek \\\n  -p 3000:3000 \\\n  -e ENCRYPTION_KEY=\"\u003Cgenerated_key>\" \\\n  -e APP_URL=\"https:\u002F\u002Ftrek.pafor.me\" \\\n  -v .\u002Fdata:\u002Fapp\u002Fdata \\\n  -v .\u002Fuploads:\u002Fapp\u002Fuploads \\\n  --restart unless-stopped \\\n  mauriceboe\u002Ftrek:latest\n",[495,6474,6475,6487,6497,6507,6524,6540,6550,6559,6569],{"__ignoreMap":425},[941,6476,6477,6479,6481,6484],{"class":943,"line":944},[941,6478,1185],{"class":1051},[941,6480,5505],{"class":1055},[941,6482,6483],{"class":1055}," -d",[941,6485,6486],{"class":951}," \\\n",[941,6488,6489,6492,6495],{"class":943,"line":1071},[941,6490,6491],{"class":1055},"  --name",[941,6493,6494],{"class":1055}," trek",[941,6496,6486],{"class":951},[941,6498,6499,6502,6505],{"class":943,"line":1078},[941,6500,6501],{"class":1055},"  -p",[941,6503,6504],{"class":1055}," 3000:3000",[941,6506,6486],{"class":951},[941,6508,6509,6512,6515,6517,6520,6522],{"class":943,"line":1085},[941,6510,6511],{"class":1055},"  -e",[941,6513,6514],{"class":1055}," ENCRYPTION_KEY=",[941,6516,3693],{"class":955},[941,6518,6519],{"class":1055},"\u003Cgenerated_key>",[941,6521,3693],{"class":955},[941,6523,6486],{"class":951},[941,6525,6526,6528,6531,6533,6536,6538],{"class":943,"line":1933},[941,6527,6511],{"class":1055},[941,6529,6530],{"class":1055}," APP_URL=",[941,6532,3693],{"class":955},[941,6534,6535],{"class":1055},"https:\u002F\u002Ftrek.pafor.me",[941,6537,3693],{"class":955},[941,6539,6486],{"class":951},[941,6541,6542,6545,6548],{"class":943,"line":1938},[941,6543,6544],{"class":1055},"  -v",[941,6546,6547],{"class":1055}," .\u002Fdata:\u002Fapp\u002Fdata",[941,6549,6486],{"class":951},[941,6551,6552,6554,6557],{"class":943,"line":1944},[941,6553,6544],{"class":1055},[941,6555,6556],{"class":1055}," .\u002Fuploads:\u002Fapp\u002Fuploads",[941,6558,6486],{"class":951},[941,6560,6561,6564,6567],{"class":943,"line":2280},[941,6562,6563],{"class":1055},"  --restart",[941,6565,6566],{"class":1055}," unless-stopped",[941,6568,6486],{"class":951},[941,6570,6571],{"class":943,"line":2291},[941,6572,6573],{"class":1055},"  mauriceboe\u002Ftrek:latest\n",[485,6575,6576],{},[488,6577,6578,6584],{},[441,6579,6580,6583],{},[495,6581,6582],{},"APP_URL"," phải được định cấu hình chính xác"," — luồng khám phá OAuth của server MCP phụ thuộc vào biến này. Hãy thiết lập nó thành địa chỉ HTTPS công khai cuối cùng của bạn ngay từ đầu.",[430,6586,6587],{},"Lần chạy đầu tiên sẽ mất một khoảng thời gian để tải image về:",[433,6589],{"src":6590,"alt":6591,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-pull-image.webp","Nhật ký docker pull và run cho TREK","max-width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6594,6595],{},"Xác nhận container đang hoạt động:",[933,6597,6599],{"className":1042,"code":6598,"language":1044,"meta":425,"style":425},"docker ps\n",[495,6600,6601],{"__ignoreMap":425},[941,6602,6603,6605],{"class":943,"line":944},[941,6604,1185],{"class":1051},[941,6606,5165],{"class":1055},[433,6608],{"src":6609,"alt":6610,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-ps-status.webp","Xác minh trạng thái container đang chạy qua docker ps",[889,6612,6614],{"id":6613},"_2-thiết-lập-định-tuyến-tên-miền-ssl-với-caddy-reverse-proxy","2. Thiết lập định tuyến tên miền & SSL với Caddy Reverse Proxy",[430,6616,6617],{},"Giao thức HTTPS là bắt buộc đối với passkey, và OAuth đối với MCP. Tên miền được lưu trữ trên Cloudflare, đi kèm với chứng chỉ SSL miễn phí và tính năng bảo vệ DDoS.",[430,6619,6620],{},"Caddy được thiết lập như một máy chủ reverse proxy bảo mật để trỏ về cổng 3000. Ví dụ về file cấu hình Caddyfile như sau:",[933,6622,6624],{"className":2913,"code":6623,"language":2915,"meta":425,"style":425},"{$TREK_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:3000\n}\n",[495,6625,6626,6637,6641,6650],{"__ignoreMap":425},[941,6627,6628,6630,6633,6635],{"class":943,"line":944},[941,6629,2943],{"class":955},[941,6631,6632],{"class":951},"$TREK_DOMAIN",[941,6634,2949],{"class":955},[941,6636,2952],{"class":955},[941,6638,6639],{"class":943,"line":1071},[941,6640,2957],{"class":951},[941,6642,6643,6645,6647],{"class":943,"line":1078},[941,6644,2962],{"class":951},[941,6646,899],{"class":955},[941,6648,6649],{"class":2967},"3000\n",[941,6651,6652],{"class":943,"line":1085},[941,6653,2930],{"class":955},[889,6655,6657],{"id":6656},"_3-cấu-hình-ban-đầu-thiết-lập-quản-trị-viên-bảo-mật","3. Cấu hình ban đầu & Thiết lập quản trị viên bảo mật",[430,6659,6660],{},"Có hai cách để tạo tài khoản quản trị viên (admin):",[485,6662,6663,6674],{},[488,6664,6665,6673],{},[441,6666,6667,575,6670],{},[495,6668,6669],{},"ADMIN_EMAIL",[495,6671,6672],{},"ADMIN_PASSWORD"," được thiết lập làm biến môi trường; các giá trị này sẽ được sử dụng trực tiếp.",[488,6675,6676,6677,6680,6681,6684,6685,6688,6689,6692],{},"TREK tự động tạo email ",[495,6678,6679],{},"admin@trek.local",", tên đăng nhập ",[495,6682,6683],{},"admin",", và một ",[441,6686,6687],{},"mật khẩu được tạo ngẫu nhiên in trong container log",". Chạy lệnh ",[495,6690,6691],{},"docker logs trek"," để lấy mật khẩu này.",[430,6694,6695],{},"Nếu không tìm thấy mật khẩu từ log, bạn có thể đặt lại bằng lệnh:",[933,6697,6699],{"className":1042,"code":6698,"language":1044,"meta":425,"style":425},"docker exec -it -e RESET_ADMIN_EMAIL=admin@trek.local -e RESET_ADMIN_PASSWORD='YourNewPassword' trek node server\u002Freset-admin.js\n",[495,6700,6701],{"__ignoreMap":425},[941,6702,6703,6705,6707,6710,6713,6716,6718,6721,6723,6726,6728,6730,6733],{"class":943,"line":944},[941,6704,1185],{"class":1051},[941,6706,1191],{"class":1055},[941,6708,6709],{"class":1055}," -it",[941,6711,6712],{"class":1055}," -e",[941,6714,6715],{"class":1055}," RESET_ADMIN_EMAIL=admin@trek.local",[941,6717,6712],{"class":1055},[941,6719,6720],{"class":1055}," RESET_ADMIN_PASSWORD=",[941,6722,5469],{"class":955},[941,6724,6725],{"class":1055},"YourNewPassword",[941,6727,5469],{"class":955},[941,6729,6494],{"class":1055},[941,6731,6732],{"class":1055}," node",[941,6734,6735],{"class":1055}," server\u002Freset-admin.js\n",[430,6737,6738],{},"Bạn sẽ được nhắc đổi mật khẩu trong lần đăng nhập đầu tiên.",[433,6740],{"src":6741,"alt":6742,"style":6743},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-initial-login-password-prompt.webp","Lời nhắc đăng nhập lần đầu và đặt lại mật khẩu quản trị viên","max-width: 215px; width:100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6745,4264,6746,6749,6750],{},[441,6747,6748],{},"Admin"," và cập nhật địa chỉ email:",[433,6751],{"src":6752,"alt":6753,"style":6754},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-email-update-panel.webp","Thiết lập email tùy chỉnh trong cài đặt quản trị viên của TREK","max-width: 700px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2167,6756,6758],{"id":6757},"_31-sao-lưu-backups","3.1 Sao lưu (Backups)",[430,6760,6761,6762],{},"Định cấu hình sao lưu tự động với chính sách lưu trữ (retention policy) trong bảng quản trị:\n",[433,6763],{"src":6764,"alt":6765,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-backup-retention-policy.webp","Cấu hình lịch trình sao lưu tự động và quy tắc lưu trữ",[2167,6767,6769],{"id":6768},"_32-lưu-trữ-các-tệp-đã-tải-lên-vào-cloudflare-r2","3.2 Lưu trữ các tệp đã tải lên vào Cloudflare R2",[430,6771,6772],{},"Lưu trữ các tệp đã tải lên, ảnh và bản sao lưu trong Cloudflare R2 giúp dung lượng đĩa của VPS luôn sạch sẽ và nhẹ nhàng. TREK hỗ trợ các backend tương thích S3, và Cloudflare R2 hoàn toàn phù hợp với điều này.",[533,6774,6775,6781,6794,6805,6816,6830,6841,6856],{},[488,6776,6777,6778,461],{},"Tạo một bucket R2 tên là ",[495,6779,6780],{},"trek",[488,6782,6783,6784,6787,6788,6789],{},"Trong phần ",[441,6785,6786],{},"Account Details",", tìm ID tài khoản của bạn:","\n  ",[433,6790],{"src":6791,"alt":6792,"style":6793},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-account-details-id.webp","Tìm ID tài khoản Cloudflare trong cổng thông tin","max-width: 325px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[488,6795,6796,6797,899,6788,6800],{},"Nhấp vào ",[441,6798,6799],{},"Manage API Tokens",[433,6801],{"src":6802,"alt":6803,"style":6804},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-manage-api-tokens-button.webp","Màn hình Quản lý mã thông báo API của cổng thông tin Cloudflare","max-width: 282px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[488,6806,6796,6807,6810,6788,6811],{},[441,6808,6809],{},"Create Account API token"," với quyền đọc\u002Fghi (read\u002Fwrite) cho bucket:",[433,6812],{"src":6813,"alt":6814,"style":6815},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-create-token-permissions.webp","Tạo mã thông báo truy cập R2 với quyền đọc và ghi","max-width: 360px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[488,6817,4264,6818,6821,6822,899,6788,6825],{},[441,6819,6820],{},"Storage"," trên bảng ",[441,6823,6824],{},"ADMINISTRATION",[433,6826],{"src":6827,"alt":6828,"style":6829},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-administration-storage-menu.webp","Điều hướng đến cài đặt lưu trữ trong bảng điều khiển của TREK","max-width: 539px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[488,6831,4278,6832,6835,6788,6836],{},[441,6833,6834],{},"Add Backend"," và điền đầy đủ endpoint, bucket cùng thông tin đăng nhập:",[433,6837],{"src":6838,"alt":6839,"style":6840},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-storage-backend-credentials.webp","Cấu hình chương trình lưu trữ Cloudflare R2 tương thích S3","max-width: 445px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[488,6842,6796,6843,6846,6847,6850,6788,6851],{},[441,6844,6845],{},"Apply",", sau đó nhấp vào liên kết nút ",[441,6848,6849],{},"Test",". Bạn sẽ thấy dòng chữ \"Connection OK\":",[433,6852],{"src":6853,"alt":6854,"style":6855},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-test-storage-backend-connection-ok.webp","Kiểm tra kết nối lưu trữ thành công hiển thị Connection OK","max-width: 677px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[488,6857,6858,6859,899,6788,6862],{},"Chuyển tất cả các danh mục lưu trữ sang Cloudflare R2 và nhấp vào ",[441,6860,6861],{},"Save changes",[433,6863],{"src":6864,"alt":6865,"style":6866},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-switch-storage-categories-r2.webp","Định tuyến tất cả các danh mục lưu trữ tệp sang Cloudflare R2","max-width: 653px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2167,6868,6870],{"id":6869},"_33-đăng-nhập-bằng-passkey","3.3 Đăng nhập bằng Passkey",[430,6872,6873,6874,899],{},"TREK hỗ trợ đăng nhập bằng passkey, xác thực hai yếu tố (2FA) và đăng nhập một lần OIDC (SSO). Đối với passkey, hãy nhập tên miền của bạn và các origin được phép (allowed origins) trong phần cài đặt, sau đó nhấp vào ",[441,6875,1148],{},[433,6877],{"src":6878,"alt":6879,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-passkey-allowed-origins-settings.webp","Đăng ký các nguồn gốc được phép để xác thực Passkey an toàn",[430,6881,6882,6883,6886],{},"Nếu không định cấu hình mục ",[441,6884,6885],{},"allowed origins",", việc đăng ký passkey sẽ không thành công.",[2167,6888,6890],{"id":6889},"_34-google-maps-api-key","3.4 Google Maps API Key",[430,6892,6893],{},"Khóa Google Maps API giúp bổ sung thêm thông tin phong phú cho việc tìm kiếm địa điểm như xếp hạng, giờ mở cửa và hình ảnh. TREK sẽ tự động chuyển sang sử dụng OpenStreetMap nếu không có khóa, chỉ là không hiển thị xếp hạng và hình ảnh.",[430,6895,6896,6897,6902,6903,6906,6907],{},"Truy cập ",[444,6898,6901],{"href":6899,"rel":6900},"https:\u002F\u002Fmapsplatform.google.com\u002Fmaps-demo-key\u002F",[448],"liên kết"," này và nhấp vào ",[441,6904,6905],{},"Get demo key"," để yêu cầu cấp khóa:                                                  ",[433,6908],{"src":6909,"alt":6910,"style":6911},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgoogle-maps-get-demo-api-key.webp","Yêu cầu khóa API của Google Maps Platform","max-width: 176px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6913,6914,6915,6917,6918],{},"Dán khóa vào cài đặt và nhấp vào ",[441,6916,6849],{}," để xác nhận kết nối:\n",[433,6919],{"src":6920,"alt":6921,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-key-test-connection.webp","Xác minh khả năng kết nối khóa API Google Maps trong cài đặt",[2167,6923,6925],{"id":6924},"_35-tích-hợp-ai","3.5 Tích hợp AI",[430,6927,6928],{},"Mô hình AI được sử dụng để phân tích và chuyển đổi các email xác nhận đặt chỗ cũng như tệp PDF thành các dữ liệu đặt chỗ có cấu trúc.",[430,6930,4264,6931,6934,6935,6938],{},[441,6932,6933],{},"Addons"," ở menu bên trái và bật ",[441,6936,6937],{},"AI Parsing",". Chọn \"OpenAI\" (or nhà cung cấp tương thích khác) và điền thông tin chi tiết:",[433,6940],{"src":6941,"alt":6942,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-ai-parsing-openai.webp","Bật tiện ích bổ sung Phân tích cú pháp AI với tích hợp OpenAI",[2167,6944,6946],{"id":6945},"_36-truy-cập-qua-mcp","3.6 Truy cập qua MCP",[430,6948,6949,6950,6952,6953,899],{},"Trong mục ",[441,6951,6933],{},", bật tính năng ",[441,6954,6955],{},"MCP",[433,6957],{"src":6958,"alt":6959,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-mcp.webp","Kích hoạt tiện ích bổ sung máy chủ MCP của Giao thức Ngữ cảnh Mô hình",[2167,6961,6963],{"id":6962},"_37-các-plugin","3.7 Các Plugin",[430,6965,6966],{},"Các plugin sau đây được khuyến nghị cài đặt và rất đáng để kích hoạt:",[433,6968],{"src":6969,"alt":6970,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-recommended-addons-plugins-activation.webp","Danh sách các tiện ích bổ sung và plugin được khuyên dùng đang hoạt động",[2167,6972,6974],{"id":6973},"_38-tạo-tài-khoản-người-dùng-hàng-ngày","3.8 Tạo tài khoản người dùng hàng ngày",[430,6976,6977],{},"Hãy lập kế hoạch các chuyến đi với tư cách là một người dùng bình thường, thay vì dùng tài khoản quản trị viên. Tạo một người dùng thông thường và đăng nhập bằng tài khoản đó:",[433,6979],{"src":6980,"alt":6981,"style":6982},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-regular-user-form.webp","Tạo tài khoản người dùng thông thường trong bảng điều khiển của TREK","max-width: 420px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6984,6985],{},"Sau khi đăng nhập, hãy thêm một passkey hoặc thiết lập xác thực 2FA để tăng cường bảo mật cho tài khoản:",[433,6987],{"src":6988,"alt":6989,"style":6990},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-user-security-passkey-2fa-setup.webp","Cấu hình cài đặt bảo mật của người dùng bằng Passkey và 2FA","max-width: 381px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6992,6796,6993,6996],{},[441,6994,6995],{},"+ Add a passkey",", nhập mật khẩu hiện tại và xác nhận:",[433,6998],{"src":6999,"alt":7000,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-passkey-confirm-password.webp","Xác nhận mật khẩu để đăng ký Passkey phần cứng mới",[889,7002,7004],{"id":7003},"_4-kiểm-tra-cài-đặt-nhập-dữ-liệu-du-lịch-trong-quá-khứ","4. Kiểm tra cài đặt: Nhập dữ liệu du lịch trong quá khứ",[430,7006,7007],{},"Cách tuyệt vời nhất để làm quen với TREK là bắt đầu ghi lại lịch sử du lịch trước đây của bạn.",[2167,7009,7011],{"id":7010},"_41-tạo-chuyến-đi-mới","4.1 Tạo chuyến đi mới",[430,7013,6796,7014,7017,7018,7021,7022,7025],{},[441,7015,7016],{},"+ New Trip"," và thiết lập ",[441,7019,7020],{},"Start Date"," cũng như ",[441,7023,7024],{},"End Date"," tương ứng với các ngày diễn ra chuyến đi trong quá khứ:",[433,7027],{"src":7028,"alt":7029,"style":7030},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-trip-details.webp","Tạo một chuyến đi mới với phạm vi ngày tùy chỉnh","max-width: 334px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7032,7033,7034,899],{},"Thêm ảnh bìa (bằng cách kéo thả hoặc dán từ khay nhớ tạm) rồi nhấp vào ",[441,7035,7036],{},"Create New Trip",[433,7038],{"src":7039,"alt":7040,"style":7041},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-cover-image-upload.webp","Thiết lập ảnh bìa chuyến đi chất lượng cao","max-width: 608px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2167,7043,7045],{"id":7044},"_42-nhập-thông-tin-đặt-chỗ","4.2 Nhập thông tin đặt chỗ",[430,7047,7048],{},"Kéo thả tất cả các tệp thông tin chuyến bay, tàu hỏa và phương tiện di chuyển khác vào:",[433,7050],{"src":7051,"alt":7052,"style":7053},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-travel-booking-files.webp","Khu vực kéo và thả để nhập tệp PDF chuyến đi và đặt chỗ","max-width: 570px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7055],{"src":7056,"alt":7057,"style":7058},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-booking-pdf-processing-status.webp","Cửa sổ xử lý đặt chỗ đã tải lên hiển thị thông tin trích xuất","max-width: 377px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7060,7061],{},"Khi bật tính năng AI, các tệp PDF xác nhận đặt chỗ sẽ được phân tích tự động và trích xuất thành các bản đặt chỗ có cấu trúc rõ ràng.",[430,7063,7064,7065,7068],{},"Xem lại kết quả đã trích xuất và nhấp vào ",[441,7066,7067],{},"Add"," để lưu thông tin chi tiết đặt chỗ:",[433,7070],{"src":7071,"alt":7072,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-review-parsed-booking-details.webp","Xem xét chi tiết đặt chỗ có cấu trúc được trích xuất bằng AI",[430,7074,7075],{},"Nếu thông tin đặt chỗ chỉ nằm trong email, hãy xuất email đó thành tệp PDF rồi kéo thả vào — quy trình trích xuất tự động tương tự sẽ được áp dụng.",[430,7077,7078],{},"Các ảnh chụp màn hình sau đây hiển thị cách hiển thị của các thông tin đặt chỗ:",[430,7080,7081,7085],{},[433,7082],{"src":7083,"alt":7084,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-bookings-timeline-view.webp","Hiển thị dòng thời gian toàn diện về các lượt đặt chỗ chuyến đi",[433,7086],{"src":7087,"alt":7088,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-booking-confirmation-details.webp","Chế độ xem chi tiết về lượt đặt chỗ phương tiện đã được xác nhận",[430,7090,7091,7092,7095],{},"Trên trang ",[441,7093,7094],{},"Plan",", tất cả các thông tin lưu trú sẽ được hiển thị trực quan trên bản đồ:",[433,7097],{"src":7098,"alt":7099,"style":7100},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-plan-accommodations-map-display.webp","Bản đồ tương tác hiển thị tất cả các nơi lưu trú","max-width: 546px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7102,4264,7103,7106],{},[441,7104,7105],{},"Atlas"," trên thanh menu trên cùng để xem danh sách (và bản đồ) hiển thị mọi quốc gia mà bạn đã từng ghé thăm:",[433,7108],{"src":7109,"alt":7110,"style":7111},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-atlas-countries-visited-summary.webp","Tổng quan lịch sử du lịch trong trình theo dõi Atlas cá nhân","max-width: 407px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2167,7113,7115],{"id":7114},"_43-thêm-bạn-đồng-hành","4.3 Thêm bạn đồng hành",[430,7117,4278,7118,899],{},[441,7119,7120],{},"Share",[433,7122],{"src":7123,"alt":7124,"style":7125},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-share-options-button.webp","Mở hộp thoại chia sẻ chuyến đi trong TREK","max-width: 224px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7127,7128],{},"Ở cuối hộp thoại, bạn có thể thêm các khách mời đồng hành (guests):",[433,7130],{"src":7131,"alt":7132,"style":7133},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-add-companions-guests.webp","Thêm bạn đồng hành và khách tùy chỉnh","max-width: 635px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2167,7135,7137],{"id":7136},"_44-ghi-nhận-chi-phí","4.4 Ghi nhận chi phí",[430,7139,6796,7140,7143],{},[441,7141,7142],{},"Add expense"," để thêm các khoản chi phí khác ngoài đặt chỗ, chẳng hạn như bảo hiểm du lịch, phương tiện công cộng địa phương, thẻ SIM:",[433,7145],{"src":7146,"alt":7147,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-custom-expense-form.webp","Nhập dữ liệu chi tiêu chi tiết vào biểu mẫu chi phí",[433,7149],{"src":7150,"alt":7151,"style":7152},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-expenses-list-billing-split.webp","Bảng chia hóa đơn và sổ cái theo dõi chi phí","max-width: 526px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2167,7154,7156],{"id":7155},"_45-phân-đoạn-chuyến-đi","4.5 Phân đoạn chuyến đi",[430,7158,7159],{},"Tính năng này yêu cầu plugin Trip Segment phải được kích hoạt trước.",[430,7161,7162],{},"Các chuyến đi dài ngày sẽ được chia nhỏ thành các chặng một cách đẹp mắt, trong đó mỗi chặng hiển thị rõ các thông tin đặt chỗ, địa điểm và chi phí tương ứng:",[433,7164],{"src":7165,"alt":7166,"style":7167},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-overview-display.webp","Chia nhỏ lịch trình phức tạp thành các phân đoạn chuyến đi","max-width: 465px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7169],{"src":7170,"alt":7171,"style":7172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segment-itinerary-details.webp","Phân đoạn chuyến đi đang hoạt động hiển thị các địa điểm và lịch trình","max-width: 596px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7174],{"src":7175,"alt":7176,"style":7177},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-interactive-map.webp","Vẽ bản đồ các chặng đi riêng biệt trên dòng thời gian","max-width: 605px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2167,7179,7181],{"id":7180},"_46-tạo-hành-trình-journey-và-kiểm-tra-atlas-của-bạn","4.6 Tạo hành trình (Journey) và kiểm tra atlas của bạn",[430,7183,7184,7185,7188],{},"Gom các chuyến đi thành một ",[441,7186,7187],{},"Journey"," và viết các câu chuyện trải nghiệm để chia sẻ chuyến phiêu lưu với bạn bè:",[433,7190],{"src":7191,"alt":7192,"style":7193},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-journey-group.webp","Tổng hợp nhiều chuyến đi thành một Hành trình trực quan (Journey)","max-width: 441px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7195],{"src":7196,"alt":7197,"style":7198},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-timeline-story-writing.webp","Soạn thảo các câu chuyện trực quan trong bảng Hành trình","max-width: 443px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7200],{"src":7201,"alt":7202,"style":7203},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-gallery-media-grid.webp","Bộ sưu tập phương tiện và lưới thư viện bên trong một Hành trình","max-width: 440px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7205],{"src":7206,"alt":7207,"style":7208},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-public-share-link.webp","Tạo liên kết chia sẻ công khai cho các Hành trình cộng tác","max-width: 532px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[889,7210,7212],{"id":7211},"_5-thiết-kế-lịch-trình-du-lịch-và-danh-sách-đồ-dùng-cá-nhân","5. Thiết kế lịch trình du lịch và danh sách đồ dùng cá nhân",[430,7214,6796,7215,7217],{},[441,7216,7016],{},", nhập tên chuyến đi và thiết lập ngày tháng:",[433,7219],{"src":7220,"alt":7221,"style":7222},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-planning-new-trip-setup.webp","Hộp thoại nhắc ban đầu để tạo một chuyến đi không ghi ngày","max-width: 432px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7224,7225,7228],{},[441,7226,7227],{},"Nếu bạn chưa chốt ngày đi cụ thể, hãy để trống cả hai mục."," Một trường \"số ngày\" sẽ xuất hiện (cho phép lên đến 365 ngày). Lập kế hoạch trước, xếp lịch sau.",[2167,7230,7232],{"id":7231},"_51-thêm-địa-điểm","5.1 Thêm địa điểm",[430,7234,7235],{},"Đây là bước tốn nhiều thời gian nhất của bất kỳ kế hoạch du lịch nào, và TREK cung cấp một số cách để thực hiện điều đó:",[433,7237],{"src":7238,"alt":7239,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-places-methods-overview.webp","Các phương pháp đa kênh để thêm địa điểm mới vào lịch trình",[430,7241,7242,7245],{},[441,7243,7244],{},"1. Nhấp chuột phải trên bản đồ"," để tạo một địa điểm tại vị trí chính xác đó — địa chỉ sẽ được xác định tự động bằng tính năng reverse-geocoding:",[433,7247],{"src":7248,"alt":7249,"style":7250},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-map-location.webp","Nhấp chuột phải vào bản đồ để xác định chính xác vị trí","max-width: 632px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7252],{"src":7253,"alt":7254,"style":7255},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-reverse-geocode-address.webp","Tự động địa mã hóa ngược các tọa độ bản đồ đã chọn","max-width: 628px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7257,7258,7261],{},[441,7259,7260],{},"2. Nhấp vào + Add Place\u002FActivity"," và tìm kiếm theo tên",[433,7263],{"src":7264,"alt":7265,"style":7266},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-search-place-by-name-input.webp","Tìm kiếm các địa điểm thực tế bằng cách nhập văn bản","max-width: 642px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7268],{"src":7269,"alt":7270,"style":7271},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-select-place-search-results-list.webp","Hiển thị kết quả tìm kiếm địa điểm với thông tin địa chỉ","max-width: 594px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7273],{"src":7274,"alt":7275,"style":7276},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-place-details-rich-info-card.webp","Thẻ thông tin địa điểm toàn diện với các đánh giá và xếp hạng","max-width: 568px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7278,7279,778,7282,1527,7285,7288],{},[441,7280,7281],{},"3. Dán một đường link Google Maps",[495,7283,7284],{},"maps.app.goo.gl\u002F...",[495,7286,7287],{},"maps.google.com\u002F...",") vào trường tìm kiếm. TREK sẽ tự động phân tích tên, địa chỉ và tọa độ của địa điểm đó:",[433,7290],{"src":7291,"alt":7292,"style":6855},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-paste-google-maps-share-link.webp","Phân tích cú pháp địa điểm trực tiếp từ liên kết chia sẻ Google Maps được dán",[433,7294],{"src":7295,"alt":7296,"style":7297},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-parsed-location.webp","Trích xuất thành công tọa độ từ URL bản đồ","max-width: 543px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7299,7300,7303,7304,7307,7308,575,7311,7314,7315,7318],{},[441,7301,7302],{},"4. Nhập hàng loạt (Bulk import)"," — cách dễ dàng nhất trong số tất cả. Nếu bạn đã lưu trữ sẵn một danh sách các địa điểm \"muốn đi\" trên Google Maps, hãy xuất danh sách đó dưới dạng ",[495,7305,7306],{},".gpx"," (các định dạng ",[495,7309,7310],{},".kml",[495,7312,7313],{},".kmz"," cũng được hỗ trợ) rồi nhấp vào ",[441,7316,7317],{},"Import file"," ở bảng bên phải để nạp tất cả cùng lúc:",[433,7320],{"src":7321,"alt":7322,"style":7323},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-bulk-import-places-gpx-file.webp","Thực hiện nhập địa điểm hàng loạt bằng tệp GPX hoặc KML","max-width: 389px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7325,7326],{},"Trước tiên hãy thêm tất cả những nơi thú vị mà bạn muốn ghé thăm, bất kể chúng có phù hợp với thời gian hay không. Bạn sẽ phân bổ địa điểm vào các ngày cụ thể sau đó.",[2167,7328,7330],{"id":7329},"_52-kế-hoạch-hàng-ngày-và-ghi-chú","5.2 Kế hoạch hàng ngày và ghi chú",[430,7332,7333],{},"Kế hoạch Ngày (Day Plan) sắp xếp các địa điểm theo ngày một cách có thứ tự. Đó là một danh sách có thể thu gọn cho từng ngày, hỗ trợ thao tác kéo thả vô cùng thuận tiện:",[433,7335],{"src":7336,"alt":7337,"style":7338},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-drag-drop-ordering.webp","Tùy chỉnh các tuyến đường hàng ngày bằng thao tác kéo và thả","max-width: 496px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7340,7341],{},"Những chi tiết làm nên sự hữu ích của tính năng này:",[485,7343,7344,7354,7364,7374],{},[488,7345,7346,7349,7350],{},[441,7347,7348],{},"Di chuyển giữa các điểm dừng",": biểu tượng xe buýt ở góc trên bên trái của một ngày dùng để thêm thông tin phương tiện công cộng (tàu hỏa, xe buýt hoặc các chặng bay trong ngày):\n",[433,7351],{"src":7352,"alt":7353,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-commuting-transport-button.webp","Đăng ký phương tiện di chuyển giữa các phân đoạn trong ngày",[488,7355,7356,7359,7360],{},[441,7357,7358],{},"Ghi chú ngày",": biểu tượng ghi chú ở góc dưới bên trái giúp đính kèm các dòng ghi chú có gắn emoji — \"hôm nay xuất phát sớm\", \"bảo tàng này yêu cầu phải đặt vé trước\":\n",[433,7361],{"src":7362,"alt":7363,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-icon-tagged-notes-button.webp","Thêm ghi chú tùy chỉnh có gắn thẻ biểu tượng hiển thị rõ ràng vào các ngày",[488,7365,7366,7369,7370],{},[441,7367,7368],{},"Khung thời gian",": kéo một địa điểm từ bảng bên phải vào một ngày, sau đó thiết lập thời gian cụ thể. Các địa điểm có mốc thời gian cố định sẽ được kết nối lộ trình tự động trên bản đồ:\n",[433,7371],{"src":7372,"alt":7373,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-timed-places-routing.webp","Các tuyến đường di chuyển được tính tự động giữa các địa điểm có mốc thời gian",[488,7375,7376,7377,7382,7383,575,7386,461],{},"Vui lòng tham khảo ",[444,7378,7381],{"href":7379,"rel":7380},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FDay-Plans-and-Notes",[448],"trang wiki Day Plans and Notes"," để biết thêm thông tin về ",[441,7384,7385],{},"Tối ưu hóa lộ trình",[441,7387,7388],{},"Thời tiết",[2167,7390,7392],{"id":7391},"_53-collections-danh-sách-địa-điểm-có-thể-tái-sử-dụng","5.3 Collections: Danh sách địa điểm có thể tái sử dụng",[430,7394,7395,7396,7399],{},"Tính năng Bộ sưu tập (Collections) cho phép người dùng lưu trữ một danh sách các địa điểm độc lập với bất kỳ chuyến đi cụ thể nào. Nó có thể được chia sẻ với bạn bè và luôn sẵn sàng cho các chuyến đi kế tiếp. Các địa điểm sẽ được ",[441,7397,7398],{},"sao chép"," vào từng chuyến đi, do đó việc chỉnh sửa một địa điểm trong chuyến đi cụ thể sẽ không bao giờ làm thay đổi bộ sưu tập gốc của bạn và ngược lại.",[430,7401,4264,7402,7405],{},[441,7403,7404],{},"Collections"," trên thanh menu trên cùng:",[433,7407],{"src":7408,"alt":7409,"style":7410},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-dashboard-view.webp","Truy cập bộ sưu tập tùy chỉnh của người dùng cho các địa điểm đã lưu","max-width: 495px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7412,6796,7413,7416],{},[441,7414,7415],{},"+ New list"," để tạo một danh sách mới:",[433,7418],{"src":7419,"alt":7420,"style":7421},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-create-new-list.webp","Tạo danh sách tùy chỉnh trong bộ sưu tập của người dùng","max-width: 269px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7423,6796,7424,7427],{},[441,7425,7426],{},"+ Add a place"," và điền thông tin chi tiết:",[433,7429],{"src":7430,"alt":7431,"style":7432},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-add-place-manually-form.webp","Nhập biểu mẫu thủ công để đưa địa điểm vào danh sách bộ sưu tập tùy chỉnh","max-width: 271px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7434,7435,7438],{},[441,7436,7437],{},"Lưu ý:"," thanh tìm kiếm bên trong hộp thoại \"Add a place\" dường như chưa hoạt động tốt, vì vậy bạn cần phải nhập các thông tin chi tiết theo cách thủ công.",[430,7440,7441],{},"Nếu các địa điểm có sẵn tọa độ địa lý, chúng sẽ được hiển thị trực tiếp trên bản đồ:",[433,7443],{"src":7444,"alt":7445,"style":7446},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-map-places-display.webp","Trực quan hóa các địa điểm trong bộ sưu tập trên bản đồ tương tác","max-width: 592px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7448,7449,7450,899],{},"Để sắp xếp các địa điểm bằng nhãn dán (labels), hãy nhấp vào biểu tượng ",[441,7451,7452],{},"hộp kiểm (tick-box)",[433,7454],{"src":7455,"alt":7456,"style":7457},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-select-places-tickbox.webp","Chế độ chọn để gắn nhãn hàng loạt cho các địa điểm đã lưu","max-width: 662px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7459,7460,7461,899],{},"Chọn các địa điểm muốn nhóm lại, sau đó nhấp vào ",[441,7462,7463],{},"Assign label",[433,7465],{"src":7466,"alt":7467,"style":7297},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-group-assign-label.webp","Gán nhãn mô tả cho các địa điểm bộ sưu tập đã chọn",[430,7469,6796,7470,7473],{},[441,7471,7472],{},"Manage labels"," để tiến hành tạo nhãn trước:",[433,7475],{"src":7476,"alt":7477,"style":7478},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-manage-custom-labels.webp","Tạo và quản lý các nhãn tùy chỉnh","max-width: 411px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7480,7481,7482,899],{},"Chọn một nhãn và nhấp vào ",[441,7483,7463],{},[433,7485],{"src":7486,"alt":7487,"style":7111},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-confirm-label-selection.webp","Áp dụng nhãn tùy chỉnh cho các nhóm địa điểm",[2167,7489,7491],{"id":7490},"_54-chi-phí-và-ngân-sách","5.4 Chi phí và ngân sách",[430,7493,7494],{},"Chúng ta có thể thêm các khoản chi tiêu khác cho chuyến đi trên trang 'Costs'.",[433,7496],{"src":7497,"alt":7498,"style":7338},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-budget-overall-expenses-list.webp","Bảng chi phí toàn diện và sổ cái quyết toán số dư",[430,7500,7501],{},"Các khoản thanh toán do các bạn đồng hành chi trả có thể được thêm vào và phân chia ngay trên cùng một trang này.",[430,7503,7504,7505,7508],{},"Bảng quyết toán (settlement panel) áp dụng thuật toán so khớp tham lam (greedy-matching algorithm) để tính toán ",[441,7506,7507],{},"số lượng giao dịch chuyển tiền tối thiểu"," cần thực hiện để phân chia công bằng ai nợ ai, và nợ bao nhiêu.",[889,7510,7512],{"id":7511},"_6-khai-thác-model-context-protocol-mcp-để-lập-kế-hoạch-du-lịch-bằng-ai","6. Khai thác Model Context Protocol (MCP) để lập kế hoạch du lịch bằng AI",[430,7514,7515,7516,7519],{},"TREK tích hợp sẵn một ",[441,7517,7518],{},"server MCP (Model Context Protocol)",", cho phép các tác nhân AI đọc và ghi trực tiếp dữ liệu du lịch của bạn — bao gồm hơn 150 công cụ và 30 tài nguyên quản lý các chuyến đi, địa điểm, ngân sách, danh sách đồ dùng, đặt chỗ và cộng tác.",[2167,7521,7523],{"id":7522},"_61-cloudflare-zero-trust","6.1 Cloudflare Zero Trust",[430,7525,7526,7527,7529,7530,461],{},"Vì TREK hoạt động phía sau mạng lưới bảo mật ",[444,7528,1731],{"href":363},", bạn cần thêm tên miền của mình vào danh sách split tunnels inclusion. Nếu không, bạn sẽ gặp lỗi khi tiến hành xác thực OAuth. Vui lòng tham khảo vấn đề lỗi này trên GitHub: ",[444,7531,7534],{"href":7532,"rel":7533},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fissues\u002F1463",[448],"github issue",[463,7536],{"description":2614,"image":2615,"image-alt":2616,"label":2717,"min-read":7537,"title":1715,"to":363},"10",[433,7539],{"src":7540,"alt":7541,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-zero-trust-split-tunnels-domain.webp","Thêm tên miền tùy chỉnh vào Cloudflare Warp Split Tunnels",[2167,7543,7545],{"id":7544},"_62-claude-desktop","6.2 Claude Desktop",[430,7547,6796,7548,7551,7552],{},[441,7549,7550],{},"+ New Client"," để bắt đầu tạo một AI agent client mới:\n",[433,7553],{"src":7554,"alt":7555,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-register-new-mcp-client.webp","Đăng ký mã thông báo khách tùy chỉnh mới trong cài đặt",[430,7557,7558,7559,7562,7563,899],{},"Chọn tab ",[441,7560,7561],{},"Claude Desktop"," và nhấp vào ",[441,7564,7565],{},"Register Client",[433,7567],{"src":7568,"alt":7569,"style":7570},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-claude-desktop-client-credentials.webp","Tạo thông tin xác thực khách của Claude Desktop","max-width: 354px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7572,7573,7574,7577],{},"Một cặp thông tin bao gồm Client ID và Client Secret sẽ được hiển thị. Hãy sao chép và cất chúng ở nơi an toàn. Sau đó, nhấp vào mục ",[441,7575,7576],{},"Client Configuration"," để hiển thị cấu hình cấu hình MCP:",[433,7579],{"src":7580,"alt":7581,"style":7582},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-client-configuration-block.webp","Lấy khối cấu hình máy chủ MCP định dạng sẵn","max-width: 508px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7584,7585,7586,7589],{},"Trong ứng dụng Claude Desktop, nhấp vào ",[441,7587,7588],{},"Edit Config"," để mở tệp cấu hình máy chủ MCP cục bộ:",[433,7591],{"src":7592,"alt":7593,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-config-json.webp","Chỉnh sửa tệp json cấu hình MCP cục bộ của Claude Desktop",[430,7595,7596],{},"Dán cấu hình của TREK vào, thay thế các phần giữ chỗ bằng thông tin xác thực của bạn:",[933,7598,7600],{"className":2913,"code":7599,"language":2915,"meta":425,"style":425},"  \"mcpServers\": {\n    \"trek\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n        \"--static-oauth-client-info\",\n        \"{\\\"client_id\\\": \\\"\u003Cyour_client_id>\\\", \\\"client_secret\\\": \\\"\u003Cyour_client_secret>\\\"}\"\n      ]\n    }\n  },\n",[495,7601,7602,7616,7629,7651,7665,7677,7688,7699,7744,7749,7754],{"__ignoreMap":425},[941,7603,7604,7607,7610,7612,7614],{"class":943,"line":944},[941,7605,7606],{"class":955},"  \"",[941,7608,7609],{"class":1055},"mcpServers",[941,7611,3693],{"class":955},[941,7613,579],{"class":951},[941,7615,2922],{"class":955},[941,7617,7618,7621,7623,7625,7627],{"class":943,"line":1071},[941,7619,7620],{"class":955},"    \"",[941,7622,6780],{"class":947},[941,7624,3693],{"class":955},[941,7626,899],{"class":955},[941,7628,2952],{"class":955},[941,7630,7631,7634,7637,7639,7641,7643,7646,7648],{"class":943,"line":1078},[941,7632,7633],{"class":955},"      \"",[941,7635,7636],{"class":1051},"command",[941,7638,3693],{"class":955},[941,7640,899],{"class":955},[941,7642,3286],{"class":955},[941,7644,7645],{"class":1055},"npx",[941,7647,3693],{"class":955},[941,7649,7650],{"class":955},",\n",[941,7652,7653,7655,7658,7660,7662],{"class":943,"line":1085},[941,7654,7633],{"class":955},[941,7656,7657],{"class":1051},"args",[941,7659,3693],{"class":955},[941,7661,899],{"class":955},[941,7663,7664],{"class":955}," [\n",[941,7666,7667,7670,7673,7675],{"class":943,"line":1933},[941,7668,7669],{"class":955},"        \"",[941,7671,7672],{"class":1055},"mcp-remote",[941,7674,3693],{"class":955},[941,7676,7650],{"class":955},[941,7678,7679,7681,7684,7686],{"class":943,"line":1938},[941,7680,7669],{"class":955},[941,7682,7683],{"class":1055},"https:\u002F\u002Ftrek.pafor.me\u002Fmcp",[941,7685,3693],{"class":955},[941,7687,7650],{"class":955},[941,7689,7690,7692,7695,7697],{"class":943,"line":1944},[941,7691,7669],{"class":955},[941,7693,7694],{"class":1055},"--static-oauth-client-info",[941,7696,3693],{"class":955},[941,7698,7650],{"class":955},[941,7700,7701,7703,7705,7708,7711,7713,7715,7717,7720,7722,7724,7726,7729,7731,7733,7735,7738,7740,7742],{"class":943,"line":2280},[941,7702,7669],{"class":955},[941,7704,2943],{"class":1055},[941,7706,7707],{"class":951},"\\\"",[941,7709,7710],{"class":1055},"client_id",[941,7712,7707],{"class":951},[941,7714,579],{"class":1055},[941,7716,7707],{"class":951},[941,7718,7719],{"class":1055},"\u003Cyour_client_id>",[941,7721,7707],{"class":951},[941,7723,753],{"class":1055},[941,7725,7707],{"class":951},[941,7727,7728],{"class":1055},"client_secret",[941,7730,7707],{"class":951},[941,7732,579],{"class":1055},[941,7734,7707],{"class":951},[941,7736,7737],{"class":1055},"\u003Cyour_client_secret>",[941,7739,7707],{"class":951},[941,7741,2949],{"class":1055},[941,7743,1965],{"class":955},[941,7745,7746],{"class":943,"line":2291},[941,7747,7748],{"class":955},"      ]\n",[941,7750,7751],{"class":943,"line":2387},[941,7752,7753],{"class":955},"    }\n",[941,7755,7756,7759],{"class":943,"line":2393},[941,7757,7758],{"class":955},"  }",[941,7760,7650],{"class":951},[430,7762,7763,7764,899],{},"Khởi động lại Claude Desktop, khi đó máy chủ TREK sẽ hiển thị trạng thái đã kết nối trong mục ",[441,7765,7766],{},"Local MCP servers",[433,7768],{"src":7769,"alt":7770,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-trek-server-connected.webp","Xác minh trạng thái kết nối TREK đang hoạt động bên trong giao diện Claude",[430,7772,7773],{},"Bây giờ, hãy thử chạy một câu lệnh (prompt):",[433,7775],{"src":7776,"alt":7777,"style":7778},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-natural-language-prompt.webp","Yêu cầu Claude bằng ngôn ngữ tự nhiên để thao tác với dữ liệu du lịch","max-width: 550px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7780,7781],{},"Hãy thử thêm một khoản chi phí bằng ngôn ngữ tự nhiên:",[933,7783,7786],{"className":7784,"code":7785,"language":4646,"meta":425},[4644],"For the West Europe trip, the Grab from KLIA1 to the hotel cost RM115.90 on 26\u002F4\u002F2025. Please add it as an expense without split to the trip.\n",[495,7787,7785],{"__ignoreMap":425},[433,7789],{"src":7790,"alt":7791,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-expense-response.webp","Claude sử dụng các công cụ để tự động ghi lại chi phí",[430,7793,7794,7795,7798],{},"Kiểm tra trang ",[441,7796,7797],{},"Costs",", bạn sẽ thấy chi phí đã được tạo với trạng thái \"No one paid yet\" (Chưa có ai thanh toán) do không có thông tin người chi trả được nhắc đến trong câu lệnh:",[433,7800],{"src":7801,"alt":7802,"style":6754},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-page-mcp-parsed-expense.webp","Xác nhận chi phí AI mới được phân tích cú pháp trong chế độ xem Chi phí",[430,7804,7805],{},"Việc thêm đồ dùng vào danh sách hành lý cũng hoạt động tương tự:",[433,7807],{"src":7808,"alt":7809,"style":7810},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-packing-items.webp","Claude thêm các đồ dùng cần chuẩn bị bằng cách nhập ngôn ngữ tự nhiên","max-width: 631px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7812,7813,7814,7817],{},"Tải lại trang ",[441,7815,7816],{},"Packing List"," và bạn sẽ thấy cả ba vật dụng đã xuất hiện ở đó:",[433,7819],{"src":7820,"alt":7821,"style":7822},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-packing-list-mcp-parsed-items.webp","Xác nhận các đồ dùng mới được phân tích trên trang Danh sách chuẩn bị hành lý","max-width: 312px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2167,7824,7826],{"id":7825},"_63-gemini-cli-đăng-ký-động","6.3 Gemini CLI (Đăng ký động)",[430,7828,7829,7830,7833,7834,899],{},"Gemini CLI hỗ trợ tính năng ",[441,7831,7832],{},"đăng ký động (dynamic registration)",", nghĩa là bạn không cần tạo trước client. Chỉ cần thêm đoạn sau vào ",[495,7835,7836],{},".gemini\u002Fsettings.json",[933,7838,7840],{"className":2913,"code":7839,"language":2915,"meta":425,"style":425},"    \"trek\": {\n      \"httpUrl\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[495,7841,7842,7854,7873,7886,7899,7904],{"__ignoreMap":425},[941,7843,7844,7846,7848,7850,7852],{"class":943,"line":944},[941,7845,7620],{"class":955},[941,7847,6780],{"class":1055},[941,7849,3693],{"class":955},[941,7851,579],{"class":951},[941,7853,2922],{"class":955},[941,7855,7856,7858,7861,7863,7865,7867,7869,7871],{"class":943,"line":1071},[941,7857,7633],{"class":955},[941,7859,7860],{"class":947},"httpUrl",[941,7862,3693],{"class":955},[941,7864,899],{"class":955},[941,7866,3286],{"class":955},[941,7868,7683],{"class":1055},[941,7870,3693],{"class":955},[941,7872,7650],{"class":955},[941,7874,7875,7877,7880,7882,7884],{"class":943,"line":1078},[941,7876,7633],{"class":955},[941,7878,7879],{"class":947},"oauth",[941,7881,3693],{"class":955},[941,7883,899],{"class":955},[941,7885,2952],{"class":955},[941,7887,7888,7890,7893,7895,7897],{"class":943,"line":1085},[941,7889,7669],{"class":955},[941,7891,7892],{"class":1051},"enabled",[941,7894,3693],{"class":955},[941,7896,899],{"class":955},[941,7898,1388],{"class":955},[941,7900,7901],{"class":943,"line":1933},[941,7902,7903],{"class":955},"      }\n",[941,7905,7906],{"class":943,"line":1938},[941,7907,7753],{"class":955},[430,7909,2995,7910,7913,7914,7917,7918],{},[495,7911,7912],{},"gemini"," trong terminal và nhấp vào ",[441,7915,7916],{},"Approve"," khi hộp thoại yêu cầu xác thực xuất hiện:\n",[433,7919],{"src":7920,"alt":7921,"style":7922},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fmcp-client-oauth-authorization-prompt.webp","Phê duyệt quyền truy cập OAuth cho máy chủ TREK MCP","max-width: 488px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7924,7925],{},"Sau đó bắt đầu bằng một câu lệnh đơn giản:",[433,7927],{"src":7928,"alt":7929,"style":7930},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-prompt-itinerary.webp","Yêu cầu Gemini CLI tìm lịch trình du lịch","max-width: 415px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7932],{"src":7933,"alt":7934,"style":7203},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-display-itinerary.webp","Gemini CLI hiển thị thành công thông tin chuyến đi có cấu trúc",[2167,7936,7938],{"id":7937},"_64-kimi-cli-đăng-ký-động","6.4 Kimi CLI (Đăng ký động)",[430,7940,7941,7942,7945,7946,899],{},"Cách tiếp cận tương tự — thêm đoạn cấu hình vào file ",[495,7943,7944],{},"mcp.json"," nằm trong thư mục ",[495,7947,7948],{},"\u002FUsers\u002F\u003Cuser>\u002F.kimi\u002F",[933,7950,7952],{"className":2913,"code":7951,"language":2915,"meta":425,"style":425},"    \"trek\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"auth\": \"oauth\"\n    }\n",[495,7953,7954,7966,7986,8004,8021],{"__ignoreMap":425},[941,7955,7956,7958,7960,7962,7964],{"class":943,"line":944},[941,7957,7620],{"class":955},[941,7959,6780],{"class":1055},[941,7961,3693],{"class":955},[941,7963,579],{"class":951},[941,7965,2922],{"class":955},[941,7967,7968,7970,7973,7975,7977,7979,7982,7984],{"class":943,"line":1071},[941,7969,7633],{"class":955},[941,7971,7972],{"class":947},"type",[941,7974,3693],{"class":955},[941,7976,899],{"class":955},[941,7978,3286],{"class":955},[941,7980,7981],{"class":1055},"http",[941,7983,3693],{"class":955},[941,7985,7650],{"class":955},[941,7987,7988,7990,7992,7994,7996,7998,8000,8002],{"class":943,"line":1078},[941,7989,7633],{"class":955},[941,7991,873],{"class":947},[941,7993,3693],{"class":955},[941,7995,899],{"class":955},[941,7997,3286],{"class":955},[941,7999,7683],{"class":1055},[941,8001,3693],{"class":955},[941,8003,7650],{"class":955},[941,8005,8006,8008,8011,8013,8015,8017,8019],{"class":943,"line":1085},[941,8007,7633],{"class":955},[941,8009,8010],{"class":947},"auth",[941,8012,3693],{"class":955},[941,8014,899],{"class":955},[941,8016,3286],{"class":955},[941,8018,7879],{"class":1055},[941,8020,1965],{"class":955},[941,8022,8023],{"class":943,"line":1933},[941,8024,7753],{"class":955},[430,8026,2995,8027,7913,8030,1377,8032],{},[495,8028,8029],{},"kimi mcp auth trek",[441,8031,7916],{},[433,8033],{"src":7920,"alt":7921,"style":8034},"max-width: 453px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,8036,8037],{},"Sau khi hoàn tất xác thực, danh sách các công cụ có sẵn sẽ được liệt kê:",[433,8039],{"src":8040,"alt":8041,"style":6592},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fkimi-cli-mcp-authorized-tools-list.webp","Kimi CLI hiển thị các công cụ có sẵn sau khi ủy quyền thành công",[889,8043,8045],{"id":8044},"_7-trải-nghiệm-trên-thiết-bị-di-động","7. Trải nghiệm trên thiết bị di động",[430,8047,8048],{},"TREK là một Ứng dụng Web Lũy tiến (PWA) trên các thiết bị di động. Một service worker sẽ lưu bộ nhớ đệm (cache) cho các phần bản đồ và dữ liệu API, giúp lịch trình của bạn luôn có thể đọc được ngay cả khi ngoại tuyến (offline). Tuy nhiên, tính năng thông báo đẩy có thể gặp một chút độ trễ so với ứng dụng gốc (native app).\"",[889,8050,6168],{"id":6167},[430,8052,8053],{},"Kết nối các tác nhân AI thông qua giao thức MCP giúp giảm thiểu phần lớn công việc tẻ nhạt khi nhập dữ liệu đặt chỗ chuyến bay và chỗ ở. Ngoài ra, các tác nhân cũng có thể đề xuất các địa điểm tham quan thú vị dựa trên ngày du lịch và mùa cụ thể trong năm của bạn. Chỉ với một cuộc hội thoại duy nhất với một AI agent, bạn có thể xử lý toàn bộ quy trình, từ tìm kiếm nghiên cứu, xây dựng lịch trình cho đến theo dõi ngân sách và sắp xếp hành lý.",[430,8055,8056],{},"Tuy nhiên, ứng dụng vẫn tồn tại một số lỗi kỹ thuật nhỏ. Ví dụ: khi nhập dữ liệu đặt chỗ từ tệp PDF, đơn vị tiền tệ sẽ tự động đặt mặc định theo đồng tiền gốc của chuyến đi thay vì đơn vị tiền tệ thực tế đã thanh toán. Ngoài ra, khi tạo một danh sách mới trong Collections, bất kỳ ảnh bìa nào được thêm vào trong quá trình tạo đều sẽ biến mất sau khi lưu, mặc dù bạn hoàn toàn có thể tự đính kèm lại một cách thủ công khi chỉnh sửa.",[430,8058,8059,8060,8065],{},"Bên cạnh đó, việc tự lưu trữ cũng tạo ra một rào cản kỹ thuật nhỏ khi bạn cần phải vận hành nó trên máy chủ của riêng mình. TREK được thiết kế chủ yếu dành cho những người đi du lịch thường xuyên và có kỳ vọng rất cao về cách họ quản lý và tổ chức dữ liệu du lịch của mình. Chúng tôi khuyên bạn nên thử nghiệm bản demo chính thức tại ",[444,8061,8064],{"href":8062,"rel":8063},"https:\u002F\u002Fdemo.liketrek.com\u002F",[448],"demo.liketrek.com"," trước khi quyết định tự host.",[889,8067,1620],{"id":1619},[485,8069,8070,8077,8084],{},[488,8071,8072],{},[444,8073,8076],{"href":8074,"rel":8075},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FQuick-Start",[448],"TREK Quick Start",[488,8078,8079],{},[444,8080,8083],{"href":8081,"rel":8082},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FTroubleshooting",[448],"TREK Troubleshooting",[488,8085,8086],{},[444,8087,8090],{"href":8088,"rel":8089},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FMCP-Scopes",[448],"TREK MCP Scopes",[1648,8092,8093],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":425,"searchDepth":1071,"depth":1078,"links":8095},[8096,8101,8102,8112,8120,8126,8132,8133,8134],{"id":6286,"depth":1078,"text":6287,"children":8097},[8098,8099,8100],{"id":6290,"depth":1085,"text":6291},{"id":6436,"depth":1085,"text":6437},{"id":6468,"depth":1085,"text":6469},{"id":6613,"depth":1078,"text":6614},{"id":6656,"depth":1078,"text":6657,"children":8103},[8104,8105,8106,8107,8108,8109,8110,8111],{"id":6757,"depth":1085,"text":6758},{"id":6768,"depth":1085,"text":6769},{"id":6869,"depth":1085,"text":6870},{"id":6889,"depth":1085,"text":6890},{"id":6924,"depth":1085,"text":6925},{"id":6945,"depth":1085,"text":6946},{"id":6962,"depth":1085,"text":6963},{"id":6973,"depth":1085,"text":6974},{"id":7003,"depth":1078,"text":7004,"children":8113},[8114,8115,8116,8117,8118,8119],{"id":7010,"depth":1085,"text":7011},{"id":7044,"depth":1085,"text":7045},{"id":7114,"depth":1085,"text":7115},{"id":7136,"depth":1085,"text":7137},{"id":7155,"depth":1085,"text":7156},{"id":7180,"depth":1085,"text":7181},{"id":7211,"depth":1078,"text":7212,"children":8121},[8122,8123,8124,8125],{"id":7231,"depth":1085,"text":7232},{"id":7329,"depth":1085,"text":7330},{"id":7391,"depth":1085,"text":7392},{"id":7490,"depth":1085,"text":7491},{"id":7511,"depth":1078,"text":7512,"children":8127},[8128,8129,8130,8131],{"id":7522,"depth":1085,"text":7523},{"id":7544,"depth":1085,"text":7545},{"id":7825,"depth":1085,"text":7826},{"id":7937,"depth":1085,"text":7938},{"id":8044,"depth":1078,"text":8045},{"id":6167,"depth":1078,"text":6168},{"id":1619,"depth":1078,"text":1620},[8136,1668],"travel","2026-09-01","Tìm hiểu cách triển khai TREK với Docker, bảo mật qua Cloudflare R2 và Caddy, đồng thời sử dụng các tác nhân AI qua MCP để lập kế hoạch du lịch liền mạch.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002FVI-Self-hosted-travel-planner-TREK.webp","Ảnh minh họa 3D tối giản cao cấp về bảng điều khiển du lịch tự lưu trữ TREK trên nền giấy da ấm áp.",{"schemaOrg":8142,"robots":1702,"sitemap":8146},[8143,8144],{"@type":1681,"headline":6272,"description":8138},{"@type":4091,"headline":8145,"description":8138},"Cách tự host TREK: Trình lên kế hoạch du lịch AI tốt nhất",{"lastmod":8137},{"title":8145,"description":8138,"ogTitle":6272,"ogDescription":8138,"twitterTitle":6272,"twitterDescription":8138},"vi\u002Farticle\u002Fself-hosted-travel-planner-trek",[6266,8150,6267,6268,6955],"TREK","OaVc2953r8KK1STCJIu9QaiDbBUH-OlsozrztOE9Zwg",{"id":8153,"title":8154,"author":425,"body":8155,"category":8709,"date":8710,"description":8711,"extension":1673,"image":8712,"imageAlt":8713,"isPublished":1074,"meta":8714,"minRead":1938,"navigation":1074,"path":289,"seo":8718,"stem":8720,"tags":8721,"updatedAt":1711,"__hash__":8725},"article\u002Fvi\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts.md","Cách kỹ năng Agent AI thay thế script khởi tạo ứng dụng Nuxt",{"type":427,"value":8156,"toc":8702},[8157,8171,8175,8178,8274,8277,8305,8311,8315,8330,8347,8351,8362,8523,8527,8609,8613,8621,8641,8648,8663,8674,8677,8683,8686,8691,8699],[430,8158,8159,8160,575,8163,8166,8167,8170],{},"Khi bắt đầu một ứng dụng mới bằng framework Nuxt, chúng ta phải trải qua các bước tẻ nhạt như cài đặt các module và thiết lập các cấu hình như ",[495,8161,8162],{},"nuxt.config.ts",[495,8164,8165],{},"wrangler.jsonc",". Một đoạn script có thể giải quyết vấn đề này, nhưng nó sẽ chạm giới hạn khi các biến thể yêu cầu ngày càng tăng. Đây là lý do tại sao chúng tôi đã tìm hiểu và thay thế các script truyền thống bằng một ",[441,8168,8169],{},"kỹ năng của agent"," (agent skill).",[474,8172,8174],{"id":8173},"những-gì-mà-script-shell-truyền-thống-làm-tốt","Những gì mà Script Shell truyền thống làm tốt",[430,8176,8177],{},"Một script rất giỏi trong việc thực thi một tập hợp các hướng dẫn cố định theo trình tự với các quyết định được viết cứng (hardcode) trong mã nguồn.",[933,8179,8181],{"className":1042,"code":8180,"language":1044,"meta":425,"style":425},"#!\u002Fusr\u002Fbin\u002Fenv bash\nset -e\n\nnpx nuxi@latest init \"$1\" --template minimal --packageManager pnpm --no-gitInit -M @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n\ncd \"$1\"\n\ncp ~\u002Ftemplates\u002Fnuxt.config.ts .\ncp ~\u002Ftemplates\u002Fwrangler.jsonc .\n",[495,8182,8183,8188,8195,8199,8238,8242,8252,8256,8265],{"__ignoreMap":425},[941,8184,8185],{"class":943,"line":944},[941,8186,8187],{"class":1081},"#!\u002Fusr\u002Fbin\u002Fenv bash\n",[941,8189,8190,8193],{"class":943,"line":1071},[941,8191,8192],{"class":972},"set",[941,8194,5209],{"class":1055},[941,8196,8197],{"class":943,"line":1078},[941,8198,1075],{"emptyLinePlaceholder":1074},[941,8200,8201,8203,8206,8209,8211,8215,8217,8220,8223,8226,8229,8232,8235],{"class":943,"line":1085},[941,8202,7645],{"class":1051},[941,8204,8205],{"class":1055}," nuxi@latest",[941,8207,8208],{"class":1055}," init",[941,8210,3286],{"class":955},[941,8212,8214],{"class":8213},"sHdIc","$1",[941,8216,3693],{"class":955},[941,8218,8219],{"class":1055}," --template",[941,8221,8222],{"class":1055}," minimal",[941,8224,8225],{"class":1055}," --packageManager",[941,8227,8228],{"class":1055}," pnpm",[941,8230,8231],{"class":1055}," --no-gitInit",[941,8233,8234],{"class":1055}," -M",[941,8236,8237],{"class":1055}," @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n",[941,8239,8240],{"class":943,"line":1933},[941,8241,1075],{"emptyLinePlaceholder":1074},[941,8243,8244,8246,8248,8250],{"class":943,"line":1938},[941,8245,2824],{"class":972},[941,8247,3286],{"class":955},[941,8249,8214],{"class":8213},[941,8251,1965],{"class":955},[941,8253,8254],{"class":943,"line":1944},[941,8255,1075],{"emptyLinePlaceholder":1074},[941,8257,8258,8260,8263],{"class":943,"line":2280},[941,8259,2841],{"class":1051},[941,8261,8262],{"class":1055}," ~\u002Ftemplates\u002Fnuxt.config.ts",[941,8264,4905],{"class":1055},[941,8266,8267,8269,8272],{"class":943,"line":2291},[941,8268,2841],{"class":1051},[941,8270,8271],{"class":1055}," ~\u002Ftemplates\u002Fwrangler.jsonc",[941,8273,4905],{"class":1055},[430,8275,8276],{},"Script này hoạt động tốt cho đến khi các vấn đề sau xảy ra:",[485,8278,8279,8285,8295],{},[488,8280,8281,8284],{},[441,8282,8283],{},"Các giá trị mặc định cố định."," Đoạn script hardcode module Nuxt UI; điều gì xảy ra nếu chúng ta muốn dùng module Ant Design UI? Mỗi tùy chọn module mới lại yêu cầu một đối số (argument) khác từ người dùng.",[488,8286,8287,8290,8291,8294],{},[441,8288,8289],{},"Không thể đọc được ý định của người dùng."," Yêu cầu \"Xây dựng cho tôi một trang blog\" cần ",[495,8292,8293],{},"@nuxt\u002Fcontent","; \"xây dựng cho tôi một trang web có bản tin (newsletter)\" cần Cloudflare D1 + Drizzle. Script không thể phân biệt được sự khác biệt này — mỗi biến thể lại cần một script mới.",[488,8296,8297,8300,8301,8304],{},[441,8298,8299],{},"Trở nên lỗi thời một cách lặng lẽ."," Các quy ước của Nuxt thay đổi giữa các phiên bản lớn. Nuxt 4 đã thay đổi thư mục nguồn thành ",[495,8302,8303],{},"app\u002F",". Một đoạn script được viết cho Nuxt 3 sẽ âm thầm khởi tạo (scaffold) sai cấu trúc thư mục mà không bao giờ cảnh báo cho người dùng.",[430,8306,8307,8310],{},[441,8308,8309],{},"Khởi tạo ứng dụng"," (app scaffolding) là một vấn đề về mặt quyết định chứ không phải thực thi. Đoạn script sẽ không thể mở rộng khi số lượng quyết định tăng lên.",[474,8312,8314],{"id":8313},"tại-sao-nên-sử-dụng-kỹ-năng-agent-ai-thay-vì-script-truyền-thống","Tại sao nên sử dụng Kỹ năng Agent AI thay vì Script truyền thống?",[430,8316,8317,8318,8321,8322,8325,8326,8329],{},"Kỹ năng của agent (agent skill) không phải là một tập hợp mã nguồn để thực thi, mà là một ",[441,8319,8320],{},"tập hợp kiến thức mà agent AI sẽ tuân theo",". Nó chứa tệp ",[495,8323,8324],{},"SKILL.md"," và có thể đóng gói bất kỳ tệp nào khác mà tác vụ yêu cầu (như tài liệu tham khảo, mẫu template và các script thực thi). Bài viết ",[444,8327,8328],{"href":351},"Kỹ năng của Agent AI: Chúng là gì và cách tạo lập chi tiết"," giải thích chi tiết cách thức hoạt động của một kỹ năng agent. Một kỹ năng giữ nguyên sự chuẩn xác của một đoạn script đồng thời bổ sung thêm các đánh giá hợp lý mà script còn thiếu:",[485,8331,8332,8335,8338,8341,8344],{},[488,8333,8334],{},"Suy luận ra ý định của người dùng để quyết định xem ứng dụng có cần cơ sở dữ liệu hay không.",[488,8336,8337],{},"Quyết định xem module tùy chọn nào là cần thiết từ danh sách được chỉ định. Ví dụ: Nuxt Content, i18n và công cụ phân tích là các tùy chọn bổ sung theo yêu cầu người dùng.",[488,8339,8340],{},"Thích ứng với hệ sinh thái hiện tại bằng cách sử dụng framework Nuxt mới nhất, NuxtHub cho các liên kết Cloudflare và Wrangler để triển khai (deploy).",[488,8342,8343],{},"Tự phục hồi khi một bước thực hiện bị thất bại.",[488,8345,8346],{},"Xác minh lại thông qua một danh sách kiểm tra (checklist) cuối cùng trước khi bàn giao dự án cho người dùng.",[474,8348,8350],{"id":8349},"đằng-sau-hậu-trường-của-kỹ-năng-scaffolding-nuxt-cloudflare-của-chúng-tôi","Đằng sau hậu trường của Kỹ năng Scaffolding Nuxt & Cloudflare của chúng tôi",[430,8352,8353,8354,8361],{},"Kỹ năng ",[444,8355,8358],{"href":8356,"rel":8357},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill",[448],[495,8359,8360],{},"scaffold-nuxt-cloudflare-app-skill"," dẫn dắt qua một quy trình khởi tạo hướng tới môi trường sản xuất (production):",[533,8363,8364,8394,8414,8438,8468,8503,8509],{},[488,8365,8366,8369,8370],{},[441,8367,8368],{},"Làm rõ bất kỳ điều gì"," không thể tự động suy luận:\n",[485,8371,8372,8382,8385],{},[488,8373,8374,8375,1527,8378,8381],{},"UI kit (mặc định là ",[441,8376,8377],{},"Nuxt UI",[441,8379,8380],{},"Antdv Next",");",[488,8383,8384],{},"Có cần cơ sở dữ liệu hay không (chẳng hạn như Cloudflare D1);",[488,8386,8387,8388,1527,8391,8393],{},"Các module bổ sung như ",[495,8389,8390],{},"@nuxtjs\u002Fi18n",[495,8392,8293],{}," cho các tính năng CMS.",[488,8395,8396,8399,8400,8403,8404,8406,8407,8410,8411,461],{},[441,8397,8398],{},"Khởi tạo ứng dụng cơ bản"," bằng lệnh ",[495,8401,8402],{},"pnpm dlx nuxi@latest init"," để lấy phiên bản mới nhất của framework Nuxt với ",[495,8405,3584],{}," làm trình quản lý gói. Sau đó, nó thiết lập danh sách cho phép build gốc (native-build allowlists) để môi trường build của Cloudflare có thể biên dịch ",[495,8408,8409],{},"better-sqlite3","\u002F",[495,8412,8413],{},"sharp",[488,8415,8416,579,8419,1527,8422,753,8425,753,8428,753,8431,753,8434,8437],{},[441,8417,8418],{},"Cài đặt các module từ bảng quyết định",[495,8420,8421],{},"@nuxt\u002Fui",[495,8423,8424],{},"@antdv-next\u002Fnuxt",[495,8426,8427],{},"@nuxt\u002Fimage",[495,8429,8430],{},"@nuxtjs\u002Fseo",[495,8432,8433],{},"@nuxthub\u002Fcore",[495,8435,8436],{},"@vueuse\u002Fnuxt",", cộng với Drizzle\u002FD1, Nuxt Content và i18n chỉ khi được chọn.",[488,8439,8440,1377,8443],{},[441,8441,8442],{},"Bố trí cấu trúc thư mục",[485,8444,8445,8450,8455,8460,8465],{},[488,8446,8447,8449],{},[495,8448,8303],{}," (chuẩn Nuxt 4)",[488,8451,8452],{},[495,8453,8454],{},"server\u002F",[488,8456,8457],{},[495,8458,8459],{},"shared\u002F",[488,8461,8462],{},[495,8463,8464],{},"tests\u002F",[488,8466,8467],{},"các tệp cấu hình ở thư mục gốc.",[488,8469,8470,1377,8475],{},[441,8471,8472,8473],{},"Cấu hình ",[495,8474,8162],{},[485,8476,8477,8486,8493,8498],{},[488,8478,8479,8410,8482,8485],{},[495,8480,8481],{},"site.url",[495,8483,8484],{},"site.name"," cho SEO",[488,8487,8488,8489,8492],{},"Khối ",[495,8490,8491],{},"hub"," của NuxtHub cho Cloudflare",[488,8494,8495],{},[495,8496,8497],{},"routeRules",[488,8499,8500],{},[495,8501,8502],{},"compatibilityDate",[488,8504,8505],{},[441,8506,8472,8507],{},[495,8508,8165],{},[488,8510,8511,8514,8515,8518,8519,8522],{},[441,8512,8513],{},"Thiết lập Vitest và ESLint",", sau đó chạy ",[441,8516,8517],{},"checklist cuối cùng"," bao gồm ",[495,8520,8521],{},"pnpm install && pnpm dev"," trước khi hoàn thành công việc.",[474,8524,8526],{"id":8525},"script-shell-vs-kỹ-năng-agent-ai-so-sánh-trực-tiếp","Script Shell vs Kỹ năng Agent AI: So sánh trực tiếp",[603,8528,8529,8541],{},[606,8530,8531],{},[609,8532,8533,8535,8538],{},[612,8534],{},[612,8536,8537],{},"Script",[612,8539,8540],{},"Kỹ năng",[621,8542,8543,8554,8565,8576,8587,8598],{},[609,8544,8545,8548,8551],{},[626,8546,8547],{},"Ý định của người dùng",[626,8549,8550],{},"❌ giá trị mặc định cố định",[626,8552,8553],{},"✅ thích ứng theo yêu cầu",[609,8555,8556,8559,8562],{},[626,8557,8558],{},"Ra quyết định",[626,8560,8561],{},"chỉ khi lập trình sẵn flag",[626,8563,8564],{},"✅ đánh giá tại thời điểm chạy",[609,8566,8567,8570,8573],{},[626,8568,8569],{},"Thay đổi phiên bản",[626,8571,8572],{},"viết lại thủ công",[626,8574,8575],{},"✅ kiểm tra trạng thái hiện tại",[609,8577,8578,8581,8584],{},[626,8579,8580],{},"Khắc phục lỗi",[626,8582,8583],{},"dừng hoạt động",[626,8585,8586],{},"✅ sửa lỗi và tiếp tục",[609,8588,8589,8592,8595],{},[626,8590,8591],{},"Xác minh kết quả",[626,8593,8594],{},"❌",[626,8596,8597],{},"✅ checklist cuối cùng",[609,8599,8600,8603,8606],{},[626,8601,8602],{},"Chi phí bảo trì",[626,8604,8605],{},"phình to flag, cập nhật phiên bản",[626,8607,8608],{},"chỉnh sửa Markdown, không sửa code",[474,8610,8612],{"id":8611},"cách-cài-đặt-kỹ-năng-agent-ai-bằng-cli-npx-skills","Cách cài đặt Kỹ năng Agent AI bằng CLI npx skills",[430,8614,8615,8616,899],{},"Cài đặt cực kỳ đơn giản chỉ với một lệnh duy nhất bằng ",[444,8617,8620],{"href":8618,"rel":8619},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fskills",[448],"skills CLI",[933,8622,8624],{"className":1042,"code":8623,"language":1044,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git -g\n",[495,8625,8626],{"__ignoreMap":425},[941,8627,8628,8630,8633,8635,8638],{"class":943,"line":944},[941,8629,7645],{"class":1051},[941,8631,8632],{"class":1055}," skills",[941,8634,1065],{"class":1055},[941,8636,8637],{"class":1055}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git",[941,8639,8640],{"class":1055}," -g\n",[430,8642,8643,8644],{},"CLI sẽ clone repo, tìm kỹ năng và hỏi xem nên áp dụng cho agent nào trong số 77 agent được hỗ trợ:\n",[433,8645],{"alt":8646,"src":8647},"Giao diện dòng lệnh hiển thị quá trình cài đặt kỹ năng scaffolding Nuxt bằng câu lệnh CLI npx skills add","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-add-scaffold-nuxt-installation.webp",[430,8649,8650,8651,8654,8655,8658,8659],{},"Chúng tôi chọn ",[441,8652,8653],{},"Symlink"," (phương pháp được đề xuất), phương pháp này cài đặt kỹ năng một lần duy nhất vào thư mục ",[495,8656,8657],{},"~\u002F.agents\u002Fskills"," và liên kết tất cả các agent được chọn tới bản sao duy nhất này.\n",[433,8660],{"alt":8661,"src":8662},"Màn hình terminal hiển thị tóm tắt cài đặt và thiết lập symlink cho các kỹ năng agent tập trung","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-installation-summary-details.webp",[485,8664,8665],{},[488,8666,8667],{},[909,8668,8669,8670,8673],{},"Vui lòng tham khảo bài viết này, ",[444,8671,8672],{"href":359},"Giải quyết sự phân mảnh kỹ năng của Agent AI với npx skills",", để biết cách tập trung hóa các kỹ năng của agent vào một nguồn sự thật duy nhất (source of truth).",[430,8675,8676],{},"Mở Claude Code sẽ xác nhận kỹ năng đã được cài đặt thành công.",[430,8678,8679],{},[433,8680],{"alt":8681,"src":8682},"Giao diện dòng lệnh Claude Code hiển thị lệnh gạch chéo scaffold-nuxt mới được cài đặt, đang hoạt động và sẵn sàng sử dụng","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fclaude-code-scaffold-nuxt-slash-command-active.webp",[430,8684,8685],{},"Từ đó, một câu lệnh bằng ngôn ngữ tự nhiên là tất cả những gì bạn cần:",[2514,8687,8688],{},[430,8689,8690],{},"\"Scaffold a new Nuxt app deployed to Cloudflare Workers — Nuxt UI, a blog section, and a D1 database\"",[430,8692,8693,8694,8698],{},"Kỹ năng này hoàn toàn là mã nguồn mở; hãy truy cập ",[444,8695,8697],{"href":8356,"rel":8696},[448],"repo GitHub"," và trải nghiệm thử nhé.",[1648,8700,8701],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":425,"searchDepth":1071,"depth":1078,"links":8703},[8704,8705,8706,8707,8708],{"id":8173,"depth":1071,"text":8174},{"id":8313,"depth":1071,"text":8314},{"id":8349,"depth":1071,"text":8350},{"id":8525,"depth":1071,"text":8526},{"id":8611,"depth":1071,"text":8612},[1668],"2026-08-25","Khởi tạo Nuxt trên Cloudflare Workers dễ dàng. Tìm hiểu lý do tại sao chúng tôi thay thế shell script bằng kỹ năng Agent AI và cách cài đặt qua npx skills.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002FVI-How-AI-Agent-Skills-Replace-Nuxt-App-Scaffolding-Scripts.webp","Khởi tạo Nuxt trên Cloudflare: Shell Script vs Kỹ năng AI - So sánh script shell truyền thống với kỹ năng Agent AI thông minh.",{"schemaOrg":8715,"robots":1702,"sitemap":8717},[8716],{"@type":1679,"headline":8154,"description":8711,"image":8712},{"lastmod":8710},{"title":8719,"description":8711,"ogTitle":8154,"ogDescription":8711,"twitterTitle":8154,"twitterDescription":8711},"Khởi tạo Nuxt trên Cloudflare: Shell Script vs Kỹ năng AI","vi\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",[8722,6268,8723,8724],"Nuxt","AI Agent","Scaffolding","iLBYG2BUUfqE4EYnr7uB_-yd-WlwdGymPwL0-YvZNsI",{"id":8727,"title":8728,"author":1711,"body":8729,"category":9491,"date":9493,"description":9494,"extension":1673,"image":9495,"imageAlt":9496,"isPublished":1074,"meta":9497,"minRead":2393,"navigation":1074,"path":313,"seo":9502,"stem":9503,"tags":9504,"updatedAt":1711,"__hash__":9506},"article\u002Fvi\u002Farticle\u002Fuse-cloudflare-as-ai-memory.md","Xây dựng hệ thống bộ nhớ AI vĩnh viễn trên Cloudflare",{"type":427,"value":8730,"toc":9473},[8731,8735,8738,8741,8745,8748,8762,8766,8773,8787,8790,8793,8837,8841,8923,8927,8952,9049,9060,9064,9069,9109,9133,9137,9142,9209,9214,9218,9251,9257,9295,9299,9331,9335,9343,9347,9377,9381,9421,9425,9428,9431,9434,9436,9470],[474,8732,8734],{"id":8733},"tầm-quan-trọng-của-bộ-nhớ-ai-vĩnh-viễn-đối-với-agent","Tầm quan trọng của bộ nhớ AI vĩnh viễn đối với Agent",[430,8736,8737],{},"Khi các trợ lý ảo AI ngày càng tích hợp sâu rộng vào đời sống và công việc hàng ngày, chúng ta thường xuyên đối mặt với vấn đề \"ngữ cảnh trống\" (blank context). Các quyết định hoặc thông tin trao đổi từ tuần trước đều bị lãng quên, buộc chúng ta phải nhập lại cùng một thông tin về stack công nghệ và cấu hình lại các tùy chọn người dùng cho mỗi phiên làm việc mới.",[430,8739,8740],{},"Thay vì phải bắt đầu lại từ con số không mỗi lần trò chuyện, chúng ta cần xây dựng một hệ thống bộ nhớ có khả năng tự tiến hóa, liên tục thấu hiểu các quyết định của người dùng và loại bỏ hoàn toàn việc lặp lại ngữ cảnh không cần thiết.",[474,8742,8744],{"id":8743},"so-sánh-hệ-thống-bộ-nhớ-ai-tự-host-và-bộ-nhớ-tích-hợp","So sánh hệ thống bộ nhớ AI tự host và bộ nhớ tích hợp",[430,8746,8747],{},"Nhiều Agent AI hiện nay đi kèm với bộ nhớ tích hợp sẵn, nhưng thực tế chúng ta ít khi chỉ dùng duy nhất một Agent cho mọi công việc. Chúng ta dùng Claude để thiết kế và xây dựng kiến trúc dự án; dùng Kimi để lập trình; và dùng ChatGPT để nghiên cứu chuyên sâu. Ngữ cảnh không thể chia sẻ chéo giữa các Agent này; chúng hoàn toàn bị cô lập trong từng công cụ riêng biệt.",[430,8749,8750,8751,8756,8757,8761],{},"Từ góc độ kỹ thuật phần mềm, chúng ta không tin tưởng vào các hệ thống đóng (black boxes). Chúng ta cần một hệ thống bộ nhớ AI có thể quan sát, kiểm tra và hoàn toàn nằm dưới quyền kiểm soát của mình. Dự án mã nguồn mở ",[444,8752,8755],{"href":8753,"rel":8754},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[448],"Second Brain",", một bản fork từ ",[444,8758,8759],{"href":8759,"rel":8760},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare",[448],", cung cấp một hệ thống bộ nhớ vĩnh viễn và tự host với sự hỗ trợ đầy đủ cho Model Context Protocol (MCP). Bất kỳ Agent AI nào tương thích như Claude, ChatGPT hoặc Kimi Code đều có thể dùng chung một ngữ cảnh bộ nhớ thống nhất này.",[474,8763,8765],{"id":8764},"cách-xây-dựng-bộ-nhớ-ai-second-brain-trên-cloudflare","Cách xây dựng bộ nhớ AI Second Brain trên Cloudflare",[430,8767,8768,8769,8772],{},"Hệ thống bộ nhớ Second Brain được triển khai trên nền tảng ",[441,8770,8771],{},"Cloudflare Workers",", cung cấp một cơ sở hạ tầng serverless phân tán toàn cầu với độ trễ cực kỳ thấp. Điều này đảm bảo rằng các thao tác tìm kiếm bộ nhớ (recall) và lưu trữ diễn ra gần như tức thì trong vòng lặp tư duy của AI.",[430,8774,8775,8776,8779,8780,8783,8784,8786],{},"Mô hình embedding từ ",[441,8777,8778],{},"Workers AI"," được sử dụng để tạo ra các vector sém thức. Các embedding này được lưu trữ trong ",[441,8781,8782],{},"Cloudflare Vectorize",", một cơ sở dữ liệu vector phân tán toàn cầu được tối ưu hóa cao. ",[441,8785,8782],{}," sẽ thực hiện các truy vấn tìm kiếm độ tương đồng cosine (cosine similarity) để xác định chính xác các ký ức có liên quan về mặt ngữ nghĩa.",[430,8788,8789],{},"Second Brain cũng tích hợp sẵn cơ chế chống trùng lặp và hợp nhất thông minh. Các nội dung có độ tương đồng dưới 85% sẽ được lưu trực tiếp; nếu không, chúng sẽ bị chặn hoặc đánh dấu là đối tượng trùng lặp tiềm năng. Các đoạn văn bản dài vượt quá 1.600 ký tự sẽ được cắt nhỏ dựa trên ranh giới câu hoặc dấu xuống dòng, giữ lại phần chồng lấp (overlap) 200 ký tự để duy trì tính liên tục của ngữ cảnh. Mỗi mảnh nhỏ sau đó được vector hóa để đảm bảo độ khớp chính xác cao nhất.",[430,8791,8792],{},"Các công cụ sau đây được cấu hình dưới dạng giao diện MCP để các Agent AI gọi trực tiếp:",[485,8794,8795,8801,8807,8813,8819,8825,8831],{},[488,8796,8797,8800],{},[495,8798,8799],{},"remember",": Lưu trữ ý tưởng, quyết định, sở thích và ngữ cảnh dự án nói chung.",[488,8802,8803,8806],{},[495,8804,8805],{},"append",": Thêm thông tin cập nhật mới vào một ký ức đã có.",[488,8808,8809,8812],{},[495,8810,8811],{},"update",": Thay thế hoàn toàn một ký ức hiện tại.",[488,8814,8815,8818],{},[495,8816,8817],{},"recall",": Tìm kiếm ký ức dựa trên ý nghĩa sém nghĩa của chúng thay vì so khớp từ khóa chính xác.",[488,8820,8821,8824],{},[495,8822,8823],{},"list_recent",": Liệt kê các ký ức vừa được lưu gần đây.",[488,8826,8827,8830],{},[495,8828,8829],{},"forget",": Xóa vĩnh viễn một bản ghi ký ức.",[488,8832,8833,8836],{},[495,8834,8835],{},"link\u002Fconnections",": Kết nối các ký ức có liên quan với nhau (tính năng đồ thị v2).",[889,8838,8840],{"id":8839},"cài-đặt-second-brain-trên-cloudflare","Cài đặt Second Brain trên Cloudflare",[533,8842,8843,8861,8868,8875,8882,8889,8900,8906,8909,8916],{},[488,8844,8845,8846,8849,8850,8855,8856,8860],{},"Click vào ",[495,8847,8848],{},"Deploy to Cloudflare"," trên trang ",[444,8851,8854],{"href":8852,"rel":8853},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[448],"Github repo",". [[",[433,8857],{"alt":8858,"src":8859},"Trang GitHub hiển thị nổi bật nút Deploy to Cloudflare","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fdeploy-to-cloudflare-button.webp","]]",[488,8862,8863,8864],{},"Điền đầy đủ thông tin vào form Cloudflare Worker hiển thị.\n",[433,8865],{"alt":8866,"src":8867},"Biểu mẫu cấu hình triển khai Cloudflare Workers","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-deployment-form.webp",[488,8869,8870,8871],{},"Nhập '384' cho Dimensions; chọn 'cosine' cho Metric; và click nút Deploy.\n",[433,8872],{"alt":8873,"src":8874},"Màn hình cấu hình tạo cơ sở dữ liệu Cloudflare Vectorize","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-vectorize-configuration.webp",[488,8876,8877,8878],{},"Dưới đây là tổng quan giao diện Second Brain của bạn trong Cloudflare Worker:\n",[433,8879],{"alt":8880,"src":8881},"Bảng điều khiển tổng quan của Second Brain worker đã triển khai","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-second-brain-overview.webp",[488,8883,8884,8885],{},"Mở tab 'Settings', sau đó click vào biểu tượng chỉnh sửa ở biến 'AUTH_TOKEN' để tạo một token bảo mật:\n",[433,8886],{"alt":8887,"src":8888},"Cấu hình biến của Cloudflare Worker làm nổi bật AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-settings.webp",[488,8890,8891,8892,8896],{},"Click vào link 'Rotate' để có thể nhập giá trị mới: ",[433,8893],{"alt":8894,"src":8895},"Màn hình chỉnh sửa và luân chuyển biến AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-rotate.webp",[433,8897],{"alt":8898,"src":8899},"Nhập chuỗi ngẫu nhiên đã tạo vào trường giá trị AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-value-input.webp",[488,8901,2995,8902,8905],{},[495,8903,8904],{},"openssl rand -base64 32"," tại terminal macOS để tạo một chuỗi ngẫu nhiên bảo mật và dán vào trường nhập liệu 'Value'.",[488,8907,8908],{},"Click nút 'Deploy' để lưu giá trị mới của biến 'AUTH_TOKEN'.",[488,8910,8911,8912],{},"Mở URL worker Second Brain của bạn trên trình duyệt web.\n",[433,8913],{"alt":8914,"src":8915},"Màn hình đăng nhập Web UI của Second Brain với trường nhập Bearer Token","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-login.webp",[488,8917,8918,8919,8922],{},"Nhập token 'AUTH_TOKEN' đã tạo vào ô ",[495,8920,8921],{},"Bearer token"," và click nút 'Connect' để đăng nhập vào bảng điều khiển Web UI.",[889,8924,8926],{"id":8925},"tích-hợp-claude-desktop-qua-giao-thức-mcp","Tích hợp Claude Desktop qua giao thức MCP",[533,8928,8929,8936,8943],{},[488,8930,8931,8932],{},"Click vào 'Customize' trong phần cài đặt của Claude Desktop.\n",[433,8933],{"alt":8934,"src":8935},"Giao diện Claude Desktop chỉ vào nút Customize","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-customize-button.webp",[488,8937,8938,8939],{},"Click vào 'Developer' để mở và chỉnh sửa trực tiếp file cấu hình máy chủ MCP:\n",[433,8940],{"alt":8941,"src":8942},"Menu cài đặt Developer của Desktop để truy cập cấu hình MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-developer-menu.webp",[488,8944,8945,8946,8948,8949,899],{},"Thêm khối mã sau vào phần ",[495,8947,7609],{}," trong file ",[495,8950,8951],{},"claude_desktop_config.json",[933,8953,8955],{"className":2913,"code":8954,"language":2915,"meta":425,"style":425},"    \"second-brain\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n        \"--header\",\n        \"Authorization: Bearer \u003Cyour-token>\"\n      ]\n    }\n",[495,8956,8957,8970,8988,9000,9010,9021,9032,9041,9045],{"__ignoreMap":425},[941,8958,8959,8961,8964,8966,8968],{"class":943,"line":944},[941,8960,7620],{"class":955},[941,8962,8963],{"class":1055},"second-brain",[941,8965,3693],{"class":955},[941,8967,579],{"class":951},[941,8969,2922],{"class":955},[941,8971,8972,8974,8976,8978,8980,8982,8984,8986],{"class":943,"line":1071},[941,8973,7633],{"class":955},[941,8975,7636],{"class":947},[941,8977,3693],{"class":955},[941,8979,899],{"class":955},[941,8981,3286],{"class":955},[941,8983,7645],{"class":1055},[941,8985,3693],{"class":955},[941,8987,7650],{"class":955},[941,8989,8990,8992,8994,8996,8998],{"class":943,"line":1078},[941,8991,7633],{"class":955},[941,8993,7657],{"class":947},[941,8995,3693],{"class":955},[941,8997,899],{"class":955},[941,8999,7664],{"class":955},[941,9001,9002,9004,9006,9008],{"class":943,"line":1085},[941,9003,7669],{"class":955},[941,9005,7672],{"class":1055},[941,9007,3693],{"class":955},[941,9009,7650],{"class":955},[941,9011,9012,9014,9017,9019],{"class":943,"line":1933},[941,9013,7669],{"class":955},[941,9015,9016],{"class":1055},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[941,9018,3693],{"class":955},[941,9020,7650],{"class":955},[941,9022,9023,9025,9028,9030],{"class":943,"line":1938},[941,9024,7669],{"class":955},[941,9026,9027],{"class":1055},"--header",[941,9029,3693],{"class":955},[941,9031,7650],{"class":955},[941,9033,9034,9036,9039],{"class":943,"line":1944},[941,9035,7669],{"class":955},[941,9037,9038],{"class":1055},"Authorization: Bearer \u003Cyour-token>",[941,9040,1965],{"class":955},[941,9042,9043],{"class":943,"line":2280},[941,9044,7748],{"class":955},[941,9046,9047],{"class":943,"line":2291},[941,9048,7753],{"class":955},[430,9050,9051,9055,9056],{},[433,9052],{"alt":9053,"src":9054},"File cấu hình JSON MCP của Claude Desktop chứa máy chủ Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-config-json.webp","\n4. Khởi động lại Claude Desktop và kiểm tra danh sách 'Local MCP servers'. Trạng thái cần hiển thị là 'running' (đang hoạt động).\n",[433,9057],{"alt":9058,"src":9059},"Claude Desktop hiển thị trạng thái hoạt động của máy chủ Second Brain MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-status-running.webp",[889,9061,9063],{"id":9062},"tích-hợp-claude-code-qua-giao-thức-mcp","Tích hợp Claude Code qua giao thức MCP",[485,9065,9066],{},[488,9067,9068],{},"Chạy lệnh sau trong terminal để thêm máy chủ MCP mới:",[933,9070,9072],{"className":2310,"code":9071,"language":2312,"meta":425,"style":425},"claude mcp add --transport http second-brain https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\n",[495,9073,9074],{"__ignoreMap":425},[941,9075,9076,9079,9082,9084,9087,9090,9093,9096,9098,9101,9104,9106],{"class":943,"line":944},[941,9077,9078],{"class":1051},"claude",[941,9080,9081],{"class":1055}," mcp",[941,9083,1065],{"class":1055},[941,9085,9086],{"class":1055}," --transport",[941,9088,9089],{"class":1055}," http",[941,9091,9092],{"class":1055}," second-brain",[941,9094,9095],{"class":1055}," https:\u002F\u002F",[941,9097,5581],{"class":955},[941,9099,9100],{"class":1055},"your-worker-ur",[941,9102,9103],{"class":951},"l",[941,9105,1258],{"class":955},[941,9107,9108],{"class":1055},"\u002Fmcp\n",[485,9110,9111,9117],{},[488,9112,9113,9114,461],{},"Claude Code sẽ tự động phát hiện endpoint yêu cầu OAuth và mở trang đăng nhập trên trình duyệt web để bạn xác thực ",[495,9115,9116],{},"AUTH_TOKEN",[488,9118,9119,9120,9123,9124,9127,9128,461],{},"Tạo file ",[495,9121,9122],{},"CLAUDE.md"," trong thư mục ",[495,9125,9126],{},"~\u002F.claude"," với các chỉ dẫn chi tiết lấy từ ",[444,9129,9132],{"href":9130,"rel":9131},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[448],"CLAUDE_INSTRUCTIONS.md",[889,9134,9136],{"id":9135},"tích-hợp-gemini-cli-qua-giao-thức-mcp","Tích hợp Gemini CLI qua giao thức MCP",[533,9138,9139],{},[488,9140,9141],{},"Thêm cấu hình máy chủ MCP sau vào file '.\u002F.gemini\u002Fsettings.json' của bạn:",[933,9143,9145],{"className":2913,"code":9144,"language":2915,"meta":425,"style":425},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[495,9146,9147,9159,9177,9189,9201,9205],{"__ignoreMap":425},[941,9148,9149,9151,9153,9155,9157],{"class":943,"line":944},[941,9150,7620],{"class":955},[941,9152,8963],{"class":1055},[941,9154,3693],{"class":955},[941,9156,579],{"class":951},[941,9158,2922],{"class":955},[941,9160,9161,9163,9165,9167,9169,9171,9173,9175],{"class":943,"line":1071},[941,9162,7633],{"class":955},[941,9164,7860],{"class":947},[941,9166,3693],{"class":955},[941,9168,899],{"class":955},[941,9170,3286],{"class":955},[941,9172,9016],{"class":1055},[941,9174,3693],{"class":955},[941,9176,7650],{"class":955},[941,9178,9179,9181,9183,9185,9187],{"class":943,"line":1078},[941,9180,7633],{"class":955},[941,9182,7879],{"class":947},[941,9184,3693],{"class":955},[941,9186,899],{"class":955},[941,9188,2952],{"class":955},[941,9190,9191,9193,9195,9197,9199],{"class":943,"line":1085},[941,9192,7669],{"class":955},[941,9194,7892],{"class":1051},[941,9196,3693],{"class":955},[941,9198,899],{"class":955},[941,9200,1388],{"class":955},[941,9202,9203],{"class":943,"line":1933},[941,9204,7903],{"class":955},[941,9206,9207],{"class":943,"line":1938},[941,9208,7753],{"class":955},[533,9210,9211],{"start":1071},[488,9212,9213],{},"Khởi chạy Gemini CLI.",[889,9215,9217],{"id":9216},"thử-nghiệm-second-brain-với-các-ai-agent","Thử nghiệm Second Brain với các AI Agent",[533,9219,9220,9230,9244],{},[488,9221,9222,9223,9225,9226],{},"Khi cấu hình một bảng màu thương hiệu cơ bản trên ",[441,9224,7561],{},", mặc định Second Brain không được gọi ngay lập tức.\n",[433,9227],{"alt":9228,"src":9229},"Thử nghiệm đầu tiên trong Claude Desktop khi chưa kích hoạt lớp bộ nhớ Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-first-run-brand-palette.webp",[488,9231,9232,9233,9236,9237,9239,9240],{},"Khi dùng các từ khóa đơn giản như 'remember', chỉ có công cụ tích hợp sẵn cục bộ ",[495,9234,9235],{},"memory_user-edits"," trên ",[441,9238,7561],{}," hoạt động, còn lớp lưu trữ đám mây Second Brain thì bị bỏ qua.\n",[433,9241],{"alt":9242,"src":9243},"Claude Desktop tự động chuyển hướng sang công cụ chỉnh sửa cục bộ thay vì Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-remember-built-in-tool-fallback.webp",[488,9245,9246,9247,9250],{},"Khi gửi lệnh sau trên ",[441,9248,9249],{},"Claude Code",", kết nối với Second Brain đã được kích hoạt thành công:",[933,9252,9255],{"className":9253,"code":9254,"language":4646},[4644],"Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n",[495,9256,9254],{"__ignoreMap":425},[430,9258,9259,9263,9264,1377,9267,9271,9272,9275,9276,9278,9279,9283,9284,9287,9288,9271,9292],{},[433,9260],{"alt":9261,"src":9262},"Cửa sổ terminal Claude Code hiển thị việc kích hoạt thành công Second Brain MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-code-second-brain-mcp-called.webp","\n4. Xác minh cấu hình màu mới đã được lưu trực tiếp trên bảng điều khiển của ",[441,9265,9266],{},"Second Brain trên Cloudflare",[433,9268],{"alt":9269,"src":9270},"Xác minh các mã màu thương hiệu đã lưu trên Web UI cơ sở dữ liệu Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-color-verification.webp","\n- ",[909,9273,9274],{},"Claude Code có thể hoạt động hoàn toàn tự động vì file chỉ dẫn CLAUDE_INSTRUCTIONS.md trong dự án có chứa các quy tắc trỏ đến từ khóa của 'Second Brain'.","\n5. Để sử dụng kết nối này trên ",[441,9277,7561],{},", bạn cần chỉ định rõ cụm từ 'Second Brain' trong prompt trò chuyện để ép Agent ghi hoặc đọc ở lớp bộ nhớ vĩnh viễn này.\n",[433,9280],{"alt":9281,"src":9282},"Kích hoạt Second Brain trong Claude Desktop bằng cách nhắc đến từ khóa rõ ràng","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-second-brain-explicit-trigger.webp","\n6. Điều tương tự cũng áp dụng cho ",[441,9285,9286],{},"Gemini CLI",", bạn cần nhắc đến từ khóa 'Second Brain' để kích hoạt công cụ MCP tương ứng.\n",[433,9289],{"alt":9290,"src":9291},"Cửa sổ terminal Gemini CLI trình bày việc gọi thành công Second Brain MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fgemini-cli-second-brain-trigger.webp",[909,9293,9294],{},"Bằng cách thêm các chỉ dẫn tương tự vào file GEMINI.md, mô phỏng theo cách làm của CLAUDE_INSTRUCTIONS.md, hệ thống sẽ tự động gọi Second Brain chạy ngầm mà bạn không cần phải gõ từ khóa một cách thủ công nữa.",[889,9296,9298],{"id":9297},"tiện-ích-mở-rộng-trên-trình-duyệt-web","Tiện ích mở rộng trên trình duyệt Web",[485,9300,9301,9304],{},[488,9302,9303],{},"Có sẵn các tiện ích mở rộng cho các trình duyệt phổ biến như Chrome, Firefox và Microsoft Edge.",[488,9305,9306,9307],{},"Các tính năng chính bao gồm:\n",[485,9308,9309,9315,9321],{},[488,9310,9311,9314],{},[441,9312,9313],{},"Lưu trang hiện tại"," — lưu ngay tiêu đề và địa chỉ URL của trang vào Second Brain.",[488,9316,9317,9320],{},[441,9318,9319],{},"Lưu văn bản bôi đen"," — bôi đen đoạn văn bản bất kỳ trên trang trước khi click vào biểu tượng tiện ích; đoạn trích dẫn sẽ được lưu kèm theo tiêu đề và URL nguồn.",[488,9322,9323,9326,9327,9330],{},[441,9324,9325],{},"Thêm ghi chú nhanh"," — viết thêm ghi chú nhanh hoặc gán các ",[495,9328,9329],{},"#hashtags"," trực tiếp trên cửa sổ popup của tiện ích trước khi bấm lưu; các hashtag sẽ tự động được trích xuất thành các nhãn phân loại.",[889,9332,9334],{"id":9333},"đồng-bộ-hóa-kiến-thức-cá-nhân-với-plugin-obsidian","Đồng bộ hóa kiến thức cá nhân với Plugin Obsidian",[485,9336,9337,9340],{},[488,9338,9339],{},"Có sẵn một plugin dành riêng cho Obsidian để đồng bộ hóa các ghi chú cá nhân từ Obsidian Vault trực tiếp lên Second Brain trên Cloudflare.",[488,9341,9342],{},"Bạn có thể đặt các nhãn tag cụ thể trên các ghi chú muốn cho phép đồng bộ lên bộ nhớ đám mây vĩnh viễn.",[2167,9344,9346],{"id":9345},"cài-đặt-plugin-obsidian","Cài đặt Plugin Obsidian",[533,9348,9349,9356,9363,9370],{},[488,9350,9351,9352],{},"Mở Obsidian → Settings → Community Plugins\n",[433,9353],{"alt":9354,"src":9355},"Bảng cài đặt Obsidian điều hướng đến mục Community Plugins","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-settings-community-plugins.webp",[488,9357,9358,9359],{},"Click vào nút 'Browse'.\n",[433,9360],{"alt":9361,"src":9362},"Trang tìm kiếm plugin cộng đồng Obsidian hiển thị nút Browse","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-browse.webp",[488,9364,9365,9366],{},"Tìm kiếm từ khóa 'Second Brain Sync'.\n",[433,9367],{"alt":9368,"src":9369},"Tìm kiếm plugin Second Brain Sync trên kho ứng dụng Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-search-second-brain.webp",[488,9371,9372,9373],{},"Click nút 'Install' sau đó click 'Enable'.\n",[433,9374],{"alt":9375,"src":9376},"Cài đặt và kích hoạt plugin Second Brain Sync trong Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-install-and-enable.webp",[2167,9378,9380],{"id":9379},"cấu-hình-plugin-obsidian","Cấu hình Plugin Obsidian",[533,9382,9383,9386,9393,9400,9407,9414],{},[488,9384,9385],{},"Truy cập Obsidian → Settings → Second Brain Sync",[488,9387,9388,9389],{},"Nhập các thông tin 'URL' và 'Auth token' của Worker của bạn vào các ô tương ứng.\n",[433,9390],{"alt":9391,"src":9392},"Nhập URL Worker và Token ủy quyền trong cài đặt plugin Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-configuration-credentials.webp",[488,9394,9395,9396],{},"Click nút 'Test' để xác minh kết nối từ xa đã sẵn sàng hoạt động.\n",[433,9397],{"alt":9398,"src":9399},"Thử nghiệm kết nối của plugin Obsidian hiển thị xác thực thành công","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-connection-test-success.webp",[488,9401,9402,9403],{},"Cấu hình các hành vi đồng bộ. Đặt tag kích hoạt đồng bộ ở mục 'Sync tag' và bật tùy chọn 'Auto-sync on save'.\n",[433,9404],{"alt":9405,"src":9406},"Cấu hình Sync Tag và kích hoạt tự động đồng bộ khi lưu trong Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-sync-behavior-settings.webp",[488,9408,9409,9410],{},"Tạo một ghi chú mới trong Obsidian kèm theo tag 'second-brain' (như đã cấu hình trong bảng thiết lập).\n",[433,9411],{"alt":9412,"src":9413},"Tạo một ghi chú Obsidian mới có gắn nhãn second-brain để đồng bộ hóa","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-note-with-sync-tag.webp",[488,9415,9416,9417],{},"Ghi chú này sau khi lưu sẽ lập tức được đồng bộ tự động lên thực thể Cloudflare của bạn.\n",[433,9418],{"alt":9419,"src":9420},"Xác minh ghi chú Obsidian đã đồng bộ thành công trên Web UI của Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-synced-note-verification.webp",[474,9422,9424],{"id":9423},"kết-luận","Kết luận",[430,9426,9427],{},"Second Brain mang lại một giải pháp mã nguồn mở thông minh để giải quyết một trong những rào cản gây ức chế nhất của công nghệ AI hiện nay: tình trạng mất ngữ cảnh và thiếu bộ nhớ lưu trữ dài hạn. Bằng cách kết hợp dự án này với cơ sở hạ tầng serverless có tính co giãn cao của Cloudflare, chúng ta sở hữu một lớp bộ nhớ sém thức tự host, phân tán toàn cầu và có độ trễ cực thấp. Với việc hỗ trợ giao thức MCP mở, kho tri thức này hoàn toàn có thể di động và dùng chung cho mọi Agent ảo khác nhau.",[430,9429,9430],{},"Việc tích hợp qua Obsidian còn nâng tầm kiến trúc này hơn nữa bằng cách kết nối việc ghi chép thông thường trực tiếp vào quy trình phân tích logic của AI. Các ghi chú thô của bạn được chuyển hóa thành các dữ liệu cấu trúc mà các Agent có thể thấu hiểu và khai thác bất kỳ lúc nào.",[430,9432,9433],{},"Bằng cách hợp nhất mô hình tự host, tìm kiếm sém nghĩa dạng vector và các chuẩn tích hợp mở như MCP; Second Brain đã chứng minh đây không chỉ đơn thuần là nơi lưu trữ ký ức, mà còn là nền tảng thực tiễn tuyệt vời để xây dựng một hệ sinh thái AI hiệu quả của riêng bạn.",[474,9435,1620],{"id":1619},[485,9437,9438,9444,9450,9457,9464],{},[488,9439,9440],{},[444,9441,9442],{"href":9442,"rel":9443},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[448],[488,9445,9446],{},[444,9447,9448],{"href":9448,"rel":9449},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[448],[488,9451,9452],{},[444,9453,9456],{"href":9454,"rel":9455},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[448],"Connect to AI Clients",[488,9458,9459],{},[444,9460,9463],{"href":9461,"rel":9462},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[448],"Second Brain Obsidian Plugin",[488,9465,9466],{},[444,9467,9468],{"href":9468,"rel":9469},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[448],[1648,9471,9472],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":425,"searchDepth":1071,"depth":1078,"links":9474},[9475,9476,9477,9489,9490],{"id":8733,"depth":1071,"text":8734},{"id":8743,"depth":1071,"text":8744},{"id":8764,"depth":1071,"text":8765,"children":9478},[9479,9480,9481,9482,9483,9484,9485],{"id":8839,"depth":1078,"text":8840},{"id":8925,"depth":1078,"text":8926},{"id":9062,"depth":1078,"text":9063},{"id":9135,"depth":1078,"text":9136},{"id":9216,"depth":1078,"text":9217},{"id":9297,"depth":1078,"text":9298},{"id":9333,"depth":1078,"text":9334,"children":9486},[9487,9488],{"id":9345,"depth":1085,"text":9346},{"id":9379,"depth":1085,"text":9380},{"id":9423,"depth":1071,"text":9424},{"id":1619,"depth":1071,"text":1620},[9492,1668],"cloudflare","2026-08-07","Tìm hiểu cách xây dựng hệ thống bộ nhớ AI vĩnh viễn và tự host trên Cloudflare với Second Brain và MCP. Chia sẻ ngữ cảnh giữa Claude và Obsidian hiệu quả.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002FVI-Use-Cloudflare-as-AI-memory.webp","Hệ thống bộ nhớ AI vĩnh viễn và tự host triển khai trên Cloudflare Workers và Vectorize với hỗ trợ giao thức MCP và đồng bộ Obsidian.",{"schemaOrg":9498,"robots":1702,"sitemap":9501},[9499],{"@type":1679,"headline":9500,"description":9494},"Hệ thống bộ nhớ AI tự host với Cloudflare và MCP",{"lastmod":9493},{"title":9500,"description":9494,"ogTitle":8728,"ogDescription":9494,"twitterTitle":8728,"twitterDescription":9494},"vi\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[6268,6955,9505,8755,4100],"Bộ nhớ AI","UgRl4Al24KEOOPCKlv3MMVU-krBqxz4YEiF9kwtLUIM",{"id":9508,"title":2526,"author":425,"body":9509,"category":10024,"date":10025,"description":10026,"extension":1673,"image":10027,"imageAlt":10028,"isPublished":1074,"meta":10029,"minRead":1933,"navigation":1074,"path":305,"seo":10033,"stem":10034,"tags":10035,"updatedAt":1711,"__hash__":10038},"article\u002Fvi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac.md",{"type":427,"value":9510,"toc":10017},[9511,9515,9518,9525,9529,9535,9538,9541,9545,9548,9555,9571,9865,9977,9979,9982,9984,10014],[474,9512,9514],{"id":9513},"cloudflare-warp-là-gì","Cloudflare WARP là gì?",[430,9516,9517],{},"Cloudflare WARP là một ứng dụng phía máy khách (client-side) giúp định tuyến lưu lượng truy cập của thiết bị được chỉ định qua mạng toàn cầu của Cloudflare thay vì đi trực tiếp ra internet công cộng.",[430,9519,9520,9521,9524],{},"Nó tạo ra một đường truyền được mã hóa (encrypted tunnel) xây dựng trên giao thức ",[441,9522,9523],{},"WireGuard",", bảo mật lưu lượng truy cập từ thiết bị đến trung tâm dữ liệu Cloudflare gần nhất. Sau đó, các chính sách có thể được tạo trong bảng điều khiển Cloudflare của bạn để lọc, ghi nhật ký, kiểm tra hoặc định tuyến lưu lượng truy cập đến này.",[474,9526,9528],{"id":9527},"tại-sao-chúng-ta-cần-cloudflare-warp","Tại sao chúng ta cần Cloudflare WARP?",[430,9530,9531,9532,461],{},"Để chia sẻ an toàn các tài nguyên nội bộ—như dịch vụ web riêng tư hoặc ứng dụng SaaS—cho nhân viên, nhà thầu và các bên liên quan khác, ứng dụng Cloudflare WARP được sử dụng làm điểm thực thi phía máy khách cho ",[441,9533,9534],{},"Truy cập mạng Zero Trust (ZTNA)",[430,9536,9537],{},"Ứng dụng Cloudflare WARP được cài đặt trên máy tính xách tay hoặc điện thoại của người dùng. Nó yêu cầu người dùng xác thực và đáp ứng các kiểm tra trạng thái bảo mật cụ thể (chẳng hạn như đến từ dải IP được phê duyệt, sử dụng miền email đã đăng ký hoặc đang chạy tường lửa hoạt động) trước khi cấp quyền truy cập.",[430,9539,9540],{},"Bằng cách truyền dữ liệu thiết bị trực tiếp đến Cloudflare, danh tính, thiết bị và các chính sách của người dùng được xác minh trước khi các yêu cầu có thể tiếp cận tài nguyên nội bộ. Nhờ đó, tài nguyên nội bộ không bao giờ bị lộ ra internet công cộng, và mọi yêu cầu đơn lẻ đều được ghi nhật ký và kiểm tra đầy đủ.",[474,9542,9544],{"id":9543},"hỗ-trợ-nhiều-cấu-hình-profile-warp-trên-một-thiết-bị","Hỗ trợ nhiều cấu hình (Profile) WARP trên một thiết bị",[430,9546,9547],{},"Khi người dùng cần chuyển đổi giữa tài khoản cá nhân và tài khoản doanh nghiệp của Cloudflare, hoặc khi quản trị viên hệ thống quản lý nhiều bên thuê (tenant), việc hỗ trợ nhiều cấu hình WARP trên một thiết bị duy nhất trở nên vô cùng quan trọng.",[430,9549,9550,9551,9554],{},"Để làm được điều này trên macOS, chúng ta có thể sử dụng file cấu hình MDM ",[495,9552,9553],{},".mobileconfig"," để định nghĩa và đăng ký các môi trường WARP khác nhau.",[485,9556,9557,9568],{},[488,9558,9559,9567],{},[444,9560,9563,9564,9566],{"href":9561,"rel":9562},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fstatic\u002Fmdm\u002Fmultiple-orgs\u002FCloudflareWARP.mobileconfig",[448],"Download a sample ",[495,9565,9553],{}," file"," trực tiếp từ Cloudflare.",[488,9569,9570],{},"Dưới đây là ví dụ về cấu hình này trông như thế nào:",[933,9572,9576],{"className":9573,"code":9574,"language":9575,"meta":425,"style":425},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n\u003Cplist version=\"1.0\">\n\u003Cdict>\n  \u003Ckey>PayloadContent\u003C\u002Fkey>\n  \u003Carray>\n    \u003Cdict>\n      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n      \u003Ckey>PayloadType\u003C\u002Fkey>\n      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n      \u003Cinteger>1\u003C\u002Finteger>\n      \u003Ckey>configs\u003C\u002Fkey>\n      \u003Carray>\n        \u003Cdict>\n          \u003Ckey>organization\u003C\u002Fkey>\n          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n          \u003Ckey>display_name\u003C\u002Fkey>\n          \u003Cstring>Team 1\u003C\u002Fstring>\n        \u003C\u002Fdict>\n        \u003Cdict>\n          \u003Ckey>organization\u003C\u002Fkey>\n          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n          \u003Ckey>display_name\u003C\u002Fkey>\n          \u003Cstring>Team 2\u003C\u002Fstring>\n        \u003C\u002Fdict>\n      \u003C\u002Farray>\n    \u003C\u002Fdict>\n  \u003C\u002Farray>\n  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n  \u003Cfalse\u002F>\n  \u003Ckey>PayloadScope\u003C\u002Fkey>\n  \u003Cstring>System\u003C\u002Fstring>\n  \u003Ckey>PayloadType\u003C\u002Fkey>\n  \u003Cstring>Configuration\u003C\u002Fstring>\n  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n  \u003Cinteger>1\u003C\u002Finteger>\n\u003C\u002Fdict>\n\u003C\u002Fplist>\n","xml",[495,9577,9578,9583,9588,9593,9598,9603,9608,9613,9618,9623,9628,9633,9638,9643,9648,9653,9658,9663,9668,9673,9678,9683,9688,9693,9698,9703,9708,9713,9717,9721,9726,9730,9735,9739,9745,9751,9757,9763,9769,9775,9781,9787,9793,9799,9805,9811,9817,9823,9829,9835,9841,9847,9853,9859],{"__ignoreMap":425},[941,9579,9580],{"class":943,"line":944},[941,9581,9582],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[941,9584,9585],{"class":943,"line":1071},[941,9586,9587],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[941,9589,9590],{"class":943,"line":1078},[941,9591,9592],{},"\u003Cplist version=\"1.0\">\n",[941,9594,9595],{"class":943,"line":1085},[941,9596,9597],{},"\u003Cdict>\n",[941,9599,9600],{"class":943,"line":1933},[941,9601,9602],{},"  \u003Ckey>PayloadContent\u003C\u002Fkey>\n",[941,9604,9605],{"class":943,"line":1938},[941,9606,9607],{},"  \u003Carray>\n",[941,9609,9610],{"class":943,"line":1944},[941,9611,9612],{},"    \u003Cdict>\n",[941,9614,9615],{"class":943,"line":2280},[941,9616,9617],{},"      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[941,9619,9620],{"class":943,"line":2291},[941,9621,9622],{},"      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n",[941,9624,9625],{"class":943,"line":2387},[941,9626,9627],{},"      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[941,9629,9630],{"class":943,"line":2393},[941,9631,9632],{},"      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[941,9634,9635],{"class":943,"line":2399},[941,9636,9637],{},"      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[941,9639,9640],{"class":943,"line":2404},[941,9641,9642],{},"      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n",[941,9644,9645],{"class":943,"line":1704},[941,9646,9647],{},"      \u003Ckey>PayloadType\u003C\u002Fkey>\n",[941,9649,9650],{"class":943,"line":3355},[941,9651,9652],{},"      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n",[941,9654,9655],{"class":943,"line":3366},[941,9656,9657],{},"      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[941,9659,9660],{"class":943,"line":3371},[941,9661,9662],{},"      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[941,9664,9665],{"class":943,"line":3379},[941,9666,9667],{},"      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[941,9669,9670],{"class":943,"line":3906},[941,9671,9672],{},"      \u003Cinteger>1\u003C\u002Finteger>\n",[941,9674,9675],{"class":943,"line":3912},[941,9676,9677],{},"      \u003Ckey>configs\u003C\u002Fkey>\n",[941,9679,9680],{"class":943,"line":3921},[941,9681,9682],{},"      \u003Carray>\n",[941,9684,9685],{"class":943,"line":4576},[941,9686,9687],{},"        \u003Cdict>\n",[941,9689,9690],{"class":943,"line":5032},[941,9691,9692],{},"          \u003Ckey>organization\u003C\u002Fkey>\n",[941,9694,9695],{"class":943,"line":5041},[941,9696,9697],{},"          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n",[941,9699,9700],{"class":943,"line":5049},[941,9701,9702],{},"          \u003Ckey>display_name\u003C\u002Fkey>\n",[941,9704,9705],{"class":943,"line":5057},[941,9706,9707],{},"          \u003Cstring>Team 1\u003C\u002Fstring>\n",[941,9709,9710],{"class":943,"line":5062},[941,9711,9712],{},"        \u003C\u002Fdict>\n",[941,9714,9715],{"class":943,"line":5069},[941,9716,9687],{},[941,9718,9719],{"class":943,"line":5077},[941,9720,9692],{},[941,9722,9723],{"class":943,"line":5085},[941,9724,9725],{},"          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n",[941,9727,9728],{"class":943,"line":5096},[941,9729,9702],{},[941,9731,9732],{"class":943,"line":5104},[941,9733,9734],{},"          \u003Cstring>Team 2\u003C\u002Fstring>\n",[941,9736,9737],{"class":943,"line":5111},[941,9738,9712],{},[941,9740,9742],{"class":943,"line":9741},34,[941,9743,9744],{},"      \u003C\u002Farray>\n",[941,9746,9748],{"class":943,"line":9747},35,[941,9749,9750],{},"    \u003C\u002Fdict>\n",[941,9752,9754],{"class":943,"line":9753},36,[941,9755,9756],{},"  \u003C\u002Farray>\n",[941,9758,9760],{"class":943,"line":9759},37,[941,9761,9762],{},"  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[941,9764,9766],{"class":943,"line":9765},38,[941,9767,9768],{},"  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n",[941,9770,9772],{"class":943,"line":9771},39,[941,9773,9774],{},"  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[941,9776,9778],{"class":943,"line":9777},40,[941,9779,9780],{},"  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n",[941,9782,9784],{"class":943,"line":9783},41,[941,9785,9786],{},"  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[941,9788,9790],{"class":943,"line":9789},42,[941,9791,9792],{},"  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n",[941,9794,9796],{"class":943,"line":9795},43,[941,9797,9798],{},"  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n",[941,9800,9802],{"class":943,"line":9801},44,[941,9803,9804],{},"  \u003Cfalse\u002F>\n",[941,9806,9808],{"class":943,"line":9807},45,[941,9809,9810],{},"  \u003Ckey>PayloadScope\u003C\u002Fkey>\n",[941,9812,9814],{"class":943,"line":9813},46,[941,9815,9816],{},"  \u003Cstring>System\u003C\u002Fstring>\n",[941,9818,9820],{"class":943,"line":9819},47,[941,9821,9822],{},"  \u003Ckey>PayloadType\u003C\u002Fkey>\n",[941,9824,9826],{"class":943,"line":9825},48,[941,9827,9828],{},"  \u003Cstring>Configuration\u003C\u002Fstring>\n",[941,9830,9832],{"class":943,"line":9831},49,[941,9833,9834],{},"  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[941,9836,9838],{"class":943,"line":9837},50,[941,9839,9840],{},"  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n",[941,9842,9844],{"class":943,"line":9843},51,[941,9845,9846],{},"  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[941,9848,9850],{"class":943,"line":9849},52,[941,9851,9852],{},"  \u003Cinteger>1\u003C\u002Finteger>\n",[941,9854,9856],{"class":943,"line":9855},53,[941,9857,9858],{},"\u003C\u002Fdict>\n",[941,9860,9862],{"class":943,"line":9861},54,[941,9863,9864],{},"\u003C\u002Fplist>\n",[485,9866,9867,9877,9889,9899,9905,9922,9934,9953,9968],{},[488,9868,9869,9870,575,9873,9876],{},"Thay thế ",[495,9871,9872],{},"your-team-name-1",[495,9874,9875],{},"your-team-name-2"," bằng tên nhóm Cloudflare Zero Trust tương ứng của bạn.",[488,9878,2995,9879,9882,9883,9886,9887,461],{},[495,9880,9881],{},"uuidgen"," trong Terminal của bạn để tạo các UUID duy nhất, và sử dụng chúng để thay thế các giá trị ",[495,9884,9885],{},"PayloadUUID"," tạm thời trong file ",[495,9888,9553],{},[488,9890,9891,9892,9895,9896,9898],{},"Đảm bảo rằng chuỗi ",[495,9893,9894],{},"PayloadIdentifier"," cũng chứa ",[495,9897,9885],{}," đã cập nhật để giữ cho cấu hình có tính riêng biệt.",[488,9900,9901,9902,9904],{},"Lưu file ",[495,9903,9553],{}," đã chỉnh sửa của bạn.",[488,9906,9907,9908,9911,9912,9915,9916,9918],{},"Mở ",[441,9909,9910],{},"Cài đặt hệ thống"," trên máy Mac của bạn, tìm kiếm ",[441,9913,9914],{},"Cấu hình"," (Profiles), và chọn nó.",[1889,9917],{},[433,9919],{"alt":9920,"src":9921},"Giao diện cấu hình Profiles trong System Settings trên macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-system-settings-profiles.webp",[488,9923,6796,9924,9927,9928,9930],{},[441,9925,9926],{},"Cài đặt, xem hoặc xóa..."," để bắt đầu thêm cấu hình mới của bạn.",[1889,9929],{},[433,9931],{"alt":9932,"src":9933},"Nút cài đặt, xem hoặc xóa Profiles trên macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-view-remove.webp",[488,9935,9936,9937,9939,9940,9942,9943,9945,9949],{},"Nhấp vào biểu tượng ",[441,9938,725],{}," (cộng) ở góc dưới bên trái và chọn file ",[495,9941,9553],{}," đã lưu của bạn.",[1889,9944],{},[433,9946],{"alt":9947,"src":9948},"Nút cộng (+) trong Profiles trên macOS để thêm cấu hình mới","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-add-profile.webp",[433,9950],{"alt":9951,"src":9952},"Chọn file cấu hình .mobileconfig trên macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-select-mobileconfig-file.webp",[488,9954,9955,9956,7562,9958,9961,9962,9964],{},"Chọn ",[441,9957,1727],{},[441,9959,9960],{},"Cài đặt"," để áp dụng cấu hình.",[1889,9963],{},[433,9965],{"alt":9966,"src":9967},"Xác nhận cài đặt cấu hình Cloudflare WARP trên macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-install-cloudflare-warp-profile.webp",[488,9969,9970,9971,9973],{},"Khởi động lại ứng dụng Cloudflare WARP của bạn. Bây giờ bạn sẽ thấy trình chuyển đổi đa cấu hình trong giao diện người dùng:",[1889,9972],{},[433,9974],{"alt":9975,"src":9976},"Giao diện chuyển đổi nhiều tài khoản cấu hình trên client Cloudflare WARP trên macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fcloudflare-warp-multi-profile-switcher.webp",[474,9978,9424],{"id":9423},[430,9980,9981],{},"Ứng dụng Cloudflare WARP hoạt động như một điểm bảo mật quan trọng trên thiết bị người dùng, giúp Truy cập mạng Zero Trust trở nên mạnh mẽ và cực kỳ thực tế. Việc cô lập tài nguyên nội bộ khỏi internet công cộng đảm bảo rằng mọi nỗ lực kết nối đều được xác thực, đánh giá và kiểm tra một cách an toàn.",[474,9983,6174],{"id":1619},[485,9985,9986,9993,10000,10007],{},[488,9987,9988],{},[444,9989,9992],{"href":9990,"rel":9991},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002F#prepare-file-for-mdm-deployment",[448],"Managed Deployment Preparation",[488,9994,9995],{},[444,9996,9999],{"href":9997,"rel":9998},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002Fswitch-organizations\u002F",[448],"Switch Between Zero Trust Organizations",[488,10001,10002],{},[444,10003,10006],{"href":10004,"rel":10005},"https:\u002F\u002Fblog.cloudflare.com\u002Fintroducing-warp-connector-paving-the-path-to-any-to-any-connectivity-2\u002F",[448],"Introducing WARP Connector: Paving the Path to Any-to-Any Connectivity",[488,10008,10009],{},[444,10010,10013],{"href":10011,"rel":10012},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002F",[448],"Cloudflare One Client Documentation",[1648,10015,10016],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":425,"searchDepth":1071,"depth":1078,"links":10018},[10019,10020,10021,10022,10023],{"id":9513,"depth":1071,"text":9514},{"id":9527,"depth":1071,"text":9528},{"id":9543,"depth":1071,"text":9544},{"id":9423,"depth":1071,"text":9424},{"id":1619,"depth":1071,"text":6174},[2612,9492],"2026-07-04","Hướng dẫn cách cấu hình và chuyển đổi nhanh giữa nhiều tổ chức Cloudflare WARP trên macOS bằng file .mobileconfig. Hướng dẫn MDM đầy đủ cho quản trị viên.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002FVI-Switch-Between-Multiple-Cloudflare-WARP-Orgs-on-Mac.webp","Cấu hình nhiều tổ chức Cloudflare WARP trên macOS",{"schemaOrg":10030,"robots":1702,"sitemap":10032},[10031],{"@type":1681,"headline":2526,"description":10026},{"lastmod":10025},{"title":10028,"description":10026,"ogTitle":2526,"ogDescription":10026,"twitterTitle":2526,"twitterDescription":10026},"vi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",[10036,1727,10037,2655],"macOS","MDM","AYpQU_BG0n0gA2TN8V-O9UYRB2yhUp2FObpAAE28Vcs",{"id":10040,"title":8328,"author":425,"body":10041,"category":10421,"date":10422,"description":10423,"extension":1673,"image":10424,"imageAlt":10425,"isPublished":1074,"meta":10426,"minRead":1944,"navigation":1074,"path":281,"seo":10430,"stem":10431,"tags":10432,"updatedAt":1711,"__hash__":10436},"article\u002Fvi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them.md",{"type":427,"value":10042,"toc":10411},[10043,10047,10057,10068,10129,10135,10139,10142,10151,10157,10161,10215,10226,10232,10235,10291,10295,10302,10309,10312,10323,10327,10372,10375,10392,10394,10405,10408],[474,10044,10046],{"id":10045},"kỹ-năng-của-agent-ai-là-gì","Kỹ năng của Agent AI là gì?",[430,10048,10049,10050,10053,10054,10056],{},"Một kỹ năng của agent (agent skill) là một ",[441,10051,10052],{},"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 ",[495,10055,8324],{}," 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).",[430,10058,10059,10060,10067],{},"Hãy lấy kỹ năng chất vấn ",[444,10061,10064],{"href":10062,"rel":10063},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002F733d312884b3878a9a9cff693c5886943753a741\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[448],[495,10065,10066],{},"grill-me"," làm ví dụ:",[933,10069,10071],{"className":2212,"code":10070,"language":2214,"meta":425,"style":425},"---\nname: grill-me\ndescription: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n---\n\nInterview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n\nAsk the questions one at a time.\n\nIf a question can be answered by exploring the codebase, explore the codebase instead.\n",[495,10072,10073,10078,10088,10098,10102,10106,10111,10115,10120,10124],{"__ignoreMap":425},[941,10074,10075],{"class":943,"line":944},[941,10076,10077],{"class":1051},"---\n",[941,10079,10080,10083,10085],{"class":943,"line":1071},[941,10081,10082],{"class":1363},"name",[941,10084,899],{"class":955},[941,10086,10087],{"class":1055}," grill-me\n",[941,10089,10090,10093,10095],{"class":943,"line":1078},[941,10091,10092],{"class":1363},"description",[941,10094,899],{"class":955},[941,10096,10097],{"class":1055}," 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",[941,10099,10100],{"class":943,"line":1085},[941,10101,10077],{"class":1051},[941,10103,10104],{"class":943,"line":1933},[941,10105,1075],{"emptyLinePlaceholder":1074},[941,10107,10108],{"class":943,"line":1938},[941,10109,10110],{"class":1055},"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",[941,10112,10113],{"class":943,"line":1944},[941,10114,1075],{"emptyLinePlaceholder":1074},[941,10116,10117],{"class":943,"line":2280},[941,10118,10119],{"class":1055},"Ask the questions one at a time.\n",[941,10121,10122],{"class":943,"line":2291},[941,10123,1075],{"emptyLinePlaceholder":1074},[941,10125,10126],{"class":943,"line":2387},[941,10127,10128],{"class":1055},"If a question can be answered by exploring the codebase, explore the codebase instead.\n",[430,10130,10131,10132,10134],{},"Tệp ",[495,10133,8324],{}," 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.",[474,10136,10138],{"id":10137},"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)",[430,10140,10141],{},"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 đó.",[430,10143,10144,10145,10150],{},"Hãy xem kỹ năng chất vấn ",[444,10146,10148],{"href":10062,"rel":10147},[448],[495,10149,10066],{}," được sử dụng như thế nào trong thực tế.",[430,10152,10153],{},[433,10154],{"alt":10155,"src":10156},"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",[889,10158,10160],{"id":10159},"các-bước-chi-tiết","Các bước chi tiết",[533,10162,10163,10169,10175,10181,10187,10199,10209],{},[488,10164,10165,10168],{},[441,10166,10167],{},"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\").",[488,10170,10171,10174],{},[441,10172,10173],{},"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.",[488,10176,10177,10180],{},[441,10178,10179],{},"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.",[488,10182,10183,10186],{},[441,10184,10185],{},"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.",[488,10188,10189,10192,10193,10196,10197,461],{},[441,10190,10191],{},"Tải hướng dẫn"," — Agent truy xuất hướng dẫn ",[909,10194,10195],{},"đầy đủ"," cho kỹ năng đã xác nhận: chính là phần nội dung của ",[495,10198,8324],{},[488,10200,10201,10204,10205,10208],{},[441,10202,10203],{},"Gợi ý thực thi (Execution prompt)"," — Yêu cầu của người dùng ",[441,10206,10207],{},"cộng với hướng dẫn của kỹ năng đã chọn"," được gửi đến LLM.",[488,10210,10211,10214],{},[441,10212,10213],{},"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.",[430,10216,10217,10218,10225],{},"Bây giờ, hãy sử dụng kỹ năng ",[444,10219,10222],{"href":10220,"rel":10221},"https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[448],[495,10223,10224],{},"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:",[430,10227,10228],{},[433,10229],{"alt":10230,"src":10231},"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",[889,10233,10160],{"id":10234},"các-bước-chi-tiết-1",[533,10236,10237,10242,10247,10256,10261,10274,10282],{},[488,10238,10239,10241],{},[441,10240,10167],{}," — 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\").",[488,10243,10244,10174],{},[441,10245,10246],{},"Gợi ý lựa chọn",[488,10248,10249,10251,10252,10255],{},[441,10250,10179],{}," — 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 ",[495,10253,10254],{},"excalidraw-diagram",", vì vậy nó được chọn.",[488,10257,10258,10260],{},[441,10259,10185],{}," — 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 đó.",[488,10262,10263,10192,10265,10267,10268,10270,10271,10273],{},[441,10264,10191],{},[909,10266,10195],{}," cho kỹ năng đã xác nhận: phần nội dung của ",[495,10269,8324],{}," và bất kỳ tệp tham chiếu nào (đối với ",[495,10272,10254],{},", tệp này bao gồm bảng màu, lược đồ JSON và các mẫu phần tử).",[488,10275,10276,10204,10279,10281],{},[441,10277,10278],{},"Gợi ý thực thi",[441,10280,10207],{}," được gửi đến LLM. Mô hình hiện đã có phương pháp luận chi tiết cần thiết.",[488,10283,10284,10286,10287,10290],{},[441,10285,10213],{}," — LLM tạo ra kết quả đầu ra (một tệp JSON ",[495,10288,10289],{},".excalidraw","), tệp này được agent gửi lại cho người dùng.",[474,10292,10294],{"id":10293},"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",[430,10296,10297,10298,10301],{},"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 (",[909,10299,10300],{},"know-how",") của agent để hoàn thành một tác vụ cụ thể.",[430,10303,10304,10305,10308],{},"Một MCP như ",[444,10306,10307],{"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.",[430,10310,10311],{},"Một số kịch bản điển hình để sử dụng kỹ năng bao gồm:",[485,10313,10314,10317,10320],{},[488,10315,10316],{},"Quy trình làm việc nhiều bước (multi-step workflows)",[488,10318,10319],{},"Xử lý tài liệu, chẳng hạn như trích xuất dữ liệu từ tệp PDF",[488,10321,10322],{},"Quy chuẩn tạo mã nguồn (code-generation)",[474,10324,10326],{"id":10325},"cách-tạo-kỹ-năng-cho-agent-ai","Cách tạo kỹ năng cho Agent AI",[533,10328,10329,10339,10353,10362],{},[488,10330,10331,10334,10335,10338],{},[441,10332,10333],{},"Tạo một thư mục"," được đặt tên theo kỹ năng (ví dụ: ",[495,10336,10337],{},"netsuite-operation-report\u002F",").",[488,10340,10341,10346,10347,10349,10350,10352],{},[441,10342,10343,10344],{},"Viết tệp ",[495,10345,8324],{}," bao gồm một trường ",[495,10348,10082],{},", một ",[495,10351,10092],{}," sắc bén và một phần nội dung hướng dẫn ngắn gọn (dưới 200 từ).",[488,10354,10355,10358,10359,10361],{},[441,10356,10357],{},"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 ",[495,10360,8324],{}," ngắn gọn và tạo liên kết đến các tài liệu chi tiết.",[488,10363,10364,10367,10368,10371],{},[441,10365,10366],{},"Cài đặt kỹ năng"," ở nơi agent có thể phát hiện ra nó. Tham khảo bài viết ",[444,10369,10370],{"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.",[430,10373,10374],{},"Một số mẹo để viết kỹ năng hiệu quả:",[485,10376,10377,10380,10386,10389],{},[488,10378,10379],{},"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.",[488,10381,10382,10383,10385],{},"Giữ cho tệp ",[495,10384,8324],{}," 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.",[488,10387,10388],{},"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.",[488,10390,10391],{},"Quản lý phiên bản chặt chẽ. Đưa tệp vào hệ thống Git của bạn.",[474,10393,9424],{"id":9423},[430,10395,10396,10397,10400,10401,10404],{},"Khác với các công cụ và MCP định nghĩa ",[909,10398,10399],{},"những gì cần kết nối",", kỹ năng của agent đóng gói ",[909,10402,10403],{},"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ế.",[430,10406,10407],{},"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.",[1648,10409,10410],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":425,"searchDepth":1071,"depth":1078,"links":10412},[10413,10414,10418,10419,10420],{"id":10045,"depth":1071,"text":10046},{"id":10137,"depth":1071,"text":10138,"children":10415},[10416,10417],{"id":10159,"depth":1078,"text":10160},{"id":10234,"depth":1078,"text":10160},{"id":10293,"depth":1071,"text":10294},{"id":10325,"depth":1071,"text":10326},{"id":9423,"depth":1071,"text":9424},[1668],"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":10427,"robots":1702,"sitemap":10429},[10428],{"@type":1681,"headline":8328,"description":10423},{"lastmod":10422},{"title":10425,"description":10423,"ogTitle":8328,"ogDescription":10423,"twitterTitle":8328,"twitterDescription":10423},"vi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",[1710,10433,10434,10435],"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":10438,"title":1738,"author":425,"body":10439,"category":11036,"date":11037,"description":11038,"extension":1673,"image":11039,"imageAlt":11040,"isPublished":1074,"meta":11041,"minRead":1944,"navigation":1074,"path":293,"seo":11055,"stem":11057,"tags":11058,"updatedAt":1711,"__hash__":11062},"article\u002Fvi\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server.md",{"type":427,"value":10440,"toc":11025},[10441,10445,10448,10451,10455,10459,10462,10475,10481,10484,10509,10516,10543,10549,10554,10568,10580,10586,10591,10607,10611,10614,10633,10639,10642,10653,10663,10674,10704,10708,10718,10727,10738,10751,10758,10768,10774,10803,10819,10823,10829,10841,10847,10880,10884,10887,10901,10907,10970,10973,11017,11019,11022],[474,10442,10444],{"id":10443},"tại-sao-nên-chạy-hermes-agent-trên-một-vps-từ-xa","Tại sao nên chạy Hermes Agent trên một VPS từ xa?",[430,10446,10447],{},"Vì Hermes Agent có khả năng chạy các tác vụ nền, lên lịch tác vụ và phản hồi các cuộc gọi webhook, nên chúng ta cần một máy chủ hoạt động liên tục 24\u002F7. Máy tính cá nhân cục bộ có thể bị mất điện, ngắt kết nối Internet hoặc quá tải tài nguyên phần cứng. Một máy chủ từ xa (VPS) đảm bảo thời gian hoạt động (uptime) lên đến 99% và giúp dễ dàng nâng cấp tài nguyên tính toán khi cần thiết.",[430,10449,10450],{},"Có một số nhà cung cấp máy chủ riêng ảo (VPS) giá cả phải chăng trên thị trường như Hetzner, Hostinger và Contabo. Chúng tôi đã sử dụng Contabo một thời gian và cho đến nay mọi thứ vẫn rất ổn định.",[474,10452,10454],{"id":10453},"cách-thiết-lập-hermes-agent-trên-vps-linux","Cách thiết lập Hermes Agent trên VPS Linux",[889,10456,10458],{"id":10457},"bước-1-kết-nối-với-vps-của-bạn","Bước 1: Kết nối với VPS của bạn",[430,10460,10461],{},"Mở terminal và SSH vào máy chủ từ xa của bạn:",[933,10463,10465],{"className":1042,"code":10464,"language":1044,"meta":425,"style":425},"ssh root@your_server_ip\n",[495,10466,10467],{"__ignoreMap":425},[941,10468,10469,10472],{"class":943,"line":944},[941,10470,10471],{"class":1051},"ssh",[941,10473,10474],{"class":1055}," root@your_server_ip\n",[430,10476,10477],{},[433,10478],{"alt":10479,"src":10480},"Kết nối SSH vào máy chủ VPS Linux trong cửa sổ terminal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fvps-terminal-ssh-connection.webp",[430,10482,10483],{},"Đảm bảo các gói phần mềm trên máy chủ được cập nhật mới nhất:",[933,10485,10487],{"className":1042,"code":10486,"language":1044,"meta":425,"style":425},"sudo apt update && sudo apt upgrade -y\n",[495,10488,10489],{"__ignoreMap":425},[941,10490,10491,10493,10495,10498,10500,10502,10504,10507],{"class":943,"line":944},[941,10492,1901],{"class":1051},[941,10494,4478],{"class":1055},[941,10496,10497],{"class":1055}," update",[941,10499,5478],{"class":955},[941,10501,4399],{"class":1051},[941,10503,4478],{"class":1055},[941,10505,10506],{"class":1055}," upgrade",[941,10508,4511],{"class":1055},[430,10510,10511,10512,10515],{},"Thêm một người dùng mới, đặt tên là ",[495,10513,10514],{},"hermes"," hoặc tên đăng nhập bạn muốn:",[933,10517,10519],{"className":1042,"code":10518,"language":1044,"meta":425,"style":425},"sudo adduser hermes \nsudo passwd hermes\n",[495,10520,10521,10533],{"__ignoreMap":425},[941,10522,10523,10525,10528,10531],{"class":943,"line":944},[941,10524,1901],{"class":1051},[941,10526,10527],{"class":1055}," adduser",[941,10529,10530],{"class":1055}," hermes",[941,10532,2034],{"class":951},[941,10534,10535,10537,10540],{"class":943,"line":1071},[941,10536,1901],{"class":1051},[941,10538,10539],{"class":1055}," passwd",[941,10541,10542],{"class":1055}," hermes\n",[430,10544,10545,10546,899],{},"Tắt chức năng đăng nhập bằng mật khẩu đối với tài khoản ",[495,10547,10548],{},"root",[533,10550,10551],{},[488,10552,10553],{},"Mở tệp cấu hình SSH:",[933,10555,10557],{"className":1042,"code":10556,"language":1044,"meta":425,"style":425},"sudo nano \u002Fetc\u002Fssh\u002Fsshd_config\n",[495,10558,10559],{"__ignoreMap":425},[941,10560,10561,10563,10565],{"class":943,"line":944},[941,10562,1901],{"class":1051},[941,10564,2321],{"class":1055},[941,10566,10567],{"class":1055}," \u002Fetc\u002Fssh\u002Fsshd_config\n",[533,10569,10570],{"start":1071},[488,10571,10572,10573,10576,10577,899],{},"Tìm dòng ",[495,10574,10575],{},"PermitRootLogin"," và đổi giá trị của nó thành ",[495,10578,10579],{},"no",[933,10581,10584],{"className":10582,"code":10583,"language":4646,"meta":425},[4644],"PermitRootLogin no\n",[495,10585,10583],{"__ignoreMap":425},[533,10587,10588],{"start":1078},[488,10589,10590],{},"Lưu tệp và khởi động lại dịch vụ SSH:",[933,10592,10594],{"className":1042,"code":10593,"language":1044,"meta":425,"style":425},"sudo systemctl restart ssh\n",[495,10595,10596],{"__ignoreMap":425},[941,10597,10598,10600,10602,10604],{"class":943,"line":944},[941,10599,1901],{"class":1051},[941,10601,1904],{"class":1055},[941,10603,1907],{"class":1055},[941,10605,10606],{"class":1055}," ssh\n",[889,10608,10610],{"id":10609},"bước-2-cài-đặt-hermes-agent","Bước 2: Cài đặt Hermes Agent",[430,10612,10613],{},"Chạy lệnh sau:",[933,10615,10617],{"className":1042,"code":10616,"language":1044,"meta":425,"style":425},"curl -fsSL https:\u002F\u002Fhermes-agent.nousresearch.com\u002Finstall.sh | bash\n",[495,10618,10619],{"__ignoreMap":425},[941,10620,10621,10623,10625,10628,10630],{"class":943,"line":944},[941,10622,2998],{"class":1051},[941,10624,4390],{"class":1055},[941,10626,10627],{"class":1055}," https:\u002F\u002Fhermes-agent.nousresearch.com\u002Finstall.sh",[941,10629,4396],{"class":955},[941,10631,10632],{"class":1051}," bash\n",[430,10634,10635],{},[433,10636],{"alt":10637,"src":10638},"Chạy đoạn mã cài đặt Hermes Agent trên giao diện dòng lệnh","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-agent-installation-terminal.webp",[430,10640,10641],{},"Sau khi cài đặt thành công, hãy xác minh bằng cách gõ:",[933,10643,10645],{"className":1042,"code":10644,"language":1044,"meta":425,"style":425},"hermes --version\n",[495,10646,10647],{"__ignoreMap":425},[941,10648,10649,10651],{"class":943,"line":944},[941,10650,10514],{"class":1051},[941,10652,3616],{"class":1055},[430,10654,1840,10655,10658,10659],{},[495,10656,10657],{},"hermes setup"," để cấu hình Hermes Agent:\n",[433,10660],{"alt":10661,"src":10662},"Chạy lệnh hermes setup trong terminal để bắt đầu thiết lập","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-agent-setup-wizard.webp",[430,10664,10665,10666,10669,10670],{},"Chọn một nhà cung cấp LLM, bắt đầu bằng ",[495,10667,10668],{},"DeepSeek"," và có thể thêm các nhà cung cấp khác sau.\n",[433,10671],{"alt":10672,"src":10673},"Lựa chọn DeepSeek làm nhà cung cấp LLM trong quá trình thiết lập Hermes","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-llm-provider-selection.webp",[430,10675,10676,10677,1377,10679,10683,10687,10688,10691,10692,10687,10696,10699,10700],{},"Nhập mã khóa API của ",[495,10678,10668],{},[433,10680],{"alt":10681,"src":10682},"Nhập mã khóa API của DeepSeek trên cửa sổ dòng lệnh","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-enter-api-key.webp",[433,10684],{"alt":10685,"src":10686},"Xác nhận thành công mã khóa API của nhà cung cấp LLM","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-api-key-success.webp","\nChọn ",[495,10689,10690],{},"local machine"," để chạy Hermes Agent:\n",[433,10693],{"alt":10694,"src":10695},"Chọn local machine làm môi trường chạy cho Hermes Agent","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-select-local-machine.webp",[495,10697,10698],{},"Telegram"," trong danh sách kênh giao tiếp. Các kênh khác có thể cấu hình sau.\n",[433,10701],{"alt":10702,"src":10703},"Lựa chọn Telegram làm kênh liên lạc chính trong cấu hình Hermes","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-select-telegram-channel.webp",[889,10705,10707],{"id":10706},"bước-3-tích-hợp-với-telegram","Bước 3: Tích hợp với Telegram",[430,10709,9955,10710,10713,10714],{},[495,10711,10712],{},"[2]"," để sử dụng bot Telegram.\n",[433,10715],{"alt":10716,"src":10717},"Chọn tùy chọn để tích hợp và cấu hình bot Telegram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-bot-integration-option.webp",[430,10719,6896,10720,10722,10723],{},[495,10721,10698],{}," và tìm kiếm 'BotFather'.\n",[433,10724],{"alt":10725,"src":10726},"Tìm kiếm công cụ BotFather trên ứng dụng Telegram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-search-botfather.webp",[430,10728,10729,10730,10733,10734],{},"Nhấn ",[495,10731,10732],{},"Open"," để bắt đầu trò chuyện với 'BotFather'.\n",[433,10735],{"alt":10736,"src":10737},"Bắt đầu cuộc hội thoại với BotFather trên Telegram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-open-botfather-chat.webp",[430,10739,10729,10740,10743,10744,1806,10747],{},[495,10741,10742],{},"Create a New Bot"," (hoặc gửi lệnh ",[495,10745,10746],{},"\u002Fnewbot",[433,10748],{"alt":10749,"src":10750},"Gửi lệnh tạo bot mới \u002Fnewbot cho BotFather","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-create-new-bot.webp",[430,10752,10753,10754],{},"Nhập tên hiển thị và tên người dùng (username) để tạo bot.\n",[433,10755],{"alt":10756,"src":10757},"Thiết lập tên hiển thị và tên người dùng cho bot Telegram mới","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-bot-details-configured.webp",[430,10759,10729,10760,10763,10764],{},[495,10761,10762],{},"Copy"," để sao chép mã token và dán lại vào cửa sổ terminal.\n",[433,10765],{"alt":10766,"src":10767},"Sao chép chuỗi mã HTTP API token của bot Telegram vừa tạo","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-copy-http-api-token.webp",[430,10769,10770,10771,10773],{},"Tìm ID tài khoản người dùng ",[495,10772,10698],{}," của bạn và thêm vào danh sách người dùng được phép ('Allowed user list'):",[485,10775,10776,10786,10800],{},[488,10777,10778,10779,10781,10782],{},"Tìm kiếm '@raw_data_bot' trên ",[495,10780,10698],{},".\n",[433,10783],{"alt":10784,"src":10785},"Tìm kiếm raw data bot trên Telegram để tra cứu ID người dùng","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-search-raw-data-bot.webp",[488,10787,10788,10789,10792,10793,10781,10796],{},"Nhấn vào ",[495,10790,10791],{},"RawDataBot"," và chọn Start. ID người dùng của bạn sẽ được hiển thị ngay phía sau cụm từ ",[495,10794,10795],{},"P.S. Your ID:",[433,10797],{"alt":10798,"src":10799},"Khởi chạy RawDataBot để lấy thông tin ID tài khoản người dùng","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-raw-data-bot-user-id.webp",[488,10801,10802],{},"Sao chép ID người dùng này và dán vào terminal.",[430,10804,10805,10806,10810,10811,10815],{},"Vì hệ thống chạy trên đám mây, chúng ta muốn dịch vụ này tự động khởi chạy.\n",[433,10807],{"alt":10808,"src":10809},"Cấu hình tùy chọn tự động khởi chạy dịch vụ systemd cho Hermes","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-autostart-service-option.webp","\nĐể tất cả các tùy chọn khác ở chế độ mặc định:\n",[433,10812],{"alt":10813,"src":10814},"Giữ nguyên các thiết lập mặc định trong terminal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-leave-defaults-1.webp",[433,10816],{"alt":10817,"src":10818},"Hoàn tất các bước thiết lập cấu hình mặc định của Hermes","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-leave-defaults-2.webp",[474,10820,10822],{"id":10821},"kiểm-thử-hermes-agent-của-bạn-với-bot-telegram","Kiểm thử Hermes Agent của bạn với Bot Telegram",[430,10824,10825,10826,899],{},"Chạy lệnh sau để khởi chạy ",[495,10827,10828],{},"hermes gateway",[933,10830,10832],{"className":1042,"code":10831,"language":1044,"meta":425,"style":425},"hermes gateway\n",[495,10833,10834],{"__ignoreMap":425},[941,10835,10836,10838],{"class":943,"line":944},[941,10837,10514],{"class":1051},[941,10839,10840],{"class":1055}," gateway\n",[430,10842,10843,10844,10846],{},"Vào ",[495,10845,10698],{}," và thêm bot vừa tạo, '@tech_cloud_hermes_bot', vào cuộc trò chuyện.",[485,10848,10849,10861,10871],{},[488,10850,10851,10852,10854,10855,10781,10857],{},"Gõ '\u002Fnew' trên ",[495,10853,10698],{}," để bắt đầu một phiên làm việc mới với ",[495,10856,1723],{},[433,10858],{"alt":10859,"src":10860},"Gõ lệnh \u002Fnew trên Telegram để bắt đầu phiên làm việc mới với Hermes Agent","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-new-session.webp",[488,10862,10863,10864,10866,10867],{},"Gõ ",[495,10865,1508],{}," để liệt kê danh sách tất cả các lệnh có sẵn.\n",[433,10868],{"alt":10869,"src":10870},"Gõ lệnh \u002Fcommands trên Telegram để kiểm tra danh sách các lệnh của Hermes","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-commands-list.webp",[488,10872,10863,10873,10875,10876],{},[495,10874,1538],{}," để hiển thị danh sách các mô hình ngôn ngữ (LLM) hiện có.\n",[433,10877],{"alt":10878,"src":10879},"Gõ lệnh \u002Fmodel trên Telegram để xem danh sách các mô hình LLM sẵn có","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-model-selection.webp",[474,10881,10883],{"id":10882},"chạy-hermes-gateway-dưới-dạng-dịch-vụ-nền-background-service","Chạy Hermes Gateway dưới dạng dịch vụ nền (Background Service)",[430,10885,10886],{},"Tạo tệp cấu hình dịch vụ systemd:",[933,10888,10890],{"className":2310,"code":10889,"language":2312,"meta":425,"style":425},"sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-gateway.service\n",[495,10891,10892],{"__ignoreMap":425},[941,10893,10894,10896,10898],{"class":943,"line":944},[941,10895,1901],{"class":1051},[941,10897,2321],{"class":1055},[941,10899,10900],{"class":1055}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-gateway.service\n",[430,10902,10903,10904,10906],{},"Dán nội dung sau vào, nhớ thay thế ",[495,10905,10514],{}," trong đường dẫn '\u002Fhome\u002Fhermes' bằng tên đăng nhập của bạn:",[933,10908,10910],{"className":2336,"code":10909,"language":2338,"meta":425,"style":425},"[Unit]\nDescription=Hermes Gateway\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes gateway\nRestart=always\nRestartSec=10\nEnvironment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n\n[Install]\nWantedBy=multi-user.target\n",[495,10911,10912,10916,10921,10925,10929,10933,10937,10941,10946,10950,10954,10958,10962,10966],{"__ignoreMap":425},[941,10913,10914],{"class":943,"line":944},[941,10915,2345],{},[941,10917,10918],{"class":943,"line":1071},[941,10919,10920],{},"Description=Hermes Gateway\n",[941,10922,10923],{"class":943,"line":1078},[941,10924,2355],{},[941,10926,10927],{"class":943,"line":1085},[941,10928,1075],{"emptyLinePlaceholder":1074},[941,10930,10931],{"class":943,"line":1933},[941,10932,2364],{},[941,10934,10935],{"class":943,"line":1938},[941,10936,2369],{},[941,10938,10939],{"class":943,"line":1944},[941,10940,2374],{},[941,10942,10943],{"class":943,"line":2280},[941,10944,10945],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes gateway\n",[941,10947,10948],{"class":943,"line":2291},[941,10949,2384],{},[941,10951,10952],{"class":943,"line":2387},[941,10953,2390],{},[941,10955,10956],{"class":943,"line":2393},[941,10957,2396],{},[941,10959,10960],{"class":943,"line":2399},[941,10961,1075],{"emptyLinePlaceholder":1074},[941,10963,10964],{"class":943,"line":2404},[941,10965,2407],{},[941,10967,10968],{"class":943,"line":1704},[941,10969,2412],{},[430,10971,10972],{},"Kích hoạt và khởi chạy dịch vụ:",[933,10974,10976],{"className":2310,"code":10975,"language":2312,"meta":425,"style":425},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-gateway\nsudo systemctl start hermes-gateway\nsudo systemctl status hermes-gateway\n",[495,10977,10978,10986,10997,11007],{"__ignoreMap":425},[941,10979,10980,10982,10984],{"class":943,"line":944},[941,10981,1901],{"class":1051},[941,10983,1904],{"class":1055},[941,10985,2431],{"class":1055},[941,10987,10988,10990,10992,10994],{"class":943,"line":1071},[941,10989,1901],{"class":1051},[941,10991,1904],{"class":1055},[941,10993,2031],{"class":1055},[941,10995,10996],{"class":1055}," hermes-gateway\n",[941,10998,10999,11001,11003,11005],{"class":943,"line":1078},[941,11000,1901],{"class":1051},[941,11002,1904],{"class":1055},[941,11004,2451],{"class":1055},[941,11006,10996],{"class":1055},[941,11008,11009,11011,11013,11015],{"class":943,"line":1085},[941,11010,1901],{"class":1051},[941,11012,1904],{"class":1055},[941,11014,1928],{"class":1055},[941,11016,10996],{"class":1055},[474,11018,6168],{"id":6167},[430,11020,11021],{},"Trong bài viết này, chúng ta đã tìm hiểu cách thiết lập Hermes Agent và sử dụng Telegram để giao tiếp với nó. Việc khởi chạy Hermes Agent trên máy chủ từ xa sẽ mang lại cho bạn một trợ lý ảo thực sự hoạt động liên tục 24\u002F7.",[1648,11023,11024],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":425,"searchDepth":1071,"depth":1078,"links":11026},[11027,11028,11033,11034,11035],{"id":10443,"depth":1071,"text":10444},{"id":10453,"depth":1071,"text":10454,"children":11029},[11030,11031,11032],{"id":10457,"depth":1078,"text":10458},{"id":10609,"depth":1078,"text":10610},{"id":10706,"depth":1078,"text":10707},{"id":10821,"depth":1071,"text":10822},{"id":10882,"depth":1071,"text":10883},{"id":6167,"depth":1071,"text":6168},[1668],"2026-06-19","Triển khai Hermes Agent trên VPS từ xa để hoạt động 24\u002F7. Theo dõi hướng dẫn chi tiết từng bước này để tích hợp nó với bot Telegram tùy chỉnh của riêng bạn.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002FVI-How%20to%20Setup%20Hermes%20on%20Remote%20Server.webp","Hướng dẫn từng bước cách triển khai Hermes Agent trên VPS Linux và tích hợp với bot Telegram kustom hoạt động 24\u002F7.",{"schemaOrg":11042,"robots":1702,"sitemap":11054},[11043],{"@type":1681,"name":1738,"description":11038,"image":11039,"step":11044},[11045,11048,11051],{"@type":1684,"name":10458,"text":11046,"image":10480,"url":11047},"Mở terminal và SSH vào máy chủ từ xa của bạn: Đảm bảo các gói phần mềm trên máy chủ được cập nhật mới nhất: Thêm một người dùng mới, đặt tên là `he...","#bc-1-kt-ni-vi-vps-ca-bn",{"@type":1684,"name":10610,"text":11049,"image":10638,"url":11050},"Chạy lệnh sau: Sau khi cài đặt thành công, hãy xác minh bằng cách gõ: Chạy `hermes setup` để cấu hình Hermes Agent: Chọn một nhà cung cấp LLM, bắt ...","#bc-2-ci-t-hermes-agent",{"@type":1684,"name":10707,"text":11052,"image":10717,"url":11053},"Chọn `[2]` để sử dụng bot Telegram. Truy cập `Telegram` và tìm kiếm 'BotFather'. Nhấn `Open` để bắt đầu trò chuyện với 'BotFather'. Nhấn `Create a ...","#bc-3-tch-hp-vi-telegram",{"lastmod":11037},{"title":11056,"description":11038,"ogTitle":1738,"ogDescription":11038,"twitterTitle":1738,"twitterDescription":11038},"Hermes Agent VPS Setup: Telegram Bot Integration Guide","vi\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",[1723,11059,11060,11061,8723],"VPS Setup","Telegram Bot","Linux VPS","4-9q6N7aFtmHUR60IX3tSrNuncW9lveH8uKa7ELt2Qo",{"id":11064,"title":11065,"author":1711,"body":11066,"category":11503,"date":11504,"description":11505,"extension":1673,"image":11506,"imageAlt":11507,"isPublished":1074,"meta":11508,"minRead":2387,"navigation":1074,"path":303,"seo":11512,"stem":11514,"tags":11515,"updatedAt":1711,"__hash__":11518},"article\u002Fvi\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude.md","Hướng dẫn thiết lập và sử dụng NetSuite AI Connector (MCP)",{"type":427,"value":11067,"toc":11489},[11068,11071,11086,11090,11100,11116,11120,11251,11255,11309,11313,11365,11369,11373,11379,11384,11388,11394,11406,11410,11420,11436,11440,11446,11451,11455,11461,11464,11466],[430,11069,11070],{},"Oracle NetSuite từ lâu đã là nền tảng hoạch định nguồn lực doanh nghiệp (ERP) dựa trên đám mây dành cho các doanh nghiệp vừa và nhỏ. Tuy nhiên, giao diện web của nó nổi tiếng là khó học, điều hướng phức tạp cần nhiều lượt nhấp chuột và các cấu trúc báo cáo cứng nhắc.",[430,11072,11073,11074,11077,11078,11081,11082,11085],{},"Với sự ra mắt gần đây của ",[441,11075,11076],{},"NetSuite AI Connector Service",", người dùng giờ đây có thể tận dụng ",[441,11079,11080],{},"Model Context Protocol (MCP)"," và các ",[441,11083,11084],{},"Trợ lý AI (Trí tuệ nhân tạo)"," để đặt câu hỏi trực tiếp bằng ngôn ngữ tự nhiên và nhận câu trả lời theo thời gian thực từ dữ liệu tài chính và hoạt động của họ.",[474,11087,11089],{"id":11088},"cơ-chế-hoạt-động-của-netsuite-mcp-ai-connector","Cơ chế hoạt động của NetSuite MCP AI Connector",[430,11091,11092,11095,11096,11099],{},[441,11093,11094],{},"MCP của NetSuite"," cung cấp một bộ công cụ cho ",[441,11097,11098],{},"AI",", chẳng hạn như chạy truy vấn SuiteQL, đọc Tìm kiếm đã Lưu (Saved Searches) và báo cáo, hoặc thực hiện các thao tác ghi nhận dữ liệu như tạo hồ sơ khách hàng mới. Tất cả các công cụ đều được kiểm soát bởi phân quyền dựa trên vai trò gốc của NetSuite.",[430,11101,11102,11103,11105,11106,11108,11109,11112,11113,11115],{},"Khi người dùng đặt câu hỏi bằng ngôn ngữ tự nhiên, ",[441,11104,11098],{}," sẽ sử dụng ",[441,11107,11080],{}," để dịch yêu cầu đó thành các hoạt động có cấu trúc mà NetSuite có thể hiểu được. ",[441,11110,11111],{},"NetSuite"," thực hiện các hoạt động này bằng phân quyền của chính người dùng, và kết quả được trả lại cho ",[441,11114,11098],{}," để phân tích và trình bày.",[474,11117,11119],{"id":11118},"hướng-dẫn-thiết-lập-netsuite-ai-connector","Hướng dẫn thiết lập NetSuite AI Connector",[533,11121,11122,11175,11188,11197,11204,11211,11232],{},[488,11123,11124,11125,575,11128,11131],{},"Bật ",[441,11126,11127],{},"Server SuiteScript",[441,11129,11130],{},"REST Web Services",[533,11132,11133,11143,11169],{},[488,11134,2175,11135,11138,11139],{},[909,11136,11137],{},"Setup > Company > Enable Features"," (Thiết lập > Công ty > Kích hoạt Tính năng).\n",[433,11140],{"alt":11141,"src":11142},"Giao diện cấu hình Bật tính năng của Oracle NetSuite trong phần Thiết lập công ty","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-setup-company-enable-features.webp",[488,11144,11145,11146,1377,11149],{},"Trên tab phụ ",[441,11147,11148],{},"SuiteCloud",[485,11150,11151,11160],{},[488,11152,11153,11154,10781,11156],{},"Dưới mục SuiteScript, tích chọn ô ",[441,11155,11127],{},[433,11157],{"alt":11158,"src":11159},"Bật tính năng Server SuiteScript trong tab SuiteCloud của NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-enable-features-server-suitescript.webp",[488,11161,11162,11163,10781,11165],{},"Dưới mục SuiteTalk (Web Services), tích chọn ô ",[441,11164,11130],{},[433,11166],{"alt":11167,"src":11168},"Bật tính năng REST Web Services trong tab SuiteCloud của NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-enable-features-rest-web-services.webp",[488,11170,11171,11172,11174],{},"Nhấp ",[441,11173,1148],{}," (Lưu).",[488,11176,2536,11177,11180,11181,10781,11184],{},[441,11178,11179],{},"NetSuite MCP Standard Tools"," trước. Nhấp vào ",[909,11182,11183],{},"Customization > SuiteCloud Development > SuiteApp Marketplace",[433,11185],{"alt":11186,"src":11187},"Điều hướng đến cửa hàng ứng dụng SuiteApp Marketplace dưới mục Tùy chỉnh trong NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-marketplace-navigation.webp",[488,11189,11190,11191,10781,11193],{},"Tìm kiếm từ khóa ",[441,11192,11179],{},[433,11194],{"alt":11195,"src":11196},"Tìm kiếm ứng dụng NetSuite MCP Standard Tools trên SuiteApp Marketplace","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-marketplace-search-mcp-tools.webp",[488,11198,11199,11200],{},"Sau khi cài đặt xong, bạn sẽ thấy trạng thái 'Installed' (Đã cài đặt) ở bên phải.\n",[433,11201],{"alt":11202,"src":11203},"Ứng dụng NetSuite MCP Standard Tools hiển thị trạng thái Đã cài đặt trên Marketplace","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-installed-status-mcp-tools.webp",[488,11205,11206,11207],{},"Làm theo hướng dẫn tương tự để cài đặt 'NetSuite AI Connector Service Companion'.\n",[433,11208],{"alt":11209,"src":11210},"Ứng dụng NetSuite AI Connector Service Companion hiển thị trạng thái Đã cài đặt","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-installed-ai-connector-companion.webp",[488,11212,11213,11214],{},"Thiết lập một Integration Record (Hồ sơ Tích hợp)\n",[533,11215,11216,11225],{},[488,11217,2175,11218,10781,11221],{},[909,11219,11220],{},"Setup > Integration > Manage Integrations",[433,11222],{"alt":11223,"src":11224},"Điều hướng đến Quản lý tích hợp trong menu Thiết lập của NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-integration-manage-integrations-navigation.webp",[488,11226,11227,11228],{},"Tạo một Integration Record cho ChatGPT, và chúng ta sẽ quay lại với token_id thực tế sau:\n",[433,11229],{"alt":11230,"src":11231},"Tạo một bản ghi tích hợp mới trên NetSuite để kết nối với ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-create-integration-record-chatgpt.webp",[488,11233,11234,11235,11239,11243,11247],{},"Tạo một vai trò tùy chỉnh (custom role) cho MCP với các quyền tối thiểu và gán cho người dùng, ví dụ:\n",[433,11236],{"alt":11237,"src":11238},"Cấu hình phân quyền vai trò tùy chỉnh cho tích hợp NetSuite MCP - Phần 1","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-1.webp",[433,11240],{"alt":11241,"src":11242},"Cấu hình phân quyền vai trò tùy chỉnh cho tích hợp NetSuite MCP - Phần 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-2.webp",[433,11244],{"alt":11245,"src":11246},"Cấu hình phân quyền vai trò tùy chỉnh cho tích hợp NetSuite MCP - Phần 3","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-3.webp",[433,11248],{"alt":11249,"src":11250},"Cấu hình phân quyền vai trò tùy chỉnh cho tích hợp NetSuite MCP - Phần 4","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-4.webp",[474,11252,11254],{"id":11253},"cách-tích-hợp-netsuite-mcp-với-chatgpt","Cách tích hợp NetSuite MCP với ChatGPT",[533,11256,11257,11264,11271,11278,11288,11295,11302],{},[488,11258,11259,11260],{},"Nhấp vào 'Settings' (Cài đặt).\n",[433,11261],{"alt":11262,"src":11263},"Điều hướng đến mục Cài đặt trong giao diện người dùng của ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-settings-navigation.webp",[488,11265,11266,11267],{},"Nhấp vào 'Apps' > 'Advanced settings' (Cài đặt nâng cao).\n",[433,11268],{"alt":11269,"src":11270},"Điều hướng đến mục Ứng dụng và Cài đặt nâng cao trong cấu hình ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-apps-advanced-settings.webp",[488,11272,11273,11274],{},"Bật 'Developer mode' (Chế độ nhà phát triển), sau đó nhấp vào 'Create app' (Tạo ứng dụng).\n",[433,11275],{"alt":11276,"src":11277},"Bật Chế độ nhà phát triển và nhấp vào Tạo ứng dụng trong cài đặt ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-developer-mode-create-app.webp",[488,11279,11280,11281,10781,11284],{},"Nhập các thông tin chi tiết. Đối với mục Connection, nhập ",[495,11282,11283],{},"https:\u002F\u002F\u003Caccount_id>.suitetalk.api.netsuite.com\u002Fservices\u002Fmcp\u002Fv1\u002Fall",[433,11285],{"alt":11286,"src":11287},"Nhập chi tiết URL kết nối NetSuite MCP để tạo ứng dụng trong ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-create-app-netsuite-mcp-connection.webp",[488,11289,11290,11291],{},"Nhấp vào 'Create'. Sau khi được tích hợp, bạn sẽ thấy cửa sổ bật lên sau.\n",[433,11292],{"alt":11293,"src":11294},"Thông báo xác nhận hiển thị NetSuite MCP đã được tích hợp thành công vào ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-netsuite-mcp-integrated-popup.webp",[488,11296,11297,11298],{},"Nhấp vào 'Sign in with NetSuite MCP' (Đăng nhập bằng NetSuite MCP).\n",[433,11299],{"alt":11300,"src":11301},"Yêu cầu từ ChatGPT để đăng nhập bằng các công cụ tiêu chuẩn của NetSuite MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-sign-in-with-netsuite-mcp.webp",[488,11303,11304,11305],{},"Nhấp vào nút 'Continue' để cấp quyền.\n",[433,11306],{"alt":11307,"src":11308},"Cấp quyền kết nối cho NetSuite MCP trên màn hình ủy quyền của ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-grant-permissions-netsuite-mcp.webp",[474,11310,11312],{"id":11311},"cách-tích-hợp-netsuite-mcp-với-claude-ai","Cách tích hợp NetSuite MCP với Claude AI",[533,11314,11315,11322,11329,11336,11351,11358],{},[488,11316,11317,11318],{},"Nhấp vào 'Customize' (Tùy chỉnh).\n",[433,11319],{"alt":11320,"src":11321},"Nhấp vào tùy chọn Tùy chỉnh trong giao diện người dùng của Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-customize-navigation.webp",[488,11323,11324,11325],{},"Nhấp vào 'Connect your apps' (Kết nối ứng dụng của bạn).\n",[433,11326],{"alt":11327,"src":11328},"Nhấp vào Kết nối ứng dụng của bạn trong cài đặt tùy chỉnh của Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-connect-your-apps.webp",[488,11330,11331,11332],{},"Tìm kiếm từ khóa 'NetSuite'.\n",[433,11333],{"alt":11334,"src":11335},"Tìm kiếm ứng dụng NetSuite trong danh sách ứng dụng kết nối của Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-search-netsuite-app.webp",[488,11337,11338,11339,11342,11343,11346,11347],{},"Nhấp vào 'NetSuite' và nhập URL máy chủ: ",[495,11340,11341],{},"https:\u002F\u002F\u003Caccount_id>.suitetalk.api.netsuite.com\u002Fservices\u002Fmcp\u002Fv1\u002Fsuiteapp\u002Fcom.netsuite.mcpstandardtools",". Thay thế ",[495,11344,11345],{},"\u003Caccount_id>"," bằng ID tài khoản thực tế của bạn.\n",[433,11348],{"alt":11349,"src":11350},"Nhập URL kết nối máy chủ NetSuite MCP trong cài đặt của Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-server-url-setup.webp",[488,11352,11353,11354],{},"Nhấp vào nút 'Continue'.\n",[433,11355],{"alt":11356,"src":11357},"Nhấp vào Tiếp tục để xác thực kết nối máy chủ NetSuite MCP trong Claude","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-continue-authentication.webp",[488,11359,11360,11361],{},"Nhấp 'Continue' để xác thực trình kết nối.\n",[433,11362],{"alt":11363,"src":11364},"Xác thực cuối cùng để kích hoạt trình kết nối NetSuite MCP trong Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-authenticate-connector.webp",[474,11366,11368],{"id":11367},"các-trường-hợp-sử-dụng-netsuite-ai-thực-tế","Các trường hợp sử dụng NetSuite AI thực tế",[889,11370,11372],{"id":11371},"trường-hợp-sử-dụng-trên-chatgpt-hiển-thị-các-hóa-đơn-quá-hạn-trên-30-ngày-trong-netsuite","Trường hợp sử dụng trên ChatGPT: Hiển thị các hóa đơn quá hạn trên 30 ngày trong NetSuite",[430,11374,11375],{},[433,11376],{"alt":11377,"src":11378},"ChatGPT chạy truy vấn SuiteQL để lọc và hiển thị các hóa đơn quá hạn trên NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-netsuite-overdue-invoices-query-result.webp",[485,11380,11381],{},[488,11382,11383],{},"ChatGPT đã tạo truy vấn SuiteQL và chạy nó. Điều này rất tiện lợi và tiết kiệm nhiều thời gian so với việc tự tạo báo cáo bằng giao diện web NetSuite.",[889,11385,11387],{"id":11386},"trường-hợp-sử-dụng-trên-chatgpt-và-claude-bạn-có-thể-vẽ-doanh-số-của-30-ngày-qua-bằng-biểu-đồ-đường-không","Trường hợp sử dụng trên ChatGPT và Claude: Bạn có thể vẽ doanh số của 30 ngày qua bằng biểu đồ đường không?",[430,11389,11390],{},[433,11391],{"alt":11392,"src":11393},"ChatGPT gặp lỗi không thể vẽ biểu đồ đường doanh số từ dữ liệu NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-failed-render-netsuite-sales-line-graph.webp",[485,11395,11396,11399],{},[488,11397,11398],{},"ChatGPT đã không thể tạo biểu đồ đường trực tiếp.",[488,11400,11401,11402],{},"Tôi đã thử trên Claude và nó hoạt động tốt. Sự khác biệt này có thể là do khả năng xử lý của mô hình ngôn ngữ lớn (LLM).\n",[433,11403],{"alt":11404,"src":11405},"Claude AI vẽ thành công biểu đồ đường trực quan hóa doanh số bán hàng của NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-successfully-rendered-netsuite-sales-line-graph.webp",[889,11407,11409],{"id":11408},"trường-hợp-sử-dụng-trên-claude-tạo-một-hồ-sơ-khách-hàng-mới","Trường hợp sử dụng trên Claude: Tạo một hồ sơ khách hàng mới",[430,11411,11412,11416],{},[433,11413],{"alt":11414,"src":11415},"Yêu cầu Claude AI tạo một hồ sơ khách hàng mới trực tiếp trên NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-create-netsuite-customer-record-prompt.webp",[433,11417],{"alt":11418,"src":11419},"Claude AI phản hồi xác nhận đã tạo thành công hồ sơ khách hàng NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-create-netsuite-customer-record-success.webp",[485,11421,11422,11429],{},[488,11423,11424,11425],{},"Kiểm tra lại trên giao diện web của NetSuite xác nhận hồ sơ đã được tạo thành công.\n",[433,11426],{"alt":11427,"src":11428},"Xác minh hồ sơ khách hàng mới tạo trên giao diện người dùng web của NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-ui-verify-new-customer-record-created.webp",[488,11430,11431,11432],{},"Chạy kiểm tra trong ChatGPT cho thấy hồ sơ đã có sẵn:\n",[433,11433],{"alt":11434,"src":11435},"ChatGPT xác nhận rằng hồ sơ khách hàng NetSuite mới tạo đã hiển thị sẵn","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-verify-netsuite-customer-record-available.webp",[889,11437,11439],{"id":11438},"trường-hợp-sử-dụng-trên-claude-chạy-truy-vấn-suiteql-trực-tiếp","Trường hợp sử dụng trên Claude: Chạy truy vấn SuiteQL trực tiếp",[430,11441,11442],{},[433,11443],{"alt":11444,"src":11445},"Claude AI trực tiếp thực thi và hiển thị kết quả truy vấn SuiteQL của NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-run-suiteql-query-result.webp",[485,11447,11448],{},[488,11449,11450],{},"Truy vấn SuiteQL có thể được thực thi trực tiếp.",[474,11452,11454],{"id":11453},"đánh-giá-tổng-quan-về-netsuite-ai-connector","Đánh giá tổng quan về NetSuite AI Connector",[430,11456,11457,11458,11460],{},"Lợi ích lớn nhất khi sử dụng MCP là dành cho những người dùng không có nhiều chuyên môn kỹ thuật để tự tạo ra các báo cáo phức tạp. Họ có thể dùng ngôn ngữ tự nhiên để truy vấn dữ liệu và yêu cầu ",[441,11459,11098],{}," trình bày báo cáo chính xác theo cách họ mong muốn.",[430,11462,11463],{},"Để ngăn chặn các cuộc tấn công prompt injection và lạm dụng các thao tác ghi dữ liệu ('write'), chỉ nên cấp quyền ghi cho một số hồ sơ và giao dịch nhất định. Khi AI sử dụng MCP để cập nhật hoặc tạo hồ sơ, nó sẽ thực thi dưới dạng SuiteScript phía máy chủ, điều này hoàn toàn bỏ qua mọi tập lệnh phía máy khách (client-side) hoặc kiểm tra tính hợp lệ của biểu mẫu.",[474,11465,1620],{"id":1619},[485,11467,11468,11475,11482],{},[488,11469,11470],{},[444,11471,11474],{"href":11472,"rel":11473},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Farticle_0902023450.html#subsect_90090238176",[448],"Cài đặt MCP Standard Tools SuiteApp",[488,11476,11477],{},[444,11478,11481],{"href":11479,"rel":11480},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Farticle_4160616848.html#subsect_0419123151",[448],"FAQ Dịch vụ NetSuite AI Connector",[488,11483,11484],{},[444,11485,11488],{"href":11486,"rel":11487},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Fsection_0714082142.html#bridgehead_0804033331",[448],"Kết nối với Dịch vụ NetSuite AI Connector",{"title":425,"searchDepth":1071,"depth":1078,"links":11490},[11491,11492,11493,11494,11495,11501,11502],{"id":11088,"depth":1071,"text":11089},{"id":11118,"depth":1071,"text":11119},{"id":11253,"depth":1071,"text":11254},{"id":11311,"depth":1071,"text":11312},{"id":11367,"depth":1071,"text":11368,"children":11496},[11497,11498,11499,11500],{"id":11371,"depth":1078,"text":11372},{"id":11386,"depth":1078,"text":11387},{"id":11408,"depth":1078,"text":11409},{"id":11438,"depth":1078,"text":11439},{"id":11453,"depth":1071,"text":11454},{"id":1619,"depth":1071,"text":1620},[1668],"2026-06-13","Thiết lập NetSuite AI Connector (MCP) với ChatGPT và Claude. Khám phá cách truy vấn dữ liệu ERP trực quan và tự động hóa tác vụ bằng ngôn ngữ tự nhiên.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002FVI-Setup-NetSuite-MCP-on-ChatGPT-%26-Claude.webp","Hình thu nhỏ tích hợp AI NetSuite MCP có nền doanh nghiệp màu xanh đậm với logo ChatGPT và Claude được kết nối với cơ sở dữ liệu đám mây NetSuite",{"schemaOrg":11509,"robots":1702,"sitemap":11511},[11510],{"@type":1679,"headline":11065,"description":11505},{"lastmod":11504},{"title":11513,"description":11505,"ogTitle":11065,"ogDescription":11505,"twitterTitle":11065,"twitterDescription":11505},"Tích hợp AI NetSuite MCP: Kết nối ChatGPT và Claude","vi\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",[11111,6955,11516,11517,11098],"ChatGPT","Claude","7QAPAbmlNLN-JV0fnljJtlkwb-WNpM1fb87BSr0of-g",{"id":11520,"title":11521,"author":1711,"body":11522,"category":11714,"date":11715,"description":11716,"extension":1673,"image":11717,"imageAlt":11718,"isPublished":1074,"meta":11719,"minRead":1944,"navigation":1074,"path":309,"seo":11723,"stem":11724,"tags":11725,"updatedAt":1711,"__hash__":11729},"article\u002Fvi\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis.md","Đánh giá Claude Fable 5: Phân tích Tài chính Doanh nghiệp",{"type":427,"value":11523,"toc":11712},[11524,11535,11546,11549,11555,11571,11581,11587,11593,11599,11621,11630,11644,11652,11670,11673,11684,11693,11696,11709],[430,11525,11526,11527,11530,11531],{},"Vào ngày 9 tháng 6 năm 2026, Anthropic đã phát hành ",[441,11528,11529],{},"Claude Fable 5",", một mô hình thuộc Lớp Mythos với các biện pháp bảo vệ tiên tiến trong một số lĩnh vực như an ninh mạng, chưng cất hóa học, hóa học và sinh học.\n",[433,11532],{"alt":11533,"src":11534},"Thông báo ra mắt Anthropic Claude Fable 5 và các nâng cấp tính năng vượt trội của mô hình","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-launch-announcement.webp",[430,11536,11537,11538,11541,11542],{},"Anthropic đã công bố các số liệu cho thấy Fable 5 vượt trội hơn Opus 4.8 và GPT-5.5 trên một số bài kiểm tra chuẩn (benchmark) chính. Trong ",[441,11539,11540],{},"GDPval-AA (công việc tri thức)",", mô hình này vượt xa Opus 4.8, GPT 5.5 và Gemini 3.1 Pro.\n",[433,11543],{"alt":11544,"src":11545},"Bản đồ so sánh chuẩn hiệu năng Claude Fable 5 bao gồm điểm công việc tri thức GDPval-AA","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-benchmarks-gdpval-aa.webp",[430,11547,11548],{},"Theo Claude, \"Fable 5 cho thấy hiệu suất mạnh mẽ trong các tác vụ phân tích phức tạp\".",[430,11550,11551],{},[433,11552],{"alt":11553,"src":11554},"Báo cáo khẳng định hiệu suất mạnh mẽ của Claude Fable 5 đối với các phân tích dữ liệu phức tạp","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-analytical-performance-statement.webp",[430,11556,11557,11558,11561,11562,11565,11566,461],{},"Chúng tôi quyết định thử nghiệm ",[441,11559,11560],{},"Fable 5"," bằng cách chạy phân tích so sánh về 'Space Exploration Technologies Corporation (SpaceX)' cho mục đích nghiên cứu đầu tư, sử dụng kỹ năng '",[441,11563,11564],{},"comps-analysis","'. Tệp 'skill.md' được lấy từ ",[444,11567,11570],{"href":11568,"rel":11569},"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Ffinancial-services\u002Fblob\u002Fmain\u002Fplugins\u002Fagent-plugins\u002Fmarket-researcher\u002Fskills\u002Fcomps-analysis\u002FSKILL.md",[448],"kho lưu trữ GitHub dịch vụ tài chính của Anthropic",[430,11572,11573,11577],{},[433,11574],{"alt":11575,"src":11576},"Kích hoạt kỹ năng phân tích so sánh tài chính của SpaceX trong giao diện chat Claude","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-skill-initiation.webp",[433,11578],{"alt":11579,"src":11580},"Claude Fable 5 đang tự động thực hiện quy trình so sánh tài chính doanh nghiệp SpaceX","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-running-progress.webp",[430,11582,11583],{},[433,11584],{"alt":11585,"src":11586},"Kết quả phân tích tài chính so sánh SpaceX được hoàn thành tự động bởi quy trình của hệ thống","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-skill-results-terminal.webp",[430,11588,11589,11590,11592],{},"Tác vụ này mất khoảng 25 phút. Claude không yêu cầu bất kỳ câu hỏi làm rõ nào ngoại trừ việc xin phép truy cập các trang web bên ngoài. Thật ấn tượng, ",[441,11591,11560],{}," có khả năng tự động tìm kiếm các công ty cùng ngành để so sánh.",[430,11594,11595],{},[433,11596],{"alt":11597,"src":11598},"Claude Fable 5 yêu cầu sự đồng ý truy cập vào các nguồn thông tin mạng bên ngoài","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-external-site-access-permission.webp",[430,11600,11601,11605,11606,11609,11610,11615,11616,461],{},[433,11602],{"alt":11603,"src":11604},"Danh sách các công ty cùng phân khúc SpaceX được Claude Fable 5 tự động tìm kiếm thành công","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-spacex-comps-excel-memo.webp","\n*",[441,11607,11608],{},"Xin lưu ý:"," Thử nghiệm này chỉ phục vụ mục đích nghiên cứu và giáo dục, không cấu thành lời khuyên đầu tư. Các tệp được tạo ban đầu có thể được tải xuống tại đây: tệp Excel ",[444,11611,11614],{"href":11612,"rel":11613},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Comps_Analysis_2026-06-10.xlsx",[448],"SpaceX_Comps_Analysis_2026-06-10.xlsx"," và báo cáo PDF ",[444,11617,11620],{"href":11618,"rel":11619},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Comps_Memo_2026-06-10.pdf",[448],"SpaceX_Comps_Memo_2026-06-10.pdf",[430,11622,11623,11624,11627,11628,461],{},"Khi chúng tôi thử nghiệm cùng một kỹ năng bằng ",[441,11625,11626],{},"Qwen deep research",", chúng tôi phải nhập các công ty đối thủ theo cách thủ công. Các số liệu thống kê có sự khác biệt nhỏ so với ",[441,11629,11560],{},[430,11631,11632,11636,11640],{},[433,11633],{"alt":11634,"src":11635},"Khởi động quy trình phân tích so sánh đầu tư SpaceX trong công cụ tìm kiếm Qwen deep research","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-initiation.webp",[433,11637],{"alt":11638,"src":11639},"Cung cấp danh sách đối thủ thủ công trong Qwen deep research để phân tích doanh nghiệp SpaceX","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-running.webp",[433,11641],{"alt":11642,"src":11643},"Xem trước báo cáo thống kê tăng trưởng tài chính của SpaceX được tổng hợp bởi mô hình Qwen","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-report-preview.webp",[430,11645,11646,11647,461],{},"*Báo cáo do Qwen tạo ra có thể được tải xuống tại đây: ",[444,11648,11651],{"href":11649,"rel":11650},"https:\u002F\u002Ftechvoyage.dev\u002FThe_SpaceX_Comp_Analysis_A_Statistical_Benchmark_of_Growth_Efficiency_and_Valuation_Against_Public_Peers.pdf",[448],"The_SpaceX_Comp_Analysis_A_Statistical_Benchmark_of_Growth_Efficiency_and_Valuation_Against_Public_Peers.pdf",[430,11653,11654,11655,11658,11659,10781,11662,11666],{},"Mặc dù cả hai báo cáo từ Claude và Qwen đều được tạo ra dựa trên cùng một phương pháp được chỉ định trong kỹ năng, nhưng các con số có sự chênh lệch do Claude và Qwen lấy dữ liệu từ các nguồn khác nhau. Ví dụ, Claude Fable 5 đã sử dụng ",[441,11656,11657],{},"Stock Analysis"," trong khi Qwen sử dụng ",[441,11660,11661],{},"SEC.gov",[433,11663],{"alt":11664,"src":11665},"Dữ liệu tài chính doanh nghiệp được trích xuất từ trang Stock Analysis bởi mô hình Claude Fable 5","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-data-source-stock-analysis.webp",[433,11667],{"alt":11668,"src":11669},"Các hồ sơ SEC chính thức và hệ thống dữ liệu SEC.gov được thu thập bởi Qwen deep research","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-data-source-sec-gov.webp",[430,11671,11672],{},"Báo cáo từ Qwen cũng chứa nhiều thông tin chi tiết hơn về mô hình kinh doanh, cơ cấu vốn và hoạt động vận hành của doanh nghiệp.",[430,11674,11675,11676,11679,11680],{},"Sau khi so sánh các báo cáo, chúng tôi quyết định thử lại với lệnh ",[495,11677,11678],{},"\u002Fresearch"," trong ứng dụng Claude trên máy tính.\n",[433,11681],{"alt":11682,"src":11683},"Thực hiện khảo sát thị trường sâu hơn với lệnh \u002Fresearch mới trong ứng dụng Claude cho máy tính","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-desktop-research-command-spacex.webp",[430,11685,11686,11687,11692],{},"Báo cáo phân tích mới được tạo, ",[444,11688,11691],{"href":11689,"rel":11690},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Analysis.pdf",[448],"SpaceX_Analysis.pdf",", bao gồm thêm các phần khuyến nghị và cảnh báo bổ sung. So với tính năng tìm kiếm sâu của Qwen, báo cáo này vẫn thiếu thông tin chi tiết về doanh nghiệp như hoạt động vận hành và cơ cấu vốn.",[430,11694,11695],{},"Liệu Fable 5 có xứng đáng với mức giá cao cấp của nó không? Nó có thể hữu ích cho các tác vụ khó khăn, kéo dài và lập trình tự động. Nhưng đối với một số công việc tri thức nhất định, chẳng hạn như phân tích công ty, nó có thể chưa phải là lựa chọn tối ưu nhất về mặt chi phí.",[430,11697,11698,11699,11701,11702,10781,11705],{},"Cuối cùng, chúng tôi đã thử nghiệm khả năng dịch thuật của ",[441,11700,11560],{},". Thật kỳ lạ, mô hình đã tự động chuyển đổi trở lại ",[441,11703,11704],{},"Opus 4.8",[433,11706],{"alt":11707,"src":11708},"Giao diện hệ thống tự động đổi từ mô hình Fable 5 sang Opus 4.8 khi xử lý tác vụ dịch thuật","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-translation-opus-switching.webp",[430,11710,11711],{},"Liệu điều này có nghĩa là mọi chuyển đổi ngữ cảnh dài sẽ bị trả về Opus 4.8? Đây chỉ là một lỗi tạm thời trong quá trình sử dụng trước ngày 22 tháng 6? Hay chỉ đơn giản là hệ thống đủ thông minh để nhận biết rằng tác vụ dịch thuật không cần một mô hình mạnh mẽ đến vậy.",{"title":425,"searchDepth":1071,"depth":1078,"links":11713},[],[1668],"2026-06-11","Chúng tôi thử nghiệm Claude Fable 5 của Anthropic với Qwen Deep Research để phân tích tài chính. Liệu bản nâng cấp mới này có thực sự xứng đáng với chi phí?","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002FVI-Testing-Claude-Fable-5-in-Financial-Analysis.webp","Claude Fable 5 vs Qwen: Thử Nghiệm Phân Tích Tài Chính AI",{"schemaOrg":11720,"robots":1702,"sitemap":11722},[11721],{"@type":1679,"headline":11521,"description":11716},{"lastmod":11715},{"title":11718,"description":11716,"ogTitle":11521,"ogDescription":11716,"twitterTitle":11521,"twitterDescription":11716},"vi\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",[11529,11726,11727,11728],"Phân tích tài chính","Qwen Deep Research","Điểm chuẩn AI","c3GxopTOnfARNkxVrHpavIOXwIW0JvAG1M7l4mXSa2A",{"id":11731,"title":11732,"author":1711,"body":11733,"category":11941,"date":11942,"description":11943,"extension":1673,"image":11944,"imageAlt":11945,"isPublished":1074,"meta":11946,"minRead":1938,"navigation":1074,"path":311,"seo":11950,"stem":11951,"tags":11952,"updatedAt":1711,"__hash__":11953},"article\u002Fvi\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2.md","Hướng dẫn sử dụng Browser và Scheduler trong Antigravity 2",{"type":427,"value":11734,"toc":11936},[11735,11749,11753,11759,11768,11783,11789,11792,11803,11807,11810,11817,11824,11835,11838,11844,11855,11861,11871,11884,11894,11904,11907,11913,11915,11925],[430,11736,11737,11738,575,11741,11744,11745,11748],{},"Các lệnh ",[495,11739,11740],{},"\u002Fbrowser",[495,11742,11743],{},"\u002Fschedule"," trong ",[441,11746,11747],{},"Google Antigravity 2"," định nghĩa lại cách chúng ta tương tác với AI. Hai lệnh này biến Antigravity thành một nền tảng tự động hóa chủ động, có thể tương tác trực tiếp với môi trường web thực tế và chạy các luồng công việc định kỳ.",[474,11750,11752],{"id":11751},"browser-run","Browser Run",[430,11754,11755,11756,11758],{},"Lệnh ",[495,11757,11740],{}," bắt buộc sử dụng trình duyệt Chrome để hoàn thành tác vụ. Người dùng vẫn giữ quyền kiểm soát về thời điểm và cách thức các tác nhân truy cập web trong suốt luồng công việc. Ảnh chụp màn hình và video clip sẽ được ghi lại trong quá trình này.",[430,11760,11761,11764],{},[441,11762,11763],{},"Trường hợp sử dụng:",[433,11765],{"alt":11766,"src":11767},"Sử dụng lệnh \u002Fbrowser để gửi đơn xin nghỉ ốm","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-command-sick-leave-prompt.webp",[430,11769,11770,11771,11775,11779],{},"Dưới đây là kết quả đầu ra từ tác nhân:\n",[433,11772],{"alt":11773,"src":11774},"Tiểu tác nhân tự động hóa trình duyệt bắt đầu nhiệm vụ gửi đơn xin nghỉ ốm","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-subagent-delegation.webp",[433,11776],{"alt":11777,"src":11778},"Công cụ tự động hóa trình duyệt thiết lập Chrome với gỡ lỗi từ xa và quyền","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-permissions-and-chrome-setup.webp",[433,11780],{"alt":11781,"src":11782},"Tiểu tác nhân trình duyệt tạm dừng tại trang đăng nhập yêu cầu thông tin xác thực","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-login-wall-encountered.webp",[430,11784,11785],{},[433,11786],{"alt":11787,"src":11788},"Tiểu tác nhân trình duyệt đang đợi người dùng hoàn tất quá trình đăng nhập","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-waiting-for-user-login.webp",[430,11790,11791],{},"Antigravity hoàn toàn có thể mở trang web và điền biểu mẫu tự động. Khi trang yêu cầu đăng nhập, tác nhân sẽ tạm dừng và đợi cho đến khi bạn hoàn tất đăng nhập.",[430,11793,11794,11799,11800,11802],{},[11795,11796],"video",{"alt":11797,"src":11798,"controls":1074},"Video của tiểu tác nhân trình duyệt thực hiện quá trình gửi đơn xin nghỉ ốm","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-sick-leave-process.webm","\nLệnh ",[495,11801,11740],{}," cực kỳ hữu ích khi chúng ta cần lấy tài liệu web mới nhất, xem lịch sử thay đổi (changelogs), kiểm thử ứng dụng web hoặc kiểm tra trạng thái API để hoàn thành công việc.",[474,11804,11806],{"id":11805},"schedule-task","Schedule Task",[430,11808,11809],{},"Antigravity 2 tích hợp sẵn tính năng lập lịch tác vụ. Chúng ta sẽ thử nghiệm bằng cách tự động điền bảng chấm công (timesheet) sau mỗi 10 phút.",[430,11811,11812,11813],{},"Nhấp vào mục 'Scheduled Tasks' (Tác vụ đã lập lịch):\n",[433,11814],{"alt":11815,"src":11816},"Tùy chọn menu Nhiệm vụ đã lên lịch ở thanh bên","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-menu-item.webp",[430,11818,11819,11820],{},"Nhấp vào nút '+ New' để tạo một tác vụ lập lịch mới:\n",[433,11821],{"alt":11822,"src":11823},"Chế độ xem Nhiệm vụ đã lên lịch trống với nút nhiệm vụ mới","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-empty-state-new-button.webp",[430,11825,11826,11827,11831],{},"Điền thông tin vào biểu mẫu và lập lịch cho tác vụ chạy mỗi 10 phút:\n",[433,11828],{"alt":11829,"src":11830},"Biểu mẫu nhiệm vụ đã lên lịch mới được điền để nhập bảng chấm công tự động","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-new-task-form.webp",[433,11832],{"alt":11833,"src":11834},"Nhiệm vụ nhập bảng chấm công tự động đang hoạt động trong danh sách Nhiệm vụ đã lên lịch","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-active-task-list.webp",[430,11836,11837],{},"Tác vụ đã được kích hoạt, nhưng kết quả trả về bị lỗi.",[430,11839,11840],{},[433,11841],{"alt":11842,"src":11843},"Thông báo lỗi cho biết không tìm thấy mô hình nào có sẵn cho cấp độ flash","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-error-no-models.webp",[430,11845,11846,11847,11850,11851,11854],{},"Chúng tôi đã thử thêm các giá trị 'env' vào tệp ",[495,11848,11849],{},"sidecar.json"," tại thư mục ",[495,11852,11853],{},".gemini\u002Fconfig\u002Fsidecars\u002Fauto-timesheet-entry",", nhưng lỗi tương tự vẫn tiếp diễn.",[933,11856,11859],{"className":11857,"code":11858,"language":4646},[4644],"    \"env\": {\n        \"GEMINI_MODEL\": \"gemini-3.5-flash\",\n        \"GOOGLE_CLOUD_PROJECT\": \"your-gcp-project-id\"\n    }\n",[495,11860,11858],{"__ignoreMap":425},[430,11862,11863,11864,11867,11868,461],{},"Kiểm tra nhật ký tác vụ đã lập lịch trong ",[495,11865,11866],{},".gemini\u002Fantigravity\u002Fsidecar_data\u002F",", chúng tôi thấy dòng: ",[495,11869,11870],{},"[schedule] Triggering command: \"agentapi\" [new-conversation]",[430,11872,11873,11874,11879,11880,11883],{},"Phản hồi cho vấn đề của chúng tôi trên ",[444,11875,11878],{"href":11876,"rel":11877},"https:\u002F\u002Fdiscuss.ai.google.dev\u002Ft\u002Fscheduled-tasks-in-antigravity-2-ended-with-errors\u002F168013",[448],"Diễn đàn Build with Google AI Forum"," gợi ý rằng cần có API key cho ",[495,11881,11882],{},"agentapi",". Chúng tôi đã thử cấu hình API key nhưng vẫn không thành công.",[430,11885,11886,11887,11889,11890],{},"Chúng tôi thử lại bằng cách nhập trực tiếp lệnh ",[495,11888,11743],{}," vào hộp thoại hội thoại.\n",[433,11891],{"alt":11892,"src":11893},"Sử dụng lệnh \u002Fschedule để nhắc nhiệm vụ tự động hóa bảng chấm công","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fschedule-command-timesheet-prompt.webp",[430,11895,11896,11897,11899,11900],{},"Các tác vụ được lập lịch bằng lệnh ",[495,11898,11743],{}," trực tiếp sẽ không xuất hiện trong danh mục menu 'Scheduled Tasks'.\n",[433,11901],{"alt":11902,"src":11903},"Danh sách Nhiệm vụ đã lên lịch không hiển thị các nhiệm vụ được tạo qua lệnh CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-list-missing-cli-task.webp",[430,11905,11906],{},"Tác vụ cron thực tế đã được kích hoạt thành công.",[430,11908,11909],{},[433,11910],{"alt":11911,"src":11912},"Nhật ký công việc cron xác nhận nó đã được kích hoạt","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fcron-job-triggered-log.webp",[474,11914,6168],{"id":6167},[430,11916,11737,11917,575,11919,11921,11922,11924],{},[495,11918,11740],{},[495,11920,11743],{}," trong Antigravity 2 không chỉ là những tính năng riêng lẻ; việc kết hợp chúng sẽ tạo nên một công cụ vô cùng mạnh mẽ. Ví dụ, bạn có thể lập lịch cho một tác nhân sử dụng ",[495,11923,11740],{}," để truy cập các trang tin tức vào mỗi sáng thứ Hai lúc 6:00 sáng, tổng hợp thông tin và gửi lại cho bạn một bản tin tóm tắt hàng ngày đầy đủ.",[430,11926,11927,11928,11931,11932,11935],{},"Các lệnh khác, chẳng hạn như ",[495,11929,11930],{},"\u002Fgrill-me"," (được nhắc đến trong bài viết ",[444,11933,11934],{"href":419},"Antigravity 2 trong thực tế: Tác nhân AI, Kỹ năng và MCP","), có thể được tận dụng khi thiết kế các tác vụ lập lịch mới. Lệnh này thúc đẩy tác nhân chủ động đặt câu hỏi để làm rõ các điểm mơ hồ và phát hiện các trường hợp đặc biệt trước khi hoàn thiện thiết kế.",{"title":425,"searchDepth":1071,"depth":1078,"links":11937},[11938,11939,11940],{"id":11751,"depth":1071,"text":11752},{"id":11805,"depth":1071,"text":11806},{"id":6167,"depth":1071,"text":6168},[1668],"2026-06-07","Khám phá cách các lệnh \u002Fbrowser và \u002Fschedule biến Google Antigravity 2 thành một nền tảng tự động hóa AI chủ động và cực kỳ mạnh mẽ.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002FVI-Use-Browser-and-Scheduler-in-Antigravity-2.webp","Google Antigravity 2: Tự động hóa với Browser và Schedule",{"schemaOrg":11947,"robots":1702,"sitemap":11949},[11948],{"@type":1679,"headline":11945,"description":11943},{"lastmod":11942},{"title":11945,"description":11943,"ogTitle":11732,"ogDescription":11943,"twitterTitle":11732,"twitterDescription":11943},"vi\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",[],"F1w4FmK9-18hgBCzK9FEqjGeGShZ4tSiVnFEcRP60e4",{"id":11955,"title":11934,"author":425,"body":11956,"category":12283,"date":12284,"description":12285,"extension":1673,"image":12286,"imageAlt":12287,"isPublished":1074,"meta":12288,"minRead":1938,"navigation":1074,"path":315,"seo":12292,"stem":12293,"tags":12294,"updatedAt":1711,"__hash__":12295},"article\u002Fvi\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2.md",{"type":427,"value":11957,"toc":12273},[11958,11961,11968,11972,11978,11981,11985,11991,11994,12000,12006,12012,12023,12028,12032,12040,12044,12050,12056,12062,12065,12071,12077,12082,12087,12090,12094,12102,12108,12112,12118,12124,12130,12133,12137,12140,12144,12150,12156,12162,12165,12245,12251,12263,12267,12270],[430,11959,11960],{},"Antigravity 2, với vai trò là một ứng dụng desktop ưu tiên tác nhân (agent-first), cho phép người dùng điều phối một nhóm tác nhân phụ (subagents) để tạo báo cáo tóm tắt hàng ngày từ email và lịch biểu, hoặc để xây dựng, kiểm thử và triển khai một ứng dụng. Nhưng điều này thực sự diễn ra như thế nào trong thực tế?",[430,11962,11963,11964,11967],{},"Hãy cùng khám phá những gì Antigravity 2 có thể làm cho bạn — từ các lệnh và kỹ năng tích hợp sẵn cho đến cách các tích hợp như máy chủ Firebase Model Context Protocol (MCP) đang biến các nhà phát triển thành những kiến trúc sư full-stack thực thụ. Vui lòng tham khảo bài viết này, ",[444,11965,11966],{"href":391},"Trải nghiệm Google Antigravity 2: Cài đặt và Ấn tượng đầu",", để biết cách cài đặt và cấu hình các kỹ năng cũng như máy chủ MCP.",[474,11969,11971],{"id":11970},"các-lệnh-tích-hợp-sẵn","Các lệnh tích hợp sẵn",[889,11973,11975],{"id":11974},"goal",[495,11976,11977],{},"\u002Fgoal",[430,11979,11980],{},"Dengan lệnh này, bạn yêu cầu tác nhân chạy liên tục cho đến khi một tác vụ cụ thể được hoàn thành một cách trọn vẹn.",[430,11982,11983],{},[441,11984,11763],{},[430,11986,11987],{},[433,11988],{"alt":11989,"src":11990},"Câu lệnh goal của Antigravity 2 để tạo trò chơi Textris","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-goal-command-prompt.webp",[430,11992,11993],{},"Khi chúng tôi yêu cầu các tác nhân phụ động, ba tác nhân sẽ được khởi tạo để hoàn thành tác vụ.",[430,11995,11996],{},[433,11997],{"alt":11998,"src":11999},"Antigravity 2 tạo các tác tử phụ để tự động hoàn thành nhiệm vụ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-1.webp",[430,12001,12002],{},[433,12003],{"alt":12004,"src":12005},"Tiến độ chi tiết của các tác tử phụ Antigravity 2 khi thực hiện các bước","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-2.webp",[430,12007,12008],{},[433,12009],{"alt":12010,"src":12011},"Hoàn thành các nhiệm vụ tự động bởi các tác tử phụ Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-3.webp",[430,12013,12014,12015,12018,12019],{},"Để trải nghiệm trò chơi Textris được tạo bằng HTML, vui lòng nhấp vào ",[444,12016,6901],{"href":12017},"\u002Ftextris"," này:\n",[11795,12020],{"alt":12021,"src":12022,"controls":1074},"AI generated Textris game in HTML","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fai-generated-textri-game-html.webm",[430,12024,11755,12025,12027],{},[495,12026,11977],{}," thiết lập một kế hoạch cụ thể, thực thi từng bước một và báo cáo tiến độ trực tiếp cho bạn ở từng giai đoạn. Ngoài ra, tác nhân sẽ tự động quản lý cửa sổ ngữ cảnh (context window) của chính nó mà không vượt quá giới hạn. Lệnh này cực kỳ phù hợp cho các tác vụ dài hơi, chẳng hạn như tối ưu hóa hiệu năng hoặc tái cấu trúc mô-đun (module refactoring), vốn đòi hỏi nhiều vòng lặp thử nghiệm.",[889,12029,12030],{"id":10066},[495,12031,11930],{},[430,12033,12034,12035,12039],{},"Lệnh này kích hoạt kỹ năng ",[444,12036,10066],{"href":12037,"rel":12038},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[448],", được tạo bởi Matt Pocock. Lệnh này ngắn gọn nhưng vô cùng hiệu quả. Ý tưởng cốt lõi của nó là đặt câu hỏi cho bạn dưới nhiều khía cạnh khác nhau, làm rõ các trường hợp biên (edge cases), đồng bộ hóa cấu trúc và hoàn thiện kế hoạch chi tiết trước khi tiến hành triển khai.",[430,12041,12042],{},[441,12043,11763],{},[430,12045,12046],{},[433,12047],{"alt":12048,"src":12049},"Kích hoạt lệnh grill-me cho kiến trúc Cloudflare trong Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-command-prompt.webp",[430,12051,12052],{},[433,12053],{"alt":12054,"src":12055},"Phiên hỏi đáp tương tác sử dụng kỹ năng grill-me","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-interaction-1.webp",[430,12057,12058],{},[433,12059],{"alt":12060,"src":12061},"Làm rõ các trường hợp ngoại lệ và cấu trúc kế hoạch với grill-me","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-interaction-2.webp",[430,12063,12064],{},"Nó hỗ trợ khả năng chọn nhiều mục cùng lúc:",[430,12066,12067],{},[433,12068],{"alt":12069,"src":12070},"Sử dụng tính năng chọn nhiều mục trong quá trình grill-me","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-multi-select-1.webp",[430,12072,12073],{},[433,12074],{"alt":12075,"src":12076},"Hoàn tất các lựa chọn với tính năng chọn nhiều mục của grill-me","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-multi-select-2.webp",[430,12078,11755,12079,12081],{},[495,12080,11930],{}," thực sự rất ấn tượng. Nó bao quát hầu như mọi khía cạnh của thiết kế kiến trúc để triển khai lên Cloudflare. Điều này làm cho nó cực kỳ phù hợp cho việc thiết kế kiến trúc ứng dụng, tái cấu trúc trên nhiều lĩnh vực và các tác vụ phức tạp khác.",[889,12083,12084],{"id":425},[495,12085,12086],{},"@\u002F ",[430,12088,12089],{},"Lệnh này không xuất hiện trong danh sách tính năng công khai, nhưng đôi khi chúng ta cần dùng đến nó để quản lý cửa sổ ngữ cảnh. Nó được sử dụng để thêm một thư mục hoặc tệp tin (ngoài định dạng đa phương tiện) trực tiếp vào hộp thoại hội thoại.",[474,12091,12093],{"id":12092},"skills-kỹ-năng","Skills (Kỹ năng)",[430,12095,12096,12097,12099,12100,461],{},"Chúng ta có thể gõ ",[495,12098,8410],{}," để kích hoạt hộp thoại pop-up và chọn một kỹ năng. Hãy cùng thử nghiệm kỹ năng ",[495,12101,10254],{},[430,12103,12104],{},[433,12105],{"alt":12106,"src":12107},"Chọn kỹ năng sơ đồ Excalidraw từ hộp bật lên Antigravity","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-skill-selection-excalidraw.webp",[430,12109,12110],{},[441,12111,11763],{},[430,12113,12114],{},[433,12115],{"alt":12116,"src":12117},"Cung cấp hướng dẫn để tạo sơ đồ Excalidraw","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-excalidraw-diagram-prompt.webp",[430,12119,12120],{},[433,12121],{"alt":12122,"src":12123},"Tạo thành công sơ đồ kiến trúc Excalidraw","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-excalidraw-diagram-generation.webp",[430,12125,12126],{},[433,12127],{"alt":12128,"src":12129},"Antigravity architecture diagram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-architecture.webp",[430,12131,12132],{},"Kỹ năng đã được thực thi thành công sau một vài vòng xác nhận cấp quyền hệ thống.",[474,12134,12136],{"id":12135},"máy-chủ-mcp","Máy chủ MCP",[430,12138,12139],{},"Khi tác nhân xây dựng một hệ thống backend, thông thường bạn sẽ phải mở bảng điều khiển web, tạo cơ sở dữ liệu, sao chép khóa API rồi dán ngược trở lại. Bằng cách tận dụng các máy chủ MCP trực tiếp trong Antigravity, tác nhân có thêm \"đôi tay\" để tự mình thao tác và quản lý hạ tầng đám mây của bạn.",[430,12141,12142],{},[441,12143,11763],{},[430,12145,12146],{},[433,12147],{"alt":12148,"src":12149},"Hướng dẫn máy chủ MCP tạo ứng dụng web Firebase","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-prompt.webp",[430,12151,12152],{},[433,12153],{"alt":12154,"src":12155},"Antigravity sử dụng máy chủ MCP để thao tác hạ tầng Firebase","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-execution-1.webp",[430,12157,12158],{},[433,12159],{"alt":12160,"src":12161},"Tạo thành công ứng dụng Firebase qua máy chủ MCP của Antigravity","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-execution-2.webp",[430,12163,12164],{},"Tác nhân đã thiết lập thành công ứng dụng web trong Firebase thông qua các máy chủ MCP. Hãy cùng kiểm tra kho lưu trữ (repository).",[933,12166,12168],{"className":1042,"code":12167,"language":1044,"meta":425,"style":425},"Create a new public GitHub repository called ‘to-do-app-techvoyage’. Then push all the current project files to it with the commit message ‘Initial commit — to-do-app’.\n",[495,12169,12170],{"__ignoreMap":425},[941,12171,12172,12175,12178,12181,12184,12187,12190,12193,12196,12199,12202,12205,12208,12211,12214,12217,12220,12223,12226,12228,12231,12234,12237,12239,12242],{"class":943,"line":944},[941,12173,12174],{"class":1051},"Create",[941,12176,12177],{"class":1055}," a",[941,12179,12180],{"class":1055}," new",[941,12182,12183],{"class":1055}," public",[941,12185,12186],{"class":1055}," GitHub",[941,12188,12189],{"class":1055}," repository",[941,12191,12192],{"class":1055}," called",[941,12194,12195],{"class":1055}," ‘to-do-app-techvoyage’.",[941,12197,12198],{"class":1055}," Then",[941,12200,12201],{"class":1055}," push",[941,12203,12204],{"class":1055}," all",[941,12206,12207],{"class":1055}," the",[941,12209,12210],{"class":1055}," current",[941,12212,12213],{"class":1055}," project",[941,12215,12216],{"class":1055}," files",[941,12218,12219],{"class":1055}," to",[941,12221,12222],{"class":1055}," it",[941,12224,12225],{"class":1055}," with",[941,12227,12207],{"class":1055},[941,12229,12230],{"class":1055}," commit",[941,12232,12233],{"class":1055}," message",[941,12235,12236],{"class":1055}," ‘Initial",[941,12238,12230],{"class":1055},[941,12240,12241],{"class":1055}," —",[941,12243,12244],{"class":1055}," to-do-app’.\n",[430,12246,12247],{},[433,12248],{"alt":12249,"src":12250},"Tác tử tự động đẩy các tệp dự án lên kho lưu trữ GitHub mới","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-github-repository-push.webp",[430,12252,12253,12254,12257,12258,12262],{},"Kho lưu trữ ",[495,12255,12256],{},"to-do-app-techvoyage"," hiện đã có mặt trên GitHub thông qua ",[444,12259,6901],{"href":12260,"rel":12261},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fto-do-app-techvoyage",[448]," này.",[474,12264,12266],{"id":12265},"suy-nghĩ-cuối-cùng","Suy nghĩ cuối cùng",[430,12268,12269],{},"Mặc dù MCP và Kỹ năng (Skills) trên Antigravity 2 — được vận hành bởi Gemini 3.5 Flash — mang lại tốc độ xử lý nhanh như chớp, nhưng luồng làm việc của tác nhân hiện tại vẫn bị thắt cổ chai bởi các yêu cầu xác nhận quyền liên tục và sự thiếu vắng tính năng lưu điểm khôi phục (checkpoints) để hoàn tác (rollback). Cho đến khi tính năng checkpoint được cập nhật, việc commit Git thường xuyên chính là lưới bảo hộ an toàn bắt buộc dành cho bạn.",[1648,12271,12272],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":425,"searchDepth":1071,"depth":1078,"links":12274},[12275,12280,12281,12282],{"id":11970,"depth":1071,"text":11971,"children":12276},[12277,12278,12279],{"id":11974,"depth":1078,"text":11977},{"id":10066,"depth":1078,"text":11930},{"id":425,"depth":1078,"text":12086},{"id":12092,"depth":1071,"text":12093},{"id":12135,"depth":1071,"text":12136},{"id":12265,"depth":1071,"text":12266},[1668],"2026-06-06","Khám phá Antigravity 2, ứng dụng desktop ưu tiên tác nhân. Học cách điều phối tác nhân phụ AI, dùng kỹ năng và máy chủ MCP để xây dựng ứng dụng.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002FVI-What-can-we-do-with-Antigravity-2.webp","Hướng dẫn Antigravity 2: Tác nhân AI, Kỹ năng & Máy chủ MCP",{"schemaOrg":12289,"robots":1702,"sitemap":12291},[12290],{"@type":1679,"headline":11934,"description":12285},{"lastmod":12284},{"title":12287,"description":12285,"ogTitle":11934,"ogDescription":12285,"twitterTitle":11934,"twitterDescription":12285},"vi\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[],"pIsVCSgT7iWwFWVpGcRqCbjdYxANEXQDY8jIfs_fcOg",{"id":12297,"title":11966,"author":1711,"body":12298,"category":12982,"date":12983,"description":12984,"extension":1673,"image":12985,"imageAlt":12986,"isPublished":1074,"meta":12987,"minRead":1933,"navigation":1074,"path":301,"seo":12991,"stem":12992,"tags":12993,"updatedAt":1711,"__hash__":12994},"article\u002Fvi\u002Farticle\u002Fsetup-antigravity-2.md",{"type":427,"value":12299,"toc":12971},[12300,12311,12315,12318,12329,12332,12336,12345,12351,12358,12364,12371,12381,12383,12387,12394,12400,12403,12409,12413,12416,12428,12442,12449,12461,12471,12485,12487,12491,12494,12507,12510,12815,12826,12832,12842,12848,12854,12860,12862,12866,12876,12888,12894,12900,12906,12923,12926,12932,12934,12938,12941,12947,12950,12956,12958,12962,12965,12968],[430,12301,12302,12303,12306,12307,12310],{},"Tại sự kiện Google I\u002FO 2026, Google đã công bố ",[441,12304,12305],{},"Antigravity 2",", một ứng dụng máy tính độc lập coi ",[441,12308,12309],{},"AI agent (tác nhân trí tuệ nhân tạo)"," là giao diện người dùng chính. Bạn chỉ cần mô tả mục tiêu mong muốn, agent sẽ tự động lập kế hoạch, chia nhỏ thành các nhiệm vụ phụ dễ quản lý và tiến hành thực thi chúng.",[889,12312,12314],{"id":12313},"yêu-cầu-hệ-thống","Yêu cầu hệ thống",[430,12316,12317],{},"Trước khi bắt đầu, bạn sẽ cần:",[485,12319,12320,12323,12326],{},[488,12321,12322],{},"Một máy tính (hướng dẫn này sử dụng macOS)",[488,12324,12325],{},"Một trình duyệt web hiện đại",[488,12327,12328],{},"Một tài khoản Gmail",[12330,12331],"hr",{},[474,12333,12335],{"id":12334},"_1-cài-đặt-antigravity-2","1. Cài đặt Antigravity 2",[430,12337,12338,12339,12344],{},"Tải xuống Antigravity 2 từ ",[444,12340,12343],{"href":12341,"rel":12342},"https:\u002F\u002Fantigravity.google\u002Fdownload",[448],"antigravity.google"," và cài đặt trên máy tính của bạn. Trong lần chạy đầu tiên, bạn sẽ được yêu cầu đăng nhập bằng tài khoản Gmail của mình.",[430,12346,12347],{},[433,12348],{"alt":12349,"src":12350},"Màn hình đăng nhập tài khoản Google khi khởi chạy Antigravity 2 lần đầu tiên","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-gmail-login.webp",[430,12352,12353,12354,12357],{},"Sau khi đăng nhập thành công, bạn sẽ thấy một ",[441,12355,12356],{},"nút giọng nói"," xuất hiện trong trường nhập liệu, cho phép bạn thu âm các câu lệnh thoại thay vì phải gõ bàn phím.",[430,12359,12360],{},[433,12361],{"alt":12362,"src":12363},"Nút ghi âm câu lệnh giọng nói trong khung nhập văn bản của Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-voice-input-field.webp",[430,12365,12366,12367,12370],{},"Antigravity 2 cũng giới thiệu khái niệm ",[441,12368,12369],{},"Project (Dự án)",", có thể quản lý nhiều thư mục cục bộ cùng lúc và hoạt động với các cài đặt cũng như quyền hạn riêng biệt cho từng agent.",[430,12372,12373,12377],{},[433,12374],{"alt":12375,"src":12376},"Menu lựa chọn và cấu hình dự án trong cài đặt Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-project-menu.webp",[433,12378],{"alt":12379,"src":12380},"Giao diện tạo dự án AI mới với đường dẫn thư mục trong Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-project-creation.webp",[12330,12382],{},[474,12384,12386],{"id":12385},"_2-thiết-lập-máy-chủ-mcp-và-plugin","2. Thiết lập máy chủ MCP và Plugin",[430,12388,12389,12390,12393],{},"Tất cả máy chủ MCP (Model Context Protocol), plugin và kỹ năng (skills) đều được quản lý trực tiếp trong mục ",[441,12391,12392],{},"Customizations (Tùy chỉnh)"," thuộc menu Cài đặt:",[430,12395,12396],{},[433,12397],{"alt":12398,"src":12399},"Tab tùy chỉnh trong phần cài đặt để quản lý máy chủ MCP và kỹ năng","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-settings-customizations.webp",[430,12401,12402],{},"Hiện tại, các plugin duy nhất đang hỗ trợ đều đến từ Google, nhưng hy vọng nhiều plugin từ bên thứ ba sẽ được ra mắt trong tương lai.",[430,12404,12405],{},[433,12406],{"alt":12407,"src":12408},"Danh sách các plugin và tích hợp chính thức từ Google trong Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-google-plugins-list.webp",[2167,12410,12412],{"id":12411},"thêm-một-máy-chủ-mcp-có-sẵn","Thêm một Máy chủ MCP có sẵn",[430,12414,12415],{},"Để cài đặt một máy chủ MCP đã được cấu hình trước (ví dụ: GitHub):",[533,12417,12418,12423],{},[488,12419,10788,12420,461],{},[441,12421,12422],{},"Add MCP+",[488,12424,9955,12425,461],{},[441,12426,12427],{},"GitHub MCP Server",[430,12429,12430,12434,12438],{},[433,12431],{"alt":12432,"src":12433},"Thêm máy chủ MCP cấu hình sẵn bằng cách nhấn vào nút Add MCP plus","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-mcp-button.webp",[433,12435],{"alt":12436,"src":12437},"Lựa chọn GitHub MCP Server từ danh sách các tích hợp khả dụng","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-select-github-mcp.webp",[433,12439],{"alt":12440,"src":12441},"Trình hướng dẫn cấu hình ủy quyền và cài đặt GitHub MCP Server","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-github-mcp-setup.webp",[430,12443,12444,12445],{},"Quá trình cài đặt GitHub MCP Server đã kết thúc với thông báo lỗi:\n",[433,12446],{"alt":12447,"src":12448},"Lỗi cấu hình trong quá trình cài đặt GitHub MCP Server","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-github-mcp-error.webp",[430,12450,12451,12452,12454,12455,12457,12458,12460],{},"Vì máy của chúng ta đã có sẵn ",[495,12453,2800],{}," trên macOS, bạn có thể bỏ qua bước này bằng cách chạy trực tiếp lệnh ",[495,12456,2800],{}," ngay trong khung trò chuyện. Dù vậy, trước hết chúng ta cần cấp quyền chạy lệnh ",[495,12459,2800],{}," một cách rõ ràng trong cài đặt phân quyền của Antigravity.",[430,12462,12463,12467],{},[433,12464],{"alt":12465,"src":12466},"Hộp thoại yêu cầu cấp quyền chạy lệnh git trong terminal sandbox","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-git-permission-1.webp",[433,12468],{"alt":12469,"src":12470},"Phân quyền cho phép thực thi lệnh git trong menu cài đặt hệ thống","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-git-permission-2.webp",[430,12472,12473,12474,12476,12477,12481],{},"Hãy thử kiểm tra xem lệnh ",[495,12475,2800],{}," hiện tại đã hoạt động bình thường chưa:\n",[433,12478],{"alt":12479,"src":12480},"Gửi yêu cầu lệnh git status trong khung nhập liệu của AI agent","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-git-command-test-1.webp",[433,12482],{"alt":12483,"src":12484},"Thực thi thành công lệnh git status trực tiếp trong cửa sổ trò chuyện","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-git-command-test-2.webp",[12330,12486],{},[474,12488,12490],{"id":12489},"_3-thêm-máy-chủ-mcp-tùy-chỉnh","3. Thêm Máy chủ MCP tùy chỉnh",[430,12492,12493],{},"Trong trường hợp máy chủ MCP bạn cần không có sẵn trong danh sách mặc định, bạn có thể tự thêm thủ công bằng cách chỉnh sửa trực tiếp file cấu hình MCP. File cấu hình này nằm ở:",[933,12495,12497],{"className":1042,"code":12496,"language":1044,"meta":425,"style":425},"~\u002F.gemini\u002Fconfig\u002Fmcp_config.json\n",[495,12498,12499],{"__ignoreMap":425},[941,12500,12501,12504],{"class":943,"line":944},[941,12502,12503],{"class":955},"~",[941,12505,12506],{"class":951},"\u002F.gemini\u002Fconfig\u002Fmcp_config.json\n",[430,12508,12509],{},"Ví dụ, hãy thử thêm một số máy chủ Cloudflare MCP. Do Cloudflare hỗ trợ đăng ký máy khách động nên chúng ta chỉ cần bật tính năng OAuth. Hãy thêm đoạn mã sau vào file cấu hình JSON của bạn:",[933,12511,12513],{"className":2913,"code":12512,"language":2915,"meta":425,"style":425},"    \"cloudflare-api\": {\n      \"serverUrl\": \"https:\u002F\u002Fmcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-docs\": {\n      \"serverUrl\": \"https:\u002F\u002Fdocs.mcp.cloudflare.com\u002Fmcp\"\n    },\n    \"cloudflare-bindings\": {\n      \"serverUrl\": \"https:\u002F\u002Fbindings.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-builds\": {\n      \"serverUrl\": \"https:\u002F\u002Fbuilds.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-observability\": {\n      \"serverUrl\": \"https:\u002F\u002Fobservability.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[495,12514,12515,12528,12548,12560,12572,12576,12583,12596,12613,12619,12632,12651,12663,12675,12679,12685,12698,12717,12729,12741,12745,12751,12764,12783,12795,12807,12811],{"__ignoreMap":425},[941,12516,12517,12519,12522,12524,12526],{"class":943,"line":944},[941,12518,7620],{"class":955},[941,12520,12521],{"class":1055},"cloudflare-api",[941,12523,3693],{"class":955},[941,12525,579],{"class":951},[941,12527,2922],{"class":955},[941,12529,12530,12532,12535,12537,12539,12541,12544,12546],{"class":943,"line":1071},[941,12531,7633],{"class":955},[941,12533,12534],{"class":947},"serverUrl",[941,12536,3693],{"class":955},[941,12538,899],{"class":955},[941,12540,3286],{"class":955},[941,12542,12543],{"class":1055},"https:\u002F\u002Fmcp.cloudflare.com\u002Fmcp",[941,12545,3693],{"class":955},[941,12547,7650],{"class":955},[941,12549,12550,12552,12554,12556,12558],{"class":943,"line":1078},[941,12551,7633],{"class":955},[941,12553,7879],{"class":947},[941,12555,3693],{"class":955},[941,12557,899],{"class":955},[941,12559,2952],{"class":955},[941,12561,12562,12564,12566,12568,12570],{"class":943,"line":1085},[941,12563,7669],{"class":955},[941,12565,7892],{"class":1051},[941,12567,3693],{"class":955},[941,12569,899],{"class":955},[941,12571,1388],{"class":955},[941,12573,12574],{"class":943,"line":1933},[941,12575,7903],{"class":955},[941,12577,12578,12581],{"class":943,"line":1938},[941,12579,12580],{"class":955},"    }",[941,12582,7650],{"class":951},[941,12584,12585,12587,12590,12592,12594],{"class":943,"line":1944},[941,12586,7620],{"class":955},[941,12588,12589],{"class":1055},"cloudflare-docs",[941,12591,3693],{"class":955},[941,12593,579],{"class":951},[941,12595,2922],{"class":955},[941,12597,12598,12600,12602,12604,12606,12608,12611],{"class":943,"line":2280},[941,12599,7633],{"class":955},[941,12601,12534],{"class":947},[941,12603,3693],{"class":955},[941,12605,899],{"class":955},[941,12607,3286],{"class":955},[941,12609,12610],{"class":1055},"https:\u002F\u002Fdocs.mcp.cloudflare.com\u002Fmcp",[941,12612,1965],{"class":955},[941,12614,12615,12617],{"class":943,"line":2291},[941,12616,12580],{"class":955},[941,12618,7650],{"class":951},[941,12620,12621,12623,12626,12628,12630],{"class":943,"line":2387},[941,12622,7620],{"class":955},[941,12624,12625],{"class":1055},"cloudflare-bindings",[941,12627,3693],{"class":955},[941,12629,579],{"class":951},[941,12631,2922],{"class":955},[941,12633,12634,12636,12638,12640,12642,12644,12647,12649],{"class":943,"line":2393},[941,12635,7633],{"class":955},[941,12637,12534],{"class":947},[941,12639,3693],{"class":955},[941,12641,899],{"class":955},[941,12643,3286],{"class":955},[941,12645,12646],{"class":1055},"https:\u002F\u002Fbindings.mcp.cloudflare.com\u002Fmcp",[941,12648,3693],{"class":955},[941,12650,7650],{"class":955},[941,12652,12653,12655,12657,12659,12661],{"class":943,"line":2399},[941,12654,7633],{"class":955},[941,12656,7879],{"class":947},[941,12658,3693],{"class":955},[941,12660,899],{"class":955},[941,12662,2952],{"class":955},[941,12664,12665,12667,12669,12671,12673],{"class":943,"line":2404},[941,12666,7669],{"class":955},[941,12668,7892],{"class":1051},[941,12670,3693],{"class":955},[941,12672,899],{"class":955},[941,12674,1388],{"class":955},[941,12676,12677],{"class":943,"line":1704},[941,12678,7903],{"class":955},[941,12680,12681,12683],{"class":943,"line":3355},[941,12682,12580],{"class":955},[941,12684,7650],{"class":951},[941,12686,12687,12689,12692,12694,12696],{"class":943,"line":3366},[941,12688,7620],{"class":955},[941,12690,12691],{"class":1055},"cloudflare-builds",[941,12693,3693],{"class":955},[941,12695,579],{"class":951},[941,12697,2922],{"class":955},[941,12699,12700,12702,12704,12706,12708,12710,12713,12715],{"class":943,"line":3371},[941,12701,7633],{"class":955},[941,12703,12534],{"class":947},[941,12705,3693],{"class":955},[941,12707,899],{"class":955},[941,12709,3286],{"class":955},[941,12711,12712],{"class":1055},"https:\u002F\u002Fbuilds.mcp.cloudflare.com\u002Fmcp",[941,12714,3693],{"class":955},[941,12716,7650],{"class":955},[941,12718,12719,12721,12723,12725,12727],{"class":943,"line":3379},[941,12720,7633],{"class":955},[941,12722,7879],{"class":947},[941,12724,3693],{"class":955},[941,12726,899],{"class":955},[941,12728,2952],{"class":955},[941,12730,12731,12733,12735,12737,12739],{"class":943,"line":3906},[941,12732,7669],{"class":955},[941,12734,7892],{"class":1051},[941,12736,3693],{"class":955},[941,12738,899],{"class":955},[941,12740,1388],{"class":955},[941,12742,12743],{"class":943,"line":3912},[941,12744,7903],{"class":955},[941,12746,12747,12749],{"class":943,"line":3921},[941,12748,12580],{"class":955},[941,12750,7650],{"class":951},[941,12752,12753,12755,12758,12760,12762],{"class":943,"line":4576},[941,12754,7620],{"class":955},[941,12756,12757],{"class":1055},"cloudflare-observability",[941,12759,3693],{"class":955},[941,12761,579],{"class":951},[941,12763,2922],{"class":955},[941,12765,12766,12768,12770,12772,12774,12776,12779,12781],{"class":943,"line":5032},[941,12767,7633],{"class":955},[941,12769,12534],{"class":947},[941,12771,3693],{"class":955},[941,12773,899],{"class":955},[941,12775,3286],{"class":955},[941,12777,12778],{"class":1055},"https:\u002F\u002Fobservability.mcp.cloudflare.com\u002Fmcp",[941,12780,3693],{"class":955},[941,12782,7650],{"class":955},[941,12784,12785,12787,12789,12791,12793],{"class":943,"line":5041},[941,12786,7633],{"class":955},[941,12788,7879],{"class":947},[941,12790,3693],{"class":955},[941,12792,899],{"class":955},[941,12794,2952],{"class":955},[941,12796,12797,12799,12801,12803,12805],{"class":943,"line":5049},[941,12798,7669],{"class":955},[941,12800,7892],{"class":1051},[941,12802,3693],{"class":955},[941,12804,899],{"class":955},[941,12806,1388],{"class":955},[941,12808,12809],{"class":943,"line":5057},[941,12810,7903],{"class":955},[941,12812,12813],{"class":943,"line":5062},[941,12814,7753],{"class":955},[430,12816,12817,12818,12821,12822,12825],{},"Quay lại mục ",[441,12819,12820],{},"Customizations"," trong ứng dụng và nhấn nút ",[441,12823,12824],{},"Refresh (Tải lại)",". Lúc này, danh sách máy chủ Cloudflare MCP sẽ xuất hiện với trạng thái chờ xác thực (pending authorisation).",[430,12827,12828],{},[433,12829],{"alt":12830,"src":12831},"Danh sách máy chủ Cloudflare MCP ở trạng thái chờ ủy quyền trong menu tùy chỉnh","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-mcp-pending.webp",[430,12833,10788,12834,12837,12838,12841],{},[441,12835,12836],{},"Authenticate"," ở bên cạnh máy chủ MCP. Hệ thống sẽ mở ra một trang xác thực trên trình duyệt web. Sau khi xác thực thành công, một mã ủy quyền (",[441,12839,12840],{},"auth code",") sẽ được tạo ra.",[430,12843,12844],{},[433,12845],{"alt":12846,"src":12847},"Trình duyệt hiển thị mã ủy quyền OAuth động cho Cloudflare MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-auth-code.webp",[430,12849,12850,12851,461],{},"Hãy copy mã xác thực này, dán trở lại trường nhập liệu trong Antigravity và nhấn ",[441,12852,12853],{},"Submit",[430,12855,12856],{},[433,12857],{"alt":12858,"src":12859},"Nhập và gửi mã xác thực OAuth trong giao diện thiết lập Antigravity","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-auth-submit.webp",[12330,12861],{},[474,12863,12865],{"id":12864},"_4-thêm-kỹ-năng-tùy-chỉnh","4. Thêm Kỹ năng tùy chỉnh",[430,12867,12868,12869,12872,12873,461],{},"Hiện tại, bạn ",[441,12870,12871],{},"không thể"," thêm kỹ năng tùy chỉnh trực tiếp thông qua giao diện người dùng của ứng dụng. Thay vào đó, chúng phải được đặt trực tiếp vào thư mục ",[495,12874,12875],{},"~\u002F.gemini\u002Fconfig\u002Fskills",[430,12877,12878,12879,12882,12883],{},"Nhờ việc sử dụng CLI ",[495,12880,12881],{},"npx skills"," để quản lý tập trung toàn bộ kỹ năng của tác nhân, bất kỳ kỹ năng mới nào được thêm vào đều sẽ khả dụng cho mọi agent, bao gồm cả Antigravity. ",[909,12884,12885,12886,10338],{},"(Để tìm hiểu sâu hơn về nội dung này, vui lòng tham khảo bài viết: ",[444,12887,8672],{"href":359},[430,12889,12890,12891,12893],{},"Ban đầu, khi gõ ",[495,12892,8410],{}," trong khung trò chuyện, danh sách kỹ năng hoàn toàn trống rỗng:",[430,12895,12896],{},[433,12897],{"alt":12898,"src":12899},"Khung lệnh hiển thị danh sách kỹ năng trống rỗng khi gõ phím tắt gạch chéo","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-empty-skills-list.webp",[430,12901,12902,12903,12905],{},"Có vẻ như Antigravity 2 không tự động nhận diện từ thư mục kỹ năng toàn cục (",[495,12904,8657],{},"). Để khắc phục, chúng ta cần tạo một liên kết tượng trưng (symlink) trỏ tới thư mục cấu hình của Antigravity:",[933,12907,12909],{"className":1042,"code":12908,"language":1044,"meta":425,"style":425},"ln -s ~\u002F.agents\u002Fskills\u002Fexcalidraw-diagram ~\u002F.gemini\u002Fconfig\u002Fskills\u002Fexcalidraw-diagram\n",[495,12910,12911],{"__ignoreMap":425},[941,12912,12913,12915,12917,12920],{"class":943,"line":944},[941,12914,3679],{"class":1051},[941,12916,3536],{"class":1055},[941,12918,12919],{"class":1055}," ~\u002F.agents\u002Fskills\u002Fexcalidraw-diagram",[941,12921,12922],{"class":1055}," ~\u002F.gemini\u002Fconfig\u002Fskills\u002Fexcalidraw-diagram\n",[430,12924,12925],{},"Sau khi liên kết thành công, kỹ năng đó sẽ ngay lập tức khả dụng trong ứng dụng!",[430,12927,12928],{},[433,12929],{"alt":12930,"src":12931},"Kỹ năng sơ đồ Excalidraw hiển thị thành công trong danh sách lệnh Antigravity","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-excalidraw-skill-available.webp",[12330,12933],{},[474,12935,12937],{"id":12936},"_5-thử-nghiệm-một-tác-vụ-đơn-giản","5. Thử nghiệm một tác vụ đơn giản",[430,12939,12940],{},"Bây giờ, khi mọi thứ đã được thiết lập xong xuôi, hãy tiến hành chạy thử nghiệm.",[430,12942,12943],{},[433,12944],{"alt":12945,"src":12946},"Gửi tác vụ kiểm tra để liệt kê các cơ sở dữ liệu D1 qua Cloudflare","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-test-simple-task-prompt.webp",[430,12948,12949],{},"Như hình ảnh bên dưới, mô hình đã nhận diện thành công và sử dụng máy chủ Cloudflare MCP vừa thêm để xử lý yêu cầu.",[430,12951,12952],{},[433,12953],{"alt":12954,"src":12955},"AI agent thực thi thành công việc liệt kê cơ sở dữ liệu D1 bằng Cloudflare MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-test-task-success.webp",[12330,12957],{},[474,12959,12961],{"id":12960},"đánh-giá-tổng-quan","Đánh giá tổng quan",[430,12963,12964],{},"Antigravity 2 thể hiện bước chuyển dịch mạnh mẽ từ một IDE truyền thống sang một ứng dụng máy tính thân thiện, dễ tiếp cận, giúp người dùng phổ thông cũng có thể trở thành người điều phối cho mọi tác vụ công việc.",[430,12966,12967],{},"Tuy nhiên, Antigravity 2 vẫn cần được hoàn thiện thêm. Mỗi khi gặp lỗi hệ thống, việc gỡ lỗi khá ức chế do thông báo lỗi chung chung, thiếu chi tiết. Bên cạnh đó, tài liệu hướng dẫn chính thức trông khá sơ sài — có khả năng được tạo tự động bằng AI — vì nhiều đường dẫn tệp tin và nguồn tham khảo hiện đang bị sai lệch.",[1648,12969,12970],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":425,"searchDepth":1071,"depth":1078,"links":12972},[12973,12974,12975,12978,12979,12980,12981],{"id":12313,"depth":1078,"text":12314},{"id":12334,"depth":1071,"text":12335},{"id":12385,"depth":1071,"text":12386,"children":12976},[12977],{"id":12411,"depth":1085,"text":12412},{"id":12489,"depth":1071,"text":12490},{"id":12864,"depth":1071,"text":12865},{"id":12936,"depth":1071,"text":12937},{"id":12960,"depth":1071,"text":12961},[1668],"2026-06-05","Khám phá các tính năng mới của Google Antigravity 2. Đọc hướng dẫn thực tế của chúng tôi để cài đặt ứng dụng, thử nghiệm các tác vụ của AI agent và tự thêm các máy chủ MCP tùy chỉnh.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002FVI-Setup-Antigravity-2.0.webp","Đánh giá & Hướng dẫn cài đặt Google Antigravity 2: AI Agent, MCP & Plugin",{"schemaOrg":12988,"robots":1702,"sitemap":12990},[12989],{"@type":1679,"headline":12986,"description":12984},{"lastmod":12983},{"title":12986,"description":12984,"ogTitle":11966,"ogDescription":12984,"twitterTitle":11966,"twitterDescription":12984},"vi\u002Farticle\u002Fsetup-antigravity-2",[],"bVlZAR4hS3zNNYYaG7LIV7PPWDalaEBm2Xs2xLz7dYs",{"id":12996,"title":8672,"author":1711,"body":12997,"category":13412,"date":13413,"description":13414,"extension":1673,"image":13415,"imageAlt":13416,"isPublished":1074,"meta":13417,"minRead":1938,"navigation":1074,"path":285,"seo":13423,"stem":13424,"tags":13425,"updatedAt":1711,"__hash__":13426},"article\u002Fvi\u002Farticle\u002Fcentralised-the-skills-for-agents.md",{"type":427,"value":12998,"toc":13402},[12999,13010,13013,13036,13051,13055,13065,13081,13091,13097,13100,13122,13128,13139,13157,13167,13177,13181,13188,13209,13212,13218,13228,13234,13237,13257,13265,13269,13275,13347,13353,13357,13393,13399],[430,13000,13001,13002,13005,13006,13009],{},"Nếu bạn đang chạy nhiều Agent AI hoặc CLI trên máy tính của mình — cho dù đó là Hermes, Claude Code, Codex, Antigravity, Kimi hay các công cụ được hỗ trợ khác — bạn có thể đã gặp phải một vấn đề cực kỳ khó chịu: ",[441,13003,13004],{},"sự phân mảnh kỹ năng"," (skills fragmentation). Mỗi Agent hoặc CLI lại tự duy trì một thư mục ",[495,13007,13008],{},"skills"," riêng biệt, dẫn đến việc cài đặt trùng lặp, lệch phiên bản và làm tăng thêm gánh nặng quản lý.",[430,13011,13012],{},"Trong quá trình làm việc với các Agent AI, chúng tôi thường xuyên gặp phải những vấn đề sau:",[485,13014,13015,13021,13027],{},[488,13016,13017,13020],{},[441,13018,13019],{},"Cài đặt trùng lặp",": Cài đặt một kỹ năng (skill) mới cho một Agent, rồi lại phải cài đặt lại liên tục cho các Agent khác.",[488,13022,13023,13026],{},[441,13024,13025],{},"Lệch phiên bản"," (version drift): Tùy chỉnh hoặc sửa lỗi một kỹ năng cho một Agent, nhưng quên cập nhật cho những Agent còn lại, dẫn đến việc các Agent hoạt động không nhất quán.",[488,13028,13029,13032,13033,13035],{},[441,13030,13031],{},"Khó khăn trong quản lý",": Phải lùng sục từng thư mục ",[495,13034,13008],{}," của mỗi Agent trên hệ thống chỉ để xem những kỹ năng nào thực sự đã được cài đặt.",[430,13037,13038,13039,13041,13042,13044,13045,461],{},"CLI ",[495,13040,12881],{},", một CLI mã nguồn mở từ Vercel, giải quyết triệt để vấn đề này bằng cách giúp bạn quản lý duy nhất một thư mục ",[495,13043,13008],{}," tập trung và chia sẻ nó cho tất cả các Agent của mình. Bạn có thể tham khảo ",[444,13046,13048,13049],{"href":8618,"rel":13047},[448],"kho lưu trữ GitHub của ",[495,13050,12881],{},[474,13052,13054],{"id":13053},"thư-mục-tập-trung","Thư mục tập trung",[430,13056,13057,13058,13060,13061,13064],{},"Khái niệm này rất đơn giản: nếu chúng ta trỏ thư mục ",[495,13059,13008],{}," của mọi Agent về ",[441,13062,13063],{},"cùng một thư mục vật lý",", vấn đề phân mảnh sẽ biến mất hoàn toàn.",[430,13066,13067,13068,13070,13071,13073,13074,13077,13078,13080],{},"Khi bạn cài đặt một kỹ năng bằng CLI ",[495,13069,12881],{},", kỹ năng đó sẽ được tải xuống thư mục tập trung trên máy của bạn (",[495,13072,8657],{},"). Sau đó, CLI sẽ tạo một ",[441,13075,13076],{},"symlink"," (liên kết tượng trưng, đóng vai trò như một con trỏ trực tiếp) từ thư mục ",[495,13079,13008],{}," của từng Agent về lại thư mục tập trung đó.",[430,13082,13083,13084,13087,13088,13090],{},"Ví dụ, khi Claude Code tìm kiếm các kỹ năng trong ",[495,13085,13086],{},"~\u002F.claude\u002Fskills\u002F",", nó sẽ được tự động chuyển hướng một cách mượt mà đến ",[495,13089,8657],{},". Nếu bạn thực hiện một thay đổi nhỏ đối với một kỹ năng trong thư mục tập trung đó, mọi Agent sẽ ngay lập tức thấy bản cập nhật. Không cần sao chép thủ công, không cần tập lệnh đồng bộ hóa và không lãng phí dung lượng ổ đĩa.",[474,13092,2536,13094,13096],{"id":13093},"cài-đặt-npx-skills-và-thêm-kỹ-năng",[495,13095,12881],{}," và Thêm Kỹ năng",[430,13098,13099],{},"Chạy lệnh sau để bắt đầu và thêm kỹ năng đầu tiên của chúng ta:",[933,13101,13103],{"className":1042,"code":13102,"language":1044,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill --skill excalidraw-diagram\n",[495,13104,13105],{"__ignoreMap":425},[941,13106,13107,13109,13111,13113,13116,13119],{"class":943,"line":944},[941,13108,7645],{"class":1051},[941,13110,8632],{"class":1055},[941,13112,1065],{"class":1055},[941,13114,13115],{"class":1055}," https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[941,13117,13118],{"class":1055}," --skill",[941,13120,13121],{"class":1055}," excalidraw-diagram\n",[430,13123,13124],{},[433,13125],{"alt":13126,"src":13127},"Sử dụng lệnh npx skills add để cài đặt kỹ năng từ GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-add-command.webp",[430,13129,13130,13131,13134,13135],{},"CLI sẽ hỏi bạn muốn thiết lập tính năng này cho một dự án cụ thể hay trên toàn cục (globally). Chúng tôi khuyên bạn nên chọn ",[441,13132,13133],{},"global"," để tất cả các Agent được hỗ trợ đều có thể truy cập:\n",[433,13136],{"alt":13137,"src":13138},"Chọn tùy chọn cài đặt toàn cục (global) trong npx skills CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-install-global-prompt.webp",[430,13140,13141,13142,13144,13145,13148,13149,13153],{},"Tiếp theo, hãy chắc chắn chọn ",[495,13143,8653],{}," để đảm bảo một ",[441,13146,13147],{},"nguồn dữ liệu chân lý duy nhất"," (single source of truth):\n",[433,13150],{"alt":13151,"src":13152},"Chọn phương thức symlink để đồng bộ hóa kỹ năng","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-symlink-option.webp",[433,13154],{"alt":13155,"src":13156},"Xác nhận cài đặt thành công và tạo symlink trong giao diện CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-installation-completed.webp",[430,13158,13159,13160,13162,13163],{},"Sau khi hoàn tất, chúng ta có thể kiểm tra xem kỹ năng đã được cài đặt trong thư mục tập trung tại ",[495,13161,8657],{}," chưa:\n",[433,13164],{"alt":13165,"src":13166},"Xác minh các kỹ năng đã cài đặt trong thư mục tập trung","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-directory-verification.webp",[430,13168,13169,13170,13172,13173],{},"Mở Kimi CLI (hoặc bất kỳ Agent nào khác), kỹ năng ",[495,13171,10254],{}," đã sẵn sàng và hoạt động mượt mà!\n",[433,13174],{"alt":13175,"src":13176},"Kimi CLI hiển thị các kỹ năng tập trung đã tải và sẵn sàng sử dụng","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fkimi-cli-skills-integration.webp",[474,13178,13180],{"id":13179},"tạo-kỹ-năng-từ-con-số-0","Tạo Kỹ năng từ con số 0",[430,13182,13183,13184,13187],{},"Để xây dựng các kỹ năng của riêng bạn, bạn có thể sử dụng công cụ ",[495,13185,13186],{},"skill-creator"," của Anthropic. Hãy cài đặt nó như thế này:",[933,13189,13191],{"className":1042,"code":13190,"language":1044,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills --skill skill-creator\n",[495,13192,13193],{"__ignoreMap":425},[941,13194,13195,13197,13199,13201,13204,13206],{"class":943,"line":944},[941,13196,7645],{"class":1051},[941,13198,8632],{"class":1055},[941,13200,1065],{"class":1055},[941,13202,13203],{"class":1055}," https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills",[941,13205,13118],{"class":1055},[941,13207,13208],{"class":1055}," skill-creator\n",[430,13210,13211],{},"Bây giờ, trong Kimi hoặc bất kỳ Agent nào khác, nhập prompt sau:",[933,13213,13216],{"className":13214,"code":13215,"language":4646},[4644],"Use the skill-creator to help me build a skill for creating a product landing page\n",[495,13217,13215],{"__ignoreMap":425},[430,13219,13220,13221,13223,13224],{},"Kimi hoặc Agent của bạn sẽ tự động nhận diện ",[495,13222,13186],{}," và hướng dẫn bạn từng bước thực hiện:\n",[433,13225],{"alt":13226,"src":13227},"Trình hướng dẫn skill-creator tương tác đang chạy trong Kimi CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fkimi-cli-skill-creator-setup.webp",[474,13229,11737,13231,13233],{"id":13230},"các-lệnh-npx-skills-hữu-ích-khác",[495,13232,12881],{}," hữu ích khác",[430,13235,13236],{},"Dưới đây là một số lệnh tiện lợi khác:",[485,13238,13239,13245,13251],{},[488,13240,13241,13244],{},[495,13242,13243],{},"npx skills ls -g",": Liệt kê tất cả các kỹ năng được cài đặt toàn cục",[488,13246,13247,13250],{},[495,13248,13249],{},"npx skills update",": Cập nhật tất cả các kỹ năng bằng một lệnh duy nhất",[488,13252,13253,13256],{},[495,13254,13255],{},"npx skills remove",": Gỡ cài đặt\u002Fxóa một kỹ năng theo cách tương tác trực quan",[430,13258,7376,13259,13264],{},[444,13260,13048,13262],{"href":8618,"rel":13261},[448],[495,13263,12881],{}," để biết thêm các lệnh và tài liệu tham khảo khác.",[474,13266,13268],{"id":13267},"nâng-cấp-hơn-nữa","Nâng cấp hơn nữa",[430,13270,13271,13272,13274],{},"Vì tất cả các kỹ năng hiện đã ở cùng một nơi (",[495,13273,8657],{},"), chúng ta có thể khởi tạo nó như một kho lưu trữ Git và đẩy nó lên GitHub hoặc GitLab.",[933,13276,13278],{"className":1042,"code":13277,"language":1044,"meta":425,"style":425},"cd ~\u002F.agents\u002Fskills\ngit init\ngit add .\ngit commit -m \"Initial skills folder\"\ngit remote add origin https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fskills\ngit push -u origin main\n",[495,13279,13280,13287,13294,13302,13318,13333],{"__ignoreMap":425},[941,13281,13282,13284],{"class":943,"line":944},[941,13283,2824],{"class":972},[941,13285,13286],{"class":1055}," ~\u002F.agents\u002Fskills\n",[941,13288,13289,13291],{"class":943,"line":1071},[941,13290,2800],{"class":1051},[941,13292,13293],{"class":1055}," init\n",[941,13295,13296,13298,13300],{"class":943,"line":1078},[941,13297,2800],{"class":1051},[941,13299,1065],{"class":1055},[941,13301,4905],{"class":1055},[941,13303,13304,13306,13308,13311,13313,13316],{"class":943,"line":1085},[941,13305,2800],{"class":1051},[941,13307,12230],{"class":1055},[941,13309,13310],{"class":1055}," -m",[941,13312,3286],{"class":955},[941,13314,13315],{"class":1055},"Initial skills folder",[941,13317,1965],{"class":955},[941,13319,13320,13322,13325,13327,13330],{"class":943,"line":1933},[941,13321,2800],{"class":1051},[941,13323,13324],{"class":1055}," remote",[941,13326,1065],{"class":1055},[941,13328,13329],{"class":1055}," origin",[941,13331,13332],{"class":1055}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fskills\n",[941,13334,13335,13337,13339,13342,13344],{"class":943,"line":1938},[941,13336,2800],{"class":1051},[941,13338,12201],{"class":1055},[941,13340,13341],{"class":1055}," -u",[941,13343,13329],{"class":1055},[941,13345,13346],{"class":1055}," main\n",[430,13348,13349,13350,461],{},"Bây giờ, chúng ta đã có lịch sử hoàn chỉnh về tất cả các thay đổi kỹ năng, nghĩa là chúng ta có thể dễ dàng khôi phục (rollback) nếu một bản cập nhật làm hỏng thứ gì đó. Ngoài ra, chúng ta có thể đồng bộ hóa mượt mà các kỹ năng trên nhiều máy tính khác nhau (như máy tính xách tay và máy tính để bàn) bằng cách chạy lệnh nhanh ",[495,13351,13352],{},"git pull",[474,13354,13356],{"id":13355},"một-số-lưu-ý-quan-trọng-bảo-mật-rủi-ro","Một số lưu ý quan trọng (Bảo mật & Rủi ro)",[485,13358,13359,13365,13371,13381,13387],{},[488,13360,13361,13364],{},[441,13362,13363],{},"Khả năng tương thích khác nhau",": Không phải tất cả các nền tảng Agent đều hỗ trợ mọi tính năng (như custom hook hoặc các công cụ cụ thể được cho phép). Một kỹ năng có thể hoạt động tốt trên Agent này nhưng lại hạn chế trên Agent khác.",[488,13366,13367,13370],{},[441,13368,13369],{},"Tin tưởng nguồn",": Chỉ cài đặt các kỹ năng từ những nguồn đáng tin cậy.",[488,13372,13373,13376,13377,13380],{},[441,13374,13375],{},"Kiểm tra kỹ trước khi chạy",": Nếu bạn đang sử dụng kỹ năng tùy chỉnh hoặc của bên thứ ba, hãy xem xét kỹ các tệp (đặc biệt là trong thư mục ",[495,13378,13379],{},"scripts\u002F",") trước khi cho phép Agent của bạn chạy nó.",[488,13382,13383,13386],{},[441,13384,13385],{},"Quyền tối thiểu",": Cố gắng không cấp cho một kỹ năng nhiều quyền công cụ hoặc quyền truy cập hơn mức thực sự cần thiết để hoàn thành công việc.",[488,13388,13389,13392],{},[441,13390,13391],{},"Không bao giờ mã hóa cứng thông tin nhạy cảm",": Giữ các khóa API và bí mật của bạn tránh xa các tệp kỹ năng của bạn.",[430,13394,13395,13396,13398],{},"Thiết lập một thư mục tập trung đóng vai trò là \"nguồn dữ liệu chân lý duy nhất\" với ",[495,13397,12881],{}," đã giúp đội ngũ của chúng tôi tiết kiệm thời gian và tránh việc làm trùng lặp không đáng có. Rất khuyến khích bạn thử trải nghiệm — năng lực AI sẽ mở rộng vượt trội khi hệ thống kỹ năng của bạn ngày càng phát triển!",[1648,13400,13401],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":425,"searchDepth":1071,"depth":1078,"links":13403},[13404,13405,13407,13408,13410,13411],{"id":13053,"depth":1071,"text":13054},{"id":13093,"depth":1071,"text":13406},"Cài đặt npx skills và Thêm Kỹ năng",{"id":13179,"depth":1071,"text":13180},{"id":13230,"depth":1071,"text":13409},"Các lệnh npx skills hữu ích khác",{"id":13267,"depth":1071,"text":13268},{"id":13355,"depth":1071,"text":13356},[1668],"2026-06-04","Bạn đang chạy nhiều Agent AI như Claude Code hay Kimi? Tìm hiểu cách giải quyết phân mảnh kỹ năng và quản lý một thư mục tập trung bằng npx skills CLI.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002FGi%E1%BA%A3i-quy%E1%BA%BFt-s%E1%BB%B1-ph%C3%A2n-m%E1%BA%A3nh-k%E1%BB%B9-n%C4%83ng-c%E1%BB%A7a-Agent-AI-v%E1%BB%9Bi-npx-skills.webp","Giải quyết sự phân mảnh kỹ năng của Agent AI với npx skills CLI",{"schemaOrg":13418,"robots":1702,"sitemap":13421},[13419],{"@type":1679,"headline":13420,"description":13414},"Cách giải quyết sự phân mảnh kỹ năng của Agent AI bằng npx skills",{"lastmod":13422},"2026-06-03",{"title":13420,"description":13414,"ogTitle":8672,"ogDescription":13414,"twitterTitle":8672,"twitterDescription":13414},"vi\u002Farticle\u002Fcentralised-the-skills-for-agents",[],"15OFhh1ZNyWT2_Dn62jMunayI_3CSlt87PfhhmQr5q4",{"id":13428,"title":13429,"author":1711,"body":13430,"category":13664,"date":13665,"description":13666,"extension":1673,"image":13667,"imageAlt":13668,"isPublished":1074,"meta":13669,"minRead":2280,"navigation":1074,"path":291,"seo":13673,"stem":13674,"tags":13675,"updatedAt":1711,"__hash__":13676},"article\u002Fvi\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare.md","Ngừng để lộ kho bảo mật của bạn: Bảo mật NodeWarden bằng Cloudflare",{"type":427,"value":13431,"toc":13655},[13432,13435,13438,13452,13456,13463,13465,13469,13472,13476,13506,13510,13513,13580,13584,13587,13650,13652],[430,13433,13434],{},"Ngay khi NodeWarden của bạn được hiển thị công khai trên Internet, nó sẽ bắt đầu thu hút hàng ngàn bot tự động liên tục quét tìm các lỗ hổng bảo mật 24\u002F7. Để bảo vệ dữ liệu nhạy cảm của mình, bạn cần thiết lập mức độ khóa bảo mật cao nhất có thể cho phiên bản (instance) NodeWarden của mình.",[430,13436,13437],{},"Để bảo mật NodeWarden, bạn có thể sử dụng một trong hai tính năng của Cloudflare:",[485,13439,13440,13446],{},[488,13441,13442,13445],{},[441,13443,13444],{},"Cloudflare IP Access Rules (Quy tắc truy cập IP):"," Cho phép bạn chặn, yêu cầu xác thực (challenge) hoặc cho phép lưu lượng truy cập dựa trên các địa chỉ IP hoặc quốc gia cụ thể.",[488,13447,13448,13451],{},[441,13449,13450],{},"Cloudflare Zero Trust (Khuyên dùng):"," Hoạt động như một cổng bảo mật giúp NodeWarden của bạn hoàn toàn tàng hình trước công chúng, chỉ cho phép những người dùng đã được ủy quyền đi qua.",[2167,13453,13455],{"id":13454},"tại-sao-chúng-tôi-khuyên-dùng-cloudflare-zero-trust","Tại sao chúng tôi khuyên dùng Cloudflare Zero Trust",[430,13457,13458,13459,13462],{},"Chúng tôi đặc biệt khuyên bạn nên sử dụng Cloudflare Zero Trust vì IP Access Rules bị ràng buộc với địa chỉ IP hoặc quốc gia. Điều này có nghĩa là bạn phải cập nhật thủ công các quy tắc của mình mỗi khi đi du lịch hoặc nếu bạn đang dùng IP động. Ngược lại, Cloudflare Zero Trust dựa trên ",[441,13460,13461],{},"danh tính"," của bạn chứ không phải vị trí địa lý—mang lại cho bạn quyền truy cập liền mạch và an toàn vào NodeWarden.",[12330,13464],{},[474,13466,13468],{"id":13467},"hướng-dẫn-cấu-hình","Hướng dẫn cấu hình",[430,13470,13471],{},"Hãy làm theo các bước sau để cấu hình Cloudflare Zero Trust cho NodeWarden.",[2167,13473,13475],{"id":13474},"giai-đoạn-1-bắt-đầu","Giai đoạn 1: Bắt đầu",[533,13477,13478,13485,13492,13499],{},[488,13479,13480,13481],{},"Trên bảng điều khiển (dashboard) Cloudflare của bạn, nhấp vào 'Zero Trust' từ menu bên trái.\n",[433,13482],{"alt":13483,"src":13484},"Thanh bên của bảng điều khiển Cloudflare hiển thị tùy chọn Zero Trust được chọn trong menu điều hướng.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-dashboard-zero-trust-sidebar.webp",[488,13486,13487,13488],{},"Nhấp vào 'Access controls', sau đó nhấp vào 'Applications'.\n",[433,13489],{"alt":13490,"src":13491},"Menu điều hướng Cloudflare Zero Trust với phần Kiểm soát truy cập được mở rộng.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-zero-trust-access-controls-menu.webp",[488,13493,13494,13495],{},"Hệ thống có thể yêu cầu bạn chọn gói ('Choose a plan').\n",[433,13496],{"alt":13497,"src":13498},"Màn hình thiết lập tài khoản Cloudflare Zero Trust yêu cầu người dùng chọn gói đăng ký.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-zero-trust-choose-plan-setup.webp",[488,13500,13501,13502],{},"Nhấp vào nút 'Choose a plan' và chọn gói 'Zero Trust Free'.\n",[433,13503],{"alt":13504,"src":13505},"Trang chi tiết gói Zero Trust Free trên Cloudflare, làm nổi bật nút Chọn gói.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-zero-trust-free-plan-selection.webp",[2167,13507,13509],{"id":13508},"giai-đoạn-2-bảo-mật-giao-diện-web-của-bạn","Giai đoạn 2: Bảo mật giao diện Web của bạn",[430,13511,13512],{},"Đầu tiên, chúng ta sẽ tạo một ứng dụng để bảo vệ bảng điều khiển web của NodeWarden.",[533,13514,13515,13522,13529,13536,13543,13550,13557,13560,13567,13570],{},[488,13516,13517,13518],{},"Nhấp vào 'Create new application' để tạo ứng dụng đầu tiên.\n",[433,13519],{"alt":13520,"src":13521},"Bảng điều khiển ứng dụng Cloudflare Access có nút Tạo ứng dụng mới.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-create-new-application.webp",[488,13523,13524,13525],{},"Chọn 'Self-hosted and private'.\n",[433,13526],{"alt":13527,"src":13528},"Cửa sổ thêm ứng dụng trong Cloudflare Access với loại ứng dụng Tự lưu trữ và riêng tư được chọn.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-add-self-hosted-application.webp",[488,13530,13531,13532],{},"Nhập tên miền (domain) của NodeWarden.\n",[433,13533],{"alt":13534,"src":13535},"Màn hình cấu hình ứng dụng Cloudflare Access hiển thị tên máy chủ công khai được đặt thành warden.techvoyage.dev.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-application-public-hostname.webp",[488,13537,13538,13539],{},"Nhấp vào 'Create new policy' để tạo một chính sách.\n",[433,13540],{"alt":13541,"src":13542},"Trang chính sách Cloudflare Access hiển thị không có chính sách nào được thêm và nút để tạo chính sách mới.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-no-policies-create-button.webp",[488,13544,13545,13546],{},"Chọn 'Emails' và nhập một email vào mục 'Policy rules'.\n",[433,13547],{"alt":13548,"src":13549},"Màn hình cấu hình quy tắc chính sách Cloudflare Access với địa chỉ email được chỉ định làm tiêu chí bao gồm.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-email.webp",[488,13551,13552,13553],{},"Nhập tên và chọn 'Allow' trong mục 'Policy details'.\n",[433,13554],{"alt":13555,"src":13556},"Màn hình chi tiết chính sách Cloudflare Access hiển thị tên chính sách NodeWarden-Web và hành động được đặt thành Cho phép.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-details-allow.webp",[488,13558,13559],{},"Nhấp 'Save Policy' để lưu chính sách.",[488,13561,13562,13563],{},"Nhập tên và chọn '1 month' trong phần 'Details'.\n",[433,13564],{"alt":13565,"src":13566},"Bản tóm tắt cấu hình cuối cùng cho ứng dụng Cloudflare Access có tên NodeWarden-Web với thời hạn phiên là một tháng.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-application-final-details.webp",[488,13568,13569],{},"Nhấp vào 'Create' để tạo ứng dụng.",[488,13571,13572,13575,13576],{},[441,13573,13574],{},"Kiểm tra:"," Mở tên miền trên trình duyệt web, bạn sẽ thấy 'Cloudflare Access' yêu cầu nhập email.\n",[433,13577],{"alt":13578,"src":13579},"Bản xem trước màn hình đăng nhập Cloudflare Access cho NodeWarden-Web, yêu cầu nhập địa chỉ email.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-login-screen-preview.webp",[2167,13581,13583],{"id":13582},"giai-đoạn-3-cho-phép-đồng-bộ-hóa-client-bitwarden-bỏ-qua-api-api-bypass","Giai đoạn 3: Cho phép đồng bộ hóa Client BitWarden (Bỏ qua API \u002F API Bypass)",[430,13585,13586],{},"Các ứng dụng BitWarden trên máy tính và thiết bị di động không thể xử lý màn hình đăng nhập email của Cloudflare. Do đó, chúng ta cần tạo ứng dụng thứ hai cho phép lưu lượng truy cập bỏ qua (bypass) màn hình đăng nhập, dành riêng cho việc đồng bộ hóa API.",[533,13588,13589,13599,13614,13619,13626,13633,13636,13643],{},[488,13590,13591,13592,13595,13596,461],{},"Quay lại phần Applications và nhấp vào ",[441,13593,13594],{},"Create new application",", chọn lại ",[441,13597,13598],{},"Self-hosted and private",[488,13600,13601,13602,13605,13606,13609,13610],{},"Nhập 'api\u002F",[909,13603,13604],{},"', 'identity\u002F","', 'notifications\u002F",[909,13607,13608],{},"' và 'icons\u002F","' vào phần Destinations.\n",[433,13611],{"alt":13612,"src":13613},"Cấu hình nhiều tên máy chủ công khai để bỏ qua API trong Cloudflare Access, bao gồm các đường dẫn api, identity, notifications và icons.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-api-bypass-destinations.webp",[488,13615,13616,13617],{},"Nhấp vào 'Create new policy' để tạo chính sách.\n",[433,13618],{"alt":13541,"src":13542},[488,13620,13621,13622],{},"Chọn 'Everyone' trong mục 'Policy rules'.\n",[433,13623],{"alt":13624,"src":13625},"Cấu hình quy tắc chính sách Cloudflare Access với Mọi người được chọn để cho phép truy cập rộng rãi vào các đường dẫn cụ thể.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-everyone.webp",[488,13627,13628,13629],{},"Nhập tên và chọn 'Bypass' trong mục 'Policy details'.\n",[433,13630],{"alt":13631,"src":13632},"Chi tiết chính sách Cloudflare Access cho NodeWarden-API với hành động được đặt thành Bỏ qua.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-details-bypass.webp",[488,13634,13635],{},"Nhấp 'Save Policy' để lưu lại.",[488,13637,13638,13639],{},"Nhập tên và chọn '1 month' cho 'Session Duration'.\n",[433,13640],{"alt":13641,"src":13642},"Màn hình cấu hình cuối cùng cho ứng dụng NodeWarden-API trong Cloudflare Access.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-api-application-final-details.webp",[488,13644,13645,13646],{},"Bạn sẽ thấy có 2 ứng dụng đã được tạo thành công.\n",[433,13647],{"alt":13648,"src":13649},"Bảng điều khiển ứng dụng Cloudflare Access hiển thị cả hai ứng dụng Web và API đã được tạo thành công.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-applications-list-final.webp",[474,13651,6168],{"id":6167},[430,13653,13654],{},"Hãy nhớ rằng Cloudflare chỉ là lớp khiên bảo vệ bên ngoài của bạn. Để duy trì một kho lưu trữ (vault) thực sự an toàn, hãy đảm bảo bạn vẫn đang sử dụng một mật khẩu chính (master password) đủ mạnh, sử dụng Xác thực hai yếu tố (2FA) và giữ cho tài khoản Cloudflare của bạn luôn được bảo mật.",{"title":425,"searchDepth":1071,"depth":1078,"links":13656},[13657,13658,13663],{"id":13454,"depth":1085,"text":13455},{"id":13467,"depth":1071,"text":13468,"children":13659},[13660,13661,13662],{"id":13474,"depth":1085,"text":13475},{"id":13508,"depth":1085,"text":13509},{"id":13582,"depth":1085,"text":13583},{"id":6167,"depth":1071,"text":6168},[2612,9492],"2026-05-27","Ngay khi NodeWarden của bạn được hiển thị công khai trên Internet, nó sẽ bắt đầu thu hút hàng ngàn bot tự động liên tục quét tìm các lỗ hổng bảo mật 24\u002F7.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fhuong-dan-bao-mat-nodewarden-tich-hop-cloudflare.webp","Hình ảnh thu nhỏ cho hướng dẫn từng bước bảo mật kho lưu trữ NodeWarden bằng cách tích hợp Cloudflare, với hình ảnh két sắt kỹ thuật số và tủ máy chủ được bảo vệ.",{"schemaOrg":13670,"robots":1702,"sitemap":13672},[13671],{"@type":1679,"headline":13429,"description":13666},{"lastmod":13665},{"title":13429,"description":13666,"ogTitle":13429,"ogDescription":13666,"twitterTitle":13429,"twitterDescription":13666},"vi\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",[],"hvf_vrWNSea9bkBCDq8AZeJm3YOqnieQ_PU0JbxBxb0",{"id":13678,"title":13679,"author":1711,"body":13680,"category":14279,"date":14280,"description":14281,"extension":1673,"image":14282,"imageAlt":14283,"isPublished":1074,"meta":14284,"minRead":2291,"navigation":1074,"path":299,"seo":14289,"stem":14290,"tags":14291,"updatedAt":1711,"__hash__":14292},"article\u002Fvi\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare.md","Cách tự host kho mật khẩu tương thích BitWarden",{"type":427,"value":13681,"toc":14265},[13682,13685,13691,13695,13919,13923,13942,13946,13972,13976,14006,14010,14037,14041,14083,14087,14123,14127,14130,14134,14163,14167,14190,14194,14197,14214,14219,14222,14225,14239,14243,14256,14260],[430,13683,13684],{},"Mật khẩu là tài sản kỹ thuật số quan trọng nhất của bạn, và giữ an toàn cho chúng đồng nghĩa với việc bạn phải tự mình kiểm soát. Bằng cách tự host (self-host) trình quản lý mật khẩu của mình, bạn sẽ làm chủ hoàn toàn bảo mật của bản thân.",[430,13686,13687,13690],{},[441,13688,13689],{},"BitWarden"," được đánh giá rộng rãi là một trong những giải pháp đáng tin cậy nhất trong lĩnh vực quản lý mật khẩu và mã nguồn của nó được phát hành theo giấy phép AGPL-3.0. Một máy chủ không chính thức tương thích với BitWarden là NodeWarden, được viết bằng Typescript và có thể được triển khai (deploy) miễn phí trên nền tảng Cloudflare.",[2167,13692,13694],{"id":13693},"so-sánh-tính-năng-với-máy-chủ-bitwarden-chính-thức","So sánh tính năng với Máy chủ BitWarden Chính thức",[603,13696,13697,13752],{},[606,13698,13699],{},[609,13700,13701,13714,13726,13739],{},[612,13702,13703],{},[441,13704,13705,13707,13709,13710,13712],{},[1889,13706],{},[1889,13708],{},"Tính năng",[1889,13711],{},[1889,13713],{},[612,13715,13716],{},[441,13717,13718,13720,13689,13722,13724],{},[1889,13719],{},[1889,13721],{},[1889,13723],{},[1889,13725],{},[612,13727,13728],{},[441,13729,13730,13732,13734,13735,13737],{},[1889,13731],{},[1889,13733],{},"NodeWarden",[1889,13736],{},[1889,13738],{},[612,13740,13741],{},[441,13742,13743,13745,13747,13748,13750],{},[1889,13744],{},[1889,13746],{},"Ghi chú",[1889,13749],{},[1889,13751],{},[621,13753,13754,13770,13785,13797,13809,13825,13841,13856,13871,13883,13895,13908],{},[609,13755,13756,13759,13762,13764],{},[626,13757,13758],{},"Web Vault (Kho lưu trữ Web)",[626,13760,13761],{},"✅",[626,13763,13761],{},[626,13765,13766,13769],{},[441,13767,13768],{},"Giao diện Web Vault nguyên bản","​",[609,13771,13772,13778,13780,13782],{},[626,13773,13774,13775],{},"Đồng bộ hóa đầy đủ ",[495,13776,13777],{},"\u002Fapi\u002Fsync",[626,13779,13761],{},[626,13781,13761],{},[626,13783,13784],{},"Tối ưu hóa tính tương thích cho các client chính thức",[609,13786,13787,13790,13792,13794],{},[626,13788,13789],{},"Upload \u002F tải xuống tệp đính kèm",[626,13791,13761],{},[626,13793,13761],{},[626,13795,13796],{},"Cloudflare R2 hoặc KV",[609,13798,13799,13802,13804,13806],{},[626,13800,13801],{},"Send (Gửi)",[626,13803,13761],{},[626,13805,13761],{},[626,13807,13808],{},"Hỗ trợ Send cả dạng văn bản và tệp",[609,13810,13811,13814,13816,13818],{},[626,13812,13813],{},"Nhập \u002F Xuất (Import\u002FExport)",[626,13815,13761],{},[626,13817,13761],{},[626,13819,13820,13821,13824],{},"Hỗ trợ nhập (import) JSON \u002F CSV \u002F ",[441,13822,13823],{},"ZIP kèm tệp đính kèm","​ của BitWarden",[609,13826,13827,13832,13834,13836],{},[626,13828,13829,13769],{},[441,13830,13831],{},"Trung tâm Sao lưu Đám mây",[626,13833,8594],{},[626,13835,13761],{},[626,13837,13838,13769],{},[441,13839,13840],{},"Sao lưu định kỳ lên WebDAV \u002F S3",[609,13842,13843,13846,13849,13851],{},[626,13844,13845],{},"Gợi ý mật khẩu (web)",[626,13847,13848],{},"⚠️ Hạn chế",[626,13850,13761],{},[626,13852,13853,13769],{},[441,13854,13855],{},"Không yêu cầu email",[609,13857,13858,13861,13863,13865],{},[626,13859,13860],{},"TOTP \u002F Steam TOTP",[626,13862,13761],{},[626,13864,13761],{},[626,13866,13867,13868],{},"Bao gồm hỗ trợ ",[495,13869,13870],{},"steam:\u002F\u002F",[609,13872,13873,13876,13878,13880],{},[626,13874,13875],{},"Nhiều người dùng (Multi-user)",[626,13877,13761],{},[626,13879,13761],{},[626,13881,13882],{},"Đăng ký theo hình thức thư mời",[609,13884,13885,13888,13890,13892],{},[626,13886,13887],{},"Tổ chức \u002F Bộ sưu tập \u002F Phân quyền",[626,13889,13761],{},[626,13891,8594],{},[626,13893,13894],{},"Chưa được triển khai",[609,13896,13897,13900,13902,13905],{},[626,13898,13899],{},"Đăng nhập 2FA",[626,13901,13761],{},[626,13903,13904],{},"⚠️ Một phần",[626,13906,13907],{},"Hiện tại chỉ hỗ trợ TOTP cấp người dùng",[609,13909,13910,13913,13915,13917],{},[626,13911,13912],{},"SSO \u002F SCIM \u002F Danh bạ doanh nghiệp",[626,13914,13761],{},[626,13916,8594],{},[626,13918,13894],{},[889,13920,13922],{"id":13921},"những-gì-chúng-ta-cần","Những gì chúng ta cần:",[533,13924,13925,13930,13936],{},[488,13926,13927],{},[441,13928,13929],{},"Một tài khoản GitHub",[488,13931,13932,13935],{},[441,13933,13934],{},"Một tài khoản Cloudflare"," (Miễn phí) đã kích hoạt Cloudflare R2 Storage.",[488,13937,13938,13941],{},[909,13939,13940],{},"Tùy chọn:"," Một tên miền tùy chỉnh (custom domain) được quản lý trong Cloudflare.",[889,13943,13945],{"id":13944},"giai-đoạn-1-chuẩn-bị-code","Giai đoạn 1: Chuẩn bị Code",[533,13947,13948,13965],{},[488,13949,13950,13951,13955,13956,13960,13961],{},"Fork kho lưu trữ NodeWarden từ ",[444,13952,13953],{"href":13953,"rel":13954},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fnodewarden",[448]," hoặc kho lưu trữ gốc ",[444,13957,13958],{"href":13958,"rel":13959},"https:\u002F\u002Fgithub.com\u002Fshuaiplus\u002Fnodewarden",[448]," trên GitHub.\n",[433,13962],{"alt":13963,"src":13964},"Fork kho lưu trữ NodeWarden trên GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Ffork-nodewarden-repo.webp",[488,13966,13967,13968],{},"Bật Workflow \"Sync Upstream\".\n",[433,13969],{"alt":13970,"src":13971},"Bật quy trình Sync Upstream trong GitHub Actions","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fenable-sync-upstream.webp",[889,13973,13975],{"id":13974},"giai-đoạn-2-triển-khai-deploy-lên-cloudflare","Giai đoạn 2: Triển khai (Deploy) lên Cloudflare",[533,13977,13978,13987,14000],{},[488,13979,13980,13981,13983],{},"Tạo một ứng dụng Worker trong Cloudflare.",[1889,13982],{},[433,13984],{"alt":13985,"src":13986},"Tạo ứng dụng Worker mới trong bảng điều khiển Cloudflare","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcreate-cloudflare-worker.webp",[488,13988,13989,13990,13992,13996],{},"Chọn 'Continue with GitHub' để deploy ứng dụng.",[1889,13991],{},[433,13993],{"alt":13994,"src":13995},"Triển khai ứng dụng NodeWarden bằng cách kết nối với GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fdeploy-github-repo.webp",[433,13997],{"alt":13998,"src":13999},"Tiến trình xây dựng và triển khai Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-deploy-status.webp",[488,14001,14002,14003,461],{},"Chờ một vài phút để Cloudflare build và deploy ứng dụng của bạn. Nó sẽ cung cấp cho bạn một URL mặc định có đuôi ",[495,14004,14005],{},"worker.dev",[889,14007,14009],{"id":14008},"tùy-chọn-thêm-tên-miền-tùy-chỉnh","(Tùy chọn) Thêm Tên miền Tùy chỉnh:",[485,14011,14012,14018,14024],{},[488,14013,14014,14015,461],{},"Trong cài đặt Cloudflare Worker của bạn, hãy vào tab ",[441,14016,14017],{},"Settings",[488,14019,14020,14021,461],{},"Nhấp vào ",[441,14022,14023],{},"+ Add",[488,14025,14026,14027,14029,14033],{},"Nhập tên miền bạn muốn và làm theo hướng dẫn.",[1889,14028],{},[433,14030],{"alt":14031,"src":14032},"Điều hướng đến cài đặt tên miền tùy chỉnh trong Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fworker-settings-custom-domain.webp",[433,14034],{"alt":14035,"src":14036},"Thêm tên miền tùy chỉnh vào Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fadd-custom-domain.webp",[889,14038,14040],{"id":14039},"giai-đoạn-3-bảo-mật-máy-chủ-của-bạn-khóa-bảo-mật-jwt","Giai đoạn 3: Bảo mật Máy chủ của bạn (Khóa bảo mật JWT)",[533,14042,14043,14046,14058,14077],{},[488,14044,14045],{},"Mở trình duyệt web và nhập tên miền tùy chỉnh của bạn hoặc tên miền 'worker.dev' vừa được tạo.",[488,14047,14048,14049,461,14052,14054],{},"Bạn sẽ nhận được thông báo '",[441,14050,14051],{},"JWT_SECRET is missing'",[1889,14053],{},[433,14055],{"alt":14056,"src":14057},"Thông báo lỗi JWT_SECRET is missing trên máy chủ NodeWarden","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fjwt-secret-missing-error.webp",[488,14059,14060,14061,14063,14064,1878,14067,14069,14073],{},"Sao chép secret key (khóa bí mật) được tạo ra và quay lại tab Settings trên NodeWarden Worker của bạn, sau đó nhấp vào nút '",[441,14062,14023],{},"' trong phần '",[441,14065,14066],{},"Variables and Secrets",[1889,14068],{},[433,14070],{"alt":14071,"src":14072},"Phần Biến và Bí mật trong cài đặt Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fworker-variables-secrets.webp",[433,14074],{"alt":14075,"src":14076},"Thêm bí mật JWT đã tạo vào các biến Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fadd-jwt-secret.webp",[488,14078,14079,14080,1878],{},"Dán chuỗi bí mật vừa tạo vào và nhấp vào nút '",[441,14081,14082],{},"Deploy \u002F Save",[889,14084,14086],{"id":14085},"giai-đoạn-4-tạo-tài-khoản-admin-của-bạn","Giai đoạn 4: Tạo Tài khoản Admin của bạn",[533,14088,14089,14098,14111,14120],{},[488,14090,14091,14092,14094],{},"Quay lại trình duyệt web và tải lại (refresh) trang, bạn sẽ thấy trang đăng nhập như sau.",[1889,14093],{},[433,14095],{"alt":14096,"src":14097},"Trang đăng nhập máy chủ NodeWarden","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fnodewarden-login.webp",[488,14099,14100,14101,14104,14105,14107],{},"Nhấp vào '",[441,14102,14103],{},"Create Account","' để tạo tài khoản quản trị (admin).",[1889,14106],{},[433,14108],{"alt":14109,"src":14110},"Nhấp vào nút Create Account trên trang đăng nhập NodeWarden","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcreate-account-button.webp",[488,14112,14113,14114,14116],{},"Đăng nhập vào bảng điều khiển (Dashboard) bằng tài khoản admin vừa được tạo.",[1889,14115],{},[433,14117],{"alt":14118,"src":14119},"Tổng quan về bảng điều khiển quản trị NodeWarden","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fnodewarden-dashboard.webp",[488,14121,14122],{},"Bây giờ máy chủ của chúng ta đã được deploy và đang hoạt động. Chúng ta sẽ bắt đầu thiết lập các client BitWarden.",[889,14124,14126],{"id":14125},"giai-đoạn-5-kết-nối-các-thiết-bị-của-bạn","Giai đoạn 5: Kết nối Các Thiết bị của bạn",[430,14128,14129],{},"Bạn có thể sử dụng các ứng dụng BitWarden chính thức trên tất cả thiết bị của mình.",[889,14131,14133],{"id":14132},"tiện-ích-mở-rộng-trên-chrome","Tiện ích mở rộng trên Chrome",[533,14135,14136,14139,14142,14151,14160],{},[488,14137,14138],{},"Cài đặt tiện ích mở rộng BitWarden cho Chrome.",[488,14140,14141],{},"Mở tiện ích mở rộng lên.",[488,14143,14144,14145,14147],{},"Nhấp vào đường link bên cạnh chữ 'Accessing:' ở dưới cùng của cửa sổ popup.",[1889,14146],{},[433,14148],{"alt":14149,"src":14150},"Chọn tùy chọn tự lưu trữ trong tiện ích mở rộng Bitwarden Chrome","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-extension-self-hosted.webp",[488,14152,14153,14154,14156],{},"Nhập tên miền của máy chủ NodeWarden của bạn vào.",[1889,14155],{},[433,14157],{"alt":14158,"src":14159},"Nhập URL máy chủ trong tiện ích mở rộng Bitwarden Chrome","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-extension-domain.webp",[488,14161,14162],{},"Lưu các cài đặt và đăng nhập bằng tài khoản của bạn.",[2167,14164,14166],{"id":14165},"ứng-dụng-ios","Ứng dụng iOS",[533,14168,14169,14172,14181],{},[488,14170,14171],{},"Cài đặt ứng dụng BitWarden từ App Store.",[488,14173,14174,14175,14177],{},"Mở ứng dụng và nhấp vào '' bên cạnh phần 'Logging in on:'.",[1889,14176],{},[433,14178],{"alt":14179,"src":14180},"Truy cập cài đặt tự lưu trữ trong ứng dụng Bitwarden iOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-ios-self-hosted.webp",[488,14182,14183,14184,14186],{},"Nhập tên miền của máy chủ NodeWarden và nhấp vào nút '✓'.",[1889,14185],{},[433,14187],{"alt":14188,"src":14189},"Cấu hình URL máy chủ trong ứng dụng Bitwarden iOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-ios-domain.webp",[889,14191,14193],{"id":14192},"các-client-khác","Các Client Khác",[430,14195,14196],{},"NodeWarden đã được thử nghiệm và xác nhận tương thích với các client BitWarden chính thức sau:",[485,14198,14199,14202,14205,14208,14211],{},[488,14200,14201],{},"✅ Windows desktop",[488,14203,14204],{},"✅ Ứng dụng di động Android\u002FiOS",[488,14206,14207],{},"✅ Tiện ích mở rộng trình duyệt",[488,14209,14210],{},"✅ Linux desktop",[488,14212,14213],{},"⚠️ macOS desktop (chưa xác minh hoàn toàn)",[14215,14216,14218],"h1",{"id":14217},"sao-lưu-kho-lưu-trữ-vault-backup","Sao lưu Kho lưu trữ (Vault Backup)",[430,14220,14221],{},"NodeWarden cho phép bạn sao lưu vault của mình vào một máy tính cục bộ hoặc lưu trữ từ xa (remote storage hỗ trợ S3 hoặc WebDAV).",[430,14223,14224],{},"Để tự động hóa sao lưu từ xa:",[485,14226,14227,14230],{},[488,14228,14229],{},"Cấu hình thông tin lưu trữ từ xa ngay trong bảng điều khiển của NodeWarden.",[488,14231,14232,14233,14235],{},"Đảm bảo rằng Cron task đã được thiết lập trên cài đặt của Cloudflare Worker để tự động sao lưu từ xa.",[1889,14234],{},[433,14236],{"alt":14237,"src":14238},"Cấu hình trình kích hoạt Cron để sao lưu kho tiền tự động trong Cloudflare","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-worker-cron.webp",[14215,14240,14242],{"id":14241},"lưu-ý-bảo-mật-cuối-cùng","Lưu ý Bảo mật Cuối cùng",[485,14244,14245,14248,14251],{},[488,14246,14247],{},"Bảo mật quyền truy cập vào tài khoản Cloudflare của bạn, nếu không dữ liệu có thể bị đánh cắp. Hãy kích hoạt Xác thực Hai Yếu tố (2FA) hoặc Passkey trên tài khoản Cloudflare của bạn ngay lập tức.",[488,14249,14250],{},"Hãy host NodeWarden trên một tài khoản Cloudflare chuyên dụng. Không chia sẻ tài nguyên với các ứng dụng web khác để giảm thiểu các rủi ro về mặt an ninh.",[488,14252,14253],{},[444,14254,14255],{"href":371},"Bảo mật NodeWarden với Cloudflare",[14215,14257,14259],{"id":14258},"tham-khảo","Tham khảo",[485,14261,14262],{},[488,14263,14264],{},"Hướng dẫn Bắt đầu NodeWarden Chính thức",{"title":425,"searchDepth":1071,"depth":1078,"links":14266},[14267,14268,14269,14270,14271,14272,14273,14274,14275,14278],{"id":13693,"depth":1085,"text":13694},{"id":13921,"depth":1078,"text":13922},{"id":13944,"depth":1078,"text":13945},{"id":13974,"depth":1078,"text":13975},{"id":14008,"depth":1078,"text":14009},{"id":14039,"depth":1078,"text":14040},{"id":14085,"depth":1078,"text":14086},{"id":14125,"depth":1078,"text":14126},{"id":14132,"depth":1078,"text":14133,"children":14276},[14277],{"id":14165,"depth":1085,"text":14166},{"id":14192,"depth":1078,"text":14193},[2612,9492],"2026-05-25","Mật khẩu là tài sản kỹ thuật số quan trọng nhất của bạn, và giữ an toàn cho chúng đồng nghĩa với việc bạn phải tự mình kiểm soát.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Ftu-host-may-chu-bitwarden.webp","Thumbnail hướng dẫn tự host máy chủ tương thích BitWarden, hiển thị két sắt kỹ thuật số và tủ máy chủ bảo mật.",{"schemaOrg":14285,"robots":1702,"sitemap":14288},[14286],{"@type":1679,"headline":14287,"description":14281},"Cách bảo mật mật khẩu trong kho lưu trữ riêng bằng cách tự host máy chủ tương thích BitWarden",{"lastmod":14280},{"title":14287,"description":14281,"ogTitle":14287,"ogDescription":14281,"twitterTitle":14287,"twitterDescription":14281},"vi\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",[],"wFsOImxCPu81QXiz_6SElODOS0VJeUgTl521q1bIvWw",1792489978356]