Set up Let’s Encrypt with multiple domains / redirects

Привет, @pfaffman, в правке оригинального сообщения в строке to: есть ошибочный символ +, который ломает регулярное выражение. Его нужно удалить.

Отдельно необходимо отредактировать следующий абзац, так как он больше не имеет смысла:

Существует два шаблона, которые нужно заменить: один заканчивается на --keylength, а другой — на --fullchainpath (в самом файле ваш исходный домен стоит перед каждым из этих переключателей). Введите ваш (под)домен (и любые дополнительные поддомены, предваренные -d ), а затем добавьте следующее в секцию hooks: вашего файла app.yml (ближе к концу файла):

Предлагаю следующее:

Используйте domain1 и domain2 в этом сообщении для генерации необходимого вам кода. domain1 — это ваш исходный домен, а domain2 — дополнительный домен, который вы хотите добавить. Добавьте полученный блок after_ssl: в секцию hooks: вашего файла app.yml и выполните команду launcher rebuild app.

1 лайк

Ой. Я убрал плюс и немного изменил текст. Посмотрю позже, когда буду за компьютером.

Привет @textkit, это вики, так что вы можете внести дополнительные правки, если хотите.

После последнего обновления до версии 3.5.0.beta8-dev

/etc/runit/1.d/letsencrypt

отсутствует в контейнере Docker. Из-за этого сборка не выполняется. Обходное решение: https://www.forcewww.com/

Таким образом, перестало работать следующее:

## Добавить сертификат Let's Encrypt для доменных имен с www и без www
  after_ssl:
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--keylength/
        to: "-d example.de -d www.example.de --keylength"

Прежде чем удалять подобные утилиты/бинарные файлы из контейнера Docker, было бы неплохо получать уведомление…

4 лайка

Это изменение в том, как Discourse работает с Let’s Encrypt, или изменение в самом Let’s Encrypt?

У меня есть сервер, который в данный момент испытывает проблемы из-за этой ситуации. На данный момент моим решением является закомментировать эту часть app.yml, но я считаю, что нам нужен способ добавлять дополнительные сертификаты в настройку в будущем.

2 лайка

Discourse перенес это в другой файл. Сейчас над этим работают. Я постараюсь посмотреть в ближайшие дни, что потребуется для поддержки нескольких поддоменов.

2 лайка

Я отредактировал первое сообщение с новым шаблоном, но ещё не протестировал его.

1 лайк

Нет, это не работает:

ОШИБКА

Errno::ENOENT: Нет такого файла или каталога @ rb_sysopen - /usr/local/bin/letsencrypt
Место сбоя: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/replace_command.rb:11:in `read’
Замена не удалась с параметрами {“filename”=>“/usr/local/bin/letsencrypt”, “from”=>“/-d spokes.nz/”, “to”=>“-d spokes.nz -d www.spokes.nz”}
Загрузка не удалась с кодом выхода 1
** ЗАГРУЗКА НЕ УДАЛАСЬ ** пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках, их может быть больше одной.

2 лайка

Слишком рано.

Может, попробуй вставить замену в блок внизу, где раньше был раздел про SSH, если это имеет смысл (я с телефона, постараюсь посмотреть завтра)

1 лайк

Привет, @nathank

Это лишь предположение, но не исключено, что ошибка, с которой вы столкнулись, связана с отсутствием пробела перед завершающим слэшем и закрывающей кавычкой в соответствующих строках предложенного блока в вашем файле app.yml?

Исходя из сообщения об ошибке, я предполагаю, что ваши строки выглядят (дословно) так:

from: /-d spokes.nz/
to: "-d spokes.nz -d www.spokes.nz"

Я делаю такой вывод, потому что в моём случае строки выглядят так:

from: /-d nzarchitecture.net.nz /
to: "-d nzarchitecture.net.nz -d www.nzarchitecture.net.nz "

И благодаря наличию пробелов непосредственно перед концом каждой строки, как показано выше, я теперь могу пересобрать Discourse без возникновения этой ошибки. (Если присмотреться, вы увидите, что в обновлённом блоке от @pfaffman, опубликованном в начале этой темы, эти дополнительные пробелы были указаны).

У меня также вообще нет файлов в директории usr/local/bin/ (как отмечено в вашем сообщении об ошибке), что заставило меня заподозрить, что отсутствие файла letsencrypt не является причиной ошибки.

Тем не менее, для меня, хотя Discourse работает нормально по адресу nzarchitecture.net.nz, к сожалению, при вводе www.nzarchitecture.net.nz в браузере всё ещё возникает ошибка сертификата — связано ли это с отсутствием этого файла, я не знаю.

2 лайка

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

Это упростит конфигурацию для данного случая, так что никому не придется вносить изменения в свои app.yml.

Мой текущий план: при DISCOURSE_HOSTNAME: www.domain.com

Добавить возможность использования переменных окружения, например:
DISCOURSE_HOSTNAME_ALIASES: domain.com,other.domain.com — это позволит получить сертификат, действительный для всех хостов.

(Кстати, пока я этим занимаюсь, автоматические обновления сертификатов Let’s Encrypt тоже, похоже, работают некорректно, так что я исправляю и их тоже)

8 лайков

Это здорово! Большое спасибо. Это, безусловно, упростит задачу!

3 лайка

Я упустил это! Сделал, как вы предложили, но ошибка при запуске всё ещё сохраняется:

FAILED

Errno::ENOENT: No such file or directory @ rb_sysopen - /usr/local/bin/letsencrypt
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/replace_command.rb:11:in `read’
replace failed with the params {“filename”=>“/usr/local/bin/letsencrypt”, “from”=>“/-d spokes.nz /”, “to”=>"-d spokes.nz -d www.spokes.nz "}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.

Превосходно!!!

3 лайка

Вероятно, это не основная проблема, но в процессе моих попыток я также обновил версию Docker на Digital Ocean с 20.0.4 (кажется) до 28.3.3 — возможно, это помогло, по крайней мере, с этой ошибкой. В любом случае, это устранило предупреждения о «устаревших» функциях Docker, которые появлялись в начале процесса пересборки.

1 лайк

Вам нужно удалить часть, которая пытается изменить файл Let’s Encrypt, и дождаться принятия PR.

2 лайка

Я так и понял! К счастью, у меня установка на два контейнера, так что это не проблема.

Удалось ли добиться каких-либо результатов на данный момент?

1 лайк

да, я открыл запрос на слияние (PR) здесь, он ожидает проверки:

4 лайка

Всем привет, небольшая информация: поддержка нескольких доменов теперь объединена. В последней версии discourse_docker вы можете включить шаблоны ssl и letsencrypt и задать переменные окружения вида DISCOURSE_HOSTNAME_ALIASES: domain.com,other.domain.com, чтобы настроить альтернативные имена хостов.

Ваш сайт также будет автоматически подтягивать настроенные имена хостов при запросе сертификата без дополнительных изменений в конфигурации.

4 лайка

Прошу прощения за мою неосведомленность, но можно ли это изменить через настройку сайта где-либо, или нужно что-то отредактировать в app.yml?

Если первое, то после обновления до последней версии я не смог этого найти, а если второе, то что именно следует изменить в app.yml?

Это настраивается в app.yml. Это не обрабатывается самим Discourse, а NGINX в контейнере, у которого нет доступа к базе данных Discourse.

Это добавляется в секцию ENV:

env:
   DISCOURSE_HOSTNAME_ALIASES: domain.com,other.domain.com

Укажите только дополнительные домены, по которым пользователи смогут переходить и которые будут перенаправляться на фактическое имя хоста вашего сайта.

3 лайка

Отлично — всё работает, спасибо!

Ещё лучше было бы, если бы Discourse каким-то умным способом сам записывал алиасы, указанные администратором, в файл app.yml при следующем обновлении, или оставлял эту информацию в месте, откуда инструкция app.yml могла бы её прочитать.

2 лайка