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