Table of Contents

Проблема

На хосте Proxmox 5.3-12 у меня работает балансировщик haproxy. Он слушает порт 80.
при попытке обновить сертификат Let's Encrypt (certificate renew) возникает ошибка:

Loading ACME account details
Placing ACME order
Order URL: https://acme-v02.api.letsencrypt.org/acme/order/53....12/46607.....

Getting authorization details from 'https://acme-v02.api.letsencrypt.org/acme/authz/sm0uHIBtl7...................4-A8Ox_kY'
... pending!
Setting up webserver
TASK ERROR: failed setting up webserver - Failed to initialize HTTP daemon 

Очевидно, процесс обновления сертификата (клиент ACME) хочет поднять веб-сервер на порту 80, но не может этого сделать, так как порт занят процессом haproxy. Вот народ бьется так же: https://forum.proxmox.com/threads/no-configuration-is-done-letsencrypt-certificate.44065/

Решение

Решением был бы запуск вебсервера клиента ACME на порту, отличном от 80. Например - 8080. Штатно в proxmox такой возможности нет. Но логика proxmox написана на perl, что позволяет быстро и безболезненно изменить ее.
Легко и непринужденно в дебрях библиотек находим файл /usr/share/perl5/PVE/ACME/StandAlone.pm, а в нем кусок кода:

    my $server = HTTP::Daemon->new(
        LocalPort => 80,
        ReuseAddr => 1,
    ) or die "Failed to initialize HTTP daemon\n";

И заменяем номер порта, например на 8080, а в haproxy прописываем соответствующий http reverse-proxy.
А потом выполняем перезапуск сервисов proxmox:

service pve-cluster restart && service pvedaemon restart && service pvestatd restart && service pveproxy restart