Use o Caddy em vez do NGNIX como seu proxy reverso

Here are some notes about how I got my test Discourse instance running with Caddy Server.

Cool stuff about Caddy:

Cons:

  • Not as battle tested as apache, nginx and cia.

How To

Preparing Discourse

First, you need to apply this changes to your app.yml:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml" # <<<----- THIS IS NEW

## Let this two commented out
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"

## Let this two commented out 
expose:
#  - "8080:80"   # http
#  - "443:443" # https

env:
  ## This should be commented out too
  #LETSENCRYPT_ACCOUNT_EMAIL: mymail@gmail.com

Preparing Caddy

In the spirit of Discourse, let’s put Caddy in a Docker image too :whale2:

First prepare with:

mkdir /var/caddy
nano /var/caddy/Caddyfile

Add the following to the Caddyfile

forum.example.com # your domain here

proxy / unix:/sock/nginx.http.sock {
  transparent
}

Save and exit.

Let’s test

Now you need to rebuild Discourse:

/var/discourse
./launcher rebuild app

And then run Caddy:

docker run -d \
    -v /var/caddy/Caddyfile:/etc/Caddyfile \
    -v /var/caddy:/root/.caddy \
    -v /var/discourse/shared/standalone:/sock \
    -p 80:80 -p 443:443 \
    -p 80:80/udp -p 443:443/udp \
    --restart=always \
    --name caddy \
    --entrypoint "/usr/bin/caddy" \
    abiosoft/caddy -quic -email MYEMAILHERE@gmail.com -agree --conf /etc/Caddyfile --log stdout

After all, your forum should be avaliable at your domain, using SSL + HTTP2 + QUIC. You can’t more hipster than that.

19 curtidas

I run Caddy’s Discourse forums with this Caddyfile and no container:

forum.caddyserver.com

timeouts off
proxy / localhost:8080 {
	transparent
}

I just set up Discourse (with one easy tweak) and ran Caddy on the host machine.

^ This setup has been tested, and I can confirm it has been running with no glitches for months.

10 curtidas

I like how you’ve proxied to the socket and left the ports unexposed.

Neat little guide that one can use as a guideline to easily incorporate their Discourse installation to an existing Caddy proxy, too. Cheers!

3 curtidas

But using nginx, as I can see now.

Well, I have more than 1 Discourse install with Caddy in the front, but I didn’t bother to replace the server header and it still shows nginx. Can be the same. Or they are just using the simple Discourse install and have no need to run a reverse proxy at all in the front.

1 curtida

My Discourse sites behind Caddy show nginx as the server too. I guess that transparent setting might make Caddy, uh, transparent.

3 curtidas

That might be a bug from a recent change, it didn’t used to do that. :thinking:

2 curtidas

Dear @Falco

Thank you so much for your posting.

I would like to install discourse using caddy condition, but I was confused with your docker command.

I never heard about the caddy, so I follow the digital ocean document

My question is, in the current server situation, Should I change the path
from etc/Caddyfile to /etc/caddy/Caddyfile?

docker run -d \
    -v /var/caddy/Caddyfile:/etc/Caddyfile \
    -v /var/caddy:/root/.caddy \
    -v /var/discourse/shared/standalone:/sock \
    -p 80:80 -p 443:443 \
    -p 80:80/udp -p 443:443/udp \
    --restart=always \
    --name caddy \
    --entrypoint "/usr/local/bin/caddy" \
    abiosoft/caddy -quic -email MYEMAILHERE@gmail.com -agree --conf /etc/Caddyfile --log stdout

Sincerely

Isso não funciona no meu servidor. Para mim, eu usei:

unix:/var/discourse/shared/standalone/nginx.http.sock

E isso é para o caddy v1. Para o caddy v2, por favor, use:

unix//var/discourse/shared/standalone/nginx.http.sock

Apenas substitua “:” por “/”.

1 curtida

Esse caminho funciona se você estiver seguindo o guia no OP e executando o Caddy no docker e montando os volumes conforme especificado. Se você não estiver seguindo o guia, haverá caminhos diferentes, sim.

3 curtidas

O domínio e o subdomínio do fórum deles agora estão nomeados em este.

1 curtida

Desculpe por desenterrar threads antigos, estou tentando fazer o Caddy funcionar com o Discourse. Na sua configuração do Caddy, você usa “proxy”, mas quando eu uso, diz que há um erro de sintaxe e que não é válido. O “proxy” não foi alterado para “reverse_proxy”?

aqui está minha configuração:

forum.example.com {
    reverse_proxy / unix//var/discourse/shared/standalone/nginx.http.sock {
        transparent
    }
}

Eu acho que sim. Você tentou?

1 curtida

Obrigado, Matt!
Posso confirmar que a configuração sem contêiner ainda funciona em 2025 :smiley:

forum.website.com {
        reverse_proxy localhost:8080
}

Usar apenas “proxy” não funcionou.

Também funciona muito bem para mim!

No entanto, recebi avisos de “Conteúdo Misto” seguindo essa configuração muito simples:


Para resolver isso, tive que adicionar uma diretiva adicional à seção env do arquivo de configuração (app.yml ou web_only.yml):

# FORÇAR SSL 
DISCOURSE_FORCE_HTTPS: true

Para referência, estas são as etapas atuais para uma configuração não dockerizada usando Caddy como proxy reverso:

1) Ajustar o arquivo de configuração do Discourse

  • Comentar certificados
    templates:
    #  - "templates/web.ssl.template.yml"
    #  - "templates/web.letsencrypt.ssl.template.yml"
    
  • Alterar mapeamento de porta e desabilitar mapeamento 443
    expose:
    - "8080:80"   # http
    # - "443:443" # https
    
  • Forçar HTTPS para servir arquivos estáticos
    env:
    DISCOURSE_FORCE_HTTPS: true
    

2) Reconstruir o Discourse

./launcher rebuild app

3) Configurar o Caddy

  • Instalar o Caddy, usando apenas as configurações padrão oficiais: Install — Caddy Documentation

  • Ajustar /etc/caddy/Caddyfile

    forum.example.com {
          reverse_proxy localhost:8080
    }
    

    Se você tiver multisite, pode simplesmente listar seus domínios:

    forum.example.com, forum2.example.com, forum3.example.com {
          reverse_proxy localhost:8080
    }
    

    Você também pode executar systemctl status caddy para verificar o local do arquivo de configuração padrão.

4) Executar o Caddy

systemctl start caddy

Recarregar configuração após alterações:

cd /etc/caddy
caddy reload
2 curtidas

Olá, obrigado pelo tutorial.

Existe alguma vantagem em usar o Caddy para uma configuração que não seja multi-site? Desempenho ou algo mais?

Não sei sobre isso… Eu só uso essa configuração nos meus servidores de staging agora porque é muito fácil adicionar ou alterar instâncias sem ter problemas com certificados.

2 curtidas

Fiz algo semelhante em uma configuração multissite para otimizar a configuração SSL…
… mas atualizei para o Caddy v2 e estou usando docker-compose com uma configuração multissite.

No web.yml:

  • usando apenas templates/web.socketed.template.yml e nenhum arquivo yml SSL.
  • comentando as portas \"443:443\", \"80:80\", etc.
  • adicionando DISCOURSE_HOSTNAME_ALIASES e DISCOURSE_FORCE_HTTPS: true

Isso usa a versão mais recente do Caddy 2, que é por isso que pode parecer diferente de algumas das configurações do Caddy v1 mencionadas acima neste tópico.

Este é o arquivo bash que cria os arquivos relevantes inicialmente e inicia o caddy:

#!/usr/bin/env bash

# Cria diretórios necessários
mkdir -p /var/caddy
mkdir -p /var/caddy/data
mkdir -p /var/caddy/config



# Cria o Caddyfile simplificado
cat > /var/caddy/Caddyfile << 'EOF'
{
    email seu-endereço-de-email-aqui@example.com
}

community1.example.com, community2.example.com, community3.example.com {
    reverse_proxy unix//sock/nginx.http.sock
}
EOF

# Cria docker-compose.yml
cat > /var/caddy/docker-compose.yml << 'EOF'
services:
  caddy:
    image: caddy:latest
    container_name: caddy-proxy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - /var/caddy/Caddyfile:/etc/caddy/Caddyfile
      - /var/caddy/data:/data
      - /var/caddy/config:/config
      - /var/discourse/shared/standalone:/sock
EOF

# Navega para o diretório caddy e inicia
cd /var/caddy

# Inicia o Caddy
docker compose up -d
2 curtidas