Skip to content

DigitalOcean is a cloud platform that provides a range of services for building and deploying applications.

In this guide, we will deploy a Bun HTTP server to DigitalOcean using a Dockerfile.

NOTE

Before continuing, make sure you have:

Create a new DigitalOcean Container Registry

Create a new Container Registry to store the Docker image.

Through the DigitalOcean dashboard

In the DigitalOcean dashboard, go to Container Registry, and enter the details for the new registry.

Make sure the details are correct, then click Create Registry.

Through the DigitalOcean CLI
bash
doctl registry create bun-digitalocean-demo
txt
Name                     Endpoint                                           Region slug
bun-digitalocean-demo    registry.digitalocean.com/bun-digitalocean-demo    sfo2

You should see the new registry in the DigitalOcean registry dashboard:

Create a new Dockerfile

Make sure you're in the directory containing your project, then create a new Dockerfile in the root of your project. This file contains the instructions to initialize the container, copy your local project files into it, install dependencies, and start the application.

docker
# Use the official Bun image to run the application
FROM oven/bun:debian

# Set the work directory to `/app`
WORKDIR /app

# Copy the package.json and bun.lock into the container
COPY package.json bun.lock ./

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

# Copy the rest of the application into the container
COPY . .

# Expose the port (DigitalOcean will set PORT env var)
EXPOSE 8080

# Run the application
CMD ["bun", "index.ts"]

NOTE

Make sure that the start command corresponds to your application's entry point. This can also be `CMD ["bun", "run", "start"]` if you have a start script in your `package.json`.

This image installs dependencies and runs your app with Bun inside a container. If your app doesn't have dependencies, you can omit the RUN bun install --production --frozen-lockfile line.

Create a new .dockerignore file in the root of your project. This file contains the files and directories that should be excluded from the container image, such as node_modules. This makes your builds faster and smaller:

docker
node_modules
Dockerfile*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
.env
# Any other files or directories you want to exclude

Authenticate Docker with DigitalOcean registry

Before building and pushing the Docker image, authenticate Docker with the DigitalOcean Container Registry:

bash
doctl registry login
txt
Successfully authenticated with registry.digitalocean.com

NOTE

This command authenticates Docker with DigitalOcean's registry using your DigitalOcean credentials. Without this step, the build and push command will fail with a 401 authentication error.

Build and push the Docker image to the DigitalOcean registry

Make sure you're in the directory containing your Dockerfile, then build and push the Docker image to the DigitalOcean registry in one command:

bash
docker buildx build --platform=linux/amd64 -t registry.digitalocean.com/bun-digitalocean-demo/bun-digitalocean-demo:latest --push .

NOTE

If you're building on an ARM Mac (M1/M2), you must use `docker buildx` with `--platform=linux/amd64` to ensure compatibility with DigitalOcean's infrastructure. Using `docker build` without the platform flag will create an ARM64 image that won't run on DigitalOcean.

Once the image is pushed, you should see it in the DigitalOcean registry dashboard:

Create a new DigitalOcean App Platform project

In the DigitalOcean dashboard, go to App Platform > Create App. We can create a project directly from the container image.

Make sure the details are correct, then click Next.

Review and configure resource settings, then click Create app.

Visit your live application

🥳 Your app is now live! Once the app is created, you should see it in the App Platform dashboard with the public URL.

Released under the MIT License.