Вопрос или проблема
Я настроил несколько сайтов в Docker на Linode.
Я начал, следуя этим инструкциям:
Шаги, которые я выполнил, следующие:
- Создал Linode
- Установил NGINX Proxy Manager в Docker-контейнер
- Добавил свой домен на https://cloud.linode.com/domains, направил его на свой Linode
- Перенаправил доменный сервер моего домена на Linode у регистратора моего домена
- Добавил Portainer в Docker-контейнер
Затем я установил VaultWarden в Docker-контейнере, следуя этим инструкциям:
Возьмите под контроль и защитите свои пароли, используя Vaultwarden на Portainer
Шаги здесь следующие:
- Настроил субдомен
- Установил VaultWarden в Docker
- Включил HTTPS в NGINX
- Создал прокси-хост в NGINX Proxy Manager, который указывает на мой контейнер VaultWarden
В процессе я создал SSL-сертификат, используя Let’s Encrypt, через интерфейс NGINX Proxy Manager. (начиная с 11:00 во втором видео).
И все это, казалось, работало, в основном.
Или, точнее, в разделе NGINX Proxy Manager “Добавить сертификат Let’s Encrypt” есть кнопка “Проверить доступность сервера”, и она всегда возвращала ошибку “Связь с API не удалась, работает ли NPM правильно?”.
Но, несмотря на это, я смог настроить перенаправление на контейнер VaultWarden, используя сгенерированный ключ SSL.
И потом смог получить доступ к VaultWarden, используя субдомен, и увидел, что браузер видит действительный сертификат.
Моя проблема сейчас в том, что я получаю письма о скором истечении срока действия сертификата.
Когда я возвращаюсь в NGINX Proxy Manager и смотрю на SSL-сертификаты, я вижу опцию “Обновить сейчас”, и когда я пытаюсь ею воспользоваться, я получаю “Пожалуйста, подождите” на некоторое время, а затем сообщение “Внутренняя ошибка”.
Что может быть или не быть относящимся, опция “Проверить доступность сервера” все равно возвращает ошибку “Связь с API не удалась, работает ли NPM правильно?”.
Моя проблема в том, что эти красивые графические интерфейсы не возвращают никакой информации о том, что происходит, или почему именно это не работает.
Должно быть какое-то логирование, где-то, которое могло бы дать мне подсказку о том, в чем проблема.
Кто-то может помочь мне это найти?
Я провел дополнительные исследования по этому вопросу. Я считаю, что проблема связана с двумя багами в NPM.
-
Один, который, кажется, частично исправлен для продления SSL в версии v2.9.21
После нескольких попыток продления SSL-сертификат все же обновляется; если это не работает с первого раза, я бы подождал около 15 секунд и попробовал снова. Убедитесь, что вы используете последнюю версию: v2.9.21. -
Кнопка “Проверить доступность сервера” вообще не работает для многих людей.
Вы найдете множество проблем на Github, которые указывают на то же поведение; либо при продлении SSL, либо ошибку, показанную при проверке доступности сервера: “Связь с API не удалась, работает ли NPM правильно?”
- https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2439 (здесь больше всего информации об ошибке проверки доступности сервера)
- https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2713 (здесь больше всего информации о продлении SSL)
- https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2593
- https://github.com/NginxProxyManager/nginx-proxy-manager/issues/2442
После дальнейшего изучения моих логов, я также заметил много следующих ошибок:
не удается построить оптимальный proxy_headers_hash, следует увеличить либо proxy_headers_hash_max_size: 512, либо proxy_headers_hash_bucket_size: 64; игнорируется proxy_headers_hash_bucket_size
Я нашел улучшения, включив следующие две строки в мой ~/npm/data/nginx/custom/http.conf
proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 128;
Ответ или решение
Для решения проблемы с обновлением SSL сертификата Let’s Encrypt в Nginx Proxy Manager (NPM) может потребоваться учитывать несколько возможных причин, связанных с конфигурацией и текущими известными багами.
Теория (Theory)
Первичная установка сервера и прокси происходит корректно, однако при попытке обновить сертификат вы сталкиваетесь с ошибками. Nginx Proxy Manager в Docker-контейнере может конфликтовать или иметь неверные настройки конфигурации, что препятствует нормальной работе API и обновлению сертификатов. На текущую дату упоминается версия v2.9.21 как исправляющая некоторые из известных проблем, однако она может не решать все перечисленные проблемы, такие как ошибка "Communication with the API failed", связанная с недоступностью API.
Пример (Example)
На GitHub представлены аналогичные жалобы других пользователей на ошибки, связанные с API и обновлением SSL сертификатов. Среди наиболее релевантных обсуждений можно назвать вопрос 2439 (ошибка теста доступности сервера) и вопрос 2713 (ошибка обновления SSL). В данных случаях пользователи тоже сообщали о проблемах с доступностью сервиса API.
В выключениях из логов вы, вероятно, заметите ошибки, указывающие на проблемы с proxy_headers_hash_max_size
или proxy_headers_hash_bucket_size
. Это указывает на необходимость корректировок в конфигурациях.
Применение (Application)
-
Убедитесь, что ваш Nginx Proxy Manager обновлён до версии 2.9.21 или выше, так как предыдущие версии могут обладать известными проблемами с SSL обновлениями и API.
-
Проверьте и адаптируйте конфигурацию вашего NPM. В файле
~/npm/data/nginx/custom/http.conf
добавьте следующие строки для оптимизации:proxy_headers_hash_max_size 1024; proxy_headers_hash_bucket_size 128;
-
Проверьте файлы журналов (логи) для более детального анализа ошибок. Логи могут находиться в директориях Docker контейнера или быть доступны через веб-интерфейс NPM.
-
Исследуйте подключение Docker контейнеров и конфигурацию фаерволов. Возможно, конфликты сетевых настроек препятствуют корректному обращению к API Let’s Encrypt или другим нужным сервисам.
-
Если проблема persists, рассмотрите возможность самостоятельного обновления сертификатов с помощью Certbot вне Nginx Proxy Manager, чтобы отделить конфигурационную часть NPM от процесса получения и обновления сертификатов.
Все вышеуказанные шаги помогут вам устранить проблему, связанную с обновлением сертификатов Let’s Encrypt через Nginx Proxy Manager и наладить стабильную работу вашего сервера.