Plataforma y configuración
Toda la configuración de productos vive en Admin → Settings (se almacena en platform_settings).
Cambiar las claves aquí no requiere recrear contenedores de Docker. Ruta: /dashboard/admin/settings (consulta de grupo, por ejemplo: ?group=payments).
Marcador de posición de captura de pantalla: Administrador → Configuración del shell con grupos izquierdo/verticales
Los elementos solo de infraestructura (DB, Redis, APP_URL, agente host) permanecen en .env; consulte 01.
SMTP
Requerido para una plataforma similar a producción: verificación, restablecimiento de contraseña, facturación, resultados de despliegue, notificaciones 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 |
Si el host SMTP está vacío, la aplicación puede recurrir al mailer de .env (a menudo en Docker — los mensajes van a los logs, no a las bandejas de entrada).
Cómo probar: configurar SMTP → abrir un usuario no verificado → reenviar la verificación → confirmar la bandeja de entrada.
GitHub
Solía extraer las versiones principales de NexoPOS y las fuentes de los módulos desde 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 |
NexoPOS público: el token es opcional para los límites de velocidad públicos, pero sigue siendo recomendable. Forks privados / módulos privados: crea un PAT detallado o clásico con acceso a repo (o lectura de contenido) y guárdalo aquí.
Las versiones de los módulos también se pueden cargar como un archivo ZIP sin GitHub.
Facturación (Pagos)
Solo una pasarela está activa para los cargos de pago y de ciclo de vida medio.
| 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 (ejemplo)
- Pasarela de pago activa → Stripe.
- Clave publicable, clave secreta, secreto del webhook.
- Punto final del webhook de producción: https://{APP_HOST}/webhooks/stripeEvents: checkout.session.completed, invoice.paid, invoice.payment_failed, customer.subscription.deleted (y cualquier evento adicional que espere tu controlador).
- Prueba local: Stripe CLI → ver
Paddle y Mollie siguen el mismo patrón (clave de API + secreto de webhook; Paddle también tiene un entorno de sandbox/producción).
Marcador de captura: Administrador → Configuración → Pagos — controlador activo + Stripe
Las instalaciones heredadas solo para entorno pueden importar una vez:
php artisan platform:import-env-settings
Luego, elimina los secretos del producto de .env.
Marca
| Field | Purpose |
|---|---|
| App name | Sidebar, titles, marketing |
| Logo (light / dark) | Theme-aware logos |
| Favicon | Browser tab |
Fecha y hora
Controla cómo se muestran las fechas en la interfaz de la capa de control y en los correos electrónicos (no en ISO sin procesar en 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 |
Almacenado como preferencias de la plataforma y compartido mediante las propiedades de plataforma de Inertia.
Página general y de suspensión
General
| 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 |
Implementaciones (límites + página sin conexión)
| 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 |
Cuando una instalación se suspende (fallo de pago, Términos de Servicio, ruta de reembolso, etc.), los visitantes ven la página de plataforma suspendida. Estos conmutadores controlan qué información de contacto y texto de motivo aparecen.
Marcador de captura: Administrador → Configuración → Alternar implementaciones / suspensión
S3 y copias de seguridad
Las copias de seguridad son solo almacenamiento compatible con S3 propiedad de la empresa (sin Drive/OneDrive del cliente en el 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 |
S3 de administrador incompleto no recurre en silencio al disco local para escrituras reales de respaldo. Use la acción de almacenamiento de prueba de Admin cuando esté disponible.
Grupo de copias de seguridad
| 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) |
Los clientes no pueden configurar su propio calendario de copias de seguridad; reciben copias de seguridad manuales y, además, copias automáticas de la plataforma cuando tienen derecho.
Catálogo: publica un complemento con copias de seguridad de la clave de función.
Dominio
| 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 |
Cuando el modo es complemento, los clientes necesitan un complemento de dominio personalizado activo (feature_key = custom_domain) antes de adjuntar un nombre de host.
Retención de facturación
| 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 |
El ciclo de vida está impulsado por la facturación programada: process-lifecycle (servicio de programador de Compose).
Notificaciones
| Field | Purpose |
|---|---|
| Email footer | Appended to outbound mail |
| Support URL | Link in emails / help surfaces |
Orden de configuración para una nueva plataforma
- Dominio — dominio base + IP pública
- SMTP — correo real
- Pagos — Stripe (o Paddle/Mollie) + webhooks
- GitHub — acceso a módulos principales
- S3 + copias de seguridad — si vendes un complemento de copias de seguridad
- Marca + fecha y hora — pulir
- Implementaciones / general: límites + página de suspensión
- Retención de facturación: ventanas de gracia y eliminación
Luego ejecuta `php artisan platform:launch-check`.