160 lines
5.6 KiB
YAML
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:6e4b3e13
|
|
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
|