1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
# 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/<repo>/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@<server> 'bash /app/infra/mail/install.sh'
# → DKIM 鍵生成 + コンテナ起動。公開鍵が表示される。
# Route 53 DNS 設定(サーバー上で実行)
ssh root@<server>
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
export HOSTED_ZONE_ID=Z...
export SERVER_IP=<Hetznerサーバーのパブリック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@<server>
cat > /app/infra/hetzner-admin/.env <<EOF
ADMIN_USER=admin
ADMIN_PASS=<strong-password>
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@<server> 'bash /app/infra/git/install.sh' # post-receive フック更新
# → Caddy が vpn.yyamashita.com の証明書を取得するまで数分待つ
ssh root@<server>
cat > /app/infra/vpn/users.conf <<EOF
user1 <strong-password>
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@<server> 'bash /app/infra/vpn/renew-cert.sh'
# VPN ユーザー追加・変更
ssh root@<server>
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@<server>
vi /app/infra/vpn/users.conf
docker compose -f /app/infra/caddy/docker-compose.yml restart # Caddy 再起動で反映
# DNS 登録(初回のみ。setup-route53.py に proxy が含まれている)
ssh root@<server>
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 と同じユーザー名/パスワード)
|