y 松本 侑真
homelab · yuuma@homelab-gmk:~$ docker compose ps online

Self-hosted infrastructure

HomeLab

自宅サーバ homelab-gmk で動かしているセルフホストサービス群。 外から見えるのは *.yuuma.dev のドメインだけ。その裏で Cloudflare Tunnel・Docker・メモアプリ・監視が、インバウンドの穴を一切開けずに繋がっている。 「何が動いていて、どう繋がっているか」を計器とラックで見せる。

稼働ユニット
8
公開ホスト名
6
compose ファイル
2
開放ポート (inbound)
0

homelab-gmk · Linux (Ubuntu 系) · 4 core · 7.5 GB · NVMe 468 GB

Network topology

/ インターネット → Cloudflare → my-services

外からの到達は 100% Cloudflare 経由。cloudflared が内側から接続を張り返す Tunnel なので、ルーターのポート開放も固定 IP も要らない。

Rack elevation

/ 8 units · 172.18.0.0/16 healthy
U01

cloudflared

INTERNAL

Cloudflare Tunnel の入口。egress のみで公開ポートを持たず、内側から Cloudflare へ接続を張り返す。

compose: home-infra my-services Cloudflare Tunnel Zero Trust
U02

memos

memos.yuuma.dev ↗ PUBLIC

個人用メモアプリ本体。SQLite に保存し、Claude からも MCP 経由で読み書きする「脳の外部ストレージ」。

compose: memos-gmk :5230 my-services Go SQLite
U03

memos-mcp

mcp.yuuma.dev ↗ PUBLIC

Claude から memos を MCP 経由で読み書きするプロキシ。claude.ai カスタムコネクタ用に Access は bypass、認証はアプリ側 Bearer/OAuth に一本化(ADR-0003)。

compose: memos-gmk :8080 my-services TypeScript MCP Streamable HTTP
U04

memos-discord-relay

INTERNAL

memos の更新を検知して Discord に通知する内部サイドカー。外部公開はしない。

compose: memos-gmk :8080 my-services Webhook Discord
U05

homepage

homepage.yuuma.dev ↗ PUBLIC

玄関ダッシュボード。compose の homepage.* ラベルを唯一の真実として、稼働サービスを一覧表示する。

compose: home-infra :3000 my-services Homepage docker.sock (ro)
U06

dozzle

dozzle.yuuma.dev ↗ PUBLIC

全コンテナのログをブラウザで見る監視 UI。docker.sock を読み取り専用でマウント。

compose: home-infra :8080 my-services Dozzle docker.sock (ro)
U07

uptime-kuma

kuma.yuuma.dev ↗ PUBLIC

死活監視 UI。各サービスのモニタは setup_monitors.py で登録し、Discord に通知する。

compose: home-infra :3001 my-services Uptime Kuma
U08

tennis-reservation-scraping

BATCH

テニスコートの空き状況を 5 分おきにクロールし、空きがあれば LINE に通知する非常駐バッチ。ネットワーク非参加。

compose: tennis network 非参加 Python cron LINE

Stack

/ ホストからアプリまで
L4 アプリ memos / memos-mcp / relay / homepage / dozzle / uptime-kuma / tennis
L3 公開・認証 Cloudflare Tunnel(egress のみ)+ Access(*.yuuma.dev ワイルドカード)
L2 コンテナ基盤 Docker + docker bridge『my-services』(external, 2 compose が共有)
L1 ホスト homelab-gmk · Linux · 4 core / 7.5 GB / NVMe 468 GB · 常時稼働

Design notes

/ なぜこの構成なのか

インバウンドの穴を開けない

外からの到達は 100% Cloudflare 経由。cloudflared が内側から接続を張り返す Tunnel なので、ルーターのポート開放も固定 IP も不要。

公開はダッシュボード 1 行

ingress ルールは Cloudflare 側にあり、新サービスの公開は Zero Trust で Public Hostname を 1 行足すだけ。サーバー側の変更は要らない。

秘密は 1 箇所に集約

ADR-0004 で起動元を homelab に一元化。秘密は ~/Documents/homelab/secrets/ に集約し、権限 600 で管理する。

地図は常に現状と一致

docs は『ストック(確定知識)』、Issue は『フロー(流れる議論)』。architecture-map.md は docker inspect / dig / curl の実測から起こす。

構成の一次資料。

このページの元データは homelab リポジトリの docs(architecture.md / architecture-map.md)から起こしている。運用や意思決定の記録(ADR)も同リポジトリに集約している。

yuuma@homelab-gmk:~$ git remote -v