Plataforma e Configurações
Toda a configuração do produto fica em Admin → Settings (armazenada em platform_settings).
Alterar as chaves aqui não exige recriar contêineres do Docker. Caminho: /dashboard/admin/settings (consulta de grupo, por exemplo ?group=payments).
Espaço reservado de captura de tela: Admin → Configurações com grupos à esquerda/verticais
Os itens apenas de infraestrutura (DB, Redis, APP_URL, agente host) permanecem em .env — veja 01.
SMTP
Necessário para uma plataforma semelhante à de produção: verificação, redefinição de senha, cobrança, resultados de implantação, notificações de reembolso.
| Field | Purpose |
|---|---|
| Host / Port | e.g. smtp.mailgun.org / 587 |
| Username / Password | Provider credentials (password encrypted) |
| Encryption | tls, ssl, or empty |
| From address / name | Outbound identity |
| Admin alert emails | Comma-separated ops alert recipients |
Se o host SMTP estiver vazio, o aplicativo pode recorrer ao .env mailer (geralmente no Docker — as mensagens vão para os logs, não para as caixas de entrada).
Como testar: configurar SMTP → abrir um usuário não verificado → reenviar verificação → confirmar a caixa de entrada.
GitHub
Antes, fazia download das versões principais do NexoPOS e das fontes dos módulos do GitHub.
| Field | Purpose |
|---|---|
| Personal access token | Required for private repos (and higher rate limits) |
| NexoPOS repository | owner/name (default open-source NexoPOS) |
| Visibility | public or private |
| Install channel | latest or pinned |
| Pinned version / ref | Used when channel is pinned |
| Release cache hours | Scheduler refresh interval (min 1h); manual refresh still allowed |
Público NexoPOS: o token é opcional para limites de taxa públicos, mas ainda é recomendado.Forks privadas / módulos privados: crie um PAT granular ou clássico com repo (ou leitura de conteúdo) e salve-o aqui.
As versões dos módulos também podem ser carregadas como um arquivo ZIP sem o GitHub.
Faturamento (Pagamentos)
Apenas um gateway está ativo para cobranças no checkout e ao longo do ciclo de vida.
| Provider | Status | Notes |
|---|---|---|
| Stripe | Implemented | Cards + Checkout; best default |
| Paddle | Implemented | Merchant of Record / Billing API |
| Mollie | Implemented | EU methods; first payment + recurring |
| Airwallex | Credentials only | Not selectable until a driver ships |
| Fake | Tests only | Never production; launch-check rejects |
Configurar Stripe (exemplo)
- Gateway de pagamento ativo → Stripe.
- Chave publicável, chave secreta, segredo do webhook.
- Endpoint de webhook de produção: https://{APP_HOST}/webhooks/stripeEvents: checkout.session.completed, invoice.paid, invoice.payment_failed, customer.subscription.deleted (e quaisquer eventos adicionais que o seu driver espera).
- Teste local: Stripe CLI → veja
Paddle e Mollie seguem o mesmo padrão (chave de API + segredo do webhook; a Paddle também tem ambiente de sandbox/produção).
Espaço reservado de captura de tela: Admin → Configurações → Pagamentos — driver ativo + Stripe
As instalações legadas apenas de ambiente podem importar uma vez:
php artisan platform:import-env-settings
Em seguida, remova os segredos do produto de .env.
Branding
| Field | Purpose |
|---|---|
| App name | Sidebar, titles, marketing |
| Logo (light / dark) | Theme-aware logos |
| Favicon | Browser tab |
Data e hora
Controla como as datas aparecem na interface do plano de controle e nos e-mails (não em ISO bruto no Vue).
| Field | Examples |
|---|---|
| Timezone | IANA, e.g. UTC, Africa/Douala, Europe/Paris |
| Date format | Y-m-d, d/m/Y, m/d/Y, d M Y |
| Time format | 24h or 12h |
Armazenado nas preferências da plataforma e compartilhado via props da plataforma Inertia.
Página geral e de suspensão
Geral
| Field | Purpose |
|---|---|
| Support email | Public contact; used on suspension page when enabled |
| Support phone / hours | Optional contact details |
| Two factor available | Allow customers to enable 2FA |
Implantações (limites + página offline)
| Field | Purpose |
|---|---|
| Default max installations | Applied to new personal orgs |
| Default max seats | Applied to new personal orgs |
| Show suspension reason | Offline/suspended tenant page |
| Show support email / phone / hours | Same offline page |
Quando uma instalação é suspensa (falha no pagamento, termos de serviço, caminho de reembolso etc.), os visitantes veem a página de plataforma suspensa. Esses controles determinam quais informações de contato e texto de motivo aparecem.
Espaço reservado do screenshot: Admin → Configurações → Alternâncias de implantações/suspensão
S3 e backups
Os backups são apenas armazenamento S3 compatível com a empresa (sem Drive/OneDrive do cliente no MVP).
Grupo S3
| Field | Purpose |
|---|---|
| Key / Secret | Access credentials (encrypted) |
| Region / Bucket | Destination |
| Endpoint | Empty for AWS; set for MinIO, R2, etc. |
| Path-style | Provider-specific |
O Admin S3 incompleto não faz fallback silencioso para o disco local para gravações reais de backup. Use a ação de armazenamento de teste do Admin quando disponível.
Grupo de backups
| Field | Purpose / default |
|---|---|
| Platform automatic backups | Progressive wave for installs with the Backups add-on |
| Schedule cron (UTC) | e.g. 0 3 * * * |
| Concurrency | 1–5 installs at a time |
| Keep last N | Retention of succeeded backups per install (default 3) |
Os clientes não podem definir o próprio cronograma de backup; eles recebem backups manuais + backups automáticos da plataforma quando tiverem direito.
Catálogo: publique um complemento com backups de chave de recurso.
Domínio
| Field | Purpose |
|---|---|
| Platform base domain | Suffix for free install hostnames |
| Custom domain mode | free / addon / disabled |
| Public IPv4 / IPv6 | Shown on customer Domain tab for DNS |
| Max verified domain changes / day | Per install; LE rate protection |
Quando o modo é addon, os clientes precisam de um add-on de domínio personalizado ativo (feature_key = custom_domain) antes de anexar um nome de host.
Retenção de cobrança
| Field | Default | Meaning |
|---|---|---|
| Grace period (days) | 3 | After trial/period end: install stays online with renewal banner, then suspend |
| Soft-delete retention (days) | 30 | After soft-delete (cancel path, etc.) before hard purge |
| Refund hard-delete (days) | 7 | After approved refund soft-delete before hard purge |
O ciclo de vida é acionado pela cobrança agendada: billing:process-lifecycle (serviço de agendamento do Compose).
Notificações
| Field | Purpose |
|---|---|
| Email footer | Appended to outbound mail |
| Support URL | Link in emails / help surfaces |
Ordem de configuração para uma nova plataforma
- Domínio — domínio base + IP público
- SMTP — correio real
- Pagamentos — Stripe (ou Paddle/Mollie) + webhooks
- GitHub — acesso a módulos principais
- S3 + Backups — se você vender o complemento de backup
- Branding + data e hora — polonês
- Implantações / geral — página de limites + suspensão
- Retenção de cobrança — janelas de carência e exclusão
Em seguida, execute o comando `php artisan platform:launch-check`.