haproxy-manager 1.47
Web UI for HAProxy, Keepalived and acme.sh: publish services, obtain Let's
Encrypt certificates, and run a cluster on a shared virtual IP with settings
and certificates syncing between nodes.
Install
Debian / Ubuntu
sudo apt-get install -y ./haproxy-manager_1.47.0_all.debFedora
sudo dnf install -y ./haproxy-manager-1.47.0-1.noarch.rpmRHEL / Rocky / Alma — python3-flask and python3-waitress come from EPEL:
sudo dnf install -y epel-release
sudo dnf install -y ./haproxy-manager-1.47.0-1.noarch.rpmDocker — multi-architecture, linux/amd64 and linux/arm64:
docker pull ghcr.io/avandeputte/haproxy-manager:1.47Install script, unchanged:
curl -fsSL https://raw.githubusercontent.com/avandeputte/haproxy-manager/main/install.sh | sudo bashThe packages carry acme.sh inside, so installing needs no network beyond your
own package mirrors. They install and start the service and print the generated
administrator password. Upgrading leaves the configuration, the login and
issued certificates alone; removing keeps /var/lib/haproxy-manager, and
apt-get purge clears it.
Each package is verified in CI by installing it on a real systemd host of the
family it targets — Debian 12, Ubuntu 24.04, Rocky 9, Fedora 41 — and signing
in.
In this release
- Packages —
.deband.rpm, built from one definition and laid out
exactly like the install script. - Multi-architecture images on the GitHub Container Registry, checked on
both architectures before publishing. - Watchdog — restarts HAProxy and Keepalived when they stop answering,
not merely when they exit, and systemd restarts the app itself on the same
basis. It refuses to restart against a configuration that cannot work, or a
unit you disabled, and gives up rather than flapping. - Notifications — email, Pushover and JSON webhook, on transitions rather
than conditions. - Logs — one timeline merging the UI, HAProxy, acme.sh and Keepalived.
- Documentation — installing on a server,
running in Docker and
configuration, withtools/check-docs.pyverifying
the checkable claims against the code.
Fixes
- One slow cluster node could freeze the whole UI: a plain page load measured
88 seconds during an Apply. Reads no longer queue behind writes, and the
configuration push runs with the lock released. The same test now measures
3 ms. - Peer timeouts applied to the connect and read phases separately, so a
setting of 6 could take 12 seconds. They are explicit and tunable now, and
node health is collected in the background so a page load never waits on the
network. - Peer failures reported urllib3 exception text; they now say what happened and
what to do. - The Watchdog and Notifications pages failed to render.
- The installer survives a transient download failure, and falls back to
fetching the files it needs from a second host. - The container image had two HEALTHCHECK instructions, so only the last took
effect.