Files
k8s-manifests/researchowl/deployment.yaml
T
chemavxandClaude Opus 4.8 999efe6956 researchowl: SEO_AUTOFILL on → dryrun
Cierra el cambio de orden del flujo editorial. Con 'on', ResearchOwl escribía
el SEO en el borrador nada más generarlo — pero el SEO es DERIVADO del
artículo, y la revisión editorial posterior cambia el texto: la meta acababa
describiendo algo que ya no existía y había que rehacerla a mano en cada post.
Caso real del 2026-07-20: la meta del artículo belga decía 'A declassified
case unsolved' cuando el artículo argumenta que los datos crudos siguen
clasificados.

Con 'dryrun' el borrador se crea sin SEO y autofill solo lo PROPONE por
Telegram. El SEO se deriva del texto FINAL en el remate (seo_finish.py), que
además escribe el feature_image_alt — imposible en generación porque la imagen
destacada aún no se ha elegido (de ahí el 'human adds later' de autofill.py,
un paso humano que no ocurría: 9 posts publicados sin alt entre el 29-jun y
el 16-jul).

Contrapartida asumida: si un post se publica SIN pasar por el remate, saldrá
sin SEO. Red de seguridad: seo_watch marca meta_description.missing como HIGH,
y seo-check sigue disponible como puerta pre-publicación.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 11:27:38 +00:00

127 lines
3.9 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:dadc030d
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"
- name: OLLAMA_MODEL
value: "qwen2.5:3b"
- name: OLLAMA_EMBED_MODEL
value: "nomic-embed-text"
- 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"
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