diff --git a/RELEASE.md b/RELEASE.md index 961daa8..8b44f0f 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -54,7 +54,7 @@ EasyHAProxy follows [Semantic Versioning](https://semver.org/): - **MINOR**: New features, plugin additions, backward-compatible changes - **PATCH**: Bug fixes, documentation updates, minor improvements -**Current Version:** `6.0.0` (as of Chart.yaml) +**Current Version:** `6.0.1` (as of Chart.yaml) ## Automated Release (Recommended) @@ -329,6 +329,7 @@ helm show chart byjg/easyhaproxy | Version | Release Date | Type | Highlights | |---------|--------------|-------|---------------------------------------------------------------------------------------------------------------------------------------| +| 6.0.1 | 2026-02-23 | Patch | HAProxy dashboard, real-time monitoring dashboard with live traffic charts, ACME e2e test fixes | | 6.0.0 | 2026-XX-XX | Major | Python module refactoring (one-class-per-file), IngressClassName support (spec.ingressClassName + deprecated annotation fallback), modernized build system (uv/pyproject.toml), improved version management and release tooling, GitHub Actions workflow_dispatch push control | | 5.0.0 | 2025-12-04 | Major | Plugin framework (builtin plugins: JWT, FastCGI, Cloudflare, IP whitelist, deny pages, cleanup), docs restructure, examples refreshed | | 4.6.0 | 2024-11-27 | Minor | FastCGI plugin, JWT enhancements | diff --git a/deploy/docker/docker-compose.yml b/deploy/docker/docker-compose.yml index 4b911a9..e5be8c7 100644 --- a/deploy/docker/docker-compose.yml +++ b/deploy/docker/docker-compose.yml @@ -1,6 +1,6 @@ services: easyhaproxy: - image: byjg/easy-haproxy:6.0.0 + image: byjg/easy-haproxy:6.0.1 volumes: - /var/run/docker.sock:/var/run/docker.sock - certs_certbot:/etc/easyhaproxy/certs/certbot diff --git a/deploy/kubernetes/easyhaproxy-clusterip.yml b/deploy/kubernetes/easyhaproxy-clusterip.yml index 10049ec..df48af6 100644 --- a/deploy/kubernetes/easyhaproxy-clusterip.yml +++ b/deploy/kubernetes/easyhaproxy-clusterip.yml @@ -6,10 +6,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm --- # Source: easyhaproxy/templates/clusterrole.yaml @@ -19,10 +19,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm rules: - apiGroups: @@ -83,10 +83,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm roleRef: apiGroup: rbac.authorization.k8s.io @@ -105,10 +105,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm annotations: {} @@ -137,10 +137,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm spec: replicas: 1 @@ -161,7 +161,7 @@ spec: - name: easyhaproxy securityContext: {} - image: "byjg/easy-haproxy:6.0.0" + image: "byjg/easy-haproxy:6.0.1" imagePullPolicy: Always ports: - name: http @@ -211,10 +211,10 @@ kind: IngressClass metadata: name: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm spec: controller: byjg.com/easyhaproxy diff --git a/deploy/kubernetes/easyhaproxy-daemonset.yml b/deploy/kubernetes/easyhaproxy-daemonset.yml index 4b2e564..cf5b8b2 100644 --- a/deploy/kubernetes/easyhaproxy-daemonset.yml +++ b/deploy/kubernetes/easyhaproxy-daemonset.yml @@ -6,10 +6,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm --- # Source: easyhaproxy/templates/clusterrole.yaml @@ -19,10 +19,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm rules: - apiGroups: @@ -83,10 +83,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm roleRef: apiGroup: rbac.authorization.k8s.io @@ -104,10 +104,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm spec: selector: @@ -136,7 +136,7 @@ spec: - name: easyhaproxy securityContext: {} - image: "byjg/easy-haproxy:6.0.0" + image: "byjg/easy-haproxy:6.0.1" imagePullPolicy: Always ports: - name: http @@ -186,10 +186,10 @@ kind: IngressClass metadata: name: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm spec: controller: byjg.com/easyhaproxy diff --git a/deploy/kubernetes/easyhaproxy-nodeport.yml b/deploy/kubernetes/easyhaproxy-nodeport.yml index 8d88b79..1128f5e 100644 --- a/deploy/kubernetes/easyhaproxy-nodeport.yml +++ b/deploy/kubernetes/easyhaproxy-nodeport.yml @@ -6,10 +6,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm --- # Source: easyhaproxy/templates/clusterrole.yaml @@ -19,10 +19,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm rules: - apiGroups: @@ -83,10 +83,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm roleRef: apiGroup: rbac.authorization.k8s.io @@ -105,10 +105,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm annotations: {} @@ -137,10 +137,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm spec: replicas: 1 @@ -161,7 +161,7 @@ spec: - name: easyhaproxy securityContext: {} - image: "byjg/easy-haproxy:6.0.0" + image: "byjg/easy-haproxy:6.0.1" imagePullPolicy: Always ports: - name: http @@ -211,10 +211,10 @@ kind: IngressClass metadata: name: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.0 + helm.sh/chart: easyhaproxy-2.0.1 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.0" + app.kubernetes.io/version: "6.0.1" app.kubernetes.io/managed-by: Helm spec: controller: byjg.com/easyhaproxy diff --git a/docs/getting-started/kubernetes.md b/docs/getting-started/kubernetes.md index 84e39d4..ad3920d 100644 --- a/docs/getting-started/kubernetes.md +++ b/docs/getting-started/kubernetes.md @@ -41,7 +41,7 @@ Exposes HAProxy on NodePort `31080` (HTTP), `31443` (HTTPS), and `31936` (stats) ```bash kubectl apply -f \ - https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.0/deploy/kubernetes/easyhaproxy-nodeport.yml + https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.1/deploy/kubernetes/easyhaproxy-nodeport.yml ``` ### ClusterIP (behind a LoadBalancer) @@ -50,7 +50,7 @@ Cluster-internal only. Pair with an external cloud LoadBalancer or `kubectl port ```bash kubectl apply -f \ - https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.0/deploy/kubernetes/easyhaproxy-clusterip.yml + https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.1/deploy/kubernetes/easyhaproxy-clusterip.yml ``` ### DaemonSet (special cases — requires node label) @@ -64,7 +64,7 @@ The node label must be reapplied after any node replacement. Failing to do so wi kubectl label nodes node-01 "easyhaproxy/node=master" kubectl apply -f \ - https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.0/deploy/kubernetes/easyhaproxy-daemonset.yml + https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.1/deploy/kubernetes/easyhaproxy-daemonset.yml ``` If you need to configure environment variables (log levels, stats password, etc.), see the [environment variable reference](../reference/environment-variables.md). diff --git a/docs/getting-started/swarm.md b/docs/getting-started/swarm.md index 0be3100..10902e9 100644 --- a/docs/getting-started/swarm.md +++ b/docs/getting-started/swarm.md @@ -28,7 +28,7 @@ docker network create -d overlay --attachable easyhaproxy ```yaml services: haproxy: - image: byjg/easy-haproxy:6.0.0 + image: byjg/easy-haproxy:6.0.1 volumes: - /var/run/docker.sock:/var/run/docker.sock deploy: diff --git a/docs/guides/acme.md b/docs/guides/acme.md index ac24b82..655b791 100644 --- a/docs/guides/acme.md +++ b/docs/guides/acme.md @@ -157,7 +157,7 @@ Here's a complete `docker-compose.yml` showing proper ACME configuration: ```yaml services: easyhaproxy: - image: byjg/easy-haproxy:6.0.0 + image: byjg/easy-haproxy:6.0.1 volumes: - /var/run/docker.sock:/var/run/docker.sock # REQUIRED: Persist Certbot certificates (ACME) diff --git a/docs/guides/ssl.md b/docs/guides/ssl.md index 5f46a8b..aea7d08 100644 --- a/docs/guides/ssl.md +++ b/docs/guides/ssl.md @@ -83,7 +83,7 @@ docker cp single.pem easyhaproxy:/etc/easyhaproxy/certs/haproxy/example.com.pem ```yaml services: easyhaproxy: - image: byjg/easy-haproxy:6.0.0 + image: byjg/easy-haproxy:6.0.1 volumes: - /var/run/docker.sock:/var/run/docker.sock - certs_haproxy:/etc/easyhaproxy/certs/haproxy diff --git a/helm/easyhaproxy/Chart.yaml b/helm/easyhaproxy/Chart.yaml index 95586ef..50f6426 100644 --- a/helm/easyhaproxy/Chart.yaml +++ b/helm/easyhaproxy/Chart.yaml @@ -15,12 +15,12 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 2.0.0 +version: 2.0.1 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "6.0.0" +appVersion: "6.0.1" icon: https://opensource.byjg.com/img/easy_haproxy_logo.png diff --git a/pyproject.toml b/pyproject.toml index 98eef13..787d9a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "easyhaproxy" -version = "6.0.0" +version = "6.0.1" description = "HAProxy label based routing with service discovery for Docker, Swarm, and Kubernetes" readme = "README.md" license = {file = "LICENSE"} diff --git a/tests_e2e/docker/docker-compose-acme.yml b/tests_e2e/docker/docker-compose-acme.yml index a8c1863..a751f6a 100644 --- a/tests_e2e/docker/docker-compose-acme.yml +++ b/tests_e2e/docker/docker-compose-acme.yml @@ -60,7 +60,7 @@ services: haproxy: - image: byjg/easy-haproxy:6.0.0 + image: byjg/easy-haproxy:6.0.1 volumes: - /var/run/docker.sock:/var/run/docker.sock # Persist the CERTBOT to avoid re-challenge when the server restarts diff --git a/tests_e2e/docker/docker-compose-portainer.yml b/tests_e2e/docker/docker-compose-portainer.yml index a2a05f6..2dbb3d6 100644 --- a/tests_e2e/docker/docker-compose-portainer.yml +++ b/tests_e2e/docker/docker-compose-portainer.yml @@ -59,7 +59,7 @@ services: easyhaproxy: - image: byjg/easy-haproxy:6.0.0 + image: byjg/easy-haproxy:6.0.1 volumes: - /var/run/docker.sock:/var/run/docker.sock - certs_certbot:/etc/easyhaproxy/certs/certbot diff --git a/tests_e2e/kubernetes/cloudflare.yml b/tests_e2e/kubernetes/cloudflare.yml index ce5583d..7d390ee 100644 --- a/tests_e2e/kubernetes/cloudflare.yml +++ b/tests_e2e/kubernetes/cloudflare.yml @@ -12,7 +12,7 @@ # ```bash # # 1. Ensure EasyHAProxy is installed in your cluster # kubectl create namespace easyhaproxy -# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.0/deploy/kubernetes/easyhaproxy-daemonset.yml +# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.1/deploy/kubernetes/easyhaproxy-daemonset.yml # # # 2. Download Cloudflare IP ranges # curl -s https://www.cloudflare.com/ips-v4 > cloudflare_ips.lst diff --git a/tests_e2e/kubernetes/ip-whitelist.yml b/tests_e2e/kubernetes/ip-whitelist.yml index 876598f..af76506 100644 --- a/tests_e2e/kubernetes/ip-whitelist.yml +++ b/tests_e2e/kubernetes/ip-whitelist.yml @@ -12,7 +12,7 @@ # ```bash # # 1. Ensure EasyHAProxy is installed in your cluster # kubectl create namespace easyhaproxy -# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.0/deploy/kubernetes/easyhaproxy-daemonset.yml +# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.1/deploy/kubernetes/easyhaproxy-daemonset.yml # # # 2. IMPORTANT: Edit this file (line 80) and update allowed_ips # # with your actual office/VPN IP addresses or networks diff --git a/tests_e2e/kubernetes/jwt-validator.yml b/tests_e2e/kubernetes/jwt-validator.yml index 32c2ecb..986eea6 100644 --- a/tests_e2e/kubernetes/jwt-validator.yml +++ b/tests_e2e/kubernetes/jwt-validator.yml @@ -30,7 +30,7 @@ # ```bash # # 1. Ensure EasyHAProxy is installed in your cluster # kubectl create namespace easyhaproxy -# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.0/deploy/kubernetes/easyhaproxy-daemonset.yml +# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.1/deploy/kubernetes/easyhaproxy-daemonset.yml # # # 2. Generate RSA key pair (idempotent - skips if exists) # [ -f jwt_private.pem ] || openssl genrsa -out jwt_private.pem 2048 diff --git a/tests_e2e/kubernetes/plugins-combined.yml b/tests_e2e/kubernetes/plugins-combined.yml index a4abed2..0716fe4 100644 --- a/tests_e2e/kubernetes/plugins-combined.yml +++ b/tests_e2e/kubernetes/plugins-combined.yml @@ -15,7 +15,7 @@ # ```bash # # 1. Ensure EasyHAProxy is installed in your cluster # kubectl create namespace easyhaproxy -# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.0/deploy/kubernetes/easyhaproxy-daemonset.yml +# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.1/deploy/kubernetes/easyhaproxy-daemonset.yml # # # 2. Generate JWT keys (idempotent - skips if exists) # [ -f jwt_private.pem ] || openssl genrsa -out jwt_private.pem 2048 diff --git a/tests_e2e/kubernetes/service.yml b/tests_e2e/kubernetes/service.yml index 61c16fa..f1ce6ca 100644 --- a/tests_e2e/kubernetes/service.yml +++ b/tests_e2e/kubernetes/service.yml @@ -12,7 +12,7 @@ # ```bash # # 1. Ensure EasyHAProxy is installed in your cluster # kubectl create namespace easyhaproxy -# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.0/deploy/kubernetes/easyhaproxy-daemonset.yml +# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.1/deploy/kubernetes/easyhaproxy-daemonset.yml # # # 2. Label the node where EasyHAProxy will run # kubectl label nodes "easyhaproxy/node=master" diff --git a/tests_e2e/kubernetes/service_tls.yml b/tests_e2e/kubernetes/service_tls.yml index 60b9e16..63a68e3 100644 --- a/tests_e2e/kubernetes/service_tls.yml +++ b/tests_e2e/kubernetes/service_tls.yml @@ -12,7 +12,7 @@ # ```bash # # 1. Ensure EasyHAProxy is installed in your cluster # kubectl create namespace easyhaproxy -# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.0/deploy/kubernetes/easyhaproxy-daemonset.yml +# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.0.1/deploy/kubernetes/easyhaproxy-daemonset.yml # # # 2. Label the node where EasyHAProxy will run # kubectl label nodes "easyhaproxy/node=master" diff --git a/uv.lock b/uv.lock index ca4c881..af85b0d 100644 --- a/uv.lock +++ b/uv.lock @@ -351,7 +351,7 @@ wheels = [ [[package]] name = "easyhaproxy" -version = "6.0.0" +version = "6.0.1" source = { editable = "." } dependencies = [ { name = "deepdiff" },