docs: update infra diagrams, add test users, fix Coolify URL

- Add full infrastructure Mermaid diagrams (Redbull + Apolo + CI/CD flow)
- Create TEST_USERS.md with all seeder credentials organized by role
- Fix Coolify URL from IP to https://redbull.rede5.com.br
- Update Coolify resources with current domains and status
- Add TEST_USERS.md reference to AGENTS.md, README.md, and doc index
- Update deployment section with both DEV environments

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Tiago Yamamoto 2026-02-18 06:22:56 -06:00
parent 7e202bb99e
commit 9fd5cf5895
4 changed files with 331 additions and 35 deletions

View file

@ -21,6 +21,7 @@ Plataforma de recrutamento com arquitetura separada por serviços:
| [docs/WORKFLOWS.md](docs/WORKFLOWS.md) | Fluxos de deploy e operações | | [docs/WORKFLOWS.md](docs/WORKFLOWS.md) | Fluxos de deploy e operações |
| [docs/ROADMAP.md](docs/ROADMAP.md) | Direção de produto e engenharia | | [docs/ROADMAP.md](docs/ROADMAP.md) | Direção de produto e engenharia |
| [docs/TASKS.md](docs/TASKS.md) | Tarefas e acompanhamento | | [docs/TASKS.md](docs/TASKS.md) | Tarefas e acompanhamento |
| [docs/TEST_USERS.md](docs/TEST_USERS.md) | Credenciais de teste (login por role) |
### Por componente ### Por componente

View file

@ -1,6 +1,6 @@
# AGENTS.md - GoHorse Jobs # AGENTS.md - GoHorse Jobs
> **Last Updated:** 2026-02-16 > **Last Updated:** 2026-02-18
> **Purpose:** Context for AI coding assistants (Claude, Cursor, etc.) > **Purpose:** Context for AI coding assistants (Claude, Cursor, etc.)
--- ---
@ -206,6 +206,7 @@ backoffice/src/
- **4 roles**: `superadmin` > `admin` > `recruiter` > `candidate` - **4 roles**: `superadmin` > `admin` > `recruiter` > `candidate`
- **Middleware stack**: Auth (JWT+RBAC) -> CORS -> Rate Limiting (100 req/min) -> Security Headers -> XSS Sanitizer - **Middleware stack**: Auth (JWT+RBAC) -> CORS -> Rate Limiting (100 req/min) -> Security Headers -> XSS Sanitizer
- **JWT secret must match** between Backend and Backoffice - **JWT secret must match** between Backend and Backoffice
- **Test credentials**: See [TEST_USERS.md](TEST_USERS.md) for all test accounts
--- ---
@ -249,8 +250,16 @@ All backend routes under `/api/v1`:
- **Environments**: `dev` (branch: dev), `hml` (branch: hml), `prd` (branch: main) - **Environments**: `dev` (branch: dev), `hml` (branch: hml), `prd` (branch: main)
- **CI/CD**: Forgejo workflows (`.forgejo/workflows/`) + Drone (`.drone.yml`) - **CI/CD**: Forgejo workflows (`.forgejo/workflows/`) + Drone (`.drone.yml`)
- **Container runtime**: Podman (dev), Kubernetes (production) - **Container runtime**: Podman (Apolo), Coolify/Docker (Redbull), Kubernetes (production)
- **Registry**: Forgejo (`forgejo-gru.rede5.com.br/rede5/`) - **Registry**: Forgejo (`forgejo-gru.rede5.com.br/rede5/`)
- **Coolify UI**: https://redbull.rede5.com.br (Redbull VPS DEV environment)
### DEV Environments
| Server | Type | URLs |
|--------|------|------|
| **Redbull** (Coolify) | Auto-deploy via Git | `local.gohorsejobs.com`, `api-local.gohorsejobs.com` |
| **Apolo** (Podman/Quadlet) | Manual deploy | `dev.gohorsejobs.com`, `api-tmp.gohorsejobs.com` |
--- ---
@ -302,10 +311,12 @@ git push pipe dev
| API Reference | [API.md](API.md) | Endpoints, contracts, examples | | API Reference | [API.md](API.md) | Endpoints, contracts, examples |
| API Security | [API_SECURITY.md](API_SECURITY.md) | Auth, RBAC, permissions | | API Security | [API_SECURITY.md](API_SECURITY.md) | Auth, RBAC, permissions |
| Database Schema | [DATABASE.md](DATABASE.md) | Tables, ERD, migrations | | Database Schema | [DATABASE.md](DATABASE.md) | Tables, ERD, migrations |
| DevOps | [DEVOPS.md](DEVOPS.md) | Infrastructure, deployment | | DevOps | [DEVOPS.md](DEVOPS.md) | Infrastructure, deployment, diagrams |
| Test Users | [TEST_USERS.md](TEST_USERS.md) | Credenciais de teste por role |
| Roadmap | [ROADMAP.md](ROADMAP.md) | Product direction | | Roadmap | [ROADMAP.md](ROADMAP.md) | Product direction |
| Tasks | [TASKS.md](TASKS.md) | Task tracking | | Tasks | [TASKS.md](TASKS.md) | Task tracking |
| Workflows | [WORKFLOWS.md](WORKFLOWS.md) | Deployment workflows | | Workflows | [WORKFLOWS.md](WORKFLOWS.md) | Deployment workflows |
| Backend | [../backend/BACKEND.md](../backend/BACKEND.md) | Go API details | | Backend | [../backend/BACKEND.md](../backend/BACKEND.md) | Go API details |
| Frontend | [../frontend/FRONTEND.md](../frontend/FRONTEND.md) | Next.js details | | Frontend | [../frontend/FRONTEND.md](../frontend/FRONTEND.md) | Next.js details |
| Backoffice | [../backoffice/BACKOFFICE.md](../backoffice/BACKOFFICE.md) | NestJS details | | Backoffice | [../backoffice/BACKOFFICE.md](../backoffice/BACKOFFICE.md) | NestJS details |
| Seeder | [../seeder-api/SEEDER-API.md](../seeder-api/SEEDER-API.md) | Database seeding & test data |

View file

@ -2,7 +2,7 @@
Infraestrutura, CI/CD e deploy do projeto GoHorseJobs no servidor `apolo`. Infraestrutura, CI/CD e deploy do projeto GoHorseJobs no servidor `apolo`.
> **Last Updated:** 2026-02-17 > **Last Updated:** 2026-02-18
> **Servers:** Apolo VPS (Podman), Redbull VPS (Coolify) > **Servers:** Apolo VPS (Podman), Redbull VPS (Coolify)
> **Tech Stack:** Podman, Systemd (Quadlet), Traefik, PostgreSQL, Coolify > **Tech Stack:** Podman, Systemd (Quadlet), Traefik, PostgreSQL, Coolify
@ -83,7 +83,7 @@ Ambiente de desenvolvimento no Coolify para deploy automatizado via Git.
| Property | Value | | Property | Value |
|----------|-------| |----------|-------|
| **Host** | redbull (185.194.141.70) | | **Host** | redbull (185.194.141.70) |
| **Coolify URL** | http://185.194.141.70:8000 | | **Coolify URL** | https://redbull.rede5.com.br |
| **API Token** | `~/.ssh/coolify-redbull-token` | | **API Token** | `~/.ssh/coolify-redbull-token` |
| **SSH Key** | `~/.ssh/civo` | | **SSH Key** | `~/.ssh/civo` |
| **Project UUID** | `gkgksco0ow4kgwo8ow4cgs8c` | | **Project UUID** | `gkgksco0ow4kgwo8ow4cgs8c` |
@ -91,51 +91,55 @@ Ambiente de desenvolvimento no Coolify para deploy automatizado via Git.
### Resources Created ### Resources Created
| Resource | UUID | Port | Domain | | Resource | UUID | Port | Domain | Status |
|----------|------|------|--------| |----------|------|------|--------|--------|
| Backend: gohorsejobs-backend-dev | `iw4sow8s0kkg4cccsk08gsoo` | 8521 | coolify-dev.gohorsejobs.com | | Backend | `iw4sow8s0kkg4cccsk08gsoo` | 8521 | https://api-local.gohorsejobs.com | running |
| Frontend: gohorsejobs-frontend-dev | `ao8g40scws0w4cgo8coc8o40` | 3000 | local.gohorsejobs.com | | Frontend | `ao8g40scws0w4cgo8coc8o40` | 3000 | https://local.gohorsejobs.com | running |
| Backoffice: gohorsejobs-backoffice-dev | `hg48wkw4wggwsswcwc8sooo4` | 3001 | backoffice-dev.gohorsejobs.com | | Backoffice | `hg48wkw4wggwsswcwc8sooo4` | 3001 | https://b-local.gohorsejobs.com | running |
| Seeder: gohorsejobs-seeder-dev | `q4w48gos8cgssso00o8w8gck` | 8080 | seeder-dev.gohorsejobs.com | | Seeder | `q4w48gos8cgssso00o8w8gck` | 8080 | https://s-local.gohorsejobs.com | running:healthy |
| Database: gohorsejobs-dev | `bgws48os8wgwk08o48wg8k80` | 5432 | Internal only | | Database (PostgreSQL) | `bgws48os8wgwk08o48wg8k80` | 5432 | Internal only | running:healthy |
### API Reference ### API Reference
**Base URL:** `http://185.194.141.70:8000/api/v1` **Base URL:** `https://redbull.rede5.com.br/api/v1`
**Server UUID:** `m844o4gkwkwcc0k48swgs8c8` **Server UUID:** `m844o4gkwkwcc0k48swgs8c8`
```bash ```bash
# Listar aplicações # Listar aplicações
curl -s -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \ curl -s -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \
"http://185.194.141.70:8000/api/v1/applications" "https://redbull.rede5.com.br/api/v1/applications"
# Atualizar domínios (requer http:// ou https://) # Atualizar domínios (requer http:// ou https://)
curl -s -X PATCH -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \ curl -s -X PATCH -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
"http://185.194.141.70:8000/api/v1/applications/<UUID>" \ "https://redbull.rede5.com.br/api/v1/applications/<UUID>" \
-d '{"domains":"http://local.gohorsejobs.com","instant_deploy":true}' -d '{"domains":"http://local.gohorsejobs.com","instant_deploy":true}'
# Deploy aplicação # Deploy aplicação
curl -s -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \ curl -s -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \
"http://185.194.141.70:8000/api/v1/deploy?uuid=<UUID>" "https://redbull.rede5.com.br/api/v1/deploy?uuid=<UUID>"
# Ver domínios do servidor # Ver domínios do servidor
curl -s -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \ curl -s -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \
"http://185.194.141.70:8000/api/v1/servers/m844o4gkwkwcc0k48swgs8c8/domains" "https://redbull.rede5.com.br/api/v1/servers/m844o4gkwkwcc0k48swgs8c8/domains"
``` ```
### Architecture ### Architecture
``` ```
GitHub (rede5/gohorsejobs.git) GitHub (rede5/gohorsejobs.git) ←→ Forgejo (pipe.gohorsejobs.com)
│ │
▼ ▼
Coolify (Build & Deploy) Coolify (redbull.rede5.com.br)
├── Traefik (reverse proxy + TLS via Let's Encrypt)
├── Backend (Go) → coolify-dev.gohorsejobs.com:8521
├── gohorsejobs-backend-dev → https://api-local.gohorsejobs.com
└── PostgreSQL → Internal network only ├── gohorsejobs-frontend-dev → https://local.gohorsejobs.com
├── gohorsejobs-backoffice-dev → https://b-local.gohorsejobs.com
├── gohorsejobs-seeder-dev → https://s-local.gohorsejobs.com
└── PostgreSQL 16 (gohorsejobs-dev) → Internal network only
``` ```
### Environment Variables ### Environment Variables
@ -159,19 +163,19 @@ CORS_ORIGINS=http://coolify-dev.gohorsejobs.com,https://coolify-dev.gohorsejobs.
```bash ```bash
# Deploy application # Deploy application
curl -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \ curl -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \
"http://185.194.141.70:8000/api/v1/deploy?uuid=iw4sow8s0kkg4cccsk08gsoo" "https://redbull.rede5.com.br/api/v1/deploy?uuid=iw4sow8s0kkg4cccsk08gsoo"
# Check deployment status # Check deployment status
curl -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \ curl -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \
"http://185.194.141.70:8000/api/v1/deployments/<deployment_uuid>" "https://redbull.rede5.com.br/api/v1/deployments/<deployment_uuid>"
# List applications # List applications
curl -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \ curl -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \
"http://185.194.141.70:8000/api/v1/applications" "https://redbull.rede5.com.br/api/v1/applications"
# List databases # List databases
curl -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \ curl -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \
"http://185.194.141.70:8000/api/v1/databases" "https://redbull.rede5.com.br/api/v1/databases"
``` ```
### Coolify Reference ### Coolify Reference
@ -182,14 +186,106 @@ curl -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \
--- ---
## 🏗️ Architecture Diagram ## 🏗️ Architecture Diagrams
Simplified view of the container hierarchy, networking, and storage. ### Full Infrastructure Overview
```mermaid
graph TB
subgraph Clients ["Clients"]
Browser["Browser / Mobile"]
end
subgraph CF ["Cloudflare (DNS + CDN)"]
DNS["DNS Zone: gohorsejobs.com"]
end
subgraph Redbull ["Redbull VPS (185.194.141.70) — Coolify DEV"]
TraefikR("Traefik + Let's Encrypt")
subgraph CoolifyApps ["Coolify Applications"]
FE_C["Frontend (:3000)"]
BE_C["Backend API (:8521)"]
BO_C["Backoffice (:3001)"]
SE_C["Seeder API (:8080)"]
end
PG_C[("PostgreSQL 16\ngohorsejobs-dev")]
end
subgraph Apolo ["Apolo VPS (38.19.201.52) — Podman/Quadlet"]
TraefikA("Traefik")
subgraph PodmanApps ["Podman Containers (Systemd/Quadlet)"]
FE_A["Frontend (:3000)"]
BE_A["Backend API (:8521)"]
BO_A["Backoffice (:3001)"]
SE_A["Seeder API (:8080)"]
end
PG_A[("PostgreSQL\npostgres-main")]
Storage["/mnt/data\n(configs + DB data)"]
end
subgraph Git ["Git Repositories"]
GH["GitHub\nrede5/gohorsejobs"]
FJ["Forgejo (pipe)\npipe.gohorsejobs.com"]
end
subgraph External ["External Services"]
Stripe["Stripe (Payments)"]
Firebase["Firebase (FCM)"]
R2["Cloudflare R2 (Storage)"]
LavinMQ["LavinMQ (AMQP)"]
Resend["Resend (Email)"]
end
%% Client Flow
Browser --> DNS
DNS -- "local.gohorsejobs.com" --> TraefikR
DNS -- "dev.gohorsejobs.com" --> TraefikA
%% Redbull Routing
TraefikR -- "local.gohorsejobs.com" --> FE_C
TraefikR -- "api-local.gohorsejobs.com" --> BE_C
TraefikR -- "b-local.gohorsejobs.com" --> BO_C
TraefikR -- "s-local.gohorsejobs.com" --> SE_C
BE_C --> PG_C
BO_C --> PG_C
SE_C --> PG_C
%% Apolo Routing
TraefikA -- "dev.gohorsejobs.com" --> FE_A
TraefikA -- "api-tmp.gohorsejobs.com" --> BE_A
TraefikA -- "b-tmp.gohorsejobs.com" --> BO_A
BE_A --> PG_A
BO_A --> PG_A
SE_A --> PG_A
PG_A -.-> Storage
%% Git Flow
GH <--> FJ
%% External
BE_C -.-> Stripe
BE_C -.-> Firebase
BE_C -.-> R2
BO_C -.-> LavinMQ
BO_C -.-> Resend
style PG_C fill:#336791,stroke:#fff,color:#fff
style PG_A fill:#336791,stroke:#fff,color:#fff
style TraefikR fill:#f5a623,stroke:#fff,color:#fff
style TraefikA fill:#f5a623,stroke:#fff,color:#fff
style CF fill:#f48120,stroke:#fff,color:#fff
```
### Apolo VPS (Podman/Quadlet) Detail
```mermaid ```mermaid
graph TD graph TD
subgraph Host ["Apolo VPS (Host)"] subgraph Host ["Apolo VPS (Host)"]
subgraph FS ["File System (/mnt/data)"] subgraph FS ["File System (/mnt/data)"]
EnvBE["/gohorsejobs/backend/.env"] EnvBE["/gohorsejobs/backend/.env"]
EnvBO["/gohorsejobs/backoffice/.env"] EnvBO["/gohorsejobs/backoffice/.env"]
@ -199,21 +295,21 @@ graph TD
subgraph Net ["Network: web_proxy"] subgraph Net ["Network: web_proxy"]
Traefik("Traefik") Traefik("Traefik")
subgraph App ["Application Containers"] subgraph App ["Application Containers"]
BE["Backend API (:8521)"] BE["Backend API (:8521)"]
BO["Backoffice (:3001)"] BO["Backoffice (:3001)"]
SE["Seeder API (:8080)"] SE["Seeder API (:8080)"]
FE["Frontend (:3000)"] FE["Frontend (:3000)"]
end end
PG[("postgres-main (:5432)")] PG[("postgres-main (:5432)")]
end end
end end
%% Ingress %% Ingress
Internet((Internet)) --> Traefik Internet((Internet)) --> Traefik
%% Routing %% Routing
Traefik -- "dev.gohorsejobs.com" --> FE Traefik -- "dev.gohorsejobs.com" --> FE
Traefik -- "api-tmp.gohorsejobs.com" --> BE Traefik -- "api-tmp.gohorsejobs.com" --> BE
@ -237,6 +333,53 @@ graph TD
style Traefik fill:#f5a623,stroke:#fff,color:#fff style Traefik fill:#f5a623,stroke:#fff,color:#fff
``` ```
### Coolify DEV (Redbull) Detail
```mermaid
graph TD
subgraph Redbull ["Redbull VPS — Coolify (redbull.rede5.com.br)"]
Traefik("Traefik + Let's Encrypt")
subgraph Apps ["Applications (auto-deploy via Git)"]
BE["Backend Go\n:8521"]
FE["Frontend Next.js\n:3000"]
BO["Backoffice NestJS\n:3001"]
SE["Seeder API\n:8080"]
end
PG[("PostgreSQL 16\ngohorsejobs\n:5432")]
end
GH["GitHub (rede5/gohorsejobs)"] --> |"push dev"| Traefik
Internet((Internet)) --> Traefik
Traefik -- "api-local.gohorsejobs.com" --> BE
Traefik -- "local.gohorsejobs.com" --> FE
Traefik -- "b-local.gohorsejobs.com" --> BO
Traefik -- "s-local.gohorsejobs.com" --> SE
BE --> PG
BO --> PG
SE --> PG
style PG fill:#336791,stroke:#fff,color:#fff
style Traefik fill:#f5a623,stroke:#fff,color:#fff
```
### CI/CD Flow
```mermaid
graph LR
Dev["Developer"] --> |"git push"| GH["GitHub\n(origin)"]
GH --> |"sync"| FJ["Forgejo\n(pipe)"]
GH --> |"webhook"| Coolify["Coolify\n(redbull)"]
Coolify --> |"build & deploy"| Redbull["Redbull VPS"]
Dev --> |"podman build"| Registry["Forgejo Registry\nforgejo-gru.rede5.com.br"]
Registry --> |"podman pull"| Apolo["Apolo VPS"]
```
--- ---
## 💾 Storage & Persistence (`/mnt/data`) ## 💾 Storage & Persistence (`/mnt/data`)

141
docs/TEST_USERS.md Normal file
View file

@ -0,0 +1,141 @@
# Test Users - GoHorseJobs
Credenciais de teste geradas pelo Seeder API para o ambiente de desenvolvimento.
> **Last Updated:** 2026-02-18
> **Importante:** O `PASSWORD_PEPPER` do seeder **deve ser idêntico** ao do backend, caso contrário o login falhará.
---
## Matriz de Usuários de Teste
### SuperAdmin
| Campo | Valor |
|-------|-------|
| **Login** | `superadmin` |
| **Senha** | `Admin@2025!` |
| **Role** | `superadmin` |
| **Permissões** | Acesso total ao sistema |
---
### Admins de Empresa
| Login | Senha | Empresa | Role |
|-------|-------|---------|------|
| `takeshi_yamamoto` | `Takeshi@2025` | TechCorp | `admin` |
| `kenji@appmakers.mobile` | `Takeshi@2025` | AppMakers | `admin` |
---
### Recrutadores
| Login | Senha | Empresa | Role |
|-------|-------|---------|------|
| `maria_santos` | `User@2025` | DesignHub | `recruiter` |
---
### Candidatos
| Login | Senha | Role |
|-------|-------|------|
| `paulo_santos` | `User@2025` | `candidate` |
| `maria@email.com` | `User@2025` | `candidate` |
| `ana_silva` | `User@2025` | `candidate` |
| `carlos_santos` | `User@2025` | `candidate` |
| `maria_oliveira` | `User@2025` | `candidate` |
| `pedro_costa` | `User@2025` | `candidate` |
| `juliana_ferreira` | `User@2025` | `candidate` |
---
### Empresas Fictícias
| Login | Senha | Empresa | Cargo |
|-------|-------|---------|-------|
| `wile_e_coyote` | `MeepMeep@123` | ACME Corporation | HR Manager & Chief Failure Officer |
---
## URLs de Login por Ambiente
| Ambiente | URL Frontend | URL API |
|----------|-------------|---------|
| **Dev (Coolify)** | https://local.gohorsejobs.com | https://api-local.gohorsejobs.com |
| **Dev (Apolo)** | https://dev.gohorsejobs.com | https://api-tmp.gohorsejobs.com |
| **Local** | http://localhost:8963 | http://localhost:8521 |
---
## Como Testar Login
### Via Frontend
1. Acesse a URL do ambiente
2. Clique em "Login" / "Entrar"
3. Use email ou username + senha da tabela acima
### Via API (cURL)
```bash
# Login como superadmin
curl -X POST https://api-local.gohorsejobs.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"login": "superadmin", "password": "Admin@2025!"}'
# Login como candidato
curl -X POST https://api-local.gohorsejobs.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"login": "paulo_santos", "password": "User@2025"}'
# Login como admin de empresa
curl -X POST https://api-local.gohorsejobs.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"login": "takeshi_yamamoto", "password": "Takeshi@2025"}'
```
---
## Permissões por Role
```
superadmin > admin > recruiter > candidate
```
| Funcionalidade | superadmin | admin | recruiter | candidate |
|----------------|:---:|:---:|:---:|:---:|
| Gerenciar usuários | x | x | - | - |
| Gerenciar empresas | x | x | - | - |
| Moderar vagas | x | x | - | - |
| Criar vagas | x | x | x | - |
| Editar vagas | x | x | x | - |
| Candidatar-se | - | - | - | x |
| Ver perfil | x | x | x | x |
| Notificações | x | x | x | x |
| Email templates | x | - | - | - |
| SMTP settings | x | - | - | - |
| System credentials | x | - | - | - |
---
## Troubleshooting
### Erro AUTH 401 / AUTH_INVALID_CREDENTIALS
1. Verifique se o `PASSWORD_PEPPER` do backend e do seeder são idênticos
2. Verifique se o seeder foi executado com sucesso (`npm run seed`)
3. Verifique se o banco de dados está acessível
4. Verifique se o JWT_SECRET está configurado no backend
### Seeder não rodou
```bash
# Verificar status do seeder no Coolify
curl -s -H "Authorization: Bearer $(cat ~/.ssh/coolify-redbull-token)" \
"https://redbull.rede5.com.br/api/v1/applications/q4w48gos8cgssso00o8w8gck"
# Re-executar seed manualmente
cd seeder-api
npm run seed:reset
```