Referência v3
Voltar à plataforma

Configuração do Ambiente

Todas as configurações ficam no arquivo .env. Nunca edite o código para mudar senhas ou chaves.

Criar o arquivo .env

bash
cp EXEMPLO.env .env
Nunca suba o .env para o Git

O arquivo .env já está no .gitignore. Ele contém senhas e secrets — nunca deve ser versionado.

Aplicação

VariávelExemploDescrição
APP_NAME"Vupi.us API"Nome da aplicação exibido no dashboard e e-mails.
APP_ENVproductionproduction, development ou testing. Em produção ativa validações extras de segurança.
APP_DEBUGfalsetrue exibe stack traces. Sempre false em produção.
APP_URLhttps://api.vupi.usURL base da API. Usada em e-mails, CORS e sitemap.
APP_URL_FRONTENDhttps://meusite.comURL do frontend. Adicionada automaticamente ao CORS.
APP_PORT3005Porta do servidor PHP.
APP_TIMEZONEAmerica/BahiaFuso horário para datas e logs.
CORS_ALLOWED_ORIGINShttps://meusite.comOrigens permitidas para CORS, separadas por vírgula.
TRUST_PROXYtruetrue quando há proxy reverso (Caddy/Nginx). Confia em X-Forwarded-Proto.

Banco de dados (core)

VariávelExemploDescrição
DB_CONEXAOpostgresqlDriver: postgresql ou mysql.
DB_HOSTlocalhostHost do banco de dados.
DB_PORT5432Porta. PostgreSQL: 5432, MySQL: 3306.
DB_NOMEvupi_dbNome do banco de dados.
DB_USUARIOadminUsuário do banco.
DB_SENHAsenha_forteSenha do banco. Mínimo 16 caracteres em produção com banco remoto.

Banco de dados (modules) — opcional

Permite que módulos externos usem um banco separado do core. Deixe DB2_NOME vazio para usar o mesmo banco do core.

VariávelDescrição
DB2_CONEXAODriver do segundo banco (postgresql ou mysql).
DB2_HOST, DB2_PORTHost e porta do segundo banco.
DB2_NOMENome do banco. Se vazio, usa o banco core.
DB2_USUARIO, DB2_SENHACredenciais do segundo banco.

Configurações Avançadas de Banco

VariávelPadrãoDescrição
DEFAULT_MODULE_CONNECTIONmodulescore ou modules. Define qual banco os módulos usam por padrão.
MIGRATE_LOCK_TIMEOUT10Timeout em segundos para obter o lock que evita migrations simultâneas.
Quando usar dois bancos?

Use DB2_* quando quiser separar dados do kernel (usuários, auth, auditoria) dos dados dos módulos (produtos, pedidos, etc.). Útil para compliance, backup seletivo ou performance.

JWT e Segurança

Secrets obrigatórios em produção

JWT_SECRET e JWT_API_SECRET devem ter no mínimo 32 caracteres. O sistema recusa iniciar em produção com valores fracos.

VariávelExemploDescrição
JWT_SECRETabc123...64charsSecret para tokens de usuários. Gere com openssl rand -hex 32.
JWT_API_SECRETxyz789...64charsSecret para tokens de admin_system. Deve ser diferente do JWT_SECRET.
JWT_ISSUERhttps://api.vupi.usIdentificador do emissor do token (claim iss). Validado em toda requisição.
JWT_AUDIENCEhttps://api.vupi.usAudiência do token (claim aud). Validado em toda requisição.
JWT_EXPIRATION_TIME3600Expiração do access token em segundos (padrão atual: 1 hora).
REFRESH_TOKEN_EXPIRATION_SECONDS2592000Expiração do refresh token (padrão: 30 dias).
COOKIE_SECUREtruetrue em produção com HTTPS. Cookies só enviados via HTTPS.
COOKIE_SAMESITELaxLax (mesmo domínio) ou None (domínios diferentes, requer Secure=true).

Key Rotation (Avançado)

O sistema suporta rotação de secrets JWT sem downtime. Tokens assinados com secrets antigos continuam válidos enquanto novos tokens usam o secret atual.

VariávelExemploDescrição
JWT_SECRET_KIDv2ID da chave ativa (v1, v2, v3...). Define qual secret usar para novos tokens.
JWT_SECRET_v1secret_antigoSecret anterior. Tokens assinados com v1 ainda são válidos.
JWT_SECRET_v2secret_atualSecret atual. Usado para assinar novos tokens quando KID=v2.
JWT_SECRET_v3secret_futuroSecret futuro (opcional). Permite preparar próxima rotação.
REVOCATION_STORAGEdatabasedatabase ou redis. Define onde armazenar tokens revogados.
Como fazer key rotation

1. Adicione JWT_SECRET_v2 com novo secret
2. Defina JWT_SECRET_KID=v2
3. Aguarde a expiração dos tokens antigos conforme JWT_EXPIRATION_TIME
4. Remova JWT_SECRET_v1 do .env

E-mail (SMTP)

VariávelExemploDescrição
MAILER_HOSTsmtp.gmail.comServidor SMTP.
MAILER_PORT587Porta SMTP. 587 para TLS, 465 para SSL.
MAILER_USERNAME[email protected]Usuário SMTP.
MAILER_PASSWORDapp_passwordSenha SMTP. Para Gmail, use uma App Password.
MAILER_FROM_EMAIL[email protected]E-mail remetente.
MAILER_FROM_NAME"Vupi.us API"Nome do remetente.

Admin padrão (seeder)

Obrigatório em produção

Em APP_ENV=production, o seeder aborta se ADMIN_PASSWORD estiver vazio. Em desenvolvimento usa Admin@123456 como padrão.

VariávelExemploDescrição
ADMIN_EMAIL[email protected]E-mail do administrador criado pelo seeder.
ADMIN_PASSWORDMinhaS3nh@Forte!Senha do admin. Obrigatório em produção.
ADMIN_NAMEAdministradorNome completo do admin.
ADMIN_USERNAMEadminUsername do admin.

Redis (opcional)

Configure Redis para habilitar rate limiting distribuído entre múltiplos containers. Sem Redis, o sistema usa armazenamento em arquivo (servidor único).

VariávelPadrãoDescrição
REDIS_HOSTvazioHost do Redis. Deixe vazio para usar file storage.
REDIS_PORT6379Porta do Redis.
REDIS_PASSWORDvazioSenha do Redis (se configurada).
REDIS_PREFIXvupi:Prefixo das chaves no Redis.

Vupi.us IDE

Configurações da IDE integrada para criação de módulos no navegador.

VariávelPadrãoDescrição
IDE_MAX_PROJECTS_PER_USER1Máximo de projetos por usuário. Use -1 para ilimitado e 0 para bloquear criação.

Integrações Externas

VariávelDescrição
GOOGLE_CLIENT_IDClient ID do Google Cloud Console (para OAuth no módulo LinkEncurtador).
SECURITY_ALERT_WEBHOOKURL do webhook para alertas de segurança (Slack, Discord, etc.). Opcional.
TURNSTILE_SITE_KEYChave pública usada pelo widget de login e recuperação de senha.
TURNSTILE_SECRETChave privada validada somente no servidor; nunca deve ir para o frontend ou Git.
TURNSTILE_HOSTNAMESHostnames aceitos na resposta da Cloudflare, separados por vírgula.
Configurar Google OAuth

1. Acesse Google Cloud Console
2. Crie um projeto ou selecione existente
3. Ative a API "Google+ API"
4. Crie credenciais OAuth 2.0
5. Adicione https://seudominio.com nas origens autorizadas

Gerar secrets JWT

bash
# Gera JWT_SECRET (64 chars hex)
openssl rand -hex 32

# Gera JWT_API_SECRET (64 chars hex)
openssl rand -hex 32

# Ou via CLI do projeto (gera automaticamente se vazios)
php vupi setup --auto --jwt=if-empty