> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arbitragem-crypto.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# Development

> Aprenda como configurar e rodar o projeto localmente

<Info>
  Este guia explica como configurar e rodar o backend e o front-end do **Crypto Arbitrage Service** localmente.
</Info>

***

## 📹 Tutorial em Vídeo

Para uma explicação visual e passo a passo do processo de instalação e configuração, assista ao tutorial em vídeo:

[![Tutorial de Instalação](https://img.youtube.com/vi/woSeYQYVF98/0.jpg)](https://youtu.be/woSeYQYVF98)

[Assistir tutorial no YouTube](https://youtu.be/woSeYQYVF98)

***

## 🪟 Instalação no Windows

Para usuários do Windows, recomendamos usar o **WSL 2** (Windows Subsystem for Linux) para executar o projeto. O WSL 2 permite rodar um ambiente Linux completo dentro do Windows, oferecendo melhor desempenho e compatibilidade com as ferramentas necessárias para o projeto.

### Requisitos

* **Windows 10** versão 2004 ou superior (Build 19041+) ou **Windows 11**
* Máquina compatível com virtualização (geralmente já habilitada)
* Pelo menos 4GB de RAM (recomendado 8GB ou mais)

### Passos básicos

1. **Instalar o WSL 2**
   * Abra o PowerShell ou Terminal como administrador
   * Execute: `wsl --install`
   * Isso instalará o WSL 2 e o Ubuntu por padrão
   * Reinicie o computador quando solicitado

2. **Configurar o WSL 2**
   * Após reiniciar, abra o Ubuntu (disponível no menu Iniciar)
   * Crie um usuário e senha quando solicitado
   * Atualize o WSL para a versão mais recente: `wsl --update`
   * Defina o WSL 2 como padrão: `wsl --set-default-version 2`

3. **Instalar o Docker**
   * Você pode usar o **Docker Desktop** com integração WSL 2 (mais fácil) ou o **Docker Engine** diretamente no WSL 2 (mais leve)
   * O Docker Desktop pode ser baixado em: [https://www.docker.com/products/docker-desktop/](https://www.docker.com/products/docker-desktop/)
   * Após instalar, ative a integração com sua distribuição Linux no Docker Desktop

4. **Executar o script de instalação**
   * Acesse o projeto dentro do WSL 2 (não use `/mnt/c`, prefira `/home/seu_usuario`)
   * Execute o script `setup.sh` conforme descrito na seção [Instalação Automatizada (Linux)](#-instalação-automatizada-linux)

<Info>
  Para melhor performance, mantenha seus projetos dentro do sistema de arquivos do Linux (`/home/seu_usuario`) e não no sistema de arquivos do Windows (`/mnt/c`).
</Info>

### Recursos adicionais

Para um guia completo e detalhado sobre WSL 2 e Docker no Windows, consulte o repositório oficial:

**[Guia WSL2 + Docker Quickstart](https://github.com/codeedu/wsl2-docker-quickstart)**

Este guia inclui informações sobre:

* Instalação detalhada do WSL 2
* Configuração do Docker Desktop e Docker Engine
* Otimizações de performance
* Dicas e truques para desenvolvimento
* Solução de problemas comuns

***

## 🚀 Instalação Automatizada (Linux)

Para facilitar a instalação em máquinas Linux, o projeto inclui um script de setup automatizado que executa todos os passos necessários para configurar o ambiente de desenvolvimento.

### Como executar o script:

1. Certifique-se de que você tem permissões de execução no script:
   ```bash theme={null}
   chmod +x setup.sh
   ```

2. Execute o script na raiz do projeto:
   ```bash theme={null}
   ./setup.sh
   ```

<Warning>
  O script pode solicitar permissões `sudo` para instalar dependências do sistema. Não é recomendado executar o script como usuário root.
</Warning>

### O que o script faz:

O script `setup.sh` automatiza os seguintes passos:

1. **Instalação do Docker e Docker Compose**
   * Verifica se o Docker está instalado
   * Instala o Docker caso não esteja presente
   * Verifica e configura o Docker Compose

2. **Inicialização dos serviços Docker**
   * Inicia os containers do MongoDB e RabbitMQ via Docker Compose
   * Aguarda os serviços estarem prontos para conexão
   * Verifica se os serviços estão respondendo nas portas corretas

3. **Configuração do arquivo .env**
   * Cria o arquivo `.env` na raiz do projeto baseado em `.env.example`
   * Configura automaticamente as URIs do MongoDB e RabbitMQ para localhost
   * Faz backup do arquivo `.env` existente caso já exista

4. **Instalação do Go (Golang)**
   * Verifica se o Go está instalado
   * Instala o Go versão 1.23.4 caso não esteja presente
   * Verifica compatibilidade com a versão requerida pelo projeto

5. **Compilação do Backend**
   * Sincroniza e corrige o `go.mod`
   * Baixa todas as dependências do Go
   * Compila o projeto backend gerando o binário `crypto-core`

6. **Inicialização do Backend**
   * Inicia o backend em background
   * Verifica se MongoDB e RabbitMQ estão acessíveis
   * Salva o PID do processo em `crypto-core/backend.pid`
   * Logs disponíveis em `crypto-core/backend.log`

7. **Instalação do Node.js**
   * Verifica se o Node.js está instalado
   * Instala o Node.js versão 20.x caso não esteja presente (via NodeSource)

8. **Instalação das dependências do Front-end**
   * Navega até a pasta `front-argitragem`
   * Executa `npm install` para instalar todas as dependências

9. **Inicialização do Front-end**
   * Constrói o projeto front-end (build de produção)
   * Inicia o servidor front-end em modo produção
   * Salva o PID do processo em `front-argitragem/frontend.pid`
   * Logs disponíveis em `front-argitragem/frontend.log`

### Serviços após a instalação:

Após a execução bem-sucedida do script, os seguintes serviços estarão rodando:

* **MongoDB**: `localhost:27017`
* **RabbitMQ**: `localhost:5672` (Management: `localhost:15672`)
* **Backend**: Porta configurada no `.env` (padrão: 8080)
* **Front-end**: Porta configurada no build (verifique os logs)

### Gerenciamento dos serviços:

Para parar os serviços iniciados pelo script:

```bash theme={null}
# Parar o backend
kill $(cat crypto-core/backend.pid)

# Parar o front-end
kill $(cat front-argitragem/frontend.pid)

# Parar os containers Docker
cd crypto-core && docker compose down
```

***

## 🛠️ Backend

O backend foi desenvolvido em **Golang** (versão 1.20) e está localizado na pasta `crypto-core`. Ele depende de serviços como **MongoDB**, **RabbitMQ** e opcionalmente **Redis** para cache, que podem ser executados via Docker. Caso o Redis não esteja disponível, o sistema automaticamente utiliza cache em memória.

### Passos para rodar o backend:

1. Certifique-se de que você tem o **Docker** instalado na sua máquina.
2. Navegue até a pasta do backend:
   ```bash theme={null}
   cd crypto-core
   ```
3. Suba os serviços necessários com o Docker Compose:
   ```bash theme={null}
   docker-compose up -d
   ```
4. Execute o backend:
   ```bash theme={null}
   go run main/main.go
   ```

***

## 🔑 Variáveis de Ambiente do Backend

O backend utiliza diversas variáveis de ambiente para configurar integrações e serviços externos. Abaixo está uma descrição de cada uma delas:

* **BYBIT\_API\_KEY**: Chave de API para acessar a ByBit
* **BYBIT\_SECRET\_KEY**: Chave secreta para acessar a ByBit

> **Coinbase**: A integração spot da Coinbase utiliza exclusivamente endpoints públicos da [Advanced Trade API](https://docs.cdp.coinbase.com/coinbase-app/advanced-trade-apis/rest-api) — **nenhuma chave de API é necessária** para coleta de preços, order book e dados de mercado. Caso futuramente deseje habilitar execução de ordens, será necessário configurar as variáveis abaixo (opcional):
>
> * `COINBASE_API_KEY`: Chave de API para a Coinbase Advanced Trade
> * `COINBASE_API_SECRET`: Chave secreta para a Coinbase Advanced Trade

* **KRAKEN\_API\_KEY**: Chave de api para acessar a Kraken

* **KRAKEN\_API\_SECRET**: Chave secreta para acessar a Kraken

* **API\_KEY\_CRYPTO\_COM**: Chave de API para acessar a Crypto.com

* **CRYPTO\_COM\_SECRET\_KEY**: Chave secreta para acessar a Crypto.com

* **API\_KEY\_BINANCE**: Chave de API para acessar a API da Binance.

* **SECRET\_KEY\_BINANCE**: Chave secreta correspondente à API da Binance.

* **API\_KEY\_OKX**: Chave de API para acessar a API da OKX.

* **SECRET\_KEY\_OKX**: Chave secreta correspondente à API da OKX.

* **PASSPHRASE\_OKX**: Frase de segurança necessária para autenticação na API da OKX.

* **MONGO\_URI**: URI de conexão com o banco de dados MongoDB. Exemplo: `mongodb://localhost:27017`.

* **FREE\_CURRENCY\_API\_KEY**: Chave de API para acessar o serviço de conversão de moedas Free Currency API.

* **EXCHANGERATE\_API\_KEY**: Chave de API para acessar o serviço de conversão de moedas ExchangeRate API como fallback.

* **AMQP\_URI**: URI de conexão com o servidor RabbitMQ. Exemplo: `amqp://adm:123456@localhost:5672/virtualhost`.

* **TWITTER\_CONSUMER\_KEY**: Chave de consumidor para integração com a API do Twitter.

* **TWITTER\_CONSUMER\_SECRET**: Chave secreta de consumidor para integração com a API do Twitter.

* **PANIC\_RECOVERY**: Faz a aplicacao se recuperar de panicos (erros inesperados).

* **REDIS\_HOST**: Endereço do servidor Redis. Exemplo: `localhost:6379`.
  recomendado caso voce va utilizar em alguma vm ou em um ambiente fora de containers

* **AWESOME\_API\_KEY**: Chave de API para obter as cotações do Dólar.
  Disponível em [https://awesomeapi.com.br/conta](https://awesomeapi.com.br/conta)

Certifique-se de configurar essas variáveis de ambiente corretamente antes de executar o backend. Você pode defini-las em um arquivo `.env` na raiz do projeto ou diretamente no ambiente do sistema operacional.

## 🌐 Front-end

O front-end foi desenvolvido em **React** e está localizado na pasta `front-arbitragem`. Ele utiliza o npm para gerenciar dependências e rodar o servidor local.

### Passos para rodar o front-end:

1. Certifique-se de que você tem o **Node.js** (versão 18.10.0 ou superior) instalado.
2. Navegue até a pasta do front-end:
   ```bash theme={null}
   cd front-arbitragem
   ```
3. Instale as dependências do projeto:
   ```bash theme={null}
   npm install
   ```
4. Inicie o servidor local:
   ```bash theme={null}
   npm run dev
   ```

***

## 🐳 Dependências via Docker

As dependências do backend, como **MongoDB** e **RabbitMQ**, são gerenciadas via Docker. Para subir os serviços necessários, execute o seguinte comando na pasta `crypto-core`:

```bash theme={null}
cd crypto-core
docker compose up -d
```

Isso iniciará os containers do MongoDB e RabbitMQ em modo detached (background). Os serviços estarão disponíveis em:

* **MongoDB**: `localhost:27017`
* **RabbitMQ**: `localhost:5672` (Management UI: `localhost:15672`)

Para parar os containers, execute:

```bash theme={null}
cd crypto-core
docker compose down
```

***

## ☁️ Provedores de Serviços Gerenciados (Alternativas Gratuitas)

Como alternativa à instalação local via Docker, você pode utilizar serviços gerenciados gratuitos para desenvolvimento e testes. Isso pode ser útil para simplificar a configuração inicial ou para testar o projeto sem precisar configurar todos os serviços localmente.

### MongoDB Gerenciado

Você pode usar um MongoDB gerenciado gratuito (como MongoDB Atlas) em vez de executar o MongoDB localmente via Docker.

**Tutorial em vídeo:** [Como configurar MongoDB Atlas gratuito](https://www.youtube.com/watch?v=JWmh5CnM0y0)

Após criar sua conta e cluster no MongoDB Atlas, você receberá uma URI de conexão que deve ser configurada na variável de ambiente `MONGO_URI` no arquivo `.env`.

### RabbitMQ Gerenciado

Existem serviços de mensageria gerenciados gratuitos que podem substituir o RabbitMQ local.

**Tutorial em vídeo:** [Como configurar RabbitMQ gerenciado gratuito](https://www.youtube.com/watch?v=Nz7Mvnoo_4U)

Após configurar o serviço, atualize a variável de ambiente `AMQP_URI` no arquivo `.env` com a URI de conexão fornecida pelo provedor.

### APIs de Conversão de Moedas

O projeto utiliza duas APIs de conversão de moedas como fallback. Você pode obter chaves de API gratuitas nos seguintes serviços:

#### Free Currency API

* **Dashboard:** [Free Currency API Dashboard](https://app.freecurrencyapi.com/dashboard)
* **Variável de ambiente:** `FREE_CURRENCY_API_KEY`

Crie uma conta gratuita e obtenha sua chave de API no dashboard. Configure a variável `FREE_CURRENCY_API_KEY` no arquivo `.env`.

#### ExchangeRate API

* **Dashboard:** [ExchangeRate API Dashboard](https://app.exchangerate-api.com/dashboard)
* **Variável de ambiente:** `EXCHANGERATE_API_KEY`

Crie uma conta gratuita e obtenha sua chave de API no dashboard. Configure a variável `EXCHANGERATE_API_KEY` no arquivo `.env`.

<Info>
  Ambas as APIs são usadas como fallback. Se uma falhar, o sistema tentará usar a outra automaticamente. Recomendamos configurar ambas para maior confiabilidade.
</Info>

***

## 🚀 Sugestões de Publicação

### Front-end - Netlify

Para publicar o front-end do projeto, recomendamos o uso do **Netlify**, uma plataforma de hospedagem gratuita especializada em aplicações web modernas.

**Dashboard:** [Netlify](https://app.netlify.com/teams/jeanlucafp/projects)

#### Vantagens do Netlify

* **Plano gratuito generoso** - Inclui 100GB de largura de banda e 300 minutos de build por mês
* **Deploy contínuo** - Integração automática com GitHub, GitLab e Bitbucket
* **CDN global** - Distribuição de conteúdo em servidores ao redor do mundo para melhor performance
* **HTTPS automático** - Certificados SSL gratuitos e renovação automática
* **Preview de branches** - Visualize mudanças de pull requests antes de fazer merge
* **Fácil configuração** - Setup simples através de interface web ou arquivo de configuração
* **Serverless Functions** - Suporte para funções serverless (opcional)
* **Formulários** - Gerenciamento de formulários sem backend (opcional)

#### Como publicar

O Netlify oferece duas formas principais de fazer deploy:

**Opção 1: Deploy via Git (Recomendado)**

1. Crie uma conta gratuita no [Netlify](https://app.netlify.com/teams/jeanlucafp/projects)
2. Conecte seu repositório Git ao Netlify
3. Configure o build command: `npm run build`
4. Configure o publish directory: `dist` (ou o diretório de build do seu projeto)
5. O Netlify fará o deploy automaticamente a cada push no repositório

**Opção 2: Deploy via Arrastar e Soltar (Drag and Drop)**

1. Crie uma conta gratuita no [Netlify](https://app.netlify.com/teams/jeanlucafp/projects)
2. Execute o build do projeto localmente: `npm run build`
3. Acesse a área de deploy manual no dashboard do Netlify
4. Arraste e solte a pasta de build (geralmente `dist`) diretamente na interface do Netlify
5. O deploy será realizado instantaneamente

O Netlify é ideal para projetos React, Vue, Angular e outros frameworks modernos, oferecendo uma experiência de deploy simplificada e profissional.
