Set up Let’s Encrypt with multiple domains / redirects

Ого, наконец-то сработало:

true | openssl s_client -connect www.starzen.space:443 2>/dev/null \
| openssl x509 -noout -text \
| perl -l -0777 -ne '@names=/\bDNS:([^\s,]+)/g; print join("\n", sort @names);'
starzen.space
www.starzen.space

Я закомментировал условные операторы в скрипте letsencrypt, чтобы принудительно выполнить повторную выдачу. Конечно, это не «штатное» решение.

Однако это говорит о том, что проблема была в «состоянии», а не в переданных параметрах.

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

Но теперь у меня работает корневой домен! :tada:

4 лайка

Да, это часть стандартной установки. См. User Guide — Certbot 5.5.0 documentation и прокрутите вниз до раздела Управление сертификатами, а также сразу под ним — Повторное создание и обновление существующих сертификатов.

Эти команды следует выполнять в том же месте, где вы изначально запускали Certbot.

1 лайк

У меня стандартная установка, и certbot не используется. Ни на «обычном» уровне сервера, ни после ввода команды ./launcher enter app.

Думаю, его отсутствие связано с acme.sh.

3 лайка

Кажется, я столкнулся с похожей проблемой. Сначала я думал, что дело в использовании суб-субдомена (Let's Encrypt with sub-subdomain?), но попробовал обычный субдомен, и сертификат всё равно не генерируется для нового сайта.

Пытаюсь понять, как вы это «взломали», чтобы заставить работать, но, похоже, не могу разобраться :grimacing:

Что именно вы сделали, чтобы у вас это заработало?

Если дело в этом, какие именно операторы if вы закомментировали?

Также есть какие-то идеи, что может вызывать эту новую проблему?

1 лайк

Итак, моя проблема была связана с истёкшим сроком действия доменного имени в моей конфигурации мультисайта:

2 лайка

Привет, @Brahn,

Спасибо за недавнее обновление вашей инструкции.

У меня возникала ошибка сертификата после перенаправления корневого домена на поддомен. Я обновил файл app.yml до более новой версии, которую вы хотели протестировать, и проблема решена. :slightly_smiling_face:

5 лайков

Мне тоже пришлось это реализовать после смены домена и сбоя перенаправления.

Я внес небольшую правку в вики: убрал старые инструкции и исправил пробелы в новых.

Однако, похоже, это пока не сработало. Подозреваю, что нужно принудительно запросить новый сертификат. Не подскажете, как это сделать проще всего?

Я почти уверен, что я только что сделал пересборку. Возможно, что-то снова изменилось. У тебя всё ещё есть старый сертификат? Какое имя хоста? Если хочешь, можешь написать мне в личные сообщения.

Спасибо, Джей. forum.hinz.org.nz — это старый домен (а ehealthforum.nz — новый).

Я выполнил пересборку (только web_only в виде двух контейнеров), но это, похоже, не решило проблему.

1 лайк

Вы также изменили имя хоста? Вы изменили доменное имя или переименовали свой Discourse?

Совет без просьбы: лучшей практикой, кажется, является использование www вместо корневой доменной зоны. Браузеры, которыми я пользуюсь, делают практически невозможным заметить наличие www.

Мое единственное предположение: возможно, пробел в конце внутри кавычек имеет значение, и у вас его нет?

Я бы зашел в контейнер, поковырялся и попытался запустить acme так, как это делается, чтобы посмотреть, что произойдет; я никогда не могу вспомнить, как это сделать или где искать команду acme; каждый раз приходится разбираться заново, поэтому я не могу вам сказать. Возможно, вы сможете увидеть это в docker logs web_only.

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

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

2 лайка

Да — всё сделал без проблем.

Действительно — но это имеет смысл только если вы планируете использовать CDN или поддомены (я нет):
https://hostadvice.com/blog/domains/what-is-apex-domain/

Попробовал добавить его, но это ничего не изменило.

Это довольно показательно (нажмите, чтобы раскрыть)

root@forumhinz:/var/discourse# docker logs web_only
run-parts: executing /etc/runit/1.d/00-ensure-links
run-parts: executing /etc/runit/1.d/00-fix-var-logs
run-parts: executing /etc/runit/1.d/01-cleanup-web-pids
run-parts: executing /etc/runit/1.d/anacron
run-parts: executing /etc/runit/1.d/cleanup-pids
Cleaning stale PID files
run-parts: executing /etc/runit/1.d/copy-env
run-parts: executing /etc/runit/1.d/letsencrypt
[Sat 9 Sep 08:19:27 UTC 2023] Domains not changed.
[Sat 9 Sep 08:19:27 UTC 2023] Skip, Next renewal time is: 2023-10-26T08:24:32Z
[Sat 9 Sep 08:19:27 UTC 2023] Add ‘–force’ to force to renew.
[Sat 9 Sep 08:19:29 UTC 2023] Installing key to: /shared/ssl/ehealthforum.nz.key
[Sat 9 Sep 08:19:29 UTC 2023] Installing full chain to: /shared/ssl/ehealthforum.nz.cer
[Sat 9 Sep 08:19:29 UTC 2023] Run reload cmd: sv reload nginx
warning: nginx: unable to open supervise/ok: file does not exist
[Sat 9 Sep 08:19:29 UTC 2023] Reload error for :
[Sat 9 Sep 08:19:29 UTC 2023] Domains not changed.
[Sat 9 Sep 08:19:30 UTC 2023] Skip, Next renewal time is: 2023-10-26T08:24:45Z
[Sat 9 Sep 08:19:30 UTC 2023] Add ‘–force’ to force to renew.
[Sat 9 Sep 08:19:31 UTC 2023] Installing key to: /shared/ssl/ehealthforum.nz_ecc.key
[Sat 9 Sep 08:19:31 UTC 2023] Installing full chain to: /shared/ssl/ehealthforum.nz_ecc.cer
[Sat 9 Sep 08:19:31 UTC 2023] Run reload cmd: sv reload nginx
warning: nginx: unable to open supervise/ok: file does not exist
[Sat 9 Sep 08:19:31 UTC 2023] Reload error for :
Started runsvdir, PID is 570
supervisor pid: 578 unicorn pid: 590

Это означает, что если я не найду способ принудительно обновить сертификат, мне придется ждать до 2023-10-26T08:24:00Z, пока проблема не решится сама собой!

Я попробую несколько вариантов — пожелайте мне удачи.

позже…

Успех!

Ну, после нескольких неудачных попыток запустить обновление сертификата, я в итоге переехал на новый сервер (это уже было запланировано).

И что вы думаете? Сертификат обновился идеально с настройками из первого сообщения. Кто бы мог подумать.

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

2 лайка

Я добавил это в свой файл app.yml. Нужно ли пересобирать приложение или всё заработает автоматически?
Также в строке
“from: /-d www.first-domain.com/” — нужно указать домен, с которого я хочу перенаправление, или мой поддомен?

1 лайк

Да, любые изменения в app.yml обычно требуют пересборки.

3 лайка

Я перебил сборку, и теперь мой сайт недоступен. Стоит ли перебивать снова?

После перебивки я вижу следующее:

"Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile' failed with return #<Process::Status: pid 3575 exit 134>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"assets_precompile", "cmd"=>["su discourse -c 'bundle exec rake themes:update assets:precompile'"]}
bootstrap failed with exit code 134
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one."

Пожалуйста, помогите разобраться.

1 лайк

Прошел ли процесс пересборки гладко, без ошибок?

2 лайка

Пожалуйста, сделайте это и поделитесь сообщениями об ошибках.

2 лайка
110:M 10 Dec 2023 13:32:18.543 # Сервер инициализирован
110:M 10 Dec 2023 13:32:18.543 # ПРЕДУПРЕЖДЕНИЕ: Необходимо включить переприем памяти! Без этого фоновое сохранение или репликация могут завершиться ошибкой при нехватке памяти. Отключение этой опции также может привести к сбоям даже при наличии достаточного объема памяти, см. https://github.com/jemalloc/jemalloc/issues/1328. Чтобы исправить эту проблему, добавьте 'vm.overcommit_memory = 1' в файл /etc/sysctl.conf, затем перезагрузите систему или выполните команду 'sysctl vm.overcommit_memory=1', чтобы изменения вступили в силу.
110:M 10 Dec 2023 13:32:18.544 * Загрузка RDB, созданной версией 7.0.7

Получил эти предупреждения, не уверен, важны ли они.

warning " > @glint/environment-ember-loose@1.1.0" имеет невыполненное требование зависимости "@glimmer/component@^1.1.2".
warning " > @glint/environment-ember-template-imports@1.1.0" имеет невыполненное требование зависимости "ember-template-imports@^3.0.0".
warning Поле разрешения "unset-value@2.0.1" несовместимо с запрошенной версией "unset-value@^1.0.0"
warning Паттерн ["wrap-ansi@^7.0.0"] пытается распаковаться в то же назначение "/home/discourse/.cache/yarn/v6/npm-wrap-ansi-cjs-7.0.0-67e145cff510a6a6984bdf1152911d69d2eb9e43-integrity/node_modules/wrap-ansi-cjs", что и паттерн ["wrap-ansi-cjs@npm:wrap-ansi@^7.0.0"]. Это может привести к недетерминированному поведению, пропуск.
warning " > discourse-markdown-it@1.0.0" имеет невыполненное требование зависимости "xss@*".
warning "workspace-aggregator-68bace53-129d-4a2d-85c3-4685b91c92ee > discourse > @ember/legacy-built-in-components@0.5.0" имеет неверное требование зависимости "ember-source@>= 4.8".
warning "workspace-aggregator-68bace53-129d-4a2d-85c3-4685b91c92ee > discourse > @uppy/aws-s3@3.0.6" имеет неверное требование зависимости "@uppy/core@^3.1.2".
warning "workspace-aggregator-68bace53-129d-4a2d-85c3-4685b91c92ee > discourse > @uppy/aws-s3-multipart@3.1.3" имеет неверное требование зависимости "@uppy/core@^3.1.2".
warning "workspace-aggregator-68bace53-129d-4a2d-85c3-4685b91c92ee > discourse > @uppy/xhr-upload@3.1.1" имеет неверное требование зависимости "@uppy/core@^3.1.2".
warning "workspace-aggregator-68bace53-129d-4a2d-85c3-4685b91c92ee > discourse-plugins > ember-this-fallback@0.4.0" имеет невыполненное требование зависимости "ember-source@^3.28.11 || ^4.0.0".
warning "workspace-aggregator-68bace53-129d-4a2d-85c3-4685b91c92ee > discourse > @uppy/aws-s3 > @uppy/xhr-upload@3.3.0" имеет неверное требование зависимости "@uppy/core@^3.2.1".
<--- Последние несколько GC --->

[3710:0x6291170]   681247 мс: Scavenge 942.0 (1034.0) -> 940.8 (1034.0) МБ, 62.9 / 0.0 мс  (средний mu = 0.704, текущий mu = 0.878) сбой выделения;
[3710:0x6291170]   681616 мс: Scavenge 942.4 (1034.0) -> 941.4 (1034.0) МБ, 18.3 / 0.0 мс  (средний mu = 0.704, текущий mu = 0.878) сбой выделения;
[3710:0x6291170]   681911 мс: Scavenge 943.0 (1034.0) -> 942.0 (1038.0) МБ, 46.8 / 0.0 мс  (средний mu = 0.704, текущий mu = 0.878) сбой выделения;
ФАТАЛЬНАЯ ОШИБКА: Достигнут лимит кучи. Сбой выделения — нехватка памяти в JavaScript-куче
 1: 0xb83f50 node::Abort() [ember]
 2: 0xa94834  [ember]
 3: 0xd647c0 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [ember]
 4: 0xd64b67 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [ember]
 5: 0xf42265  [ember]
 6: 0xf5474d v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [ember]
 7: 0xf2ee4e v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [ember]
 8: 0xf30217 v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [ember]
 9: 0xf113ea v8::internal::Factory::NewFillerObject(int, v8::internal::AllocationAlignment, v8::internal::AllocationType, v8::internal::AllocationOrigin) [ember]
10: 0x12d674f v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [ember]
11: 0x17035b9  [ember]
Прервано (core dumped)
error Команда завершилась с кодом выхода 134.

А мой сайт показывает:

Этот сайт недоступен

forum.mysite.ca отказал в подключении.

Попробуйте:

  • Проверить подключение
  • [Проверить прокси и брандмауэр]

ERR_CONNECTION_REFUSED"

Вот как выглядит мой app.yml:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-zoom.git
  after_ssl:
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /-d www.mysite.ca/
        to: "-d www.mysite.ca -d mysite.ca "
## Любые пользовательские команды для запуска после сборки
1 лайк

Сколько памяти имеет ваш сервер и включена ли подкачка (для проверки выполните free -h)?

               всего        использовано      свободно      общее      буфер/кэш      доступно
Память:            957            190           371            3           395           613
Подкачка:         2047             79          1968

Итак, на вашем сервере установлено 1 ГБ оперативной памяти и выделено 2 ГБ под файл подкачки. Странно, но процесс пересборки завершается ошибкой именно при таком объёме подкачки.

Попробуйте запустить пересборку снова. Если она снова не удастся, возможно, потребуется увеличить объём оперативной памяти сервера (если это возможно). Это необходимо только на время процесса сборки; после завершения память можно уменьшить.

1 лайк