Используйте 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

Это не работает на моем сервере. Я использовал:

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

Это для caddy v1. Для caddy v2 используйте:

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

Просто замените «:» на «/».

1 лайк

Этот путь работает, если вы следуете руководству в первом сообщении и запускаете Caddy в Docker, монтируя тома так, как указано. Если вы не следуете руководству, пути будут другими, да.

3 лайка

Домен и поддомен их форума теперь названы в соответствии с этим.

1 лайк

Извините, что поднимаю старые темы. Я пытаюсь настроить Caddy для работы с Discourse. В вашей конфигурации Caddy используется директива «proxy», но при её использовании появляется ошибка синтаксиса, указывающая на то, что она недопустима. Разве «proxy» теперь не была заменена на «reverse_proxy»?

Вот моя конфигурация:

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

Думаю, да. Вы пробовали?

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?