--- apiVersion: v1 kind: Namespace metadata: name: researchowl --- apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: # Never let ArgoCD prune this PVC: it holds persistent app data. argocd.argoproj.io/sync-options: Prune=false name: researchowl-data namespace: researchowl spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: researchowl namespace: researchowl labels: app: researchowl spec: replicas: 1 # Single-replica bot on a RWO local-path SQLite DB (WAL): Recreate avoids two pods # briefly opening /data/researchowl.db during a roll (double-writer corruption risk). strategy: type: Recreate selector: matchLabels: app: researchowl template: metadata: labels: app: researchowl spec: containers: - name: researchowl image: git.chemavx.xyz/chemavx/researchowl:cfe4a6d7 imagePullPolicy: Always env: - name: TELEGRAM_BOT_TOKEN valueFrom: secretKeyRef: name: researchowl-secrets-infisical key: telegram-bot-token - name: TELEGRAM_ALLOWED_USERS valueFrom: secretKeyRef: name: researchowl-secrets-infisical key: telegram-allowed-users - name: OLLAMA_URL value: "http://ollama.ollama.svc.cluster.local:11434" # 2026-07-23: subidos ambos al activarse la iGPU. Generación 3B→7B # (medido: ~12,6s/doc a 100% GPU, salto de calidad claro). Embeddings # nomic(768d, inglés)→bge-m3(1024d, multilingüe) — mismo modelo que # roswell; los 3990 chunks existentes se re-embebieron in situ antes # de este cambio (si no, el coseno daría 0.0 por dim distinta). - name: OLLAMA_MODEL value: "qwen2.5:7b" - name: OLLAMA_EMBED_MODEL value: "bge-m3" - name: DB_PATH value: "/data/researchowl.db" - name: MAX_SOURCES value: "200" - name: MAX_DEPTH value: "3" - name: QUALITY_THRESHOLD value: "0.4" - name: ANTHROPIC_API_KEY valueFrom: secretKeyRef: name: researchowl-secrets-infisical key: anthropic-api-key - name: GHOST_URL value: "https://zonadeexclusion.com" - name: GHOST_API_KEY valueFrom: secretKeyRef: name: researchowl-secrets-infisical key: ghost-api-key - name: GHOST_URL_EN value: "https://www.theexclusionzone.com" - name: GHOST_API_KEY_EN valueFrom: secretKeyRef: name: researchowl-secrets-infisical key: ghost-api-key-en # dryrun: el borrador se crea SIN escribir el SEO; autofill solo lo # PROPONE por Telegram. El SEO se deriva del texto FINAL en el paso # de remate (seo_finish.py), tras la revisión editorial y la elección # de imagen — antes se generaba de un texto que aún iba a cambiar, y # había que rehacerlo a mano en cada post. - name: SEO_AUTOFILL value: "dryrun" - name: NEWS_ENABLED value: "true" - name: ENABLE_NEWS_SEED value: "true" # YouTube (/upload_short). Las tres van `optional: true` A PROPÓSITO: # mientras no existan en Infisical, el pod arranca igual y el comando # contesta "no configurado". Sin optional, una clave que aún no está # deja el Deployment en CreateContainerConfigError y tira el bot # entero por una función que nadie ha pedido todavía. - name: YOUTUBE_CLIENT_ID valueFrom: secretKeyRef: name: researchowl-secrets-infisical key: youtube-client-id optional: true - name: YOUTUBE_CLIENT_SECRET valueFrom: secretKeyRef: name: researchowl-secrets-infisical key: youtube-client-secret optional: true - name: YOUTUBE_REFRESH_TOKEN valueFrom: secretKeyRef: name: researchowl-secrets-infisical key: youtube-refresh-token optional: true # No lo subas a "public": los vídeos de un proyecto de API sin # auditar quedan privados igual, y lo único que cambia es que el # aviso de Telegram diga que YouTube forzó la visibilidad. - name: YOUTUBE_PRIVACY value: "private" volumeMounts: - name: data mountPath: /data resources: requests: memory: "256Mi" cpu: "100m" limits: memory: "2Gi" cpu: "500m" volumes: - name: data persistentVolumeClaim: claimName: researchowl-data imagePullSecrets: - name: gitea-registry-infisical # Secret is managed imperatively (not by ArgoCD) to avoid overwriting real values: # kubectl create secret generic researchowl-secrets \ # --from-literal=telegram-bot-token=YOUR_TOKEN \ # --from-literal=telegram-allowed-users=YOUR_USER_ID \ # --from-literal=anthropic-api-key=YOUR_KEY \ # -n researchowl