Skip to content

Documentação 2023

gloriateodoro edited this page May 30, 2023 · 2 revisions

Bonde

Olá! Esta documentação é destinada a novas(os) desenvolvedoras(es) do Nossas ou pessoas que queiram contribuir com a plataforma. O código-fonte utilizado está presente nesse repositório ou carregado a partir do mesmo. Está dividido nos seguintes serviços: apis, clients, clients/libs, manual, infra, workers, listeners, cronjobs e webhooks.

Requerimentos

A linguagem de programação utilizada é o Javascript e você precisará instalar o NodeJS e, para configuração da infraestrutura, o Docker . Por isso, é necessário fazer o setup inicial:

NodeJS - curl -o- <https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.0/install.sh> | bash
Docker - curl <https://get.docker.com> | sh

A fim de facilitar o entendimento a respeito do código-fonte necessário para o funcionamento do BONDE, unificamos todos os repositórios utilizados em apenas um através do git submodule.

Devido a criação de diferentes aplicações web e a necessidade de compartilhar informações sobre a sessão de um usuário, adotamoss uma estratégia através do localstorage do navegador.

Antes de começar

Clone o reposit incluindo --recursive para que os submodules também sejam baixados, assim:

git clone --recursive [email protected]:nossas/bonde-clients.git

Se já fez o clone e quer ter certeza que todos os submodules estão atualizados, execute dentro do diretório do repositório clonado:

git submodule init
git submodule update

Para utilizar as configurações padrões de compartilhamento de sessão, são necessários alguns mapeamentos de urls.

No ambiente de desenvolvimento, vamos adotar o endereço de url bonde.devel

Recomendamos adicionar os seguintes alias de url e ip no seu /etc/hosts:

`127.0.0.1 admin-canary.bonde.devel app.bonde.devel redes.bonde.devel accounts.bonde.devel traefik.bonde.devel s3.bonde.devel smtp.bonde.devel pgadmin.bonde.devel kibana.bonde.devel api-rest.bonde.devel api-graphql-deprecated.bonde.devel api-graphql.bonde.devel api-payments.bonde.devel api-domains.bonde.devel api-activists.bonde.devel api-redes.bonde.devel api-accounts.bonde.devel api-notifications.bonde.devel teste-de-widgets.bonde.devel api-v2.bonde.devel`

Começando

São duas as frentes de configuração: Infraestrutura e Clients.

A infraestrutura é configurada ao rodar os comandos a seguir.

cd infra
make begin

Muitos gigabytes serão baixados, e alguns exijirão um elevado consumo de processador.

Após a execução do comando com sucesso, chegou a vez dos clients. Será necessário instalar as dependências dos clients:

cd ../clients
pnpm i
pnpm m run dev

E depois é só subir:

pnpm m run dev

Você também pode subir apenas o projeto do seu interesse. Por exemplo: se quiser subir apenas o canary-client e o accounts-client (pra conseguir fazer login), é só filtrar esses dois pacotes no comando:

pnpm --filter admin-canary --filter accounts-client m run dev

Arquitetura

Em modo de desenvolvimento, as aplicações são acessadas em 3 camadas de rede. O nível mais alto é através das requisições http que trafegam pelo traefik utilizando imagens pré-fabricadas. O segundo nível, é através das portas locais de desenvolvimento, alterações são refletidas em tempo de execução. E no terceiro nível, através das bibliotecas, reconstruídas em tempo de execução.

Abaixo uma descrição de cada repositório relacionado no git submodule:

O apis/api-graphql, é responsável pelas customizações da api graphql, a lógica está agrupada por domínio. Em geral é servidores web expressjs, criados a partir de um boilerplate mínimo, com algumas funcionalidades pré-configuradas como log, monitor e gerenciamento de processos. Utilizamos o Hasura para prover a api graphql padrão.

O apis/api-graphql-deprecated, primeira versão da api de acesso usando o padrão Graphql utilizando postgraphile.

O apis/api-rest, primeira versão da api de acesso aos dados, ainda utilizando o padrão REST, escrita em Ruby on Rails.

O clients/packages, é responsável pelas páginas web do tipo "Single Page Application", criadas a partir do create-react-app.

O clients/packages/storage, é responsável por gerenciar as permissões de compartilhamento de sessão entre os clientes, é um servidor web com html estático, utilizamos o cross storage.

O clients/libs, é destinado as bibliotecas mantidas e publicadas no npmjs.com.

O clients/deprecated/admin, é destinado ao admin antigo ainda utilizado para edição de mobilizações.

O clients/webpage, é destinado a versão pública das páginas renderizadas com SSR, utilizamos o Next.JS.

O cronjobs/payments, é responsável por sincronizar as informações da integração de pagamento com o pagarme.

O infra, é destinado as configurações dos serviços utilizados como dependência dos serviços construídos, como load balance, banco de dados, etc.

O listeners/experiments, é responsável por armazenar código utilizados em experimentos.

O manual, é destinado ao blog de atualizações e documentação pública das tecnologias desenvolvidas.

O webhooks/accounts é responsável pelo gerenciamento da sessão, login e convite de usuários.

O webhooks/chatbot é responsável pela experiência em chatbot chamada BETA e pelo módulo de chatbot.

O webhooks/mapa-do-acolhimento é destinado a todo processo executado no servidor referente ao projeto, com sincronização de informações das integrações do projeto com o zendesk e o mautic, além do match e do georeferenciamento.

O webhooks/phone é destinado a integração entre a widget de pressão por telefone e o twillio quem faz de fato a ligação entre as partes envolvidas.

O webhooks/redes é destinado a sincronização dos dados da widget de formulário para o módulo de redes e o geo referenciamento.

O webhooks/redirect é destinado ao redirecionamento de algumas páginas de acordo com um arquivo csv presente no repositório.

O workers/documents, é destinado a sincronização dos dados do banco de dados relacional(postgres) para o de eventos(elasticsearch).

O workers/migrations, é destinado ao

O dados, é destinado a scripts em python criados para análises específicas e profundas.

Ao todo são mais de 20 pacotes de código-fonte com propósitos diferentes. Abaixo um quadro para exemplificar o conteúdo dos repositórios:

    3299 text files.
    2961 unique files.
     540 files ignored.

--------------------------------------------------------------------------------
Language                      files          blank        comment           code
--------------------------------------------------------------------------------
YAML                             68            502            923          88869
TypeScript                     1127           6232           2691          56047
JSON                            136             24              0          47700
Go                              141           6868           6872          37481
Ruby                            607           3460            544          26099
JavaScript                      243           2027           3675          11059
SQL                             181           3463           2771           8089
HTML                             18           2907            300           7118
Markdown                        129           2751              0           6380
SVG                              10             15              2           2850
CSS                              33            154            113           1574
Sass                             20            172              4           1150
JSX                              23            103             43           1148
Protocol Buffers                  3             83             94            457
Pug                               5             30              0            416
GraphQL                           8             56              0            301
ERB                              10              8              6            214
Dockerfile                       22            104             27            163
Bourne Shell                      5             39             36            121
make                              3             29             62            115
HCL                               2              9              0             52
TOML                              4              8             19             29
Bourne Again Shell                2              6              2             15
--------------------------------------------------------------------------------
SUM:                           2800          29050          18184         297447
--------------------------------------------------------------------------------

Branches

Por utilizarmos os submodules do git, recomendamos começar as modificações criando um branch feature/ ou hotfix/ no repositório mãe(nossas/bonde).

Ao fazer a edição de algum arquivo em algum repositório registrado no submodule do git, vai ficar aparente como mostrado abaixo, ao verificar o status do repositório:

	modified:   apis/api-graphql (new commits, modified content)
	modified:   apis/api-graphql-deprecated (new commits)
	modified:   infra (modified content)
	modified:   manual (modified content, untracked content)
	modified:   workers/documents/src/certs.ts

É será necessário fazer o commit no repositório mãe da referência que deve ser usada como mais atual do repositório filho, já com as alterações.

É recomendado seguir o mesmo nome de branch em todos os repositórios que precisarem de alterações.

Por último, abra um Pull Request em todo repositório alterado e na descrição do PR no repositório mãe, adicione os links para aprovação de todas as modificações.

Build, Deploy e Release

Todos os repositórios possuem uma configuração(skaffold.yaml) na raiz, responsável por fazer o build, deploy e release no kubernetes. A configuração deve estar no diretório correto(k8s/).

Além disso, existe uma configuração(.drone.yml) para automatizar a execução de testes(ci) e de deploy(cd) descritos na configuração do skaffold, também dividido por repositório.

Clientes

Você irá encontrar o accounts, admin, admin-canary, redes e cross-storage.

Veja mais clicando aqui.

Infra-estrutura (Bonde-install)

Todas as configurações necessárias para carregar no cluster kubernetes o Load Balance, o Banco de dados e o armazenamento de arquivos, etc É utilizado o Helm, gerenciador de pacotes de configuração kubernetes para alguns serviços comuns.

Veja mais clicando aqui.

Bibliotecas

O design system(components) utilizado pelos clientes; funções compartilhadas(core-tools) pelos clientes e servidores; interface para desenhar diagramas customizáveis(diagram); e o editor de texto rico destinado a potencializar a edição de páginas(editor).

Veja mais clicando aqui.

Servidores

APIs: REST, Graphql e Graphql Deprecated;

Os monorepos: chatbot, experiments, mapa do acolhimento, redes, webhooks;

E ainda: migrations, payments, phone, redirect, webpage.

Veja mais clicando aqui.