Используйте Caddy вместо NGINX в качестве обратного прокси

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

## Leave these two commented out
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"

## Leave these two commented out 
expose:
#  - "8080:80"   # http
#  - "443:443" # https

env:
  ## This should be commented out
  #LETSENCRYPT_ACCOUNT_EMAIL: mymail@gmail.com
  ## This is required to avoid mixed content warnings when behind a reverse proxy
  DISCOURSE_FORCE_HTTPS: true

Preparing Caddy

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

First prepare with:

mkdir -p /var/caddy/data /var/caddy/config
nano /var/caddy/Caddyfile

Add the following to the Caddyfile (using Caddy v2 syntax):

{
  email MYEMAILHERE@gmail.com
}

forum.example.com { # your domain here
  reverse_proxy unix//sock/nginx.http.sock
}

Save and exit.

Let’s test

Now you need to rebuild Discourse:

cd /var/discourse
./launcher rebuild app

And then run Caddy:

docker run -d \
    -v /var/caddy/Caddyfile:/etc/caddy/Caddyfile \
    -v /var/caddy/data:/data \
    -v /var/caddy/config:/config \
    -v /var/discourse/shared/standalone:/sock \
    -p 80:80 -p 443:443 \
    -p 443:443/udp \
    --restart=always \
    --name caddy \
    caddy:latest

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

Last edited by @pacharanero 2026-04-19T13:38:22Z

Check documentPerform check on document:
21 лайк

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.

12 лайков

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 лайка

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 лайк

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

3 лайка

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

2 лайка

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

This not work on my server. For me, I used:

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

And this is for caddy v1. For caddy v2, please use:

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

Just replace “:” to “/”.

1 лайк

That path works if you are following the guide in the OP and running Caddy in docker and mounting the volumes as specified. If you are not following the guide, there will be different paths, yes.

3 лайка

Their forum domain and subdomain are now named under this.

1 лайк

Sorry for bumping old threads, I’m trying to make Caddy work with Discourse. In your Caddy configuration, you use “proxy”, but when I use it, it says that there is a syntax error and that it’s not valid. Hasn’t “proxy” now been changed to “reverse_proxy”?

here’s my config:

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

I think so. Did you try it?

1 лайк

Спасибо, Мэтт!
Могу подтвердить, что настройка без контейнера всё ещё работает в 2025 году :smiley:

forum.website.com {
        reverse_proxy localhost:8080
}

Использование просто “proxy” не сработало.

У меня тоже всё отлично работает!

Однако после выполнения этой предельно простой инструкции я получил предупреждения о «смешанном содержимом»:


Чтобы устранить их, мне пришлось добавить дополнительную директиву в секцию env файла конфигурации (app.yml или web_only.yml):

# ПРИНУДИТЕЛЬНОЕ ИСПОЛЬЗОВАНИЕ SSL
DISCOURSE_FORCE_HTTPS: true

Для справки, вот текущие шаги для настройки без Docker с использованием Caddy в качестве обратного прокси:

1) Отредактируйте файл конфигурации Discourse

  • Закомментируйте сертификаты
    templates:
    #  - "templates/web.ssl.template.yml"
    #  - "templates/web.letsencrypt.ssl.template.yml"
    
  • Измените сопоставление портов и отключите сопоставление 443
    expose:
    - "8080:80"   # http
    # - "443:443" # https
    
  • Принудительно включите HTTPS для раздачи статических файлов
    env: 
    DISCOURSE_FORCE_HTTPS: true
    

2) Пересоберите Discourse

./launcher rebuild app

3) Настройте Caddy

  • Установите Caddy, используя стандартные параметры из официальной документации: Install — Caddy Documentation

  • Отредактируйте файл /etc/caddy/Caddyfile

    forum.example.com {
          reverse_proxy localhost:8080
    }
    

    Если у вас несколько сайтов, просто перечислите ваши домены:

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

    Также вы можете выполнить systemctl status caddy, чтобы проверить расположение файла конфигурации по умолчанию.

4) Запустите Caddy

systemctl start caddy

Перезагрузите конфигурацию после внесения изменений:

cd /etc/caddy
caddy reload
4 лайка

Привет, спасибо за урок.

Есть ли какие-либо преимущества в использовании Caddy для не-мультисайтовой установки? Производительность или что-то ещё?

Я не уверен насчёт этого… Я просто использую эту настройку на своих тестовых серверах, потому что так действительно легко добавлять или изменять экземпляры, не сталкиваясь с проблемами сертификатов.

2 лайка

Я делал нечто подобное в настройке мультисайта для упрощения настройки SSL…
… но обновил до Caddy v2 и использую docker-compose с мультисайтовой настройкой.

В web.yml:

  • используется только templates/web.socketed.template.yml без SSL yml-файлов.
  • закомментированы порты "443:443", "80:80" и т. д.
  • добавлены переменные DISCOURSE_HOSTNAME_ALIASES и DISCOURSE_FORCE_HTTPS: true.

Здесь используется последняя версия Caddy 2, поэтому конфигурация может отличаться от некоторых приведённых выше в этой теме конфигураций Caddy v1.

Ниже приведён bash-скрипт, который создаёт необходимые файлы и запускает Caddy:

#!/usr/bin/env bash

# Создать необходимые директории
mkdir -p /var/caddy
mkdir -p /var/caddy/data
mkdir -p /var/caddy/config



# Создать упрощённый файл Caddyfile
cat > /var/caddy/Caddyfile << 'EOF'
{
    email ваш-email-адрес-здесь@example.com
}

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

# Создать 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

# Перейти в директорию caddy и запустить
cd /var/caddy

# Запустить Caddy
docker compose up -d
2 лайка

Спасибо! Я хочу перейти с Nginx на Caddy. У вас всё ещё есть unix//sock/nginx.http.sock — используете ли вы одновременно и Nginx, и Caddy?