# tududi keeps everything in a SQLite file under /app/db and user uploads # under /app/uploads. Both are declared VOLUMEs in the image, so both have to # be backed by the PVC or they are lost on restart. apiVersion: apps/v1 kind: Deployment metadata: name: tududi namespace: tududi labels: app.kubernetes.io/name: tududi spec: replicas: 1 revisionHistoryLimit: 3 strategy: # single-writer SQLite on a ReadWriteOnce volume type: Recreate selector: matchLabels: app.kubernetes.io/name: tududi template: metadata: labels: app.kubernetes.io/name: tududi spec: containers: - name: tududi image: chrisvel/tududi:1.3.1 imagePullPolicy: IfNotPresent env: # tududi sits behind traefik and the EC2 proxy, so it has to trust # X-Forwarded-* to build correct URLs and mark cookies secure - name: TUDUDI_TRUST_PROXY value: "true" - name: TUDUDI_USER_EMAIL valueFrom: secretKeyRef: name: tududi key: user-email - name: TUDUDI_USER_PASSWORD valueFrom: secretKeyRef: name: tududi key: user-password - name: TUDUDI_SESSION_SECRET valueFrom: secretKeyRef: name: tududi key: session-secret - name: TZ value: America/Los_Angeles # AI assistant (daily brief, task/project insights). tududi speaks # the OpenAI chat completions API, so it points straight at the # Ollama box; /v1 is required. A key must be set even though Ollama # ignores it -- without one the endpoints answer 503. - name: LLM_BASE_URL value: http://192.168.1.191:11434/v1 - name: LLM_MODEL value: gemma4:e4b - name: LLM_API_KEY valueFrom: secretKeyRef: name: tududi key: llm-api-key ports: - name: http containerPort: 3002 protocol: TCP startupProbe: tcpSocket: port: http failureThreshold: 60 periodSeconds: 5 readinessProbe: tcpSocket: port: http periodSeconds: 10 failureThreshold: 3 livenessProbe: tcpSocket: port: http periodSeconds: 20 failureThreshold: 3 volumeMounts: - name: data mountPath: /app/db subPath: db - name: data mountPath: /app/uploads subPath: uploads volumes: - name: data persistentVolumeClaim: claimName: tududi