# Bot + scheduler en un pod (PLAN §Fase 6). Los secretos vienen de Infisical # (carpeta /roswell del proyecto homelab) vía infisical-roswell-secrets.yaml. --- apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: # ArgoCD no debe podar este PVC: guarda la caché del modelo Whisper (~3GB) # y los PDFs subidos por Telegram. argocd.argoproj.io/sync-options: Prune=false name: roswell-data namespace: roswell spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: roswell namespace: roswell labels: app: roswell spec: replicas: 1 # Dos pods haciendo polling del mismo token de Telegram entran en conflicto: # Recreate garantiza que el viejo muere antes de arrancar el nuevo. strategy: type: Recreate selector: matchLabels: app: roswell template: metadata: labels: app: roswell spec: containers: - name: roswell # Tag placeholder: el workflow de Gitea Actions lo sustituye por el # sha8 real en cada build (ver .gitea/workflows/build.yml del repo). image: git.chemavx.xyz/chemavx/roswell-corpus:93fe8de2 imagePullPolicy: Always env: - name: TELEGRAM_BOT_TOKEN valueFrom: secretKeyRef: name: roswell-secrets-infisical key: telegram-bot-token - name: TELEGRAM_ALLOWED_USERS valueFrom: secretKeyRef: name: roswell-secrets-infisical key: telegram-allowed-users - name: ANTHROPIC_API_KEY valueFrom: secretKeyRef: name: roswell-secrets-infisical key: anthropic-api-key - name: DATABASE_URL valueFrom: secretKeyRef: name: roswell-secrets-infisical key: database-url - name: PODCASTINDEX_KEY valueFrom: secretKeyRef: name: roswell-secrets-infisical key: podcastindex-key - name: PODCASTINDEX_SECRET valueFrom: secretKeyRef: name: roswell-secrets-infisical key: podcastindex-secret - name: OLLAMA_URL value: "http://ollama.ollama.svc.cluster.local:11434" - name: SEARXNG_URL value: "http://searxng-svc.researchowl.svc.cluster.local:8080" - name: WHISPER_MODEL value: "large-v3" - name: WHISPER_DEVICE value: "cpu" - name: DATA_DIR value: "/data" - name: FEED_CHECK_HOURS value: "24" # Caché de modelos Whisper en el PVC: la descarga (~3GB) sobrevive # a los redeploys. - name: HF_HOME value: "/data/hf-cache" volumeMounts: - name: data mountPath: /data resources: requests: memory: "512Mi" cpu: "500m" limits: # Whisper large-v3 INT8 en CPU: el pico real supera los 4Gi que # estimaba el PLAN §10 (OOMKilled verificado el 2026-07-13). # Sin límite de CPU: la transcripción usa los cores libres. memory: "6Gi" # Nodo grande (16 cores / 29Gi): transcribe a ~1x tiempo real y comparte # nodo con los PVC de datos y backups. El nodo pequeño (4 cores/12Gi) # se saturaba con Whisper. nodeSelector: kubernetes.io/hostname: chemavx-k8 volumes: - name: data persistentVolumeClaim: claimName: roswell-data imagePullSecrets: - name: gitea-registry