logo
Published on

Use Caddy to reverse proxy with Fly.io

Use Caddy to reverse proxy with Fly.io

Introduction

To deploy several services in one fly.io app, using Caddy as reverse proxy.

Project directory:

├── chat-avatar (Service 1)
├── psn-steam-api (Service 2)
├── Caddyfile
├── Dockerfile
└── fly.toml

Steps

Caddyfile

:7070 {
    # psn-steam-api
    handle /psn-steam-api/* {
        # remove /psn-steam-api from the request
        uri strip_prefix /psn-steam-api 
        reverse_proxy localhost:7071
    }

    # chat-avatar 
    handle /chat-avatar/* {
        uri strip_prefix /chat-avatar 
        reverse_proxy localhost:7072
    }

    # homepage 
    handle / {
        respond "NO CONTENT" 200
    }

    log {
        output stdout 
    }
}

Dockerfile

FROM golang:1.22-alpine AS builder 

# psn-steam-api
WORKDIR /app/psn-steam-api 
COPY ./psn-steam-api . 
RUN go mod download
RUN go build -o main ./cmd/main.go

# chat-avatar 
WORKDIR /app/chat-avatar 
COPY ./chat-avatar . 
RUN go mod download
RUN go build -o main ./cmd/main.go

# caddy 
FROM caddy:2.7-alpine 

COPY ./Caddyfile /etc/caddy/Caddyfile

COPY --from=builder /app/psn-steam-api/main /usr/local/bin/psn-steam-api
COPY --from=builder /app/chat-avatar/main /usr/local/bin/chat-avatar

# start script 
RUN printf '#!/bin/sh\npsn-steam-api &\nchat-avatar &\ncaddy run --config /etc/caddy/Caddyfile\n' > /usr/local/bin/start.sh

RUN chmod +x /usr/local/bin/start.sh
RUN chmod +x /usr/local/bin/psn-steam-api
RUN chmod +x /usr/local/bin/chat-avatar

EXPOSE 7070

CMD ["/usr/local/bin/start.sh"]

fly.toml

app = 'app-name'
primary_region = 'nrt'

[build]

[http_service]
  internal_port = 7070
  force_https = true
  auto_stop_machines = 'stop'
  auto_start_machines = true
  min_machines_running = 1
  processes = ['app']

[[vm]]
  memory = '512mb'
  cpu_kind = 'shared'
  cpus = 1

Deploy

fly deploy