How to deploy a Fiber application on DigitalOcean

How to deploy a Fiber application on DigitalOcean

We may earn an affiliate commission through purchases made from our guides and tutorials.

Building web applications in Go is a rewarding experience: the language is fast, reliable, and well-suited for servers. If you’ve tried Fiber—a lightweight framework inspired by Express—you know how quickly you can spin up routes and APIs. But development is only half the story. At some point, you need to put your Fiber app online where real users can reach it.

DigitalOcean is a great place to do that. It gives you affordable, developer-friendly infrastructure with the right balance of flexibility and simplicity. In this guide, we’ll walk through deploying a Fiber application to a DigitalOcean Droplet (a virtual private server). By the end, you’ll have your app running as a supervised service, served securely over HTTPS with your own domain.

You’ll need a DigitalOcean account before getting started. Once you’re set up, the rest of the process is straightforward.

Prepare your Fiber application

Let’s start with a minimal example. If you already have an app, you can skip ahead. Otherwise, here’s the smallest possible Fiber server:

package main

import (
    "log"
    "github.com/gofiber/fiber/v2"
)

func main() {
    app := fiber.New()
    app.Get("/", func(c *fiber.Ctx) error {
        return c.SendString("Hello from Fiber!")
    })
    log.Fatal(app.Listen(":3000"))
}

Initialize your module and pull Fiber:

go mod init github.com/you/your-app
go get github.com/gofiber/fiber/v2

You can run it locally with go run . and visit http://localhost:3000 to confirm it works.

Create and secure a Droplet

Head to your DigitalOcean dashboard, click Create → Droplet, and choose Ubuntu 22.04 (LTS). A small plan (1 GB RAM, 1 vCPU) is enough to start. Pick a region near your users and add your SSH key for secure login.

Once the Droplet is ready, SSH in:

ssh root@your_droplet_ip

Add a non-root user for safer day-to-day work:

adduser deploy
usermod -aG sudo deploy

Switch to that user and update your system:

sudo apt update && sudo apt upgrade -y

Enable a firewall:

sudo ufw allow OpenSSH
sudo ufw enable

We’ll open HTTP/HTTPS ports later when we set up the reverse proxy.

Install Go and tools

You’ll need Go on the server to build or run your project. The apt package is often outdated, so grab the latest from the official site:

cd /tmp
wget https://go.dev/dl/go1.24.5.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.24.5.linux-amd64.tar.gz

Add Go to your PATH (for example in ~/.profile):

export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

Reload your shell and confirm:

go version

You should see Go 1.24.x or newer.

Deploy your app code

Clone your repository into the server:

mkdir -p ~/app && cd ~/app
git clone https://github.com/you/your-app.git .

Build the binary:

go build -o fiber-app .

Test it:

./fiber-app

Open another terminal and run:

curl http://localhost:3000

If you see the “Hello from Fiber!” response, your app is running. Stop it for now (Ctrl+C).

Run Fiber as a service

To keep your app running in the background and automatically restart it on errors or reboots, set up a systemd service. Create the unit file:

sudo nano /etc/systemd/system/fiber-app.service

Paste in:

[Unit]
Description=Fiber App
After=network.target

[Service]
Type=simple
User=deploy
WorkingDirectory=/home/deploy/app
ExecStart=/home/deploy/app/fiber-app
Restart=on-failure
RestartSec=5s
Environment=PORT=3000

[Install]
WantedBy=multi-user.target

Reload systemd and start the service:

sudo systemctl daemon-reload
sudo systemctl start fiber-app
sudo systemctl enable fiber-app

Check status:

sudo systemctl status fiber-app

You should see it running. Logs are available with:

sudo journalctl -u fiber-app -f

Set up a reverse Proxy and TLS

Right now, the app listens only on port 3000. Let’s add a reverse proxy to expose it to the web with HTTPS. Nginx is a common choice:

sudo apt install -y nginx
sudo ufw allow "Nginx Full"

Create a server block:

sudo nano /etc/nginx/sites-available/yourdomain.com

Add:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Enable and restart Nginx:

sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

Point your domain’s A record to the Droplet’s IP. Once DNS propagates, you can issue a Let’s Encrypt certificate:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Certbot will configure TLS automatically. From here on, your Fiber app will be reachable at https://yourdomain.com.

Optional: Continuous Deployment

If you prefer not to SSH every time you update code, set up CI/CD. For example, GitHub Actions can build your binary on push and copy it to the Droplet, then restart the service. A sample workflow:

name: Deploy

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-go@v4
      with:
        go-version: 1.24
    - run: GOOS=linux GOARCH=amd64 go build -o fiber-app
    - uses: appleboy/scp-action@v0.1.0
      with:
        host: ${{ secrets.DROPLET_IP }}
        username: deploy
        key: ${{ secrets.SSH_KEY }}
        source: fiber-app
        target: /home/deploy/app/
    - uses: appleboy/ssh-action@v0.1.0
      with:
        host: ${{ secrets.DROPLET_IP }}
        username: deploy
        key: ${{ secrets.SSH_KEY }}
        script: sudo systemctl restart fiber-app

This way, deployments happen automatically when you push to main.

Troubleshooting / tips

  • Ensure your firewall (UFW) allows ports 80 and 443 (if using TLS), and allows your application port internally.
  • Look at journalctl -u fiber-app for errors (missing libraries, permission issues).
  • If the app fails to start under systemd but runs manually, check paths, permissions, environment variables, or hardcoded relative paths.
  • If TLS fails, ensure DNS is correctly pointing, and your server_name matches your certificate domains.
  • If your app needs environment variables (e.g. DB credentials), either set them in the systemd unit (Environment=…) or use an env file.
  • To upgrade your app, pull new code, rebuild binary, replace the executable, then sudo systemctl restart fiber-app.

This setup gives you full control over your stack. Once working, you can scale further (load balancers, multiple droplets, container orchestration) as needed.

Was this helpful?

Thanks for your feedback!
Alex is the resident editor and oversees all of the guides published. His past work and experience include Colorlib, Stack Diary, Hostvix, and working with a number of editorial publications. He has been wrangling code and publishing his findings about it since the early 2000s.

Leave a comment

Your email address will not be published. Required fields are marked *