Docs›Começando›Configuração
Começando

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 | ...

.env nunca 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ãoDomínioPlano
iamIdentidade, permissões, sistema, fila (jobs/failed_jobs)Control — nunca repontado por tenant
logAuditoria, billing de IAControl — nunca repontado por tenant
businessDados de negócio do appData — repontável por tenant
commComunicação (chat, correio, notificações)Data — repontável por tenant
gedDocumentos (GED)Data — repontável por tenant
aiConversas do agenteData — 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.php usa env("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 no DB_MAD_* compartilhado (ou em SQLite, se DB_MAD_DRIVER nã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.

EngineDB_MAD_DRIVERObservação
SQLitesqlite (default)Arquivo único — zero setup, indicado para dev e instalações pequenas.
MySQLmysql8+. Charset utf8mb4 aplicado automaticamente.
MariaDBmariadbMesmo caminho do MySQL.
PostgreSQLpgsql13+. 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 em routes/web.php fora do grupo autenticado) controla acesso via middleware Laravel nas próprias rotas; a API REST (Route::apiResource) usa a MESMA sessão mad.auth do 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ávelDefaultDescrição
SESSION_DRIVERdatabaseOnde a sessão é persistida.
QUEUE_CONNECTIONdatabasesync em testes (roda inline); database precisa de php artisan queue:work.
CACHE_STOREdatabaseBackend do cache de aplicação.
MAIL_MAILERloglog 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