dbt docs を Cloudflare Pages でホスティングする。
はじめに
dbt が生成するドキュメントを Cloudflare Pages でホスティングする方法を紹介します。
Cloudflare Pages アプリケーションの作成
Cloudflare Pages にログインし、新しいアプリケーションを作成します。
- Create application
- Pages タブを選択
- Connect to Git
- リポジトリの選択
- ビルド設定 (Build は GitHub Actions で行うので、この時点では設定しない)
- Save and Deploy
- Cancel Deployment → Cancel Build
- Continue to project → Continue
ここまで行うと、まだデプロイされていない Cloudflare Pages のアプリケーションが作成されます。
ビルド&デプロイは GitHub Actions で行うので、[プロジェクト名] > Setting > Builds & deployments
から Production branch の自動デプロイを無効にします。
Cloudflare Access の設定
Cloudflare Access を使って、Cloudflare Pages にアクセス制限をかけることができます。Cloudflare Pages の [プロジェクト名] > Manage > Access Policy
の Enable access policy
を有効にすると、Preview Depolyment にアクセス制限がかかります。ただしこれは Preview Depolyment にのみ有効で、Production Depolyment には適用されません。
そこで、Preview Depolyment にもアクセス制限をかけるために、Cloudflare Access を設定します。Access Policy > Manage Polices
から Cloudflare Access にとび、該当のアプリケーションを設定します。[プロジェクト名] - Cloudflare Pages
という命名になっています。
Overview > Application Configuration から Application domain を追加します。+ Add domain
で追加すると、[id].pages.dev
が自動で追加されます。保存すると Preview Depolyment だけでなく、Production Depolyment にもアクセス制限がかかるようになります。
デフォルトでは One-time PIN 認証をできますが、その他の認証方法も設定できます。
GitHub Actions の設定
Cloudflare Pages では自動デプロイを OFF にしているので、GitHub Actions でビルド&デプロイを行います。
2 つのワークフローを作成します。
Push されたときにプレビューデプロイを行うワークフロー
name: Deploy Preview
on:
push:
branches-ignore: [main]
jobs:
preview:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Dependencies
run: dbt deps
- name: Build dbt
run: dbt build
- name: Build dbt docs
run: dbt docs generate
- name: Copy files
run: |
mkdir -p docs
cp -r target/*.json target/index.html docs/
- name: Deploy to Cloudflare Pages (Preview)
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy docs --project-name=${{ secrets.CLOUDFLARE_PAGES_PROJECT_NAME }}
-
CLOUDFLARE_API_TOKEN
は Cloudflare API トークンです。
https://developers.cloudflare.com/fundamentals/api/get-started/create-token/ -
CLOUDFLARE_ACCOUNT_ID
は Cloudflare アカウント ID です。Cloudflare のダッシュボードの URL に含まれています。 -
CLOUDFLARE_PAGES_PROJECT_NAME
は Cloudflare Pages のプロジェクト名です。 - dbt の profile も適切に設定してください。
このワークフローが起動すると、GitHub の Pull Request に Preview デプロイの URL が表示されます。すごく便利です。
main ブランチにマージされたときに本番デプロイを行うワークフロー
name: Deploy Production
on:
push:
branches: [main]
jobs:
production:
runs-on: ubuntu-latest
permissions:
contents: read
deployments: write
steps:
- uses: actions/checkout@v4
- name: Install Dependencies
run: dbt deps
- name: Build dbt
run: dbt build
- name: Build dbt docs
run: dbt docs generate
- name: Copy files
run: |
mkdir -p docs
cp -r target/*.json target/index.html docs/
- name: Deploy to Cloudflare Pages (Preview)
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy docs --project-name=${{ secrets.CLOUDFLARE_PAGES_PROJECT_NAME }}
jobs 自体は Preview デプロイと同じですが、こちらは main ブランチにマージされたときにのみ実行されるように設定しています。main ブランチが Cloudflare Pages における Production Branch になっている[1]ので、このワークフローが実行されると本番デプロイが行われます。
自分自身は dbt docs をホスティングする以外のことを GitHub Actions で行っているので、ワークフローを分けていますが、push をトリガーにしてまとめてもいいかもしれません。
cloudflare/pages-action
といういかにもなアクションもありますが、cloudflare/wrangler-action
を使っています。
おわりに
今回紹介した方法は個人的には、dbt Cloud、Private GitHub Pages (GitHub Enterprise) の次くらいに簡単な方法だと思っています。ある程度の規模であれば、無料におさまります。
ただ先人たちが S3 や Cloud Run などでホスティングする方法を紹介しているので、それらも参考にしてみてください。
-
[プロジェクト名] > Setting > Builds & deployments > Branch deployment controls から Production branch を確認できます。変更もできます。 ↩︎
Discussion