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