# Deploy Hetzner Cloud + Docker + Caddy (HTTPS) の共有インフラ。 複数アプリを同一ホストで運用し、Caddy がホスト名でルーティングする。 ## 構成 ``` git push hetzner master (各リポジトリ) └→ /var/git/.git/hooks/post-receive └→ git checkout -f → /app// └→ docker compose up -d (--build) Docker network: web (external, 全アプリ共有) ├── infra-caddy-1 (80/443, HTTPS 自動証明書) ├── tokyo-app (golive.yyamashita.com → :3000) └── whois-app (whois.band → :3000) ``` - **サーバー**: Hetzner CX22 (Helsinki, Ubuntu 24.04) - **SSH**: `ssh golive` ## リポジトリとデプロイ先 | リポジトリ | bare repo | work tree | |---|---|---| | hetzner-infra | /var/git/hetzner-infra.git | /app/infra | | tokyo-livehouse-events | /var/git/tokyo-livehouse-events.git | /app | | whois-band | /var/git/whois-band.git | /app/whois-band | ## デプロイ ```bash git push hetzner master ``` Caddyfile 変更時も同様(push 後に自動 reload)。 ## サーバー操作 ```bash # 全コンテナ確認 ssh golive 'docker ps' # Caddy ログ ssh golive 'docker logs infra-caddy-1 -f' # tokyo ログ ssh golive 'docker logs tokyo-app -f' # whois ログ ssh golive 'docker logs whois-app -f' ``` ## サーバー構成管理 ベアリポジトリ・ワークツリー・フックはすべてこのリポジトリで一元管理する。 git push では**自動展開しない**(セキュリティ上の理由)。変更後は手動で `install.sh` を実行する。 | ファイル | 役割 | |---|---| | `repos.txt` | 全リポジトリの定義(`name:work-tree` 形式) | | `server-hooks//post-receive` | 各リポジトリのフック内容 | | `scripts/install.sh` | ベアリポジトリ作成 + フック展開(要 root) | | `scripts/server-setup.sh` | 初回のみ: Docker + hetzner-infra ブートストラップ | ```bash # 変更を反映する場合 git push origin master ssh root@localhost 'bash /app/infra/scripts/install.sh' ``` ## 新アプリ追加手順 1. `repos.txt` に `:` を追記 2. `server-hooks//post-receive` を作成 3. `Caddyfile` にホスト追加 4. `git push origin master` → `ssh root@localhost 'bash /app/infra/scripts/install.sh'` 5. 新アプリ側: `git remote add hetzner root@localhost:/var/git/.git` → `git push hetzner master` ## Claude Code セッション管理 `git push` 時に post-receive フック(root)が `yyamashita` ユーザーの systemd user service を自動同期する。 | ファイル | 役割 | |---|---| | `systemd/user/claude-code@.service` | サービステンプレート | | `claude-code-sessions.txt` | 有効にするセッション一覧(`user:repo` 形式) | | `scripts/sync-claude-services.sh` | root が user service を同期するスクリプト | ### セッション追加・削除 `claude-code-sessions.txt` を編集して `git push hetzner master`: ``` # 形式: user:repo yyamashita:hetzner-infra yyamashita:new-repo ``` ### 手動同期(サーバー上で) ```bash ssh root@localhost 'bash /app/infra/scripts/sync-claude-services.sh' ``` ### サービス確認 ```bash systemctl --user status 'claude-code@*.service' tmux ls ``` ## 初回サーバーセットアップ(再構築時) ```bash # 1. hetzner-infra を最初にセットアップ(Docker + web network 作成) scp scripts/server-setup.sh golive:~/ ssh golive 'bash server-setup.sh' git push hetzner master # 2. 各アプリをセットアップ # (各リポジトリの scripts/server-setup.sh を参照) ```