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
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.

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

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