From 97d0933d3428c196e100de00386f98626314c073 Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Thu, 2 Jul 2026 15:34:56 +0900 Subject: [PATCH 01/23] Add files via upload --- nextchat-cf-deploy.zip | Bin 0 -> 10739 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 nextchat-cf-deploy.zip diff --git a/nextchat-cf-deploy.zip b/nextchat-cf-deploy.zip new file mode 100644 index 0000000000000000000000000000000000000000..8217586af31bf64cdd8800458bf5fde0c24271bf GIT binary patch literal 10739 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

tzd}||EE{ou%>_l*uhRHzQQ0bMe+J@k-w@ee z|0J_OTOm^?-z&TP!45=tAQnv*<=51nMuF+S7jE7zY>It~*cEC7fuHnS$J4I{5=93h zO(dVkoT|9rws@=FM|az#YNYUdJl7y}9wkfRM{_xFRj# zyQp4p694c#@v+JrZsRkomo;sM8R>Ry@sNP5Z-`5VBjYsPs&8JN6I(MjXHNGnw(=9t z<6e+DzW790u+@IHID2CXjrzXZu+w3h>hO^%?D_Z4!}q%uTt#{ge7n1Z-n+vq{kH>a zqcHEErpf2mD3zl`+%@nU!fhsWZ0o~n`ekfdKzq^+r!x7L#; zE~CiGfGM};g~nnPIM?zlwoZ>Em4*%v+lS@Oc-wWBCr<@j93o(pB&>!F$Z;z$`lJ+0 z(u9^hH;-0m8!zCEK_{as^E6ILxf1RW{A#8Bfs~ Date: Thu, 2 Jul 2026 15:47:39 +0900 Subject: [PATCH 02/23] Delete nextchat-cf-deploy.zip --- nextchat-cf-deploy.zip | Bin 10739 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 nextchat-cf-deploy.zip diff --git a/nextchat-cf-deploy.zip b/nextchat-cf-deploy.zip deleted file mode 100644 index 8217586af31bf64cdd8800458bf5fde0c24271bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10739 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

tzd}||EE{ou%>_l*uhRHzQQ0bMe+J@k-w@ee z|0J_OTOm^?-z&TP!45=tAQnv*<=51nMuF+S7jE7zY>It~*cEC7fuHnS$J4I{5=93h zO(dVkoT|9rws@=FM|az#YNYUdJl7y}9wkfRM{_xFRj# zyQp4p694c#@v+JrZsRkomo;sM8R>Ry@sNP5Z-`5VBjYsPs&8JN6I(MjXHNGnw(=9t z<6e+DzW790u+@IHID2CXjrzXZu+w3h>hO^%?D_Z4!}q%uTt#{ge7n1Z-n+vq{kH>a zqcHEErpf2mD3zl`+%@nU!fhsWZ0o~n`ekfdKzq^+r!x7L#; zE~CiGfGM};g~nnPIM?zlwoZ>Em4*%v+lS@Oc-wWBCr<@j93o(pB&>!F$Z;z$`lJ+0 z(u9^hH;-0m8!zCEK_{as^E6ILxf1RW{A#8Bfs~ Date: Thu, 2 Jul 2026 15:51:16 +0900 Subject: [PATCH 03/23] Add files via upload --- providers.tf | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 providers.tf diff --git a/providers.tf b/providers.tf new file mode 100644 index 00000000000..97f5368a75f --- /dev/null +++ b/providers.tf @@ -0,0 +1,31 @@ +terraform { + required_version = ">= 1.6.0" + + required_providers { + cloudflare = { + source = "cloudflare/cloudflare" + version = "~> 4.40" + } + github = { + source = "integrations/github" + version = "~> 6.3" + } + } + + # 状態ファイルをローカルに残したくない場合はリモートバックエンドを推奨 + # (例: Cloudflare R2 を backend "s3" 互換で使う、または Terraform Cloud) + # backend "s3" { + # bucket = "your-tfstate-bucket" + # key = "nextchat/terraform.tfstate" + # ... + # } +} + +provider "cloudflare" { + api_token = var.cloudflare_api_token +} + +provider "github" { + token = var.github_token + owner = var.github_owner +} From 4814a1e22529ef9029262fb5f6ceb0715d90fba3 Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Thu, 2 Jul 2026 15:51:51 +0900 Subject: [PATCH 04/23] Rename providers.tf to terraform/providers.tf --- providers.tf => terraform/providers.tf | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename providers.tf => terraform/providers.tf (100%) diff --git a/providers.tf b/terraform/providers.tf similarity index 100% rename from providers.tf rename to terraform/providers.tf From 96eb68d48510527a5c22f76b0d51d7aa428a2b2c Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Thu, 2 Jul 2026 15:52:59 +0900 Subject: [PATCH 05/23] Add files via upload --- terraform/github_secrets.tf | 74 +++++++++++++++++++++ terraform/main.tf | 57 ++++++++++++++++ terraform/outputs.tf | 23 +++++++ terraform/terraform.tfvars.example | 23 +++++++ terraform/variables.tf | 101 +++++++++++++++++++++++++++++ 5 files changed, 278 insertions(+) create mode 100644 terraform/github_secrets.tf create mode 100644 terraform/main.tf create mode 100644 terraform/outputs.tf create mode 100644 terraform/terraform.tfvars.example create mode 100644 terraform/variables.tf diff --git a/terraform/github_secrets.tf b/terraform/github_secrets.tf new file mode 100644 index 00000000000..879bec0ab43 --- /dev/null +++ b/terraform/github_secrets.tf @@ -0,0 +1,74 @@ +############################################ +# GitHub Actions Secrets(暗号化されリポジトリに保存される) +# +# ここが今回の「シークレット設定の自動化」の本体。 +# `terraform apply` を1回実行するだけで、GitHub Actionsの +# deploy.yml が参照する secrets.* が全て設定される。 +############################################ + +resource "github_actions_secret" "cloudflare_api_token" { + repository = var.github_repo + secret_name = "CLOUDFLARE_API_TOKEN" + plaintext_value = var.cloudflare_api_token +} + +resource "github_actions_secret" "cloudflare_account_id" { + repository = var.github_repo + secret_name = "CLOUDFLARE_ACCOUNT_ID" + plaintext_value = var.cloudflare_account_id +} + +resource "github_actions_secret" "openai_api_key" { + count = var.openai_api_key != "" ? 1 : 0 + repository = var.github_repo + secret_name = "OPENAI_API_KEY" + plaintext_value = var.openai_api_key +} + +resource "github_actions_secret" "openai_org_id" { + count = var.openai_org_id != "" ? 1 : 0 + repository = var.github_repo + secret_name = "OPENAI_ORG_ID" + plaintext_value = var.openai_org_id +} + +resource "github_actions_secret" "nextchat_access_code" { + count = var.nextchat_access_code != "" ? 1 : 0 + repository = var.github_repo + secret_name = "NEXTCHAT_ACCESS_CODE" + plaintext_value = var.nextchat_access_code +} + +############################################ +# GitHub Actions Variables(平文でよい設定値。Actionsのvars.*で参照) +############################################ + +resource "github_actions_variable" "cf_pages_project_name" { + repository = var.github_repo + variable_name = "CF_PAGES_PROJECT_NAME" + value = var.project_name +} + +resource "github_actions_variable" "hide_user_api_key" { + repository = var.github_repo + variable_name = "HIDE_USER_API_KEY" + value = var.hide_user_api_key +} + +resource "github_actions_variable" "disable_gpt4" { + repository = var.github_repo + variable_name = "DISABLE_GPT4" + value = var.disable_gpt4 +} + +resource "github_actions_variable" "enable_balance_query" { + repository = var.github_repo + variable_name = "ENABLE_BALANCE_QUERY" + value = var.enable_balance_query +} + +resource "github_actions_variable" "disable_fast_link" { + repository = var.github_repo + variable_name = "DISABLE_FAST_LINK" + value = var.disable_fast_link +} diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 00000000000..c30a88d68fa --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,57 @@ +############################################ +# Cloudflare Pages プロジェクト(Direct Upload方式) +# +# GitHub Actions 側で `next-on-pages` によるビルドと +# `wrangler pages deploy` を行う構成のため、ここでは +# Git連携(source ブロック)は張らず、箱(プロジェクト)と +# ランタイム設定(環境変数・互換フラグ)だけを Terraform で管理する。 +############################################ + +resource "cloudflare_pages_project" "nextchat" { + account_id = var.cloudflare_account_id + name = var.project_name + production_branch = var.production_branch + + deployment_configs { + production { + compatibility_date = "2025-03-07" + compatibility_flags = ["nodejs_compat"] + + environment_variables = { + NODE_VERSION = "20.1" + NEXT_TELEMETRY_DISABLE = "1" + HIDE_USER_API_KEY = var.hide_user_api_key + DISABLE_GPT4 = var.disable_gpt4 + ENABLE_BALANCE_QUERY = var.enable_balance_query + DISABLE_FAST_LINK = var.disable_fast_link + } + } + + preview { + compatibility_date = "2025-03-07" + compatibility_flags = ["nodejs_compat"] + + environment_variables = { + NODE_VERSION = "20.1" + NEXT_TELEMETRY_DISABLE = "1" + } + } + } + + lifecycle { + # OPENAI_API_KEY 等の秘匿値は Terraform では管理しない + # (README参照: `wrangler pages secret put` で登録する) + ignore_changes = [] + } +} + +############################################ +# 独自ドメイン(任意) +############################################ + +resource "cloudflare_pages_domain" "custom_domain" { + count = var.custom_domain != "" ? 1 : 0 + account_id = var.cloudflare_account_id + project_name = cloudflare_pages_project.nextchat.name + domain = var.custom_domain +} diff --git a/terraform/outputs.tf b/terraform/outputs.tf new file mode 100644 index 00000000000..5a3d6a9b00b --- /dev/null +++ b/terraform/outputs.tf @@ -0,0 +1,23 @@ +output "pages_project_name" { + value = cloudflare_pages_project.nextchat.name +} + +output "pages_default_domain" { + description = "*.pages.dev のデフォルトURL" + value = "https://${cloudflare_pages_project.nextchat.name}.pages.dev" +} + +output "pages_custom_domain" { + value = var.custom_domain != "" ? var.custom_domain : "未設定" +} + +output "github_secrets_configured" { + description = "自動投入されたGitHub Actions Secretsの一覧" + value = compact([ + "CLOUDFLARE_API_TOKEN", + "CLOUDFLARE_ACCOUNT_ID", + var.openai_api_key != "" ? "OPENAI_API_KEY" : "", + var.openai_org_id != "" ? "OPENAI_ORG_ID" : "", + var.nextchat_access_code != "" ? "NEXTCHAT_ACCESS_CODE" : "", + ]) +} diff --git a/terraform/terraform.tfvars.example b/terraform/terraform.tfvars.example new file mode 100644 index 00000000000..0c6fe160136 --- /dev/null +++ b/terraform/terraform.tfvars.example @@ -0,0 +1,23 @@ +# このファイルを terraform.tfvars にコピーして値を埋め、 +# 【絶対にgitにコミットしない】こと(.gitignore済み)。 +# CIで実行する場合は TF_VAR_xxx 環境変数として渡す方法を推奨。 + +cloudflare_api_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +cloudflare_account_id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + +github_token = "github_pat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +github_owner = "your-github-user-or-org" +github_repo = "NextChat" # フォークしたリポジトリ名 + +project_name = "nextchat" +production_branch = "main" +custom_domain = "" # 例: "chat.example.com"(Cloudflareにゾーンがある場合のみ) + +openai_api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +openai_org_id = "" +nextchat_access_code = "" # 例: "pass1,pass2" + +hide_user_api_key = "0" +disable_gpt4 = "0" +enable_balance_query = "0" +disable_fast_link = "0" diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 00000000000..1481960e981 --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,101 @@ +############################################ +# ブートストラップ用クレデンシャル +# (terraform apply を実行するあなたの手元/CI にのみ必要。リポジトリにはコミットしない) +############################################ + +variable "cloudflare_api_token" { + description = "Cloudflare API Token (Pages:Edit, Account:Read 権限が必要)" + type = string + sensitive = true +} + +variable "cloudflare_account_id" { + description = "Cloudflare Account ID" + type = string +} + +variable "github_token" { + description = "GitHub Personal Access Token (Fine-grained PAT: repo administration + secrets 書き込み権限)" + type = string + sensitive = true +} + +variable "github_owner" { + description = "GitHubのユーザー名 or Organization名" + type = string +} + +variable "github_repo" { + description = "NextChatをフォークしたリポジトリ名" + type = string +} + +############################################ +# Cloudflare Pages プロジェクト設定 +############################################ + +variable "project_name" { + description = "Cloudflare Pages のプロジェクト名(deploy.ymlのCF_PAGES_PROJECT_NAMEと一致させる)" + type = string + default = "nextchat" +} + +variable "production_branch" { + description = "本番デプロイ対象のGitブランチ" + type = string + default = "main" +} + +variable "custom_domain" { + description = "独自ドメインを割り当てる場合に指定(未指定なら *.pages.dev のみ)" + type = string + default = "" +} + +############################################ +# NextChat アプリケーション設定(Secretsとして GitHub に登録される) +############################################ + +variable "openai_api_key" { + description = "NextChatが使用するOpenAI APIキー" + type = string + sensitive = true + default = "" +} + +variable "openai_org_id" { + description = "OpenAI Organization ID(任意)" + type = string + default = "" +} + +variable "nextchat_access_code" { + description = "NextChatのアクセスパスワード(CODE環境変数、カンマ区切りで複数可・任意)" + type = string + sensitive = true + default = "" +} + +variable "hide_user_api_key" { + description = "1にするとユーザーが自分のAPIキーを入力できなくなる(任意)" + type = string + default = "0" +} + +variable "disable_gpt4" { + description = "1にするとGPT-4の利用を禁止する(任意)" + type = string + default = "0" +} + +variable "enable_balance_query" { + description = "1にすると残高照会を許可する(任意)" + type = string + default = "0" +} + +variable "disable_fast_link" { + description = "1にするとURL経由の設定読み込みを無効化する(任意)" + type = string + default = "0" +} From f6e79b49515a93d67f26d0b00ea2202e61d64c22 Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Thu, 2 Jul 2026 15:55:37 +0900 Subject: [PATCH 06/23] Add Terraform files and directories to .gitignore --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index b1c2bfefad3..3846dd5e26d 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,10 @@ masks.json # mcp config app/mcp/mcp_config.json + +terraform.tfvars +*.tfstate +*.tfstate.* +.terraform/ +.terraform.lock.hcl +crash.log From 56c7bd37bad4a432c95034f75a19eadccf6b0fb6 Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Thu, 2 Jul 2026 15:57:43 +0900 Subject: [PATCH 07/23] Add files via upload --- .github/workflows/deploy.yml | 101 +++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000000..5df3c995c33 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,101 @@ +name: Deploy NextChat to Cloudflare Pages + +# このファイルを NextChat (フォーク後の) リポジトリの .github/workflows/deploy.yml +# として配置してください。main への push で自動デプロイされます。 + +on: + push: + branches: [main] + workflow_dispatch: {} # 手動実行用 + +# 同時実行を1つに制限(Pages側の競合デプロイ防止) +concurrency: + group: cloudflare-pages-deploy + cancel-in-progress: true + +env: + NODE_VERSION: "20.1" + # Cloudflare Pages のプロジェクト名。Terraform の cloudflare_pages_project.name と一致させること + CF_PAGES_PROJECT_NAME: ${{ vars.CF_PAGES_PROJECT_NAME || 'nextchat' }} + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + permissions: + contents: read + deployments: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + + # NextChat はバージョンによって yarn / pnpm いずれかを使用しているため + # ロックファイルを見て自動判定する + - name: Detect package manager + id: pm + run: | + if [ -f pnpm-lock.yaml ]; then + echo "manager=pnpm" >> "$GITHUB_OUTPUT" + elif [ -f yarn.lock ]; then + echo "manager=yarn" >> "$GITHUB_OUTPUT" + else + echo "manager=npm" >> "$GITHUB_OUTPUT" + fi + + - name: Enable Corepack (pnpm/yarn) + if: steps.pm.outputs.manager != 'npm' + run: corepack enable + + - name: Install dependencies + run: | + case "${{ steps.pm.outputs.manager }}" in + pnpm) pnpm install --frozen-lockfile ;; + yarn) yarn install --frozen-lockfile ;; + npm) npm ci ;; + esac + + # NextChat 公式ドキュメント推奨のビルドコマンド。 + # 通常の `next build` は node:buffer 関連の既知バグで Pages 上で動作しないため使用しない。 + - name: Build for Cloudflare Pages (next-on-pages) + run: npx @cloudflare/next-on-pages --experimental-minify + env: + NEXT_TELEMETRY_DISABLE: "1" + # --- NextChat 実行時設定(必要に応じて GitHub Secrets/Variables を追加) --- + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + OPENAI_ORG_ID: ${{ secrets.OPENAI_ORG_ID }} + CODE: ${{ secrets.NEXTCHAT_ACCESS_CODE }} + HIDE_USER_API_KEY: ${{ vars.HIDE_USER_API_KEY }} + DISABLE_GPT4: ${{ vars.DISABLE_GPT4 }} + ENABLE_BALANCE_QUERY: ${{ vars.ENABLE_BALANCE_QUERY }} + DISABLE_FAST_LINK: ${{ vars.DISABLE_FAST_LINK }} + + - name: Deploy to Cloudflare Pages + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy .vercel/output/static --project-name=${{ env.CF_PAGES_PROJECT_NAME }} --branch=main + + # OPENAI_API_KEY等はビルド成果物に含めず、Pages Functionsの実行時 + # シークレットとして直接登録する(Terraformのstateにも残らない) + - name: Sync runtime secrets to Cloudflare Pages + if: ${{ secrets.OPENAI_API_KEY != '' }} + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + run: | + set -e + npx wrangler pages secret put OPENAI_API_KEY \ + --project-name="${{ env.CF_PAGES_PROJECT_NAME }}" <<< "${{ secrets.OPENAI_API_KEY }}" + if [ -n "${{ secrets.OPENAI_ORG_ID }}" ]; then + npx wrangler pages secret put OPENAI_ORG_ID \ + --project-name="${{ env.CF_PAGES_PROJECT_NAME }}" <<< "${{ secrets.OPENAI_ORG_ID }}" + fi + if [ -n "${{ secrets.NEXTCHAT_ACCESS_CODE }}" ]; then + npx wrangler pages secret put CODE \ + --project-name="${{ env.CF_PAGES_PROJECT_NAME }}" <<< "${{ secrets.NEXTCHAT_ACCESS_CODE }}" + fi From 7d46d06066735b426d4e6abd3407415567e03f80 Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Thu, 2 Jul 2026 16:02:17 +0900 Subject: [PATCH 08/23] Add files via upload --- README (1).md | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 README (1).md diff --git a/README (1).md b/README (1).md new file mode 100644 index 00000000000..75cd74d25b3 --- /dev/null +++ b/README (1).md @@ -0,0 +1,79 @@ +# NextChat → Cloudflare Pages CI/CD 一式 + +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` により都度同期する設計にしています。 + +## セットアップ手順 + +### 1. 事前準備(あなたが1回だけ行う) + +1. [GitHub](https://github.com/ChatGPTNextWeb/NextChat) の NextChat を Fork する +2. 本一式(`.github/workflows/deploy.yml` と `terraform/`)をForkしたリポジトリに追加してpush +3. Cloudflare API Token を発行([dash.cloudflare.com](https://dash.cloudflare.com/profile/api-tokens) → 「Pages 編集」権限を持つカスタムトークン) +4. GitHub の Fine-grained PAT を発行 + (対象リポジトリに対して **Secrets: Read & write** / **Variables: Read & write** / **Administration: Read & write** 権限) + +### 2. Terraform 実行 + +```bash +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` + +### 3. デプロイ確認 + +`main` ブランチに push するか、GitHub上で Actions → `Deploy NextChat to Cloudflare Pages` → +`Run workflow` を実行すると、ビルドとデプロイが走ります。 +完了後、Terraformの出力 `pages_default_domain`(`https://.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` にコメントアウトの雛形あり)。 From ed409b229928dc1a2786d1e5c0c432d9d61b532a Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Thu, 2 Jul 2026 21:07:43 +0900 Subject: [PATCH 09/23] Add files via upload --- nextchat-cf-deploy (1).zip | Bin 0 -> 10927 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 nextchat-cf-deploy (1).zip diff --git a/nextchat-cf-deploy (1).zip b/nextchat-cf-deploy (1).zip new file mode 100644 index 0000000000000000000000000000000000000000..17995993879e0ed9b5c7bc3d349641b4b1402395 GIT binary patch literal 10927 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 as@?t*4))p8OaVZ7`Z~cr2|}tr{{0{Mdcpbt literal 0 HcmV?d00001 From e237346c90bfae17bc37ee47fbdf886783878998 Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Thu, 2 Jul 2026 12:13:56 +0000 Subject: [PATCH 10/23] Remove unused deployment zip file --- nextchat-cf-deploy (1).zip | Bin 10927 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 nextchat-cf-deploy (1).zip diff --git a/nextchat-cf-deploy (1).zip b/nextchat-cf-deploy (1).zip deleted file mode 100644 index 17995993879e0ed9b5c7bc3d349641b4b1402395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10927 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 as@?t*4))p8OaVZ7`Z~cr2|}tr{{0{Mdcpbt From f7eef22fce31374cff34be048b70715c985c5f12 Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Thu, 2 Jul 2026 21:22:16 +0900 Subject: [PATCH 11/23] Add files via upload --- .github/workflows/deploy.yml | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5df3c995c33..41b63174500 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -82,20 +82,28 @@ jobs: # OPENAI_API_KEY等はビルド成果物に含めず、Pages Functionsの実行時 # シークレットとして直接登録する(Terraformのstateにも残らない) + # + # 注: GitHub Actionsの仕様上 `secrets` コンテキストは if: 条件式では使えない + # ("Unrecognized named-value: 'secrets'" エラーの原因)。そのためステップ自体は + # 常に実行し、各シークレットの有無はステップ内のシェルスクリプトでチェックする。 - name: Sync runtime secrets to Cloudflare Pages - if: ${{ secrets.OPENAI_API_KEY != '' }} env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + OPENAI_ORG_ID: ${{ secrets.OPENAI_ORG_ID }} + NEXTCHAT_ACCESS_CODE: ${{ secrets.NEXTCHAT_ACCESS_CODE }} run: | set -e - npx wrangler pages secret put OPENAI_API_KEY \ - --project-name="${{ env.CF_PAGES_PROJECT_NAME }}" <<< "${{ secrets.OPENAI_API_KEY }}" - if [ -n "${{ secrets.OPENAI_ORG_ID }}" ]; then - npx wrangler pages secret put OPENAI_ORG_ID \ - --project-name="${{ env.CF_PAGES_PROJECT_NAME }}" <<< "${{ secrets.OPENAI_ORG_ID }}" + if [ -n "$OPENAI_API_KEY" ]; then + printf '%s' "$OPENAI_API_KEY" | npx wrangler pages secret put OPENAI_API_KEY \ + --project-name="${{ env.CF_PAGES_PROJECT_NAME }}" + fi + if [ -n "$OPENAI_ORG_ID" ]; then + printf '%s' "$OPENAI_ORG_ID" | npx wrangler pages secret put OPENAI_ORG_ID \ + --project-name="${{ env.CF_PAGES_PROJECT_NAME }}" fi - if [ -n "${{ secrets.NEXTCHAT_ACCESS_CODE }}" ]; then - npx wrangler pages secret put CODE \ - --project-name="${{ env.CF_PAGES_PROJECT_NAME }}" <<< "${{ secrets.NEXTCHAT_ACCESS_CODE }}" + if [ -n "$NEXTCHAT_ACCESS_CODE" ]; then + printf '%s' "$NEXTCHAT_ACCESS_CODE" | npx wrangler pages secret put CODE \ + --project-name="${{ env.CF_PAGES_PROJECT_NAME }}" fi From 28f97ca29f7243b629241e9d25ea9d19c351bf4f Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Thu, 2 Jul 2026 21:23:17 +0900 Subject: [PATCH 12/23] Add files via upload --- terraform/.gitignore | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 terraform/.gitignore diff --git a/terraform/.gitignore b/terraform/.gitignore new file mode 100644 index 00000000000..056b4faf098 --- /dev/null +++ b/terraform/.gitignore @@ -0,0 +1,6 @@ +terraform.tfvars +*.tfstate +*.tfstate.* +.terraform/ +.terraform.lock.hcl +crash.log From 95aaaa90f4029fa047921476f43bbde5669e44a5 Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Thu, 2 Jul 2026 21:35:33 +0900 Subject: [PATCH 13/23] Add files via upload --- nextchat-cf-deploy (2).zip | Bin 0 -> 11786 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 nextchat-cf-deploy (2).zip diff --git a/nextchat-cf-deploy (2).zip b/nextchat-cf-deploy (2).zip new file mode 100644 index 0000000000000000000000000000000000000000..1ec1495b486992dd10a6ded0724cd48ec3cd8db4 GIT binary patch literal 11786 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 Date: Thu, 2 Jul 2026 12:48:04 +0000 Subject: [PATCH 14/23] =?UTF-8?q?GitHub=20Actions=E3=81=AE=E3=83=87?= =?UTF-8?q?=E3=83=97=E3=83=AD=E3=82=A4=E8=A8=AD=E5=AE=9A=E3=82=92=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E3=81=97=E3=80=81=E4=B8=AD=E5=9B=BD=E5=9B=BD=E5=86=85?= =?UTF-8?q?=E3=83=9F=E3=83=A9=E3=83=BC=E3=81=AB=E3=82=88=E3=82=8B=E3=82=BF?= =?UTF-8?q?=E3=82=A4=E3=83=A0=E3=82=A2=E3=82=A6=E3=83=88=E3=82=92=E5=9B=9E?= =?UTF-8?q?=E9=81=BF=E3=81=99=E3=82=8B=E3=81=9F=E3=82=81=E3=81=ABnpm?= =?UTF-8?q?=E3=83=AC=E3=82=B8=E3=82=B9=E3=83=88=E3=83=AA=E3=82=92=E6=AD=A3?= =?UTF-8?q?=E8=A6=8F=E3=81=AE=E3=82=82=E3=81=AE=E3=81=AB=E5=BC=B7=E5=88=B6?= =?UTF-8?q?=E6=9B=B8=E3=81=8D=E6=8F=9B=E3=81=88=E3=80=82=E4=BE=9D=E5=AD=98?= =?UTF-8?q?=E9=96=A2=E4=BF=82=E3=81=AE=E3=82=A4=E3=83=B3=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E6=99=82=E3=81=AB=E3=83=AA=E3=83=88=E3=83=A9?= =?UTF-8?q?=E3=82=A4=E6=A9=9F=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=82?= =?UTF-8?q?=E3=81=BE=E3=81=9F=E3=80=81=E4=B8=8D=E8=A6=81=E3=81=AA=E3=83=87?= =?UTF-8?q?=E3=83=97=E3=83=AD=E3=82=A4=E7=94=A8ZIP=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=82=92=E5=89=8A=E9=99=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 56 +++- README.md | 521 ++++------------------------------- nextchat-cf-deploy (2).zip | Bin 11786 -> 0 bytes 3 files changed, 110 insertions(+), 467 deletions(-) delete mode 100644 nextchat-cf-deploy (2).zip diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 41b63174500..7e9dcbbb592 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -50,13 +50,59 @@ jobs: if: steps.pm.outputs.manager != 'npm' run: corepack enable + # NextChat のロックファイルは中国国内ミラー(華為クラウド/淘宝/騰訊等)を + # 参照していることがあり、GitHub Actionsのランナー(中国国外)からは + # 到達性が悪く "Socket connection timeout" で失敗する。 + # ロックファイルに記録された解決済みURLと、レジストリ設定の両方を + # 公式npmレジストリへ強制的に書き換える。 + - name: Normalize registry to official npm (avoid CN mirror timeouts) + run: | + set -e + MIRROR_RE='https://(mirrors\.huaweicloud\.com/repository/npm|repo\.huaweicloud\.com/repository/npm|registry\.npmmirror\.com|registry\.npm\.taobao\.org|mirrors\.cloud\.tencent\.com/npm|mirrors\.tencent\.com/npm|r\.cnpmjs\.org)/?' + + for f in yarn.lock package-lock.json npm-shrinkwrap.json; do + if [ -f "$f" ] && grep -qE "$MIRROR_RE" "$f"; then + echo "Rewriting mirror URLs found in $f" + sed -i -E "s#${MIRROR_RE}#https://registry.npmjs.org/#g" "$f" + fi + done + + # 既存の .yarnrc / .npmrc に registry 指定があれば取り除き、公式レジストリと + # 長めの network-timeout を追記する(新規解決分・再解決分の保険) + if [ -f .yarnrc ]; then + grep -v '^registry ' .yarnrc > .yarnrc.tmp || true + mv .yarnrc.tmp .yarnrc + fi + { + echo 'registry "https://registry.npmjs.org/"' + echo 'network-timeout 300000' + } >> .yarnrc + + if [ -f .npmrc ]; then + grep -v '^registry' .npmrc > .npmrc.tmp || true + mv .npmrc.tmp .npmrc + fi + echo 'registry=https://registry.npmjs.org/' >> .npmrc + - name: Install dependencies run: | - case "${{ steps.pm.outputs.manager }}" in - pnpm) pnpm install --frozen-lockfile ;; - yarn) yarn install --frozen-lockfile ;; - npm) npm ci ;; - esac + set -e + install_cmd() { + case "${{ steps.pm.outputs.manager }}" in + pnpm) pnpm install --frozen-lockfile ;; + yarn) yarn install --frozen-lockfile --network-timeout 300000 ;; + npm) npm ci ;; + esac + } + # 一時的なネットワーク断にも耐えられるよう3回までリトライ + for attempt in 1 2 3; do + if install_cmd; then + exit 0 + fi + echo "Install attempt $attempt failed, retrying in 10s..." + sleep 10 + done + exit 1 # NextChat 公式ドキュメント推奨のビルドコマンド。 # 通常の `next build` は node:buffer 関連の既知バグで Pages 上で動作しないため使用しない。 diff --git a/README.md b/README.md index 2e45c7120fa..75cd74d25b3 100644 --- a/README.md +++ b/README.md @@ -1,482 +1,79 @@ -

+# NextChat → Cloudflare Pages CI/CD 一式 - - icon - +NextChat (ChatGPTNextWeb) を Cloudflare Pages に、GitHub Actions + Terraform で +デプロイ/運用するための構成一式です。 -

NextChat

+## 構成 -English / [简体中文](./README_CN.md) - -ChatGPTNextWeb%2FChatGPT-Next-Web | Trendshift - -✨ Light and Fast AI Assistant,with Claude, DeepSeek, GPT4 & Gemini Pro support. - -[![Saas][Saas-image]][saas-url] -[![Web][Web-image]][web-url] -[![Windows][Windows-image]][download-url] -[![MacOS][MacOS-image]][download-url] -[![Linux][Linux-image]][download-url] - -[NextChatAI](https://nextchat.club?utm_source=readme) / [iOS APP](https://apps.apple.com/us/app/nextchat-ai/id6743085599) / [Web App Demo](https://app.nextchat.club) / [Desktop App](https://github.com/Yidadaa/ChatGPT-Next-Web/releases) / [Enterprise Edition](#enterprise-edition) - -[saas-url]: https://nextchat.club?utm_source=readme -[saas-image]: https://img.shields.io/badge/NextChat-Saas-green?logo=microsoftedge -[web-url]: https://app.nextchat.club/ -[download-url]: https://github.com/Yidadaa/ChatGPT-Next-Web/releases -[Web-image]: https://img.shields.io/badge/Web-PWA-orange?logo=microsoftedge -[Windows-image]: https://img.shields.io/badge/-Windows-blue?logo=windows -[MacOS-image]: https://img.shields.io/badge/-MacOS-black?logo=apple -[Linux-image]: https://img.shields.io/badge/-Linux-333?logo=ubuntu - -[Deploy on Zeabur](https://zeabur.com/templates/ZBUEFA) [Deploy on Vercel](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FChatGPTNextWeb%2FChatGPT-Next-Web&env=OPENAI_API_KEY&env=CODE&project-name=nextchat&repository-name=NextChat) [Open in Gitpod](https://gitpod.io/#https://github.com/ChatGPTNextWeb/NextChat) [Deploy with your agent](https://opendeploy.dev/github/ChatGPTNextWeb/NextChat) - -[](https://monica.im/?utm=nxcrp) - -
- -## ❤️ Sponsor AI API - - - icon - - -[302.AI](https://302.ai/) is a pay-as-you-go AI application platform that offers the most comprehensive AI APIs and online applications available. - -## 🥳 Cheer for NextChat iOS Version Online! - -> [👉 Click Here to Install Now](https://apps.apple.com/us/app/nextchat-ai/id6743085599) - -> [❤️ Source Code Coming Soon](https://github.com/ChatGPTNextWeb/NextChat-iOS) - -![Github iOS Image](https://github.com/user-attachments/assets/e0aa334f-4c13-4dc9-8310-e3b09fa4b9f3) - -## 🫣 NextChat Support MCP ! - -> Before build, please set env ENABLE_MCP=true - - - -## Enterprise Edition - -Meeting Your Company's Privatization and Customization Deployment Requirements: - -- **Brand Customization**: Tailored VI/UI to seamlessly align with your corporate brand image. -- **Resource Integration**: Unified configuration and management of dozens of AI resources by company administrators, ready for use by team members. -- **Permission Control**: Clearly defined member permissions, resource permissions, and knowledge base permissions, all controlled via a corporate-grade Admin Panel. -- **Knowledge Integration**: Combining your internal knowledge base with AI capabilities, making it more relevant to your company's specific business needs compared to general AI. -- **Security Auditing**: Automatically intercept sensitive inquiries and trace all historical conversation records, ensuring AI adherence to corporate information security standards. -- **Private Deployment**: Enterprise-level private deployment supporting various mainstream private cloud solutions, ensuring data security and privacy protection. -- **Continuous Updates**: Ongoing updates and upgrades in cutting-edge capabilities like multimodal AI, ensuring consistent innovation and advancement. - -For enterprise inquiries, please contact: **business@nextchat.dev** - -## Screenshots - -![Settings](./docs/images/settings.png) - -![More](./docs/images/more.png) - -## Features - -- **Deploy for free with one-click** on Vercel in under 1 minute -- Compact client (~5MB) on Linux/Windows/MacOS, [download it now](https://github.com/Yidadaa/ChatGPT-Next-Web/releases) -- Fully compatible with self-deployed LLMs, recommended for use with [RWKV-Runner](https://github.com/josStorer/RWKV-Runner) or [LocalAI](https://github.com/go-skynet/LocalAI) -- Privacy first, all data is stored locally in the browser -- Markdown support: LaTex, mermaid, code highlight, etc. -- Responsive design, dark mode and PWA -- Fast first screen loading speed (~100kb), support streaming response -- New in v2: create, share and debug your chat tools with prompt templates (mask) -- Awesome prompts powered by [awesome-chatgpt-prompts-zh](https://github.com/PlexPt/awesome-chatgpt-prompts-zh) and [awesome-chatgpt-prompts](https://github.com/f/awesome-chatgpt-prompts) -- Automatically compresses chat history to support long conversations while also saving your tokens -- I18n: English, 简体中文, 繁体中文, 日本語, Français, Español, Italiano, Türkçe, Deutsch, Tiếng Việt, Русский, Čeština, 한국어, Indonesia - -
- -![主界面](./docs/images/cover.png) - -
- -## Roadmap - -- [x] System Prompt: pin a user defined prompt as system prompt [#138](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/138) -- [x] User Prompt: user can edit and save custom prompts to prompt list -- [x] Prompt Template: create a new chat with pre-defined in-context prompts [#993](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/993) -- [x] Share as image, share to ShareGPT [#1741](https://github.com/Yidadaa/ChatGPT-Next-Web/pull/1741) -- [x] Desktop App with tauri -- [x] Self-host Model: Fully compatible with [RWKV-Runner](https://github.com/josStorer/RWKV-Runner), as well as server deployment of [LocalAI](https://github.com/go-skynet/LocalAI): llama/gpt4all/rwkv/vicuna/koala/gpt4all-j/cerebras/falcon/dolly etc. -- [x] Artifacts: Easily preview, copy and share generated content/webpages through a separate window [#5092](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/pull/5092) -- [x] Plugins: support network search, calculator, any other apis etc. [#165](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/165) [#5353](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5353) - - [x] network search, calculator, any other apis etc. [#165](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/165) [#5353](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5353) -- [x] Supports Realtime Chat [#5672](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5672) -- [ ] local knowledge base - -## What's New - -- 🚀 v2.15.8 Now supports Realtime Chat [#5672](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5672) -- 🚀 v2.15.4 The Application supports using Tauri fetch LLM API, MORE SECURITY! [#5379](https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/issues/5379) -- 🚀 v2.15.0 Now supports Plugins! Read this: [NextChat-Awesome-Plugins](https://github.com/ChatGPTNextWeb/NextChat-Awesome-Plugins) -- 🚀 v2.14.0 Now supports Artifacts & SD -- 🚀 v2.10.1 support Google Gemini Pro model. -- 🚀 v2.9.11 you can use azure endpoint now. -- 🚀 v2.8 now we have a client that runs across all platforms! -- 🚀 v2.7 let's share conversations as image, or share to ShareGPT! -- 🚀 v2.0 is released, now you can create prompt templates, turn your ideas into reality! Read this: [ChatGPT Prompt Engineering Tips: Zero, One and Few Shot Prompting](https://www.allabtai.com/prompt-engineering-tips-zero-one-and-few-shot-prompting/). - -## Get Started - -1. Get [OpenAI API Key](https://platform.openai.com/account/api-keys); -2. Click - [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FYidadaa%2FChatGPT-Next-Web&env=OPENAI_API_KEY&env=CODE&project-name=chatgpt-next-web&repository-name=ChatGPT-Next-Web), remember that `CODE` is your page password; -3. Enjoy :) - -## FAQ - -[English > FAQ](./docs/faq-en.md) - -## Keep Updated - -If you have deployed your own project with just one click following the steps above, you may encounter the issue of "Updates Available" constantly showing up. This is because Vercel will create a new project for you by default instead of forking this project, resulting in the inability to detect updates correctly. - -We recommend that you follow the steps below to re-deploy: - -- Delete the original repository; -- Use the fork button in the upper right corner of the page to fork this project; -- Choose and deploy in Vercel again, [please see the detailed tutorial](./docs/vercel-cn.md). - -### Enable Automatic Updates - -> If you encounter a failure of Upstream Sync execution, please [manually update code](./README.md#manually-updating-code). - -After forking the project, due to the limitations imposed by GitHub, you need to manually enable Workflows and Upstream Sync Action on the Actions page of the forked project. Once enabled, automatic updates will be scheduled every hour: - -![Automatic Updates](./docs/images/enable-actions.jpg) - -![Enable Automatic Updates](./docs/images/enable-actions-sync.jpg) - -### Manually Updating Code - -If you want to update instantly, you can check out the [GitHub documentation](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork) to learn how to synchronize a forked project with upstream code. - -You can star or watch this project or follow author to get release notifications in time. - -## Access Password - -This project provides limited access control. Please add an environment variable named `CODE` on the vercel environment variables page. The value should be passwords separated by comma like this: - -``` -code1,code2,code3 -``` - -After adding or modifying this environment variable, please redeploy the project for the changes to take effect. - -## Environment Variables - -### `CODE` (optional) - -Access password, separated by comma. - -### `OPENAI_API_KEY` (required) - -Your openai api key, join multiple api keys with comma. - -### `BASE_URL` (optional) - -> Default: `https://api.openai.com` - -> Examples: `http://your-openai-proxy.com` - -Override openai api request base url. - -### `OPENAI_ORG_ID` (optional) - -Specify OpenAI organization ID. - -### `AZURE_URL` (optional) - -> Example: https://{azure-resource-url}/openai - -Azure deploy url. - -### `AZURE_API_KEY` (optional) - -Azure Api Key. - -### `AZURE_API_VERSION` (optional) - -Azure Api Version, find it at [Azure Documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#chat-completions). - -### `GOOGLE_API_KEY` (optional) - -Google Gemini Pro Api Key. - -### `GOOGLE_URL` (optional) - -Google Gemini Pro Api Url. - -### `ANTHROPIC_API_KEY` (optional) - -anthropic claude Api Key. - -### `ANTHROPIC_API_VERSION` (optional) - -anthropic claude Api version. - -### `ANTHROPIC_URL` (optional) - -anthropic claude Api Url. - -### `BAIDU_API_KEY` (optional) - -Baidu Api Key. - -### `BAIDU_SECRET_KEY` (optional) - -Baidu Secret Key. - -### `BAIDU_URL` (optional) - -Baidu Api Url. - -### `BYTEDANCE_API_KEY` (optional) - -ByteDance Api Key. - -### `BYTEDANCE_URL` (optional) - -ByteDance Api Url. - -### `ALIBABA_API_KEY` (optional) - -Alibaba Cloud Api Key. - -### `ALIBABA_URL` (optional) - -Alibaba Cloud Api Url. - -### `IFLYTEK_URL` (Optional) - -iflytek Api Url. - -### `IFLYTEK_API_KEY` (Optional) - -iflytek Api Key. - -### `IFLYTEK_API_SECRET` (Optional) - -iflytek Api Secret. - -### `CHATGLM_API_KEY` (optional) - -ChatGLM Api Key. - -### `CHATGLM_URL` (optional) - -ChatGLM Api Url. - -### `DEEPSEEK_API_KEY` (optional) - -DeepSeek Api Key. - -### `DEEPSEEK_URL` (optional) - -DeepSeek Api Url. - -### `HIDE_USER_API_KEY` (optional) - -> Default: Empty - -If you do not want users to input their own API key, set this value to 1. - -### `DISABLE_GPT4` (optional) - -> Default: Empty - -If you do not want users to use GPT-4, set this value to 1. - -### `ENABLE_BALANCE_QUERY` (optional) - -> Default: Empty - -If you do want users to query balance, set this value to 1. - -### `DISABLE_FAST_LINK` (optional) - -> Default: Empty - -If you want to disable parse settings from url, set this to 1. - -### `CUSTOM_MODELS` (optional) - -> Default: Empty -> Example: `+llama,+claude-2,-gpt-3.5-turbo,gpt-4-1106-preview=gpt-4-turbo` means add `llama, claude-2` to model list, and remove `gpt-3.5-turbo` from list, and display `gpt-4-1106-preview` as `gpt-4-turbo`. - -To control custom models, use `+` to add a custom model, use `-` to hide a model, use `name=displayName` to customize model name, separated by comma. - -User `-all` to disable all default models, `+all` to enable all default models. - -For Azure: use `modelName@Azure=deploymentName` to customize model name and deployment name. - -> Example: `+gpt-3.5-turbo@Azure=gpt35` will show option `gpt35(Azure)` in model list. -> If you only can use Azure model, `-all,+gpt-3.5-turbo@Azure=gpt35` will `gpt35(Azure)` the only option in model list. - -For ByteDance: use `modelName@bytedance=deploymentName` to customize model name and deployment name. - -> Example: `+Doubao-lite-4k@bytedance=ep-xxxxx-xxx` will show option `Doubao-lite-4k(ByteDance)` in model list. - -### `DEFAULT_MODEL` (optional) - -Change default model - -### `VISION_MODELS` (optional) - -> Default: Empty -> Example: `gpt-4-vision,claude-3-opus,my-custom-model` means add vision capabilities to these models in addition to the default pattern matches (which detect models containing keywords like "vision", "claude-3", "gemini-1.5", etc). - -Add additional models to have vision capabilities, beyond the default pattern matching. Multiple models should be separated by commas. - -### `WHITE_WEBDAV_ENDPOINTS` (optional) - -You can use this option if you want to increase the number of webdav service addresses you are allowed to access, as required by the format: - -- Each address must be a complete endpoint - > `https://xxxx/yyy` -- Multiple addresses are connected by ', ' - -### `DEFAULT_INPUT_TEMPLATE` (optional) - -Customize the default template used to initialize the User Input Preprocessing configuration item in Settings. - -### `STABILITY_API_KEY` (optional) - -Stability API key. - -### `STABILITY_URL` (optional) - -Customize Stability API url. - -### `ENABLE_MCP` (optional) - -Enable MCP(Model Context Protocol)Feature - -### `SILICONFLOW_API_KEY` (optional) - -SiliconFlow API Key. - -### `SILICONFLOW_URL` (optional) - -SiliconFlow API URL. - -### `AI302_API_KEY` (optional) - -302.AI API Key. - -### `AI302_URL` (optional) - -302.AI API URL. - -## Requirements - -NodeJS >= 18, Docker >= 20 - -## Development - -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/Yidadaa/ChatGPT-Next-Web) - -Before starting development, you must create a new `.env.local` file at project root, and place your api key into it: - -``` -OPENAI_API_KEY= - -# if you are not able to access openai service, use this BASE_URL -BASE_URL=https://chatgpt1.nextweb.fun/api/proxy ``` - -### Local Development - -```shell -# 1. install nodejs and yarn first -# 2. config local env vars in `.env.local` -# 3. run -yarn install -yarn dev +.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 ``` -## Deployment - -### Docker (Recommended) +## できること・できないこと(重要) -```shell -docker pull yidadaa/chatgpt-next-web - -docker run -d -p 3000:3000 \ - -e OPENAI_API_KEY=sk-xxxx \ - -e CODE=your-password \ - yidadaa/chatgpt-next-web -``` - -You can start service behind a proxy: - -```shell -docker run -d -p 3000:3000 \ - -e OPENAI_API_KEY=sk-xxxx \ - -e CODE=your-password \ - -e PROXY_URL=http://localhost:7890 \ - yidadaa/chatgpt-next-web -``` +- 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` により都度同期する設計にしています。 -If your proxy needs password, use: +## セットアップ手順 -```shell --e PROXY_URL="http://127.0.0.1:7890 user pass" -``` +### 1. 事前準備(あなたが1回だけ行う) -If enable MCP, use: +1. [GitHub](https://github.com/ChatGPTNextWeb/NextChat) の NextChat を Fork する +2. 本一式(`.github/workflows/deploy.yml` と `terraform/`)をForkしたリポジトリに追加してpush +3. Cloudflare API Token を発行([dash.cloudflare.com](https://dash.cloudflare.com/profile/api-tokens) → 「Pages 編集」権限を持つカスタムトークン) +4. GitHub の Fine-grained PAT を発行 + (対象リポジトリに対して **Secrets: Read & write** / **Variables: Read & write** / **Administration: Read & write** 権限) -``` -docker run -d -p 3000:3000 \ - -e OPENAI_API_KEY=sk-xxxx \ - -e CODE=your-password \ - -e ENABLE_MCP=true \ - yidadaa/chatgpt-next-web -``` +### 2. Terraform 実行 -### Shell +```bash +cd terraform +cp terraform.tfvars.example terraform.tfvars +# terraform.tfvars を編集して各値を埋める(絶対にコミットしない) -```shell -bash <(curl -s https://raw.githubusercontent.com/Yidadaa/ChatGPT-Next-Web/main/scripts/setup.sh) +terraform init +terraform plan +terraform apply ``` -## Synchronizing Chat Records (UpStash) - -| [简体中文](./docs/synchronise-chat-logs-cn.md) | [English](./docs/synchronise-chat-logs-en.md) | [Italiano](./docs/synchronise-chat-logs-es.md) | [日本語](./docs/synchronise-chat-logs-ja.md) | [한국어](./docs/synchronise-chat-logs-ko.md) - -## Documentation - -> Please go to the [docs][./docs] directory for more documentation instructions. - -- [Deploy with cloudflare (Deprecated)](./docs/cloudflare-pages-en.md) -- [Frequent Ask Questions](./docs/faq-en.md) -- [How to add a new translation](./docs/translation.md) -- [How to use Vercel (No English)](./docs/vercel-cn.md) -- [User Manual (Only Chinese, WIP)](./docs/user-manual-cn.md) - -## Translation - -If you want to add a new translation, read this [document](./docs/translation.md). - -## Donation - -[Buy Me a Coffee](https://www.buymeacoffee.com/yidadaa) +これで以下が自動的に行われます。 -## Special Thanks +- 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` -### Contributors +### 3. デプロイ確認 - - - +`main` ブランチに push するか、GitHub上で Actions → `Deploy NextChat to Cloudflare Pages` → +`Run workflow` を実行すると、ビルドとデプロイが走ります。 +完了後、Terraformの出力 `pages_default_domain`(`https://.pages.dev`)でアクセスできます。 -## LICENSE +## 補足 -[MIT](https://opensource.org/license/mit/) +- 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` にコメントアウトの雛形あり)。 diff --git a/nextchat-cf-deploy (2).zip b/nextchat-cf-deploy (2).zip deleted file mode 100644 index 1ec1495b486992dd10a6ded0724cd48ec3cd8db4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11786 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 Date: Fri, 3 Jul 2026 09:49:43 +0900 Subject: [PATCH 15/23] Add files via upload --- .github/workflows/deploy.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7e9dcbbb592..de10642630e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -119,6 +119,20 @@ jobs: ENABLE_BALANCE_QUERY: ${{ vars.ENABLE_BALANCE_QUERY }} DISABLE_FAST_LINK: ${{ vars.DISABLE_FAST_LINK }} + # wrangler pages deploy は対象プロジェクトが存在しないと + # "Project not found [code: 8000007]" で失敗する。CI(非対話環境)では + # 自動作成の確認プロンプトを出せないため、事前に明示的に作成しておく。 + # 既に存在する場合はエラーになるが、それは想定内なのでジョブは継続する + # (本当に認証情報などに問題がある場合は、直後の deploy ステップで + # 同じくエラーになるので気づける)。 + - name: Ensure Cloudflare Pages project exists + continue-on-error: true + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages project create ${{ env.CF_PAGES_PROJECT_NAME }} --production-branch=main + - name: Deploy to Cloudflare Pages uses: cloudflare/wrangler-action@v3 with: From 6e95481ccc8b8ac65118dd597670fc197486fef1 Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Fri, 3 Jul 2026 09:50:49 +0900 Subject: [PATCH 16/23] Add files via upload From 48698e586d9ae09ea52dfbc3d0ebd6c0e2e3effd Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Sat, 4 Jul 2026 20:59:44 +0900 Subject: [PATCH 17/23] Add files via upload --- .github/workflows/deploy.yml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index de10642630e..0fee8d2dbac 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -17,6 +17,8 @@ env: NODE_VERSION: "20.1" # Cloudflare Pages のプロジェクト名。Terraform の cloudflare_pages_project.name と一致させること CF_PAGES_PROJECT_NAME: ${{ vars.CF_PAGES_PROJECT_NAME || 'nextchat' }} + # next-on-pages のPages Functionsを動かすのに必須。Terraform側の設定と揃えること + CF_COMPATIBILITY_DATE: "2025-03-07" jobs: build-and-deploy: @@ -119,6 +121,24 @@ jobs: ENABLE_BALANCE_QUERY: ${{ vars.ENABLE_BALANCE_QUERY }} DISABLE_FAST_LINK: ${{ vars.DISABLE_FAST_LINK }} + # 今回のエラー("no nodejs_compat compatibility flag set")の直接の原因はこれ。 + # next-on-pages で作った Pages Functions を動かすには nodejs_compat フラグが + # 必須だが、Pagesプロジェクト側の設定(ダッシュボード or Terraform管理)に + # 依存すると、プロジェクトの作られ方によって設定が漏れることがある + # (実際、前回追加した project create フォールバックにはフラグ指定がなかった)。 + # そこでデプロイの度に wrangler.jsonc を生成し、確実に設定を deploy に含める。 + - name: Write Cloudflare Pages runtime config + run: | + cat > wrangler.jsonc < Date: Sat, 4 Jul 2026 21:00:44 +0900 Subject: [PATCH 18/23] Add files via upload From 9e66c5c59753338b45d71613b0b4be91a7ad017b Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Sat, 4 Jul 2026 21:16:16 +0900 Subject: [PATCH 19/23] Add files via upload From 3b00b60cd80c9855d92c6cf4d01a2350c27ef16a Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Sat, 4 Jul 2026 21:44:32 +0900 Subject: [PATCH 20/23] Add files via upload From 99c025aa28c27c371704723cc0269f1a9ccbb8b2 Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Sat, 4 Jul 2026 21:45:34 +0900 Subject: [PATCH 21/23] Add files via upload From d522c22f40162e21c40eba56c63ac93ea0b9115d Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Sun, 5 Jul 2026 06:36:16 +0900 Subject: [PATCH 22/23] Add files via upload --- .github/workflows/deploy.yml | 75 +++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 18 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0fee8d2dbac..8259a011769 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -121,24 +121,6 @@ jobs: ENABLE_BALANCE_QUERY: ${{ vars.ENABLE_BALANCE_QUERY }} DISABLE_FAST_LINK: ${{ vars.DISABLE_FAST_LINK }} - # 今回のエラー("no nodejs_compat compatibility flag set")の直接の原因はこれ。 - # next-on-pages で作った Pages Functions を動かすには nodejs_compat フラグが - # 必須だが、Pagesプロジェクト側の設定(ダッシュボード or Terraform管理)に - # 依存すると、プロジェクトの作られ方によって設定が漏れることがある - # (実際、前回追加した project create フォールバックにはフラグ指定がなかった)。 - # そこでデプロイの度に wrangler.jsonc を生成し、確実に設定を deploy に含める。 - - name: Write Cloudflare Pages runtime config - run: | - cat > wrangler.jsonc < /tmp/pages-compat-patch.json + + # 3. PATCHで反映 + patch_code=$(curl -sS -o /tmp/pages-compat-response.json -w '%{http_code}' -X PATCH \ + "$API" -H "$AUTH_HEADER" -H "Content-Type: application/json" \ + --data @/tmp/pages-compat-patch.json) + + cat /tmp/pages-compat-response.json + echo + success=$(jq -r '.success' /tmp/pages-compat-response.json) + if [ "$patch_code" -ge 300 ] || [ "$success" != "true" ]; then + echo "::error::Cloudflare Pages への compatibility flags 設定(PATCH)に失敗しました (HTTP $patch_code)" + exit 1 + fi + echo "✅ nodejs_compat を production/preview 両方に設定しました" + # OPENAI_API_KEY等はビルド成果物に含めず、Pages Functionsの実行時 # シークレットとして直接登録する(Terraformのstateにも残らない) # From 995483fcdb5d4e04c27a7629055e833dfb63b33e Mon Sep 17 00:00:00 2001 From: SmartAppStarter435667 Date: Sun, 5 Jul 2026 06:50:29 +0900 Subject: [PATCH 23/23] Add files via upload --- .github/workflows/deploy.yml | 48 +++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 8259a011769..d2c6fc9bb15 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -135,27 +135,22 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} command: pages project create ${{ env.CF_PAGES_PROJECT_NAME }} --production-branch=main --compatibility-date=${{ env.CF_COMPATIBILITY_DATE }} --compatibility-flags=nodejs_compat - - name: Deploy to Cloudflare Pages - uses: cloudflare/wrangler-action@v3 - with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - command: pages deploy .vercel/output/static --project-name=${{ env.CF_PAGES_PROJECT_NAME }} --branch=main - - # 【今回のエラーの本当の原因と対策】 - # wrangler.jsonc をデプロイ時に読ませて compatibility_flags を渡す方式を試したが、 - # 直らなかった。Cloudflare Pages の仕様として「Wrangler設定ファイルを使うと、 - # 同じ項目はダッシュボード/API側では編集できなくなる(ソースオブトゥルースが - # ファイル側に一本化される)」という制約があり、next-on-pagesが生成する - # _worker.js 配下に同梱される設定と衝突して意図通りに反映されない事例が - # 複数報告されている。next-on-pages公式ドキュメントも「Direct Uploadの場合は - # 結局ダッシュボード側でnodejs_compatを設定する必要がある」と明記している。 + # 【今回のエラーが直らなかった本当の原因】 + # このステップは元々 deploy の"後"に置いていたが、それが間違いだった。 + # Cloudflare Pages は「compatibility flags 等のプロジェクト設定を変更しても、 + # 既に存在するデプロイには遡って適用されない。設定変更後に新しくデプロイし直して + # 初めて反映される」という仕様(公式・非公式の複数の情報源で確認済み。 + # dashboardで設定を変えた場合も同様に "redeploy" が必要と案内されている)。 + # つまり deploy → patch の順序だと、patchで直した内容は「次回以降のデプロイ」 + # にしか効かず、その回に公開されたデプロイ自体は直らないまま残っていた。 + # なので patch を deploy より前に移動し、この設定が反映された状態で + # 新しいデプロイが作られるようにする。 # - # そのため方針を変更し、wrangler.jsoncには頼らず、Cloudflare API を直接叩いて - # プロジェクト設定(production/preview 両方のdeployment_configs)に対して - # compatibility_flags を確実に反映させる。ダッシュボードでポチッとするのと - # 同じ操作をAPI経由で行っているだけなので、config file周りの曖昧さを回避できる。 - # 既存の環境変数などを消さないよう、一度GETしてから該当項目だけ上書きしてPATCHする。 + # (方式としては、wrangler.jsonc をデプロイ時に読ませる案も試したが、 + # Cloudflare Pages は設定ファイルを使うとダッシュボード/API側と + # ソースオブトゥルースが競合する仕様があり、next-on-pagesが生成する + # _worker.js 側の設定と衝突して無視される事例が複数報告されていたため、 + # 採用せず Cloudflare API を直接叩く方式にしている) - name: Enforce nodejs_compat via Cloudflare API env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} @@ -185,7 +180,7 @@ jobs: | {deployment_configs: .result.deployment_configs} ' /tmp/pages-project-current.json > /tmp/pages-compat-patch.json - # 3. PATCHで反映 + # 3. PATCHで反映(これが完了してから、この後のステップでdeployする) patch_code=$(curl -sS -o /tmp/pages-compat-response.json -w '%{http_code}' -X PATCH \ "$API" -H "$AUTH_HEADER" -H "Content-Type: application/json" \ --data @/tmp/pages-compat-patch.json) @@ -197,7 +192,16 @@ jobs: echo "::error::Cloudflare Pages への compatibility flags 設定(PATCH)に失敗しました (HTTP $patch_code)" exit 1 fi - echo "✅ nodejs_compat を production/preview 両方に設定しました" + echo "✅ nodejs_compat を production/preview 両方に設定しました(この後デプロイします)" + + # ここで初めてデプロイする。上のステップで nodejs_compat 設定済みのプロジェクトに + # 対して新しいデプロイを作るので、今回のデプロイから正しく反映される。 + - name: Deploy to Cloudflare Pages + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy .vercel/output/static --project-name=${{ env.CF_PAGES_PROJECT_NAME }} --branch=main # OPENAI_API_KEY等はビルド成果物に含めず、Pages Functionsの実行時 # シークレットとして直接登録する(Terraformのstateにも残らない)