mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-11-12 07:10:56 +00:00
402a02a302
The entrypoint comment, the Helm chart README, the wiki and the ssrfGuard note now describe what the shipped check does.
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.
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. podSecurityContextdefaults tofsGroup: 1000withfsGroupChangePolicy: OnRootMismatch, andsecurityContext(the container's) is empty. The container then starts as root, hands/app/dataand/app/uploadstonode(uid 1000) if the directory or anything directly inside it is not owned bynodeyet, and drops tonode. Deeper files are not checked. Only the owning user is changed (plus arootgroup), so a differentfsGroupstays in place. A volume that refuseschown(NFS withroot_squash) logs a warning instead; setrunAsUser: 1000then. To run asnodefrom the start, for example under therestrictedPod Security Standard, setpodSecurityContext.runAsUser: 1000andrunAsGroup: 1000; the image then skips that step and the privilege drop. See the example invalues.yaml.- 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.