diff --git a/RELEASE.md b/RELEASE.md index 8b44f0f..697934e 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.1` (as of Chart.yaml) +**Current Version:** `6.1.0` (as of Chart.yaml) ## Automated Release (Recommended) @@ -329,6 +329,7 @@ helm show chart byjg/easyhaproxy | Version | Release Date | Type | Highlights | |---------|--------------|-------|---------------------------------------------------------------------------------------------------------------------------------------| +| 6.1.0 | 2026-06-24 | Minor | FastCGI protocol support, certbot sidecar plugin, dependency updates | | 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 | diff --git a/deploy/docker/docker-compose.yml b/deploy/docker/docker-compose.yml index e5be8c7..86cbc06 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.1 + image: byjg/easy-haproxy:6.1.0 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 ef5f125..ef546b2 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.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" 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.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" 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.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" 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.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" app.kubernetes.io/managed-by: Helm annotations: {} @@ -140,10 +140,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" app.kubernetes.io/managed-by: Helm spec: replicas: 1 @@ -164,7 +164,7 @@ spec: - name: easyhaproxy securityContext: {} - image: "byjg/easy-haproxy:6.0.1" + image: "byjg/easy-haproxy:6.1.0" imagePullPolicy: Always ports: - name: http @@ -217,10 +217,10 @@ kind: IngressClass metadata: name: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" 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 a20588f..f31c57c 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.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" 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.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" 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.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" 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.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" app.kubernetes.io/managed-by: Helm spec: selector: @@ -136,7 +136,7 @@ spec: - name: easyhaproxy securityContext: {} - image: "byjg/easy-haproxy:6.0.1" + image: "byjg/easy-haproxy:6.1.0" imagePullPolicy: Always ports: - name: http @@ -189,10 +189,10 @@ kind: IngressClass metadata: name: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" 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 dcb5c2b..91948c1 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.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" 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.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" 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.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" 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.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" app.kubernetes.io/managed-by: Helm annotations: {} @@ -140,10 +140,10 @@ metadata: name: ingress-easyhaproxy namespace: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" app.kubernetes.io/managed-by: Helm spec: replicas: 1 @@ -164,7 +164,7 @@ spec: - name: easyhaproxy securityContext: {} - image: "byjg/easy-haproxy:6.0.1" + image: "byjg/easy-haproxy:6.1.0" imagePullPolicy: Always ports: - name: http @@ -217,10 +217,10 @@ kind: IngressClass metadata: name: easyhaproxy labels: - helm.sh/chart: easyhaproxy-2.0.2 + helm.sh/chart: easyhaproxy-2.0.3 app.kubernetes.io/name: easyhaproxy app.kubernetes.io/instance: ingress - app.kubernetes.io/version: "6.0.1" + app.kubernetes.io/version: "6.1.0" 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 ad3920d..2c1bbb4 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.1/deploy/kubernetes/easyhaproxy-nodeport.yml + https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.1.0/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.1/deploy/kubernetes/easyhaproxy-clusterip.yml + https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.1.0/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.1/deploy/kubernetes/easyhaproxy-daemonset.yml + https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.1.0/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 10902e9..31653e9 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.1 + image: byjg/easy-haproxy:6.1.0 volumes: - /var/run/docker.sock:/var/run/docker.sock deploy: diff --git a/docs/guides/acme.md b/docs/guides/acme.md index 655b791..e43f997 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.1 + image: byjg/easy-haproxy:6.1.0 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 aea7d08..cc0d413 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.1 + image: byjg/easy-haproxy:6.1.0 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 60b9721..d2b51de 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.2 +version: 2.0.3 # 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.1" +appVersion: "6.1.0" icon: https://opensource.byjg.com/img/easy_haproxy_logo.png diff --git a/pyproject.toml b/pyproject.toml index 787d9a3..523f0cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "easyhaproxy" -version = "6.0.1" +version = "6.1.0" 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 a751f6a..d24d535 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.1 + image: byjg/easy-haproxy:6.1.0 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 2dbb3d6..98704cc 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.1 + image: byjg/easy-haproxy:6.1.0 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 7d390ee..e099f3f 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.1/deploy/kubernetes/easyhaproxy-daemonset.yml +# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.1.0/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 af76506..81c9685 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.1/deploy/kubernetes/easyhaproxy-daemonset.yml +# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.1.0/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 986eea6..e51258d 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.1/deploy/kubernetes/easyhaproxy-daemonset.yml +# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.1.0/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 0716fe4..61ed1db 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.1/deploy/kubernetes/easyhaproxy-daemonset.yml +# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.1.0/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 f1ce6ca..2abfb62 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.1/deploy/kubernetes/easyhaproxy-daemonset.yml +# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.1.0/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 63a68e3..174272e 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.1/deploy/kubernetes/easyhaproxy-daemonset.yml +# kubectl apply -f https://raw.githubusercontent.com/byjg/docker-easy-haproxy/6.1.0/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 d7ac800..392de8f 100644 --- a/uv.lock +++ b/uv.lock @@ -616,7 +616,7 @@ wheels = [ [[package]] name = "easyhaproxy" -version = "6.0.1" +version = "6.1.0" source = { editable = "." } dependencies = [ { name = "deepdiff" },