Backend e API Gateway da plataforma SyncDesk, desenvolvido com FastAPI, Python, PostgreSQL, MongoDB e Docker.
A API centraliza os principais recursos da plataforma, incluindo autenticação, usuários, permissões, empresas, produtos, chamados, chat, chatbot, arquivos, notificações, métricas e integrações de infraestrutura.
https://github.com/Titus-System/syncdesk-api
| Tecnologia | Uso |
|---|---|
| Python 3.12+ | Linguagem principal do backend |
| FastAPI | Framework da API |
| Uvicorn | Servidor ASGI para execução local |
| Poetry | Gerenciamento de dependências Python |
| SQLAlchemy 2 Async | ORM e acesso assíncrono ao PostgreSQL |
| PostgreSQL | Banco relacional principal |
| Alembic | Controle de migrations do PostgreSQL |
| MongoDB | Banco usado por recursos como chat e conversas |
| Motor / Beanie | Integração assíncrona com MongoDB |
| JWT | Autenticação e autorização |
| Passlib / Argon2 | Hash de senhas |
| WebSocket | Comunicação em tempo real |
| MinIO / S3 | Armazenamento de arquivos |
| Resend | Envio de e-mails |
| Prometheus | Coleta de métricas |
| Grafana | Visualização de métricas |
| Loki / Promtail | Logs centralizados |
| Docker | Containerização |
| Docker Compose | Orquestração local dos serviços |
| pytest | Testes automatizados |
| Ruff, Bandit e mypy | Qualidade, segurança e tipagem |
app/
|-- api/
|-- core/
|-- db/
| |-- mongo/
| `-- postgres/
|-- domains/
| |-- auth/
| |-- chatbot/
| |-- companies/
| |-- files/
| |-- health/
| |-- live_chat/
| |-- notifications/
| |-- products/
| `-- ticket/
|-- infra/
|-- schemas/
|-- seed/
`-- main.py
alembic/
|-- versions/
`-- env.py
deploy/
|-- alertmanager/
|-- grafana/
|-- loki/
|-- prometheus/
|-- promtail/
`-- Dockerfile
docs/
tests/
scripts/
logs/
| Pasta | Responsabilidade |
|---|---|
app/api/ |
Roteador principal da API |
app/core/ |
Configurações globais, segurança, logs, métricas, middlewares e storage |
app/db/ |
Configuração e dependências de banco para PostgreSQL e MongoDB |
app/domains/ |
Módulos de negócio organizados por domínio |
app/infra/ |
Integrações externas, como e-mail e storage S3 |
app/schemas/ |
Schemas compartilhados |
app/seed/ |
Scripts de seed para dados iniciais |
alembic/ |
Migrations do PostgreSQL |
deploy/ |
Arquivos de Docker, observabilidade e deploy |
tests/ |
Testes automatizados |
docs/ |
Documentações auxiliares da API |
- Python 3.12+
- Poetry
- Docker
- Docker Compose
- PostgreSQL
- MongoDB
- MinIO, quando forem usados recursos de arquivos
- Arquivo
.envconfigurado
Para desenvolvimento local, o fluxo recomendado é executar a API com Poetry e subir PostgreSQL/MongoDB via Docker.
Clone o repositório:
git clone https://github.com/Titus-System/syncdesk-api.git
cd syncdesk-apiInstale as dependências:
poetry installCrie o arquivo de ambiente:
cp .env.example .envNo Windows PowerShell:
Copy-Item .env.example .envRevise as variáveis do arquivo .env.
Suba os bancos com Docker:
docker compose up -d db mongoCaso utilize recursos de arquivos, suba também o MinIO, se ele estiver disponível no docker-compose.yaml:
docker compose up -d db mongo minioAplique as migrations, se necessário:
poetry run alembic upgrade headNa primeira execução, rode o seed:
poetry run python -m app.seed.run_seedExecute a API localmente:
poetry run uvicorn app.main:create_app --factory --host 0.0.0.0 --port 8000 --reloadA API ficará disponível em:
http://localhost:8000
Documentação Swagger:
http://localhost:8000/docs
Documentação ReDoc:
http://localhost:8000/redoc
O projeto usa um arquivo .env na raiz do projeto.
Antes de executar a API, copie o .env.example para .env e revise as variáveis conforme o ambiente local.
Exemplo baseado no .env.example:
PROJECT_NAME=syncdesk_api
PROJECT_DESCRIPTION=Backend e API GATEWAY para o projeto SyncDesk
PROJECT_VERSION=1.0.0
ENVIRONMENT=development
WEB_FRONTEND_URL=http://localhost:3000
MOBILE_FRONTEND_URL=syncdesk://
CORS_ALLOW_ORIGINS=["https://app.example.com","http://localhost:3000"]
CORS_ALLOW_CREDENTIALS=False
CORS_ALLOW_METHODS=["GET","POST","PUT","PATCH","DELETE"]
CORS_ALLOW_HEADERS=["Authorization","Content-Type"]
POSTGRES_USER=syncdesk_user
POSTGRES_PASSWORD=supersecretpassword
POSTGRES_DB=syncdesk_db
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
MONGO_INITDB_ROOT_USERNAME=mongouser
MONGO_INITDB_ROOT_PASSWORD=mongopassword
MONGO_USER=mongouser
MONGO_PASSWORD=mongopassword
MONGO_HOST=localhost
MONGO_PORT=27017
MONGO_DB=syncdesk_db
JWT_SECRET_KEY=sua_chave_secreta_aqui
ACCESS_TOKEN_SIGNING_KEY=your_access_token_siging_key
REFRESH_TOKEN_SIGNING_KEY=your_refresh_token_siging_key
JWT_ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
SESSION_EXPIRE_DAYS=180
DEFAULT_ROLE_NAME=user
MAX_CHAT_MESSAGE_CONTENT_SIZE=2000
PASSWORD_RESET_TOKEN_EXPIRE_MINUTES=30
INVITE_TOKEN_EXPIRE_HOURS=72
RESET_TOKEN_HMAC_SECRET=your-very-secret-token
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin
S3_ENDPOINT_URL=http://localhost:9000
S3_PUBLIC_ENDPOINT_URL=http://localhost:9000
S3_REGION=us-east-1
S3_ACCESS_KEY=minioadmin
S3_SECRET_KEY=minioadmin
S3_BUCKET_DEFAULT=syncdesk-files
S3_PRESIGNED_UPLOAD_EXPIRES_SECONDS=300
S3_PRESIGNED_DOWNLOAD_EXPIRES_SECONDS=300
S3_CORS_ALLOWED_ORIGINS=*
RESEND_API_KEY=your-resend-api-key
RESEND_FROM_EMAIL=no_reply@syncdesk.pro
RUN_RESEND_INTEGRATION_TESTS=False
RESEND_TEST_TO_EMAIL=Principais variáveis:
| Variável | Descrição |
|---|---|
ENVIRONMENT |
Ambiente da aplicação |
WEB_FRONTEND_URL |
URL do frontend web |
MOBILE_FRONTEND_URL |
URL ou deep link do app mobile |
CORS_ALLOW_ORIGINS |
Origens permitidas para chamadas CORS |
POSTGRES_USER |
Usuário do PostgreSQL |
POSTGRES_PASSWORD |
Senha do PostgreSQL |
POSTGRES_DB |
Nome do banco PostgreSQL |
POSTGRES_HOST |
Host do PostgreSQL |
POSTGRES_PORT |
Porta do PostgreSQL |
MONGO_USER |
Usuário do MongoDB |
MONGO_PASSWORD |
Senha do MongoDB |
MONGO_HOST |
Host do MongoDB |
MONGO_PORT |
Porta do MongoDB |
MONGO_DB |
Nome do banco MongoDB |
JWT_SECRET_KEY |
Chave secreta usada pelo JWT |
ACCESS_TOKEN_SIGNING_KEY |
Chave de assinatura do access token |
REFRESH_TOKEN_SIGNING_KEY |
Chave de assinatura do refresh token |
ACCESS_TOKEN_EXPIRE_MINUTES |
Tempo de expiração do access token |
SESSION_EXPIRE_DAYS |
Duração da sessão |
S3_ENDPOINT_URL |
Endpoint interno do MinIO/S3 |
S3_PUBLIC_ENDPOINT_URL |
Endpoint público do MinIO/S3 |
S3_BUCKET_DEFAULT |
Bucket padrão para arquivos |
RESEND_API_KEY |
Chave da integração com Resend |
RESEND_FROM_EMAIL |
E-mail remetente usado pela aplicação |
Também é possível executar a API, os bancos e os serviços auxiliares via Docker Compose.
Crie o arquivo .env:
cp .env.example .envNo Windows PowerShell:
Copy-Item .env.example .envSuba todos os serviços:
docker compose up --buildOu em segundo plano:
docker compose up -d --buildVerifique os logs da API:
docker compose logs -f apiPare os serviços:
docker compose downPara parar os serviços e remover os volumes locais:
docker compose down -vUse docker compose down -v apenas quando puder apagar os dados locais dos bancos.
| Comando | Descrição |
|---|---|
poetry install |
Instala as dependências do projeto |
poetry run uvicorn app.main:create_app --factory --host 0.0.0.0 --port 8000 --reload |
Executa a API localmente com reload |
poetry run python -m app.seed.run_seed |
Executa o seed inicial |
poetry run alembic upgrade head |
Aplica migrations pendentes |
poetry run pytest |
Executa os testes |
poetry run ruff check . |
Executa lint com Ruff |
docker compose up -d db mongo |
Sobe PostgreSQL e MongoDB |
docker compose up -d --build |
Sobe todos os serviços em background |
docker compose logs -f api |
Exibe logs da API |
docker compose down |
Para os containers |
docker compose down -v |
Para containers e remove volumes |
Com a API em execução, acesse:
http://localhost:8000/docs
A documentação interativa permite visualizar e testar os endpoints diretamente pelo navegador.
Os endpoints principais ficam abaixo do prefixo:
/api
| Área | Descrição |
|---|---|
/api/auth |
Login, registro, refresh token, logout e usuário atual |
/api/users |
Gestão de usuários |
/api/roles |
Gestão de papéis |
/api/permissions |
Gestão de permissões |
/api/tickets |
Gestão de chamados |
/api/live-chat |
Conversas e chat em tempo real |
/api/chatbot |
Fluxos de chatbot e triagem |
/api/products |
Gestão de produtos |
/api/companies |
Gestão de empresas |
/api/files |
Upload, download e gestão de arquivos |
A aplicação utiliza dois bancos:
| Banco | Uso |
|---|---|
| PostgreSQL | Dados relacionais, autenticação, usuários, permissões, tickets e entidades principais |
| MongoDB | Dados não relacionais, conversas, mensagens e recursos relacionados a chat |
O PostgreSQL usa migrations com Alembic.
Para aplicar migrations:
poetry run alembic upgrade headO seed inicial deve ser executado na primeira configuração do ambiente:
poetry run python -m app.seed.run_seedRecursos de arquivos usam MinIO/S3.
Variáveis principais:
S3_ENDPOINT_URL=http://localhost:9000
S3_PUBLIC_ENDPOINT_URL=http://localhost:9000
S3_ACCESS_KEY=minioadmin
S3_SECRET_KEY=minioadmin
S3_BUCKET_DEFAULT=syncdesk-filesCaso o projeto seja executado totalmente via Docker, confirme no docker-compose.yaml quais portas e nomes de serviços estão sendo usados.
Para rodar os testes:
poetry run pytestPara rodar um arquivo específico:
poetry run pytest tests/caminho/do/teste.pyAo rodar localmente no Windows, verifique principalmente:
- IP usado pelo app mobile
- Porta da API
- Firewall
- Containers ativos
- Variáveis do
.env
A API deve ser executada com:
--host 0.0.0.0 --port 8000Isso permite acesso por outros dispositivos ou pelo emulador Android.
Para o mobile no Android Emulator:
EXPO_PUBLIC_API_BASE_URL=http://10.0.2.2:8000/apiPara celular físico na mesma rede:
EXPO_PUBLIC_API_BASE_URL=http://SEU_IP_LOCAL:8000/apiPara descobrir o IP no Windows:
ipconfigSe o app não conseguir acessar a API, verifique se o firewall permite conexões na porta 8000.
Verifique se as dependências foram instaladas:
poetry installConfirme se o arquivo .env existe na raiz do projeto.
Verifique se PostgreSQL e MongoDB estão rodando:
docker compose psVerifique as variáveis:
POSTGRES_USER=
POSTGRES_PASSWORD=
POSTGRES_DB=
POSTGRES_HOST=
POSTGRES_PORT=Se a API estiver rodando localmente com Poetry e os bancos estiverem no Docker, normalmente o host deve ser:
POSTGRES_HOST=localhostVerifique as variáveis:
MONGO_USER=
MONGO_PASSWORD=
MONGO_HOST=
MONGO_PORT=
MONGO_DB=Se as credenciais foram alteradas depois da criação do volume, recrie os volumes:
docker compose down -v
docker compose up -d db mongoDepois rode novamente o seed:
poetry run python -m app.seed.run_seedRode as migrations:
poetry run alembic upgrade headDepois execute novamente:
poetry run python -m app.seed.run_seedUse outra porta:
poetry run uvicorn app.main:create_app --factory --host 0.0.0.0 --port 8001 --reloadSe mudar a porta da API, ajuste também a URL no frontend web ou mobile.
Confirme que a API foi iniciada com:
--host 0.0.0.0No emulador Android, use:
EXPO_PUBLIC_API_BASE_URL=http://10.0.2.2:8000/apiNo celular físico, use:
EXPO_PUBLIC_API_BASE_URL=http://SEU_IP_LOCAL:8000/apiVerifique também o firewall do Windows.
Se o banco já tinha volume criado, as credenciais antigas podem continuar salvas.
Para resetar:
docker compose down -v
docker compose up -d --buildUse esse comando apenas quando puder apagar os dados locais.
- O modo mais comum de desenvolvimento é executar a API localmente com Poetry e subir os bancos via Docker.
- O modo totalmente via Docker é útil para simular o ambiente completo.
- O seed deve ser executado na primeira configuração local.
- As migrations são gerenciadas pelo Alembic.
- A documentação principal da API fica em
/docs. - Para integração com o mobile local, a porta
8000precisa estar acessível.