Ir al contenido

Variables de entorno

Las env vars están validadas con Zod al boot de ambos repos. Si falta una requerida, el proceso falla con un mensaje claro listando qué falta.

Definidas en src/config.ts (Zod schema). Validadas al startup del Cloud Run.

VariableRequeridaDefaultPropósitoUbicación en prod
NODE_ENVnodevelopmentEntorno (development/test/production)Cloud Run env
PORTno3000Puerto ExpressCloud Run env (manejado por Cloud Run)
LOG_LEVELnoinfoNivel Pino (fatal/error/warn/info/debug/trace/silent)Cloud Run env
MONGODB_URIConnection string AtlasGCP Secret Manager
MONGODB_DB_NAMEnoapi-cardsDatabase nameCloud Run env
ADMIN_TOKENToken para /admin/stats y /admin/sync/:tcg (mín 16 chars)GCP Secret Manager
INTERNAL_JWT_SECRETFirma JWTs HS256 (mín 32 chars)GCP Secret Manager. Mismo valor en Vercel.
INTERNAL_AUTH_SECRETValida X-Internal-Auth (mín 32 chars)GCP Secret Manager. Mismo valor en Vercel.
INTERNAL_CRON_SECRETValida X-Internal-Cron-Secret (mín 16 chars)GCP Secret Manager + Cloud Scheduler headers
CLOUDINARY_CLOUD_NAMENombre del cloudCloud Run env (público, no secret)
CLOUDINARY_API_KEYAPI keyGCP Secret Manager
CLOUDINARY_API_SECRETAPI secretGCP Secret Manager
RESEND_API_KEYAPI key ResendGCP Secret Manager
RESEND_FROM_EMAILnoonboarding@resend.devEmail “From”Cloud Run env (típicamente notificaciones@tcgcards.cl)
WEB_PUBLIC_URLnohttps://tcgcards-web.vercel.appURL del frontend (para links en emails)Cloud Run env (en prod: https://tcgcards.cl)
ADMIN_NOTIFICATION_EMAILnodisputas@tcgcards.clEmail para alertas adminCloud Run env
MP_WEBHOOK_SECRETValida firma de webhooks MPGCP Secret Manager
MP_ACCESS_TOKENAccess token MP (prefix APP_USR-)GCP Secret Manager
BANK_ACCOUNT_ENCRYPTION_KEYClave AES-GCM (32 bytes base64) para encrypt de cuentas bancariasGCP Secret Manager
OCR_SPACE_API_KEYAPI key de OCR.space (Engine 3) usada por el escáner de cartasGCP Secret Manager (secret id ocr-space-api-key)
REFUND_MP_WINDOW_DAYSno30Días desde el pago dentro de los cuales se reembolsa a la tarjeta vía MP; pasado el plazo (o si MP rechaza), al wallet. No está en config.ts: se lee directo en RefundService (igual que MercadoPagoService lee MP_ACCESS_TOKEN lazy). 30 es elección conservadora; MP permite hasta 180. Ver Decisiones → PagosCloud Run env (normalmente sin setear → default 30)

Estas no se setean en prod. config.ts valida al boot que no aparezcan en producción (defensa fail-closed), así que su presencia en el código de main es inerte.

VariableDónde se seteaPropósito
MP_FAKE_PAYMENTStcgcards-api-staging (Cloud Run, modo skip)Activa el seam de pruebas: el server fabrica pagos sintéticos (getPayment/refund) para la suite E2E headless, sin tocar MercadoPago, corriendo el flujo de dinero REAL. createPreference queda real (el checkout manual del browser funciona). Doble fail-closed: aborta el boot si NODE_ENV=production o si MONGODB_DB_NAME no contiene "staging". Ver Suite E2E de flujos de dinero.
MP_FAKE_PREFERENCE(no se setea por defecto)Opcional, junto con MP_FAKE_PAYMENTS. Hace que createPreference también sea sintética → acelera la suite headless (no llama a MP en el checkout) pero rompe el checkout manual del browser (link /_fake_mp_checkout/... inexistente). Por eso deploy-staging.sh no lo setea.
MP_SKIP_SIGNATURE_VERIFICATIONtcgcards-api-staging (modo skip)Saltea la verificación de firma del webhook de MP (las credenciales TEST no entregan firma verificable). config.ts aborta el boot si está en true con NODE_ENV=production.
STAGING_MP_MODEGitHub → tcgcards-api → Variablesskip (default actual) o verify. El pipeline de staging lo pasa a deploy-staging.sh; en skip se activan los dos flags de arriba (NODE_ENV=development).

Sync del catálogo (workflow de GitHub Actions)

Sección titulada «Sync del catálogo (workflow de GitHub Actions)»

Estas variables viven en sync-incremental.yml (no en Cloud Run — el servidor API no las necesita):

VariableDóndePara qué
MYL_SYNChardcoded 'true' en el workflowActiva el source de Mitos y Leyendas en el registry. Sin ella el source no se registra (gate de seguridad: mergear el código no activa nada).
MYL_EDITIONS(solo manual)Lista de slugs separados por coma para limitar el universo de ediciones de Mitos — útil para reintentos puntuales y pruebas.
R2_ENDPOINT / R2_ACCESS_KEY_ID / R2_SECRET_ACCESS_KEYGitHub → SecretsCredenciales del bucket tcgcards-img en Cloudflare R2 (espejo de imágenes de Mitos, servidas por img.tcgcards.cl). Token “Object Read & Write” acotado al bucket.
R2_BUCKET / R2_PUBLIC_BASE_URLhardcoded en el workflowtcgcards-img / https://img.tcgcards.cl.

Ver Mitos y Leyendas (fuente propia).

Ventana de terminal
gcloud secrets versions access latest \
--secret=MONGODB_URI \
--project=api-cards-prod
Ventana de terminal
echo -n "NUEVO_VALOR" | gcloud secrets versions add MONGODB_URI \
--data-file=- \
--project=api-cards-prod

Después es obligatorio redeploy del Cloud Run para que la nueva versión se aplique. Ver runbook deploy.

Definidas en src/lib/env.ts (Zod schema). Validadas al startup de Next.js.

VariableRequeridaDefaultPropósitoUbicación en prod
TCGCARDS_API_URLURL base del backend (server-only)Vercel env
NEXT_PUBLIC_API_URLIgual valor pero expuesta al client bundle (para componentes client como SearchAutocomplete)Vercel env
NEXT_PUBLIC_SITE_URLURL pública del sitio (metadata, OG, canonical)Vercel env (https://tcgcards.cl)
AUTH_SECRETSecreto Auth.js para cifrar cookies de sesión (mín 32 chars). Generar con openssl rand -hex 32Vercel env
AUTH_GOOGLE_IDGoogle OAuth Client IDVercel env (config en Google Cloud Console)
AUTH_GOOGLE_SECRETGoogle OAuth Client SecretVercel env
INTERNAL_JWT_SECRETIgual valor que en el backend; firma JWTs propiosVercel env. Mismo valor que el backend.
INTERNAL_AUTH_SECRETIgual valor que en el backend; autentica server actions → APIVercel env. Mismo valor que el backend.
NEXT_PUBLIC_SCANNER_ENABLEDno— (apagado)Feature flag del escáner. Los 3 entry points (header desktop, header mobile, form de venta) solo se renderizan si vale exactamente 'true'. Pública: se lee directo de process.env, no está en el Zod schema de env.tsVercel env
NEXT_PUBLIC_ENABLE_TEST_LOGINno— (apagado)Solo staging. Habilita el test-login (entrar como cualquier email sin Google, para probar flujos con usuarios ficticios). Triple gate fail-closed: requiere este flag 'true' Y VERCEL_ENV !== 'production' (en prod el provider de credenciales ni se registra). Se setea solo en el env Preview de Vercel (staging). El código vive solo en la rama staging del web — nunca en main.Vercel env — solo Preview/staging

Desde dashboard:

  1. https://vercel.com → proyecto tcgcards-web → Settings → Environment Variables
  2. Cada variable tiene environments: Production, Preview, Development. Generalmente queremos los 3 si la app local también la necesita.

Desde CLI:

Ventana de terminal
# Listar
vercel env ls
# Agregar (interactive)
vercel env add NEXT_PUBLIC_SITE_URL production
# Quitar
vercel env rm NEXT_PUBLIC_SITE_URL production

Después de cambiar una env var, Vercel requiere redeploy para que aplique. Hacer push de cualquier commit o vercel --prod.

  • Variables con prefix NEXT_PUBLIC_ se incluyen en el bundle del browser. Nunca poner secrets ahí — cualquiera puede leerlas inspeccionando el JS.
  • TCGCARDS_API_URL (sin prefix NEXT_PUBLIC_) solo existe en server-side. Se importa via import { env } from '@/lib/env' que tiene import 'server-only' arriba — si alguien la importa en un client component, falla el build.

Resumen — qué secrets son críticos y por qué

Sección titulada «Resumen — qué secrets son críticos y por qué»
SecretSi se filtra…
MONGODB_URIacceso total a la BD productiva → catastrófico
MP_ACCESS_TOKENpueden iniciar cobros y reembolsos como nosotros → muy grave
MP_WEBHOOK_SECRETpueden forgear webhooks para acreditar pagos falsos → muy grave
BANK_ACCOUNT_ENCRYPTION_KEYdecryptan las cuentas bancarias guardadas → catastrófico
INTERNAL_AUTH_SECRET / INTERNAL_JWT_SECRETpueden hacer requests autenticados a la API como cualquier user → grave
INTERNAL_CRON_SECRETpueden dispararnos los crons a discreción → moderado
AUTH_SECRET (Auth.js)pueden forgear sesiones de cualquier user → grave
AUTH_GOOGLE_SECREThijack del flujo OAuth → grave
CLOUDINARY_API_SECRETpueden subir imágenes y borrar las existentes → moderado
RESEND_API_KEYpueden mandar emails como tcgcards → moderado (reputación)
ADMIN_TOKENacceso a triggers de sync de catálogo → moderado
OCR_SPACE_API_KEYpueden agotar/abusar nuestro cupo de OCR.space → bajo (free tier, resetea diario; a lo sumo deja el escáner inutilizable hasta el reset)

Ver runbook rotación de credenciales para los pasos exactos cuando algo se filtre o periódicamente.