> ## 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.

# 在 DigitalOcean 上部署 Bun 应用

[DigitalOcean](https://www.digitalocean.com/) 是一个云平台，提供多种构建和部署应用的服务。

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

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

  * 准备好一个可部署的 Bun 应用
  * 拥有一个 [DigitalOcean 账户](https://www.digitalocean.com/)
  * 已安装并配置好 [DigitalOcean CLI](https://docs.digitalocean.com/reference/doctl/how-to/install/#step-1-install-doctl)
  * 已安装并添加到 `PATH` 中的 [Docker](https://docs.docker.com/get-started/get-docker/)
</Note>

***

<Steps>
  <Step title="创建一个新的 DigitalOcean 容器注册表">
    创建一个新的容器注册表以存储 Docker 镜像。

    <Tabs>
      <Tab title="通过 DigitalOcean 控制面板">
        在 DigitalOcean 控制面板中，进入 [**容器注册表**](https://cloud.digitalocean.com/registry)，并填写新注册表的详细信息。

        <Frame>
          <img src="https://mintcdn.com/bun-zhcndoc/7hwCkUCcx3ux5DPj/images/guides/digitalocean-7.png?fit=max&auto=format&n=7hwCkUCcx3ux5DPj&q=85&s=04ff34750c843e144dc10c777fe6213a" alt="DigitalOcean 注册表控制面板" width="5552" height="2856" data-path="images/guides/digitalocean-7.png" />
        </Frame>

        确认信息无误后，点击 **创建注册表**。
      </Tab>

      <Tab title="通过 DigitalOcean CLI">
        ```bash terminal icon="terminal" theme={"theme":{"light":"github-light","dark":"dracula"}}
        doctl registry create bun-digitalocean-demo
        ```

        ```txt theme={"theme":{"light":"github-light","dark":"dracula"}}
        Name                     Endpoint                                           Region slug
        bun-digitalocean-demo    registry.digitalocean.com/bun-digitalocean-demo    sfo2
        ```
      </Tab>
    </Tabs>

    你应该能在 [**DigitalOcean 注册表控制面板**](https://cloud.digitalocean.com/registry) 看到新的注册表：

    <Frame>
      <img src="https://mintcdn.com/bun-zhcndoc/7hwCkUCcx3ux5DPj/images/guides/digitalocean-1.png?fit=max&auto=format&n=7hwCkUCcx3ux5DPj&q=85&s=8278de106e98438d9d4ea7af9b30569a" alt="DigitalOcean 注册表控制面板" width="2636" height="1414" data-path="images/guides/digitalocean-1.png" />
    </Frame>
  </Step>

  <Step title="创建新的 Dockerfile">
    确保你位于包含项目的目录，然后在项目根目录创建一个新的 `Dockerfile`。该文件包含初始化容器、将本地项目文件复制进去、安装依赖以及启动应用的指令。

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

    # 设置工作目录为 `/app`
    WORKDIR /app

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

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

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

    # 开放端口（DigitalOcean 会设置 PORT 环境变量）
    EXPOSE 8080

    # 启动应用
    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="用 Docker 验证登录 DigitalOcean 注册表">
    在构建和推送 Docker 镜像之前，先用 Docker 认证登录 DigitalOcean 容器注册表：

    ```bash terminal icon="terminal" theme={"theme":{"light":"github-light","dark":"dracula"}}
    doctl registry login
    ```

    ```txt theme={"theme":{"light":"github-light","dark":"dracula"}}
    Successfully authenticated with registry.digitalocean.com
    ```

    <Note>
      此命令使用你的 DigitalOcean 账号认证 Docker 与 DigitalOcean 注册表通信。若未执行此步骤，构建和推送操作会因 401 认证错误而失败。
    </Note>
  </Step>

  <Step title="构建并推送 Docker 镜像到 DigitalOcean 注册表">
    确保你当前在包含 `Dockerfile` 的目录，使用一条命令构建并推送 Docker 镜像到 DigitalOcean 注册表：

    ```bash terminal icon="terminal" theme={"theme":{"light":"github-light","dark":"dracula"}}
    docker buildx build --platform=linux/amd64 -t registry.digitalocean.com/bun-digitalocean-demo/bun-digitalocean-demo:latest --push .
    ```

    <Note>
      如果你的机器是 ARM 架构（如 M1/M2 Mac），必须使用 `docker buildx` 并指定 `--platform=linux/amd64` 以保证镜像与 DigitalOcean 基础设施兼容。直接使用 `docker build` 会生成 ARM64 镜像，DigitalOcean 上无法运行。
    </Note>

    推送完成后，你应能在 [**DigitalOcean 注册表控制面板**](https://cloud.digitalocean.com/registry) 看到镜像：

    <Frame>
      <img src="https://mintcdn.com/bun-zhcndoc/7hwCkUCcx3ux5DPj/images/guides/digitalocean-2.png?fit=max&auto=format&n=7hwCkUCcx3ux5DPj&q=85&s=ab973e49ad1638ce69de992846b8e894" alt="DigitalOcean 注册表控制面板" width="2636" height="1414" data-path="images/guides/digitalocean-2.png" />
    </Frame>
  </Step>

  <Step title="创建新的 DigitalOcean App Platform 项目">
    在 DigitalOcean 控制面板，进入 [**App Platform**](https://cloud.digitalocean.com/apps) > **创建应用**。我们可以直接从容器镜像创建项目。

    <Frame>
      <img src="https://mintcdn.com/bun-zhcndoc/7hwCkUCcx3ux5DPj/images/guides/digitalocean-3.png?fit=max&auto=format&n=7hwCkUCcx3ux5DPj&q=85&s=afaf588b2151b2d3819a5030d9f8fed3" alt="DigitalOcean App Platform 项目控制面板" width="5272" height="2828" data-path="images/guides/digitalocean-3.png" />
    </Frame>

    确认信息无误后，点击 **下一步**。

    <Frame>
      <img src="https://mintcdn.com/bun-zhcndoc/7hwCkUCcx3ux5DPj/images/guides/digitalocean-4.png?fit=max&auto=format&n=7hwCkUCcx3ux5DPj&q=85&s=9853f4efab9bb58cc751c43b35488ad0" alt="DigitalOcean App Platform 服务控制面板" width="5272" height="2828" data-path="images/guides/digitalocean-4.png" />
    </Frame>

    检查并配置资源设置，然后点击 **创建应用**。

    <Frame>
      <img src="https://mintcdn.com/bun-zhcndoc/7hwCkUCcx3ux5DPj/images/guides/digitalocean-6.png?fit=max&auto=format&n=7hwCkUCcx3ux5DPj&q=85&s=52aeb154f0421e27c63f2eb164e5161b" alt="DigitalOcean App Platform 服务控制面板" width="5036" height="2688" data-path="images/guides/digitalocean-6.png" />
    </Frame>
  </Step>

  <Step title="访问你的在线应用">
    🥳 你的应用现已上线！应用创建完成后，你应该能在 App Platform 控制面板看到它及其公网 URL。

    <Frame>
      <img src="https://mintcdn.com/bun-zhcndoc/7hwCkUCcx3ux5DPj/images/guides/digitalocean-5.png?fit=max&auto=format&n=7hwCkUCcx3ux5DPj&q=85&s=87b831d83d800996d4091e8a8f095647" alt="DigitalOcean App Platform 应用控制面板" width="5036" height="2688" data-path="images/guides/digitalocean-5.png" />
    </Frame>
  </Step>
</Steps>
