> ## Documentation Index
> Fetch the complete documentation index at: https://bun.zhcndoc.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 在 Google Cloud Run 上部署 Bun 应用

[Google Cloud Run](https://cloud.google.com/run) 是一个托管平台，用于部署和扩展无服务器应用。Google 会为您管理基础设施。

在本指南中，我们将使用 `Dockerfile` 将 Bun HTTP 服务器部署到 Google Cloud Run。

<Note>
  在继续之前，请确保您已经具备：

  * 准备好部署的 Bun 应用
  * 已启用计费的 [Google Cloud 账户](https://cloud.google.com/)
  * 已安装并配置好 [Google Cloud CLI](https://cloud.google.com/sdk/docs/install)
</Note>

***

<Steps>
  <Step title={<span>初始化 <code>gcloud</code>，选择或创建项目</span>}>
    确保您已经初始化了 Google Cloud CLI。该命令会让您登录，并提示选择已有项目或创建新项目。

    有关 Google Cloud CLI 的更多帮助，请参见 [官方文档](https://docs.cloud.google.com/sdk/gcloud/reference/init)。

    ```bash terminal icon="terminal" theme={"theme":{"light":"github-light","dark":"dracula"}}
    gcloud init
    ```

    ```txt theme={"theme":{"light":"github-light","dark":"dracula"}}
    欢迎！该命令将引导您完成 gcloud 的配置。

    您必须登录才能继续。您是否要登录 (Y/n)？ Y
    您已登录为 [email@example.com]。

    请选择要使用的云项目：
     [1] existing-bun-app-1234
     [2] 输入项目 ID
     [3] 创建新项目
    请输入数字选择或文本值（必须与列表项完全匹配）：3

    请输入项目 ID。my-bun-app
    您当前的项目已设置为：[my-bun-app]

    Google Cloud CLI 已配置并准备使用！
    ```
  </Step>

  <Step title="（可选）将项目信息存储到环境变量">
    设置您的项目 ID 和编号变量，方便后续步骤复用。

    ```bash terminal icon="terminal" theme={"theme":{"light":"github-light","dark":"dracula"}}
    PROJECT_ID=$(gcloud projects list --format='value(projectId)' --filter='name="my bun app"')
    PROJECT_NUMBER=$(gcloud projects list --format='value(projectNumber)' --filter='name="my bun app"')

    echo $PROJECT_ID $PROJECT_NUMBER
    ```

    ```txt theme={"theme":{"light":"github-light","dark":"dracula"}}
    my-bun-app-... [PROJECT_NUMBER]
    ```
  </Step>

  <Step title="关联计费账户">
    列出可用的计费账户，并把一个账户关联到您的项目：

    ```bash terminal icon="terminal" theme={"theme":{"light":"github-light","dark":"dracula"}}
    gcloud billing accounts list
    ```

    ```txt theme={"theme":{"light":"github-light","dark":"dracula"}}
    ACCOUNT_ID            NAME                OPEN  MASTER_ACCOUNT_ID
    [BILLING_ACCOUNT_ID]  我的计费账户         True
    ```

    将计费账户关联到项目。将 `[BILLING_ACCOUNT_ID]` 替换为您的计费账户 ID。

    ```bash terminal icon="terminal" theme={"theme":{"light":"github-light","dark":"dracula"}}
    gcloud billing projects link $PROJECT_ID --billing-account=[BILLING_ACCOUNT_ID]
    ```

    ```txt theme={"theme":{"light":"github-light","dark":"dracula"}}
    billingAccountName: billingAccounts/[BILLING_ACCOUNT_ID]
    billingEnabled: true
    name: projects/my-bun-app-.../billingInfo
    projectId: my-bun-app-...
    ```
  </Step>

  <Step title="启用 API 并配置 IAM 角色">
    激活所需服务并授予 Cloud Build 权限：

    ```bash terminal icon="terminal" theme={"theme":{"light":"github-light","dark":"dracula"}}
    gcloud services enable run.googleapis.com cloudbuild.googleapis.com
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member=serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.builder
    ```

    <Note>
      这些命令启用了 Cloud Run (`run.googleapis.com`) 和 Cloud Build (`cloudbuild.googleapis.com`)，这是从源码部署所必需的。Cloud Run 运行您的容器化应用，而 Cloud Build 负责构建和打包它。

      IAM 绑定授予 Compute Engine 服务账户（`$PROJECT_NUMBER-compute@developer.gserviceaccount.com`）权限，代表您构建和部署镜像。
    </Note>
  </Step>

  <Step title="添加 Dockerfile">
    在项目根目录创建新的 `Dockerfile`。该文件包含初始化容器、复制本地项目文件、安装依赖和启动应用的指令。

    ```docker Dockerfile icon="docker" theme={"theme":{"light":"github-light","dark":"dracula"}}
    # 使用官方 Bun 镜像运行应用
    FROM oven/bun:latest

    # 复制 package.json 和 bun.lock 到容器
    COPY package.json bun.lock ./

    # Install the dependencies
    RUN bun install --production --frozen-lockfile

    # 复制其余的应用文件到容器
    COPY . .

    # 运行应用
    CMD ["bun", "index.ts"]
    ```

    <Note>
      请确保启动命令对应您的应用入口点。如果您在 package.json 中有 start 脚本，也可以使用 `CMD ["bun", "run", "start"]`。

      此镜像会安装依赖并在容器内用 Bun 运行您的应用。如果应用没有依赖，可以省略 `RUN bun install --production --frozen-lockfile` 这一行。
    </Note>

    在项目根目录创建新的 `.dockerignore` 文件。该文件列出应 *排除* 在容器镜像之外的文件和目录，比如 `node_modules`，这可以让构建更快更小：

    ```docker .dockerignore icon="Docker" theme={"theme":{"light":"github-light","dark":"dracula"}}
    node_modules
    Dockerfile*
    .dockerignore
    .git
    .gitignore
    README.md
    LICENSE
    .vscode
    .env
    # 其他想排除的文件或目录
    ```
  </Step>

  <Step title="部署服务">
    确保您处在包含 `Dockerfile` 的目录中，然后直接从本地源码部署：

    <Note>
      请将 `--region` 标志更新为您偏好的区域。您也可以省略此标志，在交互式提示中选择区域。
    </Note>

    ```bash terminal icon="terminal" theme={"theme":{"light":"github-light","dark":"dracula"}}
    gcloud run deploy my-bun-app --source . --region=us-west1 --allow-unauthenticated
    ```

    ```txt theme={"theme":{"light":"github-light","dark":"dracula"}}
    从源码部署需要一个 Artifact Registry Docker 仓库来存储构建后的容器。将会在区域 [us-west1] 创建名为
    [cloud-run-source-deploy] 的仓库。

    是否继续 (Y/n)? Y

    使用 Dockerfile 构建并将容器部署到 Cloud Run 服务 [my-bun-app]，项目 [my-bun-app-...]，区域 [us-west1]
    ✓ 构建和部署... 完成。
      ✓ 验证服务...
      ✓ 上传源码...
      ✓ 构建容器... 日志可在 [https://console.cloud.google.com/cloud-build/builds...] 查看。
      ✓ 创建修订版本...
      ✓ 路由流量...
      ✓ 设置 IAM 策略...
    完成。
    服务 [my-bun-app] 版本 [my-bun-app-...] 已部署，正在处理 100% 流量。
    服务 URL：https://my-bun-app-....us-west1.run.app
    ```
  </Step>

  <Step title="访问您的在线应用">
    🎉 您的 Bun 应用现已上线！

    访问服务 URL（`https://my-bun-app-....us-west1.run.app`）确认一切正常。
  </Step>
</Steps>
