-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path.env.example
More file actions
146 lines (132 loc) · 7.66 KB
/
Copy path.env.example
File metadata and controls
146 lines (132 loc) · 7.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# ═══════════════════════════════════════════════════════════════════════
# SubGen — variables de entorno (copiar a .env y ajustar)
# Todas usan el prefijo SUBGEN_. Ver README.md, tabla de variables, para
# el detalle de cada una y en qué servicio(s) aplica.
# ═══════════════════════════════════════════════════════════════════════
# ── Redis (broker + result backend de Celery) ────────────────────────────
SUBGEN_REDIS_URL=redis://redis:6379/0
# ── Celery ────────────────────────────────────────────────────────────────
# Los defaults de acá alcanzan para desarrollo (video de referencia de 34min
# en una máquina de 32 cores). En producción (CPX32, 4 vCPU) un video real
# de 1h necesitó ~2772s de principio a fin -- verificado en vivo, ver
# DEPLOYMENT.md "Resultados reales". Si tu deploy va a aceptar videos
# largos, subí estos límites junto con SUBGEN_MAX_VIDEO_DURATION_SECONDS
# (los tres tienen que subir juntos, o vas a aceptar videos que después se
# cortan a mitad de camino por tiempo).
SUBGEN_CELERY_TASK_TIME_LIMIT=1800
SUBGEN_CELERY_TASK_SOFT_TIME_LIMIT=1700
SUBGEN_CELERY_MAX_RETRIES=3
SUBGEN_CELERY_RETRY_BACKOFF=10
SUBGEN_CELERY_RETRY_BACKOFF_MAX=120
SUBGEN_CELERY_TASK_ALWAYS_EAGER=false
# ── Whisper / faster-whisper (worker) ────────────────────────────────────
SUBGEN_WHISPER_MODEL=small
SUBGEN_WHISPER_DEVICE=cpu
SUBGEN_WHISPER_COMPUTE_TYPE=int8
SUBGEN_WHISPER_BEAM_SIZE=5
# 0 = detectar cores del contenedor. Sin esto, cpu_threads=0 de
# faster-whisper NO garantiza usar todos los cores disponibles.
SUBGEN_WHISPER_CPU_THREADS=0
# BatchedInferencePipeline: procesa chunks en paralelo. Default OFF --
# sin verificar en hardware real que no degrada timestamps/calidad.
SUBGEN_WHISPER_USE_BATCHED=false
SUBGEN_WHISPER_BATCH_SIZE=8
SUBGEN_WHISPER_VAD_MIN_SILENCE_MS=500
SUBGEN_WHISPER_VAD_SPEECH_PAD_MS=200
# ── Traducción (worker) ──────────────────────────────────────────────────
SUBGEN_TRANSLATE_BATCH_SIZE=25
# Lotes en paralelo. 2 (no más): con 4, Google throttlea y devuelve
# TranslationNotFound a algunas peticiones, dejando líneas sin traducir.
# Cada lote/ítem que throttlea igual reintenta con backoff.
SUBGEN_TRANSLATE_CONCURRENCY=2
# Mitigación de threads huérfanos (ver ARCHITECTURE.md): proceso nuevo del
# worker cada N jobs. 1 = máxima protección (recomendado en producción).
# 0 = deshabilitado (comportamiento viejo).
SUBGEN_CELERY_MAX_TASKS_PER_CHILD=1
# Chequeo pre-vuelo de espacio en disco antes de arrancar un job. <= 0
# deshabilita el chequeo.
SUBGEN_MIN_FREE_DISK_MB=3072
# ── Límites de negocio ────────────────────────────────────────────────────
SUBGEN_MAX_VIDEO_DURATION_SECONDS=3600
# ── Cookies de YouTube (opcional, solo worker) ────────────────────────────
# Necesario si ves "Sign in to confirm you're not a bot" en los logs del
# worker. Ver README, sección "Cookies de YouTube", para cómo exportarlas.
# SUBGEN_YTDLP_COOKIES_FILE es la ruta DENTRO del contenedor (fija, no la
# cambies). YTDLP_COOKIES_FILE_HOST es la ruta en TU máquina/VPS al
# cookies.txt real — dejala vacía si no la necesitás, docker-compose monta
# /dev/null como fallback y no pasa nada.
SUBGEN_YTDLP_COOKIES_FILE=/worker/cookies.txt
YTDLP_COOKIES_FILE_HOST=
# Proxy de salida para yt-dlp. Vacío = salida directa por la IP de la VPS.
#
# Por qué existe: las IPs de datacenter están mal vistas por las plataformas
# de video. Verificado en producción -- el MISMO video que falla desde la
# VPS anda perfecto desde una IP residencial:
# - YouTube: "Sign in to confirm you're not a bot" constante, obliga a
# re-exportar cookies cada pocas horas.
# - Odysee: su CDN (CDN77) devuelve 429 por reputación de rango, con solo
# 2 pedidos por video. Ni --force-ipv4, ni user-agent de navegador, ni
# backoff lo resuelven.
#
# Con Cloudflare WARP como salida (gratis), CDN77 deja de tirar 429 --
# medido con curl directo al CDN: pasa de 429 a 401 (401 = token de
# streaming vencido en la URL de prueba, o sea que dejó de bloquear por
# reputación).
#
# NO resuelve YouTube. Se probó y falla igual que sin proxy: un video
# normal devuelve "Sign in to confirm you're not a bot" con WARP activo.
# (Una prueba anterior parecía indicar lo contrario, pero estaba hecha
# con un video excepcionalmente permisivo -- no era representativa.)
# Para YouTube siguen haciendo falta cookies frescas.
#
# Ver DEPLOYMENT.md, "Proxy de salida (Cloudflare WARP)".
#
# socks5h (no socks5): la "h" hace que el DNS lo resuelva el proxy.
SUBGEN_YTDLP_PROXY=
# ── FFmpeg / estilo de subtítulos quemados (worker; NO cambiar el estilo) ─
SUBGEN_BURN_FONT_NAME=Arial
SUBGEN_BURN_FONT_SIZE=20
SUBGEN_BURN_PRIMARY_COLOUR=&HFFFFFF&
SUBGEN_BURN_OUTLINE_COLOUR=&H000000&
SUBGEN_BURN_BORDER_STYLE=1
SUBGEN_BURN_OUTLINE=2
SUBGEN_BURN_SHADOW=1
SUBGEN_BURN_MARGIN_V=25
SUBGEN_FFMPEG_PRESET=fast
SUBGEN_FFMPEG_CRF=23
# 30fps es casi indistinguible de 60fps para una charla hablada y reduce a
# la mitad el trabajo de libass (mono-hilo) y de x264. El frontend deja
# elegir por job (30/60); esto es el default si no se especifica. 0 = no
# tocar el frame rate nativo del source.
SUBGEN_DEFAULT_BURN_FPS=30
SUBGEN_FFMPEG_TIMEOUT_SECONDS=1800
# ── Almacenamiento S3-compatible (compartido entre api y worker) ─────────
# Local/demo: MinIO (incluido en docker-compose.yml)
# Producción: MinIO propio en una VPS, Hetzner Object Storage, o S3/AWS
SUBGEN_S3_ENDPOINT_URL=http://minio:9000
# Solo la API la usa: es el endpoint que ve el NAVEGADOR del usuario para
# las URLs pre-firmadas. En local, http://localhost:9000. En prod, la URL
# pública de tu bucket (Hetzner Object Storage o tu propio MinIO expuesto).
SUBGEN_S3_PUBLIC_ENDPOINT_URL=http://localhost:9000
SUBGEN_S3_ACCESS_KEY=subgen
SUBGEN_S3_SECRET_KEY=subgen12345
SUBGEN_S3_BUCKET=subgen-outputs
SUBGEN_S3_REGION=us-east-1
SUBGEN_S3_USE_SSL=false
SUBGEN_S3_PRESIGNED_URL_EXPIRY_SECONDS=3600
# ── Limpieza automática (Celery Beat, embebido en worker-1) ──────────────
SUBGEN_CLEANUP_MAX_AGE_HOURS=24
SUBGEN_CLEANUP_INTERVAL_SECONDS=3600
# ── API: CORS y rate limiting ─────────────────────────────────────────────
# Lista separada por comas. En producción NO usar "*".
SUBGEN_CORS_ORIGINS=http://localhost:8000
SUBGEN_RATE_LIMIT_CREATE_JOB=5/minute
SUBGEN_MAX_URL_LENGTH=2048
# ── Frontend estático (servido por la API) ────────────────────────────────
SUBGEN_SERVE_FRONTEND=true
SUBGEN_FRONTEND_DIR=/frontend
# ── Logging ───────────────────────────────────────────────────────────────
SUBGEN_LOG_LEVEL=INFO
# ── MinIO (solo lo usa el contenedor minio en docker-compose.yml local) ──
MINIO_ROOT_USER=subgen
MINIO_ROOT_PASSWORD=subgen12345