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
| Destino | URL | Tipo | Comando |
|---|---|---|---|
| App | aiscouncil.net | CF Pages (estático) | scripts/deploy.sh pages |
| Staging | aiscouncil.net | CF Pages (estático) | scripts/deploy.sh pages-staging |
| API Worker | api.aiscouncil.net | CF Worker | scripts/deploy.sh worker |
| Auth Worker | auth.aiscouncil.net | CF Worker | scripts/deploy.sh worker-auth |
| App Store | store.aiscouncil.net | CF Pages (estático) | scripts/deploy.sh store |
| Tudo | Tudo acima | Todos | scripts/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
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
- Monte o aplicativo a partir do fonte:
./build.sh
- 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.htmlcomhtml-minifier-terser(~40% de redução de tamanho) - Implanta no Cloudflare Pages com
--branch=main - Limpa
_deploy/
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
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:
- Criar um novo cache com o novo nome
- Pré-cachear todos os assets listados
- Deletar todos os caches antigos na ativação
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
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ínio | Constante | Produção | Staging |
|---|---|---|---|
| App | AIS.DOMAIN | aiscouncil.net | aiscouncil.net |
| Marketing | AIS.WWW | www.aiscouncil.net | www.aiscouncil.net |
| API | API_BASE | https://api.aiscouncil.net/v1 | https://api.aiscouncil.net/v1 |
| Auth | AUTH_BASE | https://auth.aiscouncil.net/v1 | https://auth.aiscouncil.net/v1 |
| Docs | AIS.DOC_BASE | https://doc.aiscouncil.net | https://doc.aiscouncil.net |
| Store | AIS.STORE_URL | https://store.aiscouncil.net | https://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:
- Compile o app:
./build.sh - Sirva
index.htmlcom qualquer servidor de arquivos estáticos (ex:python3 -m http.server 8080) - Rode Workers localmente com Wrangler:
cd worker && npx wrangler dev
cd worker-auth && npx wrangler dev --port 8788
- 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();