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>
127 lines
3.9 KiB
YAML
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
|