Appearance
Ambiente de Desenvolvimento
Stack
| Componente | Tecnologia |
|---|---|
| Backend | Laravel 13, PHP 8.4 |
| Frontend | Vue 3, Inertia.js 2, PrimeVue 4 (unstyled) |
| CSS | Tailwind CSS v4 |
| Banco | MariaDB (produção), SQLite (testes) |
| Cache/Queue | Redis via predis |
| Multi-tenancy | stancl/tenancy (multi-database, subdomínios) |
| Auth | Laravel Fortify (login, registro, 2FA) |
| Permissões | Spatie Permission |
| Auditoria | owen-it/laravel-auditing |
| spatie/laravel-pdf + Gotenberg | |
| Real-time | Laravel Reverb + Echo |
| Rotas frontend | Laravel Wayfinder (gera TS types) |
| Busca | Laravel Scout + Typesense |
Docker Compose
| Serviço | Porta | Função |
|---|---|---|
| web (nginx) | 80 | Reverse proxy |
| app (PHP 8.4) | — | Aplicação Laravel |
| queue (PHP 8.4) | — | Queue worker |
| mariadb | 3306 | Banco de dados |
| redis | 6379 | Cache e filas |
| reverb | 8080 | WebSocket server |
| gotenberg | 3000 | Geração de PDF |
| typesense | 8108 | Busca full-text (Typesense) |
| docs (VitePress) | 5173 | Documentação |
Variáveis de Ambiente Importantes
env
# Banco
DB_CONNECTION=mariadb
DB_HOST=mariadb
# Session (cookie para multi-tenancy)
SESSION_DRIVER=cookie
# Redis
REDIS_CLIENT=predis
REDIS_HOST=redis
# PDF
GOTENBERG_URL=http://gotenberg:3000
# Locale
APP_LOCALE=pt_BR
APP_FAKER_LOCALE=pt_BR
# Reverb (WebSocket) — VITE_ vars são expostas ao frontend
VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
VITE_REVERB_HOST="localhost" # "localhost" para browser, NÃO o hostname Docker
VITE_REVERB_PORT="${REVERB_PORT}"
VITE_REVERB_SCHEME="${REVERB_SCHEME}"Wayfinder (rotas no frontend)
O projeto usa Laravel Wayfinder para gerar funções TypeScript de rotas e actions. Os arquivos gerados (resources/js/routes/, resources/js/actions/) estão no .gitignore e devem ser gerados antes de qualquer build:
bash
docker compose exec app php artisan wayfinder:generate --with-form
npm run buildA flag --with-form é obrigatória — gera os .form variants usados nas páginas de autenticação.
Nunca use route() (Ziggy) nos componentes Vue. Use URLs diretas ou importe funções de @/routes/ e @/actions/.
Estrutura de Pastas
app/
├── Console/Commands/ # Artisan commands (app:setup)
├── Domain/ # DDD domains
│ ├── Church/ # Igreja, Congregação, Officials, Address
│ │ ├── Actions/
│ │ ├── Events/
│ │ ├── Models/
│ │ └── Policies/
│ ├── Finance/ # Transações, Categorias, Contas
│ │ ├── Actions/
│ │ ├── Events/
│ │ ├── Models/
│ │ └── Policies/
│ ├── Member/ # Membros, Telefones
│ │ ├── Actions/
│ │ ├── Events/
│ │ ├── Models/
│ │ ├── Observers/
│ │ └── Policies/
│ ├── Shared/Models/ # Escolaridade, Profissão, País, UF, TelefoneTipo
│ └── User/ # User model
├── Http/
│ ├── Controllers/ # Agrupados por domínio
│ ├── Middleware/ # CheckFeature, CheckMemberLimit, HandleAdminInertiaRequests
│ └── Requests/ # Form Requests por domínio
├── Models/ # Tenant, Plan (central)
└── Providers/