Files
k8s-manifests/researchowl/deployment.yaml
T

160 lines
5.6 KiB
YAML

---
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:93a506b6
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