Pular para o conteúdo principal

Environment Variables

O template usa dois arquivos de env em dev local e variáveis do Cloudflare em produção.

Arquivos locais

ArquivoLido porContexto
.dev.varsWrangler (SSR)Server-side (loaders/actions)
.envViteClient-side (build time)
wrangler.tomlWranglerCloudflare Workers config + bindings
informação

Em dev local, ambos .dev.vars e .env são necessários com as mesmas variáveis. Existem múltiplos arquivos .dev.vars.*.example com configurações pré-preenchidas para cada marca.

Variáveis obrigatórias (5)

# API
API_BASE_URL=https://stage1-api-new.bs2bet.com/v2

# Marca
ORIGIN_DOMAIN=stage1.gli-cactus.com
BRAND_LANGUAGE=pt-br
BRAND_COUNTRY=BRA
BRAND_CURRENCY=BRL

Todas são obrigatórias e fazem parte da interface ClientEnv.

Variáveis server-only

# Timezone da marca (usado apenas no server, NÃO está na ClientEnv)
BRAND_TIMEZONE=America/Sao_Paulo

# TTL do cache de brand em segundos (default: 3600)
BRAND_CACHE_TTL=3600

# Secret para o endpoint de purge de cache via webhook
CACHE_PURGE_SECRET=dev-secret-change-me

# Chave de autenticação Worker → API (server-side only, nunca expor ao browser)
CF_WORKER_KEY=your-worker-auth-key-here

# Salt key Smartico para hash de autenticação (segredo)
SMARTICO_SALT_KEY=your-smartico-salt-key-here

# Política de cache da plataforma (injetada pelo front-ops em deploy-time)
# Ausente = engine em bypass (chama APIs diretamente, ideal para dev local)
# PLATFORM_CACHE_POLICY_JSON={"brandConfig":{...}}
cuidado

BRAND_TIMEZONE, CACHE_PURGE_SECRET, CF_WORKER_KEY, SMARTICO_SALT_KEY e PLATFORM_CACHE_POLICY_JSON sao server-only. Nao fazem parte da interface ClientEnv e nunca sao expostas ao browser. CF_WORKER_KEY e SMARTICO_SALT_KEY sao segredos e devem ser configurados como secrets na CF.

Smartico / Gamificação

A configuração de gamificação é feita por arquivo + env var:

  • Base client-side: app/config/gamification/gamification.ts
  • Base server-side: app/config/gamification/gamification.server.ts
  • Override por brand:
    • overrides/<brand-key>/app/config/gamification/gamification.ts
    • overrides/<brand-key>/app/config/gamification/gamification.server.ts

<brand-key> vem de ORIGIN_DOMAIN normalizado com . -> -.

Salt key (server-side hash)

A saltKey para geração do hash de autenticação Smartico é um segredo server-side e deve ser configurada via variável de ambiente:

# No .dev.vars (dev local)
SMARTICO_SALT_KEY=your-smartico-salt-key-here

Prioridade de resolução:

  1. SMARTICO_SALT_KEY env var da Cloudflare (secret)
  2. SMARTICO_SALT_KEY via process.env (.dev.vars / Node)
  3. smarticoHashConfig.saltKey do config file (fallback — normalmente vazio)
cuidado

Nunca commite a salt key real em arquivos de override. Use SMARTICO_SALT_KEY como secret na CF (wrangler secret put SMARTICO_SALT_KEY).

Sports / Esportes

A configuração de sportsbook agora é feita por arquivo:

  • Base: app/config/sports/sports.ts
  • Override por brand: overrides/<brand-key>/app/config/sports/sports.ts

<brand-key> vem de ORIGIN_DOMAIN normalizado com . -> -.

Outras variáveis opcionais

CASSINO_MODE=legacy # legacy | api_new (default: legacy)
TURNSTILE_SITE_KEY=1x00000000000000000000AA
RECAPTCHA_SITE_KEY=6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI
VariávelNa ClientEnv?Descrição
CASSINO_MODESimModo do cassino: legacy ou api_new. Quando ausente/inválido → default legacy.
TURNSTILE_SITE_KEYSimSite key pública do Turnstile (captcha de registro — quando habilitado via authConfig)
RECAPTCHA_SITE_KEYSimSite key pública do reCAPTCHA (alternativa ao Turnstile em algumas marcas)

Removidas: LEGACY_CASINO_ENABLED (substituída por CASSINO_MODE), GAMES_CACHE_TTL (cache agora é 100% controlado via PLATFORM_CACHE_POLICY_JSON injetado pelo front-ops), e CASSINO_FRONT_CUSTOM_BASE (removida junto com o mode front_custom).

Interface ClientEnv

A interface ClientEnv define os campos passados ao browser via EnvProvider.

interface ClientEnv {
// Obrigatórios (5)
API_BASE_URL: string;
ORIGIN_DOMAIN: string;
BRAND_LANGUAGE: string;
BRAND_COUNTRY: string;
BRAND_CURRENCY: string;

// Outros — opcionais
CASSINO_MODE?: string;
TURNSTILE_SITE_KEY?: string;
RECAPTCHA_SITE_KEY?: string;
}

Nota: BRAND_TIMEZONE não está na ClientEnv (é server-only). BRAND_CACHE_TTL também é exclusivamente server-side.

Acesso no código

Server-side (loaders/actions)

export async function loader({ context }: Route.LoaderArgs) {
// Em produção (Cloudflare Workers):
const env = context.cloudflare?.env;

// Em dev (fallback para process.env):
const env = context.cloudflare?.env ?? process.env;
}

Client-side (componentes)

Variáveis que precisam chegar ao browser são montadas no loader e passadas via EnvProvider:

// No loader (_layout.tsx):
const clientEnv: ClientEnv = {
API_BASE_URL: env.API_BASE_URL,
ORIGIN_DOMAIN: env.ORIGIN_DOMAIN,
BRAND_LANGUAGE: env.BRAND_LANGUAGE,
BRAND_COUNTRY: env.BRAND_COUNTRY,
BRAND_CURRENCY: env.BRAND_CURRENCY,
// + campos opcionais quando definidos
};

// No componente:
import { useClientEnv } from '~/context/env';
const env = useClientEnv();
// env.API_BASE_URL

Cloudflare Workers (produção)

Em produção, as variáveis são definidas no dashboard do Cloudflare Workers ou via wrangler secret put. O context.cloudflare.env as disponibiliza automaticamente.

Gotchas

  • .dev.vars não suporta interpolação de variáveis
  • Vite expõe apenas variáveis com prefixo VITE_ ao client — mas nós usamos o padrão clientEnv via loader ao invés de VITE_*
  • O Wrangler lê .dev.vars automaticamente quando roda pnpm dev
  • BRAND_TIMEZONE é frequentemente confundido como client-side, mas é server-only
  • PLATFORM_CACHE_KV nao e uma variavel de texto — e um binding KV configurado no wrangler.toml gerado pelo front-ops
  • Contagem total: 5 obrigatorias + 8 server-only + 3 opcionais = 16 variaveis, sendo 8 na ClientEnv