Skip to content

Commit 74c0236

Browse files
takemi-ohamaclaude
andauthored
feat(install): devbase ワンライナー installer (curl | bash) (PLAN31_1) (#47)
* feat(install): devbase ワンライナー installer (curl | bash) を追加 (PLAN31_1) clone (既存なら git pull --ff-only) して bin/devbase init を 1 回呼ぶ薄い installer を新設。uv 自動導入・PATH/補完登録・plugins.yml 生成・冪等性・ 旧版移行はすべて既存の init に委譲する。 - 前提チェック: git/curl 必須・docker は警告のみ - DEVBASE_INSTALL_DIR/_REPO/_REF で配置先・clone元・ref を上書き可能 - DEVBASE_INSTALL_REF はサニタイズ (オプション注入/メタ文字を拒否) - 既存ディレクトリが devbase 以外の非空なら誤上書きを避けて中止 - 非 TTY (curl|bash) で対話しない。env init は対話必須のため案内のみ - tests/cli/test_install_sh.py: clone/init/冪等pull/中止/git不在/不正REF を検証 - CI に install.sh の ShellCheck (severity=error) を追加 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(install): README から env init の冗長な注記を削除 (PLAN31_1) ワンライナー節の「env init は対話が必要なため案内のみで、自動実行はしません」 は冗長なため削除 (getting-started 側に同旨の記載あり)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(install): ワンライナーに shell-rc の source を統合 (PLAN31_1) `... | bash && source "$(~/devbase/bin/devbase shell-rc)"` の形にして、 インストール直後にその端末で devbase が使えるようにする。`&&` 以降は パイプのサブシェルではなく呼び出し元の対話シェルで実行されるため、 installer 本体を変更せずワンライナーだけで現在のシェルに PATH を通せる。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(install): ワンライナーのヘッドラインを素の1行に短縮 (PLAN31_1) 長さの主因だった URL を 2 度出さないよう、ヘッドラインは `curl ... | bash` の素の 1 行に戻し、現在端末での即時有効化 (`&& source "$(...)"`) はインライン文章で案内する形に変更。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(install): installer 配信ホスティング仕様を追加 (PLAN31_1) plan §8 の未決事項「正規ホスティング」を確定。GitHub Pages + カスタムドメイン dl.basex.jp で https://dl.basex.jp/install.sh を 配信する構成・DNS 仕様(お名前.com は CNAME 用 API 無し)・ Actions 配信方式・初回セットアップ手順・検証コマンド・コスト比較を docs/developer/installer-hosting.md にまとめる。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * ci(pages): install.sh を GitHub Pages (dl.basex.jp) で配信 (PLAN31_1) install.sh のみを成果物として公開する Pages デプロイワークフローを追加。 main への push (install.sh / pages.yml 変更時) で自動デプロイする。 配信仕様: docs/developer/installer-hosting.md Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 54b71a5 commit 74c0236

9 files changed

Lines changed: 798 additions & 0 deletions

File tree

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,5 @@ jobs:
4141
with:
4242
scandir: ./bin
4343
severity: error
44+
- name: Run ShellCheck on install.sh
45+
run: shellcheck --severity=error install.sh

.github/workflows/pages.yml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
name: Deploy installer to Pages
2+
3+
# install.sh を GitHub Pages (dl.basex.jp) で配信する。
4+
# 配信仕様: docs/developer/installer-hosting.md
5+
# リポジトリ全体は晒さず、install.sh のみを成果物として公開する。
6+
7+
on:
8+
push:
9+
branches: [main]
10+
paths:
11+
- install.sh
12+
- .github/workflows/pages.yml
13+
workflow_dispatch:
14+
15+
permissions:
16+
contents: read
17+
pages: write
18+
id-token: write
19+
20+
concurrency:
21+
group: pages
22+
cancel-in-progress: true
23+
24+
jobs:
25+
deploy:
26+
runs-on: ubuntu-latest
27+
environment:
28+
name: github-pages
29+
url: ${{ steps.deployment.outputs.page_url }}
30+
steps:
31+
- uses: actions/checkout@v4
32+
- name: Assemble site (install.sh only)
33+
run: |
34+
mkdir -p _site
35+
cp install.sh _site/install.sh
36+
echo 'dl.basex.jp' > _site/CNAME
37+
cat > _site/index.html <<'HTML'
38+
<!doctype html>
39+
<html lang="ja">
40+
<head><meta charset="utf-8"><title>devbase installer</title></head>
41+
<body style="font-family:system-ui;max-width:42rem;margin:3rem auto;padding:0 1rem">
42+
<h1>devbase installer</h1>
43+
<p>ワンライナーインストール:</p>
44+
<pre><code>curl -fsSL https://dl.basex.jp/install.sh | bash</code></pre>
45+
<p>ソース: <a href="https://github.com/devbasex/devbase">github.com/devbasex/devbase</a></p>
46+
</body>
47+
</html>
48+
HTML
49+
- uses: actions/configure-pages@v5
50+
- uses: actions/upload-pages-artifact@v3
51+
with:
52+
path: _site
53+
- id: deployment
54+
uses: actions/deploy-pages@v4

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@
55
## [Unreleased]
66

77
### Added
8+
- **ワンライナー installer (`install.sh`) を新設**しました (PLAN31_1)。
9+
`curl -fsSL https://raw.githubusercontent.com/devbasex/devbase/main/install.sh | bash`
10+
`~/devbase` への clone(既存なら `git pull --ff-only`)と `devbase init` まで
11+
自動完了します(uv の自動導入・PATH/補完の登録・`plugins.yml` 生成を含む)。
12+
- 配置先 / clone 元 / ref を `DEVBASE_INSTALL_DIR` / `DEVBASE_INSTALL_REPO` /
13+
`DEVBASE_INSTALL_REF` で上書きできます。`DEVBASE_INSTALL_REF` は branch/tag 名
14+
として妥当な文字のみ許可し、オプション注入を防ぎます。
15+
- 非 TTY (`curl | bash`) で対話プロンプトを出しません。`env init` は対話必須のため
16+
実行せず、完了後に次の手順(`shell-rc` 再読み込み / `plugin install` / `env init`
17+
/ `build` / `up` / `login`)を案内します。
18+
- 配置先が devbase 以外の非空ディレクトリの場合は誤上書きを避けて中止します。
19+
- CI に `install.sh` の ShellCheck (`severity=error`) を追加しました。
820
- **`devbase list` の対話選択を TUI 化**しました。`questionary` 導入により、↑↓ の
921
矢印キーで行移動、文字入力でプロジェクト名のインクリメンタル絞り込みができます
1022
(全項目に通し番号を表示)。Enter で決定、Ctrl-C で中止します。

README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,40 @@ devbaseは、Docker Composeを使った再現性の高い開発環境を提供
2020

2121
## クイックスタート
2222

23+
### ワンライナーインストール(推奨)
24+
25+
```bash
26+
curl -fsSL https://raw.githubusercontent.com/devbasex/devbase/main/install.sh | bash
27+
```
28+
29+
`~/devbase` に clone(既存なら更新)し、`devbase init` まで自動実行します(uv の自動導入・PATH/補完の登録・`plugins.yml` 生成を含む)。**新しく開くターミナルでは自動で有効**です。
30+
31+
**いま開いている端末で即使う**なら、末尾に `&& source "$(~/devbase/bin/devbase shell-rc)"` を付けます(`&&` 以降は呼び出し元シェルで実行されるため、その場で PATH が通ります)。配置先を `DEVBASE_INSTALL_DIR` で変えた場合は同パスに合わせてください。
32+
33+
環境変数で挙動を上書きできます。
34+
35+
| 変数 | 既定値 | 用途 |
36+
|------|--------|------|
37+
| `DEVBASE_INSTALL_DIR` | `$HOME/devbase` | 配置先ディレクトリ |
38+
| `DEVBASE_INSTALL_REPO` | `https://github.com/devbasex/devbase.git` | clone 元(fork / テスト用) |
39+
| `DEVBASE_INSTALL_REF` | `main` | チェックアウトする branch / tag |
40+
41+
```bash
42+
# 例: 別ディレクトリへ特定タグを入れる(パイプではなく保存実行でも env は同様に効きます)
43+
DEVBASE_INSTALL_DIR=~/work/devbase DEVBASE_INSTALL_REF=v1.2.3 \
44+
bash -c "$(curl -fsSL https://raw.githubusercontent.com/devbasex/devbase/main/install.sh)"
45+
```
46+
47+
> **`curl | bash` を実行する前に**: 中身を確認したい場合は、いったん保存してから実行してください。
48+
>
49+
> ```bash
50+
> curl -fsSL https://raw.githubusercontent.com/devbasex/devbase/main/install.sh -o install.sh
51+
> less install.sh # 内容を確認
52+
> bash install.sh
53+
> ```
54+
55+
### 手動セットアップ
56+
2357
```bash
2458
# 1. クローンと初期化
2559
git clone https://github.com/devbasex/devbase.git
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
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)

docs/user/getting-started.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,44 @@ devbase を利用するには、以下のソフトウェアがホストマシン
1717

1818
> **Note:** Docker Desktop を使用している場合、Docker Engine と Docker Compose の両方が含まれています。Linux では Docker Engine を直接インストールし、Docker Compose プラグインを追加してください。
1919
20+
## クイックインストール(ワンライナー)
21+
22+
手順 1〜2(クローンと初期化)を 1 コマンドで自動化できます。`git``curl` があれば実行できます。
23+
24+
```bash
25+
curl -fsSL https://raw.githubusercontent.com/devbasex/devbase/main/install.sh | bash
26+
```
27+
28+
このコマンドは次を行います。
29+
30+
1. `~/devbase` に devbase を clone します(既に devbase が clone 済みなら `git pull --ff-only` で更新)。
31+
2. clone 先で `devbase init` を 1 回実行します(uv の自動導入・PATH/補完の登録・`plugins.yml` 生成を含む)。
32+
3. 完了後、シェル再読み込み(手順 3)以降の次の手順を表示します。**新しく開くターミナルでは自動で有効**です。
33+
34+
**いま開いている端末で即使う**なら、末尾に `&& source "$(~/devbase/bin/devbase shell-rc)"` を付けます(`&&` 以降は呼び出し元シェルで実行されるため、その場で PATH が通ります)。
35+
36+
`env init`(手順 7)は対話が必要なため、ワンライナーでは**実行せず案内のみ**です。完了後に手動で実行してください。配置先を `DEVBASE_INSTALL_DIR` で変えた場合は、`~/devbase/...` を同じパスに合わせてください。
37+
38+
環境変数で挙動を上書きできます。
39+
40+
| 変数 | 既定値 | 用途 |
41+
|------|--------|------|
42+
| `DEVBASE_INSTALL_DIR` | `$HOME/devbase` | 配置先ディレクトリ |
43+
| `DEVBASE_INSTALL_REPO` | `https://github.com/devbasex/devbase.git` | clone 元(fork / テスト用) |
44+
| `DEVBASE_INSTALL_REF` | `main` | チェックアウトする branch / tag |
45+
46+
> **既存ディレクトリの扱い**: 配置先が devbase 以外の非空ディレクトリだった場合、誤上書きを避けるためスクリプトは中止します。別の場所に入れるには `DEVBASE_INSTALL_DIR=/path/to/dir` を指定してください。
47+
48+
> **`curl | bash` を実行する前に**: 信頼できないスクリプトをそのままパイプ実行するのが不安な場合は、保存して内容を確認してから実行してください。
49+
>
50+
> ```bash
51+
> curl -fsSL https://raw.githubusercontent.com/devbasex/devbase/main/install.sh -o install.sh
52+
> less install.sh # 内容を確認
53+
> bash install.sh
54+
> ```
55+
56+
ワンライナーを使わず手動で進める場合は、以下の手順に従ってください。
57+
2058
## セットアップ手順
2159
2260
### 1. リポジトリのクローン

0 commit comments

Comments
 (0)