Pular para o conteúdo principal

Implantação

O AISCouncil é implantado como arquivos estáticos no Cloudflare Pages com lógica de API rodando em Cloudflare Workers. Um script de deploy unificado gerencia todos os destinos.

Destinos de Implantação

DestinoURLTipoComando
Appaiscouncil.netCF Pages (estático)scripts/deploy.sh pages
Stagingaiscouncil.netCF Pages (estático)scripts/deploy.sh pages-staging
API Workerapi.aiscouncil.netCF Workerscripts/deploy.sh worker
Auth Workerauth.aiscouncil.netCF Workerscripts/deploy.sh worker-auth
App Storestore.aiscouncil.netCF Pages (estático)scripts/deploy.sh store
TudoTudo acimaTodosscripts/deploy.sh all

Variáveis de Ambiente

Exporte estas em ~/.bashrc (nunca as commite):

export CF_ACCOUNT_ID_AISCOUNCIL="seu-cloudflare-account-id"
export CF_PAGES_TOKEN_AISCOUNCIL="seu-pages-api-token"
export CF_WORKER_TOKEN_AISCOUNCIL="seu-worker-api-token"

Sobrescritas opcionais:

export CF_PAGES_PROJECT_AISCOUNCIL="aiscouncil"              # padrão
export CF_PAGES_PROJECT_AISCOUNCIL_STAGING="aiscouncil-staging" # padrão
aviso

Estes tokens concedem acesso de deploy à sua conta Cloudflare. Nunca os commite no repositório. O script de deploy encerrará com erro se variáveis necessárias estiverem faltando.

Implantação no Pages (Produção)

Passo a Passo

  1. Monte o aplicativo a partir do fonte:
./build.sh
  1. Implante em produção:
scripts/deploy.sh pages

Este comando:

  • Cria um diretório limpo _deploy/
  • Copia arquivos estáticos via rsync, excluindo artefatos de desenvolvimento
  • Minifica index.html com html-minifier-terser (~40% de redução de tamanho)
  • Implanta no Cloudflare Pages com --branch=main
  • Limpa _deploy/
informação

Deploys de produção sempre usam --branch=main. Isso é necessário para o CF Pages servir no domínio de produção (aiscouncil.net).

O Que É Implantado

O passo rsync exclui tudo que não é um asset voltado ao navegador:

Diretórios excluídos: src/, tools/, kernel/, serve/, worker/, worker-auth/, doc.aiscouncil.net/, node_modules/, .git/, .github/, .carl/, .claude/, modules/, scripts/, core-types/, bridge/, i18n/, dist/, build/

Tipos de arquivo excluídos: *.py, *.zig, *.zon, *.md, *.sh, *.css, .env*

Arquivos de config excluídos: package.json, package-lock.json, vitest.config.*, tsconfig.json, .cfignore, .gitignore

O que resta são os assets de produção: index.html, sw.js, ícones, manifest.webmanifest, arquivos JSON do registry/, sdk/, ads.json, sitemap.xml, e quaisquer diretórios de mini-programas ou apps.

Minificação

Deploys de produção passam index.html pelo html-minifier-terser com estas opções:

  • Colapsar whitespace
  • Remover comentários
  • Remover atributos redundantes
  • Colapsar atributos booleanos
  • Minificar CSS inline
  • Minificar JavaScript inline

A redução de tamanho típica é ~40% (ex: 980 KB para ~580 KB).

Implantação de Staging

Implante no ambiente de staging sem minificação:

scripts/deploy.sh pages-staging

O staging é servido de aiscouncil.net. O aplicativo auto-detecta seu domínio em tempo de execução e ajusta URLs de API, domínios de cookie e referências cross-origin conforme apropriado.

Promovendo Staging para Produção

Após validar no staging, promova o mesmo build para produção:

scripts/deploy.sh promote

Isso reimplanta o código atual para o projeto Pages de produção com minificação habilitada. O código do aplicativo é idêntico -- apenas o domínio muda.

Implantação de Worker

API Worker

scripts/deploy.sh worker

Isso executa npx wrangler deploy dentro do diretório worker/ usando o ID da conta e token Worker do seu ambiente.

Auth Worker

scripts/deploy.sh worker-auth

Mesmo processo para o diretório worker-auth/.

Secrets do Worker

Workers requerem secrets que são definidos separadamente de code deploys. Use wrangler secret put do diretório do worker:

cd worker
npx wrangler secret put JWT_SECRET
npx wrangler secret put STRIPE_SECRET_KEY
npx wrangler secret put STRIPE_WEBHOOK_SECRET
npx wrangler secret put WEBHOOK_PATH_SECRET
cd worker-auth
npx wrangler secret put JWT_SECRET
npx wrangler secret put GOOGLE_CLIENT_SECRET
npx wrangler secret put APPLE_CLIENT_SECRET
npx wrangler secret put GITHUB_CLIENT_SECRET
dica

Secrets persistem entre deploys. Você só precisa defini-los uma vez, ou quando rotacionar credenciais.

Configuração do Worker

Cada worker tem um wrangler.toml que define:

  • Nome e rotas do worker
  • Bindings de namespace KV
  • Referências de variáveis de ambiente
  • Configurações de compatibilidade

Cache do Service Worker

O Service Worker client-side (sw.js) usa um cache versionado:

const CACHE = "ais-v1.0.0";

Quando incrementar a versão do cache:

  • Mudanças que quebram o app shell (estrutura HTML, CSS crítico)
  • Mudanças em assets pré-cacheados (ícones, manifest)
  • Releases de versão principal

Incrementar a versão faz o Service Worker:

  1. Criar um novo cache com o novo nome
  2. Pré-cachear todos os assets listados
  3. Deletar todos os caches antigos na ativação
aviso

Esquecer de incrementar a versão do cache após mudanças que quebram fará com que usuários vejam conteúdo obsoleto até limparem manualmente o cache do navegador ou o Service Worker antigo expirar.

Implantar Tudo

Implante o app Pages, API worker e auth worker em sequência:

scripts/deploy.sh all

Verificação Pós-Deploy

Após implantar, verifique se o app está servindo corretamente:

# Verificar produção
curl -s https://aiscouncil.net/ | head -5

# Verificar health da API
curl -s https://api.aiscouncil.net/health

# Verificar health do auth
curl -s https://auth.aiscouncil.net/health
informação

O Cloudflare Pages invalida automaticamente seu cache CDN no deploy, mas a propagação pode levar 1-2 minutos globalmente. Se você ver conteúdo obsoleto, aguarde brevemente e tente novamente.

Arquitetura de Domínios

O aplicativo usa detecção de domínio em tempo de execução para suportar tanto produção quanto staging:

DomínioConstanteProduçãoStaging
AppAIS.DOMAINaiscouncil.netaiscouncil.net
MarketingAIS.WWWwww.aiscouncil.netwww.aiscouncil.net
APIAPI_BASEhttps://api.aiscouncil.net/v1https://api.aiscouncil.net/v1
AuthAUTH_BASEhttps://auth.aiscouncil.net/v1https://auth.aiscouncil.net/v1
DocsAIS.DOC_BASEhttps://doc.aiscouncil.nethttps://doc.aiscouncil.net
StoreAIS.STORE_URLhttps://store.aiscouncil.nethttps://store.aiscouncil.net

URLs base da API também podem ser sobrescritas via localStorage para desenvolvimento local:

localStorage.setItem("ais-api-base", "http://localhost:8787/v1");
localStorage.setItem("ais-auth-base", "http://localhost:8788/v1");

Desenvolvimento Local

Para desenvolvimento local sem deploy:

  1. Compile o app: ./build.sh
  2. Sirva index.html com qualquer servidor de arquivos estáticos (ex: python3 -m http.server 8080)
  3. Rode Workers localmente com Wrangler:
cd worker && npx wrangler dev
cd worker-auth && npx wrangler dev --port 8788
  1. Sobrescreva URLs base da API no console do navegador:
localStorage.setItem("ais-api-base", "http://localhost:8787/v1");
localStorage.setItem("ais-auth-base", "http://localhost:8788/v1");
location.reload();