Configuração
.env e config/*.php: conexões de banco, DB_MAD_DRIVER, permissões.
O MAD framework é configurado do jeito Laravel: variáveis de ambiente
(.env) para segredos e valores por ambiente, e
config/mad.php para as opções específicas do framework
(substitui o antigo application.ini). As conexões de banco vivem em
config/database.php, como em qualquer app Laravel.
.env — variáveis de ambiente
Copie .env.example para .env (feito automaticamente por
composer setup) e ajuste por ambiente. Blocos mais relevantes:
APP_NAME=Laravel
APP_ENV=local
APP_KEY= # gerado por `php artisan key:generate`
APP_DEBUG=true
APP_URL=http://localhost
DB_CONNECTION=sqlite # ou mysql / mariadb / pgsql
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
SESSION_DRIVER=database
QUEUE_CONNECTION=database
CACHE_STORE=database
MAIL_MAILER=log # log | smtp | ...
.envnunca vai pro git. Já está no.gitignore— versione só o.env.example(sem segredos reais). Cada ambiente (dev, staging, produção) tem o seu próprio.
Conexões de banco — config/database.php
O MAD organiza dados em 6 conexões lógicas, declaradas em
config/database.php e usadas pelos models de cada domínio
($connection no model):
| Conexão | Domínio | Plano |
|---|---|---|
iam | Identidade, permissões, sistema, fila (jobs/failed_jobs) | Control — nunca repontado por tenant |
log | Auditoria, billing de IA | Control — nunca repontado por tenant |
business | Dados de negócio do app | Data — repontável por tenant |
comm | Comunicação (chat, correio, notificações) | Data — repontável por tenant |
ged | Documentos (GED) | Data — repontável por tenant |
ai | Conversas do agente | Data — repontável por tenant |
Por padrão todas apontam para o mesmo arquivo SQLite
(app/database/mad.sqlite) — zero configuração em dev. Pra separar
fisicamente uma conexão (arquivo ou servidor próprio), defina as variáveis dela no
.env:
# SQLite por conexão — arquivo próprio
DB_BUSINESS_DATABASE=/caminho/para/business.sqlite
# Servidor (mysql/mariadb/pgsql) compartilhado por todas as conexões MAD
DB_MAD_DRIVER=mysql
DB_MAD_HOST=127.0.0.1
DB_MAD_DATABASE=meu_app
DB_MAD_USERNAME=root
DB_MAD_PASSWORD=secret
# Ou host/banco/credencial só pra UMA conexão específica
DB_BUSINESS_HOST=db-business.internal
DB_BUSINESS_DATABASE=meu_app_business
# FK físicas por conexão MAD — default FALSE (integridade fica no app,
# porque não existe FK entre conexões diferentes)
DB_BUSINESS_FOREIGN_KEYS=true
FK desligada por padrão nas 6 conexões MAD.
config/database.phpusaenv("DB_<CONN>_FOREIGN_KEYS", false)— a integridade referencial é responsabilidade do app. A conexão default do Laravel é o oposto (env('DB_FOREIGN_KEYS', true)).
Não existem FKs entre conexões diferentes — separar fisicamente é seguro. Sem nenhuma
DB_<CONEXÃO>_*específica, cada uma cai noDB_MAD_*compartilhado (ou em SQLite, seDB_MAD_DRIVERnão estiver definido).
Engines suportados — DB_MAD_DRIVER
DB_MAD_DRIVER escolhe o engine das 6 conexões MAD de uma vez só
(sqlite por padrão; mysql, mariadb ou
pgsql apontam todas para um único servidor compartilhado). O schema é o
mesmo nos quatro engines — a migration consolidada traduz cada CREATE TABLE
para o dialeto certo em tempo de execução (tipos, autoincrement/serial, índices), então
trocar de engine não exige tocar em model nem em migration própria.
| Engine | DB_MAD_DRIVER | Observação |
|---|---|---|
| SQLite | sqlite (default) | Arquivo único — zero setup, indicado para dev e instalações pequenas. |
| MySQL | mysql | 8+. Charset utf8mb4 aplicado automaticamente. |
| MariaDB | mariadb | Mesmo caminho do MySQL. |
| PostgreSQL | pgsql | 13+. search_path e sslmode aplicados automaticamente. |
A conexão default do Laravel (DB_CONNECTION — tabelas de framework como
users, cache, sessions) é independente de
DB_MAD_DRIVER; configure as duas com o mesmo engine se quiser tudo no mesmo
servidor.
config/mad.php
Opções específicas do MAD que não são conexão de banco nem segredo simples — tema, locale, classes públicas, integrações, feature flags. Trechos relevantes:
return [
'general' => [
'timezone' => 'America/Sao_Paulo',
'theme' => 'theme-notch',
'locale' => 'pt-BR',
// SEGREDOS — sempre via getenv()/env(), nunca hard-coded em produção
'rest_key' => getenv('MAD_REST_KEY') ?: 'spike-dev-rest-key',
'main_database' => 'business',
],
'permission' => [
// Classes acessíveis sem login (anônimo + logado)
'public_classes' => [
'SystemModulesCheckView',
'RegistrationForm',
'PasswordResetForm',
'RequestPasswordResetForm',
],
],
'app_connections' => ['business', 'iam', 'comm', 'ged', 'ai', 'log'],
'routing' => [
'driver' => 'web', // classic | web (estrito) | hybrid
'prefix' => '/app',
],
];
public_classes — telas sem login
Lista classes do admin acessíveis sem autenticação. Qualquer controller
em app/control/ que precise responder antes do login (cadastro, recuperação
de senha, telas de diagnóstico) precisa estar nessa lista — fora dela, a rota exige sessão
autenticada.
Isso é só para as rotas do admin (
/app/*). O portal público (rotas emroutes/web.phpfora do grupo autenticado) controla acesso via middleware Laravel nas próprias rotas; a API REST (Route::apiResource) usa a MESMA sessãomad.authdo admin — só o Driver REST (HMAC) dispensa sessão. Ver Roteamento.
Filas, sessão e cache
São os drivers nativos do Laravel, configurados via .env — nada específico
do MAD aqui:
| Variável | Default | Descrição |
|---|---|---|
SESSION_DRIVER | database | Onde a sessão é persistida. |
QUEUE_CONNECTION | database | sync em testes (roda inline); database precisa de php artisan queue:work. |
CACHE_STORE | database | Backend do cache de aplicação. |
MAIL_MAILER | log | log grava em arquivo (dev); configure SMTP em produção. |
Observabilidade (MadTrace)
Erros e métricas de performance opcionais, desligados por padrão:
MADTRACE_ENABLED=false
MADTRACE_DSN=
MADTRACE_PERFORMANCE=true
MADTRACE_TRACES_SAMPLE_RATE=0.2
MADTRACE_SEND=async # shutdown | async | sync
Cache de config em produção
Depois de qualquer mudança em .env ou config/*.php em
produção, recompile os caches (closures não são permitidas em config quando cacheado):
php artisan config:cache
php artisan route:cache
php artisan view:cache
Próximos passos
- Estrutura do projeto — como o MAD organiza diretórios e classes.
- Deploy cPanel — subir pra hospedagem compartilhada.
- Roteamento — rotas públicas, middleware, CSRF.