summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryyamashita <yyamashita@hetzner.yyamashita.com>2026-05-17 11:18:12 +0900
committeryyamashita <yyamashita@hetzner.yyamashita.com>2026-05-17 11:18:12 +0900
commitb6efad84b51c6df5f595683d66b855c75bddabc4 (patch)
treeb12d164613032105a05e871f7b2e0871b51ea658
parentfa882598d3ee6bff4e32892a81b6b2712eb8c11d (diff)
Centralize repo and hook management: add repos.txt and install.sh
All bare repo creation is now driven by repos.txt in this repo. install.sh replaces install-hooks.sh and handles both repo creation and hook deployment. Other repos' server-setup.sh no longer manage bare repos or hooks. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-rw-r--r--Deploy.md33
-rw-r--r--repos.txt6
-rwxr-xr-xscripts/install.sh (renamed from scripts/install-hooks.sh)30
-rw-r--r--scripts/server-setup.sh42
4 files changed, 79 insertions, 32 deletions
diff --git a/Deploy.md b/Deploy.md
index a03b2a3..5faaf67 100644
--- a/Deploy.md
+++ b/Deploy.md
@@ -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 " (他のリポジトリ作成 + 全フックの正式インストール)"