Environment Variables
O template usa dois arquivos de env em dev local e variáveis do Cloudflare em produção.
Arquivos locais
| Arquivo | Lido por | Contexto |
|---|---|---|
.dev.vars | Wrangler (SSR) | Server-side (loaders/actions) |
.env | Vite | Client-side (build time) |
wrangler.toml | Wrangler | Cloudflare Workers config + bindings |
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":{...}}
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.tsoverrides/<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:
SMARTICO_SALT_KEYenv var da Cloudflare (secret)SMARTICO_SALT_KEYviaprocess.env(.dev.vars/ Node)smarticoHashConfig.saltKeydo config file (fallback — normalmente vazio)
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ável | Na ClientEnv? | Descrição |
|---|---|---|
CASSINO_MODE | Sim | Modo do cassino: legacy ou api_new. Quando ausente/inválido → default legacy. |
TURNSTILE_SITE_KEY | Sim | Site key pública do Turnstile (captcha de registro — quando habilitado via authConfig) |
RECAPTCHA_SITE_KEY | Sim | Site key pública do reCAPTCHA (alternativa ao Turnstile em algumas marcas) |
Removidas:
LEGACY_CASINO_ENABLED(substituída porCASSINO_MODE),GAMES_CACHE_TTL(cache agora é 100% controlado viaPLATFORM_CACHE_POLICY_JSONinjetado pelo front-ops), eCASSINO_FRONT_CUSTOM_BASE(removida junto com o modefront_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.varsnão suporta interpolação de variáveis- Vite expõe apenas variáveis com prefixo
VITE_ao client — mas nós usamos o padrãoclientEnvvia loader ao invés deVITE_* - O Wrangler lê
.dev.varsautomaticamente quando rodapnpm dev BRAND_TIMEZONEé frequentemente confundido como client-side, mas é server-onlyPLATFORM_CACHE_KVnao e uma variavel de texto — e um binding KV configurado nowrangler.tomlgerado pelofront-ops- Contagem total: 5 obrigatorias + 8 server-only + 3 opcionais = 16 variaveis, sendo 8 na
ClientEnv