diff --git a/charts/gohoarder/Chart.yaml b/charts/gohoarder/Chart.yaml index cac4dd0..80d4e72 100644 --- a/charts/gohoarder/Chart.yaml +++ b/charts/gohoarder/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: gohoarder description: A universal package cache proxy supporting npm, PyPI, and Go modules with security scanning type: application -version: 0.1.147 -appVersion: "0.1.147" +version: 0.1.148 +appVersion: "0.1.148" keywords: - package-manager - cache diff --git a/charts/gohoarder/templates/ingressroute-traefik.yaml b/charts/gohoarder/templates/ingressroute-traefik.yaml new file mode 100644 index 0000000..586bab6 --- /dev/null +++ b/charts/gohoarder/templates/ingressroute-traefik.yaml @@ -0,0 +1,129 @@ +{{- if and .Values.ingress.enabled (eq .Values.ingress.className "traefik") -}} +--- +# Traefik IngressRoute for package registry paths +# This handles package downloads including scoped packages with encoded slashes +apiVersion: traefik.io/v1alpha1 +kind: IngressRoute +metadata: + name: {{ include "gohoarder.fullname" . }}-packages + labels: + {{- include "gohoarder.labels" . | nindent 4 }} +spec: + entryPoints: + - websecure + routes: + # Package registry routes with high priority + # PathPrefix matching to avoid Go's encoded slash rejection in regex + - match: Host(`{{ .Values.ingress.host | default (printf "%s.%s" "gohoarder" .Values.global.domain) }}`) && PathPrefix(`/npm/`) + kind: Rule + priority: 100 + services: + - name: {{ include "gohoarder.fullname" . }}-frontend + port: {{ .Values.frontend.service.port }} + middlewares: + - name: {{ include "gohoarder.fullname" . }}-strip-encoded-slash + namespace: {{ .Release.Namespace }} + {{- if .Values.ingress.traefik }} + {{- if .Values.ingress.traefik.middlewares }} + {{- range .Values.ingress.traefik.middlewares }} + - name: {{ . }} + namespace: traefik + {{- end }} + {{- end }} + {{- end }} + + - match: Host(`{{ .Values.ingress.host | default (printf "%s.%s" "gohoarder" .Values.global.domain) }}`) && PathPrefix(`/pypi/`) + kind: Rule + priority: 100 + services: + - name: {{ include "gohoarder.fullname" . }}-frontend + port: {{ .Values.frontend.service.port }} + middlewares: + - name: {{ include "gohoarder.fullname" . }}-strip-encoded-slash + namespace: {{ .Release.Namespace }} + {{- if .Values.ingress.traefik }} + {{- if .Values.ingress.traefik.middlewares }} + {{- range .Values.ingress.traefik.middlewares }} + - name: {{ . }} + namespace: traefik + {{- end }} + {{- end }} + {{- end }} + + - match: Host(`{{ .Values.ingress.host | default (printf "%s.%s" "gohoarder" .Values.global.domain) }}`) && PathPrefix(`/go/`) + kind: Rule + priority: 100 + services: + - name: {{ include "gohoarder.fullname" . }}-frontend + port: {{ .Values.frontend.service.port }} + middlewares: + - name: {{ include "gohoarder.fullname" . }}-strip-encoded-slash + namespace: {{ .Release.Namespace }} + {{- if .Values.ingress.traefik }} + {{- if .Values.ingress.traefik.middlewares }} + {{- range .Values.ingress.traefik.middlewares }} + - name: {{ . }} + namespace: traefik + {{- end }} + {{- end }} + {{- end }} + + # All other routes (frontend, API, etc.) with lower priority + - match: Host(`{{ .Values.ingress.host | default (printf "%s.%s" "gohoarder" .Values.global.domain) }}`) + kind: Rule + priority: 50 + services: + - name: {{ include "gohoarder.fullname" . }}-frontend + port: {{ .Values.frontend.service.port }} + {{- if .Values.ingress.traefik }} + {{- if .Values.ingress.traefik.middlewares }} + middlewares: + {{- range .Values.ingress.traefik.middlewares }} + - name: {{ . }} + namespace: traefik + {{- end }} + {{- end }} + {{- end }} + + {{- if .Values.ingress.tls.enabled }} + tls: + secretName: {{ .Values.ingress.tls.secretName }} + {{- end }} + +--- +# Middleware to handle encoded slashes in package paths +# Note: This middleware attempts to work around Traefik's encoded slash limitation +# but may not fully resolve the issue due to Go stdlib constraints +apiVersion: traefik.io/v1alpha1 +kind: Middleware +metadata: + name: {{ include "gohoarder.fullname" . }}-strip-encoded-slash + labels: + {{- include "gohoarder.labels" . | nindent 4 }} +spec: + # Use headers to pass original path information + # The backend can reconstruct the original URL from these headers + headers: + customRequestHeaders: + X-Original-URI: "{{ .Request.URL.Path }}" + X-Forwarded-Path: "{{ .Request.URL.Path }}" + +--- +# ServersTransport configuration for backend communication +# This ensures the backend connection doesn't have additional restrictions +apiVersion: traefik.io/v1alpha1 +kind: ServersTransport +metadata: + name: {{ include "gohoarder.fullname" . }}-transport + labels: + {{- include "gohoarder.labels" . | nindent 4 }} +spec: + insecureSkipVerify: false + {{- if .Values.ingress.traefik }} + {{- if .Values.ingress.traefik.transport }} + {{- with .Values.ingress.traefik.transport }} + serverName: {{ .serverName | default "" }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/charts/gohoarder/values.yaml b/charts/gohoarder/values.yaml index 4a49d4c..5c07fd9 100644 --- a/charts/gohoarder/values.yaml +++ b/charts/gohoarder/values.yaml @@ -51,17 +51,17 @@ image: server: repository: ghcr.io/lukaszraczylo/gohoarder-server pullPolicy: IfNotPresent - tag: "0.1.147" + tag: "0.1.148" frontend: repository: ghcr.io/lukaszraczylo/gohoarder-frontend pullPolicy: IfNotPresent - tag: "0.1.147" + tag: "0.1.148" scanner: repository: ghcr.io/lukaszraczylo/gohoarder-scanner pullPolicy: IfNotPresent - tag: "0.1.147" + tag: "0.1.148" # Service Account serviceAccount: @@ -358,7 +358,7 @@ migration: image: repository: ghcr.io/lukaszraczylo/gohoarder-migrate pullPolicy: IfNotPresent - tag: "0.1.147" + tag: "0.1.148" # Migration settings logLevel: "info" # debug, info, warn, error @@ -514,6 +514,16 @@ ingress: enabled: false secretName: "gohoarder-tls" + # Traefik-specific configuration (when className: "traefik") + # Used by IngressRoute template for advanced routing + traefik: + # Middleware references (from traefik namespace) + # Example: ["default-chain", "rate-limit"] + middlewares: [] + # ServersTransport configuration + transport: + serverName: "" + # Autoscaling configuration autoscaling: enabled: false diff --git a/charts/packages/gohoarder-0.1.148.tgz b/charts/packages/gohoarder-0.1.148.tgz new file mode 100644 index 0000000..6abb36d Binary files /dev/null and b/charts/packages/gohoarder-0.1.148.tgz differ diff --git a/index.yaml b/index.yaml index f1e7eff..2358c14 100644 --- a/index.yaml +++ b/index.yaml @@ -1,6 +1,32 @@ apiVersion: v1 entries: gohoarder: + - apiVersion: v2 + appVersion: 0.1.148 + created: "2026-07-10T08:54:28.084273377Z" + description: A universal package cache proxy supporting npm, PyPI, and Go modules + with security scanning + digest: 1368b6557f75474bc13b1ef9777fab7f04f1cf98ef31e4594183cc5f0241dc5a + home: https://github.com/lukaszraczylo/gohoarder + keywords: + - package-manager + - cache + - proxy + - npm + - pypi + - go-modules + - security + - vulnerability-scanning + maintainers: + - email: lukasz@raczylo.com + name: Lukasz Raczylo + name: gohoarder + sources: + - https://github.com/lukaszraczylo/gohoarder + type: application + urls: + - https://github.com/lukaszraczylo/helm-charts/releases/download/gohoarder-0.1.148/gohoarder-0.1.148.tgz + version: 0.1.148 - apiVersion: v2 appVersion: 0.1.147 created: "2026-07-09T04:40:57.513151076Z" @@ -5268,4 +5294,4 @@ entries: urls: - https://github.com/lukaszraczylo/helm-charts/releases/download/kubemirror-0.2.8/kubemirror-0.2.8.tgz version: 0.2.8 -generated: "2026-07-09T04:40:57.511571176Z" +generated: "2026-07-10T08:54:28.083002086Z"