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.comCF Pages (estático)scripts/deploy.sh pages
Stagingaiscouncil.netCF Pages (estático)scripts/deploy.sh pages-staging
API Workerapi.aiscouncil.comCF Workerscripts/deploy.sh worker
Auth Workerauth.aiscouncil.comCF Workerscripts/deploy.sh worker-auth
App Storestore.aiscouncil.comCF 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.com).

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.com/, 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.com/ | head -5

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

# Verificar health do auth
curl -s https://auth.aiscouncil.com/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.comaiscouncil.net
MarketingAIS.WWWwww.aiscouncil.comwww.aiscouncil.net
APIAPI_BASEhttps://api.aiscouncil.com/v1https://api.aiscouncil.net/v1
AuthAUTH_BASEhttps://auth.aiscouncil.com/v1https://auth.aiscouncil.net/v1
DocsAIS.DOC_BASEhttps://doc.aiscouncil.comhttps://doc.aiscouncil.net
StoreAIS.STORE_URLhttps://store.aiscouncil.comhttps://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();