self-hosted · free & open source

One virtual IP.
Any number of nodes.

A small self-hosted web UI that manages your HAProxy configuration, obtains Let's Encrypt certificates, and runs a Keepalived cluster on a shared virtual IP — one node active, the rest ready to take over, with settings and certificates syncing across all of them.

GPL-3.0 · Debian · Ubuntu · RHEL · Fedora · Docker
quick install — any debian-based server
$ curl -fsSL https://raw.githubusercontent.com/avandeputte/haproxy-manager/main/install.sh | sudo bash
virtual IP 192.0.2.10 proxy1 standby proxy2 standby proxy3 standby
One node holds the address and serves the traffic. When it stops answering, another takes it — certificates and all.
The Overview page: three nodes, their roles and versions, and every published service with a day of traffic
what it does

Everything between the internet and your servers, on one page.

A configuration front-end that generates plain haproxy.cfg and keepalived.conf, validates before writing anything, and keeps every node in step.

publish

Two lines to production

Give the wizard a public URL and the server behind it. It creates the pool, rules, HTTPS listener, certificate and HTTP→HTTPS redirect — and shows the exact haproxy.cfg before anything is written.

acme

Certificates that mind themselves

HTTP-01 and DNS-01 via acme.sh, with 191 DNS provider hooks. Wildcards are reused instead of duplicated, renewals run on their own, and every node gets the PEM.

cluster

Failover you don't babysit

Keepalived holds one shared virtual IP across any number of nodes. The configuration carries a revision — nodes that fall behind are named, and healed automatically.

sign-in

Auth enforced by HAProxy itself

Basic auth from a generated userlist, or OIDC single sign-on (Authentik, Keycloak, Authelia, Pocket ID, Google, Entra) — verified on every request, in pure configuration, no Lua.

watchdog

Catches hung, not just stopped

Liveness probes over the stats socket, published URLs requested exactly as a browser would, duplicate-address detection on the wire — and deliberate, rate-limited restarts.

notify

Alerts on changes, not conditions

Email, Pushover or webhook. Per-service “Alert when”, so a Patroni pool at 1-of-3 isn't an emergency — and recoveries are always delivered.

observe

See everything, in one place

Live statistics from the admin socket, a day of traffic per service, four logs merged into one timeline, and Prometheus metrics at /metrics.

integrate

Home Assistant, out of the box

MQTT discovery publishes per-service sensors, certificate expiries and an optional maintenance switch — no YAML, no polling, entities that survive a failover.

also raw TCP services · MySQL / PostgreSQL / HTTP health checks · separate check ports (Patroni-ready) · per-service allowed networks · two-factor sign-in (TOTP) · configuration history with diff & restore · secret-free backups · light / dark / system theme · a real phone layout
screenshots

The real application, not a mock-up.

Every screenshot is the actual UI, driven by a browser against a three-node cluster holding made-up data.

install

Pick a method. Run it on every node.

Packages ship with every release; the script and the Docker image always fetch the current version.

debian / ubuntu — .deb package
# grab the .deb from github.com/avandeputte/haproxy-manager/releases/latest
$ sudo apt-get install -y ./haproxy-manager_*_all.deb
rhel / fedora — .rpm package
# grab the .rpm from github.com/avandeputte/haproxy-manager/releases/latest
$ sudo dnf install -y ./haproxy-manager-*.noarch.rpm
install script — any debian-based server
$ curl -fsSL https://raw.githubusercontent.com/avandeputte/haproxy-manager/main/install.sh | sudo bash
# re-running it later offers update / remove / purge
docker — amd64 & arm64, all-in-one image
$ docker run -d --network host \
    --cap-add NET_ADMIN --cap-add NET_BROADCAST --cap-add NET_RAW \
    -v ham-data:/var/lib/haproxy-manager -v ham-acme:/var/lib/acme.sh \
    -v ham-haproxy:/etc/haproxy -v ham-keepalived:/etc/keepalived \
    ghcr.io/avandeputte/haproxy-manager:latest

then Open http://<node>:8080

The installer creates the administrator and prints the generated password (also written to /var/lib/haproxy-manager/admin-credentials.txt). The first visit offers a setup wizard: create a new cluster — set the virtual IP the nodes will share, or skip it and run standalone — or join an existing one by pointing at any running node with its API key; that node pushes the whole configuration back.

Nothing in HAProxy's configuration is touched until you press Apply — and Apply validates with haproxy -c before writing anything, keeps a .bak, and rolls back if HAProxy doesn't come back up.