1. Sumário

O Toolbox FRM é um conjunto de 4 ferramentas internas de produtividade: cruzamento de arquivos, normalização de dados, gerador de texto alternativo (alt text) e design instrucional, mais um painel de administração. O uso é exclusivo de colaboradores da FRM, autenticados via SSO corporativo (Microsoft Entra ID). O login em si é gerenciado pelo Amazon Cognito, que faz a ponte entre a aplicação e o SSO da FRM.

Este documento dá uma visão geral de como o ambiente funciona: a arquitetura, os serviços AWS usados e o que cada um faz, o fluxo de autenticação, como o frontend conversa com o backend, e onde procurar quando algo não funciona como esperado. A operação profunda da infraestrutura (deploy, provisionamento, políticas de acesso) é mantida pela CloudFaster, responsável técnica pelo ambiente.

ItemValor
URL de produçãohttps://toolbox.frm.org.br
URL de homologação (hmg)https://toolbox-hmg.frm.org.br
Idioma da interfacePortuguês (pt-BR)
AutenticaçãoSSO corporativo (Microsoft Entra ID) via Amazon Cognito

2. Evolução do projeto

O Toolbox nasceu como uma aplicação 100% estática: HTML, CSS e JavaScript, sem backend e sem login. As duas ferramentas de IA (gerador de alt text e design instrucional) chamavam a OpenAI diretamente do navegador, usando uma chave de API que o próprio usuário colava.

Hoje a arquitetura é full-stack na AWS. As principais mudanças:

MudançaPor quê
Backend serverlessTirar a chave de IA do navegador e trocar a OpenAI pelo Amazon Bedrock, que processa tudo do lado do servidor.
Login corporativo via Amazon CognitoFerramenta interna: acesso só via SSO, integrado ao Microsoft Entra ID, com permissões por grupo do Active Directory.
Hospedagem em nuvem (Amazon S3 + CloudFront)HTTPS, domínio próprio e alta disponibilidade.
Processamento assíncrono (Amazon SQS + AWS Lambda)Geração de IA leva minutos. Em vez de deixar o pedido travado esperando, o resultado chega depois, por notificação em tempo real.
Dois ambientes (hmg + prod)Toda mudança é homologada antes de ir para produção.
Não existe mais chave de IA no cliente. O app é auth-gated: todo acesso passa por login via SSO corporativo, e as chamadas de IA rodam do lado do servidor.

3. Arquitetura geral

O frontend é estático e fica na borda da rede, protegido pelo AWS WAF (firewall de aplicação). O backend é serverless: as chamadas de API chegam pelo Amazon API Gateway, são roteadas para funções sob demanda no AWS Lambda, e essas funções conversam com o Amazon Bedrock (IA), o Amazon DynamoDB (banco de dados) e o Amazon SQS (fila de processamento assíncrono). A identidade é cuidada pelo Amazon Cognito, integrado ao SSO corporativo da FRM.

flowchart TB subgraph Client["Navegador"] U[Usuário FRM] end subgraph Edge["Borda"] WAFCF[AWS WAF] CF[Amazon CloudFront] end subgraph Frontend["Frontend"] S3F[(Amazon S3 - site estatico)] end subgraph Identity["Identidade"] COG[Amazon Cognito] ENTRA[Microsoft Entra ID - SSO] end subgraph API["API"] REST[API Gateway REST] WS[API Gateway WebSocket] end subgraph Compute["AWS Lambda"] STARTERS[Funcoes de inicio] WORKERS[Funcoes de processamento] STATUS[Status / Admin] end subgraph Async["Fila"] SQS1[[Amazon SQS]] end subgraph Data["Dados"] DDB1[(Amazon DynamoDB)] S3U[(Amazon S3 - uploads)] end subgraph AI["IA"] BEDROCK[Amazon Bedrock] end U -->|HTTPS| WAFCF --> CF --> S3F U -->|login| COG --> ENTRA U -->|token| REST U -->|conexao| WS REST --> STARTERS STARTERS --> SQS1 STARTERS --> S3U SQS1 --> WORKERS WORKERS --> BEDROCK WORKERS --> DDB1 REST --> STATUS --> DDB1 WORKERS -.notifica.-> WS --> U

Clique no diagrama para ampliar.

Diagrama de arquitetura dos serviços AWS

Perspectiva dos serviços AWS:

Diagrama de arquitetura AWS do Toolbox FRM: navegador passa por WAF e CloudFront até o S3 do site; login via Cognito integrado ao Entra ID; chamadas de API via API Gateway REST e WebSocket chegam nas funções Lambda, que usam SQS, DynamoDB, S3 de uploads e Bedrock; IAM controla as permissões de todos os serviços.

Clique na imagem para ampliar.

4. Autenticação

O login usa o Amazon Cognito (Hosted UI), federado com o Microsoft Entra ID via SSO. O usuário nunca digita senha diretamente na aplicação: a autenticação acontece inteiramente no provedor corporativo. Depois do login, o Cognito recebe os grupos do Active Directory do usuário e usa isso para decidir quem tem acesso ao painel de administração.

O acesso ao painel de administração é validado do lado do servidor a cada chamada, não só na tela: mesmo que alguém tente acessar a URL do admin diretamente, o backend confere a permissão antes de responder.
sequenceDiagram participant B as Browser participant COG as Amazon Cognito participant ENTRA as SSO corporativo participant API as API Gateway B->>COG: Inicia login COG->>ENTRA: Redireciona pro SSO ENTRA->>ENTRA: Usuario autentica ENTRA->>COG: Confirma identidade e grupos COG-->>B: Retorna token de sessao B->>API: Chamada com token API->>COG: Valida token API-->>B: 200 ou 401/403

Clique no diagrama para ampliar.

5. Frontend

O frontend é estático: HTML, CSS e JavaScript, sem framework. Cada ferramenta é uma página independente. Os arquivos ficam hospedados no Amazon S3 (armazenamento de objetos privado, sem acesso direto pela internet) e são entregues pelo Amazon CloudFront (rede de distribuição de conteúdo) com HTTPS.

FerramentaPrecisa de loginUsa backend
Cruzamento de ArquivosSimNão (roda 100% no navegador)
Normalização de DadosSimNão (roda 100% no navegador)
Gerador de Texto AlternativoSimSim
Design InstrucionalSimSim
AdminSim, grupo restritoSim

6. Backend assíncrono

O backend combina dois padrões. Para upload de arquivo puro, o navegador envia direto para o Amazon S3, sem passar pelo backend. Para as operações de IA, que levam de dezenas de segundos a minutos, o sistema enfileira o pedido no Amazon SQS e devolve uma resposta imediata; uma função do AWS Lambda processa em segundo plano, e o navegador é avisado do resultado assim que fica pronto.

sequenceDiagram participant B as Browser participant L2 as Lambda de inicio participant Q as Amazon SQS participant W as Lambda de processamento participant BR as Amazon Bedrock participant DDB as Amazon DynamoDB B->>L2: Envia pedido L2->>Q: Enfileira tarefa L2-->>B: Retorna ID da tarefa Q->>W: Processa W->>BR: Chama IA BR-->>W: Resultado W->>DDB: Grava status concluido W-->>B: Notifica resultado

Clique no diagrama para ampliar.

Se uma tarefa falhar depois de algumas tentativas, ela vai para uma fila separada de mensagens não processadas, em vez de se perder. Isso permite investigar depois o que deu errado, sem que o pedido do usuário simplesmente desapareça.

Escolha do modelo de IA (Bedrock)

Cada ferramenta que usa IA deixa o usuário escolher, entre alguns modelos, qual deles vai gerar o resultado (velocidade x custo x qualidade). Essa escolha já é só uma decisão de tela: o backend aceita qualquer modelo permitido na conta AWS, sem precisar de mudança de código no lado do servidor. Isso foi organizado num arquivo único, compartilhado por todas as ferramentas — /js/bedrock-models.js — que lista os modelos disponíveis (nome, preço, se aceita imagem) e sabe desenhar o seletor na tela.

Integração futura — nova ferramenta que usa IA
Quando alguém do time criar uma ferramenta nova que chama o Bedrock, o seletor de modelo já vem pronto — basta carregar o arquivo compartilhado e escolher quais modelos mostrar:
<!-- index.html da ferramenta nova, logo apos config.js/auth.js -->
<script src="/js/bedrock-models.js"></script>

<!-- espaco vazio onde os botoes de modelo aparecem -->
<div class="toggle-group-grid" id="modelPicker" role="radiogroup" aria-label="Selecione o modelo de IA"></div>
// app.js da ferramenta nova

// escolhe quais modelos aparecem nessa ferramenta
const TOOL_MODEL_IDS = [
  'us.amazon.nova-lite-v1:0',
  'us.anthropic.claude-haiku-4-5-20251001-v1:0',
];
let selectedModel = TOOL_MODEL_IDS[0];

renderModelPicker(document.getElementById('modelPicker'), TOOL_MODEL_IDS, selectedModel);
wireModelPicker(document.getElementById('modelPicker'), modelId => { selectedModel = modelId; });

// manda junto no pedido pro backend -- o backend ja sabe usar
const token = await Auth.getValidToken();
fetch(API_CONFIG.restUrl + '/minha-ferramenta/start', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' },
  body: JSON.stringify({ modelId: selectedModel }),
});
Pra adicionar um modelo novo à lista (ex.: quando a AWS lançar um modelo mais recente), edita só o arquivo /js/bedrock-models.js — nenhuma outra parte do projeto precisa mudar, desde que o modelo já esteja liberado na conta AWS.

7. Recursos AWS explicados

Esta seção detalha cada peça da infraestrutura AWS usada no projeto e para que ela serve, em linguagem simples. A ideia é que qualquer pessoa do time, mesmo sem experiência prévia em AWS, consiga entender o que cada serviço faz aqui.

Armazenamento de arquivos (Amazon S3)

O Amazon S3 guarda arquivos na nuvem, como uma pasta compartilhada, mas com muito mais escala e sem servidor pra manter. O projeto usa três tipos de bucket (nome que a AWS dá a cada "pasta" no S3), um conjunto por ambiente:

BucketO que guarda
FrontendOs arquivos do site: HTML, CSS e JavaScript de cada ferramenta.
UploadsArquivos enviados pelos usuários: imagens, DOCX, PDF, separados por usuário e por tarefa.
LogsRegistros de acesso, usados só para auditoria.

Funções sob demanda (AWS Lambda)

O AWS Lambda executa código só quando alguém chama, sem precisar de um servidor ligado o tempo todo. Cada função é pequena e faz uma coisa específica.

O projeto tem 25 funções Lambda ao todo. As 12 funções da tabela abaixo existem em dois exemplares idênticos: uma cópia para produção e uma cópia para homologação (12 + 12 = 24), sempre com o mesmo código, cada uma lendo os dados só do seu próprio ambiente. A 25ª função é a que valida o login (entra-pretoken, seção 4): essa é única, compartilhada pelos dois ambientes, e não tem cópia.

A tabela abaixo detalha as 12 funções: qual ferramenta ou ação do site dispara cada uma, quando ela dispara, o tamanho aproximado do código (linhas), e o que ela faz.

FunçãoDisparada porDispara quandoLinhasO que faz
upload-presignedGerador de Alt Text, Design InstrucionalUsuário seleciona um arquivo para enviar89Confere tipo e tamanho do arquivo e gera um link temporário de upload direto pro Amazon S3.
alt-text-startGerador de Texto AlternativoBotão de gerar, logo após o upload da imagem81Recebe o pedido, valida, e só enfileira no Amazon SQS. Responde em segundos, sem esperar a IA processar.
alt-text-workerDispara sozinhaUma mensagem chega na fila de alt-text229O motor de verdade: manda a imagem pro Amazon Bedrock e grava o resultado.
di-design-systemDesign InstrucionalBotão "Gerar Design System", antes da estrutura do curso106Fase 0: gera as cores e os componentes visuais que servem de referência para todas as páginas do curso.
di-startDesign InstrucionalBotão de gerar estrutura, após upload do roteiro e do brandbook62Fase 1: enfileira a geração da estrutura do curso (tópicos, subtópicos, lista de recursos), ainda sem o conteúdo de cada página.
di-resource-startDesign InstrucionalBotão "Gerar conteúdo" em um recurso específico, um de cada vez51Fase 2: com a estrutura já pronta, enfileira a geração do conteúdo completo de um recurso (uma página, um quiz).
di-workerDispara sozinhaMensagem chega na fila de design instrucional, fase 1 ou fase 2737Processa as duas fases (estrutura e conteúdo de recurso) na mesma função: ela lê um campo "fase" na mensagem para saber o que fazer. A função mais complexa do projeto.
job-statusTodas as ferramentas com IAO frontend pergunta, a cada 3 segundos, se a tarefa terminou49Consulta o Amazon DynamoDB e devolve o status da tarefa.
ws-connectTodas as ferramentas com IAO navegador abre a conexão em tempo real, assim que a tela carrega57Só confere se o usuário está autenticado. Não grava nada.
ws-subscribeTodas as ferramentas com IADepois de iniciar uma tarefa, o navegador se inscreve para acompanhar aquele pedido80Grava o identificador da conexão dentro do próprio registro da tarefa, para saber para onde mandar o resultado.
ws-disconnectTodas as ferramentas com IAO navegador fecha a conexão (por exemplo, fecha a aba)3Não faz nada. Ver explicação abaixo.
adminPainel AdminUm administrador abre o painel de uso111Junta os dados de uso do sistema com login, papel e último acesso de cada usuário (tabela frm-toolbox-users). Só funciona para quem está no grupo de administradores.
Repare como a maioria das funções é pequena, entre 50 e 100 linhas. É o padrão do modelo serverless: cada função faz uma coisa só, e a complexidade de verdade (di-worker, com 737 linhas) fica concentrada onde o trabalho pesado realmente acontece.

Por que existem duas funções para uma coisa "só"

Três pares desta tabela parecem redundantes à primeira vista. Não são: cada divisão existe por um motivo específico de arquitetura.

alt-text-start e alt-text-worker. Por que não é uma função só? Porque elas têm velocidades muito diferentes. Enfileirar um pedido leva menos de 1 segundo; gerar o texto alternativo via IA pode levar minutos. Se fosse uma função só, o navegador ficaria esperando a resposta HTTP travada até a IA terminar, e o Amazon API Gateway tem um limite de 30 segundos por chamada REST: a chamada estouraria esse limite antes da IA terminar. Separar em duas resolve isso: alt-text-start responde na hora (o usuário não fica esperando), e alt-text-worker processa em segundo plano, sem prazo apertado.

di-start, di-resource-start e di-design-system. As três enfileiram trabalho, mas em momentos e escopos diferentes do fluxo do Design Instrucional: di-design-system roda primeiro e sozinha (não enfileira, responde na hora) para definir a identidade visual do curso. Depois, di-start roda uma vez por curso, para gerar só a estrutura (o esqueleto: tópicos e lista de recursos). Só depois disso, di-resource-start roda uma vez para cada recurso individual que o usuário decide gerar. Ou seja: não é a mesma operação feita duas vezes, é uma sequência de três fases com escopos diferentes (curso inteiro → estrutura → um recurso por vez), o que permite ao usuário revisar a estrutura antes de gastar tempo e custo de IA gerando o conteúdo completo de cada página.

ws-connect e ws-disconnect (e por que a segunda "não faz nada"). Toda ferramenta com IA abre uma conexão WebSocket assim que a tela carrega, para receber o aviso em tempo real quando a tarefa termina. Essa conexão passa por três funções, uma para cada momento do ciclo de vida. ws-connect roda quando o navegador abre a conexão, e só confere se o usuário está autenticado, sem gravar nada. ws-subscribe roda logo depois, quando o navegador diz "quero acompanhar essa tarefa específica": ela grava o identificador da conexão dentro do próprio registro da tarefa no Amazon DynamoDB, para saber para onde mandar o aviso quando o processamento terminar. ws-disconnect roda quando o navegador fecha a conexão, por exemplo ao fechar a aba, e essa função não faz nada.

Não faz nada porque não há nada para fazer. O identificador da conexão não vive numa tabela própria de "conexões ativas": vive dentro do registro da tarefa, gravado ali pela ws-subscribe, e esse registro já expira sozinho depois de alguns dias. Não existe uma segunda cópia da informação que precise ser apagada quando a conexão cai. Se mais tarde o sistema tentar avisar uma conexão que já fechou, a chamada falha de um jeito esperado, sem quebrar nada, e o código já sabe ignorar esse erro. O navegador também pergunta o status a cada 3 segundos por conta própria (polling), então mesmo se o aviso em tempo real falhar, o resultado chega de qualquer jeito. É uma escolha de arquitetura enxuta: menos uma tabela para manter, sem perder nada.

Fila de mensagens (Amazon SQS)

Uma fila guarda pedidos até que alguém tenha capacidade de processá-los, em vez de deixar o usuário esperando a resposta na hora.

FilaNome real (AWS, produção)O que guardaSe falhar
Fila de alt-textfrm-toolbox-alt-text-queuePedidos de geração de texto alternativoDepois de 3 tentativas, a mensagem vai para a fila de erros frm-toolbox-alt-text-dlq, pra investigar depois.
Fila de design instrucionalfrm-toolbox-di-queuePedidos de geração de estrutura de cursoMesma regra: 3 tentativas, depois vai para a fila de erros frm-toolbox-di-dlq.
A conta AWS tem 8 filas SQS ao todo, não 2. As 2 filas acima existem em quatro exemplares cada: fila principal e fila de erros (DLQ, Dead Letter Queue), uma cópia para produção e uma para homologação (2 filas × 2 tipos × 2 ambientes = 8). Em homologação, o nome de cada recurso ganha o sufixo -hmg, por exemplo, frm-toolbox-alt-text-queue-hmg.

Porta de entrada da API (Amazon API Gateway)

Toda chamada da aplicação passa pelo Amazon API Gateway antes de chegar numa função Lambda. Existem dois tipos: um REST, pra chamadas normais de pedido/resposta, e um WebSocket, pra manter uma conexão aberta e avisar o navegador em tempo real quando uma tarefa termina. Na conta AWS, cada tipo existe como uma API separada por ambiente, quatro no total:

TipoAmbienteNome real (AWS)
RESTProduçãofrm-toolbox-api
RESTHomologaçãofrm-toolbox-api-hmg
WebSocketProduçãofrm-toolbox-ws
WebSocketHomologaçãofrm-toolbox-ws-hmg

As rotas abaixo são idênticas nos dois ambientes, só muda a API que a chamada acessa:

Rota RESTO que faz
POST /upload/presigned-urlGera o link de upload direto pro S3.
POST /alt-text/startInicia geração de texto alternativo.
POST /design-instrucional/startInicia geração de estrutura do curso.
POST /design-instrucional/design-systemGera a identidade visual do curso.
POST /design-instrucional/resource-startInicia geração de um recurso específico do curso.
GET /job/{jobId}Consulta o status de uma tarefa.
GET /admin/usageRetorna dados de uso do sistema (só admin).

No lado WebSocket, três eventos cobrem o ciclo de vida da conexão: abrir ($connect), fechar ($disconnect) e acompanhar uma tarefa específica (subscribe).

Banco de dados (Amazon DynamoDB)

O DynamoDB é um banco de dados que responde rápido mesmo com muitos acessos ao mesmo tempo, sem precisar de um administrador de banco cuidando dele. É um banco gerenciado e serverless: ninguém do time precisa instalar, atualizar ou dimensionar um servidor de banco de dados, e o projeto paga só pelas leituras e gravações que realmente acontecem, não por um servidor ligado 24 horas por dia. Para o volume de dados deste projeto (status de tarefas, registros de uso), essa é a escolha mais econômica e com menos manutenção disponível na AWS.

TabelaNome real (AWS, produção)O que guarda
Tarefasfrm-toolbox-jobsStatus e resultado de cada tarefa em processamento (alt-text, design instrucional).
Usofrm-toolbox-usage-logsRegistro de quem usou o quê, quando, para alimentar o painel de administração.
Usuáriosfrm-toolbox-usersLogin, papel e último acesso de cada usuário, pra exibir no painel de administração. Única tabela sem cópia por ambiente — compartilhada entre hmg e prod.

Em homologação, as tabelas de Tarefas e Uso têm o sufixo -hmg (frm-toolbox-jobs-hmg, frm-toolbox-usage-logs-hmg) — a de Usuários é a mesma nos dois ambientes. São cinco tabelas reais no total: duas por ambiente mais uma compartilhada.

Inteligência artificial (Amazon Bedrock)

O Amazon Bedrock habilita a aplicação a usar diversos modelos de IA generativa de diferentes fornecedores por trás de uma única interface, sem precisar integrar com cada fornecedor separadamente. Hoje a conta AWS do projeto tem 85 modelos catalogados no Bedrock, dos quais 77 estão ativos e disponíveis para uso. Desse catálogo inteiro, o Toolbox está de fato integrado a 8 modelos, das famílias Claude (Anthropic), Nova (Amazon), Mistral, Moonshot AI (Kimi) e GPT-OSS (OpenAI, rodando no Bedrock). O usuário escolhe o modelo na própria tela, dependendo do quanto de qualidade e velocidade precisa para aquela tarefa.

8. Ambientes (hmg / prod)

Existem dois ambientes completos, hmg (homologação) e prod (produção), rodando lado a lado. Toda mudança é testada em hmg antes de chegar em prod. É assim que o time garante que uma alteração não quebra o que já está no ar. O que é compartilhado entre os dois ambientes é o Amazon Cognito (login) e o AWS WAF (proteção de borda); todo o resto (Amazon S3, Amazon DynamoDB, funções Lambda) existe em cópias separadas por ambiente.

flowchart LR subgraph Shared["COMPARTILHADO"] COG2[Amazon Cognito] WAF2[AWS WAF] end subgraph Prod["PROD - toolbox.frm.org.br"] P1[S3 + CloudFront prod] P4[Lambdas prod] P5[DynamoDB prod] end subgraph Hmg["HMG - toolbox-hmg.frm.org.br"] H1[S3 + CloudFront hmg] H4[Lambdas hmg] H5[DynamoDB hmg] end Shared --- Prod Shared --- Hmg

Clique no diagrama para ampliar.

9. Como contribuir: git e deploy

Esta seção é o passo a passo prático para quem vai desenvolver no projeto: como buscar o código, salvar uma alteração, publicar, e como uma mudança chega em homologação e depois em produção. Não é preciso decorar nada. É só voltar aqui sempre que precisar.

As três branches e o papel de cada uma

BranchPara que serveO que acontece quando alguém publica nela
mainProdução. É o que está no ar em toolbox.frm.org.br.Dispara o deploy automático de produção.
hmgHomologação. Cópia completa do sistema para testar antes de ir ao ar.Dispara o deploy automático de homologação (toolbox-hmg.frm.org.br).
Branch da tarefaUma branch nova para cada mudança, criada a partir da hmg atualizada, com prefixo feat/, fix/, chore/ ou docs/ + descrição curta (ex.: fix/ajusta-limite-upload).Nada — mesmo com push pro GitHub, não dispara deploy nenhum.

O caminho é sempre o mesmo, sem atalho: branch da tarefa → Pull Request → hmg → Pull Request → main. Ninguém publica direto em hmg ou main: as duas são protegidas e só aceitam mudanças via Pull Request (mais detalhe adiante).

Exemplos práticos: o que cada uma faz

A diferença entre as três é o que acontece quando o código chega nelas. Só uma coisa muda de um lugar para o outro: onde o código está — o próprio código é sempre o mesmo.

Branch da tarefa — existe no seu computador (pode ter uma cópia de backup no GitHub, mas isso sozinho não dispara nada). É criada uma nova a partir da hmg atualizada para cada mudança, com prefixo (feat/, fix/, chore/, docs/) + descrição curta.
git checkout hmg
git pull
git checkout -b fix/ajusta-limite-upload
# edita os arquivos, testa localmente...
git add .
git commit -m "ajusta limite de upload"
Branch hmg — ambiente de homologação. Tem a esteira de CI/CD já configurada: todo Pull Request mergeado nela dispara sozinho o deploy para toolbox-hmg.frm.org.br, em poucos minutos, sem nenhum passo manual. É onde a mudança é validada antes de ir para os usuários de verdade.
git push -u origin fix/ajusta-limite-upload
gh pr create --base hmg --head fix/ajusta-limite-upload \
  --title "Ajusta limite de upload" --body "O que mudou e por quê"
gh pr merge --merge
Branch main — produção. Também tem a esteira configurada: todo Pull Request mergeado nela dispara sozinho o deploy para toolbox.frm.org.br, o site que os usuários finais usam. Só chega mudança aqui depois de já ter passado — e sido validada — em hmg.
gh pr create --base main --head hmg \
  --title "Promover hmg para produção" \
  --body "Mudanças validadas em hmg, prontas para ir ao ar"
gh pr merge --merge

Passo a passo — de uma pasta vazia até o ar

  1. Trazer o código para a máquina (só na primeira vez)

    Com uma pasta vazia, o comando abaixo baixa o repositório inteiro:

    git clone git@github.com:Fundacao-Roberto-Marinho/toolbox.git
    cd toolbox
  2. Criar a branch da tarefa (uma nova a cada mudança)

    A partir da hmg atualizada, nunca da main diretamente. É uma branch nova para cada tarefa, com prefixo feat/, fix/, chore/ ou docs/ + descrição curta em kebab-case:

    git checkout hmg
    git pull
    git checkout -b fix/ajusta-limite-upload
  3. Testar localmente, antes de publicar qualquer coisa

    Nada aqui toca hmg ou o GitHub, é só a sua máquina. Ferramentas sem chamada de IA (cruzamento de arquivos, normalização de dados) abrem direto pelo navegador: dois cliques no index.html da pasta da ferramenta já basta. Ferramentas com chamada de IA (gerador de alt text, design instrucional) precisam de um servidor local, por causa de CORS:

    python3 -m http.server 8080
    # depois abrir http://localhost:8080 no navegador

    Pode testar e ajustar quantas vezes quiser aqui. Só entra na história do time no próximo passo, o commit.

  4. Salvar uma alteração: o commit

    Depois de editar um arquivo, o commit salva essa alteração no histórico local do git. Ainda só na sua máquina, ninguém mais vê isso ainda:

    git add caminho/do/arquivo.js
    git commit -m "descreve o que mudou e por quê"
  5. Publicar a branch: o push

    O push é o que envia os commits da sua máquina para o GitHub. Antes do push, a mudança existe só localmente; depois, o time inteiro consegue ver a branch. Só precisa de -u na primeira vez; depois é só git push:

    git push -u origin fix/ajusta-limite-upload
  6. Abrir o Pull Request (PR)

    No GitHub, abrir um Pull Request da sua branch (a branch da tarefa) contra a base hmg. O PR dispara automaticamente uma checagem de qualidade (sintaxe, testes), sem tocar em nada na AWS ainda.

    gh pr create --base hmg --head fix/ajusta-limite-upload \
      --title "Título curto da mudança" \
      --body "O que mudou e por quê"
  7. Revisar e mergear em hmg = deploy automático de homologação

    Hoje não existe uma segunda pessoa aprovando por padrão: quem abriu o PR pode revisar e mergear direto. A responsabilidade de conferir antes de ir pro ar é de quem faz o merge, então vale a pena dar uma última olhada no diff e no resultado do CI antes de confirmar.

    gh pr diff                 # ve o que vai entrar
    gh pr checks                # confere se o ci.yml passou
    gh pr merge --merge

    O merge dispara automaticamente o deploy para o ambiente de homologação. Nenhum passo manual adicional. Em poucos minutos a mudança está em toolbox-hmg.frm.org.br, pronta para ser validada.

  8. Promover para produção

    Depois de validado em hmg, abre-se um segundo Pull Request, agora de hmg contra main. Mesmo fluxo: revisa e mergeia. Ao mergear, o deploy de produção dispara automaticamente, e a mudança vai para toolbox.frm.org.br.

    gh pr create --base main --head hmg \
      --title "Promover hmg para produção" \
      --body "Mudanças validadas em hmg, prontas para ir ao ar"
    gh pr merge --merge
Antes de mergear, revise com atenção. Hoje não tem um segundo par de olhos obrigatório entre o seu Pull Request e o deploy: quem abre também pode mergear. Confira o diff e o resultado do CI antes de confirmar, tanto para hmg quanto para main. Se outra pessoa do time quiser revisar antes, ela pode aprovar formalmente com gh pr review <numero-do-pr> --approve --body "Confere, pode seguir", mas isso é opcional, não é exigido pra mergear. Se a esteira falhar depois do merge, procure o time de suporte.
Commit não é o mesmo que push. Commit salva a alteração no histórico local do git, na sua máquina. Push envia esses commits para o GitHub, onde o time e o Pull Request conseguem ver. Dá para fazer vários commits antes de um único push.

O que protege main e hmg

As duas branches têm as mesmas regras de proteção:

  • Ninguém publica direto nelas, só via Pull Request.
  • Não é permitido apagar essas branches nem reescrever o histórico delas.
flowchart LR L["branch da tarefa (nova a cada mudanca)"] -->|Pull Request| H["hmg"] H -->|deploy automatico| HD["toolbox-hmg.frm.org.br"] H -->|Pull Request| M["main"] M -->|deploy automatico| MD["toolbox.frm.org.br"]

Clique no diagrama para ampliar.

10. Suporte e primeiros passos

Quando algo não funciona como esperado, o primeiro passo é isolar onde está o problema:

SintomaO que checar primeiro
Login não funciona / redireciona erradoConfirmar que o acesso é sempre pela URL oficial (HTTPS), nunca abrindo o arquivo local. A sessão expira depois de um tempo. Recarregar a página costuma resolver.
Ferramenta trava no "carregando"Verificar se a tarefa realmente foi enviada (normalmente aparece um identificador de acompanhamento). Se ficar travado por muito tempo, é sinal de escalar para a CloudFaster.
Erro ao enviar arquivoConfirmar tipo e tamanho do arquivo (a maioria das ferramentas tem limite de 50MB e tipos aceitos específicos, indicados na própria tela).
Card do Painel Admin não aparece na homeComportamento esperado para quem não está no grupo de administradores do Active Directory, não é bug. O card fica escondido por padrão e só aparece depois do login, se o usuário for admin. Ele nunca aparece e depois nega: para quem não é admin, o card simplesmente não existe na tela.

11. Glossário

Termos gerais

TermoDefinição no contexto deste projeto
SSOSingle Sign-On: login único corporativo. O usuário entra com a mesma conta que já usa nos outros sistemas da FRM.
BackendA parte do sistema que roda em servidores (não no navegador do usuário), responsável por processar dados e chamar a IA.
ServerlessModelo de infraestrutura em que não existe um servidor fixo rodando o tempo todo. O código só é executado quando alguém faz uma chamada.
Processamento assíncronoQuando o pedido não espera a resposta na hora. O sistema avisa depois que terminar, em vez de deixar a tela travada esperando.
Ambiente de homologação (hmg)Uma cópia completa do sistema usada para testar mudanças antes delas chegarem em produção.
CommitAção do git que salva uma alteração no histórico local, na máquina do dev. Ainda não está no GitHub.
PushAção do git que envia commits salvos localmente para o GitHub, tornando-os visíveis ao time.
Pull Request (PR)Pedido para trazer as mudanças de uma branch para outra (ex.: da branch da tarefa para hmg). Passa por revisão antes do merge.
MergeAção que aplica as mudanças de um Pull Request na branch de destino. Em hmg e main, o merge dispara o deploy automático.
Branch protegidaBranch que só aceita mudanças via Pull Request, não aceita publicação direta. main e hmg são protegidas.

Serviços AWS usados neste projeto

ServiçoO que éUso neste projeto
Amazon S3Armazenamento de arquivos na nuvem.Guarda o site estático e os arquivos enviados pelos usuários.
Amazon CloudFrontRede de distribuição de conteúdo (CDN).Entrega o site com HTTPS e baixa latência, sem expor o S3 diretamente.
AWS WAFFirewall de aplicação web.Filtra tráfego malicioso antes de ele chegar na aplicação.
Amazon CognitoServiço de login e gestão de identidade.Gerencia o login, integrado ao SSO corporativo (Microsoft Entra ID).
Amazon API GatewayPorta de entrada das chamadas de API.Recebe as chamadas REST e mantém as conexões em tempo real (WebSocket).
AWS LambdaExecução de código sob demanda, sem servidor fixo.Roda toda a lógica de backend, uma função por tarefa.
Amazon SQSFila de mensagens.Guarda os pedidos de IA até uma função Lambda processar cada um.
Amazon DynamoDBBanco de dados que escala automaticamente.Guarda o status das tarefas e os dados de uso do sistema.
Amazon BedrockServiço de IA generativa.Gera o texto alternativo e o conteúdo pedagógico, com 8 modelos integrados (Claude, Nova, Mistral, Moonshot AI, GPT-OSS).
AWS Certificate Manager (ACM)Emissão e renovação automática de certificados HTTPS.Gera o certificado usado no Amazon CloudFront, para os domínios do projeto responderem em HTTPS.
AWS IAMGestão de identidade e permissões dentro da conta AWS.Define as policies (permissões) que cada serviço pode usar: o que cada função Lambda pode acessar no Amazon SQS, no Amazon DynamoDB e no Amazon Bedrock, por exemplo.

12. Prompts para Claude Code

Quem não tem acesso à conta AWS consegue fazer todo o ciclo de contribuição — do commit até conferir se a mudança já está no ar — usando o Claude Code CLI na própria máquina, sem precisar decorar comandos de git ou gh. O Claude Code já lê sozinho o CLAUDE.md deste repositório (não precisa colar nada dele no prompt) e por isso já segue as regras do projeto: cria a branch da tarefa com o prefixo certo, sempre pergunta antes de mergear, e trata "promover para produção" como uma ação separada que pede confirmação extra. Basta colar o prompt e responder as perguntas de confirmação quando o Claude Code fizer — mas essas perguntas não substituem uma segunda pessoa revisando: é você mesmo quem aprova o próprio merge, então vale conferir a esteira antes de confirmar (os passos 6 e 7 abaixo já cobrem isso, nessa ordem).

1. Ver o que já mudou antes de começar

Confere o status do meu repositório: em que branch eu estou, o que já mudou e se tem alguma alteração ainda não commitada.

2. Criar a branch da tarefa

Crie uma branch nova pra eu trabalhar nesta mudança, a partir da hmg atualizada: [descreva em uma frase o que você vai mudar].

3. Revisar as mudanças antes de commitar

Antes de eu commitar, me mostra um resumo do que mudou nos arquivos.

4. Fazer o commit

Faça o commit só das alterações relacionadas a esta tarefa — me mostra antes quais arquivos vai incluir — com uma mensagem que explique por que eu mudei isso, seguindo o padrão de commit deste projeto.

5. Publicar a branch e abrir o Pull Request pra hmg

Publique minha branch no GitHub e abra um Pull Request dela contra a hmg.

6. Checar se a esteira rodou e passou em hmg

Confirma se a esteira do GitHub Actions já rodou pro meu Pull Request e se passou tudo certo.

7. Mergear o Pull Request em hmg

Pode mergear esse Pull Request em hmg?

O Claude Code sempre pergunta antes de executar o merge, mesmo que o CI esteja verde — e sempre pergunta também se quem roda o merge é ele mesmo ou se é você, manualmente pelo GitHub. Responda as duas perguntas para o merge acontecer. Se a esteira do passo 6 não tiver passado, não confirme — investiga o erro primeiro.

8. Promover hmg para produção

Quero levar pra produção o que já validamos em hmg.

Essa é uma ação separada e mais sensível: o Claude Code sempre confirma com você antes mesmo de abrir o Pull Request pra main, e confirma de novo antes de mergear — as mesmas duas perguntas do passo anterior, repetidas para produção. Importante: esse Pull Request leva pra produção tudo que estiver em hmg no momento, não só a sua mudança — se mais alguém mergeou algo em hmg nesse meio tempo, vai junto. Se não tiver certeza do que está diferente entre hmg e main, peça pro Claude Code listar antes de confirmar.

9. Checar se a esteira rodou e passou em main, e se já está em produção

Confirma se a esteira do GitHub Actions rodou e passou pro último merge em main, e se a mudança já está valendo em produção.
Como quem não tem acesso à conta AWS não consegue conferir nada pelo console, a fonte de verdade pra "o deploy deu certo" é o resultado da esteira do GitHub Actions (via gh), não o console AWS. Se a esteira falhar, o passo seguinte é procurar o time de suporte. Abrir a URL do ambiente direto no navegador (toolbox-hmg.frm.org.br ou toolbox.frm.org.br) também é uma forma válida de conferir que a mudança está no ar, sem precisar de AWS.