{{- if gt (int .Values.scaling.console.replicas) 0 }} apiVersion: apps/v1 kind: Deployment metadata: name: console labels: {{- include "jitsu-dev.labels" . | nindent 4 }} app.kubernetes.io/name: console spec: replicas: {{ .Values.scaling.console.replicas }} strategy: type: Recreate selector: matchLabels: app.kubernetes.io/name: console app.kubernetes.io/instance: {{ .Release.Name }} template: metadata: labels: app.kubernetes.io/name: console app.kubernetes.io/instance: {{ .Release.Name }} spec: containers: - name: console image: node:24-bookworm workingDir: /cache/workspace/webapps/console command: - sh - -c - | apt-get update -qq && apt-get install -y -qq rsync > /dev/null 2>&1 # Background rsync: every 2s, sync only actually changed files (while true; do sleep 2 rsync -a --checksum \ --exclude='node_modules' --exclude='.next' --exclude='.turbo' \ --exclude='docker/data' --exclude='*.log' \ /project/webapps/ /cache/workspace/webapps/ rsync -a --checksum \ --exclude='node_modules' \ /project/libs/ /cache/workspace/libs/ rsync -a --checksum \ --exclude='node_modules' \ /project/types/ /cache/workspace/types/ done) & cd /cache/workspace/webapps/console # On a fresh install the db-push job may still be applying the # schema — retry seed until it succeeds instead of silently # starting without a seeded admin user. until npx tsx scripts/manage.ts seed; do echo "seed failed (database schema not ready yet?), retrying in 5s..." sleep 5 done # Create the events-log ClickHouse tables (powers Live Events). # Nothing else runs this in the dev chart — in prod the # admin/events-log-init route does. Best-effort: retry a few times # for a not-yet-ready ClickHouse, then continue so a disabled or # broken ClickHouse can't wedge console startup. for i in $(seq 1 12); do npx tsx scripts/manage.ts events-log-init && break echo "events-log-init failed (clickhouse not ready yet?), retry $i/12 in 5s..." sleep 5 done exec npx next dev -H 0.0.0.0 -p 3000 ports: - name: http containerPort: 3000 protocol: TCP envFrom: - secretRef: name: jitsu-secrets # Connection URLs of the in-cluster dependencies (helm-deps chart). # Listed after jitsu-secrets so its keys win over any legacy URL # keys there; explicit env entries below still take precedence. - secretRef: name: jitsu-deps-urls optional: true env: # Empty *_PORT entries override K8s-injected service-link vars # (tcp://...) that break zod number coercion. # MAINTENANCE_CONFIG_FILE: maintenance descriptor mounted from # `jitsu-console-maintenance` (optional ConfigMap, key # `maintenance.json`). Manage via # webapps/console/scripts/maintenance-mode.sh. {{- include "jitsu-dev.env" (dict "ctx" . "service" "console" "extra" (dict "BULKER_PORT" "" "ROTOR_PORT" "" "SYNCCTL_PORT" "" "INGMGR_PORT" "" "MAINTENANCE_CONFIG_FILE" "/etc/jitsu/maintenance/maintenance.json")) | nindent 12 }} volumeMounts: - name: project mountPath: /project readOnly: true - name: node-cache mountPath: /cache - name: maintenance mountPath: /etc/jitsu/maintenance readOnly: true livenessProbe: httpGet: path: /api/healthcheck port: http initialDelaySeconds: 120 periodSeconds: 15 timeoutSeconds: 10 readinessProbe: httpGet: path: /api/healthcheck port: http initialDelaySeconds: 60 periodSeconds: 10 timeoutSeconds: 10 startupProbe: httpGet: path: /api/healthcheck port: http initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 10 failureThreshold: 30 volumes: - name: project hostPath: path: {{ include "jitsu-dev.projectRoot" . }} type: Directory - name: node-cache persistentVolumeClaim: claimName: node-cache # `optional: true` so the pod boots cleanly when no maintenance window # is configured (the volume mounts as an empty dir; missing config # file → load() returns "no maintenance"). Create the CM via # `webapps/console/scripts/maintenance-mode.sh start` to enable # maintenance — propagates to running pods within ~1min via kubelet # sync; no restart needed. - name: maintenance configMap: name: jitsu-console-maintenance optional: true --- apiVersion: v1 kind: Service metadata: name: console labels: {{- include "jitsu-dev.labels" . | nindent 4 }} app.kubernetes.io/name: console spec: type: LoadBalancer ports: - port: 3000 targetPort: http protocol: TCP name: http selector: app.kubernetes.io/name: console app.kubernetes.io/instance: {{ .Release.Name }} {{- end }}