Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,5 @@ jobs:
with:
scandir: ./bin
severity: error
- name: Run ShellCheck on install.sh
run: shellcheck --severity=error install.sh
54 changes: 54 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Deploy installer to Pages

# install.sh を GitHub Pages (dl.basex.jp) で配信する。
# 配信仕様: docs/developer/installer-hosting.md
# リポジトリ全体は晒さず、install.sh のみを成果物として公開する。

on:
push:
branches: [main]
paths:
- install.sh
- .github/workflows/pages.yml
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages
cancel-in-progress: true

jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v4
- name: Assemble site (install.sh only)
run: |
mkdir -p _site
cp install.sh _site/install.sh
echo 'dl.basex.jp' > _site/CNAME
cat > _site/index.html <<'HTML'
<!doctype html>
<html lang="ja">
<head><meta charset="utf-8"><title>devbase installer</title></head>
<body style="font-family:system-ui;max-width:42rem;margin:3rem auto;padding:0 1rem">
<h1>devbase installer</h1>
<p>ワンライナーインストール:</p>
<pre><code>curl -fsSL https://dl.basex.jp/install.sh | bash</code></pre>
<p>ソース: <a href="https://github.com/devbasex/devbase">github.com/devbasex/devbase</a></p>
</body>
</html>
HTML
- uses: actions/configure-pages@v5
- uses: actions/upload-pages-artifact@v3
with:
path: _site
- id: deployment
uses: actions/deploy-pages@v4
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,18 @@
## [Unreleased]

### Added
- **ワンライナー installer (`install.sh`) を新設**しました (PLAN31_1)。
`curl -fsSL https://raw.githubusercontent.com/devbasex/devbase/main/install.sh | bash`
で `~/devbase` への clone(既存なら `git pull --ff-only`)と `devbase init` まで
自動完了します(uv の自動導入・PATH/補完の登録・`plugins.yml` 生成を含む)。
- 配置先 / clone 元 / ref を `DEVBASE_INSTALL_DIR` / `DEVBASE_INSTALL_REPO` /
`DEVBASE_INSTALL_REF` で上書きできます。`DEVBASE_INSTALL_REF` は branch/tag 名
として妥当な文字のみ許可し、オプション注入を防ぎます。
- 非 TTY (`curl | bash`) で対話プロンプトを出しません。`env init` は対話必須のため
実行せず、完了後に次の手順(`shell-rc` 再読み込み / `plugin install` / `env init`
/ `build` / `up` / `login`)を案内します。
- 配置先が devbase 以外の非空ディレクトリの場合は誤上書きを避けて中止します。
- CI に `install.sh` の ShellCheck (`severity=error`) を追加しました。
- **`devbase list` の対話選択を TUI 化**しました。`questionary` 導入により、↑↓ の
矢印キーで行移動、文字入力でプロジェクト名のインクリメンタル絞り込みができます
(全項目に通し番号を表示)。Enter で決定、Ctrl-C で中止します。
Expand Down
34 changes: 34 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,40 @@ devbaseは、Docker Composeを使った再現性の高い開発環境を提供

## クイックスタート

### ワンライナーインストール(推奨)

```bash
curl -fsSL https://raw.githubusercontent.com/devbasex/devbase/main/install.sh | bash
```

`~/devbase` に clone(既存なら更新)し、`devbase init` まで自動実行します(uv の自動導入・PATH/補完の登録・`plugins.yml` 生成を含む)。**新しく開くターミナルでは自動で有効**です。

**いま開いている端末で即使う**なら、末尾に `&& source "$(~/devbase/bin/devbase shell-rc)"` を付けます(`&&` 以降は呼び出し元シェルで実行されるため、その場で PATH が通ります)。配置先を `DEVBASE_INSTALL_DIR` で変えた場合は同パスに合わせてください。

環境変数で挙動を上書きできます。

| 変数 | 既定値 | 用途 |
|------|--------|------|
| `DEVBASE_INSTALL_DIR` | `$HOME/devbase` | 配置先ディレクトリ |
| `DEVBASE_INSTALL_REPO` | `https://github.com/devbasex/devbase.git` | clone 元(fork / テスト用) |
| `DEVBASE_INSTALL_REF` | `main` | チェックアウトする branch / tag |

```bash
# 例: 別ディレクトリへ特定タグを入れる(パイプではなく保存実行でも env は同様に効きます)
DEVBASE_INSTALL_DIR=~/work/devbase DEVBASE_INSTALL_REF=v1.2.3 \
bash -c "$(curl -fsSL https://raw.githubusercontent.com/devbasex/devbase/main/install.sh)"
```

> **⚠ `curl | bash` を実行する前に**: 中身を確認したい場合は、いったん保存してから実行してください。
>
> ```bash
> curl -fsSL https://raw.githubusercontent.com/devbasex/devbase/main/install.sh -o install.sh
> less install.sh # 内容を確認
> bash install.sh
> ```

### 手動セットアップ

```bash
# 1. クローンと初期化
git clone https://github.com/devbasex/devbase.git
Expand Down
183 changes: 183 additions & 0 deletions docs/developer/installer-hosting.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
# installer 配信ホスティング仕様

`install.sh`(ワンライナー installer, PLAN31_1)を短いカスタムドメイン URL で
配信するためのホスティング仕様。plan §8 の未決事項「正規ホスティング」をここで
確定する。対象は devbase メンテナ(インフラ/リリース担当)。

## 1. 目的とスコープ

- `curl -fsSL <URL> | bash` で実行する静的ファイル `install.sh` を、安定した
短い HTTPS URL で配信する。
- 配信 URL を `https://raw.githubusercontent.com/devbasex/devbase/main/install.sh`
(約 73 文字)から `https://dl.basex.jp/install.sh`(約 33 文字)へ短縮する。
- スコープ外: installer 自体の挙動(`issues/PLAN31_1_devbase-installer.md` 参照)。

## 2. 決定事項

| 項目 | 決定 |
|---|---|
| ホスティング | **GitHub Pages**(devbasex/devbase リポジトリ) |
| カスタムドメイン | **`dl.basex.jp`** |
| 配信 URL | **`https://dl.basex.jp/install.sh`** |
| ドメインレジストラ | お名前.com(basex.jp) |
| DNS | お名前.com DNS(`01〜04.dnsv.jp`)に `dl` の CNAME |
| 月額コスト | **$0**(GitHub Pages 無料枠) |
| 配信方式 | GitHub Actions で `install.sh` のみを Pages 公開(single source of truth) |

### 2.1 なぜ GitHub Pages か(コスト比較)

| 選択肢 | 月額 | 帯域 | 手間 | 備考 |
|---|---|---|---|---|
| **GitHub Pages** | **$0** | 100GB/月(ソフト) | 最小 | install.sh が既に repo にある |
| Cloudflare Pages | $0 | 無制限 | 中 | DNS を Cloudflare へ寄せる前提 |
| S3 + CloudFront | 実質 $0〜 | CloudFront always-free 1TB/10M req | 大 | Route53 利用時 +$0.50/月・運用増 |

installer 程度のトラフィックでは GitHub Pages の無料枠で十分。`install.sh` が
リポジトリにあるため二重管理が不要で、運用が最も軽い。出典は本書末尾参照。

## 3. アーキテクチャ

```mermaid
flowchart LR
U["ユーザー<br/>curl -fsSL https://dl.basex.jp/install.sh | bash"]
R[".jp レジストリ"]
O["お名前.com DNS<br/>01〜04.dnsv.jp"]
GP["GitHub Pages<br/>185.199.108-111.153"]
F["install.sh<br/>(devbasex/devbase)"]

U -->|"1. 名前解決"| R
R -->|"basex.jp を委譲"| O
O -->|"2. dl.basex.jp CNAME → devbasex.github.io"| GP
GP -->|"3. /install.sh を HTTPS で配信"| F
F -->|"4. 本文を bash に渡す"| U
```

## 4. DNS 仕様(お名前.com)

| 種別 | ホスト | 値 | 用途 |
|---|---|---|---|
| CNAME | `dl` | `devbasex.github.io.` | Pages へのルーティング |
| TXT | `_github-pages-challenge-devbasex` | GitHub 発行トークン | ドメイン検証(乗っ取り防止・任意だが推奨) |

- basex.jp のネームサーバーは `01.dnsv.jp`〜`04.dnsv.jp`(お名前.com の DNS レコード
設定用サーバー)。NS 変更は不要。
- **お名前.com には CNAME/TXT を操作する公式 REST API は無い**。レコード設定は
Navi の Web 画面のみ(ダイナミック DNS は A レコード専用で本用途に使えない)。
IaC で DNS を回したい場合は NS を Cloudflare DNS(無料・API あり)または
Route53($0.50/月)へ委譲する必要がある(本書では採用しない)。
- 反映には時間がかかる場合がある。ゾーン未活性時は権威サーバーが `REFUSED`
(SOA を含む全レコードが lame delegation)を返すため、レコード追加後は
「設定する」まで完走し、伝播を待って §8 のコマンドで確認する。

## 5. GitHub Pages 配信仕様

### 5.1 方針

- リポジトリ全体を Pages で晒さないよう、**GitHub Actions で `install.sh` のみ**を
成果物(artifact)として公開する。`install.sh` はリポジトリ root の 1 ファイルが
正本(single source of truth)であり、Pages 用に複製しない。
- 成果物に `CNAME`(内容 `dl.basex.jp`)を含め、custom domain を固定する。
- ルート(`/`)には簡単な案内 HTML を置く(任意)。

### 5.2 配信ワークフロー(`.github/workflows/pages.yml`)

```mermaid
flowchart TD
A["push to main<br/>(install.sh 変更時)"] --> B["checkout"]
B --> C["_site/ 組み立て<br/>install.sh / CNAME / index.html"]
C --> D["upload-pages-artifact"]
D --> E["deploy-pages"]
E --> F["https://dl.basex.jp/install.sh 更新"]
```

要点:

- トリガ: `push`(`paths: [install.sh, .github/workflows/pages.yml]`)+ `workflow_dispatch`。
- 権限: `pages: write` / `id-token: write` / `contents: read`。
- 並行制御: `concurrency: { group: pages, cancel-in-progress: true }`。
- `_site/` に `install.sh` をコピーし、`CNAME` に `dl.basex.jp` を書き出す。

### 5.3 HTTPS

- GitHub Pages が Let's Encrypt 証明書を自動発行・更新する。
- custom domain 設定後、証明書が発行され次第 **Enforce HTTPS** を有効化する。
- 証明書発行前は `dl.basex.jp` への HTTPS アクセスが cert 不一致になるため、
custom domain 登録 → 発行待ち(数分〜)→ Enforce の順で進める。

## 6. 初回セットアップ手順

```mermaid
flowchart TD
D["1. お名前.com: dl CNAME 追加"] --> M["2. install.sh を main へ (PR #47 マージ)"]
M --> W["3. pages.yml デプロイ実行"]
W --> C["4. custom domain = dl.basex.jp 登録"]
C --> H["5. 証明書発行待ち → Enforce HTTPS"]
H --> V["6. URL 動作確認"]
V --> U["7. README/docs/install.sh の URL 更新"]
```

| # | 作業 | 実施者 | 方法 |
|---|---|---|---|
| 1 | `dl` CNAME 追加 | メンテナ | お名前.com Navi(API 不可) |
| 2 | `install.sh` を main へ | メンテナ | PR #47 をマージ |
| 3 | Pages 有効化・デプロイ | 自動/CLI | Actions 実行、または `gh api -X POST repos/devbasex/devbase/pages -f build_type=workflow` |
| 4 | custom domain 登録 | CLI/UI | `gh api -X PUT repos/devbasex/devbase/pages -f cname=dl.basex.jp` または Settings→Pages |
| 5 | Enforce HTTPS | CLI/UI | 証明書発行後に `https_enforced=true` |
| 6 | 動作確認 | 任意 | §8 のコマンド |
| 7 | URL 更新 | メンテナ | README / docs / install.sh のコメント |

URL 更新(#7)は **配信が生きてから**行う。先に書くと一時的に 404 になる。

## 7. 更新・運用フロー

- `install.sh` を変更して main にマージすると、`pages.yml` が走り `dl.basex.jp` の
配信が自動更新される(手動の cache invalidation 不要)。
- 正本はリポジトリ root の `install.sh` の 1 つだけ。Pages 用コピーは作らない。
- ドメイン検証 TXT を入れておくと、サブドメイン乗っ取り(dangling DNS)を防げる。

## 8. 検証コマンド

```bash
# DNS: CNAME が devbasex.github.io を指すか
curl -fsS 'https://dns.google/resolve?name=dl.basex.jp&type=CNAME'

# 配信: install.sh が 200 で取得でき、HTTPS 証明書が一致するか
curl -fsSL -o /dev/null -w 'HTTP %{http_code} ssl_verify=%{ssl_verify_result}\n' \
https://dl.basex.jp/install.sh

# 中身の先頭確認
curl -fsSL https://dl.basex.jp/install.sh | head -20
```

- DNS 成功時は `Status:0` で `data` が `devbasex.github.io.`。
- 配信成功時は `HTTP 200` かつ `ssl_verify=0`。

## 9. セキュリティ

- 配信は HTTPS 強制(Enforce HTTPS)。`curl -fsSL` の `-f` で HTTP エラーを fail させる。
- ドメイン検証 TXT で dangling DNS による乗っ取りを防止する。
- `curl | bash` の一般的注意(実行前にスクリプトを確認する代替手順)は
README / getting-started に記載済み。
- installer 自身の安全策(前提チェック・REF サニタイズ・誤上書き防止)は
`issues/PLAN31_1_devbase-installer.md` を参照。

## 10. 既知の制約・代替

- お名前.com の DNS は公式 API が無く手動運用。DNS を IaC 化したい場合は
Cloudflare DNS(無料)/ Route53($0.50/月)への委譲を検討する。
- 帯域が 100GB/月を大きく超える見込みになった場合は、帯域無制限の
Cloudflare Pages への移行を検討する(URL・配信方式は据え置き可能)。

## 11. ステータス

- DNS(`dl.basex.jp` CNAME): **設定済み・確認済み**(GitHub Pages IP に解決)。
- GitHub Pages 有効化 / custom domain / Enforce HTTPS: **未(§6 の #3〜#5)**。
- URL 更新(README/docs/install.sh): **配信開始後に実施**。

## 12. 出典

- [Amazon CloudFront Pricing](https://aws.amazon.com/cloudfront/pricing/)
- [GitHub Pages limits](https://docs.github.com/en/pages/getting-started-with-github-pages/github-pages-limits)
- [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)
- [Cloudflare Pages limits](https://developers.cloudflare.com/pages/platform/limits/)
- [お名前.com DNSレコード設定ガイド](https://www.onamae.com/guide/p/70)
38 changes: 38 additions & 0 deletions docs/user/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,44 @@ devbase を利用するには、以下のソフトウェアがホストマシン

> **Note:** Docker Desktop を使用している場合、Docker Engine と Docker Compose の両方が含まれています。Linux では Docker Engine を直接インストールし、Docker Compose プラグインを追加してください。

## クイックインストール(ワンライナー)

手順 1〜2(クローンと初期化)を 1 コマンドで自動化できます。`git` と `curl` があれば実行できます。

```bash
curl -fsSL https://raw.githubusercontent.com/devbasex/devbase/main/install.sh | bash
```

このコマンドは次を行います。

1. `~/devbase` に devbase を clone します(既に devbase が clone 済みなら `git pull --ff-only` で更新)。
2. clone 先で `devbase init` を 1 回実行します(uv の自動導入・PATH/補完の登録・`plugins.yml` 生成を含む)。
3. 完了後、シェル再読み込み(手順 3)以降の次の手順を表示します。**新しく開くターミナルでは自動で有効**です。

**いま開いている端末で即使う**なら、末尾に `&& source "$(~/devbase/bin/devbase shell-rc)"` を付けます(`&&` 以降は呼び出し元シェルで実行されるため、その場で PATH が通ります)。

`env init`(手順 7)は対話が必要なため、ワンライナーでは**実行せず案内のみ**です。完了後に手動で実行してください。配置先を `DEVBASE_INSTALL_DIR` で変えた場合は、`~/devbase/...` を同じパスに合わせてください。

環境変数で挙動を上書きできます。

| 変数 | 既定値 | 用途 |
|------|--------|------|
| `DEVBASE_INSTALL_DIR` | `$HOME/devbase` | 配置先ディレクトリ |
| `DEVBASE_INSTALL_REPO` | `https://github.com/devbasex/devbase.git` | clone 元(fork / テスト用) |
| `DEVBASE_INSTALL_REF` | `main` | チェックアウトする branch / tag |

> **既存ディレクトリの扱い**: 配置先が devbase 以外の非空ディレクトリだった場合、誤上書きを避けるためスクリプトは中止します。別の場所に入れるには `DEVBASE_INSTALL_DIR=/path/to/dir` を指定してください。

> **⚠ `curl | bash` を実行する前に**: 信頼できないスクリプトをそのままパイプ実行するのが不安な場合は、保存して内容を確認してから実行してください。
>
> ```bash
> curl -fsSL https://raw.githubusercontent.com/devbasex/devbase/main/install.sh -o install.sh
> less install.sh # 内容を確認
> bash install.sh
> ```

ワンライナーを使わず手動で進める場合は、以下の手順に従ってください。

## セットアップ手順

### 1. リポジトリのクローン
Expand Down
Loading
Loading