Можешь поделиться скриншотами?
Во вложении два скриншота из панели управления Traefik. На них видно, что Discourse отображается в разделе сервисов (дважды), но в разделе роутеров ничего нет. Честно говоря, я не уверен, что это значит, но обратил на это внимание.
Редактирование: Я новый пользователь Discourse, поэтому у меня нет прав на публикацию двух изображений в одном сообщении, поэтому я добавлю второе в ответе.
Нужно запустить мои Docker-контейнеры сегодня вечером для сравнения. Дам знать позже, а может, кто-то из других участников здесь поделится своей панелью управления для сравнения.
В этом нет необходимости. Лучше переключиться на API и использовать Traefik v2.1, так что:
- "traefik.http.routers.traefik_dashboard-router.service=api@internal"
См. https://community.containo.us/t/endless-502-forwarding-when-calling-dashboard-via-subdomain-6123/3689/5
Можете ли вы убрать свои комментарии?
Это облегчит нам чтение.
Не переживайте, мне тоже однажды сказали то же самое :).
Я пишу свои комментарии отдельной строкой, чтобы легко создавать чистый вывод, используя cat traefikV2.yaml | grep -v "#"
Хорошо, у меня ушло несколько дней, чтобы дойти до этого. Я переделал конфигурацию Traefik, чтобы использовать YAML-файл вместо того, чтобы помещать всё в docker-compose. Однако после повторного подключения всего я наблюдаю то же или схожее поведение — на моём домене возвращается 404, а в панели управления Traefik я вижу записи в разделах Services и routers для Discourse, но ничего в разделе routers.
Traefik docker-compose
version: '3'
services:
traefik:
image: traefik:v2.0
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
- proxy
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=http"
- "traefik.http.routers.traefik.rule=Host(`monitor.example.com`)"
- "traefik.http.middlewares.traefik-auth.basicauth.users=user:redacted"
- "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
- "traefik.http.routers.traefik-secure.entrypoints=https"
- "traefik.http.routers.traefik-secure.rule=Host(`monitor.example.com`)"
- "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
- "traefik.http.routers.traefik-secure.tls=true"
- "traefik.http.routers.traefik-secure.tls.certresolver=http"
- "traefik.http.routers.traefik-secure.service=api@internal"
networks:
proxy:
external: true
Traefik data/traefik.yml
api:
dashboard: true
entryPoints:
http:
address: ":80"
https:
address: ":443"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
certificatesResolvers:
http:
acme:
email: nick@innomadic.com
storage: acme.json
httpChallenge:
entryPoint: http
containers/app.yml
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
expose:
params:
db_default_text_search_config: "pg_catalog.english"
db_shared_buffers: "128MB"
env:
LANG: en_US.UTF-8
UNICORN_WORKERS: 2
DISCOURSE_HOSTNAME: forum.example.com
DISCOURSE_DEVELOPER_EMAILS: 'info@example.com'
DISCOURSE_SMTP_ADDRESS: redacted.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: redacted
DISCOURSE_SMTP_PASSWORD: "redacted"
LETSENCRYPT_ACCOUNT_EMAIL: info@example.com
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
run:
- exec: echo "Beginning of custom commands"
- exec: echo "End of custom commands"
labels:
app_name: discourse
traefik.enable: true
traefik.docker.network: proxy
traefik.http.routers.discourse.rule: Host(`forum.example.com`)
traefik.http.routers.discourse.entrypoints: http
traefik.http.routers.discourse.middlewares: discourse_redirect2https
traefik.http.services.discourse.loadbalancer.server.port: 80
traefik.http.routers.discourse_secure.rule: Host(`forum.example.com`)
traefik.http.routers.discourse_secure.entrypoints: https
traefik.http.services.discourse_secure.loadbalancer.server.port: 80
traefik.http.routers.discourse_secure.tls.certresolver: tlsChallenge_letsencrypt
traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme: https
docker_args:
- "--network=proxy"
- "--expose=80"
Кажется, я также выполнил команду docker network connect proxy, чтобы подключить этот контейнер к сети traefik.
Буду благодарен за любую помощь в том, чтобы понять, что я упустил. Также буду рад узнать, правильно ли я настроил вопросы безопасности.
Не знаю, чего вам не хватает. Вот что я делаю в Ansible для запуска сайтов с Traefik:
--docker-args "-l traefik.frontend.rule=Host:{{discourse_hostname}} \
-l traefik.frontend.entryPoints=https \
-l traefik.backend={{discourse_shortname}} \
-l traefik.port=80"
А затем выполните:
./launcher start {{ discourse_yml }} {{ docker_args }}
Добавление правил Traefik в docker_args, а не в yml, имеет дополнительное преимущество: Traefik не будет обращать внимание на контейнер, который проходит процесс инициализации.
Кажется, это Traefik v1, да?
О, извините. Да, я почти уверен, что это Traefik 1, поэтому я не смогу помочь с конкретными деталями.
Похоже, вы не устанавливаете никаких значений в этих метках в app.yml? Мне кажется, вам нужно задать правило и, возможно, промежуточное ПО?
Если вы не хотите простоя во время начальной настройки, установите их с помощью ./launcher start, как в моём примере.
Возможно, “middleware” — это то, что раньше называлось “backend”? Вам нужно сделать что-то, чтобы указать, что контейнер Discourse — это нужный вам сервер, и . . . что-то ещё . . . для подключения какого-то фронтенда/URL к соответствующему бэкенду/серверу.
Они отображаются, но вам нужно немного прокрутить вправо, чтобы их увидеть. Это просто вопрос форматирования.
Спасибо
ЛОЛ. Извините за это.
Что ж, я понятия не имею, о чём говорю, но для меня бессмысленно настраивать ваш discourse@docker как балансировщик нагрузки.
Привет, я думаю, я разобрался.
Я удалил строку:
# traefik.http.services.discourse_secure.loadbalancer.server.port: 80
но оставил эту:
traefik.http.services.discourse.loadbalancer.server.port: 80
labels:
app_name: discourse
#----Traefik lables------------------------
traefik.enable: true
traefik.docker.network: proxy
#---HTTP ROUTER SECTION-------------------
traefik.http.routers.discourse.rule: Host(`forum.example.com`)
#--HTTP SECTION--------------------------
traefik.http.routers.discourse.entrypoints: http
traefik.http.routers.discourse.middlewares: discourse_redirect2https
traefik.http.services.discourse.loadbalancer.server.port: 80
#---HTTPS ROUTER SECTION
traefik.http.routers.discourse_secure.rule: Host(`forum.example.com`)
#--HTTPS SECTION
traefik.http.routers.discourse_secure.entrypoints: https
# traefik.http.services.discourse_secure.loadbalancer.server.port: 80
#--TLS SECTION
traefik.http.routers.discourse_secure.tls.certresolver: tlsChallenge_letsencrypt
#---MIDDLEWARE SECTION redirect http to https
traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme: https
Не совсем понятно, как это у меня получилось и почему всё устроено именно так, но это работает. Так что, используя всю конфигурацию, которую я опубликовал выше в теме, но с этим одним изменением, у меня теперь всё работает.
Спасибо всем!
это верно.
Я добавил это в свой конфиг:
#—СЕКЦИЯ СЕРВИСОВ: сообщает Traefik, куда отправлять запросы
traefik.http.services.discourse.loadbalancer.server.port: 80
это вам знакомо?
То, что вы делаете здесь — это указываете, какому сервису отправлять запрос и на какой порт.
Вы также можете решить это с помощью expose, но с точки зрения безопасности лучше раскрывать как можно меньше портов ваших контейнеров. Кроме того, Traefik выбирает первый порт, если вы раскрываете несколько портов, поэтому использование loadbalancer чище.
Данные Traefik / traefik.yml
Я так не делаю, так как этот путь является путём по умолчанию.
Здесь вы не используете полный путь, полагаясь на путь по умолчанию. Мне это не нравится, потому что нужно помнить об этом пути. Я использую storage: /etc/ssl/certs/letsencrypt/acme.json.
Я явно определяю сеть, мне не нравятся настройки по умолчанию.
providers: docker: exposedByDefault: false network: bridge_proxy_traefikv2
containers/app.yml
В этом нет необходимости, это уже делается через loadbalancer.
Docker Compose для Traefik
Возможно, стоит дать этой сети имя. В моём случае:
networks: traefik: external: name: bridge_proxy_traefikv2
Я прорабатываю ваши предложения здесь. Спасибо за ваш ответ.
Хочу отметить, что для конечной точки вы советуете доверять настройкам по умолчанию, а для расположения хранилища говорите, что не любите доверять настройкам по умолчанию. ![]()
Я попытался внести изменение для acme.json, которое вы упомянули:
Однако мой контейнер Traefik не смог найти файл после этого. В логе появилась ошибка. Поэтому пока я оставил его как acme.json.
Хотел бы спросить об этом моменте:
Разве вы не просто переименовываете сеть здесь или даете ей локальное имя? Я думаю, что в другой конфигурации и здесь локально я просто называл её proxy. У неё всё ещё есть имя, которое я определил, я просто не переименовываю её. По крайней мере, так я это понимаю.
У меня есть одна последняя важная проблема. После моего сообщения выше о “Успехе!” я заметил, что хотя HTTPS работает, я получаю предупреждение о смешанном контенте. Значит, не всё шифруется.
Ошибка смешанного контента возникает у моей установки Discourse, но не у установки WordPress на том же сервере. Значит, это связано именно с моими настройками Discourse.
В консоли разработчика я вижу:
Загрузка смешанного (небезопасного) отображаемого контента “http://talk.redacted.com/uploads/default/optimized/1X/_129430568242d1b7f853bb13ebea28b3f6af4e7_2_180x180.png” на защищённой странице FaviconLoader.jsm:174:19
Возможно, моё перенаправление работает неправильно?
Ниже я прилагаю соответствующие файлы для проверки.
Traefik.yml
api:
dashboard: true
entryPoints:
http:
address: “:80”
https:
address: “:443”
providers:
docker:
exposedByDefault: false
network: proxy
certificatesResolvers:
http:
acme:
email: info@private.com
storage: acme.json
httpChallenge:
entryPoint: http
Traefik docker-compose
version: ‘3’
services:
traefik:
image: traefik:v2.0
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
- proxy
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
labels:
- “traefik.enable=true”
- “traefik.http.routers.traefik.entrypoints=http”
- “traefik.http.routers.traefik.rule=Host(monitor.private.com)”
- "traefik.http.middlewares.traefik-auth.basicauth.users=private:private”
- “traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https”
- “traefik.http.routers.traefik.middlewares=traefik-https-redirect”
- “traefik.http.routers.traefik-secure.entrypoints=https”
- “traefik.http.routers.traefik-secure.rule=Host(monitor.private.com)”
- “traefik.http.routers.traefik-secure.middlewares=traefik-auth”
- “traefik.http.routers.traefik-secure.tls=true”
- “traefik.http.routers.traefik-secure.tls.certresolver=http”
- “traefik.http.routers.traefik-secure.service=api@internal”
networks:
proxy:
external: true
app.yml
templates:
- “templates/postgres.template.yml”
- “templates/redis.template.yml”
- “templates/web.template.yml”
- “templates/web.ratelimited.template.yml”
expose:
params:
db_default_text_search_config: “pg_catalog.english”
db_shared_buffers: “128MB”
env:
LANG: en_US.UTF-8
UNICORN_WORKERS: 2
DISCOURSE_HOSTNAME: talk.private.com
DISCOURSE_DEVELOPER_EMAILS: ‘info@private.com’
LETSENCRYPT_ACCOUNT_EMAIL: info@private.com
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared - volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone GitHub - discourse/docker_manager: Plugin for use with discourse docker image · GitHub
run:
- exec: echo “Beginning of custom commands”
- exec: echo “End of custom commands”
labels:
app_name: discourse
traefik.enable: true
traefik.docker.network: proxy
traefik.http.routers.discourse.rule: Host(talk.private.com)
traefik.http.routers.discourse.entrypoints: http
traefik.http.routers.discourse.middlewares: discourse_redirect2https
traefik.http.services.discourse.loadbalancer.server.port: 80
traefik.http.routers.discourse_secure.rule: Host(talk.private.com)
traefik.http.routers.discourse_secure.entrypoints: https
traefik.http.routers.discourse_secure.tls: true
traefik.http.routers.discourse_secure.service: discourse
traefik.http.routers.discourse_secure.tls.certresolver: http
traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme: https
docker_args:
- “–network=proxy”
Итак, есть ли у вас какие-либо мысли о том, почему возникает ошибка смешанного контента?
Что ж, на мгновение мне показалось, что Discourse обрёл сознание, потому что я получил это уведомление в своём админ-панели:
Однако я внёс это изменение, но ошибка смешанного контента всё ещё сохраняется. Я также вышел из системы, очистил кэш и зашёл снова. Результат тот же.
Похоже, что мои запросы на вход всё ещё зашифрованы, так что, наверное, это хорошо, но мне нужно избавиться от этой ошибки смешанного контента. Конфигурация приведена выше в предыдущем сообщении.
Ещё одно обновление: предупреждение о смешанном контенте исчезло. Не совсем понятно почему. Похоже, это связано с настройкой force_https, однако, даже после её изменения я не мог получить чистую загрузку страницы примерно 30 минут, несмотря на то, что очистил кэш и вышел из системы, а затем снова вошёл, как я отмечал выше.
Хорошая новость в том, что у меня, кажется, работает установка Discourse за обратным прокси-сервером Traefic.
Проблема в изображениях, которые загружаются через HTTP-соединения. У меня была та же проблема, см.:
- https://discourse.mozilla.org/t/cool-features-of-firefox-developer-tools/17010/16
- "security" tab in developer tools - Developer Tools - Mozilla Discourse
Также может помочь следующее: - Mixed content problem
- Got mix-content error and confused - #12 by mr8
- Mixed content due to hotlinked images - #13 by nbianca
Вы правильно подключили том? Traefik может быть довольно запутанным, когда дело доходит до путей.
Я, например, делаю так:
volumes: - /etc/ssl/certs/traefik/letsencrypt:/etc/ssl/certs/letsencrypt - /opt/traefik/traefik-config.yaml:/etc/traefik/traefik.yaml - /etc/passwd.traefik.dashboard:/etc/passwd.BasicAuth.dashboard - /etc/passwd.traefik.whoami:/etc/passwd.BasicAuth.whoami
Я не помню точно, но для этого была причина, возможно, чтобы хорошо видеть её в CLI при перечислении сетей.
Нет, я не монтировал таким образом. Вот мой раздел volumes из docker-compose для Traefik:
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
Я заметил, что в моём случае вообще не упоминается Let’s Encrypt, а у вас — упоминается. Полагаю, вы создали эту глубоко вложенную папку в директории docker-compose и поместили туда acme.json?
Также я обратил внимание, что у меня есть docker.sock и localtime. Не уверен, что такое localtime, и возможно, строка с docker.sock представляет собой проблему безопасности. Нужно разобраться в этом подробнее.
Я заметил, что в моём случае вообще не упоминается Let’s Encrypt, а у вас упоминается. Я полагаю, вы создали эту глубоко вложенную папку в директории docker-compose и поместили туда свой acme.json?
Создание сертификата Let’s Encrypt выполняется Traefik. Подключение тома позволяет хранить его на хосте, а не внутри Docker.
Я помню, что настройка всех монтирований была настоящей головной болью; пришлось выполнять множество проверок через docker exec -it:
lsdirvi







