[{"data":1,"prerenderedAt":6396},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices":421,"\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices-surround":1937},[4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346],{"path":5},"\u002Fde\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":7},"\u002Fde\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":9},"\u002Fde\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":11},"\u002Fde\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":13},"\u002Fde\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":15},"\u002Fde\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":17},"\u002Fde\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":19},"\u002Fde\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":21},"\u002Fde\u002Farticle\u002Fsetup-antigravity-2",{"path":23},"\u002Fde\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":25},"\u002Fde\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":27},"\u002Fde\u002Farticle\u002Fsync-obsidian-across-devices",{"path":29},"\u002Fde\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":31},"\u002Fde\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":33},"\u002Fde\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":35},"\u002Fde\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":37},"\u002Fen\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":39},"\u002Fen\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":41},"\u002Fen\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":43},"\u002Fen\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":45},"\u002Fen\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":47},"\u002Fen\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":49},"\u002Fen\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":51},"\u002Fen\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":53},"\u002Fen\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":55},"\u002Fen\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":57},"\u002Fen\u002Farticle\u002Fsetup-antigravity-2",{"path":59},"\u002Fen\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":61},"\u002Fen\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":63},"\u002Fen\u002Farticle\u002Fsync-obsidian-across-devices",{"path":65},"\u002Fen\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":67},"\u002Fen\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":69},"\u002Fen\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":71},"\u002Fen\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":73},"\u002Fes\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":75},"\u002Fes\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":77},"\u002Fes\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":79},"\u002Fes\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":81},"\u002Fes\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":83},"\u002Fes\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":85},"\u002Fes\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":87},"\u002Fes\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":89},"\u002Fes\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":91},"\u002Fes\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":93},"\u002Fes\u002Farticle\u002Fsetup-antigravity-2",{"path":95},"\u002Fes\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":97},"\u002Fes\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":99},"\u002Fes\u002Farticle\u002Fsync-obsidian-across-devices",{"path":101},"\u002Fes\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":103},"\u002Fes\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":105},"\u002Fes\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":107},"\u002Fes\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":109},"\u002Ffr\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":111},"\u002Ffr\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":113},"\u002Ffr\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":115},"\u002Ffr\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":117},"\u002Ffr\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":119},"\u002Ffr\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":121},"\u002Ffr\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":123},"\u002Ffr\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":125},"\u002Ffr\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":127},"\u002Ffr\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":129},"\u002Ffr\u002Farticle\u002Fsetup-antigravity-2",{"path":131},"\u002Ffr\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":133},"\u002Ffr\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":135},"\u002Ffr\u002Farticle\u002Fsync-obsidian-across-devices",{"path":137},"\u002Ffr\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":139},"\u002Ffr\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":141},"\u002Ffr\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":143},"\u002Ffr\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":145},"\u002Fid\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":147},"\u002Fid\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":149},"\u002Fid\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":151},"\u002Fid\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":153},"\u002Fid\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":155},"\u002Fid\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":157},"\u002Fid\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":159},"\u002Fid\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":161},"\u002Fid\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":163},"\u002Fid\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":165},"\u002Fid\u002Farticle\u002Fsetup-antigravity-2",{"path":167},"\u002Fid\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":169},"\u002Fid\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":171},"\u002Fid\u002Farticle\u002Fsync-obsidian-across-devices",{"path":173},"\u002Fid\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":175},"\u002Fid\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":177},"\u002Fid\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":179},"\u002Fid\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":181},"\u002Fja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":183},"\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":185},"\u002Fja\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":187},"\u002Fja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":189},"\u002Fja\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":191},"\u002Fja\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":193},"\u002Fja\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":195},"\u002Fja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":197},"\u002Fja\u002Farticle\u002Fsetup-antigravity-2",{"path":199},"\u002Fja\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":201},"\u002Fja\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":203},"\u002Fja\u002Farticle\u002Fsync-obsidian-across-devices",{"path":205},"\u002Fja\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":207},"\u002Fja\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":209},"\u002Fja\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":211},"\u002Fja\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":213},"\u002Fpt\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":215},"\u002Fpt\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":217},"\u002Fpt\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":219},"\u002Fpt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":221},"\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":223},"\u002Fpt\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":225},"\u002Fpt\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":227},"\u002Fpt\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":229},"\u002Fpt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":231},"\u002Fpt\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":233},"\u002Fpt\u002Farticle\u002Fsetup-antigravity-2",{"path":235},"\u002Fpt\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":237},"\u002Fpt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":239},"\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices",{"path":241},"\u002Fpt\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":243},"\u002Fpt\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":245},"\u002Fpt\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":247},"\u002Fpt\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":249},"\u002Ftw\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":251},"\u002Ftw\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":253},"\u002Ftw\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":255},"\u002Ftw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":257},"\u002Ftw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":259},"\u002Ftw\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":261},"\u002Ftw\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":263},"\u002Ftw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":265},"\u002Ftw\u002Farticle\u002Fsetup-antigravity-2",{"path":267},"\u002Ftw\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":269},"\u002Ftw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":271},"\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices",{"path":273},"\u002Ftw\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":275},"\u002Ftw\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":277},"\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":279},"\u002Ftw\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":281},"\u002Fvi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":283},"\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":285},"\u002Fvi\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":287},"\u002Fvi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":289},"\u002Fvi\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":291},"\u002Fvi\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":293},"\u002Fvi\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":295},"\u002Fvi\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":297},"\u002Fvi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":299},"\u002Fvi\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":301},"\u002Fvi\u002Farticle\u002Fsetup-antigravity-2",{"path":303},"\u002Fvi\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":305},"\u002Fvi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":307},"\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices",{"path":309},"\u002Fvi\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":311},"\u002Fvi\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":313},"\u002Fvi\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":315},"\u002Fvi\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":317},"\u002Fzh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":319},"\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":321},"\u002Fzh\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":323},"\u002Fzh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":325},"\u002Fzh\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":327},"\u002Fzh\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":329},"\u002Fzh\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":331},"\u002Fzh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":333},"\u002Fzh\u002Farticle\u002Fsetup-antigravity-2",{"path":335},"\u002Fzh\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":337},"\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":339},"\u002Fzh\u002Farticle\u002Fsync-obsidian-across-devices",{"path":341},"\u002Fzh\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":343},"\u002Fzh\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":345},"\u002Fzh\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":347},"\u002Fzh\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417],{"title":350,"path":351,"stem":352},"AI Agent Skills: What They Are & How to Create Them","\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them","en\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"title":354,"path":355,"stem":356},"Bringing Buzz to DeepSeek Harness: Taught to Speak Nostr","\u002Farticle\u002Fbringing-buzz-to-deepseek-harness","en\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"title":358,"path":359,"stem":360},"Solving AI Agent Skills Fragmentation with npx skills","\u002Farticle\u002Fcentralised-the-skills-for-agents","en\u002Farticle\u002Fcentralised-the-skills-for-agents",{"title":362,"path":363,"stem":364},"How to Expose Hermes Agent Privately with Cloudflare WARP","\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp","en\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"title":366,"path":367,"stem":368},"How AI Agent Skills Replace Nuxt App Scaffolding Scripts","\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts","en\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"title":370,"path":371,"stem":372},"Stop Exposing Your Vault: Secure NodeWarden with Cloudflare","\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare","en\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"title":374,"path":375,"stem":376},"How to Deploy Hermes Agent on a Linux VPS","\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server","en\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"title":378,"path":379,"stem":380},"Self-Host Your Travel Itineraries with TREK and Docker","\u002Farticle\u002Fself-hosted-travel-planner-trek","en\u002Farticle\u002Fself-hosted-travel-planner-trek",{"title":382,"path":383,"stem":384},"Self-Host Block's Buzz: Shared AI Agent Workspace","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues","en\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"title":386,"path":387,"stem":388},"How to Self-Host a BitWarden Compatible Server Nodewarden","\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare","en\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"title":390,"path":391,"stem":392},"Google Antigravity 2 Hands-On: Setup & First Impressions","\u002Farticle\u002Fsetup-antigravity-2","en\u002Farticle\u002Fsetup-antigravity-2",{"title":394,"path":395,"stem":396},"NetSuite AI Connector Guide: MCP Setup & Use Cases","\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude","en\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"title":398,"path":399,"stem":400},"Switch Between Multiple Cloudflare WARP Orgs on Mac","\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac","en\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"title":402,"path":403,"stem":404},"How to Sync Obsidian Vaults Across Devices Securely","\u002Farticle\u002Fsync-obsidian-across-devices","en\u002Farticle\u002Fsync-obsidian-across-devices",{"title":406,"path":407,"stem":408},"Testing Claude Fable 5: A Financial Analysis Review","\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis","en\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"title":410,"path":411,"stem":412},"Guide to Browser and Scheduler in Antigravity 2","\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2","en\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"title":414,"path":415,"stem":416},"Build a Persistent AI Memory System on Cloudflare","\u002Farticle\u002Fuse-cloudflare-as-ai-memory","en\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"title":418,"path":419,"stem":420},"Antigravity 2 in Action: AI Agents, Skills, and MCP","\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2","en\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"id":422,"title":423,"author":424,"body":425,"category":1911,"date":1913,"description":1914,"extension":1915,"image":1916,"imageAlt":1917,"isPublished":738,"meta":1918,"minRead":1187,"navigation":738,"path":307,"seo":1927,"stem":1929,"tags":1930,"updatedAt":1935,"__hash__":1936},"article\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices.md","Cách đồng bộ vault Obsidian qua các thiết bị an toàn","",{"type":426,"value":427,"toc":1889},"minimark",[428,432,438,449,458,478,483,492,497,502,518,534,537,542,547,554,559,563,568,643,650,682,686,694,702,709,776,779,798,805,817,821,825,831,836,847,868,873,887,892,897,902,916,919,924,927,932,936,941,955,959,973,983,987,992,995,1005,1038,1042,1049,1201,1234,1239,1260,1271,1276,1280,1290,1363,1367,1372,1409,1540,1547,1553,1559,1565,1568,1574,1580,1594,1605,1612,1618,1625,1762,1768,1773,1776,1781,1784,1788,1793,1798,1804,1815,1825,1829,1840,1846,1852,1858,1862,1885],[429,430,431],"p",{},"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,434],"img",{"src":435,"alt":436,"style":437},"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;",[429,439,440,441,448],{},"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. ",[442,443,447],"a",{"href":444,"rel":445},"https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch",[446],"nofollow","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.",[429,450,451,452,457],{},"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. ",[442,453,456],{"href":454,"rel":455},"https:\u002F\u002Fgithub.com\u002FNystik-gh\u002Fignis",[446],"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.",[429,459,460,461,464,465,467,468,471,472,477],{},"Trong hướng dẫn này, chúng ta sẽ thiết lập ",[462,463,447],"strong",{}," và ",[462,466,456],{}," trên một ",[462,469,470],{},"VPS",", đồng thời bảo mật chúng bên trong mạng riêng ",[462,473,474],{},[442,475,476],{"href":363},"Cloudflare Zero Trust"," thay vì mở trực tiếp ra internet công cộng.",[433,479],{"src":480,"alt":481,"style":482},"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;",[484,485],"article-card",{"description":486,"image":487,"image-alt":488,"label":489,"min-read":490,"title":491,"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",[493,494,496],"h2",{"id":495},"đồ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",[429,498,499,501],{},[462,500,447],{}," cung cấp các tính năng nổi bật sau:",[503,504,505,509,512,515],"ul",{},[506,507,508],"li",{},"Đồng bộ hóa vault ngay khi phát hiện thay đổi",[506,510,511],{},"Mã hóa dữ liệu vault đầu cuối trước khi upload",[506,513,514],{},"Khôi phục từ lịch sử phiên bản",[506,516,517],{},"Tự động xử lý và giải quyết xung đột file",[429,519,520,522,523,526,527,530,531,533],{},[462,521,447],{}," tạo ra một ",[462,524,525],{},"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 ",[462,528,529],{},"vault password"," (mật khẩu vault); mật khẩu này dùng để bảo vệ ",[462,532,525],{}," để 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.",[429,535,536],{},"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.",[538,539,541],"h3",{"id":540},"thiết-lập-synch-trên-vps","Thiết lập Synch trên VPS",[543,544,546],"h4",{"id":545},"tạo-bản-ghi-tên-miền-dns","Tạo Bản ghi Tên miền (DNS)",[429,548,549,550,553],{},"Tạo một bản ghi A trên Cloudflare và đặt trạng thái proxy là ",[462,551,552],{},"DNS only"," (bỏ qua CDN của Cloudflare).",[433,555],{"src":556,"alt":557,"style":558},"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;",[543,560,562],{"id":561},"cài-đặt-synch-docker-trên-ubuntu","Cài đặt Synch Docker trên Ubuntu",[564,565,567],"h5",{"id":566},"clone-repository","Clone Repository",[569,570,574],"pre",{"className":571,"code":572,"language":573,"meta":424,"style":424},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","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","bash",[575,576,577,597,603,610,620,625,631],"code",{"__ignoreMap":424},[578,579,582,586,590,593],"span",{"class":580,"line":581},"line",1,[578,583,585],{"class":584},"sBMFI","git",[578,587,589],{"class":588},"sfazB"," clone",[578,591,592],{"class":588}," https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git",[578,594,596],{"class":595},"sTEyZ","       \n",[578,598,600],{"class":580,"line":599},2,[578,601,602],{"class":595},"        \n",[578,604,606],{"class":580,"line":605},3,[578,607,609],{"class":608},"sHwdD","# Navigate to the API folder\n",[578,611,613,617],{"class":580,"line":612},4,[578,614,616],{"class":615},"s2Zo4","cd",[578,618,619],{"class":588}," synch\u002Fapps\u002Fapi\n",[578,621,623],{"class":580,"line":622},5,[578,624,602],{"class":595},[578,626,628],{"class":580,"line":627},6,[578,629,630],{"class":608},"# Copy the example environment file:\n",[578,632,634,637,640],{"class":580,"line":633},7,[578,635,636],{"class":584},"cp",[578,638,639],{"class":588}," .env.example",[578,641,642],{"class":588}," .env\n",[564,644,646,647],{"id":645},"chỉnh-sửa-các-giá-trị-trong-env","Chỉnh sửa các giá trị trong ",[575,648,649],{},".env",[503,651,652,658,676],{},[506,653,654,657],{},[575,655,656],{},"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).",[506,659,660,464,663,666,667,671,672,675],{},[575,661,662],{},"BETTER_AUTH_SECRET",[575,664,665],{},"SYNC_TOKEN_SECRET",": Tạo các khóa bí mật bảo mật bằng cách sử dụng ",[442,668,670],{"href":669},"\u002Fvi\u002Ftools\u002Fsecret-key-hex","công cụ tạo key online"," hoặc chạy lệnh ",[575,673,674],{},"openssl rand -hex 32"," hai lần trong terminal của bạn.",[506,677,678,681],{},[575,679,680],{},"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).",[564,683,685],{"id":684},"thêm-tên-miền-vào-caddyfile","Thêm Tên miền vào Caddyfile",[429,687,688,689,693],{},"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 ",[442,690,692],{"href":691},"\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",".",[484,695],{"description":696,"image":697,"image-alt":698,"label":699,"min-read":700,"title":701,"to":691},"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","12","Tự host Buzz của Block: Không gian cộng tác giữa người và AI",[429,703,704,705,708],{},"Thêm biến môi trường ",[575,706,707],{},"SYNCH_DOMAIN"," vào file Caddyfile và trỏ về cổng 8787 của container Synch:",[569,710,714],{"className":711,"code":712,"language":713,"meta":424,"style":424},"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",[575,715,716,722,730,734,740,754,759,771],{"__ignoreMap":424},[578,717,718],{"class":580,"line":581},[578,719,721],{"class":720},"sMK4o","{\n",[578,723,724,727],{"class":580,"line":599},[578,725,726],{"class":595},"  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN",[578,728,729],{"class":720},"}\n",[578,731,732],{"class":580,"line":605},[578,733,729],{"class":595},[578,735,736],{"class":580,"line":612},[578,737,739],{"emptyLinePlaceholder":738},true,"\n",[578,741,742,745,748,751],{"class":580,"line":622},[578,743,744],{"class":720},"{",[578,746,747],{"class":595},"$SYNCH_DOMAIN",[578,749,750],{"class":720},"}",[578,752,753],{"class":720}," {\n",[578,755,756],{"class":580,"line":627},[578,757,758],{"class":595},"  encode zstd gzip\n",[578,760,761,764,767],{"class":580,"line":633},[578,762,763],{"class":595},"  reverse_proxy host.docker.internal",[578,765,766],{"class":720},":",[578,768,770],{"class":769},"sbssI","8787\n",[578,772,774],{"class":580,"line":773},8,[578,775,729],{"class":720},[429,777,778],{},"Khởi chạy container:",[569,780,782],{"className":571,"code":781,"language":573,"meta":424,"style":424},"docker compose up -d\n",[575,783,784],{"__ignoreMap":424},[578,785,786,789,792,795],{"class":580,"line":581},[578,787,788],{"class":584},"docker",[578,790,791],{"class":588}," compose",[578,793,794],{"class":588}," up",[578,796,797],{"class":588}," -d\n",[429,799,800,801,804],{},"Chạy lệnh ",[575,802,803],{},"curl"," sau để kiểm tra xem hệ thống đã hoạt động chưa:",[569,806,808],{"className":571,"code":807,"language":573,"meta":424,"style":424},"curl https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[575,809,810],{"__ignoreMap":424},[578,811,812,814],{"class":580,"line":581},[578,813,803],{"class":584},[578,815,816],{"class":588}," https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[538,818,820],{"id":819},"kết-nối-obsidian-với-server-synch","Kết nối Obsidian với Server Synch",[543,822,824],{"id":823},"cài-đặt-plugin-synch-trên-obsidian","Cài đặt Plugin Synch trên Obsidian",[429,826,827,828,766],{},"Vào Cài đặt (Settings) -> Community plugins và nhấn nút ",[462,829,830],{},"'Browse'",[433,832],{"src":833,"alt":834,"style":835},"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;",[429,837,838,839,842,843],{},"Tìm kiếm và cài đặt plugin ",[462,840,841],{},"'Synchrun'",":\n",[433,844],{"src":845,"alt":846,"style":558},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-install-synchrun-plugin.webp","Cài đặt plugin Synchrun trong Obsidian",[429,848,849,850,852,853,856,857,860,861,864,865,693],{},"Sau khi cài đặt xong ",[462,851,841],{},", vào phần cài đặt của plugin này, kích hoạt tùy chọn ",[462,854,855],{},"'Use a self-hosted server'",". Điền địa chỉ ",[575,858,859],{},"https:\u002F\u002Fsynch.pafor.me"," vào trường ",[462,862,863],{},"'Server URL'"," và nhấn ",[462,866,867],{},"'Save'",[433,869],{"src":870,"alt":871,"style":872},"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;",[429,874,875,876,879,880,883,884,886],{},"Nhấn nút ",[462,877,878],{},"'Sign in on this device'"," bên dưới mục ",[462,881,882],{},"'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 ",[575,885,680],{},"), bạn sẽ được chuyển đến trang ủy quyền sau:",[433,888],{"src":889,"alt":890,"style":891},"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;",[429,893,875,894,766],{},[462,895,896],{},"'Allow Obsidian sign-in'",[433,898],{"src":899,"alt":900,"style":901},"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;",[429,903,875,904,907,908,842,911],{},[462,905,906],{},"'Return to Obsidian'"," rồi click chọn ",[462,909,910],{},"'Create vault'",[433,912],{"src":913,"alt":914,"style":915},"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;",[429,917,918],{},"Đặt tên cho vault và mật khẩu để tạo vault mới.",[433,920],{"src":921,"alt":922,"style":923},"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;",[429,925,926],{},"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,928],{"src":929,"alt":930,"style":931},"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;",[493,933,935],{"id":934},"truy-cập-obsidian-qua-web-bằng-ignis","Truy cập Obsidian qua Web bằng Ignis",[429,937,938,940],{},[462,939,456],{}," 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.",[429,942,943,944,464,949,954],{},"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ề ",[442,945,948],{"href":946,"rel":947},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Flimitations\u002F",[446],"Hạn chế của Ignis",[442,950,953],{"href":951,"rel":952},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Fplugin-compatibility\u002F",[446],"Khả năng tương thích plugin"," để biết thêm chi tiết.",[538,956,958],{"id":957},"cài-đặt-ignis","Cài đặt Ignis",[429,960,961,962,964,965,968,969,972],{},"Chúng ta sẽ cài đặt ",[462,963,456],{}," trên VPS bằng Docker và mount thư mục lưu trữ vào ",[575,966,967],{},".\u002Fvaults",". Thư mục này sau đó sẽ được đồng bộ hóa tự động bằng ",[462,970,971],{},"Synch CLI"," với vault từ xa mà chúng ta đã thiết lập ở phần trước.",[429,974,975,976,978,979,693],{},"Vì ",[462,977,456],{}," 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 ",[462,980,981],{},[442,982,476],{"href":363},[543,984,986],{"id":985},"tạo-bản-ghi-dns","Tạo Bản ghi DNS",[433,988],{"src":989,"alt":990,"style":991},"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;",[543,993,685],{"id":994},"thêm-tên-miền-vào-caddyfile-1",[429,996,997,998,1001,1002,766],{},"Thêm tên miền ",[575,999,1000],{},"obsidian.pafor.me"," vào Caddyfile tương tự như cách làm với ",[575,1003,1004],{},"synch.pafor.me",[569,1006,1008],{"className":711,"code":1007,"language":713,"meta":424,"style":424},"{$OBSIDIAN_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:9898\n}\n",[575,1009,1010,1021,1025,1034],{"__ignoreMap":424},[578,1011,1012,1014,1017,1019],{"class":580,"line":581},[578,1013,744],{"class":720},[578,1015,1016],{"class":595},"$OBSIDIAN_DOMAIN",[578,1018,750],{"class":720},[578,1020,753],{"class":720},[578,1022,1023],{"class":580,"line":599},[578,1024,758],{"class":595},[578,1026,1027,1029,1031],{"class":580,"line":605},[578,1028,763],{"class":595},[578,1030,766],{"class":720},[578,1032,1033],{"class":769},"9898\n",[578,1035,1036],{"class":580,"line":612},[578,1037,729],{"class":720},[543,1039,1041],{"id":1040},"khởi-chạy-ignis-bằng-docker","Khởi chạy Ignis bằng Docker",[429,1043,1044,1045,1048],{},"Lưu file cấu hình Docker Compose sau thành ",[575,1046,1047],{},"ignis-docker-compose.yml"," trên VPS:",[569,1050,1054],{"className":1051,"code":1052,"language":1053,"meta":424,"style":424},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","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","yml",[575,1055,1056,1064,1071,1081,1088,1102,1109,1114,1121,1129,1137,1145,1153,1161,1169,1180,1185,1193],{"__ignoreMap":424},[578,1057,1058,1062],{"class":580,"line":581},[578,1059,1061],{"class":1060},"swJcz","services",[578,1063,842],{"class":720},[578,1065,1066,1069],{"class":580,"line":599},[578,1067,1068],{"class":1060},"  ignis",[578,1070,842],{"class":720},[578,1072,1073,1076,1078],{"class":580,"line":605},[578,1074,1075],{"class":1060},"    image",[578,1077,766],{"class":720},[578,1079,1080],{"class":588}," nobbe\u002Fignis:latest\n",[578,1082,1083,1086],{"class":580,"line":612},[578,1084,1085],{"class":1060},"    ports",[578,1087,842],{"class":720},[578,1089,1090,1093,1096,1099],{"class":580,"line":622},[578,1091,1092],{"class":720},"      -",[578,1094,1095],{"class":720}," \"",[578,1097,1098],{"class":588},"9898:8080",[578,1100,1101],{"class":720},"\"\n",[578,1103,1104,1107],{"class":580,"line":627},[578,1105,1106],{"class":1060},"    environment",[578,1108,842],{"class":720},[578,1110,1111],{"class":580,"line":633},[578,1112,1113],{"class":608},"      # match these to your host user (run: id)\n",[578,1115,1116,1118],{"class":580,"line":773},[578,1117,1092],{"class":720},[578,1119,1120],{"class":588}," PUID=1000\n",[578,1122,1124,1126],{"class":580,"line":1123},9,[578,1125,1092],{"class":720},[578,1127,1128],{"class":588}," PGID=1000\n",[578,1130,1132,1134],{"class":580,"line":1131},10,[578,1133,1092],{"class":720},[578,1135,1136],{"class":588}," WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n",[578,1138,1140,1143],{"class":580,"line":1139},11,[578,1141,1142],{"class":1060},"    volumes",[578,1144,842],{"class":720},[578,1146,1148,1150],{"class":580,"line":1147},12,[578,1149,1092],{"class":720},[578,1151,1152],{"class":588}," .\u002Fvaults:\u002Fvaults\n",[578,1154,1156,1158],{"class":580,"line":1155},13,[578,1157,1092],{"class":720},[578,1159,1160],{"class":588}," .\u002Fdata:\u002Fapp\u002Fdata\n",[578,1162,1164,1166],{"class":580,"line":1163},14,[578,1165,1092],{"class":720},[578,1167,1168],{"class":588}," obsidian-app:\u002Fapp\u002Fobsidian-app\n",[578,1170,1172,1175,1177],{"class":580,"line":1171},15,[578,1173,1174],{"class":1060},"    restart",[578,1176,766],{"class":720},[578,1178,1179],{"class":588}," unless-stopped\n",[578,1181,1183],{"class":580,"line":1182},16,[578,1184,739],{"emptyLinePlaceholder":738},[578,1186,1188,1191],{"class":580,"line":1187},17,[578,1189,1190],{"class":1060},"volumes",[578,1192,842],{"class":720},[578,1194,1196,1199],{"class":580,"line":1195},18,[578,1197,1198],{"class":1060},"  obsidian-app",[578,1200,842],{"class":720},[503,1202,1203,1214,1227],{},[506,1204,1205,1206,1209,1210,1213],{},"Sử dụng cổng ",[575,1207,1208],{},"9898"," trên máy chủ host vì cổng ",[575,1211,1212],{},"8080"," rất dễ bị trùng lặp với các dịch vụ khác.",[506,1215,800,1216,1219,1220,464,1223,1226],{},[575,1217,1218],{},"id"," trên VPS để lấy thông số ",[575,1221,1222],{},"UID",[575,1224,1225],{},"GID"," của user trên máy chủ nhằm đảm bảo phân quyền ghi đọc chính xác.",[506,1228,1229,1230,1233],{},"Đặt ",[575,1231,1232],{},"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.",[429,1235,1236,1237,766],{},"Khởi chạy container ",[462,1238,456],{},[569,1240,1242],{"className":571,"code":1241,"language":573,"meta":424,"style":424},"docker compose -f ignis-docker-compose.yml up -d\n",[575,1243,1244],{"__ignoreMap":424},[578,1245,1246,1248,1250,1253,1256,1258],{"class":580,"line":581},[578,1247,788],{"class":584},[578,1249,791],{"class":588},[578,1251,1252],{"class":588}," -f",[578,1254,1255],{"class":588}," ignis-docker-compose.yml",[578,1257,794],{"class":588},[578,1259,797],{"class":588},[429,1261,1262,1263,1266,1267,1270],{},"Khi bạn truy cập tên miền của mình trên trình duyệt web, giao diện ",[462,1264,1265],{},"'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 ",[462,1268,1269],{},"'Synch CLI'"," để đồng bộ dữ liệu từ vault từ xa về máy chủ.",[433,1272],{"src":1273,"alt":1274,"style":1275},"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;",[543,1277,1279],{"id":1278},"giải-quyết-vấn-đề-firewall-của-docker","Giải quyết Vấn đề Firewall của Docker",[429,1281,1282,1283,1286,1287,766],{},"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ệ ",[575,1284,1285],{},"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 ",[575,1288,1289],{},"iptables",[569,1291,1293],{"className":571,"code":1292,"language":573,"meta":424,"style":424},"# 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",[575,1294,1295,1300,1329,1333,1338],{"__ignoreMap":424},[578,1296,1297],{"class":580,"line":581},[578,1298,1299],{"class":608},"# Chặn toàn bộ lưu lượng truy cập bên ngoài\n",[578,1301,1302,1305,1308,1311,1314,1317,1320,1323,1326],{"class":580,"line":599},[578,1303,1304],{"class":584},"sudo",[578,1306,1307],{"class":588}," iptables",[578,1309,1310],{"class":588}," -I",[578,1312,1313],{"class":588}," DOCKER-USER",[578,1315,1316],{"class":588}," -i",[578,1318,1319],{"class":588}," ext_if",[578,1321,1322],{"class":588}," -j",[578,1324,1325],{"class":588}," DROP",[578,1327,1328],{"class":595}," \n",[578,1330,1331],{"class":580,"line":605},[578,1332,739],{"emptyLinePlaceholder":738},[578,1334,1335],{"class":580,"line":612},[578,1336,1337],{"class":608},"# Chỉ cho phép lưu lượng truy cập từ địa chỉ IP riêng của client Cloudflare WARP\n",[578,1339,1340,1342,1344,1346,1348,1350,1352,1355,1358,1360],{"class":580,"line":622},[578,1341,1304],{"class":584},[578,1343,1307],{"class":588},[578,1345,1310],{"class":588},[578,1347,1313],{"class":588},[578,1349,1316],{"class":588},[578,1351,1319],{"class":588},[578,1353,1354],{"class":588}," -s",[578,1356,1357],{"class":769}," 100.96.0.10",[578,1359,1322],{"class":588},[578,1361,1362],{"class":588}," ACCEPT\n",[543,1364,1366],{"id":1365},"cấu-hình-synch-cli","Cấu hình Synch CLI",[429,1368,1369,1371],{},[462,1370,971],{}," 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.",[429,1373,1374,1375,1377,1378,1381,1382,1385,1386,1389,1390,1393,1394,1393,1397,1400,1401,1404,1405,1408],{},"Build ",[462,1376,971],{}," từ mã nguồn repository ",[575,1379,1380],{},"synch"," bạn đã clone. Quá trình build yêu cầu ",[462,1383,1384],{},"Node.js >= 22.5"," (vì CLI sử dụng thư viện ",[575,1387,1388],{},"node:sqlite"," và các API trình duyệt toàn cầu như ",[575,1391,1392],{},"fetch",", ",[575,1395,1396],{},"WebSocket",[575,1398,1399],{},"WebCrypto",") và trình quản lý gói ",[462,1402,1403],{},"pnpm"," (repo là một pnpm workspace, sử dụng phiên bản ",[575,1406,1407],{},"pnpm@10.33.0","):",[569,1410,1412],{"className":571,"code":1411,"language":573,"meta":424,"style":424},"# 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",[575,1413,1414,1419,1430,1437,1441,1446,1453,1457,1462,1475,1479,1484,1495,1524,1528,1533],{"__ignoreMap":424},[578,1415,1416],{"class":580,"line":581},[578,1417,1418],{"class":608},"# Check versions\n",[578,1420,1421,1424,1427],{"class":580,"line":599},[578,1422,1423],{"class":584},"node",[578,1425,1426],{"class":588}," --version",[578,1428,1429],{"class":608},"   # must be >= 22.5\n",[578,1431,1432,1434],{"class":580,"line":605},[578,1433,1403],{"class":584},[578,1435,1436],{"class":588}," --version\n",[578,1438,1439],{"class":580,"line":612},[578,1440,739],{"emptyLinePlaceholder":738},[578,1442,1443],{"class":580,"line":622},[578,1444,1445],{"class":608},"# In the repos root\n",[578,1447,1448,1450],{"class":580,"line":627},[578,1449,1403],{"class":584},[578,1451,1452],{"class":588}," install\n",[578,1454,1455],{"class":580,"line":633},[578,1456,739],{"emptyLinePlaceholder":738},[578,1458,1459],{"class":580,"line":773},[578,1460,1461],{"class":608},"# Build the CLI bundle\n",[578,1463,1464,1466,1469,1472],{"class":580,"line":1123},[578,1465,1403],{"class":584},[578,1467,1468],{"class":588}," -C",[578,1470,1471],{"class":588}," apps\u002Fcli",[578,1473,1474],{"class":588}," build\n",[578,1476,1477],{"class":580,"line":1131},[578,1478,739],{"emptyLinePlaceholder":738},[578,1480,1481],{"class":580,"line":1139},[578,1482,1483],{"class":608},"# After a successful build you have `apps\u002Fcli\u002Fdist\u002Fsynch.js`. Make it executable and put it on your PATH\n",[578,1485,1486,1489,1492],{"class":580,"line":1147},[578,1487,1488],{"class":584},"chmod",[578,1490,1491],{"class":588}," +x",[578,1493,1494],{"class":588}," apps\u002Fcli\u002Fdist\u002Fsynch.js\n",[578,1496,1497,1500,1503,1505,1508,1511,1514,1516,1519,1522],{"class":580,"line":1155},[578,1498,1499],{"class":584},"ln",[578,1501,1502],{"class":588}," -sf",[578,1504,1095],{"class":720},[578,1506,1507],{"class":595},"$PWD",[578,1509,1510],{"class":588},"\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js",[578,1512,1513],{"class":720},"\"",[578,1515,1095],{"class":720},[578,1517,1518],{"class":595},"$HOME",[578,1520,1521],{"class":588},"\u002F.local\u002Fbin\u002Fsynch",[578,1523,1101],{"class":720},[578,1525,1526],{"class":580,"line":1163},[578,1527,739],{"emptyLinePlaceholder":738},[578,1529,1530],{"class":580,"line":1171},[578,1531,1532],{"class":608},"# Verification\n",[578,1534,1535,1537],{"class":580,"line":1182},[578,1536,1380],{"class":584},[578,1538,1539],{"class":588}," --help\n",[429,1541,1542,1543,1546],{},"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 ",[575,1544,1545],{},"synch login --api-url \u003Cremote-synch-api-url>"," để chỉ định máy chủ API đích.",[429,1548,1549],{},[433,1550],{"alt":1551,"src":1552},"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",[429,1554,800,1555,1558],{},[575,1556,1557],{},"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:",[429,1560,1561],{},[433,1562],{"alt":1563,"src":1564},"Đầ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",[429,1566,1567],{},"Đă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.",[429,1569,1570],{},[433,1571],{"alt":1572,"src":1573},"Đă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",[429,1575,800,1576,1579],{},[575,1577,1578],{},"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.",[429,1581,1582,1583,1586,1587,1590,1591,1408],{},"ID của vault từ xa có thể được tìm thấy bằng cách vào plugin ",[462,1584,1585],{},"Synchrun"," trên máy tính và nhấn ",[462,1588,1589],{},"'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ụ: ",[575,1592,1593],{},"123e4567-e89b-12d3-a456-426614174000",[429,1595,1596,1601],{},[433,1597],{"src":1598,"alt":1599,"style":1600},"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,1602],{"alt":1603,"src":1604},"Đị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",[429,1606,1607,1608,1611],{},"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 ",[575,1609,1610],{},"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.",[429,1613,1614],{},[433,1615],{"alt":1616,"src":1617},"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",[429,1619,1620,1621,1624],{},"Để 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 ",[575,1622,1623],{},"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:",[569,1626,1628],{"className":571,"code":1627,"language":573,"meta":424,"style":424},"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",[575,1629,1630,1646,1651,1656,1661,1666,1670,1675,1680,1685,1690,1695,1700,1705,1710,1715,1719,1724,1729,1735,1746],{"__ignoreMap":424},[578,1631,1632,1634,1637,1640,1643],{"class":580,"line":581},[578,1633,1304],{"class":584},[578,1635,1636],{"class":588}," tee",[578,1638,1639],{"class":588}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service",[578,1641,1642],{"class":720}," \u003C\u003C",[578,1644,1645],{"class":720},"'EOF'\n",[578,1647,1648],{"class":580,"line":599},[578,1649,1650],{"class":588},"[Unit]\n",[578,1652,1653],{"class":580,"line":605},[578,1654,1655],{"class":588},"Description=Synch vault watcher\n",[578,1657,1658],{"class":580,"line":612},[578,1659,1660],{"class":588},"After=network-online.target\n",[578,1662,1663],{"class":580,"line":622},[578,1664,1665],{"class":588},"Wants=network-online.target\n",[578,1667,1668],{"class":580,"line":627},[578,1669,739],{"emptyLinePlaceholder":738},[578,1671,1672],{"class":580,"line":633},[578,1673,1674],{"class":588},"[Service]\n",[578,1676,1677],{"class":580,"line":773},[578,1678,1679],{"class":588},"Type=simple\n",[578,1681,1682],{"class":580,"line":1123},[578,1683,1684],{"class":588},"User=\u003Cusername>\n",[578,1686,1687],{"class":580,"line":1131},[578,1688,1689],{"class":588},"ExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\n",[578,1691,1692],{"class":580,"line":1139},[578,1693,1694],{"class":588},"WorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\n",[578,1696,1697],{"class":580,"line":1147},[578,1698,1699],{"class":588},"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",[578,1701,1702],{"class":580,"line":1155},[578,1703,1704],{"class":588},"Environment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\n",[578,1706,1707],{"class":580,"line":1163},[578,1708,1709],{"class":588},"Restart=always\n",[578,1711,1712],{"class":580,"line":1171},[578,1713,1714],{"class":588},"RestartSec=5\n",[578,1716,1717],{"class":580,"line":1182},[578,1718,739],{"emptyLinePlaceholder":738},[578,1720,1721],{"class":580,"line":1187},[578,1722,1723],{"class":588},"[Install]\n",[578,1725,1726],{"class":580,"line":1195},[578,1727,1728],{"class":588},"WantedBy=multi-user.target\n",[578,1730,1732],{"class":580,"line":1731},19,[578,1733,1734],{"class":720},"EOF\n",[578,1736,1738,1740,1743],{"class":580,"line":1737},20,[578,1739,1304],{"class":584},[578,1741,1742],{"class":588}," systemctl",[578,1744,1745],{"class":588}," daemon-reload\n",[578,1747,1749,1751,1753,1756,1759],{"class":580,"line":1748},21,[578,1750,1304],{"class":584},[578,1752,1742],{"class":588},[578,1754,1755],{"class":588}," enable",[578,1757,1758],{"class":588}," --now",[578,1760,1761],{"class":588}," synch-watch.service\n",[429,1763,1764,1765,1767],{},"Bây giờ, hãy mở tên miền ",[575,1766,1000],{}," 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,1769],{"src":1770,"alt":1771,"style":1772},"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;",[429,1774,1775],{},"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,1777],{"src":1778,"alt":1779,"style":1780},"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;",[429,1782,1783],{},"Để 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,1785],{"src":1786,"alt":1787,"style":1780},"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",[429,1789,1790,1791,693],{},"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 ",[462,1792,456],{},[433,1794],{"src":1795,"alt":1796,"style":1797},"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;",[429,1799,1800,1801,1803],{},"Giao diện hiển thị khi truy cập ",[575,1802,1000],{}," trên trình duyệt điện thoại di động:",[429,1805,1806,1811],{},[433,1807],{"src":1808,"alt":1809,"style":1810},"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,1812],{"src":1813,"alt":1814,"style":1810},"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",[429,1816,1817,1818,1820,1821,1824],{},"Khi bạn xóa một ghi chú trên ",[462,1819,456],{},", ghi chú đó sẽ được chuyển an toàn vào thư mục rác cục bộ ",[575,1822,1823],{},"~\u002Fvaults\u002F\u003Cvault-name>\u002F.trash"," để tránh mất mát dữ liệu ngoài ý muốn.",[493,1826,1828],{"id":1827},"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",[429,1830,1831,1832,464,1834,1836,1837,1839],{},"Sự kết hợp giữa ",[462,1833,447],{},[462,1835,456],{}," 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 ",[462,1838,476],{}," đ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.",[429,1841,1842,1843,1845],{},"Tất nhiên, ",[462,1844,456],{}," 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.",[429,1847,1848,1849,1851],{},"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ữ ",[462,1850,525],{}," 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ỳ.",[429,1853,1854,1855,1857],{},"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 ",[462,1856,447],{}," 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.",[493,1859,1861],{"id":1860},"references","References",[503,1863,1864,1871,1878],{},[506,1865,1866],{},[442,1867,1870],{"href":1868,"rel":1869},"https:\u002F\u002Fsynch.run\u002Fself-hosting-docker\u002F",[446],"Synch Deploy with Docker Compose",[506,1872,1873],{},[442,1874,1877],{"href":1875,"rel":1876},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fserver\u002Fdeploy\u002F",[446],"Ignis Deploy with Docker",[506,1879,1880],{},[442,1881,1884],{"href":1882,"rel":1883},"https:\u002F\u002Fsynch.run\u002Fblog\u002Fencryption-and-decryption\u002F",[446],"How does end-to-end encryption work in Synch?",[1886,1887,1888],"style",{},"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":424,"searchDepth":599,"depth":605,"links":1890},[1891,1900,1909,1910],{"id":495,"depth":599,"text":496,"children":1892},[1893,1897],{"id":540,"depth":605,"text":541,"children":1894},[1895,1896],{"id":545,"depth":612,"text":546},{"id":561,"depth":612,"text":562},{"id":819,"depth":605,"text":820,"children":1898},[1899],{"id":823,"depth":612,"text":824},{"id":934,"depth":599,"text":935,"children":1901},[1902],{"id":957,"depth":605,"text":958,"children":1903},[1904,1905,1906,1907,1908],{"id":985,"depth":612,"text":986},{"id":994,"depth":612,"text":685},{"id":1040,"depth":612,"text":1041},{"id":1278,"depth":612,"text":1279},{"id":1365,"depth":612,"text":1366},{"id":1827,"depth":599,"text":1828},{"id":1860,"depth":599,"text":1861},[1912],"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.","md","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":1919,"robots":1924,"sitemap":1925},[1920,1922],{"@type":1921,"headline":423,"description":1914,"image":1916},"Article",{"@type":1923,"name":423,"description":1914,"image":1916},"HowTo","index, follow",{"lastmod":1926},"2026-09-16",{"title":1928,"description":1914,"ogTitle":423,"ogDescription":1914,"twitterTitle":423,"twitterDescription":1914},"Đồng bộ Obsidian tự host an toàn với Synch và Ignis","vi\u002Farticle\u002Fsync-obsidian-across-devices",[1931,1932,1933,1934],"Self-hosting","Obsidian","Đồng bộ","Zero Trust",null,"384lhiI8EJgp7zpAfkzfVEbp3fnozc75rkPBSiIpG_M",{"surround":1938,"related":5057},[1939,4136],{"id":1940,"title":701,"author":424,"body":1941,"category":4096,"date":4099,"description":4100,"extension":1915,"image":4101,"imageAlt":4102,"isPublished":738,"meta":4103,"minRead":1748,"navigation":738,"path":297,"seo":4127,"stem":4129,"tags":4130,"updatedAt":1935,"__hash__":4135},"article\u002Fvi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md",{"type":426,"value":1942,"toc":4066},[1943,1946,1952,1958,1962,1965,2003,2007,2013,2051,2055,2059,2073,2080,2085,2089,2093,2108,2114,2164,2190,2194,2201,2207,2211,2214,2424,2428,2468,2474,2481,2489,2538,2544,2572,2576,2580,2607,2633,2638,2680,2689,2961,2965,3008,3013,3020,3024,3028,3052,3055,3061,3067,3071,3079,3085,3088,3094,3100,3129,3136,3142,3145,3151,3155,3158,3161,3164,3170,3173,3179,3185,3191,3196,3200,3211,3218,3224,3227,3233,3237,3244,3250,3257,3261,3269,3333,3342,3397,3400,3471,3477,3493,3499,3503,3549,3555,3558,3564,3567,3573,3577,3594,3610,3616,3714,3717,3723,3734,3783,3790,3796,3808,3824,3827,3833,3837,3844,3866,3875,3973,3985,3991,3998,4004,4007,4013,4016,4022,4026,4029,4033,4063],[429,1944,1945],{},"Sự phân mảnh ngữ cảnh là một trở ngại vô cùng khó chịu khi làm việc với nhiều tác nhân AI (AI agent). Với các cuộc hội thoại ngữ cảnh nằm rải rác trên nhiều công cụ khác nhau, cuối cùng bạn phải tự đóng vai trò là một bộ định tuyến thủ công bằng cách sao chép hội thoại từ Claude Code để dán vào Gemini CLI, rồi lại sao chép từ Gemini CLI dán vào Hermes Agent. Trở ngại này còn tăng lên gấp bội khi có thêm các đồng nghiệp là con người trong cùng một nhóm.",[429,1947,1948],{},[433,1949],{"alt":1950,"src":1951},"Giao diện người dùng của không gian làm việc cộng tác Buzz hiển thị các kênh trò chuyện và tác nhân AI đang hoạt động","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-workspace-interface.webp",[429,1953,1954,1957],{},[462,1955,1956],{},"Buzz",", 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.",[493,1959,1961],{"id":1960},"blocks-buzz-là-gì-không-gian-làm-việc-cộng-tác-cùng-ai-agent","Block's Buzz là gì? Không gian làm việc cộng tác cùng AI Agent",[429,1963,1964],{},"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:",[503,1966,1967,1973,1979,1985,1991,1997],{},[506,1968,1969,1972],{},[462,1970,1971],{},"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.",[506,1974,1975,1978],{},[462,1976,1977],{},"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.",[506,1980,1981,1984],{},[462,1982,1983],{},"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ý.",[506,1986,1987,1990],{},[462,1988,1989],{},"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).",[506,1992,1993,1996],{},[462,1994,1995],{},"Ủ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.",[506,1998,1999,2002],{},[462,2000,2001],{},"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.",[493,2004,2006],{"id":2005},"kiến-trúc-mật-mã-dựa-trên-giao-thức-nostr-của-buzz","Kiến trúc mật mã dựa trên giao thức Nostr của Buzz",[429,2008,2009],{},[433,2010],{"alt":2011,"src":2012},"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",[503,2014,2015,2021,2027,2033,2039,2045],{},[506,2016,2017,2020],{},[462,2018,2019],{},"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.",[506,2022,2023,2026],{},[462,2024,2025],{},"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ủ.",[506,2028,2029,2032],{},[462,2030,2031],{},"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).",[506,2034,2035,2038],{},[462,2036,2037],{},"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.",[506,2040,2041,2044],{},[462,2042,2043],{},"Ứ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.",[506,2046,2047,2050],{},[462,2048,2049],{},"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.",[493,2052,2054],{"id":2053},"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",[538,2056,2058],{"id":2057},"_0-điều-kiện-tiên-quyết","0. Điều kiện tiên quyết",[503,2060,2061,2064,2067,2070],{},[506,2062,2063],{},"Một máy chủ Linux VPS",[506,2065,2066],{},"Tên miền đã trỏ về địa chỉ IP máy chủ của bạn",[506,2068,2069],{},"Docker và Docker Compose plugin",[506,2071,2072],{},"Tài khoản Cloudflare (gói dịch vụ miễn phí)",[429,2074,2075,2076,2079],{},"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 ",[442,2077,2078],{"href":363},"Cách hiển thị riêng tư Hermes Agent với Cloudflare WARP",". 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.",[484,2081],{"description":2082,"image":2083,"image-alt":2084,"label":489,"min-read":490,"title":2078,"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.","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 tác nhân Hermes cho mạng riêng bằng Cloudflare Zero Trust và đường hầm WARP",[538,2086,2088],{"id":2087},"_1-cloudflare-dns-và-api-token","1. Cloudflare DNS và API Token",[543,2090,2092],{"id":2091},"tạo-cloudflare-api-token","Tạo Cloudflare API Token",[2094,2095,2096,2102],"ol",{},[506,2097,2098,2099,693],{},"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 ",[462,2100,2101],{},"Profile",[506,2103,2104,2105,693],{},"Nhấp vào mục ",[462,2106,2107],{},"API Tokens",[429,2109,2110],{},[433,2111],{"alt":2112,"src":2113},"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",[2094,2115,2116,2122,2128,2148,2154,2158,2161],{"start":605},[506,2117,2118,2119,693],{},"Nhấp vào nút ",[462,2120,2121],{},"Create Token",[506,2123,2124,2125,693],{},"Chọn sử dụng mẫu ",[462,2126,2127],{},"Edit zone DNS",[506,2129,2130,2131],{},"Cấu hình các thông số cho mẫu như sau:\n",[503,2132,2133,2139],{},[506,2134,2135,2138],{},[462,2136,2137],{},"Permissions",": Zone — DNS — Edit",[506,2140,2141,2144,2145],{},[462,2142,2143],{},"Zone Resources",": Include — Specific zone — ",[575,2146,2147],{},"example.com",[506,2149,2150,2151,693],{},"Nhấp chọn ",[462,2152,2153],{},"Continue to summary",[506,2155,2150,2156,693],{},[462,2157,2121],{},[506,2159,2160],{},"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.",[506,2162,2163],{},"Kiểm tra xem mã thông báo vừa tạo có hoạt động hay không bằng terminal:",[569,2165,2167],{"className":571,"code":2166,"language":573,"meta":424,"style":424},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[575,2168,2169],{"__ignoreMap":424},[578,2170,2171,2173,2175,2178,2180,2183,2185,2188],{"class":580,"line":581},[578,2172,803],{"class":584},[578,2174,1095],{"class":720},[578,2176,2177],{"class":588},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[578,2179,1513],{"class":720},[578,2181,2182],{"class":588}," -H",[578,2184,1095],{"class":720},[578,2186,2187],{"class":588},"Authorization: Bearer YOUR_TOKEN_HERE",[578,2189,1101],{"class":720},[543,2191,2193],{"id":2192},"bản-ghi-dns","Bản ghi DNS",[503,2195,2196],{},[506,2197,2198,2199,693],{},"Tạo một bản ghi A mới và thiết lập ở trạng thái ",[462,2200,552],{},[429,2202,2203],{},[433,2204],{"alt":2205,"src":2206},"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",[538,2208,2210],{"id":2209},"_2-cài-đặt-docker-trên-ubuntu","2. Cài đặt Docker trên Ubuntu",[429,2212,2213],{},"Chạy các lệnh sau trực tiếp trên Ubuntu để thực hiện cài đặt Docker:",[569,2215,2217],{"className":571,"code":2216,"language":573,"meta":424,"style":424},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Start automatically when the system boots\nsudo systemctl enable docker\n\n# Verify docker is installed\ndocker --version\n\nsudo apt install -y docker-compose-plugin\n\n# Verify the compose plugin is installed\ndocker compose version\n\n",[575,2218,2219,2224,2252,2256,2261,2303,2307,2312,2322,2326,2331,2352,2356,2361,2372,2376,2381,2387,2391,2405,2409,2414],{"__ignoreMap":424},[578,2220,2221],{"class":580,"line":581},[578,2222,2223],{"class":608},"# Add Docker's official GPG key and set up the Docker repository\n",[578,2225,2226,2228,2231,2234,2237,2240,2243,2246,2249],{"class":580,"line":599},[578,2227,803],{"class":584},[578,2229,2230],{"class":588}," -fsSL",[578,2232,2233],{"class":588}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[578,2235,2236],{"class":720}," |",[578,2238,2239],{"class":584}," sudo",[578,2241,2242],{"class":588}," gpg",[578,2244,2245],{"class":588}," --dearmor",[578,2247,2248],{"class":588}," -o",[578,2250,2251],{"class":588}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[578,2253,2254],{"class":580,"line":605},[578,2255,739],{"emptyLinePlaceholder":738},[578,2257,2258],{"class":580,"line":612},[578,2259,2260],{"class":608},"# Add the official Docker repository\n",[578,2262,2263,2266,2268,2271,2274,2277,2280,2283,2286,2288,2290,2292,2294,2297,2300],{"class":580,"line":622},[578,2264,2265],{"class":615},"echo",[578,2267,1095],{"class":720},[578,2269,2270],{"class":588},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[578,2272,2273],{"class":720},"$(",[578,2275,2276],{"class":584},"lsb_release",[578,2278,2279],{"class":588}," -cs",[578,2281,2282],{"class":720},")",[578,2284,2285],{"class":588}," stable",[578,2287,1513],{"class":720},[578,2289,2236],{"class":720},[578,2291,2239],{"class":584},[578,2293,1636],{"class":588},[578,2295,2296],{"class":588}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[578,2298,2299],{"class":720}," >",[578,2301,2302],{"class":588}," \u002Fdev\u002Fnull\n",[578,2304,2305],{"class":580,"line":627},[578,2306,739],{"emptyLinePlaceholder":738},[578,2308,2309],{"class":580,"line":633},[578,2310,2311],{"class":608},"# Update package list\n",[578,2313,2314,2316,2319],{"class":580,"line":773},[578,2315,1304],{"class":584},[578,2317,2318],{"class":588}," apt",[578,2320,2321],{"class":588}," update\n",[578,2323,2324],{"class":580,"line":1123},[578,2325,739],{"emptyLinePlaceholder":738},[578,2327,2328],{"class":580,"line":1131},[578,2329,2330],{"class":608},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[578,2332,2333,2335,2337,2340,2343,2346,2349],{"class":580,"line":1139},[578,2334,1304],{"class":584},[578,2336,2318],{"class":588},[578,2338,2339],{"class":588}," install",[578,2341,2342],{"class":588}," docker-ce",[578,2344,2345],{"class":588}," docker-ce-cli",[578,2347,2348],{"class":588}," containerd.io",[578,2350,2351],{"class":588}," -y\n",[578,2353,2354],{"class":580,"line":1147},[578,2355,739],{"emptyLinePlaceholder":738},[578,2357,2358],{"class":580,"line":1155},[578,2359,2360],{"class":608},"# Start automatically when the system boots\n",[578,2362,2363,2365,2367,2369],{"class":580,"line":1163},[578,2364,1304],{"class":584},[578,2366,1742],{"class":588},[578,2368,1755],{"class":588},[578,2370,2371],{"class":588}," docker\n",[578,2373,2374],{"class":580,"line":1171},[578,2375,739],{"emptyLinePlaceholder":738},[578,2377,2378],{"class":580,"line":1182},[578,2379,2380],{"class":608},"# Verify docker is installed\n",[578,2382,2383,2385],{"class":580,"line":1187},[578,2384,788],{"class":584},[578,2386,1436],{"class":588},[578,2388,2389],{"class":580,"line":1195},[578,2390,739],{"emptyLinePlaceholder":738},[578,2392,2393,2395,2397,2399,2402],{"class":580,"line":1731},[578,2394,1304],{"class":584},[578,2396,2318],{"class":588},[578,2398,2339],{"class":588},[578,2400,2401],{"class":588}," -y",[578,2403,2404],{"class":588}," docker-compose-plugin\n",[578,2406,2407],{"class":580,"line":1737},[578,2408,739],{"emptyLinePlaceholder":738},[578,2410,2411],{"class":580,"line":1748},[578,2412,2413],{"class":608},"# Verify the compose plugin is installed\n",[578,2415,2417,2419,2421],{"class":580,"line":2416},22,[578,2418,788],{"class":584},[578,2420,791],{"class":588},[578,2422,2423],{"class":588}," version\n",[538,2425,2427],{"id":2426},"_3-tải-mã-nguồn-clone-và-cấu-hình","3. Tải mã nguồn (Clone) và cấu hình",[569,2429,2431],{"className":571,"code":2430,"language":573,"meta":424,"style":424},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[575,2432,2433,2442,2446,2453,2461],{"__ignoreMap":424},[578,2434,2435,2437,2439],{"class":580,"line":581},[578,2436,585],{"class":584},[578,2438,589],{"class":588},[578,2440,2441],{"class":588}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[578,2443,2444],{"class":580,"line":599},[578,2445,739],{"emptyLinePlaceholder":738},[578,2447,2448,2450],{"class":580,"line":605},[578,2449,616],{"class":615},[578,2451,2452],{"class":588}," buzz\u002Fdeploy\u002Fcompose\n",[578,2454,2455,2457,2459],{"class":580,"line":612},[578,2456,636],{"class":584},[578,2458,639],{"class":588},[578,2460,642],{"class":588},[578,2462,2463,2466],{"class":580,"line":622},[578,2464,2465],{"class":584},"nano",[578,2467,642],{"class":588},[429,2469,2470,2471,2473],{},"Chỉnh sửa tệp cấu hình ",[575,2472,649],{}," theo từng nhóm thông số:",[503,2475,2476],{},[506,2477,2478],{},[462,2479,2480],{},"Cấu hình Domain:",[569,2482,2487],{"className":2483,"code":2485,"language":2486},[2484],"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",[575,2488,2485],{"__ignoreMap":424},[503,2490,2491,2501],{},[506,2492,2493,2496,2497,2500],{},[462,2494,2495],{},"Khóa chủ sở hữu:"," ",[575,2498,2499],{},"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.",[506,2502,2503,2506],{},[462,2504,2505],{},"Khóa bí mật (Secrets):",[503,2507,2508,2518,2532],{},[506,2509,2510,2511,2514,2515,2517],{},"Tạo các khóa bí mật bằng cách sử dụng ",[442,2512,2513],{"href":669},"công cụ trực tuyến"," này hoặc chạy lệnh ",[575,2516,674],{}," (thực hiện bảy lần).",[506,2519,2520,2521,2524,2525,1393,2528,2531],{},"Thay thế mọi chỗ trống ",[575,2522,2523],{},"CHANGE_ME",": ",[575,2526,2527],{},"BUZZ_RELAY_PRIVATE_KEY",[575,2529,2530],{},"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.",[506,2533,2534,2535,693],{},"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 ",[575,2536,2537],{},"grep CHANGE_ME .env",[569,2539,2542],{"className":2540,"code":2541,"language":2486},[2484],"    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",[575,2543,2541],{"__ignoreMap":424},[503,2545,2546],{},[506,2547,2548,2551],{},[462,2549,2550],{},"Cấu hình khác:",[503,2552,2553,2559],{},[506,2554,704,2555,2558],{},[575,2556,2557],{},"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.",[506,2560,2561,2562,1393,2564,2567,2568,2571],{},"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 ",[575,2563,2499],{},[575,2565,2566],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",", và ",[575,2569,2570],{},"BUZZ_REQUIRE_AUTH_TOKEN=true"," để tăng tính bảo mật.",[538,2573,2575],{"id":2574},"_4-kích-hoạt-https-với-caddy","4. Kích hoạt HTTPS với Caddy",[543,2577,2579],{"id":2578},"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",[503,2581,2582,2593,2604],{},[506,2583,2584,2585,2588,2589,2592],{},"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 ",[575,2586,2587],{},"_acme-challenge.buzz.pafor.me"," lên ",[462,2590,2591],{},"DNS công khai",";",[506,2594,2595,2596,2599,2600,2603],{},"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à ",[575,2597,2598],{},"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 ",[575,2601,2602],{},"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.",[506,2605,2606],{},"Thêm cấu hình sau vào tệp Caddyfile:",[569,2608,2610],{"className":1051,"code":2609,"language":1053,"meta":424,"style":424},"{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n",[575,2611,2612,2616,2629],{"__ignoreMap":424},[578,2613,2614],{"class":580,"line":581},[578,2615,721],{"class":720},[578,2617,2618,2621,2624,2627],{"class":580,"line":599},[578,2619,2620],{"class":588},"  acme_dns cloudflare",[578,2622,2623],{"class":720}," {",[578,2625,2626],{"class":588},"env.CLOUDFLARE_API_TOKEN",[578,2628,729],{"class":720},[578,2630,2631],{"class":580,"line":605},[578,2632,729],{"class":720},[503,2634,2635],{},[506,2636,2637],{},"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:",[569,2639,2641],{"className":1051,"code":2640,"language":1053,"meta":424,"style":424},"FROM caddy:2-builder AS builder\n\nRUN xcaddy build \\\n    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n\nFROM caddy:2-alpine\n\nCOPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[575,2642,2643,2648,2652,2657,2662,2666,2671,2675],{"__ignoreMap":424},[578,2644,2645],{"class":580,"line":581},[578,2646,2647],{"class":588},"FROM caddy:2-builder AS builder\n",[578,2649,2650],{"class":580,"line":599},[578,2651,739],{"emptyLinePlaceholder":738},[578,2653,2654],{"class":580,"line":605},[578,2655,2656],{"class":588},"RUN xcaddy build \\\n",[578,2658,2659],{"class":580,"line":612},[578,2660,2661],{"class":588},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[578,2663,2664],{"class":580,"line":622},[578,2665,739],{"emptyLinePlaceholder":738},[578,2667,2668],{"class":580,"line":627},[578,2669,2670],{"class":588},"FROM caddy:2-alpine\n",[578,2672,2673],{"class":580,"line":633},[578,2674,739],{"emptyLinePlaceholder":738},[578,2676,2677],{"class":580,"line":773},[578,2678,2679],{"class":588},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[503,2681,2682],{},[506,2683,2684,2685,2688],{},"Chỉnh sửa ",[575,2686,2687],{},"compose.caddy.yml"," để sử dụng image với mô-đun Cloudflare và gán API token của Cloudflare:",[569,2690,2692],{"className":1051,"code":2691,"language":1053,"meta":424,"style":424},"services:\n  relay:\n    ports: !reset []\n\n  caddy:\n    build:\n      context: .\n      dockerfile: Dockerfile.caddy\n    image: buzz-caddy:cloudflare\n    depends_on:\n      relay:\n        condition: service_healthy\n    environment:\n      BUZZ_DOMAIN: ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n    ports:\n      - \"${CADDY_HTTP_PORT:-80}:80\"\n      - \"${CADDY_HTTPS_PORT:-443}:443\"\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n      - buzz-caddy-data:\u002Fdata\n      - buzz-caddy-config:\u002Fconfig\n    restart: unless-stopped\n    networks:\n      - buzz-net\n\nvolumes:\n  buzz-caddy-data:\n    labels:\n      com.buzz.volume: caddy-data\n  buzz-caddy-config:\n    labels:\n      com.buzz.volume: caddy-config\n",[575,2693,2694,2700,2707,2720,2724,2731,2738,2748,2758,2767,2774,2781,2791,2797,2807,2817,2823,2834,2845,2851,2858,2865,2872,2881,2889,2897,2902,2909,2917,2925,2936,2944,2951],{"__ignoreMap":424},[578,2695,2696,2698],{"class":580,"line":581},[578,2697,1061],{"class":1060},[578,2699,842],{"class":720},[578,2701,2702,2705],{"class":580,"line":599},[578,2703,2704],{"class":1060},"  relay",[578,2706,842],{"class":720},[578,2708,2709,2711,2713,2717],{"class":580,"line":605},[578,2710,1085],{"class":1060},[578,2712,766],{"class":720},[578,2714,2716],{"class":2715},"spNyl"," !reset",[578,2718,2719],{"class":720}," []\n",[578,2721,2722],{"class":580,"line":612},[578,2723,739],{"emptyLinePlaceholder":738},[578,2725,2726,2729],{"class":580,"line":622},[578,2727,2728],{"class":1060},"  caddy",[578,2730,842],{"class":720},[578,2732,2733,2736],{"class":580,"line":627},[578,2734,2735],{"class":1060},"    build",[578,2737,842],{"class":720},[578,2739,2740,2743,2745],{"class":580,"line":633},[578,2741,2742],{"class":1060},"      context",[578,2744,766],{"class":720},[578,2746,2747],{"class":769}," .\n",[578,2749,2750,2753,2755],{"class":580,"line":773},[578,2751,2752],{"class":1060},"      dockerfile",[578,2754,766],{"class":720},[578,2756,2757],{"class":588}," Dockerfile.caddy\n",[578,2759,2760,2762,2764],{"class":580,"line":1123},[578,2761,1075],{"class":1060},[578,2763,766],{"class":720},[578,2765,2766],{"class":588}," buzz-caddy:cloudflare\n",[578,2768,2769,2772],{"class":580,"line":1131},[578,2770,2771],{"class":1060},"    depends_on",[578,2773,842],{"class":720},[578,2775,2776,2779],{"class":580,"line":1139},[578,2777,2778],{"class":1060},"      relay",[578,2780,842],{"class":720},[578,2782,2783,2786,2788],{"class":580,"line":1147},[578,2784,2785],{"class":1060},"        condition",[578,2787,766],{"class":720},[578,2789,2790],{"class":588}," service_healthy\n",[578,2792,2793,2795],{"class":580,"line":1155},[578,2794,1106],{"class":1060},[578,2796,842],{"class":720},[578,2798,2799,2802,2804],{"class":580,"line":1163},[578,2800,2801],{"class":1060},"      BUZZ_DOMAIN",[578,2803,766],{"class":720},[578,2805,2806],{"class":588}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[578,2808,2809,2812,2814],{"class":580,"line":1171},[578,2810,2811],{"class":1060},"      CLOUDFLARE_API_TOKEN",[578,2813,766],{"class":720},[578,2815,2816],{"class":588}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[578,2818,2819,2821],{"class":580,"line":1182},[578,2820,1085],{"class":1060},[578,2822,842],{"class":720},[578,2824,2825,2827,2829,2832],{"class":580,"line":1187},[578,2826,1092],{"class":720},[578,2828,1095],{"class":720},[578,2830,2831],{"class":588},"${CADDY_HTTP_PORT:-80}:80",[578,2833,1101],{"class":720},[578,2835,2836,2838,2840,2843],{"class":580,"line":1195},[578,2837,1092],{"class":720},[578,2839,1095],{"class":720},[578,2841,2842],{"class":588},"${CADDY_HTTPS_PORT:-443}:443",[578,2844,1101],{"class":720},[578,2846,2847,2849],{"class":580,"line":1731},[578,2848,1142],{"class":1060},[578,2850,842],{"class":720},[578,2852,2853,2855],{"class":580,"line":1737},[578,2854,1092],{"class":720},[578,2856,2857],{"class":588}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[578,2859,2860,2862],{"class":580,"line":1748},[578,2861,1092],{"class":720},[578,2863,2864],{"class":588}," buzz-caddy-data:\u002Fdata\n",[578,2866,2867,2869],{"class":580,"line":2416},[578,2868,1092],{"class":720},[578,2870,2871],{"class":588}," buzz-caddy-config:\u002Fconfig\n",[578,2873,2875,2877,2879],{"class":580,"line":2874},23,[578,2876,1174],{"class":1060},[578,2878,766],{"class":720},[578,2880,1179],{"class":588},[578,2882,2884,2887],{"class":580,"line":2883},24,[578,2885,2886],{"class":1060},"    networks",[578,2888,842],{"class":720},[578,2890,2892,2894],{"class":580,"line":2891},25,[578,2893,1092],{"class":720},[578,2895,2896],{"class":588}," buzz-net\n",[578,2898,2900],{"class":580,"line":2899},26,[578,2901,739],{"emptyLinePlaceholder":738},[578,2903,2905,2907],{"class":580,"line":2904},27,[578,2906,1190],{"class":1060},[578,2908,842],{"class":720},[578,2910,2912,2915],{"class":580,"line":2911},28,[578,2913,2914],{"class":1060},"  buzz-caddy-data",[578,2916,842],{"class":720},[578,2918,2920,2923],{"class":580,"line":2919},29,[578,2921,2922],{"class":1060},"    labels",[578,2924,842],{"class":720},[578,2926,2928,2931,2933],{"class":580,"line":2927},30,[578,2929,2930],{"class":1060},"      com.buzz.volume",[578,2932,766],{"class":720},[578,2934,2935],{"class":588}," caddy-data\n",[578,2937,2939,2942],{"class":580,"line":2938},31,[578,2940,2941],{"class":1060},"  buzz-caddy-config",[578,2943,842],{"class":720},[578,2945,2947,2949],{"class":580,"line":2946},32,[578,2948,2922],{"class":1060},[578,2950,842],{"class":720},[578,2952,2954,2956,2958],{"class":580,"line":2953},33,[578,2955,2930],{"class":1060},[578,2957,766],{"class":720},[578,2959,2960],{"class":588}," caddy-config\n",[543,2962,2964],{"id":2963},"khởi-động-các-docker-container","Khởi động các Docker container",[569,2966,2968],{"className":571,"code":2967,"language":573,"meta":424,"style":424},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[575,2969,2970,2990,2994,2999],{"__ignoreMap":424},[578,2971,2972,2974,2976,2978,2981,2983,2986,2988],{"class":580,"line":581},[578,2973,788],{"class":584},[578,2975,791],{"class":588},[578,2977,1252],{"class":588},[578,2979,2980],{"class":588}," compose.yml",[578,2982,1252],{"class":588},[578,2984,2985],{"class":588}," compose.caddy.yml",[578,2987,794],{"class":588},[578,2989,797],{"class":588},[578,2991,2992],{"class":580,"line":599},[578,2993,739],{"emptyLinePlaceholder":738},[578,2995,2996],{"class":580,"line":605},[578,2997,2998],{"class":608},"#Check the Docker status\n",[578,3000,3001,3003,3005],{"class":580,"line":612},[578,3002,788],{"class":584},[578,3004,791],{"class":588},[578,3006,3007],{"class":588}," ps\n",[433,3009],{"src":3010,"alt":3011,"style":3012},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fdocker-compose-ps-status-terminal.webp","Cửa sổ terminal hiển thị các container đang chạy cho dịch vụ Buzz qua lệnh docker compose ps","max-width: 700px; width: 100%; height: auto;",[429,3014,3015,3016,3019],{},"Mở trình duyệt web của bạn và truy cập ",[575,3017,3018],{},"http:\u002F\u002Fbuzz.pafor.me"," để kiểm tra xem relay đã hoạt động bình thường chưa.",[433,3021],{"src":3022,"alt":3023,"style":923},"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ữ",[538,3025,3027],{"id":3026},"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",[569,3029,3031],{"className":571,"code":3030,"language":573,"meta":424,"style":424},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[575,3032,3033,3044],{"__ignoreMap":424},[578,3034,3035,3038,3041],{"class":580,"line":581},[578,3036,3037],{"class":584},"mkdir",[578,3039,3040],{"class":588}," -p",[578,3042,3043],{"class":588}," \u002Fbuzz_backups\n",[578,3045,3046,3049],{"class":580,"line":599},[578,3047,3048],{"class":584},"crontab",[578,3050,3051],{"class":588}," -e\n",[429,3053,3054],{},"Cài đặt cron job sao lưu cơ sở dữ liệu hàng đêm:",[569,3056,3059],{"className":3057,"code":3058,"language":2486},[2484],"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",[575,3060,3058],{"__ignoreMap":424},[429,3062,3063,3064,3066],{},"Lưu ý: Hãy coi ",[575,3065,2527],{}," 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.",[493,3068,3070],{"id":3069},"thiết-lập-buzz-desktop-client-và-danh-tính-nostr","Thiết lập Buzz Desktop Client và Danh tính Nostr",[429,3072,3073,3074,3078],{},"Tải ứng dụng khách Buzz cho máy tính từ ",[442,3075,3076],{"href":3076,"rel":3077},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[446]," và cài đặt. Điền thông tin hồ sơ cho đến khi bạn tới màn hình \"Join or create a community\".",[429,3080,3081],{},[433,3082],{"alt":3083,"src":3084},"Màn hình thiết lập ban đầu của Buzz Desktop Client để tham gia hoặc tạo cộng đồng","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-setup-community.webp",[429,3086,3087],{},"Nhấp vào \"Join a community\" và sao chép khóa công khai của bạn.",[429,3089,3090],{},[433,3091],{"alt":3092,"src":3093},"Ứng dụng khách Buzz hiển thị danh tính khóa công khai trước khi tham gia cộng đồng","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-join-community-public-key.webp",[429,3095,3096,3097,3099],{},"Chạy lệnh sau trên ",[462,3098,470],{}," để tự thêm mình làm thành viên đầu tiên:",[569,3101,3103],{"className":571,"code":3102,"language":573,"meta":424,"style":424},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[575,3104,3105],{"__ignoreMap":424},[578,3106,3107,3109,3111,3114,3117,3120,3123,3126],{"class":580,"line":581},[578,3108,788],{"class":584},[578,3110,791],{"class":588},[578,3112,3113],{"class":588}," exec",[578,3115,3116],{"class":588}," relay",[578,3118,3119],{"class":588}," buzz-admin",[578,3121,3122],{"class":588}," add-member",[578,3124,3125],{"class":588}," --pubkey",[578,3127,3128],{"class":588}," npub1yourkeyhere\n",[429,3130,3131,3132,3135],{},"Nhập ",[575,3133,3134],{},"wss:\u002F\u002Fbuzz.pafor.me"," vào mục URL cộng đồng và nhấn \"Next\".",[429,3137,3138],{},[433,3139],{"alt":3140,"src":3141},"Nhập URL relay cộng đồng tự lưu trữ vào ứng dụng Buzz trên máy tính","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-input-community-url.webp",[429,3143,3144],{},"Nhập tên hiển thị và nhấn nút Next.",[429,3146,3147],{},[433,3148],{"alt":3149,"src":3150},"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",[538,3152,3154],{"id":3153},"kênh-channels-và-tác-nhân","Kênh (Channels) và Tác nhân",[429,3156,3157],{},"Kênh là các nhóm nhiệm vụ hoặc nhóm dự án. Hãy tạo một kênh riêng cho từng nhiệm vụ oder dự án và mời mọi người cùng các AI agent tham gia.",[429,3159,3160],{},"Mọi thông tin trong kênh được chia sẻ hoàn toàn tự động, loại bỏ việc phải giải thích lại yêu cầu cho từng thành viên một. Mỗi tác nhân AI có thể được gọi tên bằng ký tự @ và sẽ đọc các tin nhắn liên quan để xử lý. Ngoài ra, các tác nhân AI cũng có thể @ nhắc đến nhau.",[429,3162,3163],{},"Hãy thử gửi tin nhắn trực tiếp (DM) cho một tác nhân AI đã cấu hình sẵn",[429,3165,3166],{},[433,3167],{"alt":3168,"src":3169},"Gửi tin nhắn trực tiếp cho tác nhân AI trong ứng dụng khách Buzz trên máy tính","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-dm-agent.webp",[429,3171,3172],{},"Hãy thử tạo một kênh mới và thêm một số tác nhân AI vào kênh",[429,3174,3175],{},[433,3176],{"alt":3177,"src":3178},"Tạo kênh nhiệm vụ hoặc dự án mới trong ứng dụng Buzz trên máy tính","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-create-channel-dialog.webp",[429,3180,3181],{},[433,3182],{"alt":3183,"src":3184},"Thêm thành viên con người và tác nhân AI vào kênh vừa tạo","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-agents-to-channel.webp",[429,3186,3187],{},[433,3188],{"alt":3189,"src":3190},"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,3192],{"src":3193,"alt":3194,"style":3195},"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;",[538,3197,3199],{"id":3198},"kích-hoạt-môi-trường-chạy-runtimes-của-tác-nhân","Kích hoạt môi trường chạy (Runtimes) của tác nhân",[429,3201,3202,3203,3206,3207,3210],{},"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ư ",[575,3204,3205],{},"hermes-acp",") trong các thư mục chuẩn như ",[575,3208,3209],{},"~\u002F.local\u002Fbin",". Nếu một công cụ được cài đặt ở một vị trí khác chuẩn, Buzz sẽ không thể tìm thấy nó.",[429,3212,3213,3214,3217],{},"Đố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 ",[575,3215,3216],{},"~\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 đề:",[569,3219,3222],{"className":3220,"code":3221,"language":2486},[2484],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[575,3223,3221],{"__ignoreMap":424},[429,3225,3226],{},"Giờ đây, Kimi Code sẽ xuất hiện trong danh sách Runtimes của tác nhân.",[429,3228,3229],{},[433,3230],{"alt":3231,"src":3232},"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",[538,3234,3236],{"id":3235},"dự-án-và-kho-lưu-trữ","Dự án và Kho lưu trữ",[429,3238,3239,3240,3243],{},"Kích hoạt tính năng '",[462,3241,3242],{},"Projects","' trong Settings → Experiments trước tiên:",[429,3245,3246],{},[433,3247],{"alt":3248,"src":3249},"Kích hoạt tính năng thử nghiệm Projects trong tab cài đặt của Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-experiments-projects.webp",[429,3251,3252,3253,3256],{},"Hiện tại, dự án phải được tạo thông qua công cụ ",[575,3254,3255],{},"buzz-cli"," (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).",[543,3258,3260],{"id":3259},"cài-đặt-buzz-cli","Cài đặt buzz-cli",[429,3262,3263,3264,3266,3267,766],{},"Chạy các lệnh sau để cài đặt ",[575,3265,3255],{}," trên máy chủ ",[462,3268,470],{},[569,3270,3272],{"className":571,"code":3271,"language":573,"meta":424,"style":424},"sudo apt install cargo\ncd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-cli\necho 'export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"' >> ~\u002F.bashrc && source ~\u002F.bashrc\n",[575,3273,3274,3285,3292,3305],{"__ignoreMap":424},[578,3275,3276,3278,3280,3282],{"class":580,"line":581},[578,3277,1304],{"class":584},[578,3279,2318],{"class":588},[578,3281,2339],{"class":588},[578,3283,3284],{"class":588}," cargo\n",[578,3286,3287,3289],{"class":580,"line":599},[578,3288,616],{"class":615},[578,3290,3291],{"class":588}," ~\u002Fbuzz\n",[578,3293,3294,3297,3299,3302],{"class":580,"line":605},[578,3295,3296],{"class":584},"cargo",[578,3298,2339],{"class":588},[578,3300,3301],{"class":588}," --path",[578,3303,3304],{"class":588}," crates\u002Fbuzz-cli\n",[578,3306,3307,3309,3312,3315,3318,3321,3324,3327,3330],{"class":580,"line":612},[578,3308,2265],{"class":615},[578,3310,3311],{"class":720}," '",[578,3313,3314],{"class":588},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[578,3316,3317],{"class":720},"'",[578,3319,3320],{"class":720}," >>",[578,3322,3323],{"class":588}," ~\u002F.bashrc",[578,3325,3326],{"class":720}," &&",[578,3328,3329],{"class":615}," source",[578,3331,3332],{"class":588}," ~\u002F.bashrc\n",[429,3334,3335,3336,3338,3339,3341],{},"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 ",[575,3337,3255],{},". Cặp khóa này là danh tính đại diện của ",[575,3340,3255],{}," trên Nostr relay.",[569,3343,3345],{"className":571,"code":3344,"language":573,"meta":424,"style":424},"docker run --rm --entrypoint \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin ghcr.io\u002Fblock\u002Fbuzz:main generate-key\n\n# Use the generated Public Key\ndocker compose exec relay buzz-admin add-member --pubkey generated_Public_key\n",[575,3346,3347,3369,3373,3378],{"__ignoreMap":424},[578,3348,3349,3351,3354,3357,3360,3363,3366],{"class":580,"line":581},[578,3350,788],{"class":584},[578,3352,3353],{"class":588}," run",[578,3355,3356],{"class":588}," --rm",[578,3358,3359],{"class":588}," --entrypoint",[578,3361,3362],{"class":588}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[578,3364,3365],{"class":588}," ghcr.io\u002Fblock\u002Fbuzz:main",[578,3367,3368],{"class":588}," generate-key\n",[578,3370,3371],{"class":580,"line":599},[578,3372,739],{"emptyLinePlaceholder":738},[578,3374,3375],{"class":580,"line":605},[578,3376,3377],{"class":608},"# Use the generated Public Key\n",[578,3379,3380,3382,3384,3386,3388,3390,3392,3394],{"class":580,"line":612},[578,3381,788],{"class":584},[578,3383,791],{"class":588},[578,3385,3113],{"class":588},[578,3387,3116],{"class":588},[578,3389,3119],{"class":588},[578,3391,3122],{"class":588},[578,3393,3125],{"class":588},[578,3395,3396],{"class":588}," generated_Public_key\n",[429,3398,3399],{},"Cấu hình giao diện dòng lệnh (CLI):",[569,3401,3403],{"className":571,"code":3402,"language":573,"meta":424,"style":424},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\necho 'export BUZZ_PRIVATE_KEY=\"nsec1...\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n\necho 'export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n",[575,3404,3405,3410,3442,3446],{"__ignoreMap":424},[578,3406,3407],{"class":580,"line":581},[578,3408,3409],{"class":608},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[578,3411,3412,3414,3416,3419,3421,3424,3427,3430,3433,3436,3439],{"class":580,"line":599},[578,3413,2265],{"class":615},[578,3415,3311],{"class":720},[578,3417,3418],{"class":588},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[578,3420,3317],{"class":720},[578,3422,3423],{"class":720},"  >>",[578,3425,3426],{"class":588}," \u002Fhome\u002F",[578,3428,3429],{"class":720},"\u003C",[578,3431,3432],{"class":588},"use",[578,3434,3435],{"class":595},"r",[578,3437,3438],{"class":720},">",[578,3440,3441],{"class":588},"\u002F.bashrc\n",[578,3443,3444],{"class":580,"line":605},[578,3445,739],{"emptyLinePlaceholder":738},[578,3447,3448,3450,3452,3455,3457,3459,3461,3463,3465,3467,3469],{"class":580,"line":612},[578,3449,2265],{"class":615},[578,3451,3311],{"class":720},[578,3453,3454],{"class":588},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[578,3456,3317],{"class":720},[578,3458,3423],{"class":720},[578,3460,3426],{"class":588},[578,3462,3429],{"class":720},[578,3464,3432],{"class":588},[578,3466,3435],{"class":595},[578,3468,3438],{"class":720},[578,3470,3441],{"class":588},[429,3472,3473,3474,3476],{},"Chạy lệnh sau để xác minh rằng ",[575,3475,3255],{}," đã được cấu hình chính xác:",[569,3478,3480],{"className":571,"code":3479,"language":573,"meta":424,"style":424},"buzz channels list\n",[575,3481,3482],{"__ignoreMap":424},[578,3483,3484,3487,3490],{"class":580,"line":581},[578,3485,3486],{"class":584},"buzz",[578,3488,3489],{"class":588}," channels",[578,3491,3492],{"class":588}," list\n",[429,3494,3495],{},[433,3496],{"alt":3497,"src":3498},"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",[543,3500,3502],{"id":3501},"tạo-một-dự-án-bằng-buzz-cli","Tạo một dự án bằng buzz-cli",[569,3504,3506],{"className":571,"code":3505,"language":573,"meta":424,"style":424},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[575,3507,3508,3513],{"__ignoreMap":424},[578,3509,3510],{"class":580,"line":581},[578,3511,3512],{"class":608},"# --channel refers to the UUID of the channel\n",[578,3514,3515,3517,3520,3523,3526,3529,3532,3534,3537,3539,3542,3544,3547],{"class":580,"line":599},[578,3516,3486],{"class":584},[578,3518,3519],{"class":588}," repos",[578,3521,3522],{"class":588}," create",[578,3524,3525],{"class":588}," --id",[578,3527,3528],{"class":588}," TestKOA",[578,3530,3531],{"class":588}," --name",[578,3533,3311],{"class":720},[578,3535,3536],{"class":588},"Display Name",[578,3538,3317],{"class":720},[578,3540,3541],{"class":588}," --channel",[578,3543,1095],{"class":720},[578,3545,3546],{"class":588},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[578,3548,1101],{"class":720},[429,3550,3551,3552,3554],{},"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 ",[575,3553,3255],{}," (vốn chưa hỗ trợ lệnh xóa), nó sẽ không thể xóa theo cách này.",[429,3556,3557],{},"Mở lại ứng dụng Buzz trên máy tính để kiểm tra xem dự án đã được tạo thành công hay chưa.",[429,3559,3560],{},[433,3561],{"alt":3562,"src":3563},"Chế độ xem dự án trên ứng dụng Buzz máy tính xác nhận việc tạo dự án thành công","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-project-view.webp",[429,3565,3566],{},"Khi dự án xuất hiện trong phần Projects, bạn có thể dễ dàng thêm nhiều dự án khác bằng cách nhấn nút \"+\" ở góc trên bên phải.",[429,3568,3569],{},[433,3570],{"alt":3571,"src":3572},"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",[543,3574,3576],{"id":3575},"đưa-vào-các-kho-lưu-trữ-git-hiện-có","Đưa vào các kho lưu trữ Git hiện có",[429,3578,3579,3580,3583,3584,3587,3588,3593],{},"Cài đặt ",[575,3581,3582],{},"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 ",[462,3585,3586],{},"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 ",[442,3589,3592],{"href":3590,"rel":3591},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[446],"Readme"," này:",[569,3595,3597],{"className":571,"code":3596,"language":573,"meta":424,"style":424},"cargo install --path crates\u002Fgit-credential-nostr\n",[575,3598,3599],{"__ignoreMap":424},[578,3600,3601,3603,3605,3607],{"class":580,"line":581},[578,3602,3296],{"class":584},[578,3604,2339],{"class":588},[578,3606,3301],{"class":588},[578,3608,3609],{"class":588}," crates\u002Fgit-credential-nostr\n",[429,3611,3612,3613,3615],{},"Siết chặt cơ chế bảo mật bằng cách cấu hình ",[575,3614,3582],{}," để cấp quyền truy cập qua Buzz relay:",[569,3617,3619],{"className":571,"code":3618,"language":573,"meta":424,"style":424},"# 1. Register the helper and enable per-path credentials.\ngit config --global credential.helper nostr\ngit config --global credential.useHttpPath true\n\n# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\nmkdir -p ~\u002F.nostr\necho \"nsec1...\" > ~\u002F.nostr\u002Fkey && chmod 600 ~\u002F.nostr\u002Fkey\ngit config --global nostr.keyfile ~\u002F.nostr\u002Fkey\n",[575,3620,3621,3626,3642,3656,3660,3665,3674,3701],{"__ignoreMap":424},[578,3622,3623],{"class":580,"line":581},[578,3624,3625],{"class":608},"# 1. Register the helper and enable per-path credentials.\n",[578,3627,3628,3630,3633,3636,3639],{"class":580,"line":599},[578,3629,585],{"class":584},[578,3631,3632],{"class":588}," config",[578,3634,3635],{"class":588}," --global",[578,3637,3638],{"class":588}," credential.helper",[578,3640,3641],{"class":588}," nostr\n",[578,3643,3644,3646,3648,3650,3653],{"class":580,"line":605},[578,3645,585],{"class":584},[578,3647,3632],{"class":588},[578,3649,3635],{"class":588},[578,3651,3652],{"class":588}," credential.useHttpPath",[578,3654,3655],{"class":720}," true\n",[578,3657,3658],{"class":580,"line":612},[578,3659,739],{"emptyLinePlaceholder":738},[578,3661,3662],{"class":580,"line":622},[578,3663,3664],{"class":608},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[578,3666,3667,3669,3671],{"class":580,"line":627},[578,3668,3037],{"class":584},[578,3670,3040],{"class":588},[578,3672,3673],{"class":588}," ~\u002F.nostr\n",[578,3675,3676,3678,3680,3683,3685,3687,3690,3692,3695,3698],{"class":580,"line":633},[578,3677,2265],{"class":615},[578,3679,1095],{"class":720},[578,3681,3682],{"class":588},"nsec1...",[578,3684,1513],{"class":720},[578,3686,2299],{"class":720},[578,3688,3689],{"class":588}," ~\u002F.nostr\u002Fkey",[578,3691,3326],{"class":720},[578,3693,3694],{"class":584}," chmod",[578,3696,3697],{"class":769}," 600",[578,3699,3700],{"class":588}," ~\u002F.nostr\u002Fkey\n",[578,3702,3703,3705,3707,3709,3712],{"class":580,"line":773},[578,3704,585],{"class":584},[578,3706,3632],{"class":588},[578,3708,3635],{"class":588},[578,3710,3711],{"class":588}," nostr.keyfile",[578,3713,3700],{"class":588},[429,3715,3716],{},"Tạo một kho lưu trữ mới trên Buzz relay:",[569,3718,3721],{"className":3719,"code":3720,"language":2486},[2484],"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",[575,3722,3720],{"__ignoreMap":424},[429,3724,3725,3726,3729,3730,3733],{},"Trong lần ",[575,3727,3728],{},"git push"," đầu tiên, bạn sẽ gặp lỗi ",[575,3731,3732],{},"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:",[569,3735,3737],{"className":571,"code":3736,"language":573,"meta":424,"style":424},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[575,3738,3739,3767,3771,3776],{"__ignoreMap":424},[578,3740,3741,3743,3745,3748,3750,3753,3755,3758,3761,3764],{"class":580,"line":581},[578,3742,3486],{"class":584},[578,3744,3519],{"class":588},[578,3746,3747],{"class":588}," bind",[578,3749,3525],{"class":588},[578,3751,3752],{"class":588}," koa-email-routing",[578,3754,3541],{"class":588},[578,3756,3757],{"class":720}," \u003C",[578,3759,3760],{"class":588},"CHANNEL_UUI",[578,3762,3763],{"class":595},"D",[578,3765,3766],{"class":720},">\n",[578,3768,3769],{"class":580,"line":599},[578,3770,739],{"emptyLinePlaceholder":738},[578,3772,3773],{"class":580,"line":605},[578,3774,3775],{"class":608},"# push the code again\n",[578,3777,3778,3780],{"class":580,"line":612},[578,3779,585],{"class":584},[578,3781,3782],{"class":588}," push\n",[429,3784,3785,3786,3789],{},"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 ",[462,3787,3788],{},"git 2.46 trở lên"," — việc khởi chạy trực tiếp ứng dụng đôi khi nhận diện sai phiên bản Git cũ hơn hệ thống:",[429,3791,3792],{},[433,3793],{"alt":3794,"src":3795},"Ứng dụng khách Buzz hiển thị lỗi tải Git do phiên bản Git cục bộ cũ dưới 2.46","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-git-version-error.webp",[429,3797,3798,3799,3802,3803,954],{},"Hãy xuất biến PATH bằng lệnh ",[575,3800,3801],{},"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 ",[442,3804,3807],{"href":3805,"rel":3806},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[446],"lỗi này",[569,3809,3811],{"className":571,"code":3810,"language":573,"meta":424,"style":424},"open -a Buzz\n",[575,3812,3813],{"__ignoreMap":424},[578,3814,3815,3818,3821],{"class":580,"line":581},[578,3816,3817],{"class":584},"open",[578,3819,3820],{"class":588}," -a",[578,3822,3823],{"class":588}," Buzz\n",[429,3825,3826],{},"Kiểm tra lại mục Projects trên ứng dụng Buzz, thông tin chi tiết của kho lưu trữ hiện đã được tải lên đầy đủ.",[429,3828,3829],{},[433,3830],{"alt":3831,"src":3832},"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",[493,3834,3836],{"id":3835},"đồng-bộ-hóa-các-tác-nhân-ai-với-ứng-dụng-di-động-buzz-bằng-mã-qr","Đồng bộ hóa các tác nhân AI với ứng dụng di động Buzz bằng mã QR",[429,3838,3839,3840,3843],{},"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ụ ",[575,3841,3842],{},"buzz-pair-relay"," mặc định sẽ không khởi chạy trên VPS.",[569,3845,3847],{"className":571,"code":3846,"language":573,"meta":424,"style":424},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[575,3848,3849,3855],{"__ignoreMap":424},[578,3850,3851,3853],{"class":580,"line":581},[578,3852,616],{"class":615},[578,3854,3291],{"class":588},[578,3856,3857,3859,3861,3863],{"class":580,"line":599},[578,3858,3296],{"class":584},[578,3860,2339],{"class":588},[578,3862,3301],{"class":588},[578,3864,3865],{"class":588}," crates\u002Fbuzz-pair-relay\n",[429,3867,3868,3869,3872,3873,766],{},"Thêm khối cấu hình sau vào tệp ",[575,3870,3871],{},"compose.yml"," để kích hoạt dịch vụ ",[575,3874,3842],{},[569,3876,3878],{"className":1051,"code":3877,"language":1053,"meta":424,"style":424},"  pair:\n    image: ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n    entrypoint: [\"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay\"]\n    environment:\n      BUZZ_PAIR_RELAY_BIND_ADDR: 0.0.0.0:5000\n    ports:\n      - \"${BUZZ_PAIR_RELAY_PORT:-5000}:5000\"\n    restart: unless-stopped\n    networks:\n      [buzz-net]\n",[575,3879,3880,3887,3896,3916,3922,3932,3938,3949,3957,3963],{"__ignoreMap":424},[578,3881,3882,3885],{"class":580,"line":581},[578,3883,3884],{"class":1060},"  pair",[578,3886,842],{"class":720},[578,3888,3889,3891,3893],{"class":580,"line":599},[578,3890,1075],{"class":1060},[578,3892,766],{"class":720},[578,3894,3895],{"class":588}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[578,3897,3898,3901,3903,3906,3908,3911,3913],{"class":580,"line":605},[578,3899,3900],{"class":1060},"    entrypoint",[578,3902,766],{"class":720},[578,3904,3905],{"class":720}," [",[578,3907,1513],{"class":720},[578,3909,3910],{"class":588},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[578,3912,1513],{"class":720},[578,3914,3915],{"class":720},"]\n",[578,3917,3918,3920],{"class":580,"line":612},[578,3919,1106],{"class":1060},[578,3921,842],{"class":720},[578,3923,3924,3927,3929],{"class":580,"line":622},[578,3925,3926],{"class":1060},"      BUZZ_PAIR_RELAY_BIND_ADDR",[578,3928,766],{"class":720},[578,3930,3931],{"class":588}," 0.0.0.0:5000\n",[578,3933,3934,3936],{"class":580,"line":627},[578,3935,1085],{"class":1060},[578,3937,842],{"class":720},[578,3939,3940,3942,3944,3947],{"class":580,"line":633},[578,3941,1092],{"class":720},[578,3943,1095],{"class":720},[578,3945,3946],{"class":588},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[578,3948,1101],{"class":720},[578,3950,3951,3953,3955],{"class":580,"line":773},[578,3952,1174],{"class":1060},[578,3954,766],{"class":720},[578,3956,1179],{"class":588},[578,3958,3959,3961],{"class":580,"line":1123},[578,3960,2886],{"class":1060},[578,3962,842],{"class":720},[578,3964,3965,3968,3971],{"class":580,"line":1131},[578,3966,3967],{"class":720},"      [",[578,3969,3970],{"class":588},"buzz-net",[578,3972,3915],{"class":720},[429,3974,3975,3976,464,3979,3982,3983,766],{},"Thêm ",[575,3977,3978],{},"BUZZ_PAIRING_RELAY_URL",[575,3980,3981],{},"BUZZ_PAIR_RELAY_PORT"," vào tệp cấu hình ",[575,3984,649],{},[569,3986,3989],{"className":3987,"code":3988,"language":2486},[2484],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[575,3990,3988],{"__ignoreMap":424},[429,3992,3993,3994,3997],{},"Truy cập mục '",[462,3995,3996],{},"Mobile","' trong phần cài đặt của Buzz desktop:",[429,3999,4000],{},[433,4001],{"alt":4002,"src":4003},"Hộp thoại cài đặt trong ứng dụng Buzz hiển thị tab cấu hình thiết bị di động","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-mobile-tab.webp",[429,4005,4006],{},"Nhấp vào \"Start pairing\" — một mã QR sẽ hiển thị; hãy dùng ứng dụng Buzz trên điện thoại để quét mã này. Quá trình ghép đôi hoàn tất sau khi bạn nhấn \"Code Match\".",[429,4008,4009],{},[433,4010],{"alt":4011,"src":4012},"Tạo mã QR ghép đôi an toàn trên ứng dụng máy tính để đồng bộ hóa di động Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-pairing-qr-code.webp",[429,4014,4015],{},"Các tác nhân AI trên ứng dụng di động Buzz chỉ có thể sử dụng nếu chúng đang chạy đồng thời trên ứng dụng Buzz máy tính. Thiết bị máy tính của bạn phải luôn hoạt động để các tác nhân AI có thể xử lý yêu cầu.",[429,4017,4018],{},[433,4019],{"alt":4020,"src":4021},"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",[493,4023,4025],{"id":4024},"lời-kết","Lời kết",[429,4027,4028],{},"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.",[493,4030,4032],{"id":4031},"tài-liệu-tham-khảo","Tài liệu tham khảo",[503,4034,4035,4042,4049,4056],{},[506,4036,4037],{},[442,4038,4041],{"href":4039,"rel":4040},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[446],"Buzz releases",[506,4043,4044],{},[442,4045,4048],{"href":4046,"rel":4047},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[446],"Introducing Buzz",[506,4050,4051],{},[442,4052,4055],{"href":4053,"rel":4054},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[446],"What is buzz",[506,4057,4058],{},[442,4059,4062],{"href":4060,"rel":4061},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[446],"How to self-host Buzz (Miget)",[1886,4064,4065],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":424,"searchDepth":599,"depth":605,"links":4067},[4068,4069,4070,4084,4093,4094,4095],{"id":1960,"depth":599,"text":1961},{"id":2005,"depth":599,"text":2006},{"id":2053,"depth":599,"text":2054,"children":4071},[4072,4073,4077,4078,4079,4083],{"id":2057,"depth":605,"text":2058},{"id":2087,"depth":605,"text":2088,"children":4074},[4075,4076],{"id":2091,"depth":612,"text":2092},{"id":2192,"depth":612,"text":2193},{"id":2209,"depth":605,"text":2210},{"id":2426,"depth":605,"text":2427},{"id":2574,"depth":605,"text":2575,"children":4080},[4081,4082],{"id":2578,"depth":612,"text":2579},{"id":2963,"depth":612,"text":2964},{"id":3026,"depth":605,"text":3027},{"id":3069,"depth":599,"text":3070,"children":4085},[4086,4087,4088],{"id":3153,"depth":605,"text":3154},{"id":3198,"depth":605,"text":3199},{"id":3235,"depth":605,"text":3236,"children":4089},[4090,4091,4092],{"id":3259,"depth":612,"text":3260},{"id":3501,"depth":612,"text":3502},{"id":3575,"depth":612,"text":3576},{"id":3835,"depth":599,"text":3836},{"id":4024,"depth":599,"text":4025},{"id":4031,"depth":599,"text":4032},[4097,4098,3486],"collaboration","ai-agents","2026-09-08","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.",{"schemaOrg":4104,"robots":1924,"sitemap":4125},[4105,4107],{"@type":4106,"headline":701,"description":4100,"image":4101},"TechArticle",{"@type":1923,"name":701,"description":4100,"image":4101,"step":4108},[4109,4113,4116,4119,4122],{"@type":4110,"name":4111,"text":4112},"HowToStep","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":4110,"name":4114,"text":4115},"Giai đoạn 2: Cài đặt Docker","Thiết lập và cài đặt Docker Engine trên VPS Ubuntu.",{"@type":4110,"name":4117,"text":4118},"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":4110,"name":4120,"text":4121},"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":4110,"name":4123,"text":4124},"Giai đoạn 5: Sao lưu tự động","Định cấu hình cron job để tự động sao lưu PostgreSQL.",{"lastmod":4126},"2026-09-03",{"title":4128,"description":4100,"ogTitle":701,"ogDescription":4100,"twitterTitle":701,"twitterDescription":4100},"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",[4131,4132,1956,4133,4134],"Nostr","Docker","Caddy","Cloudflare","4n6TAwckx54GT3WMA-sqwXdGcmS8qZxFUgRYb8qCjWk",{"id":4137,"title":2078,"author":424,"body":4138,"category":5011,"date":5013,"description":5014,"extension":1915,"image":2083,"imageAlt":5015,"isPublished":738,"meta":5016,"minRead":1131,"navigation":738,"path":287,"seo":5050,"stem":5052,"tags":5053,"updatedAt":5049,"__hash__":5056},"article\u002Fvi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md",{"type":426,"value":4139,"toc":4993},[4140,4154,4164,4168,4171,4183,4187,4195,4199,4203,4253,4257,4388,4392,4425,4429,4432,4496,4499,4535,4538,4565,4569,4579,4583,4622,4710,4714,4719,4736,4745,4815,4820,4865,4869,4914,4929,4933,4976,4980,4990],[429,4141,4142,4143,4146,4147,4150,4151,4153],{},"Một thách thức phổ biến nảy sinh khi bạn muốn truy cập ",[462,4144,4145],{},"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 ",[462,4148,4149],{},"Cloudflare WARP"," cùng với ",[462,4152,476],{}," cho phép bạn hiển thị Hermes Agent trên toàn cầu mà không cần mở bất kỳ cổng đến (inbound port) nào trên tường lửa của mình.",[429,4155,4156,4157,4160,4161,4163],{},"Nếu bạn đã làm theo hướng dẫn trước đây của chúng tôi, '",[442,4158,4159],{"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 ",[462,4162,4149],{}," để kết nối Hermes Agent vào mạng riêng (private network) qua internet.",[493,4165,4167],{"id":4166},"hiểu-về-kiến-trúc","Hiểu về Kiến trúc",[429,4169,4170],{},"Các thành phần đang hoạt động:",[2094,4172,4173,4178],{},[506,4174,4175,4177],{},[462,4176,476],{},": 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.",[506,4179,4180,4182],{},[462,4181,4149],{},": Ứ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.",[538,4184,4186],{"id":4185},"điều-kiện-tiên-quyết","Điều kiện tiên quyết",[503,4188,4189,4192],{},[506,4190,4191],{},"Một Hermes Agent đang chạy trên VPS của bạn.",[506,4193,4194],{},"Một tài khoản Cloudflare miễn phí.",[493,4196,4198],{"id":4197},"hướng-dẫn-từng-bước","Hướng dẫn Từng bước",[538,4200,4202],{"id":4201},"bước-1-thiết-lập-cloudflare-zero-trust","Bước 1: Thiết lập Cloudflare Zero Trust",[2094,4204,4205,4214,4221,4232,4239,4246],{},[506,4206,4207,4208,4213],{},"Đăng nhập vào ",[442,4209,4212],{"href":4210,"rel":4211},"https:\u002F\u002Fdash.cloudflare.com\u002F",[446],"Bảng điều khiển Cloudflare"," của bạn.",[506,4215,4216,4217],{},"Nhấp vào 'Zero Trust' từ menu bên trái.\n",[433,4218],{"alt":4219,"src":4220},"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",[506,4222,4223,4224,4227,4228],{},"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ụ: ",[575,4225,4226],{},"ai-team",").\n",[433,4229],{"alt":4230,"src":4231},"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",[506,4233,4234,4235],{},"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,4236],{"alt":4237,"src":4238},"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",[506,4240,4241,4242],{},"Nhấp vào 'Create new policy'.\n",[433,4243],{"alt":4244,"src":4245},"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",[506,4247,4248,4249],{},"Chọn 'Emails' và nhập email của bạn dưới mục 'Policy rules'.\n",[433,4250],{"alt":4251,"src":4252},"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",[538,4254,4256],{"id":4255},"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",[2094,4258,4259,4269,4275,4282,4285,4300,4303,4381],{},[506,4260,4261,4262,464,4265,4268],{},"Chạy ",[575,4263,4264],{},"sudo apt update",[575,4266,4267],{},"sudo apt install cloudflare-warp"," trong terminal trên VPS của bạn.",[506,4270,4261,4271,4274],{},[575,4272,4273],{},"warp-cli registration new \u003CTEAM-NAME>"," trong terminal trên VPS của bạn, một URL sẽ được in ra.",[506,4276,4277,4278,4281],{},"Sao chép URL vừa được in, nó sẽ có dạng ",[575,4279,4280],{},"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.",[506,4283,4284],{},"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.",[506,4286,4287,4288,4291,4292,4295,4296,4299],{},"Trên trang '",[462,4289,4290],{},"Success","' (Thành công) trong trình duyệt, hãy nhấp chuột phải và chọn '",[462,4293,4294],{},"Inspect","' (Kiểm tra) ở nút màu xanh '",[462,4297,4298],{},"Open Cloudflare WARP","'.",[506,4301,4302],{},"Sao chép chuỗi mã token dài nằm trong liên kết của nút.",[506,4304,4261,4305,4308,4309,4312,4313],{},[575,4306,4307],{},"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.",[4310,4311],"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:",[569,4314,4316],{"className":571,"code":4315,"language":573,"meta":424,"style":424},"sudo systemctl restart warp-svc.service\n\n# Check status\nsudo systemctl status warp-svc.service\n\n# Run the warp-cli registration token again\nwarp-cli --accept-tos registration token   \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\"\n",[575,4317,4318,4330,4334,4339,4350,4354,4359],{"__ignoreMap":424},[578,4319,4320,4322,4324,4327],{"class":580,"line":581},[578,4321,1304],{"class":584},[578,4323,1742],{"class":588},[578,4325,4326],{"class":588}," restart",[578,4328,4329],{"class":588}," warp-svc.service\n",[578,4331,4332],{"class":580,"line":599},[578,4333,739],{"emptyLinePlaceholder":738},[578,4335,4336],{"class":580,"line":605},[578,4337,4338],{"class":608},"# Check status\n",[578,4340,4341,4343,4345,4348],{"class":580,"line":612},[578,4342,1304],{"class":584},[578,4344,1742],{"class":588},[578,4346,4347],{"class":588}," status",[578,4349,4329],{"class":588},[578,4351,4352],{"class":580,"line":622},[578,4353,739],{"emptyLinePlaceholder":738},[578,4355,4356],{"class":580,"line":627},[578,4357,4358],{"class":608},"# Run the warp-cli registration token again\n",[578,4360,4361,4364,4367,4370,4373,4376,4379],{"class":580,"line":633},[578,4362,4363],{"class":584},"warp-cli",[578,4365,4366],{"class":588}," --accept-tos",[578,4368,4369],{"class":588}," registration",[578,4371,4372],{"class":588}," token",[578,4374,4375],{"class":720},"   \"",[578,4377,4378],{"class":588},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[578,4380,1101],{"class":720},[506,4382,4383,4384],{},"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,4385],{"alt":4386,"src":4387},"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",[538,4389,4391],{"id":4390},"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",[2094,4393,4394,4401,4408,4415],{},[506,4395,4396,4397],{},"Nhấp vào cấu hình VPS của bạn trên bảng điều khiển Devices.\n",[433,4398],{"alt":4399,"src":4400},"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",[506,4402,4403,4404],{},"Cuộn xuống phần 'Split Tunnels'.\n",[433,4405],{"alt":4406,"src":4407},"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",[506,4409,4410,4411],{},"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,4412],{"alt":4413,"src":4414},"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",[506,4416,4417,4418,464,4421,4424],{},"Hiển thị ",[575,4419,4420],{},"address",[575,4422,4423],{},"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.",[538,4426,4428],{"id":4427},"bước-4-cấu-hình-tường-lửa-trên-vps","Bước 4: Cấu hình Tường lửa trên VPS",[429,4430,4431],{},"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.",[569,4433,4435],{"className":571,"code":4434,"language":573,"meta":424,"style":424},"sudo ufw enable \nsudo ufw default allow outgoing \nsudo ufw default deny incoming\nsudo ufw allow in from 100.96.0.0\u002F12\n",[575,4436,4437,4448,4465,4479],{"__ignoreMap":424},[578,4438,4439,4441,4444,4446],{"class":580,"line":581},[578,4440,1304],{"class":584},[578,4442,4443],{"class":588}," ufw",[578,4445,1755],{"class":588},[578,4447,1328],{"class":595},[578,4449,4450,4452,4454,4457,4460,4463],{"class":580,"line":599},[578,4451,1304],{"class":584},[578,4453,4443],{"class":588},[578,4455,4456],{"class":588}," default",[578,4458,4459],{"class":588}," allow",[578,4461,4462],{"class":588}," outgoing",[578,4464,1328],{"class":595},[578,4466,4467,4469,4471,4473,4476],{"class":580,"line":605},[578,4468,1304],{"class":584},[578,4470,4443],{"class":588},[578,4472,4456],{"class":588},[578,4474,4475],{"class":588}," deny",[578,4477,4478],{"class":588}," incoming\n",[578,4480,4481,4483,4485,4487,4490,4493],{"class":580,"line":612},[578,4482,1304],{"class":584},[578,4484,4443],{"class":588},[578,4486,4459],{"class":588},[578,4488,4489],{"class":588}," in",[578,4491,4492],{"class":588}," from",[578,4494,4495],{"class":588}," 100.96.0.0\u002F12\n",[429,4497,4498],{},"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ộ:",[569,4500,4502],{"className":571,"code":4501,"language":573,"meta":424,"style":424},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[575,4503,4504,4520],{"__ignoreMap":424},[578,4505,4506,4508,4510,4512,4514,4517],{"class":580,"line":581},[578,4507,1304],{"class":584},[578,4509,4443],{"class":588},[578,4511,4459],{"class":588},[578,4513,4489],{"class":588},[578,4515,4516],{"class":588}," on",[578,4518,4519],{"class":588}," lo\n",[578,4521,4522,4524,4526,4528,4531,4533],{"class":580,"line":599},[578,4523,1304],{"class":584},[578,4525,4443],{"class":588},[578,4527,4459],{"class":588},[578,4529,4530],{"class":588}," out",[578,4532,4516],{"class":588},[578,4534,4519],{"class":588},[429,4536,4537],{},"Tải lại tường lửa và xác minh trạng thái:",[569,4539,4541],{"className":571,"code":4540,"language":573,"meta":424,"style":424},"sudo ufw reload \nsudo ufw status verbose\n",[575,4542,4543,4554],{"__ignoreMap":424},[578,4544,4545,4547,4549,4552],{"class":580,"line":581},[578,4546,1304],{"class":584},[578,4548,4443],{"class":588},[578,4550,4551],{"class":588}," reload",[578,4553,1328],{"class":595},[578,4555,4556,4558,4560,4562],{"class":580,"line":599},[578,4557,1304],{"class":584},[578,4559,4443],{"class":588},[578,4561,4347],{"class":588},[578,4563,4564],{"class":588}," verbose\n",[538,4566,4568],{"id":4567},"bước-5-hiển-thị-hermes-agent-vào-mạng-riêng","Bước 5: Hiển thị Hermes Agent vào Mạng Riêng",[429,4570,4571,4572,4575,4576,693],{},"Chúng ta sẽ hiển thị ",[462,4573,4574],{},"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à ",[462,4577,4578],{},"Nous Research",[543,4580,4582],{"id":4581},"thiết-lập-nhà-cung-cấp-xác-thực","Thiết lập Nhà cung cấp Xác thực",[2094,4584,4585,4594,4601,4608,4615],{},[506,4586,4587,4588,4593],{},"Đi tới ",[442,4589,4592],{"href":4590,"rel":4591},"https:\u002F\u002Fportal.nousresearch.com",[446],"portal.nousresearch.com"," để đăng ký một tài khoản.",[506,4595,4596,4597],{},"Chọn 'Local Dashboards'.\n",[433,4598],{"alt":4599,"src":4600},"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",[506,4602,4603,4604],{},"Nhấp vào 'Register Dashboard'.\n",[433,4605],{"alt":4606,"src":4607},"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",[506,4609,4610,4611],{},"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,4612],{"alt":4613,"src":4614},"Đă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",[506,4616,4617,4618,4621],{},"Sao chép 'OAuth client ID' và dán nó vào tệp ",[575,4619,4620],{},"config.yaml"," của bạn:",[569,4623,4627],{"className":4624,"code":4625,"language":4626,"meta":424,"style":424},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dashboard:\n  theme: default\n  show_token_analytics: false\n  oauth:\n    client_id: agent:cmq02x7ha0002jk0ba3kfnb\n    portal_url: https:\u002F\u002Fportal.nousresearch.com\n  basic_auth:\n    username: ''\n    password_hash: ''\n","yaml",[575,4628,4629,4636,4646,4657,4664,4674,4684,4691,4701],{"__ignoreMap":424},[578,4630,4631,4634],{"class":580,"line":581},[578,4632,4633],{"class":1060},"dashboard",[578,4635,842],{"class":720},[578,4637,4638,4641,4643],{"class":580,"line":599},[578,4639,4640],{"class":1060},"  theme",[578,4642,766],{"class":720},[578,4644,4645],{"class":588}," default\n",[578,4647,4648,4651,4653],{"class":580,"line":605},[578,4649,4650],{"class":1060},"  show_token_analytics",[578,4652,766],{"class":720},[578,4654,4656],{"class":4655},"sfNiH"," false\n",[578,4658,4659,4662],{"class":580,"line":612},[578,4660,4661],{"class":1060},"  oauth",[578,4663,842],{"class":720},[578,4665,4666,4669,4671],{"class":580,"line":622},[578,4667,4668],{"class":1060},"    client_id",[578,4670,766],{"class":720},[578,4672,4673],{"class":588}," agent:cmq02x7ha0002jk0ba3kfnb\n",[578,4675,4676,4679,4681],{"class":580,"line":627},[578,4677,4678],{"class":1060},"    portal_url",[578,4680,766],{"class":720},[578,4682,4683],{"class":588}," https:\u002F\u002Fportal.nousresearch.com\n",[578,4685,4686,4689],{"class":580,"line":633},[578,4687,4688],{"class":1060},"  basic_auth",[578,4690,842],{"class":720},[578,4692,4693,4696,4698],{"class":580,"line":773},[578,4694,4695],{"class":1060},"    username",[578,4697,766],{"class":720},[578,4699,4700],{"class":720}," ''\n",[578,4702,4703,4706,4708],{"class":580,"line":1123},[578,4704,4705],{"class":1060},"    password_hash",[578,4707,766],{"class":720},[578,4709,4700],{"class":720},[543,4711,4713],{"id":4712},"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",[2094,4715,4716],{},[506,4717,4718],{},"Tạo một tệp dịch vụ:",[569,4720,4724],{"className":4721,"code":4722,"language":4723,"meta":424,"style":424},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n","shell",[575,4725,4726],{"__ignoreMap":424},[578,4727,4728,4730,4733],{"class":580,"line":581},[578,4729,1304],{"class":584},[578,4731,4732],{"class":588}," nano",[578,4734,4735],{"class":588}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[2094,4737,4738],{"start":599},[506,4739,4740,4741,4744],{},"Dán cấu hình sau, đảm bảo ",[575,4742,4743],{},"--host 0.0.0.0"," là một phần của lệnh:",[569,4746,4750],{"className":4747,"code":4748,"language":4749,"meta":424,"style":424},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=Hermes Dashboard\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\nRestart=always\nRestartSec=10\nEnvironment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n\n[Install]\nWantedBy=multi-user.target\n","ini",[575,4751,4752,4756,4761,4766,4770,4774,4779,4784,4789,4793,4798,4803,4807,4811],{"__ignoreMap":424},[578,4753,4754],{"class":580,"line":581},[578,4755,1650],{},[578,4757,4758],{"class":580,"line":599},[578,4759,4760],{},"Description=Hermes Dashboard\n",[578,4762,4763],{"class":580,"line":605},[578,4764,4765],{},"After=network.target\n",[578,4767,4768],{"class":580,"line":612},[578,4769,739],{"emptyLinePlaceholder":738},[578,4771,4772],{"class":580,"line":622},[578,4773,1674],{},[578,4775,4776],{"class":580,"line":627},[578,4777,4778],{},"User=hermes\n",[578,4780,4781],{"class":580,"line":633},[578,4782,4783],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[578,4785,4786],{"class":580,"line":773},[578,4787,4788],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[578,4790,4791],{"class":580,"line":1123},[578,4792,1709],{},[578,4794,4795],{"class":580,"line":1131},[578,4796,4797],{},"RestartSec=10\n",[578,4799,4800],{"class":580,"line":1139},[578,4801,4802],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[578,4804,4805],{"class":580,"line":1147},[578,4806,739],{"emptyLinePlaceholder":738},[578,4808,4809],{"class":580,"line":1155},[578,4810,1723],{},[578,4812,4813],{"class":580,"line":1163},[578,4814,1728],{},[2094,4816,4817],{"start":605},[506,4818,4819],{},"Bật và khởi động dịch vụ:",[569,4821,4823],{"className":4721,"code":4822,"language":4723,"meta":424,"style":424},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[575,4824,4825,4833,4844,4855],{"__ignoreMap":424},[578,4826,4827,4829,4831],{"class":580,"line":581},[578,4828,1304],{"class":584},[578,4830,1742],{"class":588},[578,4832,1745],{"class":588},[578,4834,4835,4837,4839,4841],{"class":580,"line":599},[578,4836,1304],{"class":584},[578,4838,1742],{"class":588},[578,4840,1755],{"class":588},[578,4842,4843],{"class":588}," hermes-dashboard\n",[578,4845,4846,4848,4850,4853],{"class":580,"line":605},[578,4847,1304],{"class":584},[578,4849,1742],{"class":588},[578,4851,4852],{"class":588}," start",[578,4854,4843],{"class":588},[578,4856,4857,4859,4861,4863],{"class":580,"line":612},[578,4858,1304],{"class":584},[578,4860,1742],{"class":588},[578,4862,4347],{"class":588},[578,4864,4843],{"class":588},[538,4866,4868],{"id":4867},"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",[2094,4870,4871,4879,4882,4889,4896,4903],{},[506,4872,4873,4874,693],{},"Tải xuống máy khách Cloudflare WARP từ ",[442,4875,4878],{"href":4876,"rel":4877},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[446],"cổng thông tin của Cloudflare",[506,4880,4881],{},"Mở và khởi chạy máy khách Cloudflare WARP sau khi cài đặt.",[506,4883,4884,4885],{},"Đăng nhập khi được nhắc.\n",[433,4886],{"alt":4887,"src":4888},"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",[506,4890,4891,4892],{},"Một trang 'Success' (Thành công) sẽ được hiển thị sau khi đăng nhập thành công.\n",[433,4893],{"alt":4894,"src":4895},"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",[506,4897,4898,4899],{},"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,4900],{"alt":4901,"src":4902},"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",[506,4904,4905,4906,4909,4910],{},"Điều hướng đến trình duyệt web của bạn và nhập IP riêng (ví dụ: ",[575,4907,4908],{},"100.96.0.3","). Bảng điều khiển Hermes Web sẽ tải thành công.\n",[433,4911],{"alt":4912,"src":4913},"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",[4915,4916,4917],"blockquote",{},[429,4918,4919,4922,4923,4928],{},[462,4920,4921],{},"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ề ",[462,4924,4925],{},[442,4926,4927],{"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.",[538,4930,4932],{"id":4931},"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",[2094,4934,4935,4941,4949,4957,4965],{},[506,4936,3579,4937,4940],{},[462,4938,4939],{},"Cloudflare One"," từ App Store.",[506,4942,4943,4944],{},"Mở ứng dụng Cloudflare One và nhập tên nhóm của bạn khi được nhắc.\n",[433,4945],{"alt":4946,"src":4947,"width":4948},"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,[506,4950,4951,4952],{},"Đă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,4953],{"alt":4954,"src":4955,"width":4956},"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,[506,4958,4959,4960],{},"Sau khi được kết nối, nó sẽ trông giống như sau:\n",[433,4961],{"alt":4962,"src":4963,"width":4964},"Ứ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,[506,4966,4967,4968,4970,4971],{},"Điều hướng đến trình duyệt web của bạn và nhập IP riêng ",[575,4969,4908],{}," để truy cập Bảng điều khiển Hermes Web trên thiết bị di động của bạn.\n",[433,4972],{"alt":4973,"src":4974,"width":4975},"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,[493,4977,4979],{"id":4978},"phần-kết-luận","Phần Kết luận",[429,4981,4982,4983,4985,4986,4989],{},"Với ",[462,4984,476],{}," xử lý các chính sách nhận dạng và máy khách ",[462,4987,4988],{},"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.",[1886,4991,4992],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":424,"searchDepth":599,"depth":605,"links":4994},[4995,4998,5010],{"id":4166,"depth":599,"text":4167,"children":4996},[4997],{"id":4185,"depth":605,"text":4186},{"id":4197,"depth":599,"text":4198,"children":4999},[5000,5001,5002,5003,5004,5008,5009],{"id":4201,"depth":605,"text":4202},{"id":4255,"depth":605,"text":4256},{"id":4390,"depth":605,"text":4391},{"id":4427,"depth":605,"text":4428},{"id":4567,"depth":605,"text":4568,"children":5005},[5006,5007],{"id":4581,"depth":612,"text":4582},{"id":4712,"depth":612,"text":4713},{"id":4867,"depth":605,"text":4868},{"id":4931,"depth":605,"text":4932},{"id":4978,"depth":599,"text":4979},[4098,5012],"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.","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":5017,"robots":1924,"sitemap":5048},[5018],{"@type":1923,"headline":2078,"description":5014,"name":2078,"image":2083,"step":5019},[5020,5024,5028,5032,5036,5040,5044],{"@type":4110,"name":5021,"text":5022,"url":5023,"image":4220},"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":4110,"name":5025,"text":5026,"url":5027,"image":4387},"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":4110,"name":5029,"text":5030,"url":5031,"image":4400},"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":4110,"name":5033,"text":5034,"url":5035},"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":4110,"name":5037,"text":5038,"url":5039},"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":4110,"name":5041,"text":5042,"url":5043,"image":4888},"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":4110,"name":5045,"text":5046,"url":5047,"image":4947},"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":5049},"2026-09-28",{"title":5051,"description":5014,"ogTitle":2078,"ogDescription":5014,"twitterTitle":2078,"twitterDescription":5014},"Truy cập an toàn Hermes Agent bằng Cloudflare Zero Trust","vi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[4149,1934,4145,5054,5055],"Mạng riêng","Hướng dẫn","cj9xDUr4OU-vTUS6m18q2Qy2nRQKSVmUduRnaiOxXEc",[5058,5059,5861],{"id":4137,"title":2078,"author":424,"body":4138,"category":5011,"date":5013,"description":5014,"extension":1915,"image":2083,"imageAlt":5015,"isPublished":738,"meta":5016,"minRead":1131,"navigation":738,"path":363,"seo":5050,"stem":5052,"tags":5053,"updatedAt":5049,"__hash__":5056},{"id":5060,"title":5061,"author":1935,"body":5062,"category":5844,"date":5846,"description":5847,"extension":1915,"image":5848,"imageAlt":5849,"isPublished":738,"meta":5850,"minRead":1139,"navigation":738,"path":415,"seo":5855,"stem":5856,"tags":5857,"updatedAt":1935,"__hash__":5860},"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":426,"value":5063,"toc":5826},[5064,5068,5071,5074,5078,5081,5095,5099,5106,5120,5123,5126,5170,5174,5256,5260,5286,5394,5405,5409,5414,5455,5479,5483,5488,5559,5564,5568,5602,5608,5647,5651,5683,5687,5695,5699,5729,5733,5773,5777,5780,5783,5786,5789,5823],[493,5065,5067],{"id":5066},"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",[429,5069,5070],{},"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.",[429,5072,5073],{},"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.",[493,5075,5077],{"id":5076},"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",[429,5079,5080],{},"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.",[429,5082,5083,5084,5089,5090,5094],{},"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ở ",[442,5085,5088],{"href":5086,"rel":5087},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[446],"Second Brain",", một bản fork từ ",[442,5091,5092],{"href":5092,"rel":5093},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare",[446],", 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.",[493,5096,5098],{"id":5097},"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",[429,5100,5101,5102,5105],{},"Hệ thống bộ nhớ Second Brain được triển khai trên nền tảng ",[462,5103,5104],{},"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.",[429,5107,5108,5109,5112,5113,5116,5117,5119],{},"Mô hình embedding từ ",[462,5110,5111],{},"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 ",[462,5114,5115],{},"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. ",[462,5118,5115],{}," 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.",[429,5121,5122],{},"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.",[429,5124,5125],{},"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:",[503,5127,5128,5134,5140,5146,5152,5158,5164],{},[506,5129,5130,5133],{},[575,5131,5132],{},"remember",": Lưu trữ ý tưởng, quyết định, sở thích và ngữ cảnh dự án nói chung.",[506,5135,5136,5139],{},[575,5137,5138],{},"append",": Thêm thông tin cập nhật mới vào một ký ức đã có.",[506,5141,5142,5145],{},[575,5143,5144],{},"update",": Thay thế hoàn toàn một ký ức hiện tại.",[506,5147,5148,5151],{},[575,5149,5150],{},"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.",[506,5153,5154,5157],{},[575,5155,5156],{},"list_recent",": Liệt kê các ký ức vừa được lưu gần đây.",[506,5159,5160,5163],{},[575,5161,5162],{},"forget",": Xóa vĩnh viễn một bản ghi ký ức.",[506,5165,5166,5169],{},[575,5167,5168],{},"link\u002Fconnections",": Kết nối các ký ức có liên quan với nhau (tính năng đồ thị v2).",[538,5171,5173],{"id":5172},"cài-đặt-second-brain-trên-cloudflare","Cài đặt Second Brain trên Cloudflare",[2094,5175,5176,5194,5201,5208,5215,5222,5233,5239,5242,5249],{},[506,5177,5178,5179,5182,5183,5188,5189,5193],{},"Click vào ",[575,5180,5181],{},"Deploy to Cloudflare"," trên trang ",[442,5184,5187],{"href":5185,"rel":5186},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[446],"Github repo",". [[",[433,5190],{"alt":5191,"src":5192},"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","]]",[506,5195,5196,5197],{},"Điền đầy đủ thông tin vào form Cloudflare Worker hiển thị.\n",[433,5198],{"alt":5199,"src":5200},"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",[506,5202,5203,5204],{},"Nhập '384' cho Dimensions; chọn 'cosine' cho Metric; và click nút Deploy.\n",[433,5205],{"alt":5206,"src":5207},"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",[506,5209,5210,5211],{},"Dưới đây là tổng quan giao diện Second Brain của bạn trong Cloudflare Worker:\n",[433,5212],{"alt":5213,"src":5214},"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",[506,5216,5217,5218],{},"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,5219],{"alt":5220,"src":5221},"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",[506,5223,5224,5225,5229],{},"Click vào link 'Rotate' để có thể nhập giá trị mới: ",[433,5226],{"alt":5227,"src":5228},"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,5230],{"alt":5231,"src":5232},"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",[506,5234,800,5235,5238],{},[575,5236,5237],{},"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'.",[506,5240,5241],{},"Click nút 'Deploy' để lưu giá trị mới của biến 'AUTH_TOKEN'.",[506,5243,5244,5245],{},"Mở URL worker Second Brain của bạn trên trình duyệt web.\n",[433,5246],{"alt":5247,"src":5248},"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",[506,5250,5251,5252,5255],{},"Nhập token 'AUTH_TOKEN' đã tạo vào ô ",[575,5253,5254],{},"Bearer token"," và click nút 'Connect' để đăng nhập vào bảng điều khiển Web UI.",[538,5257,5259],{"id":5258},"tích-hợp-claude-desktop-qua-giao-thức-mcp","Tích hợp Claude Desktop qua giao thức MCP",[2094,5261,5262,5269,5276],{},[506,5263,5264,5265],{},"Click vào 'Customize' trong phần cài đặt của Claude Desktop.\n",[433,5266],{"alt":5267,"src":5268},"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",[506,5270,5271,5272],{},"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,5273],{"alt":5274,"src":5275},"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",[506,5277,5278,5279,5282,5283,766],{},"Thêm khối mã sau vào phần ",[575,5280,5281],{},"mcpServers"," trong file ",[575,5284,5285],{},"claude_desktop_config.json",[569,5287,5289],{"className":711,"code":5288,"language":713,"meta":424,"style":424},"    \"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",[575,5290,5291,5305,5327,5341,5353,5364,5375,5384,5389],{"__ignoreMap":424},[578,5292,5293,5296,5299,5301,5303],{"class":580,"line":581},[578,5294,5295],{"class":720},"    \"",[578,5297,5298],{"class":588},"second-brain",[578,5300,1513],{"class":720},[578,5302,2524],{"class":595},[578,5304,721],{"class":720},[578,5306,5307,5310,5313,5315,5317,5319,5322,5324],{"class":580,"line":599},[578,5308,5309],{"class":720},"      \"",[578,5311,5312],{"class":2715},"command",[578,5314,1513],{"class":720},[578,5316,766],{"class":720},[578,5318,1095],{"class":720},[578,5320,5321],{"class":588},"npx",[578,5323,1513],{"class":720},[578,5325,5326],{"class":720},",\n",[578,5328,5329,5331,5334,5336,5338],{"class":580,"line":605},[578,5330,5309],{"class":720},[578,5332,5333],{"class":2715},"args",[578,5335,1513],{"class":720},[578,5337,766],{"class":720},[578,5339,5340],{"class":720}," [\n",[578,5342,5343,5346,5349,5351],{"class":580,"line":612},[578,5344,5345],{"class":720},"        \"",[578,5347,5348],{"class":588},"mcp-remote",[578,5350,1513],{"class":720},[578,5352,5326],{"class":720},[578,5354,5355,5357,5360,5362],{"class":580,"line":622},[578,5356,5345],{"class":720},[578,5358,5359],{"class":588},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[578,5361,1513],{"class":720},[578,5363,5326],{"class":720},[578,5365,5366,5368,5371,5373],{"class":580,"line":627},[578,5367,5345],{"class":720},[578,5369,5370],{"class":588},"--header",[578,5372,1513],{"class":720},[578,5374,5326],{"class":720},[578,5376,5377,5379,5382],{"class":580,"line":633},[578,5378,5345],{"class":720},[578,5380,5381],{"class":588},"Authorization: Bearer \u003Cyour-token>",[578,5383,1101],{"class":720},[578,5385,5386],{"class":580,"line":773},[578,5387,5388],{"class":720},"      ]\n",[578,5390,5391],{"class":580,"line":1123},[578,5392,5393],{"class":720},"    }\n",[429,5395,5396,5400,5401],{},[433,5397],{"alt":5398,"src":5399},"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,5402],{"alt":5403,"src":5404},"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",[538,5406,5408],{"id":5407},"tích-hợp-claude-code-qua-giao-thức-mcp","Tích hợp Claude Code qua giao thức MCP",[503,5410,5411],{},[506,5412,5413],{},"Chạy lệnh sau trong terminal để thêm máy chủ MCP mới:",[569,5415,5417],{"className":4721,"code":5416,"language":4723,"meta":424,"style":424},"claude mcp add --transport http second-brain https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\n",[575,5418,5419],{"__ignoreMap":424},[578,5420,5421,5424,5427,5430,5433,5436,5439,5442,5444,5447,5450,5452],{"class":580,"line":581},[578,5422,5423],{"class":584},"claude",[578,5425,5426],{"class":588}," mcp",[578,5428,5429],{"class":588}," add",[578,5431,5432],{"class":588}," --transport",[578,5434,5435],{"class":588}," http",[578,5437,5438],{"class":588}," second-brain",[578,5440,5441],{"class":588}," https:\u002F\u002F",[578,5443,3429],{"class":720},[578,5445,5446],{"class":588},"your-worker-ur",[578,5448,5449],{"class":595},"l",[578,5451,3438],{"class":720},[578,5453,5454],{"class":588},"\u002Fmcp\n",[503,5456,5457,5463],{},[506,5458,5459,5460,693],{},"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 ",[575,5461,5462],{},"AUTH_TOKEN",[506,5464,5465,5466,5469,5470,5473,5474,693],{},"Tạo file ",[575,5467,5468],{},"CLAUDE.md"," trong thư mục ",[575,5471,5472],{},"~\u002F.claude"," với các chỉ dẫn chi tiết lấy từ ",[442,5475,5478],{"href":5476,"rel":5477},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[446],"CLAUDE_INSTRUCTIONS.md",[538,5480,5482],{"id":5481},"tích-hợp-gemini-cli-qua-giao-thức-mcp","Tích hợp Gemini CLI qua giao thức MCP",[2094,5484,5485],{},[506,5486,5487],{},"Thêm cấu hình máy chủ MCP sau vào file '.\u002F.gemini\u002Fsettings.json' của bạn:",[569,5489,5491],{"className":711,"code":5490,"language":713,"meta":424,"style":424},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[575,5492,5493,5505,5524,5537,5550,5555],{"__ignoreMap":424},[578,5494,5495,5497,5499,5501,5503],{"class":580,"line":581},[578,5496,5295],{"class":720},[578,5498,5298],{"class":588},[578,5500,1513],{"class":720},[578,5502,2524],{"class":595},[578,5504,721],{"class":720},[578,5506,5507,5509,5512,5514,5516,5518,5520,5522],{"class":580,"line":599},[578,5508,5309],{"class":720},[578,5510,5511],{"class":2715},"httpUrl",[578,5513,1513],{"class":720},[578,5515,766],{"class":720},[578,5517,1095],{"class":720},[578,5519,5359],{"class":588},[578,5521,1513],{"class":720},[578,5523,5326],{"class":720},[578,5525,5526,5528,5531,5533,5535],{"class":580,"line":605},[578,5527,5309],{"class":720},[578,5529,5530],{"class":2715},"oauth",[578,5532,1513],{"class":720},[578,5534,766],{"class":720},[578,5536,753],{"class":720},[578,5538,5539,5541,5544,5546,5548],{"class":580,"line":612},[578,5540,5345],{"class":720},[578,5542,5543],{"class":584},"enabled",[578,5545,1513],{"class":720},[578,5547,766],{"class":720},[578,5549,3655],{"class":720},[578,5551,5552],{"class":580,"line":622},[578,5553,5554],{"class":720},"      }\n",[578,5556,5557],{"class":580,"line":627},[578,5558,5393],{"class":720},[2094,5560,5561],{"start":599},[506,5562,5563],{},"Khởi chạy Gemini CLI.",[538,5565,5567],{"id":5566},"thử-nghiệm-second-brain-với-các-ai-agent","Thử nghiệm Second Brain với các AI Agent",[2094,5569,5570,5581,5595],{},[506,5571,5572,5573,5576,5577],{},"Khi cấu hình một bảng màu thương hiệu cơ bản trên ",[462,5574,5575],{},"Claude Desktop",", mặc định Second Brain không được gọi ngay lập tức.\n",[433,5578],{"alt":5579,"src":5580},"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",[506,5582,5583,5584,5587,5588,5590,5591],{},"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ộ ",[575,5585,5586],{},"memory_user-edits"," trên ",[462,5589,5575],{}," hoạt động, còn lớp lưu trữ đám mây Second Brain thì bị bỏ qua.\n",[433,5592],{"alt":5593,"src":5594},"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",[506,5596,5597,5598,5601],{},"Khi gửi lệnh sau trên ",[462,5599,5600],{},"Claude Code",", kết nối với Second Brain đã được kích hoạt thành công:",[569,5603,5606],{"className":5604,"code":5605,"language":2486},[2484],"Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n",[575,5607,5605],{"__ignoreMap":424},[429,5609,5610,5614,5615,842,5618,5622,5623,5627,5628,5630,5631,5635,5636,5639,5640,5622,5644],{},[433,5611],{"alt":5612,"src":5613},"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 ",[462,5616,5617],{},"Second Brain trên Cloudflare",[433,5619],{"alt":5620,"src":5621},"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- ",[5624,5625,5626],"em",{},"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 ",[462,5629,5575],{},", 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,5632],{"alt":5633,"src":5634},"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 ",[462,5637,5638],{},"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,5641],{"alt":5642,"src":5643},"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",[5624,5645,5646],{},"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.",[538,5648,5650],{"id":5649},"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",[503,5652,5653,5656],{},[506,5654,5655],{},"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.",[506,5657,5658,5659],{},"Các tính năng chính bao gồm:\n",[503,5660,5661,5667,5673],{},[506,5662,5663,5666],{},[462,5664,5665],{},"Lưu trang hiện tại"," — lưu ngay tiêu đề và địa chỉ URL của trang vào Second Brain.",[506,5668,5669,5672],{},[462,5670,5671],{},"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.",[506,5674,5675,5678,5679,5682],{},[462,5676,5677],{},"Thêm ghi chú nhanh"," — viết thêm ghi chú nhanh hoặc gán các ",[575,5680,5681],{},"#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.",[538,5684,5686],{"id":5685},"đồ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",[503,5688,5689,5692],{},[506,5690,5691],{},"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.",[506,5693,5694],{},"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.",[543,5696,5698],{"id":5697},"cài-đặt-plugin-obsidian","Cài đặt Plugin Obsidian",[2094,5700,5701,5708,5715,5722],{},[506,5702,5703,5704],{},"Mở Obsidian → Settings → Community Plugins\n",[433,5705],{"alt":5706,"src":5707},"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",[506,5709,5710,5711],{},"Click vào nút 'Browse'.\n",[433,5712],{"alt":5713,"src":5714},"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",[506,5716,5717,5718],{},"Tìm kiếm từ khóa 'Second Brain Sync'.\n",[433,5719],{"alt":5720,"src":5721},"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",[506,5723,5724,5725],{},"Click nút 'Install' sau đó click 'Enable'.\n",[433,5726],{"alt":5727,"src":5728},"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",[543,5730,5732],{"id":5731},"cấu-hình-plugin-obsidian","Cấu hình Plugin Obsidian",[2094,5734,5735,5738,5745,5752,5759,5766],{},[506,5736,5737],{},"Truy cập Obsidian → Settings → Second Brain Sync",[506,5739,5740,5741],{},"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,5742],{"alt":5743,"src":5744},"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",[506,5746,5747,5748],{},"Click nút 'Test' để xác minh kết nối từ xa đã sẵn sàng hoạt động.\n",[433,5749],{"alt":5750,"src":5751},"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",[506,5753,5754,5755],{},"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,5756],{"alt":5757,"src":5758},"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",[506,5760,5761,5762],{},"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,5763],{"alt":5764,"src":5765},"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",[506,5767,5768,5769],{},"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,5770],{"alt":5771,"src":5772},"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",[493,5774,5776],{"id":5775},"kết-luận","Kết luận",[429,5778,5779],{},"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.",[429,5781,5782],{},"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.",[429,5784,5785],{},"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.",[493,5787,5788],{"id":4031},"Tài liệu tham khảo:",[503,5790,5791,5797,5803,5810,5817],{},[506,5792,5793],{},[442,5794,5795],{"href":5795,"rel":5796},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[446],[506,5798,5799],{},[442,5800,5801],{"href":5801,"rel":5802},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[446],[506,5804,5805],{},[442,5806,5809],{"href":5807,"rel":5808},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[446],"Connect to AI Clients",[506,5811,5812],{},[442,5813,5816],{"href":5814,"rel":5815},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[446],"Second Brain Obsidian Plugin",[506,5818,5819],{},[442,5820,5821],{"href":5821,"rel":5822},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[446],[1886,5824,5825],{},"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":424,"searchDepth":599,"depth":605,"links":5827},[5828,5829,5830,5842,5843],{"id":5066,"depth":599,"text":5067},{"id":5076,"depth":599,"text":5077},{"id":5097,"depth":599,"text":5098,"children":5831},[5832,5833,5834,5835,5836,5837,5838],{"id":5172,"depth":605,"text":5173},{"id":5258,"depth":605,"text":5259},{"id":5407,"depth":605,"text":5408},{"id":5481,"depth":605,"text":5482},{"id":5566,"depth":605,"text":5567},{"id":5649,"depth":605,"text":5650},{"id":5685,"depth":605,"text":5686,"children":5839},[5840,5841],{"id":5697,"depth":612,"text":5698},{"id":5731,"depth":612,"text":5732},{"id":5775,"depth":599,"text":5776},{"id":4031,"depth":599,"text":5788},[5845,4098],"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":5851,"robots":1924,"sitemap":5854},[5852],{"@type":4106,"headline":5853,"description":5847},"Hệ thống bộ nhớ AI tự host với Cloudflare và MCP",{"lastmod":5846},{"title":5853,"description":5847,"ogTitle":5061,"ogDescription":5847,"twitterTitle":5061,"twitterDescription":5847},"vi\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[4134,5858,5859,5088,1932],"MCP","Bộ nhớ AI","UgRl4Al24KEOOPCKlv3MMVU-krBqxz4YEiF9kwtLUIM",{"id":5862,"title":4927,"author":424,"body":5863,"category":6381,"date":6382,"description":6383,"extension":1915,"image":6384,"imageAlt":6385,"isPublished":738,"meta":6386,"minRead":622,"navigation":738,"path":399,"seo":6390,"stem":6391,"tags":6392,"updatedAt":1935,"__hash__":6395},"article\u002Fvi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac.md",{"type":426,"value":5864,"toc":6374},[5865,5869,5872,5879,5883,5889,5892,5895,5899,5902,5909,5925,6219,6334,6336,6339,6341,6371],[493,5866,5868],{"id":5867},"cloudflare-warp-là-gì","Cloudflare WARP là gì?",[429,5870,5871],{},"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.",[429,5873,5874,5875,5878],{},"Nó tạo ra một đường truyền được mã hóa (encrypted tunnel) xây dựng trên giao thức ",[462,5876,5877],{},"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.",[493,5880,5882],{"id":5881},"tại-sao-chúng-ta-cần-cloudflare-warp","Tại sao chúng ta cần Cloudflare WARP?",[429,5884,5885,5886,693],{},"Để 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 ",[462,5887,5888],{},"Truy cập mạng Zero Trust (ZTNA)",[429,5890,5891],{},"Ứ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.",[429,5893,5894],{},"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 đủ.",[493,5896,5898],{"id":5897},"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ị",[429,5900,5901],{},"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.",[429,5903,5904,5905,5908],{},"Để làm được điều này trên macOS, chúng ta có thể sử dụng file cấu hình MDM ",[575,5906,5907],{},".mobileconfig"," để định nghĩa và đăng ký các môi trường WARP khác nhau.",[503,5910,5911,5922],{},[506,5912,5913,5921],{},[442,5914,5917,5918,5920],{"href":5915,"rel":5916},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fstatic\u002Fmdm\u002Fmultiple-orgs\u002FCloudflareWARP.mobileconfig",[446],"Download a sample ",[575,5919,5907],{}," file"," trực tiếp từ Cloudflare.",[506,5923,5924],{},"Dưới đây là ví dụ về cấu hình này trông như thế nào:",[569,5926,5930],{"className":5927,"code":5928,"language":5929,"meta":424,"style":424},"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",[575,5931,5932,5937,5942,5947,5952,5957,5962,5967,5972,5977,5982,5987,5992,5997,6002,6007,6012,6017,6022,6027,6032,6037,6042,6047,6052,6057,6062,6067,6071,6075,6080,6084,6089,6093,6099,6105,6111,6117,6123,6129,6135,6141,6147,6153,6159,6165,6171,6177,6183,6189,6195,6201,6207,6213],{"__ignoreMap":424},[578,5933,5934],{"class":580,"line":581},[578,5935,5936],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[578,5938,5939],{"class":580,"line":599},[578,5940,5941],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[578,5943,5944],{"class":580,"line":605},[578,5945,5946],{},"\u003Cplist version=\"1.0\">\n",[578,5948,5949],{"class":580,"line":612},[578,5950,5951],{},"\u003Cdict>\n",[578,5953,5954],{"class":580,"line":622},[578,5955,5956],{},"  \u003Ckey>PayloadContent\u003C\u002Fkey>\n",[578,5958,5959],{"class":580,"line":627},[578,5960,5961],{},"  \u003Carray>\n",[578,5963,5964],{"class":580,"line":633},[578,5965,5966],{},"    \u003Cdict>\n",[578,5968,5969],{"class":580,"line":773},[578,5970,5971],{},"      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[578,5973,5974],{"class":580,"line":1123},[578,5975,5976],{},"      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n",[578,5978,5979],{"class":580,"line":1131},[578,5980,5981],{},"      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[578,5983,5984],{"class":580,"line":1139},[578,5985,5986],{},"      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[578,5988,5989],{"class":580,"line":1147},[578,5990,5991],{},"      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[578,5993,5994],{"class":580,"line":1155},[578,5995,5996],{},"      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n",[578,5998,5999],{"class":580,"line":1163},[578,6000,6001],{},"      \u003Ckey>PayloadType\u003C\u002Fkey>\n",[578,6003,6004],{"class":580,"line":1171},[578,6005,6006],{},"      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n",[578,6008,6009],{"class":580,"line":1182},[578,6010,6011],{},"      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[578,6013,6014],{"class":580,"line":1187},[578,6015,6016],{},"      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[578,6018,6019],{"class":580,"line":1195},[578,6020,6021],{},"      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[578,6023,6024],{"class":580,"line":1731},[578,6025,6026],{},"      \u003Cinteger>1\u003C\u002Finteger>\n",[578,6028,6029],{"class":580,"line":1737},[578,6030,6031],{},"      \u003Ckey>configs\u003C\u002Fkey>\n",[578,6033,6034],{"class":580,"line":1748},[578,6035,6036],{},"      \u003Carray>\n",[578,6038,6039],{"class":580,"line":2416},[578,6040,6041],{},"        \u003Cdict>\n",[578,6043,6044],{"class":580,"line":2874},[578,6045,6046],{},"          \u003Ckey>organization\u003C\u002Fkey>\n",[578,6048,6049],{"class":580,"line":2883},[578,6050,6051],{},"          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n",[578,6053,6054],{"class":580,"line":2891},[578,6055,6056],{},"          \u003Ckey>display_name\u003C\u002Fkey>\n",[578,6058,6059],{"class":580,"line":2899},[578,6060,6061],{},"          \u003Cstring>Team 1\u003C\u002Fstring>\n",[578,6063,6064],{"class":580,"line":2904},[578,6065,6066],{},"        \u003C\u002Fdict>\n",[578,6068,6069],{"class":580,"line":2911},[578,6070,6041],{},[578,6072,6073],{"class":580,"line":2919},[578,6074,6046],{},[578,6076,6077],{"class":580,"line":2927},[578,6078,6079],{},"          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n",[578,6081,6082],{"class":580,"line":2938},[578,6083,6056],{},[578,6085,6086],{"class":580,"line":2946},[578,6087,6088],{},"          \u003Cstring>Team 2\u003C\u002Fstring>\n",[578,6090,6091],{"class":580,"line":2953},[578,6092,6066],{},[578,6094,6096],{"class":580,"line":6095},34,[578,6097,6098],{},"      \u003C\u002Farray>\n",[578,6100,6102],{"class":580,"line":6101},35,[578,6103,6104],{},"    \u003C\u002Fdict>\n",[578,6106,6108],{"class":580,"line":6107},36,[578,6109,6110],{},"  \u003C\u002Farray>\n",[578,6112,6114],{"class":580,"line":6113},37,[578,6115,6116],{},"  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[578,6118,6120],{"class":580,"line":6119},38,[578,6121,6122],{},"  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n",[578,6124,6126],{"class":580,"line":6125},39,[578,6127,6128],{},"  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[578,6130,6132],{"class":580,"line":6131},40,[578,6133,6134],{},"  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n",[578,6136,6138],{"class":580,"line":6137},41,[578,6139,6140],{},"  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[578,6142,6144],{"class":580,"line":6143},42,[578,6145,6146],{},"  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n",[578,6148,6150],{"class":580,"line":6149},43,[578,6151,6152],{},"  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n",[578,6154,6156],{"class":580,"line":6155},44,[578,6157,6158],{},"  \u003Cfalse\u002F>\n",[578,6160,6162],{"class":580,"line":6161},45,[578,6163,6164],{},"  \u003Ckey>PayloadScope\u003C\u002Fkey>\n",[578,6166,6168],{"class":580,"line":6167},46,[578,6169,6170],{},"  \u003Cstring>System\u003C\u002Fstring>\n",[578,6172,6174],{"class":580,"line":6173},47,[578,6175,6176],{},"  \u003Ckey>PayloadType\u003C\u002Fkey>\n",[578,6178,6180],{"class":580,"line":6179},48,[578,6181,6182],{},"  \u003Cstring>Configuration\u003C\u002Fstring>\n",[578,6184,6186],{"class":580,"line":6185},49,[578,6187,6188],{},"  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[578,6190,6192],{"class":580,"line":6191},50,[578,6193,6194],{},"  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n",[578,6196,6198],{"class":580,"line":6197},51,[578,6199,6200],{},"  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[578,6202,6204],{"class":580,"line":6203},52,[578,6205,6206],{},"  \u003Cinteger>1\u003C\u002Finteger>\n",[578,6208,6210],{"class":580,"line":6209},53,[578,6211,6212],{},"\u003C\u002Fdict>\n",[578,6214,6216],{"class":580,"line":6215},54,[578,6217,6218],{},"\u003C\u002Fplist>\n",[503,6220,6221,6231,6243,6253,6259,6276,6289,6309,6325],{},[506,6222,6223,6224,464,6227,6230],{},"Thay thế ",[575,6225,6226],{},"your-team-name-1",[575,6228,6229],{},"your-team-name-2"," bằng tên nhóm Cloudflare Zero Trust tương ứng của bạn.",[506,6232,800,6233,6236,6237,6240,6241,693],{},[575,6234,6235],{},"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ị ",[575,6238,6239],{},"PayloadUUID"," tạm thời trong file ",[575,6242,5907],{},[506,6244,6245,6246,6249,6250,6252],{},"Đảm bảo rằng chuỗi ",[575,6247,6248],{},"PayloadIdentifier"," cũng chứa ",[575,6251,6239],{}," đã cập nhật để giữ cho cấu hình có tính riêng biệt.",[506,6254,6255,6256,6258],{},"Lưu file ",[575,6257,5907],{}," đã chỉnh sửa của bạn.",[506,6260,6261,6262,6265,6266,6269,6270,6272],{},"Mở ",[462,6263,6264],{},"Cài đặt hệ thống"," trên máy Mac của bạn, tìm kiếm ",[462,6267,6268],{},"Cấu hình"," (Profiles), và chọn nó.",[4310,6271],{},[433,6273],{"alt":6274,"src":6275},"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",[506,6277,6278,6279,6282,6283,6285],{},"Nhấp vào ",[462,6280,6281],{},"Cài đặt, xem hoặc xóa..."," để bắt đầu thêm cấu hình mới của bạn.",[4310,6284],{},[433,6286],{"alt":6287,"src":6288},"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",[506,6290,6291,6292,6295,6296,6298,6299,6301,6305],{},"Nhấp vào biểu tượng ",[462,6293,6294],{},"+"," (cộng) ở góc dưới bên trái và chọn file ",[575,6297,5907],{}," đã lưu của bạn.",[4310,6300],{},[433,6302],{"alt":6303,"src":6304},"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,6306],{"alt":6307,"src":6308},"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",[506,6310,6311,6312,6314,6315,6318,6319,6321],{},"Chọn ",[462,6313,4149],{}," và nhấp vào ",[462,6316,6317],{},"Cài đặt"," để áp dụng cấu hình.",[4310,6320],{},[433,6322],{"alt":6323,"src":6324},"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",[506,6326,6327,6328,6330],{},"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:",[4310,6329],{},[433,6331],{"alt":6332,"src":6333},"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",[493,6335,5776],{"id":5775},[429,6337,6338],{},"Ứ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.",[493,6340,4032],{"id":4031},[503,6342,6343,6350,6357,6364],{},[506,6344,6345],{},[442,6346,6349],{"href":6347,"rel":6348},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002F#prepare-file-for-mdm-deployment",[446],"Managed Deployment Preparation",[506,6351,6352],{},[442,6353,6356],{"href":6354,"rel":6355},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002Fswitch-organizations\u002F",[446],"Switch Between Zero Trust Organizations",[506,6358,6359],{},[442,6360,6363],{"href":6361,"rel":6362},"https:\u002F\u002Fblog.cloudflare.com\u002Fintroducing-warp-connector-paving-the-path-to-any-to-any-connectivity-2\u002F",[446],"Introducing WARP Connector: Paving the Path to Any-to-Any Connectivity",[506,6365,6366],{},[442,6367,6370],{"href":6368,"rel":6369},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002F",[446],"Cloudflare One Client Documentation",[1886,6372,6373],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":424,"searchDepth":599,"depth":605,"links":6375},[6376,6377,6378,6379,6380],{"id":5867,"depth":599,"text":5868},{"id":5881,"depth":599,"text":5882},{"id":5897,"depth":599,"text":5898},{"id":5775,"depth":599,"text":5776},{"id":4031,"depth":599,"text":4032},[5012,5845],"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":6387,"robots":1924,"sitemap":6389},[6388],{"@type":1923,"headline":4927,"description":6383},{"lastmod":6382},{"title":6385,"description":6383,"ogTitle":4927,"ogDescription":6383,"twitterTitle":4927,"twitterDescription":6383},"vi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",[6393,4149,6394,1934],"macOS","MDM","AYpQU_BG0n0gA2TN8V-O9UYRB2yhUp2FObpAAE28Vcs",1792490011919]