Um template completo de API backend com autenticação, autorização, fila de jobs e agendamento de tarefas.
- ✅ Autenticação JWT com Fastify
- ✅ Autorização por Roles (Admin, SuperAdmin)
- ✅ Banco de Dados com Prisma + PostgreSQL
- ✅ Fila de Jobs com BullMQ + Redis
- ✅ Cron Jobs para tarefas agendadas
- ✅ Envio de Emails com Nodemailer
- ✅ Soft Delete de usuários
- ✅ Validação de Dados com Zod
- ✅ Paginação e Filtros avançados
- ✅ Exportação para Excel (XLSX)
- ✅ Docker Compose para desenvolvimento
- ✅ CI/CD com GitHub Actions
- Node.js 20+
- PostgreSQL 12+
- Redis 6+
- Docker e Docker Compose (opcional)
git clone https://github.com/adrielhs/template-fastify.git
cd template-fastifypnpm install
or
npm installCopie o arquivo .env.sample para .env:
cp .env.sample .envAtualize as variáveis de ambiente no arquivo .env:
# Servidor
NODE_ENV=dev
PORT=3340
FRONTEND_URL=http://localhost:3000
# Banco de Dados
DATABASE_URL=postgresql://user:password@localhost:5432/database_name
# JWT
JWT_SECRET=sua-chave-secreta-super-segura
JWT_EXPIRES_IN=1d
# Criptografia
SALT_RESULT=10
# Email
MAIL_HOST=smtp.sua-provedor.com
MAIL_PORT=587
MAIL_SECURITY=true
MAIL_USER=seu-email@exemplo.com
MAIL_PASS=sua-senha-app
MAIL_FROM="Seu Projeto <noreply@exemplo.com>"
# Redis
REDIS_HOST=localhost
REDIS_PORT=6379npx prisma migrate devpnpm devO servidor estará disponível em http://localhost:3340
Para desenvolvimento com Docker:
docker-compose -f docker-compose.dev.yml up -dIsso iniciará:
- PostgreSQL
- Redis
- Aplicação (backend)
src/
├── @types/ # Type definitions
├── config/ # Configurações (Prisma, etc)
├── modules/
│ └── users/ # Módulo de Usuários
│ ├── infra/ # Controllers e Routes
│ ├── repositories/ # Camada de dados
│ └── use-cases/ # Lógica de negócio
├── shared/
│ ├── dtos/ # Data Transfer Objects
│ ├── env/ # Variáveis de ambiente
│ ├── error/ # Tratamento de erros
│ ├── helper/ # Utilitários
│ │ ├── encrypt/ # Hash de senhas
│ │ ├── jobs/ # Filas e Crons
│ │ ├── logger/ # Logging
│ │ └── mail/ # Envio de emails
│ ├── infra/ # App, Routes, Redis
│ ├── middlewares/ # Middlewares
│ └── utils/ # Funções auxiliares
└── build/ # Saída da compilação
POST /login
Content-Type: application/json
{
"email": "usuario@example.com",
"password": "senha123"
}Resposta:
{
"user": {
"id": 1,
"name": "João Silva",
"email": "usuario@example.com",
"profile": {
"is_admin": false
}
},
"token": "eyJhbGciOiJIUzI1NiIs..."
}Adicione o token no header Authorization:
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...POST /users
Content-Type: application/json
{
"name": "João Silva",
"email": "joao@anything.com",
"whatsapp": "11999999999",
"id_profile": 4,
"avatar": "https://exemplo.com/foto.jpg"
}PUT /users/:id
Authorization: Bearer token
Content-Type: application/json
{
"name": "João Silva Updated",
"whatsapp": "11988888888"
}PUT /users/:id/admin
Authorization: Bearer token
Content-Type: application/json
{
"name": "Novo Nome",
"status": true,
"id_profile": 2
}GET /users?page=1&limit=10&orderBy=name&direction=asc&queryString=joao&id_profile=4
Authorization: Bearer tokenPATCH /users/:id
Authorization: Bearer token
Content-Type: application/json
{
"status": false
}DELETE /users/:id
Authorization: Bearer tokenPOST /esqueceu-senha
Content-Type: application/json
{
"email": "usuario@example.com"
}Um email com link será enviado para o usuário.
PATCH /resetar-senha/:token
Content-Type: application/json
{
"password": "nova-senha-123"
}Todas as requisições devem seguir o padrão:
METHOD /path
Authorization: Bearer token
Content-Type: application/json
{
"campo": "valor"
}Respostas de Sucesso (2xx):
{
"data": { /* dados */ },
"message": "Operação realizada com sucesso"
}Respostas de Erro (4xx/5xx):
{
"message": "Descrição do erro"
}Os emails são enviados assincronamente via fila:
// Na sua use-case
await mailQueue.add(
"send-email",
{
to: "usuario@example.com",
subject: "Bem-vindo",
template: welcomeEmail("João", "http://..."),
priority: 5,
},
{
attempts: 3,
backoff: { type: "exponential", delay: 2000 },
},
)As filas são gerenciadas pelo BullMQ e persistidas no Redis.
O projeto inclui cron jobs automáticos:
Executa a cada 30 minutos - marca agendamentos como concluídos quando a data esperada passar.
Executa a cada 15 minutos - marca manutenções como finalizadas automaticamente.
Configure em: src/shared/helper/jobs/Cron-jobs/updateStatus.jobs.ts
GET /users/export-users/:user_id
Authorization: Bearer tokenGera um arquivo users.xlsx com todos os usuários.
pnpm devpnpm buildIsso gera os arquivos compilados em ./build/
pnpm startO projeto inclui um pipeline CI/CD automático (.github/workflows/ci-cd.yml).
Configure as secrets do GitHub:
SSH_PRIVATE_KEY_PRODUCTIONSERVER_HOST_PRODUCTIONSERVER_USER_PRODUCTION
chmod +x release.sh
./release.shIsso:
- Incrementa a versão
- Constrói a imagem Docker
- Para e remove a imagem antiga
- Sobe os novos containers
| Role | Descrição | Permissões |
|---|---|---|
| User | Usuário comum | Atualizar próprio perfil |
| Admin | Administrador | Gerenciar usuários |
| SuperAdmin | Super administrador | Acesso total |
Verifique permissões com:
const isAdmin = await checkIsAdmin.checkIsAdmin(user_id)| Variável | Descrição | Exemplo |
|---|---|---|
NODE_ENV |
Ambiente | dev, test, production |
PORT |
Porta do servidor | 3340 |
DATABASE_URL |
String de conexão PostgreSQL | postgresql://... |
JWT_SECRET |
Chave secreta JWT | gerada automaticamente |
JWT_EXPIRES_IN |
Expiração do token | 1d, 24h |
MAIL_HOST |
Host SMTP | smtp.gmail.com |
REDIS_HOST |
Host Redis | localhost |
# Verifique se o PostgreSQL está rodando
psql -U postgres# Verifique se o Redis está rodando
redis-cli ping
# Retorno esperado: PONGVerifique as credenciais SMTP no .env e se o servidor de email está acessível.
MIT
Adriel Fernando Hipolito Silva - [@adrielhs] (https://github.com/adrielhs)
Template baseado no template criado e publicado pelo Rodrigo Bighetti (https://github.com/robighetti)
⭐ Se este template foi útil, considere deixar uma estrela no GitHub!