# hetzner-infra Hetzner VPS 上で動くサービス群のインフラ管理リポジトリ。 ## ディレクトリ構成 ``` caddy/ リバースプロキシ + フォワードプロキシ(Caddyfile, Dockerfile, entrypoint.sh, docker-compose.yml, deploy.sh) cgit/ cgit Web UI(Dockerfile, lighttpd.conf, cgitrc, deploy.sh) git/ ベアリポジトリ・フック管理(repos.txt, hooks/, install.sh) claude/ Claude Code セッション管理(sessions.txt, systemd unit, sync.sh) hetzner-admin/ サーバー管理 Web UI(app.py, Dockerfile, docker-compose.yml, deploy.sh) mail/ MTA(Postfix + OpenDKIM, docker-compose.yml, install.sh, dns/setup-route53.py) vpn/ strongSwan IKEv2 VPN(Dockerfile, docker-compose.yml, install.sh, renew-cert.sh) server/ サーバー共通設定(authorized_keys, requirements.md) ``` ## デプロイの仕組み - `git push origin master` → post-receive フック → `caddy/deploy.sh` / `cgit/deploy.sh` / `mail/deploy.sh` / `hetzner-admin/deploy.sh` / `vpn/deploy.sh` を実行 - cgit の `lighttpd.conf` / `Dockerfile` 変更はイメージ再ビルドが必要(`deploy.sh` で `--build` するため push だけで反映される) - cgit の `cgitrc` はボリュームマウントのため push だけで反映される - フック・リポジトリの変更は push 後に `bash /app/infra/git/install.sh` を手動実行 - Claude セッションの変更は push 後に `bash /app/infra/claude/sync.sh` を手動実行 - mail ドメイン変更(`mail/domains.txt`)は push 後に `bash /app/infra/mail/install.sh` を手動実行 ## 管理対象リポジトリ `git/repos.txt` に定義。`git/hooks//post-receive` がデプロイ内容。 | リポジトリ | work tree | |---|---| | hetzner-infra | /app/infra | | tokyo-livehouse-events | /app/tokyo-livehouse-events | | whois-band | /app/whois-band | ## よく使うコマンド ```bash # Caddy 設定変更 vi caddy/Caddyfile && git push origin master # cgit 設定変更(lighttpd.conf / cgitrc) vi cgit/lighttpd.conf # または cgit/cgitrc git push origin master # --build 付きで自動再デプロイ # フック・リポジトリ定義変更 vi git/hooks/.../post-receive # または git/repos.txt git push origin master ssh root@localhost 'bash /app/infra/git/install.sh' # Claude セッション変更 vi claude/sessions.txt git push origin master ssh root@localhost 'bash /app/infra/claude/sync.sh' # SSH 鍵追加 vi server/authorized_keys git push origin master ssh root@localhost 'bash /app/infra/git/install.sh' # MTA(mail)初回セットアップ(サーバー上で root として実行) ssh root@ 'bash /app/infra/mail/install.sh' # → DKIM 鍵生成 + コンテナ起動。公開鍵が表示される。 # Route 53 DNS 設定(サーバー上で実行) ssh root@ export AWS_ACCESS_KEY_ID=... export AWS_SECRET_ACCESS_KEY=... export HOSTED_ZONE_ID=Z... export SERVER_IP= python3 /app/infra/mail/dns/setup-route53.py # mail ドメイン追加(golive → whoisband も追加する例) vi mail/domains.txt git push origin master ssh root@localhost 'bash /app/infra/mail/install.sh' # テーブル再生成 + 再起動 # hetzner-admin 初回セットアップ(サーバー上で実行) ssh root@ cat > /app/infra/hetzner-admin/.env < SSH_USER=root EOF bash /app/infra/hetzner-admin/install.sh # → SSH鍵生成 + authorized_keys登録(command= 制限付き)+ コンテナ起動 # → hetzner-admin.yyamashita.com でアクセス可能 # VPN 初回セットアップ(サーバー上で実行) # 前提: ファイアウォールで UDP 500, 4500 を開放済み git push origin master ssh root@ 'bash /app/infra/git/install.sh' # post-receive フック更新 # → Caddy が vpn.yyamashita.com の証明書を取得するまで数分待つ ssh root@ cat > /app/infra/vpn/users.conf < EOF chmod 600 /app/infra/vpn/users.conf bash /app/infra/vpn/install.sh # → Caddy の証明書を流用 + コンテナ起動 # → vpn.yyamashita.com:500/4500 (IKEv2) で接続可能 # VPN 証明書更新(Let's Encrypt 更新後 90 日ごと) ssh root@ 'bash /app/infra/vpn/renew-cert.sh' # VPN ユーザー追加・変更 ssh root@ vi /app/infra/vpn/users.conf # 1行1ユーザー: "username password" docker compose -f /app/infra/vpn/docker-compose.yml restart # Proxy 初回セットアップ(Caddy に統合済み。追加作業なし) # → push するだけで Caddy が proxy.yyamashita.com の証明書を自動取得 # → proxy.yyamashita.com:80 (HTTP) / :443 (HTTPS) でフォワードプロキシとして動作 # → 認証は VPN と同じ users.conf を共有 # Proxy ユーザー追加・変更(VPN と同じ users.conf を編集) ssh root@ vi /app/infra/vpn/users.conf docker compose -f /app/infra/caddy/docker-compose.yml restart # Caddy 再起動で反映 # DNS 登録(初回のみ。setup-route53.py に proxy が含まれている) ssh root@ export AWS_ACCESS_KEY_ID=... export AWS_SECRET_ACCESS_KEY=... python3 /app/infra/mail/dns/setup-route53.py ``` ## VPN クライアント設定 **iOS / macOS** (ネイティブ IKEv2): - サーバー: `vpn.yyamashita.com` - タイプ: IKEv2 - 認証: ユーザー名 + パスワード (EAP) - 証明書インストール不要(Let's Encrypt は自動信頼) **Meta Quest 3S / FireTV** (Android): - strongSwan VPN Client アプリをインストール - Quest: sideload `org.strongswan.android` APK - FireTV: 同様に APK をサイドロード - プロファイル設定: - タイプ: IKEv2 EAP (Username/Password) - サーバー: `vpn.yyamashita.com` - ユーザー名・パスワード: `users.conf` の内容 ## Proxy クライアント設定 - HTTP プロキシ: `proxy.yyamashita.com:80` - HTTPS プロキシ: `proxy.yyamashita.com:443` - 認証: Basic 認証(VPN と同じユーザー名/パスワード)