# Обсуждение Traefik 2.0

**URL:** https://meta.discourse.org/t/discourse-with-traefik-2-0/130357
**Category:** Self-hosting
**Created:** [06.Октябрь.2019 18:57:04 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357 "2019-10-06T18:57:04Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![SvenC56](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/svenc56/32/132235_2.png) [@SvenC56](https://meta.discourse.org/u/SvenC56)
#### Post date: [06.Октябрь.2019 18:57:04 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/1 "2019-10-06T18:57:04Z")

</div>

Всем привет,

Я переезжаю на новый сервер и хочу использовать Traefik 2.0 в качестве обратного прокси. Сейчас у меня возникают трудности с новой конфигурацией. Я добавил раздел в конец файла `app.yml`. (Источник: [Discourse behind Traefik 🐁](https://meta.discourse.org/t/discourse-behind-traefik/84874))

```plaintext
...

expose:
  - "8060:80" # http
  - "8070:443" # https

...

docker_args:
  - "--network=web"
  - "--expose=8060"
  - "-l traefik.enable=true"
  - "-l traefik.http.routers.forum.rule=Host(`forum.example.com`)"
  - "-l traefik.http.routers.forum.entrypoints=websecure"
  - "-l traefik.http.routers.forum.tls=true"
  - "-l traefik.http.routers.forum.tls.certresolver=mytlschallenge"
  - "-l traefik.http.services.forum.loadbalancer.server.port=8060"
  - "-l traefik.docker.network=web"

```

Похоже, это не работает. При открытии маршрута я получаю ошибку `Bad Gateway`. Если же перейти напрямую по адресу `ip_adress:8060`, Discourse открывается.

У кого-нибудь есть опыт работы с Traefik 2.0?

Спасибо!

---

<div class="post-metadata">

### Author: ![SvenC56](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/svenc56/32/132235_2.png) [@SvenC56](https://meta.discourse.org/u/SvenC56)
#### Post date: [06.Октябрь.2019 19:33:40 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/2 "2019-10-06T19:33:40Z")

</div>

После некоторых попыток я смог решить проблему самостоятельно.

Для справки прикрепляю мой `app.yml`:

```plaintext
...

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"
  #- "templates/web.socketed.template.yml" 

## Какие TCP/IP порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал порт совместно с другим веб-сервером, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для деталей
#expose:
# - "8060:80" # http
# - "8070:443" # https

...

docker_args:
  - "--network=web"
  #- "--expose=8060"
  - "-l traefik.enable=true"
  - "-l traefik.http.routers.forum.rule=Host(`forum.example.com`)"
  - "-l traefik.http.routers.forum.entrypoints=websecure"
  - "-l traefik.http.routers.forum.tls=true"
  - "-l traefik.http.routers.forum.tls.certresolver=mytlschallenge"
  - "-l traefik.http.services.forum.loadbalancer.server.port=80"
  - "-l traefik.docker.network=web"

```

---

<div class="post-metadata">

### Author: ![PackElend](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/packelend/32/95294_2.png) [@PackElend](https://meta.discourse.org/u/PackElend)
#### Post date: [30.Ноябрь.2019 18:42:19 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/3 "2019-11-30T18:42:19Z")

</div>

> [@SvenC56](#):
>
> docker\_args:

Почему необходимо использовать `docker_args`? Согласно [GitHub - discourse/discourse\_docker: A Docker image for Discourse · GitHub](https://github.com/discourse/discourse_docker#labels), это должно работать следующим образом:

```plaintext
labels:
  monitor: 'true'
  app_name: {{config}}_discourse

```

Добавление меток к текущему контейнеру. В приведённом примере к опциям при запуске контейнера будут добавлены `--l monitor=true -l app_name=dev_discourse`.

Кроме того, где объясняется `docker_args`?

---

<div class="post-metadata">

### Author: ![PackElend](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/packelend/32/95294_2.png) [@PackElend](https://meta.discourse.org/u/PackElend)
#### Post date: [30.Ноябрь.2019 19:09:21 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/4 "2019-11-30T19:09:21Z")

</div>

@Cameron_D  
Как вы узнали, что `docker_args` — это правильный путь?

> [@Discourse behind Traefik mouse](https://meta.discourse.org/t/discourse-behind-traefik/84874/7?u=packelend):
>
> I never got the labels section working, so I just have a docker\_args section that looks like this: docker\_args: - "--network=web" - "--expose=80" - "-l traefik.backend=forums" - "-l traefik.frontend.rule=Host:forums.domain.com,cf-cdn.domain.com" - "-l traefik.docker.network=web" - "-l traefik.port=80" Not necessarily elegant, but it works.

---

<div class="post-metadata">

### Author: ![Cameron\_D](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cameron_d/32/97535_2.png) [@Cameron\_D](https://meta.discourse.org/u/Cameron_D)
#### Post date: [08.Декабрь.2019 05:33:48 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/5 "2019-12-08T05:33:48Z")

</div>

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

---

<div class="post-metadata">

### Author: ![PackElend](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/packelend/32/95294_2.png) [@PackElend](https://meta.discourse.org/u/PackElend)
#### Post date: [02.Январь.2020 22:44:09 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/6 "2020-01-02T22:44:09Z")

</div>

Привет,  
можешь поделиться своей конфигурацией Traefik?

У меня возникает ошибка 302: происходит автоматическое перенаправление на HTTPS, а затем всё замирает…  
В панели управления Traefik всё отображается как в порядке.

> **вот мой docker-compose.yml**
>
> ```
> version: "3.7"
> services:
> traefik-reverse-proxy:   
> # Официальный образ Docker Traefik v2.0
> image: traefik:latest #traefik:v2.0
> container_name: "traefik"       
> command:
> # Указать Traefik слушать Docker 
> - --providers.docker # (По умолчанию: true)
> # Включить API/панель управления / (указать конечную точку Docker для общения с API Docker)
> - --api=true # (По умолчанию: false)
> # Активировать панель управления. 
> - --api.dashboard # (По умолчанию: true)
> # Включить веб-интерфейс / Traefik по умолчанию слушает порт 8080 для API запросов / Активировать API напрямую на entryPoint с именем traefik. (По умолчанию: false) --> порт '8080'v= entryPoint 'traefik', переопределяет --api
> - --api.insecure=true # (По умолчанию: false) 
> # Включить дополнительные конечные точки для отладки и профилирования. 
> - --api.debug=true # (По умолчанию: false)
> # Установить уровень отладки лога
> - --log.level=DEBUG    
> # Запись accesslog
> - --accesslog=true    
> # Определение места хранения внутри контейнера, файл лога записывается внутри контейнера. Чтобы сделать его доступным на хосте, он монтируется, см. раздел volumes
> - --log.filePath=/var/traefik-container/logs/traefik-log.log
> - --accesslog.filepath=/var/traefik-container/logs/traefik-access.log
> # Переопределить имя entryPoint по умолчанию для порта 80 на "web"
> - --entrypoints.web.address=:80
> # Объявить имя entryPoint для порта 443
> - --entrypoints.websecure.address=:443
> #--providers.docker.endpoint=unix:///var/run/docker.sock    
> # Let's Encrypt
> - --certificatesresolvers.mytlschallenge.acme.tlschallenge=true
> - --certificatesresolvers.mytlschallenge.acme.email=my@email.com
> - --certificatesresolvers.mytlschallenge.acme.storage=/var/traefik-container/letsencrypt/acme.json
> ports:
> # Порт HTTP
> - "80:80"
> # Порт HTTPS
> - "443:443"
> # Веб-интерфейс (включен через --api.insecure=true)
> - "8080:8080"
> volumes: # синтаксис --> расположение-на-хосте:путь-в-контейнере
> # Чтобы Traefik мог слушать события Docker
> - /var/run/docker.sock:/var/run/docker.sock
> - /var/traefik/log:/var/traefik-container/logs
> - /var/traefik/letsencrypt:/var/traefik-container/letsencrypt
> labels:
> - "traefik.enable=true"
> - "traefik.docker.network=bridge_proxy_traefikv2"
> - "traefik.http.routers.traefikv2.rule=Host(`traefik.mydomain.community`)"
> - "traefik.http.routers.traefikv2.entrypoints=web"
> - "traefik.http.services.traefikv2.loadBalancer.server.port=80"
> 
> networks:
> - traefik
> #- default
>           
> #Tiny Go веб-сервер, выводящий информацию об ОС и HTTP-запросы в вывод
> # whoami:
> # image: "containous/whoami"
> # container_name: "whoami"
> # labels:
> # - "traefik.enable=true"
> # - "traefik.docker.network=bridge_proxy_traefikv2"
> # - "traefik.http.routers.whoami.rule=Host(`mydomain.community`)"
> # - "traefik.http.routers.whoami.entrypoints=web"
> # - "traefik.http.services.whoami.loadBalancer.server.port=80"
> # networks:
> # - traefik
> # #- default
>           
> whoami_sub:
> image: "containous/whoami"
> container_name: "whoami_sub"
> labels:
> - "traefik.enable=true"
> - "traefik.name=whoami_sub"
> - "traefik.docker.network=bridge_proxy_traefikv2"
> - "traefik.http.routers.whoami_sub.rule=Host(`whoami.mydomain.community`)"
> - "traefik.http.routers.whoami_sub.entrypoints=web"
> #- "traefik.http.services.whoami_sub.loadBalancer.server.port=80"
> networks:
> - traefik
> - default
> 
> networks:
> traefik:
> external:
> name: bridge_proxy_traefikv2
> 
> ```

> **вот мой app.yml для Discourse**
>
> ```
> ## это шаблон контейнера Docker Discourse "всё в одном", автономный
> ##
> ## После внесения изменений в этот файл ОБЯЗАТЕЛЬНО выполните пересборку
> ## /var/discourse/launcher rebuild app
> ##
> ## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
> ## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ ИЛИ ВЫРАВНИВАНИИ!
> ## посетите http://www.yamllint.com/, чтобы при необходимости проверить этот файл
> 
> templates:
> - "templates/postgres.template.yml"
> - "templates/redis.template.yml"
> - "templates/web.template.yml"
> - "templates/web.ratelimited.template.yml"
> ## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
> - "templates/web.ssl.template.yml"
> - "templates/web.letsencrypt.ssl.template.yml"
> 
> ## какие TCP/IP-порты должен открывать этот контейнер?
> ## Если вы хотите, чтобы Discourse использовал тот же порт, что и другой веб-сервер, например Apache или nginx,
> ## см. https://meta.discourse.org/t/17247 для деталей
> expose:
> # - "80:80" # http
> # - "443:443" # https
> 
> params:
> db_default_text_search_config: "pg_catalog.english"
> 
> ## Установите db_shared_buffers максимум в 25% от общего объема памяти.
> ## будет установлено автоматически при загрузке на основе обнаруженной оперативной памяти, или вы можете переопределить
> db_shared_buffers: "128MB"
> 
> ## может улучшить производительность сортировки, но увеличивает использование памяти на соединение
> #db_work_mem: "40MB"
> 
> ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
> #version: tests-passed
> 
> labels:
> app_name: discourse  
> traefik.enable: true
> traefik.docker.network: bridge_proxy_traefikv2  
> traefik.http.services.forum.loadbalancer.server.port: 80
> traefik.http.routers.forum.rule: Host(`forum.mydomain.community`)
> traefik.http.routers.forum.entrypoints: websecure
> traefik.http.routers.forum.tls: true
> traefik.http.routers.forum.tls.certresolver: mytlschallenge
>      
> docker_args:
> - "--network=bridge_proxy_traefikv2"
> # - "-l traefik.enable=true"
> # - "-l traefik.http.routers.forum.rule=Host(`fairbnb.community`)"
> # - "-l traefik.http.routers.forum.entrypoints=websecure"
> # - "-l traefik.http.routers.forum.tls=true"
> # - "-l traefik.http.routers.forum.tls.certresolver=mytlschallenge"
> # - "-l traefik.http.services.forum.loadbalancer.server.port=80"
> # - "-l traefik.docker.network=web"
>   
> env:
> LANG: en_US.UTF-8
> # DISCOURSE_DEFAULT_LOCALE: en
> 
> ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и ядер CPU.
> ## будет установлено автоматически при загрузке на основе обнаруженных процессоров, или вы можете переопределить
> UNICORN_WORKERS: 2
> 
> ## TODO: Доменное имя, на которое будет отвечать этот экземпляр Discourse
> ## Обязательно. Discourse не будет работать с чистым IP-адресом.
> DISCOURSE_HOSTNAME: forum.fairbnb.community
> 
> ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
> ## именем хоста (-h опция), что указано выше (по умолчанию "$hostname-$config")
> #DOCKER_USE_HOSTNAME: true
> 
> ## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
> ## при первой регистрации, например 'user1@example.com,user2@example.com'
> DISCOURSE_DEVELOPER_EMAILS: 'discourse@myemail.com'
> 
> ## TODO: SMTP-сервер, используемый для проверки новых учетных записей и отправки уведомлений
> ## АДРЕС SMTP, имя пользователя и пароль обязательны
> # ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
> DISCOURSE_SMTP_ADDRESS: smtp.zoho.eu
> DISCOURSE_SMTP_PORT: 587
> DISCOURSE_SMTP_USER_NAME: discourse@myemail.com
> DISCOURSE_SMTP_PASSWORD: "tempPassword"
> #DISCOURSE_SMTP_ENABLE_START_TLS: true # (опционально, по умолчанию true)
> 
> ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
> LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
> 
> ## Адрес http или https CDN для этого экземпляра Discourse (настроен на получение)
> ## см. https://meta.discourse.org/t/14857 для деталей
> #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
>   
> ## Контейнер Docker не имеет состояния; все данные хранятся в /shared
> volumes:
> - volume:
> host: /var/discourse/shared/standalone
> guest: /shared
> - volume:
> host: /var/discourse/shared/standalone/log/var-log
> guest: /var/log
> 
> ## Плагины размещаются здесь
> ## см. https://meta.discourse.org/t/19157 для деталей
> hooks:
> after_code:
> - exec:
> cd: $home/plugins
> cmd:
> - git clone https://github.com/discourse/docker_manager.git
> 
> ## Любые пользовательские команды для выполнения после сборки
> run:
> - exec: echo "Начало пользовательских команд"
> ## Если вы хотите установить адрес электронной почты 'From' для вашей первой регистрации, раскомментируйте и измените:
> ## После получения первого письма о регистрации закомментируйте строку обратно. Она нужна только один раз.
> - exec: rails r "SiteSetting.notification_email='discourse@zoho.fairbnb.community'"
> - exec: echo "Конец пользовательских команд"
> 
> ```

---

<div class="post-metadata">

### Author: ![PackElend](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/packelend/32/95294_2.png) [@PackElend](https://meta.discourse.org/u/PackElend)
#### Post date: [04.Январь.2020 20:55:19 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/7 "2020-01-04T20:55:19Z")

</div>

Возникли проблемы с доступом к панели управления Traefik через поддомен, но Discourse по-прежнему недоступен. См. [Discourse with Traefik 2.0 - Traefik v2 - Traefik Labs Community Forum](https://community.containo.us/t/discourse-instance-is-handled-by-api-internal-is-that-normal/3690/1)

Ниже приведены мои рабочие конфигурации.

1. С моими комментариями

2. Без моих комментариев

---

<div class="post-metadata">

### Author: ![PackElend](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/packelend/32/95294_2.png) [@PackElend](https://meta.discourse.org/u/PackElend)
#### Post date: [06.Январь.2020 13:51:53 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/8 "2020-01-06T13:51:53Z")

</div>

@Cameron_D  
@SvenC56  
@Cerix  
@huberfe  
Извините, что упоминаю вас напрямую, но, похоже, вы — единственные задокументированные пользователи, запускающие Discourse за Traefik.  
Несмотря на обещания, что Traefik позаботится обо всём, настройка, похоже, не так проста.  
Пока что мне не удалось добиться успеха:

> **Рабочие URL:**
>
> - [http://traefik.fairbnb.community](http://traefik.fairbnb.community/)
> - [http://forum.fairbnb.community:40080/latest](http://forum.fairbnb.community:40080/latest)
> - [http://fairbnb.community:40080/top](http://fairbnb.community:40080/top)

> **Не работающий URL:**
>
> - [http://forum.fairbnb.community/](http://forum.fairbnb.community/)

Я был бы крайне признателен, если бы вы могли поделиться полной конфигурацией Discourse и Traefik, чтобы я мог лучше разобраться в проблеме.

Мои конфигурации Traefik на момент публикации этого сообщения: [Endless 502 / forwarding when calling dashboard via subdomain #6123 - #9 by PackElend - Traefik v2 - Traefik Labs Community Forum](https://community.containo.us/t/endless-502-forwarding-when-calling-dashboard-via-subdomain-6123/3689/9?u=packelend)

---

<div class="post-metadata">

### Author: ![huberfe](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/huberfe/32/87242_2.png) [@huberfe](https://meta.discourse.org/u/huberfe)
#### Post date: [06.Январь.2020 14:14:38 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/9 "2020-01-06T14:14:38Z")

</div>

Так как я сейчас только с мобильного, пожалуйста, проверьте мою конфигурацию здесь: [traefik - SeAT Discourse Documentation](https://herpaderpaldent.github.io/seat-discourse/installation/proxy_server/traefik/)  
Обратите внимание: я запускал это только с версиями v1.6 и v1.7 Traefik. Не знаю, будет ли это работать с v2.

С этой настройкой несколько пользователей могли использовать мой плагин, Discourse и Traefik.

Примечание: я не прочитал ни одного сообщения в этой теме, просто отвечаю на уведомление.

---

<div class="post-metadata">

### Author: ![PackElend](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/packelend/32/95294_2.png) [@PackElend](https://meta.discourse.org/u/PackElend)
#### Post date: [06.Январь.2020 14:51:03 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/10 "2020-01-06T14:51:03Z")

</div>

Спасибо большое 🙂 🥳

> [@huberfe](#):
>
> Обратите внимание: у меня это работало только с версиями v1.6 и v1.7 Traefik. Не знаю, сработает ли это с v2.

Я попробую перевести это с v1 на v2.

У меня уже есть представление о том, как это сделать, нужно несколько часов, чтобы всё обдумать.

Я предполагаю, что шаблоны для SSL и Let’s Encrypt закомментированы, поэтому раздел шаблонов выглядит так:

```plaintext
    templates:
          - "templates/postgres.template.yml"
          - "templates/redis.template.yml"
          - "templates/web.template.yml"
          - "templates/web.ratelimited.template.yml"
        ## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
          #- "templates/web.ssl.template.yml"
          #- "templates/web.letsencrypt.ssl.template.yml"

```

---

<div class="post-metadata">

### Author: ![huberfe](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/huberfe/32/87242_2.png) [@huberfe](https://meta.discourse.org/u/huberfe)
#### Post date: [06.Январь.2020 15:58:00 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/11 "2020-01-06T15:58:00Z")

</div>

> [@PackElend](#):
>
> Я предполагаю, что шаблоны для SSL и Let’s Encrypt закомментированы, так что в разделе шаблонов это выглядит так:

Да, зачем вам нужно, чтобы контейнер Discourse управлял вашими SSL-сертификатами, если вы собираетесь включить прокси перед ним?

> [@PackElend](#):
>
> Я попробую перевести его с v1 на v2.

Пожалуйста, опубликуйте ваше решение, как только закончите.

---

<div class="post-metadata">

### Author: ![PackElend](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/packelend/32/95294_2.png) [@PackElend](https://meta.discourse.org/u/PackElend)
#### Post date: [06.Январь.2020 16:03:43 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/12 "2020-01-06T16:03:43Z")

</div>

> [@huberfe](#):
>
> Да зачем вам, чтобы контейнер Discourse управлял вашими SSL-сертификатами, если вы собираетесь включить прокси перед ним?

В [Run other websites on the same machine as Discourse - #301](https://meta.discourse.org/t/running-other-websites-on-the-same-machine-as-discourse/17247/301) см.

> [@PackElend](#):
>
> Просто мысли вслух.  
> Есть ли какой-либо сценарий использования, при котором SSL (и Let’s Encrypt) должны быть активны, даже если сервер находится за внешним обратным прокси?
> 
> - `- "templates/web.ssl.template.yml"`
> - `- "templates/web.letsencrypt.ssl.template.yml"`
> 
> При установке _на одну машину_ это может иметь смысл, если у вас запущено что-то, что может мешать незашифрованному взаимодействию между контейнерами (например, в случае компрометации одного из контейнеров).
> 
> Кроме того, я могу представить ситуацию, когда Discourse работает на отдельном хосте и принимает входящий трафик только от обратного прокси благодаря соответствующим правилам фаервола (для обеспечения безопасности, так как он открыт в интернет).

Я бы предложил также добавить раздел с шаблонами в документацию. Я заметил, что в моей установке они не были закомментированы, так как я сначала настраивал standalone-версию, чтобы получить `app.yml`. В самом начале я забыл их закомментировать. Это могло бы помочь избежать аналогичных проблем у других.

> [@huberfe](#):
>
> Пожалуйста, опубликуйте ваше решение, как только закончите.

Конечно

---

<div class="post-metadata">

### Author: ![PackElend](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/packelend/32/95294_2.png) [@PackElend](https://meta.discourse.org/u/PackElend)
#### Post date: [06.Январь.2020 19:03:20 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/13 "2020-01-06T19:03:20Z")

</div>

> [@huberfe](#):
>
> Так как я использую только мобильное устройство, пожалуйста, проверьте мою конфигурацию здесь: [traefik - SeAT Discourse Documentation](https://herpaderpaldent.github.io/seat-discourse/installation/proxy_server/traefik/)

Здесь не отображается [статическая конфигурация Traefik](https://docs.traefik.io/v1.7/basics/#static-traefik-configuration), верно?

---

<div class="post-metadata">

### Author: ![PackElend](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/packelend/32/95294_2.png) [@PackElend](https://meta.discourse.org/u/PackElend)
#### Post date: [06.Январь.2020 20:05:48 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/14 "2020-01-06T20:05:48Z")

</div>

**Отличные новости, все!** [http://forum.fairbnb.community/](http://forum.fairbnb.community/) доступен.

Это конфигурация с минимальными изменениями в `app.yml` для работы через http. В выходные я займусь настройкой https.

```
templates:
    - "templates/postgres.template.yml"
    - "templates/redis.template.yml"
    - "templates/web.template.yml"
    - "templates/web.ratelimited.template.yml"
    ## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
    #- "templates/web.ssl.template.yml"
    #- "templates/web.letsencrypt.ssl.template.yml"  

expose:
      #- "80:80" # http
      #- "443:443" # https

labels:
    traefik.enable: true
    traefik.http.services.discourse.loadbalancer.server.port: 80
    traefik.http.routers.discourse.rule: Host(`forum.fairbnb.community`)
    traefik.http.routers.discourse.entrypoints: web

```

---

<div class="post-metadata">

### Author: ![Cerix](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cerix/32/94018_2.png) [@Cerix](https://meta.discourse.org/u/Cerix)
#### Post date: [06.Январь.2020 20:28:27 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/15 "2020-01-06T20:28:27Z")

</div>

Для SSL просто настройте Traefik + Let’s Encrypt, вам не нужно использовать встроенный SSL Discourse.

Traefik будет управлять шифрованием для всех ваших контейнеров.

Сейчас я использую Traefik 1.6, поэтому пока не знаю, как включить это в Traefik v2.

---

<div class="post-metadata">

### Author: ![PackElend](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/packelend/32/95294_2.png) [@PackElend](https://meta.discourse.org/u/PackElend)
#### Post date: [07.Январь.2020 08:09:17 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/16 "2020-01-07T08:09:17Z")

</div>

> [@Cerix](#):
>
> Для SSL просто настройте Traefik + Let’s Encrypt, вам не нужно использовать встроенный SSL от Discourse.

Да, см. [Run other websites on the same machine as Discourse](https://meta.discourse.org/t/running-other-websites-on-the-same-machine-as-discourse/17247), но похоже, что Discourse ожидает определённую информацию в заголовках, когда клиент обращается к прокси через HTTPS.

> [@riking](#):
>
> ```plaintext
> server {
> listen 80; listen [::]:80;
> server_name forum.example.com; # <-- измените это
> 
> location / {
> proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
> proxy_set_header Host $http_host;
> proxy_http_version 1.1;
> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
> proxy_set_header X-Forwarded-Proto $scheme;
> proxy_set_header X-Real-IP $remote_addr;
> }
> }
> 
> ```

Я бегло ознакомился с этим. Постараюсь изложить это простым языком, понятным обычному пользователю.

> [@Cerix](#):
>
> Traefik будет управлять шифрованием для всех ваших контейнеров

Да, см. также [Redirecting...](https://docs.traefik.io/https/overview). В начале я сразу настроил HTTPS, и создание сертификата прошло успешно, но на этом всё. Теперь мне нужно привести всё в соответствие с теми знаниями, которые я получил с тех пор.

> [@Cerix](#):
>
> В данный момент я использую Traefik 1.6, поэтому пока не знаю, как включить это в Traefik v2

То есть вы обращаетесь к своему форуму через HTTPS, верно?  
Можете ли вы поделиться конфигурацией Traefik и Discourse? Чем больше информации будет предоставлено, тем проще мне будет разобраться в этом в выходные.  
Руководство по миграции с v1 на v2 доступно по адресу [Redirecting...](https://docs.traefik.io/migration/v1-to-v2/), но я постараюсь объяснить это здесь в выходные.

---

<div class="post-metadata">

### Author: ![Cerix](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cerix/32/94018_2.png) [@Cerix](https://meta.discourse.org/u/Cerix)
#### Post date: [07.Январь.2020 09:11:59 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/17 "2020-01-07T09:11:59Z")

</div>

OK, это мой файл traefik.toml, который не подходит для новой версии v2

```plaintext
defaultEntryPoints = ["http", "https"]

[web]
address = ":8080"
  [web.auth.basic]
  users = ["yourusername:yourpassword"]

[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
      entryPoint = "https"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]

[acme]
email = "XXXXXXXX"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
onDemand = false
[acme.httpChallenge]
entryPoint = "http"
minVersion = "VersionTLS12"

```

часть конфигурации Discourse

```plaintext
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"

expose:
  - "80" # http ------ просто экспонируем порты контейнера
  - "443" # https ------ вам не нужно экспонировать внешний порт хоста

labels:
  traefik.port: '80'
  traefik.backend: 'mycontainername'
  traefik.frontend.rule: 'Host:www.myhost.com'
  traefik.docker.network: 'mynetworkname'
docker_args:
  - "--network=mynetworkname"

```

с этой конфигурацией Traefik перенаправляет все запросы с порта 80 (http) на порт 443 (https),  
включите принудительное использование HTTPS в панели администратора Discourse, чтобы избежать ошибок.

---

<div class="post-metadata">

### Author: ![PackElend](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/packelend/32/95294_2.png) [@PackElend](https://meta.discourse.org/u/PackElend)
#### Post date: [07.Январь.2020 19:49:25 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/18 "2020-01-07T19:49:25Z")

</div>

> [@pfaffman](#):
>
> Моя конфигурация Traefik не открывает порты и устанавливает переменные окружения с именем хоста и т.д. Traefik обрабатывает HTTPS. Затем просто настройте переменные `frontend.rule`, entrypoint и backend соответствующим образом.

@pfaffman, не знаю, работает ли уведомление, если я процитирую ваш ответ в другой теме, поэтому я упоминаю вас.

Итак, ваша конфигурация выглядит как выше, но

> [@Cerix](#):
>
> expose:  
> - ~~“80”~~ # http ------ просто откройте порты контейнера  
> - ~~“443”~~ # https ------ вам не нужно открывать внешний порт хоста

и используете [переменные окружения](https://docs.traefik.io/reference/static-configuration/env/) (этот подход упоминается в [https://stackoverflow.com/questions/52804610/how-do-you-set-environmental-variables-for-traefik](https://stackoverflow.com/questions/52804610/how-do-you-set-environmental-variables-for-traefik) и [https://blog.raveland.org/post/traefik\_compose](https://blog.raveland.org/post/traefik_compose))

---

<div class="post-metadata">

### Author: ![PackElend](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/packelend/32/95294_2.png) [@PackElend](https://meta.discourse.org/u/PackElend)
#### Post date: [11.Январь.2020 19:32:31 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/19 "2020-01-11T19:32:31Z")

</div>

Итак, HTTPS работает 🥳 🥳 🥳 🥳 🥳  
и я думаю, что понял, как всё это устроено 🙂. В ближайшие дни я постараюсь записать это

# моя конфигурация

## извлечение app.yml для Discourse

```plaintext
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (HTTPS)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## какие TCP/IP порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал порт совместно с другим веб-сервером, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для деталей
expose:
  #- "80:80" # http
  #- "443:443" # https
  #- "80" # http
  #- "443" # https
  #- "40080:80"
  #- "40443:443"

labels:
  app_name: discourse

  #----Метки Traefik------------------------
  traefik.enable: true
  traefik.docker.network: bridge_proxy_traefikv2

   #---РАЗДЕЛ HTTP-РОУТЕРА-------------------
  traefik.http.routers.discourse.rule: Host(`forum.fairbnb.community`)
    #--РАЗДЕЛ HTTP--------------------------
  traefik.http.routers.discourse.entrypoints: web
  traefik.http.routers.discourse.middlewares: discourse_redirect2https         
  #traefik.http.services.discourse.loadbalancer.server.port: 80  

   #---РАЗДЕЛ HTTPS-РОУТЕРА
  traefik.http.routers.discourse_secure.rule: Host(`forum.fairbnb.community`)
    #--РАЗДЕЛ HTTPS
  traefik.http.routers.discourse_secure.entrypoints: websecure
  traefik.http.services.discourse_secure.loadbalancer.server.port: 80
    #--РАЗДЕЛ TLS
  traefik.http.routers.discourse_secure.tls.certresolver: tlsChallenge_letsencrypt

   #---РАЗДЕЛ МЕДИАВАРЕЙ перенаправление HTTP на HTTPS
  traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme: https

docker_args:
  - "--network=bridge_proxy_traefikv2"
  
params:

```

## Статическая конфигурация Traefik

```plaintext
global:
  checkNewVersion: true
entryPoints:
  web:
    address: :80
  websecure:
    address: :443

api:
   debug: true

providers:
  docker:
    exposedByDefault: false
    network: bridge_proxy_traefikv2

log:
  level: DEBUG
  filePath: /var/log/traefik-log.log

accessLog:
  filePath: /var/log/traefik-access.log

certificatesResolvers:
  tlsChallenge_letsencrypt:
    acme:
      email: my.secret@gmail.com
      storage: /etc/ssl/certs/letsencrypt/acme.json
      tlsChallenge: {}

```

---

<div class="post-metadata">

### Author: ![pc1oad1etter](https://avatars.discourse-cdn.com/v4/letter/p/f14d63/32.png) [@pc1oad1etter](https://meta.discourse.org/u/pc1oad1etter)
#### Post date: [11.Февраль.2020 08:44:10 UTC](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357/20 "2020-02-11T08:44:10Z")

</div>

Приветствую,

Я использовал этот пост в качестве руководства по настройке Discourse для работы с Traefik. У меня уже работает Traefik с другим веб-приложением.

При переходе на [форум.private.com](http://xn--l1adgmc.private.com) я получаю ошибку «404 страница не найдена».

Что-то, похоже, работает, потому что на панели управления Traefik во вкладке «Services» я вижу `discourse@docker` и `discourse_secure@docker`.

Однако во вкладке «Routers» ничего для Discourse нет.

Внесённые мной изменения в файл app.yml приведены ниже; они в значительной степени основаны на упомянутом выше посте. Я добавил открытый порт в аргументах Docker в конце файла, что, как мне казалось, открыло доступ к упомянутым выше службам. Буду признателен за любую помощь!

> **Traefik docker-compose**
>
> ```plaintext
> version: "3.3"
> 
> services:
> ################################################
> #### Настройка прокси Traefik #####
> ###############################################
> traefik:
> image: traefik:v2.0
> restart: always
> container_name: traefik
> ports:
> - "80:80" # <== http
> - "8080:8080" # <== :8080 — порт, на котором работает панель управления
> - "443:443" # <== https
> command:
> #### Это команды CLI, которые настроят Traefik и укажут, как он должен работать! ####
> 
> - --api.insecure=true # <== Включение небезопасного API, НЕ РЕКОМЕНДУЕТСЯ ДЛЯ ПРОИЗВОДСТВЕННОЙ СРЕДЫ
> - --api.dashboard=true # <== Включение панели управления для просмотра служб, промежуточного ПО, маршрутизаторов и т. д.
> - --api.debug=true # <== Включение дополнительных конечных точек для отладки и профилирования
> ## Настройки логирования (варианты: ERROR, DEBUG, PANIC, FATAL, WARN, INFO) - https://docs.traefik.io/observability/logs/ ##
> - --log.level=DEBUG # <== Установка уровня логов Traefik
> ## Настройки провайдера - https://docs.traefik.io/providers/docker/#provider-configuration ##
> - --providers.docker=true # <== Включение Docker как провайдера для Traefik
> - --providers.docker.exposedbydefault=false # <== Не открывать доступ к каждому контейнеру через Traefik, только к тем, у которых это явно включено
> - --providers.file.filename=/dynamic.yaml # <== Ссылка на файл динамической конфигурации
> - --providers.docker.network=web # <== Работа в сети Docker с именем web
> ## Настройки точек входа - https://docs.traefik.io/routing/entrypoints/#configuration ##
> - --entrypoints.web.address=:80 # <== Определение точки входа для порта :80 с именем web
> - --entrypoints.web-secured.address=:443 # <== Определение точки входа для HTTPS на порту :443 с именем web-secured
> ## Настройки сертификатов (Let's Encrypt) - https://docs.traefik.io/https/acme/#configuration-examples ##
> - --certificatesresolvers.mytlschallenge.acme.tlschallenge=true # <== Включение TLS-ALPN-01 для генерации и обновления сертификатов ACME
> - --certificatesresolvers.mytlschallenge.acme.email=private@private.com # <== Установка email для сертификатов
> - --certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json # <== Определение файла ACME для хранения информации о сертификатах
> volumes:
> - ./letsencrypt:/letsencrypt # <== Том для сертификатов (TLS)
> - /var/run/docker.sock:/var/run/docker.sock # <== Том для администрирования Docker
> - ./dynamic.yaml:/dynamic.yaml # <== Том для файла динамической конфигурации, **ссылка: строка 27
> networks:
> - web # <== Размещение Traefik в сети с именем web для доступа к контейнерам в этой сети
> labels:
> #### Метки определяют поведение и правила прокси Traefik для этого контейнера ####
> - "traefik.enable=true" # <== Включение Traefik для самого себя, чтобы просмотреть панель управления и назначить поддомен для доступа к ней
> - "traefik.http.routers.api.rule=Host(`monitor.private.com`)" # <== Установка домена для панели управления
> - "traefik.http.routers.api.service=api@internal" # <== Включение API как службы для доступа
> 
> networks:
> web:
> external: true
> backend:
> external: false
> 
> volumes:
> db_data: {}
> wordpress:
> external: true
> db:
> external: true
> 
> ```

> **Discourse app.yml**
>
> ```plaintext
> ## Это шаблон контейнера Docker Discourse «всё в одном», автономный
> ##
> ## После внесения изменений в этот файл вы ОБЯЗАНЫ выполнить пересборку
> ## /var/discourse/launcher rebuild app
> ##
> ## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
> ## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ ИЛИ ВЫРАВНИВАНИИ!
> ## посетите http://www.yamllint.com/, чтобы проверить файл при необходимости
> 
> templates:
> - "templates/postgres.template.yml"
> - "templates/redis.template.yml"
> - "templates/web.template.yml"
> - "templates/web.ratelimited.template.yml"
> ## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
> #- "templates/web.ssl.template.yml"
> # "templates/web.letsencrypt.ssl.template.yml"
> 
> ## Какие TCP/IP-порты должен открывать этот контейнер?
> ## Если вы хотите, чтобы Discourse использовал один порт с другим веб-сервером, например Apache или nginx,
> ## см. https://meta.discourse.org/t/17247 для деталей
> expose:
> #- "80:80" # http
> #- "443:443" # https
> 
> params:
> db_default_text_search_config: "pg_catalog.english"
> 
> ## Установите db_shared_buffers максимум на 25% от общего объёма памяти.
> ## будет установлено автоматически при загрузке на основе обнаруженной RAM, или вы можете переопределить
> db_shared_buffers: "128MB"
> 
> ## может улучшить производительность сортировки, но увеличивает использование памяти на подключение
> #db_work_mem: "40MB"
> 
> ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
> #version: tests-passed
> 
> env:
> LANG: en_US.UTF-8
> # DISCOURSE_DEFAULT_LOCALE: en
> 
> ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и количества ядер CPU.
> ## будет установлено автоматически при загрузке на основе обнаруженных CPU, или вы можете переопределить
> UNICORN_WORKERS: 2
> 
> ## TODO: Доменное имя, на которое будет отвечать этот экземпляр Discourse
> ## Обязательно. Discourse не будет работать с чистым IP-адресом.
> DISCOURSE_HOSTNAME: forum.private.com
> 
> ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
> ## именем хоста (опция -h), что указано выше (по умолчанию "$hostname-$config")
> #DOCKER_USE_HOSTNAME: true
> 
> ## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
> ## при первой регистрации, например 'user1@example.com,user2@example.com'
> DISCOURSE_DEVELOPER_EMAILS: 'private@private.com'
> 
> ## TODO: SMTP-сервер, используемый для проверки новых аккаунтов и отправки уведомлений
> ## Адрес SMTP, имя пользователя и пароль обязательны
> # ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
> DISCOURSE_SMTP_ADDRESS: in-v3.mailjet.com
> DISCOURSE_SMTP_PORT: 587
> DISCOURSE_SMTP_USER_NAME: redacted
> DISCOURSE_SMTP_PASSWORD: "redacted"
> #DISCOURSE_SMTP_ENABLE_START_TLS: true # (опционально, по умолчанию true)
> 
> ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
> LETSENCRYPT_ACCOUNT_EMAIL: private@private.com
> 
> ## Адрес http или https CDN для этого экземпляра Discourse (настроен на извлечение)
> ## см. https://meta.discourse.org/t/14857 для деталей
> #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
> 
> ## Контейнер Docker не сохраняет состояние; все данные хранятся в /shared
> volumes:
> - volume:
> host: /var/discourse/shared/standalone
> guest: /shared
> - volume:
> host: /var/discourse/shared/standalone/log/var-log
> guest: /var/log
> 
> ## Плагины размещаются здесь
> ## см. https://meta.discourse.org/t/19157 для деталей
> hooks:
> after_code:
> - exec:
> cd: $home/plugins
> cmd:
> - git clone https://github.com/discourse/docker_manager.git
> 
> ## Любые пользовательские команды для выполнения после сборки
> run:
> - exec: echo "Начало пользовательских команд"
> ## Если вы хотите установить адрес email в поле 'От' для первой регистрации, раскомментируйте и измените:
> ## После получения первого email регистрации закомментируйте строку обратно. Она нужна только один раз.
> #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
> - exec: echo "Конец пользовательских команд"
> 
> labels:
> app_name: discourse
> 
> #----Метки Traefik------------------------
> traefik.enable: true
> traefik.docker.network: web
> 
> #---СЕКЦИЯ HTTP-МАРШРУТИЗАЦИИ-------------------
> traefik.http.routers.discourse.rule: Host(`forum.private.com`)
> #--СЕКЦИЯ HTTP--------------------------
> traefik.http.routers.discourse.entrypoints: web
> traefik.http.routers.discourse.middlewares: discourse_redirect2https         
> traefik.http.services.discourse.loadbalancer.server.port: 80  
> 
> #---СЕКЦИЯ HTTPS-МАРШРУТИЗАЦИИ
> traefik.http.routers.discourse_secure.rule: Host(`forum.private.com`)
> #--СЕКЦИЯ HTTPS
> traefik.http.routers.discourse_secure.entrypoints: web-secured
> traefik.http.services.discourse_secure.loadbalancer.server.port: 80
> #--СЕКЦИЯ TLS
> traefik.http.routers.discourse_secure.tls.certresolver: tlsChallenge_letsencrypt
> 
> #---СЕКЦИЯ ПРОМЕЖУТОЧНОГО ПО перенаправление http на https
> traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme: https
> 
> docker_args:
> - "--network=web"
> - "--expose=80"
> 
> ```

Спасибо

[Next page](https://meta.discourse.org/t/discourse-with-traefik-2-0/130357.md?page=2)
