|
| 1 | +# installer 配信ホスティング仕様 |
| 2 | + |
| 3 | +`install.sh`(ワンライナー installer, PLAN31_1)を短いカスタムドメイン URL で |
| 4 | +配信するためのホスティング仕様。plan §8 の未決事項「正規ホスティング」をここで |
| 5 | +確定する。対象は devbase メンテナ(インフラ/リリース担当)。 |
| 6 | + |
| 7 | +## 1. 目的とスコープ |
| 8 | + |
| 9 | +- `curl -fsSL <URL> | bash` で実行する静的ファイル `install.sh` を、安定した |
| 10 | + 短い HTTPS URL で配信する。 |
| 11 | +- 配信 URL を `https://raw.githubusercontent.com/devbasex/devbase/main/install.sh` |
| 12 | + (約 73 文字)から `https://dl.basex.jp/install.sh`(約 33 文字)へ短縮する。 |
| 13 | +- スコープ外: installer 自体の挙動(`issues/PLAN31_1_devbase-installer.md` 参照)。 |
| 14 | + |
| 15 | +## 2. 決定事項 |
| 16 | + |
| 17 | +| 項目 | 決定 | |
| 18 | +|---|---| |
| 19 | +| ホスティング | **GitHub Pages**(devbasex/devbase リポジトリ) | |
| 20 | +| カスタムドメイン | **`dl.basex.jp`** | |
| 21 | +| 配信 URL | **`https://dl.basex.jp/install.sh`** | |
| 22 | +| ドメインレジストラ | お名前.com(basex.jp) | |
| 23 | +| DNS | お名前.com DNS(`01〜04.dnsv.jp`)に `dl` の CNAME | |
| 24 | +| 月額コスト | **$0**(GitHub Pages 無料枠) | |
| 25 | +| 配信方式 | GitHub Actions で `install.sh` のみを Pages 公開(single source of truth) | |
| 26 | + |
| 27 | +### 2.1 なぜ GitHub Pages か(コスト比較) |
| 28 | + |
| 29 | +| 選択肢 | 月額 | 帯域 | 手間 | 備考 | |
| 30 | +|---|---|---|---|---| |
| 31 | +| **GitHub Pages** | **$0** | 100GB/月(ソフト) | 最小 | install.sh が既に repo にある | |
| 32 | +| Cloudflare Pages | $0 | 無制限 | 中 | DNS を Cloudflare へ寄せる前提 | |
| 33 | +| S3 + CloudFront | 実質 $0〜 | CloudFront always-free 1TB/10M req | 大 | Route53 利用時 +$0.50/月・運用増 | |
| 34 | + |
| 35 | +installer 程度のトラフィックでは GitHub Pages の無料枠で十分。`install.sh` が |
| 36 | +リポジトリにあるため二重管理が不要で、運用が最も軽い。出典は本書末尾参照。 |
| 37 | + |
| 38 | +## 3. アーキテクチャ |
| 39 | + |
| 40 | +```mermaid |
| 41 | +flowchart LR |
| 42 | + U["ユーザー<br/>curl -fsSL https://dl.basex.jp/install.sh | bash"] |
| 43 | + R[".jp レジストリ"] |
| 44 | + O["お名前.com DNS<br/>01〜04.dnsv.jp"] |
| 45 | + GP["GitHub Pages<br/>185.199.108-111.153"] |
| 46 | + F["install.sh<br/>(devbasex/devbase)"] |
| 47 | +
|
| 48 | + U -->|"1. 名前解決"| R |
| 49 | + R -->|"basex.jp を委譲"| O |
| 50 | + O -->|"2. dl.basex.jp CNAME → devbasex.github.io"| GP |
| 51 | + GP -->|"3. /install.sh を HTTPS で配信"| F |
| 52 | + F -->|"4. 本文を bash に渡す"| U |
| 53 | +``` |
| 54 | + |
| 55 | +## 4. DNS 仕様(お名前.com) |
| 56 | + |
| 57 | +| 種別 | ホスト | 値 | 用途 | |
| 58 | +|---|---|---|---| |
| 59 | +| CNAME | `dl` | `devbasex.github.io.` | Pages へのルーティング | |
| 60 | +| TXT | `_github-pages-challenge-devbasex` | GitHub 発行トークン | ドメイン検証(乗っ取り防止・任意だが推奨) | |
| 61 | + |
| 62 | +- basex.jp のネームサーバーは `01.dnsv.jp`〜`04.dnsv.jp`(お名前.com の DNS レコード |
| 63 | + 設定用サーバー)。NS 変更は不要。 |
| 64 | +- **お名前.com には CNAME/TXT を操作する公式 REST API は無い**。レコード設定は |
| 65 | + Navi の Web 画面のみ(ダイナミック DNS は A レコード専用で本用途に使えない)。 |
| 66 | + IaC で DNS を回したい場合は NS を Cloudflare DNS(無料・API あり)または |
| 67 | + Route53($0.50/月)へ委譲する必要がある(本書では採用しない)。 |
| 68 | +- 反映には時間がかかる場合がある。ゾーン未活性時は権威サーバーが `REFUSED` |
| 69 | + (SOA を含む全レコードが lame delegation)を返すため、レコード追加後は |
| 70 | + 「設定する」まで完走し、伝播を待って §8 のコマンドで確認する。 |
| 71 | + |
| 72 | +## 5. GitHub Pages 配信仕様 |
| 73 | + |
| 74 | +### 5.1 方針 |
| 75 | + |
| 76 | +- リポジトリ全体を Pages で晒さないよう、**GitHub Actions で `install.sh` のみ**を |
| 77 | + 成果物(artifact)として公開する。`install.sh` はリポジトリ root の 1 ファイルが |
| 78 | + 正本(single source of truth)であり、Pages 用に複製しない。 |
| 79 | +- 成果物に `CNAME`(内容 `dl.basex.jp`)を含め、custom domain を固定する。 |
| 80 | +- ルート(`/`)には簡単な案内 HTML を置く(任意)。 |
| 81 | + |
| 82 | +### 5.2 配信ワークフロー(`.github/workflows/pages.yml`) |
| 83 | + |
| 84 | +```mermaid |
| 85 | +flowchart TD |
| 86 | + A["push to main<br/>(install.sh 変更時)"] --> B["checkout"] |
| 87 | + B --> C["_site/ 組み立て<br/>install.sh / CNAME / index.html"] |
| 88 | + C --> D["upload-pages-artifact"] |
| 89 | + D --> E["deploy-pages"] |
| 90 | + E --> F["https://dl.basex.jp/install.sh 更新"] |
| 91 | +``` |
| 92 | + |
| 93 | +要点: |
| 94 | + |
| 95 | +- トリガ: `push`(`paths: [install.sh, .github/workflows/pages.yml]`)+ `workflow_dispatch`。 |
| 96 | +- 権限: `pages: write` / `id-token: write` / `contents: read`。 |
| 97 | +- 並行制御: `concurrency: { group: pages, cancel-in-progress: true }`。 |
| 98 | +- `_site/` に `install.sh` をコピーし、`CNAME` に `dl.basex.jp` を書き出す。 |
| 99 | + |
| 100 | +### 5.3 HTTPS |
| 101 | + |
| 102 | +- GitHub Pages が Let's Encrypt 証明書を自動発行・更新する。 |
| 103 | +- custom domain 設定後、証明書が発行され次第 **Enforce HTTPS** を有効化する。 |
| 104 | +- 証明書発行前は `dl.basex.jp` への HTTPS アクセスが cert 不一致になるため、 |
| 105 | + custom domain 登録 → 発行待ち(数分〜)→ Enforce の順で進める。 |
| 106 | + |
| 107 | +## 6. 初回セットアップ手順 |
| 108 | + |
| 109 | +```mermaid |
| 110 | +flowchart TD |
| 111 | + D["1. お名前.com: dl CNAME 追加"] --> M["2. install.sh を main へ (PR #47 マージ)"] |
| 112 | + M --> W["3. pages.yml デプロイ実行"] |
| 113 | + W --> C["4. custom domain = dl.basex.jp 登録"] |
| 114 | + C --> H["5. 証明書発行待ち → Enforce HTTPS"] |
| 115 | + H --> V["6. URL 動作確認"] |
| 116 | + V --> U["7. README/docs/install.sh の URL 更新"] |
| 117 | +``` |
| 118 | + |
| 119 | +| # | 作業 | 実施者 | 方法 | |
| 120 | +|---|---|---|---| |
| 121 | +| 1 | `dl` CNAME 追加 | メンテナ | お名前.com Navi(API 不可) | |
| 122 | +| 2 | `install.sh` を main へ | メンテナ | PR #47 をマージ | |
| 123 | +| 3 | Pages 有効化・デプロイ | 自動/CLI | Actions 実行、または `gh api -X POST repos/devbasex/devbase/pages -f build_type=workflow` | |
| 124 | +| 4 | custom domain 登録 | CLI/UI | `gh api -X PUT repos/devbasex/devbase/pages -f cname=dl.basex.jp` または Settings→Pages | |
| 125 | +| 5 | Enforce HTTPS | CLI/UI | 証明書発行後に `https_enforced=true` | |
| 126 | +| 6 | 動作確認 | 任意 | §8 のコマンド | |
| 127 | +| 7 | URL 更新 | メンテナ | README / docs / install.sh のコメント | |
| 128 | + |
| 129 | +URL 更新(#7)は **配信が生きてから**行う。先に書くと一時的に 404 になる。 |
| 130 | + |
| 131 | +## 7. 更新・運用フロー |
| 132 | + |
| 133 | +- `install.sh` を変更して main にマージすると、`pages.yml` が走り `dl.basex.jp` の |
| 134 | + 配信が自動更新される(手動の cache invalidation 不要)。 |
| 135 | +- 正本はリポジトリ root の `install.sh` の 1 つだけ。Pages 用コピーは作らない。 |
| 136 | +- ドメイン検証 TXT を入れておくと、サブドメイン乗っ取り(dangling DNS)を防げる。 |
| 137 | + |
| 138 | +## 8. 検証コマンド |
| 139 | + |
| 140 | +```bash |
| 141 | +# DNS: CNAME が devbasex.github.io を指すか |
| 142 | +curl -fsS 'https://dns.google/resolve?name=dl.basex.jp&type=CNAME' |
| 143 | + |
| 144 | +# 配信: install.sh が 200 で取得でき、HTTPS 証明書が一致するか |
| 145 | +curl -fsSL -o /dev/null -w 'HTTP %{http_code} ssl_verify=%{ssl_verify_result}\n' \ |
| 146 | + https://dl.basex.jp/install.sh |
| 147 | + |
| 148 | +# 中身の先頭確認 |
| 149 | +curl -fsSL https://dl.basex.jp/install.sh | head -20 |
| 150 | +``` |
| 151 | + |
| 152 | +- DNS 成功時は `Status:0` で `data` が `devbasex.github.io.`。 |
| 153 | +- 配信成功時は `HTTP 200` かつ `ssl_verify=0`。 |
| 154 | + |
| 155 | +## 9. セキュリティ |
| 156 | + |
| 157 | +- 配信は HTTPS 強制(Enforce HTTPS)。`curl -fsSL` の `-f` で HTTP エラーを fail させる。 |
| 158 | +- ドメイン検証 TXT で dangling DNS による乗っ取りを防止する。 |
| 159 | +- `curl | bash` の一般的注意(実行前にスクリプトを確認する代替手順)は |
| 160 | + README / getting-started に記載済み。 |
| 161 | +- installer 自身の安全策(前提チェック・REF サニタイズ・誤上書き防止)は |
| 162 | + `issues/PLAN31_1_devbase-installer.md` を参照。 |
| 163 | + |
| 164 | +## 10. 既知の制約・代替 |
| 165 | + |
| 166 | +- お名前.com の DNS は公式 API が無く手動運用。DNS を IaC 化したい場合は |
| 167 | + Cloudflare DNS(無料)/ Route53($0.50/月)への委譲を検討する。 |
| 168 | +- 帯域が 100GB/月を大きく超える見込みになった場合は、帯域無制限の |
| 169 | + Cloudflare Pages への移行を検討する(URL・配信方式は据え置き可能)。 |
| 170 | + |
| 171 | +## 11. ステータス |
| 172 | + |
| 173 | +- DNS(`dl.basex.jp` CNAME): **設定済み・確認済み**(GitHub Pages IP に解決)。 |
| 174 | +- GitHub Pages 有効化 / custom domain / Enforce HTTPS: **未(§6 の #3〜#5)**。 |
| 175 | +- URL 更新(README/docs/install.sh): **配信開始後に実施**。 |
| 176 | + |
| 177 | +## 12. 出典 |
| 178 | + |
| 179 | +- [Amazon CloudFront Pricing](https://aws.amazon.com/cloudfront/pricing/) |
| 180 | +- [GitHub Pages limits](https://docs.github.com/en/pages/getting-started-with-github-pages/github-pages-limits) |
| 181 | +- [Securing your GitHub Pages site with HTTPS](https://docs.github.com/en/pages/getting-started-with-github-pages/securing-your-github-pages-site-with-https) |
| 182 | +- [Cloudflare Pages limits](https://developers.cloudflare.com/pages/platform/limits/) |
| 183 | +- [お名前.com DNSレコード設定ガイド](https://www.onamae.com/guide/p/70) |
0 commit comments