> ## Documentation Index
> Fetch the complete documentation index at: https://bun.ll1025.cn/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。`gcloud init` 会登录并提示你选择现有项目或创建新项目。

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

    ```bash terminal icon="terminal" theme={null}
    gcloud init
    ```

    ```txt theme={null}
    欢迎！此命令将引导你完成 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={null}
    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={null}
    my-bun-app-... [PROJECT_NUMBER]
    ```
  </Step>

  <Step title="关联结算账户">
    列出你可用的结算账户并将一个关联到你的项目：

    ```bash terminal icon="terminal" theme={null}
    gcloud billing accounts list
    ```

    ```txt theme={null}
    ACCOUNT_ID            NAME                OPEN  MASTER_ACCOUNT_ID
    [BILLING_ACCOUNT_ID]  My Billing Account  True
    ```

    将你的结算账户关联到项目。将 `[BILLING_ACCOUNT_ID]` 替换为你的结算账户 ID。

    ```bash terminal icon="terminal" theme={null}
    gcloud billing projects link $PROJECT_ID --billing-account=[BILLING_ACCOUNT_ID]
    ```

    ```txt theme={null}
    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={null}
    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={null}
    # 使用官方 Bun 镜像来运行应用程序
    FROM oven/bun:latest

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

    # 安装依赖
    RUN bun install --production --frozen-lockfile

    # 将应用程序的其余部分复制到容器中
    COPY . .

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

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

      如果你的应用没有依赖项，可以省略 `RUN bun install --production --frozen-lockfile` 这一行。
    </Note>

    在项目的根目录下创建一个新的 `.dockerignore` 文件。它列出了要从容器镜像中\_排除\_的文件和目录，例如 `node_modules`，这有助于使构建更快、更小：

    ```docker .dockerignore icon="Docker" theme={null}
    node_modules
    Dockerfile*
    .dockerignore
    .git
    .gitignore
    README.md
    LICENSE
    .vscode
    .env
    # 任何其他你想要排除的文件或目录
    ```
  </Step>

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

    <Note>将 `--region` 标志更新为你偏好的区域，或省略它以交互方式选择区域。</Note>

    ```bash terminal icon="terminal" theme={null}
    gcloud run deploy my-bun-app --source . --region=us-west1 --allow-unauthenticated
    ```

    ```txt theme={null}
    从源代码部署需要一个 Artifact Registry Docker 仓库来存储构建的容器。将在区域 [us-west1] 中创建
    一个名为 [cloud-run-source-deploy] 的仓库。

    是否要继续 (Y/n)？Y

    使用 Dockerfile 构建并将容器部署到项目 [my-bun-app-...] 区域 [us-west1] 的 Cloud Run 服务 [my-bun-app]
    ✓ 正在构建和部署... 完成。
      ✓ 正在验证服务...
      ✓ 正在上传源代码...
      ✓ 正在构建容器... 日志可在 [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>
