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