API backend em Rust usando axum, seguindo uma organização de camadas inspirada em Clean Architecture.
- Rust
- Axum
- Tokio
- SQLx + PostgreSQL
- Argon2 para hash de senha
- Tracing + tower-http (trace e CORS)
- Docker + Docker Compose
src/
domain/ # Entidades e regras centrais do domínio
app/ # Casos de uso e contratos (traits)
adapter/
http/ # Rotas HTTP, estado e mapeamento de erros
persistence/ # Implementação de persistência no PostgreSQL
crypto/ # Implementação de hash (Argon2)
infra/ # Configuração, DB, setup e montagem da aplicação
main.rs # Bootstrap do servidor
Fluxo principal de dependências:
HTTP Route -> UseCase -> Traits -> Adapters (Persistence/Crypto) -> Infra (DB/Config)
- Rust toolchain instalado (recomendado
>= 1.88) - PostgreSQL rodando localmente ou Docker
- (Opcional)
sqlx-clipara aplicar migrations manualmente
- Crie seu arquivo de ambiente:
cp .env.example .env- Ajuste as variáveis conforme seu ambiente:
DATABASE_URL: conexão do PostgreSQLJWT_SECRET: segredo JWT (obrigatório)REFRESH_TOKEN_TTL_DAYS: TTL do refresh token em diasACCESS_TOKEN_TTL_SECS: TTL do access token em segundos (opcional; padrão30)RUST_LOG: nível de logs
Observação: o arquivo
.env.examplenão incluiACCESS_TOKEN_TTL_SECS, mas o código já suporta essa variável.
Exemplos de DATABASE_URL:
- Rodando API localmente com Postgres no host:
postgres://user:password@localhost:5433/app - Rodando API dentro do Docker Compose:
postgres://user:password@postgres:5432/app
Existe uma migration para criação da tabela users em migrations/20250819195936_create_users.sql.
Se quiser aplicar com SQLx CLI:
sqlx database create
sqlx migrate run- Garanta que o PostgreSQL está ativo.
- Execute:
cargo runServidor sobe em:
http://127.0.0.1:3001
docker compose up --buildServiços:
- PostgreSQL:
localhost:5433 - API:
localhost:3001
- Método:
POST - Rota:
/api/user/register - Body JSON:
{
"username": "John Doe",
"email": "[email protected]",
"password": "your-password"
}- Resposta de sucesso (
201):
{
"success": true
}Rodar testes:
cargo testChecar lint (se clippy estiver instalado):
cargo clippy -- -D warnings- O hash de senha é feito com Argon2 no adapter de crypto.
- Erros de aplicação são centralizados em
AppError. - O app usa
TraceLayercomrequest_idpor requisição. - CORS está liberado para
http://localhost:5173.