NextChat (ChatGPTNextWeb) を Cloudflare Pages に、GitHub Actions + Terraform で デプロイ/運用するための構成一式です。
.github/workflows/deploy.yml # main push で build → deploy を自動実行
terraform/
providers.tf # cloudflare / github プロバイダ
variables.tf # 入力変数
main.tf # Cloudflare Pagesプロジェクト(Direct Upload)
github_secrets.tf # ★ GitHub Secrets / Variables を自動投入
outputs.tf
terraform.tfvars.example
- Terraform を 1回
applyすれば、Cloudflare Pages プロジェクトの作成と、 GitHub Actions が必要とする Secrets(CLOUDFLARE_API_TOKENなど)・Variables の 登録まで自動化されます。ダッシュボードで手動コピペする作業は不要です。 - ただし その
terraform applyを実行する最初の1回だけ、あなた自身が Cloudflare API Token と GitHub の Personal Access Token(PAT)を用意する必要が あります。この「最初の鍵」はどこかの人間が持たなければならず、完全に人手ゼロには できません(これはTerraform/CI全般に共通する制約です)。 - OpenAI の API キーのような実行時シークレットは、Terraform の state に残さない
ため、
cloudflare_pages_projectには含めず GitHub Actions の中でwrangler pages secret putにより都度同期する設計にしています。
- GitHub の NextChat を Fork する
- 本一式(
.github/workflows/deploy.ymlとterraform/)をForkしたリポジトリに追加してpush - Cloudflare API Token を発行(dash.cloudflare.com → 「Pages 編集」権限を持つカスタムトークン)
- GitHub の Fine-grained PAT を発行 (対象リポジトリに対して Secrets: Read & write / Variables: Read & write / Administration: Read & write 権限)
cd terraform
cp terraform.tfvars.example terraform.tfvars
# terraform.tfvars を編集して各値を埋める(絶対にコミットしない)
terraform init
terraform plan
terraform applyこれで以下が自動的に行われます。
- Cloudflare Pages プロジェクト
nextchatの作成(compatibility flag:nodejs_compat設定済み) - GitHub Secrets 登録:
CLOUDFLARE_API_TOKEN,CLOUDFLARE_ACCOUNT_ID,OPENAI_API_KEY(指定時),OPENAI_ORG_ID(指定時),NEXTCHAT_ACCESS_CODE(指定時) - GitHub Variables 登録:
CF_PAGES_PROJECT_NAME,HIDE_USER_API_KEY,DISABLE_GPT4,ENABLE_BALANCE_QUERY,DISABLE_FAST_LINK
main ブランチに push するか、GitHub上で Actions → Deploy NextChat to Cloudflare Pages →
Run workflow を実行すると、ビルドとデプロイが走ります。
完了後、Terraformの出力 pages_default_domain(https://<project>.pages.dev)でアクセスできます。
- Node.js は
20.1、ビルドコマンドは NextChat 公式ドキュメント推奨のnpx @cloudflare/next-on-pages --experimental-minifyを使用しています (通常のnext buildは既知のnode:bufferバグでPages上では動きません)。 - ロックファイル(
pnpm-lock.yaml/yarn.lock)を見てパッケージマネージャを 自動判定するようにしているので、Fork元のバージョン差異に強くしてあります。 - 独自ドメインを使う場合は
terraform.tfvarsのcustom_domainを設定してください (対象ドメインが同じCloudflareアカウントにゾーンとして存在している必要があります)。 terraform.tfstateには機密値を含む可能性があるため、ローカル保管ではなく リモートバックエンド(Terraform Cloud等)+アクセス制御を推奨します (providers.tfにコメントアウトの雛形あり)。