Add disabled-by-default HTTPRoute support with configurable parent references, hostnames, paths, annotations and optional timeouts. Route to the existing TREK Service and keep Ingress support unchanged, including simultaneous use. Document configuration and extend the existing Helm Chart & Compose job with HTTPRoute render variants and strict validation using a pinned CRDs catalog. Approved on Discord: https://discord.com/channels/1488298068427411591/1553537637455761500 Validation: strict Helm lint, 37 manifests validated without errors or skipped resources, and both Compose configuration checks passed locally. Live Gateway WebSocket and streamed assistant response checks were not performed because no Kubernetes test cluster was configured.
TREK Helm Chart
This is a minimal Helm chart for deploying the TREK app.
Features
- Deploys the TREK container
- Exposes port 3000 via Service
- Optional persistent storage for
/app/dataand/app/uploads, plus extra volumes and mounts - Configurable environment variables and secrets
- Optional generic Ingress support
- Optional Gateway API HTTPRoute support
- Configurable health checks (liveness/readiness probes) on
/api/health
Helm Repository
A hosted Helm repository is available:
helm repo add trek https://chart.liketrek.com
helm repo update
helm install trek trek/trek
Note:
chart.liketrek.comis a custom domain (CNAME) for the GitHub Pages site athttps://liketrek.github.io/TREK— both URLs serve the same repository. The github.io URL keeps working (it redirects tochart.liketrek.com), but the custom domain is the canonical one to use.
Usage
Or install directly from the local chart:
helm install trek ./charts/trek \
--set ingress.enabled=true \
--set ingress.hosts[0].host=yourdomain.com
See values.yaml for more options.
HTTPRoute
HTTPRoute support is off by default. Enable it to attach TREK to an existing Gateway:
httpRoute:
enabled: true
annotations: {}
parentRefs:
- name: gateway
namespace: gateway-system
sectionName: https
hostnames:
- trek.example.com
paths:
- /
timeouts:
request: "0s"
backendRequest: "0s"
The cluster must have the Gateway API HTTPRoute v1 CRD and a Gateway API controller. The chart creates only the HTTPRoute, targeting TREK's existing Service and service.port; the Gateway, GatewayClass, listener, TLS certificate, and allowedRoutes configuration remain the operator's responsibility. When enabled, parentRefs and paths must be non-empty. Each path is a string prefix. Ingress and HTTPRoute can both be enabled.
Timeout fields became Standard Channel in Gateway API v1.2, but controller support is implementation-specific. Omitting them leaves timeout behavior to the controller. 0s disables the corresponding request timeout; controller idle and buffering settings can still interrupt /ws connections or streamed assistant responses. Set env.ALLOWED_ORIGINS and env.APP_URL to the public URL; when the Gateway terminates TLS, configure env.FORCE_HTTPS: "true" and env.TRUST_PROXY: "1".
Files
Chart.yaml— chart metadatavalues.yaml— configuration valuestemplates/— Kubernetes manifests
Notes
- Ingress is off by default. Enable and configure hosts for your domain.
- PVCs use the cluster's default StorageClass. Set
persistence.data.storageClassNameand/orpersistence.uploads.storageClassNameto bind a specific class. - To use your own PVCs, set
persistence.data.existingClaimand/orpersistence.uploads.existingClaim. The other values for that volume (size, storageClassName, annotations) are then ignored. - With
persistence.enabled: false, the data and uploads volumes use anemptyDir— storage is ephemeral and lost on pod restart. Intended for testing only. JWT_SECRETis managed entirely by the server — auto-generated into the data PVC on first start and rotatable via the admin panel (Settings → Danger Zone). No Helm configuration needed.ENCRYPTION_KEYencrypts stored secrets (API keys, MFA, SMTP, OIDC) at rest. Recommended: set viasecretEnv.ENCRYPTION_KEYorexistingSecret. If left empty, the server falls back automatically: existing installs usedata/.jwt_secret(no action needed on upgrade); fresh installs auto-generate a key persisted to the data PVC.- Liveness and readiness probes are configurable under
probes. Overrides are merged over the defaults, so--set probes.liveness.initialDelaySeconds=60keeps thehttpGethandler. When switching toexecortcpSocket, clearhttpGetin the same override. Setprobes.liveness: nullto remove a probe. - If exposing TREK through an Ingress or HTTPRoute, set
env.ALLOWED_ORIGINSandenv.APP_URLto the public URL. The chart does not sync these automatically. - Set
env.ALLOW_INTERNAL_NETWORK: "true"if Immich or other integrated services are hosted on a private/RFC-1918 address (e.g. a pod on the same cluster or a NAS on your LAN). Loopback (127.x) and link-local/metadata addresses (169.254.x) remain blocked regardless. - Set
env.ALLOW_LINK_LOCAL_IPSto a single link-local address (e.g."169.254.1.2") only when a service TREK needs sits behind one, such as a host gateway. Cloud metadata addresses (169.254.169.x,169.254.170.x) cannot be listed. FORCE_HTTPSis optional. Setenv.FORCE_HTTPS: "true"only when ingress (or another proxy) terminates TLS. It enables HTTPS redirects, HSTS, CSPupgrade-insecure-requests, and forces the session cookiesecureflag. RequiresTRUST_PROXYto be set.- Set
env.TRUST_PROXY: "1"(or the number of proxy hops) when running behind ingress or a load balancer. Required forFORCE_HTTPSto detect the forwarded protocol correctly. In production it defaults to1automatically. COOKIE_SECUREis auto-derived (on whenNODE_ENV=productionorFORCE_HTTPS=true). Setenv.COOKIE_SECURE: "false"only during local testing without TLS. Not recommended for production.- Web Push needs no chart settings: TREK generates its key pair on first start and keeps it in the database on the data PVC. To bring your own pair, set
env.VAPID_PUBLIC_KEYandsecretEnv.VAPID_PRIVATE_KEYtogether (and optionallyenv.VAPID_SUBJECT); changing the pair later means every device has to turn push on again. - Set
env.OIDC_DISCOVERY_URLto override the auto-constructed OIDC discovery endpoint. Required for providers (e.g. Authentik) that expose it at a non-standard path. - Use
extraVolumesandextraVolumeMountsto add your own volumes to the pod. To give the booking import more KItinerary extractors, mount a ConfigMap at/usr/local/share/kitinerary/extractors, with one.jsonand one.jskey for each extractor; see the example invalues.yaml.