Blog
シリーズ: Astroで個人サイトを作る ・ 第 4 話

Astroで個人サイトを作る #4 GitHubとCloudflare Pagesでデプロイ

本記事は単一プロジェクト構成の連載の 4 話目である。複数サイトを 1 リポジトリで運用したい場合は「Astroモノレポ構成編」を参照のこと。

前回までで Astro サイトの中身は一通り整った。今回は完成したサイトを公開する工程を扱う。GitHub にコードを置き、Cloudflare Pages から自動デプロイする流れを最短ルートで追う。

GitHub リポジトリの作成

ブラウザで github.com/new を開き、次のように設定する。

  • Repository name: my-site
  • Public / Private: どちらでもよい(Cloudflare Pages は両方に対応)
  • Add a README: チェックしない(後で衝突する)

「Create repository」をクリックする。空のリポジトリが作られる。

SSH キーの準備

push 認証は SSH キー方式が一番楽である。一度設定すればパスワードや Personal Access Token を毎回入れる必要がない。

ssh-keygen -t ed25519 -C "your_email@example.com"

「Enter file in which to save the key」「Enter passphrase」と聞かれるが、いずれも空のまま Enter で構わない。

公開鍵を表示してコピーする。

$ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... your_email@example.com

GitHub の Settings → SSH and GPG keys → New SSH key を開き、コピーした内容を貼り付けて保存する。

接続テストする。

$ ssh -T git@github.com
The authenticity of host 'github.com (140.82.xxx.xxx)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
Hi <your-username>! You've successfully authenticated, but GitHub does not provide shell access.

初回のみフィンガープリント確認が入る。yes で進めて問題ない。

ローカルから GitHub に push

my-site/ 内で実行する。Astro CLI が初期化時に git init まで済ませているので、リモートを足して push するだけで済む。

cd my-site
git remote add origin git@github.com:<your-username>/my-site.git
git branch -M main
git push -u origin main

成功すると次のような出力になる。

Enumerating objects: 32, done.
Counting objects: 100% (32/32), done.
Delta compression using up to 10 threads
Compressing objects: 100% (28/28), done.
Writing objects: 100% (32/32), 145.21 KiB | 1.45 MiB/s, done.
Total 32 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
To github.com:<your-username>/my-site.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.

Cloudflare Pages へ接続

Cloudflare ダッシュボードで Workers & Pages → Pages → Create → Connect to Git の順に進む。初回は GitHub アプリのインストールが入り、対象リポジトリへの読み取りアクセスを許可する。

my-site を選び、次のビルド設定を入力する。

項目設定値
Production branchmain
Framework presetAstro
Build commandnpm run build
Build output directorydist
Root directory(空欄)

「Save and Deploy」を押すと初回ビルドが始まる。ログには次のような表示が流れる。

Cloning repository...
Initialized empty Git repository
...
Installing dependencies
Detected the following tools from environment: nodejs@22.12.0, npm@10.9.0
Installing project dependencies: npm clean-install --progress=false
...
Executing user command: npm run build
> astro build
...
[build] 8 page(s) built in 1.18s
[build] Complete!
Finished
Success: Assets published!
Deployment complete!

最後に次のような表示でデプロイ完了になる。

Success! Your project is deployed to Region: Earth
You can preview your project at https://my-site-xxx.pages.dev

https://my-site-xxx.pages.devxxx 部分はランダムな英数字で、プロジェクトごとに自動付与される。これ以降は main ブランチに push するたびに本番デプロイ、それ以外のブランチには「プレビュー URL」が自動で割り振られる。

主要ホスティングの比較

参考までに主要な静的ホスティングを並べると次の通り。

  • Cloudflare Pages: グローバル CDN の Cloudflare ネットワーク上で配信。帯域無制限、ビルド回数の枠も寛容で、無料枠の限界が大きい。Workers と統合しやすい。
  • Vercel: Next.js のメーカーが運営。プレビューデプロイの UX が滑らかで、PR ごとに固有 URL が払い出される。Astro 向けのアダプタも公式に揃っている。
  • Netlify: 老舗。フォーム、A/B、Edge Function、Identity などプラットフォーム機能が広い。
  • GitHub Pages: GitHub 上のリポジトリから直接配信。最もシンプルで、外部サービスの登録が要らない。ビルド時間や成果物サイズに制限がある。

ブログを「コミットしたら自動で公開され続ける」状態にするだけなら、上記のどれを選んでも実現できる。判断軸を一つだけ挙げるなら、「将来エッジ関数を足したくなる可能性」だろう。

GitHub Actions で自前 CI を組む場合

Cloudflare Pages の Git 連携デプロイは便利だが、ビルド前にテスト・lint を強制したい場合は GitHub Actions を使うのも一案である。

name: deploy
on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22.12.0
          cache: npm
      - run: npm ci
      - run: npx astro check
      - run: npm run build
      - uses: cloudflare/pages-action@v1
        with:
          apiToken: ${{ secrets.CF_API_TOKEN }}
          accountId: ${{ secrets.CF_ACCOUNT_ID }}
          projectName: my-site
          directory: dist

ポイントは三点。npm ci で lockfile を尊重したインストールを行い、ローカルと依存ツリーを揃える。npx astro check を CI に組み込み、.astro ファイルや frontmatter スキーマの違反を本番に出さない。API トークンと Account ID は GitHub Secrets に置き、コードに直接書かない。

環境変数とシークレットの扱い

Astro は .env ファイルを読む。クライアントに露出してよい変数は PUBLIC_ プレフィックスを付ける。たとえば PUBLIC_GA_ID=... のように書くとブラウザ側のコードからも import.meta.env.PUBLIC_GA_ID で参照できる。

ホスティング側で設定する環境変数も同じ命名規約に従う。Cloudflare Pages なら Settings → Variables and Secrets で本番とプレビューを分けて設定できる。プレビュー側だけ別の Analytics ID を入れる、といった運用が定番である。

次回に向けて

ここまでで、サイトをインターネット上に出すところまでたどり着いた。最後の回では独自ドメインの取得と DNS 設定、HTTPS 化、リダイレクト戦略まで含めて「自分の住所を持つ」工程を扱う。