diff options
| -rw-r--r-- | Deploy.md | 33 | ||||
| -rw-r--r-- | repos.txt | 6 | ||||
| -rwxr-xr-x | scripts/install.sh (renamed from scripts/install-hooks.sh) | 30 | ||||
| -rw-r--r-- | scripts/server-setup.sh | 42 |
4 files changed, 79 insertions, 32 deletions
@@ -52,30 +52,31 @@ ssh golive 'docker logs tokyo-app -f' ssh golive 'docker logs whois-app -f' ``` -## サーバーフック管理 +## サーバー構成管理 -各リポジトリの post-receive フック内容は `server-hooks/<repo>/post-receive` で管理する。 -git push では**自動展開しない**(セキュリティ上の理由)。フックを更新したい場合は push 後に手動でインストールスクリプトを実行する。 - -```bash -# フックを更新した場合: push → サーバーで手動インストール -git push origin master -ssh root@localhost 'bash /app/infra/scripts/install-hooks.sh' -``` +ベアリポジトリ・ワークツリー・フックはすべてこのリポジトリで一元管理する。 +git push では**自動展開しない**(セキュリティ上の理由)。変更後は手動で `install.sh` を実行する。 | ファイル | 役割 | |---|---| +| `repos.txt` | 全リポジトリの定義(`name:work-tree` 形式) | | `server-hooks/<repo>/post-receive` | 各リポジトリのフック内容 | -| `scripts/install-hooks.sh` | `server-hooks/` を `/var/git/*/hooks/` に展開 | +| `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. `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/<new-repo>/post-receive` を作成して push -5. `ssh root@localhost 'bash /app/infra/scripts/install-hooks.sh'` -6. `git remote add hetzner golive:/var/git/<name>.git` → `git push hetzner master` +1. `repos.txt` に `<name>:<work-tree>` を追記 +2. `server-hooks/<name>/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/<name>.git` → `git push hetzner master` ## Claude Code セッション管理 diff --git a/repos.txt b/repos.txt new file mode 100644 index 0000000..25e764a --- /dev/null +++ b/repos.txt @@ -0,0 +1,6 @@ +# リポジトリ定義 +# 形式: <repo-name>:<work-tree-path> +# /var/git/<repo-name>.git が bare repo、<work-tree-path> が checkout 先 +hetzner-infra:/app/infra +tokyo-livehouse-events:/app +whois-band:/app/whois-band diff --git a/scripts/install-hooks.sh b/scripts/install.sh index c502496..9f06489 100755 --- a/scripts/install-hooks.sh +++ b/scripts/install.sh @@ -1,9 +1,11 @@ #!/usr/bin/env bash # サーバー上で root として手動実行する -# server-hooks/ の内容を /var/git/*/hooks/ に展開する +# repos.txt に基づいてベアリポジトリとワークツリーを作成し、 +# server-hooks/ のフックを /var/git/*/hooks/ に展開する set -euo pipefail APP_DIR="$(cd "$(dirname "$0")/.." && pwd)" +REPOS_FILE="$APP_DIR/repos.txt" HOOKS_SRC="$APP_DIR/server-hooks" if [[ "$(id -u)" -ne 0 ]]; then @@ -11,12 +13,35 @@ if [[ "$(id -u)" -ne 0 ]]; then exit 1 fi +# ベアリポジトリ・ワークツリー作成 +echo "=== Repositories ===" +while IFS=: read -r repo_name work_tree; do + [[ "$repo_name" =~ ^#.*$ || -z "$repo_name" ]] && continue + bare_repo="/var/git/${repo_name}.git" + + if [[ ! -d "$bare_repo" ]]; then + echo " create: $bare_repo" + mkdir -p "$bare_repo" + git init --bare "$bare_repo" + else + echo " exists: $bare_repo" + fi + + if [[ ! -d "$work_tree" ]]; then + echo " mkdir: $work_tree" + mkdir -p "$work_tree" + fi +done < "$REPOS_FILE" + +# フック展開 +echo "" +echo "=== Hooks ===" for repo_src in "$HOOKS_SRC"/*/; do repo_name="$(basename "$repo_src")" git_hooks_dir="/var/git/${repo_name}.git/hooks" if [[ ! -d "$git_hooks_dir" ]]; then - echo "SKIP: $git_hooks_dir が存在しません ($repo_name)" + echo " SKIP: $git_hooks_dir not found ($repo_name)" continue fi @@ -33,4 +58,5 @@ for repo_src in "$HOOKS_SRC"/*/; do done done +echo "" echo "Done." diff --git a/scripts/server-setup.sh b/scripts/server-setup.sh index 154c6c7..ca9a3f9 100644 --- a/scripts/server-setup.sh +++ b/scripts/server-setup.sh @@ -1,9 +1,11 @@ #!/bin/bash -# Run once on a fresh Hetzner VPS (as root). Run this first before other app setups. +# Run once on a fresh Hetzner VPS (as root). +# hetzner-infra のみブートストラップとして作成する。 +# 他のリポジトリは最初の push 後に install.sh が作成する。 set -e -APP_DIR=/app/infra REPO_DIR=/var/git/hetzner-infra.git +APP_DIR=/app/infra # Install Docker curl -fsSL https://get.docker.com | sh @@ -11,18 +13,30 @@ curl -fsSL https://get.docker.com | sh # Create shared Docker network docker network create web || true -mkdir -p "$APP_DIR" -mkdir -p "$REPO_DIR" +# hetzner-infra bare repo をブートストラップ +mkdir -p "$REPO_DIR" "$APP_DIR" git init --bare "$REPO_DIR" +# 最初の push を受け取るための最小限のフック(install.sh 実行後に上書きされる) +cat > "$REPO_DIR/hooks/post-receive" << 'HOOK' +#!/bin/bash +set -e +APP_DIR=/app/infra +GIT_WORK_TREE=$APP_DIR git checkout -f +cd $APP_DIR +docker network create web 2>/dev/null || true +docker compose up -d +docker compose exec -T caddy caddy reload --config /etc/caddy/Caddyfile 2>/dev/null || true +echo "Deploy complete: hetzner-infra" +if [ -f "$APP_DIR/scripts/sync-claude-services.sh" ]; then + bash "$APP_DIR/scripts/sync-claude-services.sh" +fi +HOOK +chmod +x "$REPO_DIR/hooks/post-receive" + echo "" -echo "Setup complete. On your local machine, run:" -echo " git remote add hetzner root@<server-ip>:$REPO_DIR" -echo " git push hetzner master" -echo "" -echo "Then install hooks:" -echo " ssh root@<server-ip> 'bash /app/infra/scripts/install-hooks.sh'" -echo "" -echo "Then run setup scripts for each app:" -echo " tokyo-livehouse-events/scripts/server-setup.sh" -echo " whois-band/scripts/server-setup.sh" +echo "Next steps:" +echo " 1. git remote add origin root@<server-ip>:$REPO_DIR" +echo " 2. git push origin master" +echo " 3. ssh root@<server-ip> 'bash $APP_DIR/scripts/install.sh'" +echo " (他のリポジトリ作成 + 全フックの正式インストール)" |
