# 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' ``` ## サーバーフック管理 各リポジトリの post-receive フック内容は `server-hooks//post-receive` で管理する。 git push では**自動展開しない**(セキュリティ上の理由)。フックを更新したい場合は push 後に手動でインストールスクリプトを実行する。 ```bash # フックを更新した場合: push → サーバーで手動インストール git push origin master ssh root@localhost 'bash /app/infra/scripts/install-hooks.sh' ``` | ファイル | 役割 | |---|---| | `server-hooks//post-receive` | 各リポジトリのフック内容 | | `scripts/install-hooks.sh` | `server-hooks/` を `/var/git/*/hooks/` に展開 | ## 新アプリ追加手順 1. `Caddyfile` にホスト追加 → `git push origin master` 2. 新アプリ側: `docker-compose.yml` で `external: true` の `web` network を使用、`container_name` を設定 3. 新アプリの bare repo をサーバに作成(`scripts/server-setup.sh` 参照) 4. `server-hooks//post-receive` を作成して push 5. `ssh root@localhost 'bash /app/infra/scripts/install-hooks.sh'` 6. `git remote add hetzner golive:/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 を参照) ```