Documentación / v1

De la primera solicitud
al despliegue en producción.

Empieza con una instalación local, conecta pagos y servicios externos, despliega en tu propia infraestructura y mantén la plataforma actualizada. Las guías para principiantes incluyen los clics en el panel de cada proveedor, no solo las variables de entorno.

27 guías 6 rutas ESfuente
Empieza aquí8 min de lectura

Descripción general de la plataforma

FastRestful es una plataforma de productos API orientada a producción. Combina un marketplace público, versiones de API con control de versiones, un gateway con medición, suscripciones y facturación, documentación, una consola para consumidores, un estudio para proveedores y un plano de control para el personal en un único sistema Django + frontend.

¿Es tu primera vez? Sigue la ruta para principiantes: Instalar en local, luego haz tu primera solicitud al gateway. Conecta pagos solo cuando quieras cobrar dinero, y lee Despliegue antes de hacerlo público.

Qué es FastRestful

FastRestful no es una sola API. Es la infraestructura de producto que rodea a las API: el escaparate, el límite del contrato, la ruta de la solicitud, el dinero, el contenido y las operaciones. Un equipo puede gestionar una sola API o un marketplace multivendedor desde la misma instalación.

SuperficieQuién la usaQué gestiona
Sitio públicoVisitantes y compradoresMarketplace, páginas de detalle de API, documentación, precios, blog, estado, perfiles de proveedores y páginas legales.
Consola del consumidorSuscriptores de APIAplicaciones, claves, suscripciones, explorador, solicitudes, analítica, facturas, equipo y soporte.
Estudio de proveedoresPublicadores de APIProductos, versiones, endpoints, planes, consumidores, monetización, pagos, portal y soporte.
Plano de control del personalOperadores de la plataformaTráfico, proveedores, facturación, pagos, soporte, moderación, CMS, anuncios, idiomas y auditoría.

Modos de un solo proveedor y multivendedor

La plataforma comienza en modo de un solo proveedor. Solo la organización marcada como proveedor de la plataforma puede publicar API públicas. Un superusuario puede activar el modo multivendedor en la configuración del sitio; después, cualquier organización con un perfil de proveedor aprobado podrá publicar.

  • Un solo proveedor: un negocio de API seleccionado, un proveedor de plataforma y una gobernanza más simple.
  • Multivendedor: marketplace al estilo RapidAPI donde proveedores independientes publican, fijan el precio y dan soporte a sus propias API.
  • El cambio se aplica en la capa de modelo, por lo que la API, el admin y el estudio de proveedores coinciden.
  • La incorporación de proveedores, la revisión de perfiles y la separación de funciones siguen activas en ambos modos.

Arquitectura de un vistazo

ruta de la solicitud
Browser / SDK
   │
   ├── public site + consoles ──► Django REST API ──► PostgreSQL
   │                                  │
   │                                  ├── Redis (cache, throttles, Celery)
   │                                  ├── S3 / CloudFront (media, specs)
   │                                  └── provider webhooks (payments, payouts)
   │
   └── API product request ──► metered gateway ──► vendor upstream
                                  │
                                  ├── API key + subscription
                                  ├── quota + rate limit + entitlement
                                  ├── SSRF checks + idempotency + retries
                                  └── usage event + redacted request log

El stack

CapaTecnología
BackendDjango 5.1+, Django REST Framework, SimpleJWT, drf-spectacular, Celery
FrontendReact 19, Next-compatible app router, Vite, TypeScript, Tailwind/shadcn primitives
Base de datosSQLite para desarrollo local; PostgreSQL 16 en producción
Caché / colaLocMem en local; Redis en producción; worker de Celery + beat para tareas programadas
AlmacenamientoSistema de archivos local por defecto; se recomienda S3 + CloudFront en producción
PagosStripe, PayPal, Flutterwave, Paystack, Razorpay
Correo electrónicoSMTP, SES, Mailgun, SendGrid, Postmark, Brevo, Mailjet, SparkPost, Resend

Principios del producto

  • El aislamiento de inquilinos es del lado del servidor. El espacio de trabajo activo es explícito, los permisos de objeto se vuelven a comprobar y los serializadores públicos están separados de los privados.
  • Las versiones son inmutables. Un contrato en producción no se puede editar en el lugar; crea una nueva versión y promuévela.
  • Prevalece la verdad del proveedor. La creación del checkout nunca otorga derecho de acceso; los webhooks firmados del proveedor liquidan el estado del dinero.
  • Las claves son secretos. Las claves de API sin procesar se muestran una vez, se aplican hash para su búsqueda y se cifran para su uso en el gateway del lado del servidor.
  • Las operaciones dejan evidencia. Los eventos de auditoría, los recibos de webhooks, los registros de solicitudes y las decisiones de moderación son de solo anexado cuando corresponde.
  • Un único sistema de diseño. Tokens de Signal Grid, superficies semánticas, metadatos monoespaciados y estados accesibles en todas las superficies.

Adónde ir después

Elige la ruta que corresponda a lo que estás haciendo. No necesitas leer toda la documentación en orden.

Quiero…Lee estas guías en orden
Verlo funcionando en localInstalación → Inicio rápido
Cobrar a los clientesPasarelas de pago → Facturación y pagos
Conectar correo electrónico, almacenamiento o SSOIntegraciones externas
Ponerlo en un servidor públicoDespliegue → Seguridad → Copias de seguridad y actualizaciones
Instalar actualizaciones oficialesLicencias y actualizaciones oficiales
Operar la plataforma día a díaOperaciones → Observabilidad → Solución de problemas

¿Estás evaluando el producto? Lee el inventario de funciones. ¿Buscas un endpoint específico? Usa la referencia de la API.

Empieza aquí10 min de lectura

Instala FastRestful en tu computadora

Una primera instalación completa para alguien que nunca ha ejecutado una aplicación Django o Node. Sigue los pasos en orden. Cada paso termina con una comprobación para que sepas que funcionó antes de continuar.

Antes de empezar

No necesitas Docker, Redis, almacenamiento en la nube ni una cuenta de pago para la demo local. SQLite y una caché en memoria mantienen simple la primera ejecución.

NecesitasPor quéCómo comprobarlo
Python 3.11Ejecuta el backend de Django.python3.11 --version
Node.js 22.13+Ejecuta el frontend y sus herramientas de compilación.node --version
GitDescarga el código fuente.git --version
Dos ventanas de terminalUna ejecuta el backend y la otra el frontend.Abre la terminal dos veces.
Mantén ambos servidores en ejecución. El backend y el frontend son procesos separados. Cerrar una terminal detiene ese proceso. Usa Ctrl+C en una terminal para detener un servidor cuando termines.

1. Comprueba tus herramientas

Ejecuta estos comandos en tu terminal. Si falta alguno, instálalo primero y vuelve a abrir la terminal.

comprobar versiones
python3.11 --version
node --version
npm --version
git --version

Deberías ver Python 3.11, Node 22.13 o superior y una versión de npm. Si no se encuentra python3.11, instala Python 3.11 desde python.org. Si Node es anterior a 22.13, instala la versión LTS actual desde nodejs.org.

Windows: usa py -3.11 siempre que esta guía indique python3.11, y activa el entorno con .venv\Scripts\Activate.ps1.

2. Descarga el código

shell
git clone <your-fastrestful-repository> fastrestful
cd fastrestful
npm ci

npm ci instala las versiones exactas de las dependencias del frontend desde el archivo de bloqueo. Puede tardar unos minutos. Deberías terminar con una carpeta node_modules y sin mensajes de error.

3. Crea el entorno del backend

Un entorno virtual mantiene los paquetes de Python de FastRestful separados del resto de tu computadora.

shell
cd backend
python3.11 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

En Windows PowerShell, activa con .venv\Scripts\Activate.ps1 en lugar de source .venv/bin/activate. Cuando el entorno está activo, tu prompt suele comenzar con (.venv).

Punto de control: ejecuta python3.11 -m django --version. Debe mostrar una versión de Django 5.x. Si falla, el entorno virtual no está activo o la instalación no se completó.

4. Crea el archivo de configuración del backend

Copia el archivo de ejemplo, luego genera dos secretos y pégalos en backend/.env.

shell
cp .env.example .env
python3.11 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
python3.11 -c "import secrets; print(secrets.token_urlsafe(64))"
  1. Abre backend/.env en cualquier editor de texto.
  2. Pega la primera salida en FIELD_ENCRYPTION_KEY=. Esto cifra las claves de API y los secretos de proveedores.
  3. Pega la segunda salida en DJANGO_SECRET_KEY=.
  4. Deja DJANGO_DEBUG=True, DATABASE_URL=sqlite:///db.sqlite3 y FRONTEND_URL=http://localhost:5055 para el desarrollo local.
Nunca hagas commit de .env. Contiene secretos. El repositorio ya lo ignora. Si más adelante cambias el puerto del frontend, actualiza FRONTEND_URL, CORS_ALLOWED_ORIGINS, y CSRF_TRUSTED_ORIGINS para que coincidan.

5. Crea la base de datos y los datos de demostración

Asegúrate de que el entorno virtual siga activo y de que estés dentro de backend/.

shell
python3.11 manage.py migrate
python3.11 manage.py seed_demo
python3.11 manage.py seed_apis
python3.11 manage.py seed_docs
python3.11 manage.py seed_engagement

migrate crea las tablas de la base de datos. Los comandos de seed crean un marketplace de demostración, productos de API, contenido de documentación y perfiles de comunidad. Esto crea un archivo local backend/db.sqlite3.

Credenciales solo para local. seed_demo crea el superusuario admin / Admin12345!. La semilla de engagement crea perfiles de builder con la contraseña Demo12345!. Nunca reutilices estas credenciales en producción.

6. Inicia el backend

terminal 1
# inside backend/, with the virtual environment active
python3.11 manage.py runserver 127.0.0.1:5056

Deja esta terminal abierta. El backend está listo cuando imprime Starting development server at http://127.0.0.1:5056/. Compruébalo en otra terminal con:

comprobar backend
curl http://127.0.0.1:5056/api/health/live

7. Inicia el frontend

Abre la segunda terminal y vuelve a la raíz del repositorio. El backend debe seguir ejecutándose en la terminal 1.

terminal 2
cd /path/to/fastrestful
npm run dev -- --port 5055 --host 127.0.0.1

El servidor de desarrollo de Vite redirige las rutas de Django (/api/v1, /api/health, /api/schema, /api/docs, /admin, /static, /media) al backend en el puerto 5056. Las páginas públicas de productos como /api/{slug} siguen siendo servidas por el frontend.

8. Abre la aplicación e inicia sesión

Abre estas direcciones en tu navegador:

PáginaDirecciónQué es
Sitio públicohttp://127.0.0.1:5055Marketplace y sitio de marketing.
Plano de controlhttp://127.0.0.1:5055/admin/Admin de Django y operaciones de FastRestful.
Documentación de la APIhttp://127.0.0.1:5056/api/docs/Swagger UI para la API de la plataforma.
Comprobación de estadohttp://127.0.0.1:5056/api/health/readyPreparación para las comprobaciones de despliegue.

Inicia sesión en el plano de control con admin / Admin12345!.

Lista de comprobación de la primera ejecución

  • El sitio público carga y el catálogo del marketplace es visible.
  • El plano de control se abre y puedes iniciar sesión como admin.
  • Configuración del sitio, Planes de plataforma y la sección de contenido del sitio se abren sin errores.
  • Una cuenta de consumidor puede crear una aplicación y una clave de API.
  • Una solicitud a través del gateway aparece en los registros de solicitudes.

Qué hacer a continuación

Problemas comunes de instalación

SíntomaCausa probableSolución
python3.11: command not foundPython 3.11 no está instalado o no está en tu PATH.Instala Python 3.11, vuelve a abrir la terminal y ejecuta la comprobación de nuevo.
npm ci falla con un error de motorNode.js es anterior a 22.13.Instala Node 22.13+ y ejecuta npm ci de nuevo.
ModuleNotFoundError: djangoEl entorno virtual no está activo.Ejecuta source .venv/bin/activate dentro de backend/.
Error de FIELD_ENCRYPTION_KEYLa clave falta o no se pegó correctamente.Genera una nueva clave Fernet y pega el valor completo sin comillas.
El puerto 5055 o 5056 ya está en usoOtro proceso está usando el puerto.Detén el otro proceso, o elige nuevos puertos y actualiza FRONTEND_URL, CORS y los valores de CSRF.
La página carga pero las llamadas a la API fallanEl backend no está en ejecución.Inicia la terminal 1 con runserver y confirma la URL de estado.
Se rechaza el inicio de sesión de adminNo se ejecutó el seed de demostración o se está usando otra base de datos.Ejecuta seed_demo, o crea tu propia cuenta con python3.11 manage.py createsuperuser.
Reinicio local. Si quieres empezar de cero solo en tu máquina local, detén el backend, elimina backend/db.sqlite3, luego vuelve a ejecutar migrate y los comandos de semilla. Nunca elimines una base de datos de producción.
Empieza aquí8 min de lectura

Inicio rápido: tu primera solicitud al gateway

Pasa de una instalación local limpia a una llamada de API con medición. Te suscribirás a una API de demostración, crearás una clave, enviarás una solicitud y verás el evento de uso y el registro de la solicitud.

Antes de comenzar: terminen Instalación y mantén ambas terminales en ejecución. El backend debe estar en 127.0.0.1:5056 y el frontend en 127.0.0.1:5055.

1. Inicia sesión y elige un espacio de trabajo

Abre http://127.0.0.1:5055 e inicia sesión con admin / Admin12345!, o registra una cuenta nueva. Un espacio de trabajo (organización) agrupa tus aplicaciones, claves, suscripciones y facturas.

El espacio de trabajo activo viaja en el encabezado X-Organization para las llamadas a la API. La consola del navegador lo establece automáticamente. Cuando llames a la API por tu cuenta, debes incluirlo, a menos que la solicitud use una clave de API en lugar de una sesión de navegador.

2. Suscríbete a un producto

Abre el marketplace, elige un producto con una versión publicada y selecciona un plan. El producto SignalStack incluido en el seed tiene una versión 2.4.0 publicada y tres planes.

Si el plan es gratuito, la activación es inmediata. Si el plan es de pago, FastRestful abre el proveedor de pago configurado. Una redirección del navegador nunca otorga acceso por sí sola: la suscripción se activa solo después de que un webhook firmado del proveedor liquide la primera factura.

¿Aún no tienes un proveedor de pago? Usa un plan gratuito para tu primera solicitud. Para vender planes de pago, sigue Pasarelas de pago, paso a paso primero.

3. Crea una aplicación y una clave

En la consola del consumidor, crea una aplicación y luego emite una clave de API. La clave sin procesar se muestra una vez, así que cópiala de inmediato en un gestor de contraseñas o en un archivo local .env.

formato de la clave sin procesar
fr_live_<random-secret>

# Store it in a secret manager or local .env file.
# Never commit it to a repository or paste it into a public issue.

Los scopes son full, execute o read. Elige el scope más restrictivo que funcione. Si pierdes la clave, revócala y emite una nueva; la clave anterior deja de funcionar de inmediato.

4. Envía una solicitud a través del gateway

Reemplaza fr_live_… con la clave que acabas de crear. Este ejemplo usa el producto SignalStack incluido en el seed y su alias de ruta.

curl mediante el alias de ruta del producto
curl --request GET \
  --url 'http://127.0.0.1:5055/api/v1/signal-stack/v2/deliveries?limit=10' \
  --header 'X-API-Key: fr_live_…' \
  --header 'Idempotency-Key: quickstart-001'

Con el enrutamiento por host de producto habilitado, la misma solicitud usa https://{product-slug}.{FASTRESTFUL_API_HOST_SUFFIX}/.... Ambas puertas de entrada comparten la misma suscripción, cuota, límite de velocidad, idempotencia, medición y pipeline de registro de solicitudes.

Pestaña de prueba de API de FastRestful con lista de endpoints, banner de gateway seguro y controles de solicitudes en vivo
La página pública de la API mantiene el probador, el contrato del endpoint y el contexto de la solicitud en una sola pestaña.

5. Inspecciona el resultado

  • Evento de uso: registrado del lado del servidor con estado y latencia.
  • Contador mensual: incrementado para la aplicación de cuotas y el excedente.
  • Registro de la solicitud: vistas previas redactadas de la solicitud y la respuesta, visibles para el consumidor y el proveedor.
  • Panel: solicitudes, tasa de éxito, gasto, latencia, API principales y actividad reciente.

Abre el panel del consumidor y el registro de solicitudes. Deberías ver la solicitud que acabas de hacer. Si no la ves, revisa la terminal que ejecuta el backend por si hay un traceback.

6. Publica una versión (opcional)

En el estudio de proveedores, abre el banco de trabajo de un producto, importa un contrato OpenAPI en una versión en borrador, concilia la documentación de los endpoints, ejecuta el diff, envía a revisión y promociona. Una versión publicada requiere un contrato OpenAPI compatible y no vacío, y un catálogo de endpoints que coincida exactamente.

Para conocer el ciclo de vida completo, lee Productos de API y versiones.

Si la solicitud falla

RespuestaQué suele significarQué hacer
401La clave falta, está revocada o tiene un formato incorrecto.Copia la clave completa de nuevo. No incluyas comillas ni un espacio final.
403La suscripción está inactiva o el scope de la clave es demasiado restrictivo.Confirma que el plan esté activo y que la clave tenga el scope execute o full.
404El método y la ruta no coinciden con la versión publicada.Comprueba el endpoint en la página de la API y confirma que la versión esté publicada.
429Se superó la cuota del plan o el límite de velocidad.Lee retry_after y espera, o usa un plan mayor.
Error de CORS o CSRF en un navegadorEl origen del navegador no es de confianza.Agrega el origen del frontend a CORS_ALLOWED_ORIGINS y CSRF_TRUSTED_ORIGINS. Las llamadas al gateway que usan X-API-Key no utilizan cookies del navegador.
Empieza aquí14 min de lectura

Configuración, sin agobios

La mayoría de las instalaciones solo necesitan un pequeño conjunto de ajustes para funcionar. Empieza con el mínimo que se indica abajo y luego agrega las integraciones que realmente uses. Las tablas extensas que aparecen más adelante son de referencia, no una lista de comprobación.

Dónde viven los ajustes

UbicaciónÚsalo paraCuándo se aplica
backend/.envSecretos, base de datos, Redis, claves de pago, SSO, almacenamiento.Reinicia el backend después de cambiarlo.
Admin → Pasarelas de pagoCredenciales de cobro y pago.Anula campo por campo los valores de .env que coincidan. Sin reinicio.
Admin → Newsletter → Ajustes de correoProveedor de correo para campañas e identidad del remitente.Anula el remitente del entorno para las campañas.
Admin → Configuración del sitioMarca, navegación, enrutamiento por host, modo de mantenimiento y comportamiento del sitio.Se aplica de inmediato, a menos que el ajuste esté en caché o integrado en el frontend.
Variables de compilación del frontendValores de NEXT_PUBLIC_* como la URL pública de la API.Se integran en el momento de la compilación. Recompila el frontend después de cambiarlos.

Ajustes locales mínimos

Después de copiar .env.example, estos son los únicos valores que debes cambiar para la demo local:

backend/.env
DJANGO_DEBUG=True
DJANGO_SECRET_KEY=<generated-random-value>
FIELD_ENCRYPTION_KEY=<generated-fernet-key>
DATABASE_URL=sqlite:///db.sqlite3
FRONTEND_URL=http://localhost:5055
CORS_ALLOWED_ORIGINS=http://localhost:5055,http://127.0.0.1:5055
CSRF_TRUSTED_ORIGINS=http://localhost:5055,http://127.0.0.1:5055

Genera las dos claves con los comandos de Instalación → Crear el archivo de configuración del backend.

Ajustes mínimos de producción

Producción añade PostgreSQL, Redis, un nombre de host real y orígenes HTTPS. Reemplaza cada marcador de posición con tus propios valores.

entorno del backend de producción
DJANGO_DEBUG=False
DJANGO_SECRET_KEY=<50-plus-random-characters>
DJANGO_ALLOWED_HOSTS=api.example.com,www.example.com
DATABASE_URL=postgresql://user:password@db-host:5432/fastrestful
REDIS_URL=redis://redis-host:6379/0
FRONTEND_URL=https://www.example.com
CORS_ALLOWED_ORIGINS=https://www.example.com
CSRF_TRUSTED_ORIGINS=https://www.example.com
FIELD_ENCRYPTION_KEY=<fernet-key>
No uses SQLite en producción. Cuando DJANGO_DEBUG=False, FastRestful requiere PostgreSQL y una URL de Redis compartida. Consulta Despliegue para ver la secuencia completa.

Cómo cambiar los ajustes de forma segura

  1. Cambia una integración a la vez.

    Configura, prueba y verifica antes de pasar al siguiente proveedor. Así los fallos son evidentes.

  2. Edita backend/.env en el servidor.

    No edites archivos dentro de un contenedor en ejecución que será reemplazado. Cuando sea posible, guarda los secretos en el almacén de secretos de tu plataforma de despliegue.

  3. Reinicia el backend y los workers.

    Los cambios de entorno se leen al iniciar el proceso. Reinicia Gunicorn, el worker de Celery y Celery beat después de editar .env.

  4. Recompila el frontend para los cambios de NEXT_PUBLIC_*.

    Los valores públicos del frontend se compilan en la build. Reiniciar el frontend no es suficiente.

  5. Ejecuta la acción de prueba del proveedor.

    Usa el checkout de prueba, el correo de prueba o el registro de entregas de webhooks antes de enviar tráfico real.

Referencia de variables de entorno principales

VariablePredeterminadoPropósito
DJANGO_SECRET_KEYclave solo para desarrolloDebe tener 50 caracteres o más en producción.
DJANGO_DEBUGTrueEstablece False en producción. Habilita el comportamiento de cookies seguras, HSTS y HTTPS.
DJANGO_ALLOWED_HOSTSlocalhost,127.0.0.1,testserverNombres de host separados por comas. Incluye hosts de API comodín cuando uses subdominios de producto.
DATABASE_URLsqlite:///db.sqlite3SQLite en local; PostgreSQL en producción. Producción falla sin PostgreSQL.
REDIS_URLvacíoCaché compartida y broker predeterminado de Celery. Obligatorio en producción.
CELERY_BROKER_URLREDIS_URLURL opcional de un broker separado.
FRONTEND_URLhttp://localhost:5055Origen público del frontend, base de retorno del checkout y fallback de seguimiento. Debe ser HTTPS en producción.
FRONTEND_PREVIEW_URLFRONTEND_URLURL base que usan las vistas previas de recursos personalizados del admin.
FIELD_ENCRYPTION_KEYvacíoClave Fernet para cifrar claves de API y secretos de proveedores. Obligatoria en producción.
CORS_ALLOWED_ORIGINSlocal 3000/5055/5173Orígenes de navegador separados por comas autorizados a llamar a la API.
CSRF_TRUSTED_ORIGINSrefleja CORSOrígenes de navegador con credenciales de confianza para solicitudes que modifican estado.
SECURE_REFERRER_POLICYstrict-origin-when-cross-originEncabezado de política de referrer.

Entorno del frontend

VariablePropósito
NEXT_PUBLIC_API_URLOrigen de la API de Django para despliegues separados. Omítelo para rutas del mismo origen.
NEXT_PUBLIC_SITE_URLOrigen público canónico del frontend para metadatos, sitemap, robots y URLs de Open Graph.
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEYClave publicable de Stripe para la interfaz de tarjeta embebida. Stripe.js se carga desde el CDN; sin dependencia de npm.
FASTRESTFUL_DEV_BACKEND_URLDestino opcional del proxy de desarrollo. Por defecto, http://127.0.0.1:5056.
FASTRESTFUL_ADMIN_ORIGINSOrígenes de admin permitidos para vistas previas de recursos personalizados en iframe.

Gateway y enrutamiento por host

VariablePredeterminadoPropósito
GATEWAY_TIMEOUT_SECONDS15Tiempo de espera de la solicitud ascendente.
GATEWAY_MAX_BODY_BYTES262144Tamaño máximo del cuerpo entrante.
GATEWAY_MAX_UPLOAD_BYTES5242880Límite combinado de carga multipart.
GATEWAY_MAX_RETRIES1Presupuesto de reintentos para fallos transitorios seguros.
GATEWAY_RETRY_BACKOFF_SECONDS0.05Retardo entre reintentos.
GATEWAY_IDEMPOTENCY_TTL_SECONDS86400Vida útil de la caché de reproducción.
GATEWAY_CIRCUIT_FAILURE_THRESHOLD3Fallos antes de que se abra el circuito.
GATEWAY_CIRCUIT_WINDOW_SECONDS60Ventana de conteo de fallos.
GATEWAY_CIRCUIT_COOLDOWN_SECONDS30Tiempo de espera con el circuito abierto.
GATEWAY_TRUSTED_PROXY_CIDRSvacíoProxies de confianza autorizados a proporcionar encabezados de IP del cliente.
GATEWAY_MEDIA_PREVIEW_BYTES1500000Tamaño máximo de la vista previa de medios en base64 capturada para la consola.
FASTRESTFUL_API_HOST_SUFFIXvacíoHabilita el enrutamiento directo {product}.{suffix}. Si está vacío, solo se conserva el alias de ruta.

Autenticación y SSO

VariablePropósito
SSO_ISSUERURL del emisor OIDC. Si no se define, se oculta el botón OIDC.
SSO_CLIENT_ID / SSO_CLIENT_SECRETCredenciales de cliente OIDC.
SSO_SAML_ENABLEDHabilita los endpoints SP de SAML 2.0. Requiere lxml.
SSO_SAML_ENTITY_IDID de entidad del proveedor de servicios SAML. Predeterminado: fastrestful.
SSO_SAML_SSO_URLURL de SSO del proveedor de identidad.
SSO_SAML_IDP_CERTCertificado X.509 PEM del proveedor de identidad.
SSO_SAML_AUDIENCERestricción de audiencia opcional.
ORGANIZATION_INVITE_DAYSVida útil de la invitación en días. Predeterminado: 7.

Correo electrónico y newsletters

VariablePropósito
EMAIL_BACKENDBackend de consola en depuración; backend SMTP en producción de forma predeterminada.
EMAIL_HOST / EMAIL_PORTHost y puerto SMTP.
EMAIL_HOST_USER / EMAIL_HOST_PASSWORDCredenciales SMTP.
EMAIL_USE_TLSHabilita STARTTLS. Predeterminado: true.
ALERT_FROM_EMAILRemitente predeterminado e identidad de alertas.
NEWSLETTER_TRACKING_BASE_URLOrigen público para píxeles de seguimiento, redirecciones de clics y enlaces de baja. Si falta, usa FRONTEND_URL.

Los ajustes SMTP de la newsletter también se pueden guardar en el estudio de newsletters y anulan el remitente del entorno para las campañas. Consulta Estudio de newsletters.

Referencia de pagos y desembolsos

¿Buscas instrucciones de configuración? Las variables siguientes son solo la referencia. Para ver los pasos detallados del panel de cada proveedor, los eventos de webhook, la verificación de webhooks de PayPal y los pagos de prueba, usa Pasarelas de pago, paso a paso.
Grupo de variablesVariables
StripeSTRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_API_BASE opcional
PayPalPAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET, PAYPAL_WEBHOOK_ID, PAYPAL_ENV, PAYPAL_API_BASE opcional
FlutterwaveFLUTTERWAVE_PUBLIC_KEY, FLUTTERWAVE_SECRET_KEY, FLUTTERWAVE_WEBHOOK_SECRET, FLUTTERWAVE_API_BASE opcional
PaystackPAYSTACK_PUBLIC_KEY, PAYSTACK_SECRET_KEY, PAYSTACK_WEBHOOK_SECRET, PAYSTACK_API_BASE opcional
RazorpayRAZORPAY_KEY_ID, RAZORPAY_KEY_SECRET, RAZORPAY_WEBHOOK_SECRET, RAZORPAY_API_BASE opcional
PagosPAYOUT_PROVIDER lista de permitidos opcional, separada por comas: stripe, paypal

Admin → Pasarelas de pago guarda las mismas credenciales en la base de datos. Un registro de la base de datos anula el campo del entorno campo por campo, y deshabilitarlo apaga el proveedor en todas partes aunque las claves del entorno sigan definidas.

Almacenamiento de medios y especificaciones

VariablePropósito
MEDIA_STORAGElocal o s3.
MEDIA_S3_BUCKET / MEDIA_S3_REGIONBucket y región de S3.
MEDIA_S3_ENDPOINT_URLEndpoint personalizado compatible con S3.
MEDIA_S3_ACLACL directa de S3 opcional. Omítela cuando uses CloudFront con OAC.
MEDIA_CDN_DOMAINDominio de CloudFront u otra CDN.
MEDIA_CDN_DISTRIBUTION_IDHabilita acciones de purga por recurso.
SPEC_STORAGEdb o s3 para los blobs de contratos OpenAPI.
SPEC_S3_BUCKET / SPEC_S3_PREFIX / SPEC_S3_REGIONDestino y prefijo de los blobs de especificaciones. El modo S3 necesita boto3.

SHORTLINK_BASE_URL establece el origen público de los enlaces cortos, por ejemplo https://go.example.com. Cuando está vacío, usa NEWSLETTER_TRACKING_BASE_URL y luego FRONTEND_URL. El comando checklinks se puede programar desde cron o Celery beat.

Precedencia y recargas

  • Los valores de entorno proporcionan los valores predeterminados del despliegue; los registros de gateway del admin anulan campo por campo.
  • Los cambios del entorno del backend requieren reiniciar el proceso. Algunos ajustes en caché (indicador de mantenimiento, idioma de origen) se borran automáticamente al guardar el modelo.
  • Las variables públicas del frontend se integran en el momento de la compilación. Recompila después de cambiar los valores de NEXT_PUBLIC_*.
  • Después de cambiar lib/i18n/*.json, ejecuta npm run export:i18n y reinicia el backend para que su paquete de origen en caché esté actualizado.
Despliegue y operación16 min de lectura

Despliegue

Lleva FastRestful de una demo local con SQLite a un despliegue en producción con PostgreSQL, Redis, almacenamiento de objetos, un servidor WSGI, TLS y un frontend estático. La plataforma está diseñada para autoalojarse.

Antes de desplegar

  • Un nombre de dominio y acceso a DNS para los hosts del frontend y de la API.
  • Una base de datos PostgreSQL 16 y una instancia de Redis 7.
  • Terminación HTTPS, ya sea en tu proxy o en el edge.
  • Un DJANGO_SECRET_KEY generado y un FIELD_ENCRYPTION_KEY respaldado.
  • Un plan para el almacenamiento de medios: el disco local solo es aceptable para una prueba en un único servidor; usa almacenamiento compatible con S3 para despliegues reales.
  • Un destino de copias de seguridad fuera del servidor de aplicaciones.

Orden recomendado

  1. Despliega el backend y la base de datos.

    Haz que /api/health/ready pase antes de tocar el frontend.

  2. Despliega el frontend.

    Apúntalo al origen de la API y agrega el origen del frontend a los ajustes de CORS y CSRF.

  3. Configura el correo y el almacenamiento.

    Usa Integraciones externas. Verifica un correo de prueba y una carga de prueba.

  4. Conecta los pagos solo cuando estés listo para vender.

    Usa Pasarelas de pago, paso a paso y completa primero el checkout de prueba.

  5. Activa la licencia y programa los heartbeats.

    Usa Licencias y actualizaciones oficiales.

  6. Configura copias de seguridad y monitorización.

    Usa Copias de seguridad y actualizaciones y Observabilidad.

Topología recomendada

topología de producción
Internet
  │
  ├── app.example.com ──► frontend (static/CDN or Node runtime)
  │                           │
  │                           └── /api/* ──► reverse proxy ──► Gunicorn / Django
  │
  ├── api.example.com ──► reverse proxy ──► Gunicorn / Django
  ├── *.api.example.com ──► wildcard product gateway
  │
  ├── PostgreSQL 16 (primary)
  ├── Redis 7 (cache + Celery broker)
  ├── S3 + CloudFront (media, optional specs)
  └── Celery worker + beat (billing, moderation, email, availability)

Puedes servir el frontend y la API desde un mismo origen o separarlos. Si los separas, establece NEXT_PUBLIC_API_URL en el origen de la API, agrega el origen del frontend a CORS_ALLOWED_ORIGINS y CSRF_TRUSTED_ORIGINS, y establece FRONTEND_URL en el origen público del frontend.

Docker Compose

El repositorio incluye un archivo Compose con PostgreSQL, la API, Redis y perfiles opcionales de worker/beat.

Compose ejecuta el stack del backend, no el frontend. Compila el frontend por separado y alójalo en tu host estático o CDN, o añade un servicio de frontend a tu propio archivo Compose. El contenedor de la API ejecuta las migraciones y Gunicorn en el puerto 8000.
shell
export DJANGO_SECRET_KEY="$(openssl rand -base64 64 | tr -d '\n')"
export FIELD_ENCRYPTION_KEY="$(python3.11 -c 'from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())')"
export DJANGO_ALLOWED_HOSTS="api.example.com,.api.example.com"
export CORS_ALLOWED_ORIGINS="https://app.example.com"
export CSRF_TRUSTED_ORIGINS="https://app.example.com"
export FRONTEND_URL="https://app.example.com"
export POSTGRES_PASSWORD="$(openssl rand -hex 24)"

docker compose up --build -d
docker compose --profile scheduler up --build -d

Ejecuta las migraciones y los seeds dentro del contenedor de la API después de que la base de datos esté sana:

shell
docker compose exec api python manage.py migrate --noinput
docker compose exec api python manage.py seed_demo
docker compose exec api python manage.py seed_apis
docker compose exec api python manage.py seed_docs
docker compose exec api python manage.py collectstatic --noinput
Cambia la contraseña del seed de inmediato para cualquier despliegue expuesto a internet. No ejecutes semillas de demostración en producción a menos que tengas la intención de conservar los datos de demostración.

Configuración manual de producción

Backend

shell
cd /srv/fastrestful/backend
python3.11 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip install gunicorn>=22.0 boto3 django-storages  # optional: S3 media

cp .env.example .env
# Fill production values, then:
python3.11 manage.py migrate --noinput
python3.11 manage.py collectstatic --noinput
python3.11 manage.py check --deploy

Gunicorn + systemd

/etc/systemd/system/fastrestful.service
[Unit]
Description=FastRestful Django API
After=network.target postgresql.service redis.service

[Service]
User=fastrestful
Group=fastrestful
WorkingDirectory=/srv/fastrestful/backend
EnvironmentFile=/srv/fastrestful/backend/.env
ExecStart=/srv/fastrestful/backend/.venv/bin/gunicorn \
  config.wsgi:application \
  --bind 127.0.0.1:8000 \
  --workers 3 \
  --timeout 60
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
shell
sudo systemctl daemon-reload
sudo systemctl enable --now fastrestful
sudo systemctl status fastrestful

Proxy inverso Nginx

/etc/nginx/sites-available/fastrestful
server {
    listen 443 ssl http2;
    server_name api.example.com;

    ssl_certificate     /etc/letsencrypt/live/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;

    client_max_body_size 8m;

    location /static/ {
        alias /srv/fastrestful/backend/staticfiles/;
        expires 30d;
        access_log off;
    }

    location /media/ {
        alias /srv/fastrestful/backend/media/;
        expires 7d;
        access_log off;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 65s;
    }
}

server {
    listen 80;
    server_name api.example.com;
    return 301 https://$host$request_uri;
}

Host de producto comodín

/etc/nginx/sites-available/fastrestful-products
server {
    listen 443 ssl http2;
    server_name *.api.example.com;

    ssl_certificate     /etc/letsencrypt/live/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;  # product slug comes from this host
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Agrega un registro DNS comodín, emite un certificado comodín con un desafío DNS-01 e incluye el host comodín en DJANGO_ALLOWED_HOSTS. Establece FASTRESTFUL_API_HOST_SUFFIX=api.example.com.

Compilación y alojamiento del frontend

shell
export NEXT_PUBLIC_API_URL="https://api.example.com"
export NEXT_PUBLIC_SITE_URL="https://app.example.com"
export NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="pk_live_..."
npm run build

Despliega la salida de la compilación en tu host estático o en un entorno de ejecución compatible con Node. La build es autocontenida y no requiere un plano de control de sitio gestionado. Si usas Cloudflare, vincula D1/Images solo cuando el despliegue necesite esas funciones.

Archivos estáticos y multimedia

  • Estáticos: ejecuta collectstatic, sirve /static/ desde Nginx o tu CDN.
  • Medios locales: sirve /media/ desde Nginx para despliegues pequeños.
  • Medios en producción: usa S3 + CloudFront con OAC, mantén el bucket privado, establece MEDIA_STORAGE=s3 y no establezcas MEDIA_S3_ACL a menos que sirvas directamente desde S3.
  • Especificaciones: deja SPEC_STORAGE=db para una instalación pequeña; usa S3 para archivos de contratos más grandes.

Comprobaciones de estado

SondaEsperado
GET /api/health/liveVitalidad del proceso. Sin dependencia de la base de datos.
GET /api/health/readyPreparación de la base de datos y la caché compartida. Devuelve 503 con la dependencia que falla.
GET /api/schema/Esquema OpenAPI. Útil para comprobaciones rápidas de despliegue.

Actualizaciones y copias de seguridad

secuencia de actualización segura
# 1. Back up PostgreSQL and media
pg_dump --format=custom "$DATABASE_URL" > fastrestful-$(date +%F).dump

# 2. Pull code and install dependencies
git pull --ff-only
pip install -r backend/requirements.txt
npm ci

# 3. Apply migrations and rebuild assets
python3.11 backend/manage.py migrate
npm run build

# 4. Restart API and workers
sudo systemctl restart fastrestful
sudo systemctl restart fastrestful-worker fastrestful-beat

# 5. Verify
curl -f https://api.example.com/api/health/ready

Controles de producción

  • DJANGO_DEBUG=False, secreto de 50 caracteres o más, clave Fernet válida.
  • PostgreSQL, Redis, orígenes HTTPS y hosts permitidos explícitos.
  • Credenciales de admin cambiadas; usuarios de demostración eliminados o deshabilitados.
  • Webhooks de pago y desembolso registrados con el secreto firmado correcto.
  • Credenciales SMTP y de proveedores probadas; dominio del remitente autenticado.
  • S3/CloudFront configurados si las cargas de medios están habilitadas.
  • Worker del planificador + beat en ejecución, o equivalentes de cron instalados.
  • Copias de seguridad probadas restaurándolas en un entorno separado.
  • La monitorización cubre la preparación, la tasa de 5xx, la latencia del gateway, los fallos de webhooks y la profundidad de la cola.
  • Páginas legales, términos, privacidad y contacto de soporte revisados por el operador.
Despliegue y operación10 min de lectura

Operaciones

Liquidación programada, entrega de notificaciones, comprobaciones de disponibilidad, retención de telemetría, sondas de estado y los comandos operativos que mantienen FastRestful en buen estado.

Programación de Celery

TareaProgramaciónPropósito
settle_periodDía 1 de cada mes, 00:05 UTCGenera facturas y pagos del periodo anterior.
escalate_moderation_casesCada 15 minutosEscala los casos de moderación y apelación vencidos.
deliver_notification_email_queueCada 15 minutosEntrega los correos de notificación en cola con recuperación de reclamaciones obsoletas.
schedule_daily_api_availability_checksDiario, 00:20 UTCEnvía las comprobaciones de disponibilidad de productos.
shell
celery -A config worker -l info -Q billing,celery
celery -A config beat -l info

Sin un broker, Celery se ejecuta en modo eager dentro del proceso. En producción, establece REDIS_URL o CELERY_BROKER_URL y ejecuta tanto el worker como beat como servicios separados.

Comandos operativos

ComandoQué hace
generate_invoices --period YYYY-MMGeneración idempotente de facturas para un periodo.
generate_payouts --period YYYY-MMGeneración idempotente de pagos, con reembolsos y comisiones aplicados.
prune_telemetryRetención de registros de solicitudes y eventos de uso.
check_api_availabilityEjecuta comprobaciones de estado de los productos manualmente.
escalate_moderationEscala casos vencidos sin Celery beat.
deliver_notification_emailsVacía el backlog de correos de notificación en cola.
checklinksVuelve a comprobar los destinos de enlaces cortos en busca de URLs rotas.
shell
python3.11 manage.py generate_invoices --period 2026-10
python3.11 manage.py generate_payouts --period 2026-10
python3.11 manage.py prune_telemetry --request-log-days 90 --usage-event-days 365
python3.11 manage.py check_api_availability
python3.11 manage.py checklinks --limit 200 --timeout 6

Modo de mantenimiento

Habilita Operaciones de la plataforma → Modo de mantenimiento en la configuración del sitio. El frontend devuelve una página 503 con la marca, las llamadas a la API de clientes y al gateway devuelven una respuesta maintenance_mode legible por máquina con Retry-After: 300, y la documentación/Swagger se pausan.

El admin del personal, las sondas de estado, los callbacks del proveedor de identidad y los webhooks firmados de pago/desembolso siguen disponibles para que la plataforma pueda recuperarse de forma segura y no se pierdan proveedores.

Monitorización

  • Sonda de preparación para la base de datos y la caché compartida.
  • Tasa de 5xx de la API y latencia p95 por espacio de nombres.
  • Tasa de errores del upstream del gateway y eventos de circuito abierto.
  • Cola de fallos de webhooks y excepciones de pagos.
  • Profundidad de la cola de Celery y heartbeat de beat.
  • Tasas de rebote/queja de correo y tasa de bajas.
  • Crecimiento del almacenamiento de medios y tasa de aciertos de la caché de CDN.
  • Conexiones de PostgreSQL, consultas lentas, disco y éxito de las copias de seguridad.

Copias de seguridad

DatosEstrategia de copias de seguridad
PostgreSQLVolcado lógico nocturno más copias de seguridad continuas del proveedor. Prueba la restauración cada trimestre.
Medios en S3Habilita el versionado del bucket y la replicación entre regiones si es necesario.
Especificaciones en la BDIncluidas en las copias de seguridad de PostgreSQL.
Secretos de entornoGuárdalos en un gestor de secretos; haz copias de seguridad con controles de acceso e historial de rotación.
Evidencia de auditoríaConserva según la política; los trabajos de exportación pueden crear archivos inmutables.

Notas de escalado

  • Ejecuta varias instancias de Gunicorn/Django detrás de un balanceador de carga; mantén las sesiones y la caché en Redis.
  • Ejecuta workers de Celery separados de los procesos web y escala las colas de facturación y predeterminada de forma independiente.
  • Los límites de velocidad del gateway usan la caché compartida; una caída de la caché devuelve un 503 reintentable en lugar de fallar abierto.
  • Usa pooling de conexiones de PostgreSQL si aumenta el número de workers.
  • Mueve los medios a S3/CloudFront antes de que el tráfico haga doloroso el ciclo de vida del disco local.
  • Mantén explícita la retención de telemetría; los registros de solicitudes y los eventos de uso no están pensados para crecer indefinidamente.
Despliegue y operación12 min de lectura

Seguridad

Comportamiento crítico de seguridad en FastRestful: custodia de claves, aislamiento de inquilinos, protección SSRF del gateway, política de origen del navegador, almacenamiento de secretos, evidencia de auditoría y la lista de comprobación de endurecimiento para producción.

Custodia de claves de API

  • Las claves sin procesar se devuelven exactamente una vez al crearlas o rotarlas. Los serializadores o el admin nunca las vuelven a mostrar.
  • Formas almacenadas: un prefijo de búsqueda, un hash SHA-256 para comparación en tiempo constante y una copia cifrada con Fernet para uso del gateway del lado del servidor.
  • La rotación revoca la clave anterior y emite una nueva en una sola llamada. Una clave revocada no se puede usar para emitir reemplazos.
  • Los scopes restringen el acceso: full, execute o read. Las actualizaciones solo pueden reducir un scope, nunca ampliarlo.
  • Una clave está vinculada a su aplicación y suscripción; no puede cruzar aplicaciones ni espacios de trabajo.

Aislamiento de inquilinos

  • X-Organization selecciona el inquilino activo. Los permisos del lado del servidor vuelven a comprobar la pertenencia de cada objeto.
  • Las lecturas de proveedores tienen doble alcance: un proveedor ve sus propios productos, suscripciones, facturas y registros; un consumidor solo ve su propio espacio de trabajo.
  • Los campos de propiedad son inmutables a través de la API.
  • Los serializadores públicos son explícitos, no listas blancas de un modelo privado. Las métricas operativas y los campos privados quedan fuera de las respuestas anónimas.
  • Los superusuarios pueden leer entre inquilinos por motivos de soporte, pero las escrituras siguen requiriendo el scope propietario correcto, salvo en operaciones explícitas de plataforma.

Seguridad del gateway

  • Los upstreams deben usar HTTPS, resolverse a direcciones públicas, permanecer en el host original y evitar patrones de traversal.
  • No se siguen las redirecciones. Se comprueban las respuestas DNS y la IP pública seleccionada se fija a través de la conexión TLS para evitar el rebinding.
  • Los tiempos de espera, los límites de cuerpo, los límites de carga y los reintentos acotados se aplican antes de reenviar.
  • Los secretos de los proveedores se adjuntan solo del lado del servidor; nunca llegan al navegador.
  • Las claves de idempotencia se almacenan como hashes de token con una huella de la solicitud y una respuesta redactada, nunca como cuerpos de solicitud sin procesar.
  • Las vistas previas de respuestas tienen un límite de longitud y redactan Set-Cookie, Authorization y X-API-Key.
  • Una caída de la caché compartida devuelve un 503 reintentable antes de reservar cuota; el gateway no falla abierto.

Seguridad del navegador y de los orígenes

  • Producción aplica HTTPS, HSTS, cookies seguras y una política de referrer estricta.
  • CORS_ALLOWED_ORIGINS y CSRF_TRUSTED_ORIGINS deben nombrar exactamente el frontend público.
  • El frontend puede leer las cookies CSRF porque la sesión compartida de Django se usa para escrituras del admin y de la consola; nunca las expongas entre orígenes.
  • Los recursos CSS/JS personalizados son contenido de operador de confianza. Usa un nonce de CSP, previsualiza antes de activar y revisa el historial de revisiones.
  • El modo de mantenimiento mantiene disponibles los callbacks de proveedores y las rutas del proveedor de identidad.

Gestión de secretos

SecretoAlmacenamiento
DJANGO_SECRET_KEYGestor de secretos o archivo de entorno legible solo por el usuario del servicio. Rota de forma deliberada.
FIELD_ENCRYPTION_KEYGestor de secretos. Haz copia de seguridad: si lo pierdes, las claves cifradas y los secretos de proveedores no se podrán recuperar.
Claves de proveedoresRegistros de gateway del admin o entorno. Prefiere los registros del admin para rotar operativamente sin un despliegue.
Credenciales SMTPEstudio de newsletters o entorno. Usa una identidad de envío dedicada.
URL de la base de datosGestor de secretos. Usa TLS y un rol de base de datos con privilegios mínimos.

Endurecimiento de la autenticación

  • Habilita el segundo factor obligatorio para el personal y, opcionalmente, para todas las cuentas en la configuración del sitio.
  • Usa OIDC o SAML para la identidad empresarial; el inicio de sesión con contraseña puede quedar como fallback.
  • Mantén los tokens de acceso de corta duración (15 minutos) y los refresh tokens rotativos en lista negra después de la rotación.
  • Las invitaciones se almacenan con hash, son de un solo uso, están vinculadas al correo y caducan a los siete días.
  • El acceso al admin requiere is_staff; el espacio de trabajo admin no es un rol de personal de la plataforma.
  • Las respuestas de restablecimiento de contraseña no revelan si existe una cuenta.

Auditoría y evidencia

  • Las acciones del admin, las decisiones de moderación, los cambios de estado de facturación, la conciliación de pagos, los cambios de ajustes y la recuperación de cuentas generan eventos de auditoría.
  • Los recibos de eventos del proveedor son de solo anexado y rechazan conflictos de payload, lo que hace seguros los reintentos.
  • Los asientos del libro mayor son de solo anexado. Los reembolsos posteriores al desembolso crean asientos de recuperación y reversión de comisiones.
  • Los trabajos de exportación de auditoría admiten retención y revisión sin acceso directo a la base de datos.

Lista de verificación para producción

shell
DJANGO_DEBUG=0 \
DATABASE_URL=postgresql://… \
REDIS_URL=redis://… \
FRONTEND_URL=https://app.example.com \
DJANGO_ALLOWED_HOSTS=api.example.com,.api.example.com \
CORS_ALLOWED_ORIGINS=https://app.example.com \
CSRF_TRUSTED_ORIGINS=https://app.example.com \
DJANGO_SECRET_KEY=<50+ chars> \
FIELD_ENCRYPTION_KEY=<fernet key> \
python3.11 manage.py check --deploy
  • Cuentas de demostración y datos de inicialización eliminados de producción.
  • Se requiere segundo factor para el personal; SSO probado de extremo a extremo.
  • Webhooks de pago verificados con el secreto firmado del proveedor.
  • Bucket de medios privado; OAC de CDN configurado; sin acceso de escritura con comodín.
  • Copias de seguridad cifradas y con restauración probada.
  • Los registros excluyen secretos y redactan los payloads de los consumidores.
  • Dependencias e imágenes de contenedor parcheadas según un calendario.
  • Contacto de incidentes y vía de divulgación de vulnerabilidades publicados.
Despliegue y operación16 min de lectura

Licencias & actualizaciones oficiales

FastRestful es código fuente con licencia que se vende a través de Dakidarts. Conecta la clave de compra a LicenseHub para verificar versiones oficiales firmadas, instalar una versión más reciente o volver a una anterior. El gateway en ejecución sigue funcionando si LicenseHub no está disponible temporalmente.

Qué hace el centro de actualizaciones

TareaDónde
Conecta la licencia de compra y consulta las fechas de derechoAdmin → Actualizaciones de software (/admin/updates/)
Comprueba, descarga, verifica e instala versionesLa misma página, o el comando fastrestful_update
Renueva el arrendamiento de la licencia según un calendariopython3.11 manage.py license_heartbeat
Consulta el historial de actualizaciones y los registros del instaladorActividad de descarga & instalación en la página de actualizaciones
Consulta el estado de la licencia en la vista general de operacionesAdmin → Vista general de operaciones
Antes de actualizar: haz una copia de seguridad de la base de datos y de los medios. El actualizador hace instantáneas del código fuente y de SQLite de forma predeterminada, pero una copia de seguridad verificada sigue siendo tu red de seguridad. Consulta Copias de seguridad y actualizaciones.

Parte 1 — Activa tu licencia

  1. Compra FastRestful y abre el panel de Dakidarts.

    Ve a Panel → Licencias y copia la clave completa. Empieza por DK-FRST-….

  2. Abre el centro de actualizaciones.

    Inicia sesión como personal y abre https://your-domain/admin/updates/. La barra lateral lo llama Actualizaciones de software.

  3. Pega la clave de licencia.

    Usa la clave completa, incluidos los guiones. Se cifra en reposo y solo se muestra una forma enmascarada después de la activación.

  4. Confirma la URL de LicenseHub.

    La predeterminada es https://dakidarts.com. Consérvala salvo que Dakidarts te indique otro origen. Se requiere HTTPS fuera de la depuración local.

  5. Elige el entorno.

    Producción consume un asiento de producción. Staging y Desarrollo consumen asientos no de producción. Elige el que corresponda a esta instalación.

  6. Opcionalmente, añade el dominio de producción.

    Por ejemplo, api.example.com. Esto te ayuda a identificar la instalación en el portal de clientes.

  7. Elige un canal de versiones.

    Empieza con Stable. Usa Beta o Preview solo en un entorno de prueba desechable.

  8. Haz clic en Activar licencia.

    La activación crea o reutiliza un installation_id persistente y vincula un asiento. Después, la página muestra la edición, las ventanas de actualización y soporte, el número de activaciones y el último latido.

Si la activación falla, el error se muestra en la página. Las causas más comunes son una clave caducada, un límite de asientos o una clave copiada con un espacio final.

Parte 2 — Instala una actualización desde el admin

  1. Haz una copia de seguridad.

    Haz una copia de seguridad de PostgreSQL, los medios, .env y cualquier archivo personalizado. Confirma que la copia se restaura antes de necesitarla.

  2. Abre Admin → Actualizaciones de software.

    La página muestra la versión en ejecución, la versión instalada y el estado de la conexión.

  3. Haz clic en Buscar actualizaciones.

    LicenseHub devuelve todas las versiones que cubre tu ventana de actualización: más recientes, actuales y anteriores.

  4. Haz clic en Descargar & preparar en la versión de destino.

    FastRestful descarga cada artefacto, verifica el SHA-256, verifica la firma del manifiesto Ed25519 y extrae el paquete en FASTRESTFUL_UPDATE_DIR/<version>/bundle/.

  5. Haz clic en Instalar.

    El admin inicia un worker independiente para que las migraciones o una compilación no superen el tiempo de espera de la solicitud web. La página se actualiza mientras se ejecuta.

  6. Espera a «instalado» y al aviso de reinicio.

    El proceso en ejecución sigue usando el código anterior hasta que reinicies. La página muestra Instalado … · reinicio requerido.

  7. Reinicia los servicios.

    Reinicia Gunicorn o tu servidor de aplicaciones, el worker y beat de Celery, y el proceso del frontend si se ejecuta en el mismo host. Usa tu gestor de servicios, no la página de admin. Ejemplos de comandos de systemd:

    ejemplo de systemd
    sudo systemctl restart fastrestful
    sudo systemctl restart fastrestful-worker fastrestful-beat
    # restart your frontend process too if it runs on this host
  8. Verifica.

    Confirma la versión en el centro de actualizaciones, abre /api/health/ready y haz una solicitud de prueba a través del gateway.

Paquetes grandes: la Descargar & preparar acción se ejecuta dentro de la solicitud del admin. Para una versión grande con una conexión lenta, usa el comando de descarga de la CLI desde el shell del servidor para que un tiempo de espera web no pueda interrumpirla.

Parte 3 — Actualiza desde la línea de comandos

Usa esto cuando el admin no esté disponible o cuando quieras instalar en una sesión de terminal.

shell
cd /srv/fastrestful/backend
source .venv/bin/activate

python3.11 manage.py fastrestful_update status
python3.11 manage.py fastrestful_update check
python3.11 manage.py fastrestful_update download --release-version 1.2.0
python3.11 manage.py fastrestful_update install --release-version 1.2.0

La instalación por CLI es síncrona e imprime el registro capturado del instalador. La instalación desde el admin es asíncrona. Ambas verifican los mismos artefactos firmados antes de ejecutar el instalador.

Mantén actualizado el arrendamiento de la licencia

El arrendamiento del certificado es de 24 horas. Un latido cada seis horas deja margen para cortes transitorios. Una comprobación diaria basta para descubrir versiones.

ejemplo de cron
17 */6 * * * cd /srv/fastrestful/backend && /srv/fastrestful/.venv/bin/python manage.py license_heartbeat --check-updates >> /var/log/fastrestful-license.log 2>&1

Un latido fallido registra el error en el admin, pero no detiene el gateway.

Parte 4 — Vuelve a una versión anterior

  1. Abre la lista de versiones.

    Las versiones anteriores cubiertas por tu ventana de actualización aparecen junto a la versión actual.

  2. Haz clic en Instalar versión anterior en la versión de destino.

    El centro de actualizaciones marca la instalación con esa versión. Es una instalación de versión normal, no un restablecimiento destructivo.

  3. Reinicia los servicios.

    El proceso reiniciado toma el árbol de código anterior.

  4. Comprueba la base de datos.

    Si la versión más reciente aplicó una migración irreversible, restaura la copia de seguridad de la base de datos previa a la actualización. Mantén juntas la copia de la base de datos y la del código.

Instantáneas del código se encuentran en FASTRESTFUL_UPDATE_DIR/backups/. SQLite se copia; PostgreSQL se vuelca con pg_dump cuando está disponible. Una reversión que atraviesa una migración irreversible aún puede requerir la restauración de la base de datos.

Parte 5 — Canales y entornos

CanalÚsalo para
stableVersiones de producción. Esta es la predeterminada.
betaVersiones de vista previa para un entorno de staging.
previewCompilaciones tempranas. Úsalas solo con un entorno desechable.

El canal se guarda en la conexión y se envía con cada comprobación. Cámbialo en la página de actualizaciones o durante la activación.

Parte 6 — Despliegues con Docker y basados en imágenes

El instalador predeterminado actualiza una copia de trabajo del código. En un contenedor, los cambios del sistema de archivos no son duraderos cuando se recrea el contenedor. Elige una de estas opciones:

  • Compila y despliega una imagen nueva a partir de la versión descargada en tu pipeline habitual.
  • Define un FASTRESTFUL_UPDATE_INSTALL_SCRIPT personalizado que extraiga la imagen nueva o active el despliegue de tu plataforma.
  • Usa fastrestful_update download para obtener y verificar la versión, y luego aplícala fuera del contenedor en ejecución.
Nunca montes el directorio de actualizaciones sobre los archivos de código de la aplicación. El actualizador escribe los paquetes y las copias de seguridad en ese directorio; superponer el código fuente puede corromper ambos.

Parte 7 — Configuración

VariablePredeterminadoPropósito
FASTRESTFUL_VERSION1.0.0Versión que se muestra a LicenseHub y se compara con las versiones publicadas. Las compilaciones oficiales la establecen.
DAKIDARTS_LICENSEHUB_URLhttps://dakidarts.comOrigen de LicenseHub para activación, latidos y comprobaciones.
FASTRESTFUL_UPDATE_DIR<repo>/updatesDirectorio de staging privado para artefactos, paquetes y copias de seguridad.
FASTRESTFUL_UPDATE_TIMEOUT_SECONDS900Tiempo máximo de ejecución del instalador.
FASTRESTFUL_UPDATE_INSTALL_SCRIPTinstall.shRuta del instalador relativa al paquete extraído.
FIELD_ENCRYPTION_KEYobligatorio en producciónCifra la clave de compra. Haz una copia de seguridad. Si la pierdes, deberás volver a conectar la licencia.

Parte 8 — Solución de problemas

SíntomaQué comprobar
license_key_requiredFalta la clave o se borró. Vuelve a conectar desde /admin/updates/.
activation_not_foundLa instalación se desactivó en el portal de clientes o se reemplazó. Vuelve a conectar o reactiva.
updates_expiredRenueva el derecho de actualización en el portal de Dakidarts. La instalación existente sigue funcionando.
activation_limitDesactiva una instalación antigua en el portal de Dakidarts y vuelve a intentarlo.
Fallo de suma de comprobación en la descargaVuelve a intentarlo. Comprueba si un proxy o una caché está corrompiendo los artefactos. No ejecutes el paquete.
No hay script de instalaciónEl paquete de la versión está incompleto. Usa tu flujo de despliegue o vuelve a compilar la versión con scripts/install-release.sh.
La instalación se completó, pero la versión no cambióReinicia el backend, los workers y el frontend. El proceso en ejecución sigue usando el código anterior.
Fallan las comprobaciones de estado tras una actualizaciónLee el registro de actualización y luego restaura la copia de seguridad del código anterior en FASTRESTFUL_UPDATE_DIR/backups/ y la copia correspondiente de la base de datos si es necesario.

Parte 9 — Notas de seguridad

  • Solo el personal con licensing.change_licenseconnection puede abrir el centro de actualizaciones.
  • La protección CSRF se aplica en cada acción.
  • La clave de compra se cifra en reposo y nunca se muestra después de la activación.
  • Las descargas usan tokens de LicenseHub de corta duración. Los artefactos se verifican con SHA-256 y la firma del manifiesto Ed25519 antes de extraerlos o ejecutarlos.
  • La extracción de archivos rechaza rutas absolutas, recorridos, enlaces simbólicos y enlaces duros.
  • Mantén privado el directorio de actualizaciones. No lo sirvas desde Nginx ni desde almacenamiento de objetos.
  • Una interrupción de LicenseHub o una ventana de actualización caducada no dejan fuera de línea un gateway en ejecución. La revocación bloquea las descargas oficiales; no detiene de forma remota una instalación perpetua existente.

Para responsables de versiones

Las versiones oficiales son artefactos privados de LicenseHub. Un paquete puede contener un archivo de código o varios artefactos (código, migraciones, frontend, docs). Todos los artefactos se extraen en el mismo directorio bundle/ en el orden que devuelve LicenseHub.

El paquete debe incluir un instalador en una de estas rutas:

  • install.sh
  • scripts/install.sh
  • scripts/install-release.sh
  • la ruta en FASTRESTFUL_UPDATE_INSTALL_SCRIPT

scripts/install-release.sh en este repositorio es la implementación de referencia. Cópialo a la raíz del paquete de la versión como install.sh. Hace una instantánea del código y la base de datos anteriores, superpone el código nuevo, conserva los secretos, medios y archivos de base de datos locales, instala las dependencias del backend, ejecuta las migraciones de Django e imprime el requisito de reinicio.

El instalador recibe FASTRESTFUL_RELEASE_DIR, FASTRESTFUL_BUNDLE_DIR, FASTRESTFUL_UPDATE_DIR, FASTRESTFUL_APP_ROOT, FASTRESTFUL_FROM_VERSION, FASTRESTFUL_TO_VERSION, FASTRESTFUL_PYTHON y FASTRESTFUL_INSTALL_LOG. Se ejecuta con bash, un tiempo de espera y un registro capturado. Debe ser no interactivo y dejar la instalación recuperable si falla.

Despliegue & operación8 min de lectura

Solución de problemas

Los fallos con los que más se topan los equipos — y las comprobaciones que los resuelven.

La API devuelve 401 o 403

  • 401: falta el token de portador o caducó, falta X-API-Key, o la clave no se resuelve. Actualiza el JWT o emite una clave nueva.
  • 403: autenticado pero sin permiso. Comprueba la pertenencia al espacio de trabajo, el rol, el estado de la suscripción y el derecho al endpoint.
  • Las llamadas externas al gateway deben usar X-API-Key (o una clave de portador fr_live_…), no un JWT del panel.
  • Las llamadas del panel necesitan tanto Authorization: Bearer <access> como X-Organization: <uuid>.

Las solicitudes del navegador fallan con CORS o CSRF

  • Añade el origen exacto del frontend a CORS_ALLOWED_ORIGINS y CSRF_TRUSTED_ORIGINS.
  • Usa el mismo esquema, host y puerto que usa el navegador. localhost y 127.0.0.1 son orígenes distintos.
  • Vuelve a compilar el frontend después de cambiar NEXT_PUBLIC_API_URL o NEXT_PUBLIC_SITE_URL.
  • Para llamadas al gateway desde orígenes de consumidores arbitrarios, configura expresiones regulares de CORS o CORS permisivo solo en el host de la API del producto.

Falla una solicitud al gateway

SíntomaComprobación
429Se alcanzó la cuota mensual o el límite de velocidad por minuto. Inspecciona el uso de la suscripción y los límites del plan.
409Se reutilizó la clave de idempotencia con una entrada de solicitud diferente. Usa una clave nueva o repite la solicitud original.
503 reintentableCaché compartida no disponible, circuito abierto o modo de mantenimiento. Comprueba Redis y la disponibilidad de la plataforma.
Fallo de TLS/DNS en el upstreamConfirma que el upstream del proveedor sea HTTPS público y se resuelva sin redirecciones.
Clave rechazadaLa clave está revocada, caducada, vinculada a otra aplicación o su suscripción no está activa.
Endpoint no encontradoEl método + la ruta deben coincidir con un endpoint de la versión activa. Comprueba la versión y el derecho del plan.

Fallan las migraciones o el esquema está desactualizado

shell
python3.11 manage.py showmigrations
python3.11 manage.py makemigrations --check --dry-run
python3.11 manage.py migrate --noinput
python3.11 manage.py check

Si una migración entra en conflicto con una rama personalizada, resuélvelo en una copia de la base de datos y nunca edites una migración ya aplicada en producción.

Los medios devuelven 404 o un recurso de CDN obsoleto

  • Modo local: confirma que MEDIA_ROOT tiene permisos de escritura y que Nginx sirve /media/.
  • Modo S3: verifica los permisos del bucket, la región, el endpoint y el origen de la CDN. Mantén el bucket privado cuando uses OAC.
  • Después de reemplazar un recurso, purga la distribución de CDN o usa la acción de purga del admin.
  • Confirma que MEDIA_CDN_DOMAIN no tenga una ruta final y que coincida con el certificado.

Fallan los webhooks de pago

Empieza por la configuración específica del proveedor en Pasarelas de pago, paso a paso. Luego comprueba esto en orden:

  1. La URL es exacta y pública. Registra /api/v1/billing/stripe-webhook/, /paypal-webhook/, /flutterwave-webhook/, /paystack-webhook/ o /razorpay-webhook/ en el mismo nombre de host al que llegan los usuarios. Localhost no funcionará.
  2. Los valores de prueba y producción no se mezclan. Una clave de prueba con un ID de webhook de producción (o al revés) hace fallar todas las entregas.
  3. El secreto es del tipo correcto. Stripe necesita el secreto de firma del endpoint (whsec_…), no la clave secreta de API. Flutterwave necesita el hash secreto que creaste. Razorpay necesita el secreto de firma del webhook.
  4. PayPal usa un ID de webhook, no un secreto. Pon el ID de la misma app y entorno de PayPal en PAYPAL_WEBHOOK_ID. FastRestful verifica cada evento con la API de verificación de firmas de PayPal. Un ID faltante o incorrecto devuelve Bad signature. Consulta Solución de problemas de webhooks de PayPal.
  5. Paystack normalmente no necesita secreto de webhook. Deja PAYSTACK_WEBHOOK_SECRET en blanco; FastRestful verifica con PAYSTACK_SECRET_KEY.
  6. Los tipos de evento están seleccionados. Un webhook accesible pero no suscrito al evento de liquidación deja la factura abierta.
  7. Tu proxy conserva las cabeceras del proveedor. Nginx, Cloudflare y los balanceadores de carga deben reenviar las cabeceras de firma sin cambios.
  8. El importe y la moneda coinciden. FastRestful rechaza una liquidación que no coincide con la factura.
  9. Revisa el recibo. Abre Admin → Eventos de pago; los ID de evento duplicados se confirman sin liquidar dos veces. Reenvía el evento fallido desde el panel del proveedor.

El correo no se envía

  • Desarrollo usa el backend de correo de consola. Revisa la salida de la terminal.
  • Producción usa SMTP de forma predeterminada. Prueba el host, el puerto, TLS, el nombre de usuario y la contraseña.
  • La configuración del boletín puede anular el remitente del entorno; confirma el proveedor activo en el estudio.
  • Comprueba SPF, DKIM y DMARC antes de culpar a la cola. Las tasas de rebotes y quejas suprimen envíos futuros.

Problemas de compilación o rutas del frontend

  • Ejecuta npm run typecheck y npm test antes de depurar el despliegue.
  • Una página en blanco basada en API suele significar que el origen de la API no es accesible o que CORS está incompleto.
  • Si las páginas públicas de producto funcionan pero /api/{slug} devuelve 404, confirma que el proxy solo reenvíe los namespaces de Django y no la ruta de producto del frontend.
  • Después de cambios de i18n, ejecuta npm run export:i18n y reinicia Django.

Los cambios de idioma no aparecen

  • El francés incluido se carga desde el bundle del frontend; las superposiciones del admin vienen de la API de idioma activo.
  • Guarda la superposición del admin, confirma que el idioma esté activo y fuerza la actualización del navegador.
  • Después de cambiar fr.json, exporta el código del backend y reinicia la API para vaciar su caché de proceso.
  • Comprueba si hay una preferencia de idioma obsoleta en localStorage.
Plataforma10 min de lectura

Autenticación & acceso

FastRestful usa tokens de acceso JWT de corta duración, tokens de actualización rotativos y una sesión de navegador compartida de Django. El mismo inicio de sesión puede abrir la consola del consumidor, el estudio del proveedor y el admin del personal.

Flujos de autenticación

FlujoEndpointResultado
Inicio de sesión con contraseñaPOST /api/v1/auth/token/Token de acceso + actualización y una sesión de Django.
RegistroPOST /api/v1/auth/register/Usuario, espacio de trabajo opcional, par de JWT y sesión.
ActualizaciónPOST /api/v1/auth/token/refresh/Nuevo token de acceso; la rotación pone en la lista negra el token de actualización anterior.
Cierre de sesiónPOST /api/v1/auth/logout/Limpia la sesión; opcionalmente pone en la lista negra un token de actualización proporcionado.
Restablecimiento de contraseñaPOST /api/v1/auth/password-reset/Correo de restablecimiento que no revela si la cuenta existe.
Confirmación de restablecimientoPOST /api/v1/auth/password-reset/confirm/Un token de un solo uso reemplaza la contraseña.
OIDC/api/v1/auth/sso/status|start|callback/Inicio de sesión y canje con el proveedor.
SAML 2.0/api/v1/auth/saml/status|metadata|start/Flujo de proveedor de servicios con enlace POST.

Cabeceras de solicitud

solicitud a la API del panel
Authorization: Bearer <access-token>
X-Organization: <organization-uuid>
Content-Type: application/json
solicitud externa al gateway
X-API-Key: fr_live_…
# backwards-compatible alternative:
Authorization: Bearer fr_live_…

El panel usa JWT más la cabecera explícita del espacio de trabajo activo. Los consumidores externos usan una clave de API de producto suscrita. Un JWT del panel no debe usarse como clave de API de cliente, y una clave de API sin procesar no debe enviarse a los endpoints del panel.

Roles del espacio de trabajo

RolAcceso típico
PropietarioControl total del espacio de trabajo, facturación, equipo y operaciones de proveedor. El último propietario está protegido.
AdminEquipo, aplicaciones, claves, suscripciones, publicación, facturación y soporte.
DesarrolladorAplicaciones, claves, pruebas de endpoints y publicación de productos cuando esté permitido.
FacturaciónFacturas, métodos de pago, cupones, reembolsos y desembolsos.
LectorAcceso de solo lectura a los recursos del espacio de trabajo.

El acceso del personal de la plataforma es independiente: requiere is_staff y nunca se deriva de un rol admin del espacio de trabajo. Los permisos del personal se aplican por modelo y acción del admin de Django.

Autenticación de dos factores

  • Inscripción de autenticador TOTP con QR/URI de aprovisionamiento y códigos de recuperación de un solo uso.
  • Los códigos de recuperación se muestran una vez, se almacenan con hash y se regeneran como conjunto.
  • Un superusuario puede exigir dos factores para todas las cuentas en Configuración del sitio.
  • El acceso al admin puede bloquearse hasta confirmar la inscripción; la consola muestra una puerta de configuración dedicada.

Invitaciones a espacios de trabajo

Los propietarios y admins invitan por correo y asignan un rol. Los tokens de invitación se almacenan con hash, son de un solo uso, están vinculados al correo, caducan a los siete días y se pueden reenviar o revocar. Aceptar una invitación requiere un usuario autenticado con el correo coincidente y puede reactivar una membresía inactiva.

API de equipo
GET  /api/v1/organization-invites/
POST /api/v1/organization-invites/          {"email": "...", "role": "developer"}
POST /api/v1/organization-invites/{id}/resend/
POST /api/v1/organization-invites/{id}/revoke/
POST /api/v1/auth/invites/accept/           {"token": "..."}

Configuración de SSO

OIDC

backend/.env
SSO_ISSUER=https://login.example.com/realms/acme
SSO_CLIENT_ID=fastrestful
SSO_CLIENT_SECRET=...
FRONTEND_URL=https://app.example.com

Registra la URL de callback https://api.example.com/api/v1/auth/sso/callback/ con el proveedor de identidad. Los destinos relativos seguros y los tokens de invitación sobreviven al viaje de ida y vuelta.

SAML 2.0

backend/.env
SSO_SAML_ENABLED=1
SSO_SAML_ENTITY_ID=fastrestful
SSO_SAML_SSO_URL=https://idp.example.com/sso
SSO_SAML_IDP_CERT="-----BEGIN CERTIFICATE-----..."
SSO_SAML_AUDIENCE=fastrestful

Instala lxml antes de habilitar SAML. Los metadatos se sirven en /api/v1/auth/saml/metadata/; configura el IdP con la URL del servicio de consumo de aserciones del endpoint de inicio.

Ciclo de vida de las claves de API

  • Crea una clave en la aplicación seleccionada; la clave sin procesar aparece una sola vez.
  • Envíala como X-API-Key o como credencial de portador fr_live_….
  • Rota para revocar la clave anterior y emitir una nueva de forma atómica.
  • Revoca de inmediato cuando se pierda una credencial; no hay recuperación del valor sin procesar.
  • Usa el alcance execute o read para privilegio mínimo cuando el cliente no necesite administración completa.
Plataforma12 min de lectura

Productos de API & versiones

Un producto es la identidad pública. Una versión es el contrato inmutable. Los endpoints, la documentación, la política del gateway y los derechos del plan se mantienen dentro de ese límite de versión.

El modelo de producto

EntidadPosee
CategoryNavegación y agrupación en el marketplace.
ApiProductNombre público, slug, logotipo, categoría, proveedor, upstream, visibilidad, sitio web, comprobación de estado.
ApiVersionNúmero de versión, registro de cambios, contrato OpenAPI, estado, notas de la versión.
EndpointMétodo, ruta, resumen, parámetros, documentación de solicitud/respuesta, políticas, límite de velocidad.
PlanPrecio, intervalo, cuota, excedente, prueba, funciones, derecho a endpoints.

Crea y publica un producto

  1. En el estudio del proveedor, crea el producto con nombre, slug, categoría, eslogan, README y URL del upstream.
  2. Crea una versión en borrador e importa un contrato OpenAPI 3.x o Swagger 2.0.
  3. Revisa el catálogo de endpoints reconciliado y la documentación de endpoints.
  4. Crea al menos un plan público y configura cuotas, límites de velocidad y derechos.
  5. Ejecuta la preparación para publicación; las cuatro comprobaciones deben pasar.
  6. Envía la versión para revisión y luego promuévela a producción.
  7. Publica el producto. La versión activa anterior se retira automáticamente.

Importación de OpenAPI

shell
curl --request POST \
  --url 'https://api.example.com/api/v1/products/signal-stack/import-spec/' \
  --header 'Authorization: Bearer <access>' \
  --header 'X-Organization: <vendor-org-uuid>' \
  --header 'Content-Type: application/json' \
  --data '{
    "version": "2.5.0",
    "openapi": { "openapi": "3.0.3", "paths": { } },
    "changelog": "Add delivery scheduling."
  }'

La importación crea o actualiza una versión en borrador, reconcilia las filas de endpoints desde paths, informa de los endpoints creados, actualizados y eliminados, y conserva los campos de política del gateway en las operaciones retenidas. Se rechaza la importación sobre una versión activa.

Preparación para publicación

PuertaRequisito
Metadatos del listadoEl nombre, el slug, el eslogan, la categoría y el README están presentes.
UpstreamHay un upstream HTTPS válido configurado.
Versión activaAl menos una versión activa con un contrato OpenAPI compatible y endpoints coincidentes.
Plan públicoHay al menos un plan público disponible.

Máquina de estados de la versión

flujo de estados
draft ──submit_review──► review ──promote──► live ──deprecate──► deprecated
  └───────────────────────promote────────────────┘

# product visibility
draft ──publish──► public ──unpublish──► draft
                       └──retire──► retired ──restore──► draft
  • Las versiones activas son inmutables: las ediciones se rechazan a nivel de modelo y serializador.
  • La promoción retira la versión activa anterior para mantener una única versión activa.
  • El contrato y el catálogo de endpoints deben coincidir exactamente antes de la promoción.
  • Los derechos de endpoints del plan se reasignan por método + ruta cuando una nueva versión activa reemplaza a la anterior.

Informes de cambios incompatibles

shell
GET /api/v1/versions/{version_id}/diff/?against={previous_version_id}

# Review added, removed, and changed operations before promotion.
# A release can be promoted only after the contract is validated.

Enrutamiento de hosts de producto

Cada producto publicado tiene dos puertas de entrada equivalentes:

EntornoURL base
Producción con DNS comodínhttps://{product-slug}.api.example.com
Host único / desarrollohttps://api.example.com/api/v1/{product-slug}

El middleware lee la primera etiqueta del host como slug del producto. Los alias de ruta se registran como una ruta final, por lo que las rutas de API con nombre siempre tienen prioridad. Los productos desconocidos devuelven un 404 con una pista; las solicitudes sin clave a productos desconocidos devuelven 401 para evitar la enumeración.

Derechos del plan

  • all otorga todos los endpoints públicos de la versión activa.
  • selected otorga solo el conjunto de endpoints configurado.
  • Los derechos seleccionados se aplican en el gateway, incluidas las solicitudes de ruta sin procesar que evitan el catálogo de endpoints.
  • Las condiciones comerciales se bloquean después de la primera suscripción; crea un plan de reemplazo en lugar de editar un plan suscrito.
Plataforma11 min de lectura

Gateway & medición

El gateway es la única vía hacia los upstream de los proveedores. Resuelve el producto, autentica la clave, aplica la política de suscripción y plan, reserva cuota, reenvía de forma segura, mide el uso y escribe un rastro redactado.

Flujo de solicitudes

  1. Resuelve el producto a partir del host o alias de ruta y encuentra el endpoint de la versión activa por método + ruta.
  2. Autentica con un JWT/sesión del panel o una credencial externa X-API-Key / portador fr_live_….
  3. Resuelve la suscripción del producto y la aplicación. Solo suscripciones activas y en prueba.
  4. Valida el vínculo de la clave y marca last_used_at. Una clave no puede cruzar aplicaciones ni espacios de trabajo.
  5. Reserva cuota contra el contador mensual y aplica los límites de velocidad por endpoint de forma atómica.
  6. Ejecuta comprobaciones de seguridad de red: HTTPS, DNS público, sin redirecciones, sin recorrido de rutas, IP fijada.
  7. Reenvía con tiempo de espera, límites de cuerpo, límites de carga y reintentos acotados.
  8. Mide: evento de uso, contador mensual, registro de solicitudes redactado y vista previa de la respuesta.

Llamadas directas al producto

host del producto
curl --request POST \
  --url 'https://signal-stack.api.example.com/v2/deliveries' \
  --header 'X-API-Key: fr_live_…' \
  --header 'Content-Type: application/json' \
  --data '{"recipient":"[email protected]","template":"welcome"}'
alias de ruta
curl --request GET \
  --url 'https://api.example.com/api/v1/signal-stack/v2/deliveries?limit=10' \
  --header 'X-API-Key: fr_live_…'

El envoltorio heredado POST /api/v1/gateway/execute/ se mantiene para integraciones existentes y herramientas de consola. Los fragmentos nuevos usan la forma directa.

Cabeceras del gateway

CabeceraPropósito
X-API-KeyClave de producto suscrita. Recomendada para clientes externos.
Authorization: Bearer fr_live_…Forma de clave compatible con versiones anteriores.
Idempotency-KeyClave segura para reintentos de respuestas completadas, TTL predeterminado de 24 horas.
X-OrganizationSolo para el espacio de trabajo del panel; no para clientes externos del gateway.

Cuotas y límites de velocidad

  • La cuota mensual se reserva antes de reenviar y cuenta las solicitudes enrutadas, incluidos los fallos del upstream.
  • La cuota ilimitada elimina solo el límite mensual; el límite por minuto y el derecho a endpoints siguen aplicándose.
  • El límite de velocidad por endpoint usa una ventana fija atómica en caché. Una interrupción de la caché compartida devuelve un 503 reintentable antes de reservar cuota.
  • El excedente se factura por cada 1,000 solicitudes cuando está configurado; cero significa solo alertas.

Idempotencia y reintentos

  • Las respuestas completadas se almacenan con un hash SHA-256 del token, una huella de la solicitud y una respuesta redactada durante el TTL configurado.
  • Las repeticiones devuelven la respuesta almacenada antes de consumir cuota o llamar al upstream.
  • Reutilizar una clave con una entrada de solicitud diferente devuelve 409.
  • Los reintentos están acotados y solo se aplican a fallos transitorios seguros; los métodos no idempotentes no se reintentan a ciegas.
  • Un cortacircuitos se abre tras fallos repetidos del upstream y devuelve un 503 reintentable durante el enfriamiento.

SSRF y seguridad de red

  • Los upstream deben ser HTTPS públicos. Se rechazan las respuestas DNS privadas, de loopback, link-local y no seguras.
  • La ruta debe permanecer en el host original. Se rechaza el recorrido con ...
  • No se siguen redirecciones.
  • La dirección DNS pública seleccionada se fija a través de la conexión TLS para evitar el rebinding.
  • Los secretos del proveedor se adjuntan en el servidor y nunca se devuelven al navegador.
  • Las vistas previas de respuestas tienen un límite y redactan las cabeceras de cookies, autorización y clave de API.

Registros de solicitudes y medición

  • Vista del consumidor: historial de solicitudes del espacio de trabajo activo con búsqueda, filtros de estado y exportación CSV.
  • Vista del proveedor: registros a nivel de solicitud de los productos propios, con consumidor, endpoint, latencia, estado y vistas previas redactadas.
  • Eventos de uso: código de estado, latencia, suscripción, producto, endpoint y marca de tiempo.
  • Contadores mensuales: modelo de lectura de cuotas y analítica.
  • La retención se configura con prune_telemetry.

Entorno del gateway

Todos los tiempos de espera, límites, presupuestos de reintentos, umbrales de circuito, TTL de idempotencia, CIDR de proxy de confianza, límites de vista previa de medios y el sufijo del host del producto se controlan por entorno. Consulta Configuración para la tabla completa.

Plataforma14 min de lectura

Facturación & desembolsos

La facturación tiene dos funciones: permitir que los consumidores paguen por los planes de API y que el operador de la plataforma cobre por la capacidad del espacio de trabajo. Ambas usan los mismos proveedores, facturas y liquidación por webhook.

¿Conectas un proveedor por primera vez? Lee Pasarelas de pago, paso a paso primero. Cubre el panel del proveedor, las URL de webhook, el ID de webhook de PayPal y los pagos de prueba. Esta guía explica qué sucede después de conectar el proveedor.

Los dos planos de facturación

Piénsalo como dos cajas registradoras separadas:

PlanoQuién pagaQuién recibeQué desbloquea
Planes de API de proveedorConsumidor de APIProveedor de API, menos la comisión del marketplaceSolicitudes a ese producto, sujetas a su cuota y límite de velocidad.
Planes de plataformaPropietario del espacio de trabajoOperador de la plataformaLímites de cantidad de espacios de trabajo y de listados de API en la propia plataforma.

Ambos usan checkout alojado, webhooks firmados, facturas y conciliación. Los ingresos de las API de los proveedores entran en la liquidación de desembolsos; los ingresos de suscripciones de la plataforma, no.

Planes de proveedor

  • Intervalo mensual o anual, moneda, precio y descripción.
  • Cuota mensual, límite de velocidad por minuto, excedente por cada 1,000 solicitudes, días de prueba.
  • Hasta ocho líneas de funciones públicas y un plan público recomendado.
  • Derecho a endpoints all o selected.
  • Las condiciones comerciales se bloquean después de la primera suscripción; usa un plan de reemplazo para los cambios.

Checkout y liquidación

  1. El consumidor selecciona un plan y acepta los términos de la API.
  2. Se crean una suscripción pendiente y una factura del primer período.
  3. El proveedor configurado abre el checkout alojado.
  4. El proveedor envía un webhook firmado después del pago.
  5. FastRestful verifica la firma, registra el evento del proveedor, valida el importe y la moneda, y marca la factura como pagada.
  6. El derecho se activa solo después de la liquidación. Las redirecciones del navegador nunca conceden acceso.
webhooks del proveedor
POST /api/v1/billing/stripe-webhook/
POST /api/v1/billing/paypal-webhook/
POST /api/v1/billing/flutterwave-webhook/
POST /api/v1/billing/paystack-webhook/
POST /api/v1/billing/razorpay-webhook/

Compatibilidad de proveedores

Cada proveedor a continuación tiene una guía de configuración paso a paso en Pasarelas de pago, paso a paso.

ProveedorCheckoutPagosCredenciales
StripeSí, PaymentIntent integrado o alojadoTransferencias de ConnectSTRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET
PayPalSuscripciones de facturaciónPagosID/cliente secreto, ID de webhook
FlutterwaveCheckout alojadoConciliación manualPúblico/secreto/secreto de webhook
PaystackCheckout alojadoConciliación manualPúblico/secreto/secreto de webhook
RazorpayCheckout alojadoConciliación manualID de clave/secreto/secreto de webhook

Admin → Pasarelas de pago anula las credenciales del entorno campo por campo. Deshabilitar un registro de pasarela desactiva ese proveedor en todas partes, aunque las claves del entorno sigan presentes.

Reembolsos

  • Los proveedores con permiso de facturación reembolsan facturas pagadas a través de la pasarela original.
  • Los reembolsos de Stripe se concilian de forma acumulativa a partir de eventos de webhook; las pasarelas alojadas confirman de forma síncrona.
  • Las claves de idempotencia y las solicitudes de reembolso pendientes hacen seguros los reintentos.
  • Los reembolsos completos marcan la factura como reembolsada.
  • Los reembolsos posteriores al desembolso añaden asientos contables de recuperación de ingresos del proveedor y reversión proporcional de comisiones.
  • Los consumidores no pueden reembolsarse a sí mismos; los pagos manuales deben reembolsarse a través de su proveedor.

Pagos

estado del desembolso
pending ──► in_transit ──► paid
   │              │
   ├──► failed ◄──┘
   └──► reversed

# Only paid invoices settle. Refunds reduce the next transfer.
# Gross collected revenue is stored separately from net transfer.
# Provider event IDs are unique and retries are idempotent.
  • Configura un destino de desembolso para el proveedor con PATCH /api/v1/orgs/{id}/payout-provider/ (acct_… para Stripe o correo para PayPal).
  • Inicia una transferencia con POST /api/v1/payouts/{id}/transfer/.
  • Concilia con POST /api/v1/payouts/{id}/reconcile/; los estados estrictos requieren un ID de transferencia o un motivo de fallo.
  • Los webhooks de Stripe concilian transfer.created|paid|failed|reversed.

Suscripciones de plataforma

El modo multiproveedor debe estar activado. El pago de suscripciones de la plataforma no está disponible mientras el modo multivendedor esté desactivado en la configuración del sitio. Actívalo antes de vender planes de espacio de trabajo.
  • Los planes de plataforma se gestionan en Admin → Planes de plataforma; máximo cinco planes.
  • Cada plan puede definir límites de espacios de trabajo propios y de listados de API, beneficios y una recomendación.
  • Los planes de pago permanecen sin publicar hasta que se configure un importe visible y un ID de precio recurrente del proveedor coincidente.
  • Las sesiones de Checkout y Billing Portal se crean en el servidor con destinos fijos de FRONTEND_URL.
  • La conciliación de suscripciones es de solo lectura en el admin para que los cambios del personal no se desvíen del proveedor.

Comandos de liquidación

shell
python3.11 manage.py generate_invoices --period 2026-10
python3.11 manage.py generate_payouts --period 2026-10

# Both commands are idempotent and safe to rerun.

La tarea mensual de Celery se ejecuta el día 1 a las 00:05 UTC. Sin un broker, invoca los comandos manualmente.

Entorno del proveedor

Consulta Configuración → Pagos y desembolsos para cada variable. Como mínimo: Stripe secreto/webhook, PayPal cliente/webhook, o el trío público/secreto/webhook de la pasarela alojada. La interfaz de tarjetas del frontend también necesita NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY.

Plataforma24 min de lectura

Pasarelas de pago, paso a paso

Conecta un proveedor de pago real sin adivinar. Cada sección de proveedor tiene dos partes: qué hacer clic en el panel del proveedor y luego qué introducir en FastRestful. PayPal incluye un recorrido completo de webhooks, incluso dónde encontrar el ID de webhook que FastRestful requiere.

Antes de empezar

NecesitasPor qué
Una URL HTTPS públicaTodos los proveedores deben poder alcanzar tu endpoint de webhook. localhost no funcionará en un panel de proveedor real.
Primero una cuenta de pruebaUsa el modo sandbox/prueba hasta que se liquide un pago de prueba. Nunca depures con dinero real.
Acceso al adminConfigurarás los proveedores en Admin → Pasarelas de pago o en backend/.env.
Un plan que venderLos planes de API de proveedor se crean en el estudio del proveedor. Los planes de plataforma se crean en Admin → Planes de plataforma.
Un proveedor a la vez. Configura Stripe, realiza un pago de prueba y confirma que la factura esté pagada antes de añadir PayPal u otro gateway alojado. Los errores del proveedor son mucho más fáciles de encontrar cuando solo cambió una cosa.
Los planes gratuitos siguen funcionando sin proveedor. El pago no puede abrirse hasta que se habilite al menos un gateway. Si el pago muestra “No hay ningún proveedor de pagos configurado”, termina primero una sección de proveedor a continuación.
Los paneles de los proveedores cambian. Usa estos pasos como un mapa, no como una captura de pantalla. Si la etiqueta de un menú es distinta, busca el mismo concepto: claves de API, webhooks, productos, precios o pagos.

Cómo se mueve el dinero en FastRestful

  1. FastRestful crea una factura.

    La suscripción y la factura del primer período existen antes de que se abra el checkout. Aún no hay nada marcado como pagado.

  2. Para los planes de pago, el proveedor abre el checkout.

    El cliente paga en la página alojada del proveedor. FastRestful solo guarda la referencia del checkout.

  3. El proveedor envía un webhook firmado.

    FastRestful verifica la firma, registra el evento una vez y comprueba el importe y la moneda.

  4. La factura queda liquidada.

    Solo ahora se activa la suscripción y comienza el derecho. Una redirección del navegador nunca concede acceso.

Los webhooks son la fuente de verdad. Si el cliente paga pero el webhook nunca llega, la factura permanece abierta. El panel del proveedor es el lugar para inspeccionar y reenviar la entrega.

Dónde van las credenciales

Puedes poner las credenciales en backend/.env o en Admin → Pasarelas de pago. Los registros del admin son más fáciles de rotar y anulan los valores del entorno campo por campo. Deshabilitar un registro del admin desactiva el proveedor en todas partes, aunque las claves del entorno sigan existiendo.

ProveedorCampo públicoCampo secretoCampo de webhook
Stripe—Clave secreta (sk_…)Secreto de firma (whsec_…)
PayPalID de clienteSecreto de clienteID de webhook (no es un secreto ni la URL)
FlutterwaveClave públicaClave secreta (FLWSECK-…)Hash secreto que creas
PaystackClave pública (pk_…)Clave secreta (sk_…)Déjalo en blanco para usar la clave secreta
RazorpayID de clave (rzp_…)Secreto de claveSecreto de firma del webhook
Los nombres de los campos del admin son genéricos. En el formulario del gateway de pago, Clave pública significa el identificador público/cliente del proveedor, Clave secreta significa su secreto privado de API, y Secreto de webhook significa el valor de firma del webhook. En PayPal, esos son Client ID, Client secret y Webhook ID, respectivamente.

Probar webhooks en tu portátil

Los proveedores no pueden alcanzar http://127.0.0.1:5056. Usa uno de estos enfoques para pruebas locales.

Stripe CLI

  1. Instala la CLI de Stripe e inicia sesión.

    Sigue la guía de instalación de la CLI de Stripe, luego ejecuta stripe login y aprueba el aviso del navegador.

  2. Reenvía eventos a tu backend local.
    shell
    stripe listen --forward-to localhost:5056/api/v1/billing/stripe-webhook/
  3. Copia el secreto de firma que se imprime.

    La CLI imprime whsec_…. Ponlo en STRIPE_WEBHOOK_SECRET o en el registro de Stripe del admin. Mantén la CLI en ejecución.

  4. Activa un evento de prueba.
    shell
    stripe trigger checkout.session.completed
    stripe trigger invoice.paid

PayPal, Flutterwave, Paystack y Razorpay

Estos proveedores necesitan una URL HTTPS pública. Usa un túnel como ngrok o Cloudflare Tunnel y luego registra la URL del túnel en el panel del proveedor:

shell
# Example with ngrok
ngrok http 5056

# Use the generated https URL, for example:
# https://abc123.ngrok-free.app/api/v1/billing/paypal-webhook/

¿Cambias la URL del túnel más adelante? Actualiza juntos el panel del proveedor y el destino del webhook de FastRestful. Una URL obsoleta es la causa más común de «el pago se completó pero la factura nunca se cerró».

PayPal también ofrece un simulador de webhooks en el panel de desarrollador. Apúntalo a la URL del túnel y usa el ID de webhook de la misma app sandbox para que FastRestful pueda verificar el evento simulado.

Elegir un proveedor

ProveedorCheckoutPagosMejor opción
StripeCheckout alojado o interfaz de tarjetas integradaTransferencias de ConnectTarjetas globales, billeteras y desembolsos automatizados a proveedores.
PayPalÓrdenes de PayPal Checkout; PayPal Billing para planes de plataformaPayPal PayoutsCompradores que prefieren saldos de PayPal, tarjetas y suscripciones de PayPal.
FlutterwaveCheckout alojadoConciliación manualMercados africanos con métodos de pago locales.
PaystackCheckout alojadoConciliación manualNigeria, Ghana, Kenia y Sudáfrica.
RazorpayPayment LinksConciliación manualIndia, con precios en INR como referencia.
Planes de proveedor vs. planes de plataforma. Las suscripciones a planes de API de proveedores se facturan mediante facturas de FastRestful: el primer periodo abre un pago alojado y las facturas posteriores las genera el trabajo de liquidación. Las suscripciones de la plataforma usan la facturación recurrente del proveedor: precios de Stripe o planes de facturación de PayPal. El pago de suscripciones de la plataforma también requiere que el modo multivendedor esté habilitado en la configuración del sitio. Se configuran en lugares distintos.

Stripe, paso a paso

1. Crea y activa una cuenta de Stripe

  1. Crea una cuenta de Stripe y completa el perfil empresarial.
  2. Mantén Modo de prueba activado mientras integras. El interruptor está en la barra superior del panel de Stripe.
  3. Puedes aceptar pagos de prueba antes de que Stripe termine la activación de la cuenta.

2. Copia las claves de API

  1. Abre Developers → API keys.

    En el Stripe Dashboard, abre Developers y luego API keys.

  2. Copia la clave secreta.

    Usa primero la clave secreta de prueba (sk_test_…). Colócala en STRIPE_SECRET_KEY o en el registro de administración de Stripe. Nunca pongas la clave secreta en el código del frontend.

  3. Copia la clave publicable.

    Coloca la clave publicable de prueba (pk_test_…) en NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY si quieres la interfaz de tarjeta integrada. Recompila el frontend después de cambiarla.

3. Añade el endpoint de webhook de Stripe

  1. Abre Developers → Webhooks → Add endpoint.
  2. Define la URL del endpoint.
    URL de producción o staging
    https://api.example.com/api/v1/billing/stripe-webhook/
  3. Selecciona los eventos que FastRestful concilia.
    • checkout.session.completed
    • invoice.paid y invoice.payment_succeeded
    • invoice.payment_failed
    • customer.subscription.created, customer.subscription.updated, customer.subscription.deleted
    • charge.refunded
    • transfer.created, transfer.paid, transfer.failed, transfer.reversed (pagos)
  4. Copia el secreto de firma.

    Stripe muestra un valor que empieza por whsec_…. Este es STRIPE_WEBHOOK_SECRET. No es la clave secreta de la API.

Stripe firma cada entrega. FastRestful rechaza las firmas obsoletas y falla de forma segura cuando falta STRIPE_WEBHOOK_SECRET, por lo que es obligatorio un secreto de firma correcto.

4. Añade Stripe en FastRestful

Abre Admin → Payment gateways y edita la fila Stripe (recomendado), o usa variables de entorno.

Campo de FastRestfulValor de Stripe
ModoPrueba hasta que el sandbox funcione y luego pasa a Live.
Clave secretask_test_… o sk_live_…
Secreto de webhookwhsec_…

Si prefieres usar variables de entorno, define STRIPE_SECRET_KEY y STRIPE_WEBHOOK_SECRET y luego reinicia el backend y los workers.

5. Planes de plataforma y Stripe Prices

Solo es necesario si vendes suscripciones de plataforma. Los planes de API de proveedor usan el precio propio del producto y no necesitan un Stripe Price.

  1. Crea un Product en Stripe.

    Abre Product catalog → Add product. Ponle el nombre de tu plan de plataforma.

  2. Añade un Price recurrente.

    Usa el importe, la moneda y el intervalo de facturación exactos que muestra tu plan de plataforma. Los precios mensuales y anuales deben ser Prices separados.

  3. Copia cada Price ID.

    Los Price IDs empiezan por price_….

  4. Pégalos en el plan de plataforma.

    Abre Admin → Platform plans y completa Stripe monthly price ID y Stripe annual price ID.

FastRestful comprueba el Price con el importe, la moneda y el intervalo del plan al pagar. Si no coinciden, devuelve 409 con una explicación en lugar de cobrar un importe incorrecto.

6. Stripe Connect para pagos a proveedores

  1. Activa Connect en Stripe y crea una cuenta conectada para cada proveedor al que pagues.
  2. Copia el ID de la cuenta conectada (acct_…).
  3. Guárdalo como destino del proveedor con PATCH /api/v1/orgs/{id}/payout-provider/ o desde la configuración de pagos del proveedor.
  4. Opcionalmente, define PAYOUT_PROVIDER=stripe para permitir solo pagos con Stripe.
  5. Mantén seleccionados los eventos transfer.* en el webhook de Stripe.

7. Prueba Stripe

  1. Usa la tarjeta de prueba 4242 4242 4242 4242, cualquier fecha de caducidad futura y cualquier CVC.
  2. Completa un checkout y confirma que la factura pasa a pagada.
  3. Confirma que la suscripción se activa y que la clave de consumidor funciona.
  4. Abre Admin → Payment events y confirma que el evento se procesó una sola vez.
  5. Genera un reembolso y confirma que el estado de reembolso de la factura es correcto.

PayPal, paso a paso

PayPal es el proveedor con más pasos del lado de la plataforma. FastRestful usa dos productos de PayPal distintos: Checkout orders para compras de planes de API de proveedores y Billing subscriptions para planes de plataforma. Ambos usan las mismas credenciales de aplicación y el mismo webhook.

1. Crea una aplicación de PayPal y copia las credenciales

  1. Abre el PayPal Developer Dashboard.

    Ve a developer.paypal.com e inicia sesión con tu cuenta empresarial de PayPal.

  2. Elige Sandbox o Live.

    Usa el conmutador Sandbox/Live de la parte superior. Sandbox y Live tienen aplicaciones, credenciales e IDs de webhook separados.

  3. Abre Apps & Credentials → Create App.

    Ponle un nombre como FastRestful y selecciona la cuenta empresarial que debe recibir los pagos.

  4. Copia el Client ID y el Secret.

    Estos van en PAYPAL_CLIENT_ID y PAYPAL_CLIENT_SECRET (o en el registro de administración de PayPal). Si el secreto está oculto, usa la acción de regeneración de la aplicación y copia el nuevo valor.

2. Añade el webhook de PayPal (obligatorio)

Este es el paso que más gente omite. Sin un ID de webhook, FastRestful rechaza todos los eventos de PayPal y los pedidos pagados siguen sin pagarse.

  1. Abre tu aplicación en Apps & Credentials.
  2. Desplázate hasta Webhooks y haz clic en Add Webhook.

    La etiqueta exacta puede ser Webhooks o Add Webhook según la versión del panel de PayPal.

  3. Introduce la URL del webhook.
    URL del webhook de PayPal
    https://api.example.com/api/v1/billing/paypal-webhook/

    La URL debe ser HTTPS pública. Una redirección del navegador no prueba el pago; PayPal envía eventos firmados a esta URL, y esos eventos liquidan la factura.

  4. Selecciona los tipos de evento.
    Grupo de eventosSeleccionarPor qué lo necesita FastRestful
    Checkout ordersCHECKOUT.ORDER.APPROVED, PAYMENT.CAPTURE.COMPLETEDCaptura y liquida los pagos de planes de API de proveedores.
    SuscripcionesBILLING.SUBSCRIPTION.ACTIVATED, BILLING.SUBSCRIPTION.CANCELLED, BILLING.SUBSCRIPTION.SUSPENDED, BILLING.SUBSCRIPTION.EXPIREDActiva y actualiza las suscripciones de plataforma. ACTIVATED es el evento que concede el derecho de uso.
    Pagos de suscripciónPAYMENT.SALE.COMPLETEDRegistra renovaciones y reactiva suscripciones de plataforma vencidas.
    PagosPAYMENT.PAYOUTS-ITEM.SUCCEEDED, PAYMENT.PAYOUTS-ITEM.FAILED, PAYMENT.PAYOUTS-ITEM.BLOCKED, PAYMENT.PAYOUTS-ITEM.RETURNED, PAYMENT.PAYOUTS-ITEM.CANCELEDConcilia las transferencias de pagos a proveedores.
  5. Guarda el webhook y copia el Webhook ID.

    Abre el webhook guardado si es necesario. PayPal muestra un webhook ID (una cadena alfanumérica corta). Este es PAYPAL_WEBHOOK_ID. No es la URL del webhook y no es el client secret.

Por qué PayPal es diferente. FastRestful no aplica hash al payload de PayPal con un secreto compartido. Envía las cabeceras del webhook y el cuerpo del evento al /v1/notifications/verify-webhook-signature endpoint de PayPal junto con el ID de webhook almacenado. Si el ID falta, es de otro entorno o de otra aplicación, la verificación falla y FastRestful devuelve 400 Bad signature. Este es un comportamiento intencional de fallo cerrado.

3. Añade PayPal en FastRestful

Campo de FastRestfulValor de PayPal
ID de clienteClient ID de la aplicación
Secreto de clienteSecret de la aplicación
ID de webhookEl ID de webhook que copiaste en el paso anterior
ModoTest para sandbox, Live para producción

Abre Admin → Payment gateways y edita la fila PayPal. En ese formulario, Public key es el Client ID, Secret key es el Client secret y Webhook secret es el Webhook ID.

Si prefieres variables de entorno:

backend/.env
PAYPAL_CLIENT_ID=...
PAYPAL_CLIENT_SECRET=...
PAYPAL_WEBHOOK_ID=...
PAYPAL_ENV=sandbox          # use live in production
# PAYPAL_API_BASE=          # only for a proxy or custom host

Reinicia el backend y los workers después de cambiar los valores de entorno. Si usas el registro de administración, guárdalo y actívalo; no hace falta reiniciar.

4. Planes de PayPal Billing para suscripciones de plataforma

Omite esto a menos que vendas suscripciones de plataforma con PayPal. Los planes de API de proveedores usan pedidos Checkout de pago único y no necesitan un plan de PayPal Billing.

  1. Crea un Product en PayPal.

    En el panel de PayPal, abre el área Billing/Subscriptions y crea un producto que represente tu plataforma.

  2. Crea un Plan mensual o anual (o ambos).

    Define el importe, la moneda y el intervalo exactos que coincidan con el plan en FastRestful. Crea un plan separado para cada intervalo.

  3. Copia cada Plan ID.

    Los Plan IDs de PayPal empiezan por P-….

  4. Pégalos en el plan de plataforma.

    Abre Admin → Platform plans y completa PayPal monthly plan ID y PayPal annual plan ID.

  5. Confirma que el webhook incluye eventos de suscripción.

    La suscripción se crea en estado PENDING. Solo se activa cuando llega BILLING.SUBSCRIPTION.ACTIVATED.

5. PayPal Payouts para proveedores

  1. Confirma que la cuenta empresarial de PayPal está aprobada para Payouts.
  2. Guarda el email receptor de PayPal del proveedor como su destino de pagos con PATCH /api/v1/orgs/{id}/payout-provider/.
  3. Opcionalmente, define PAYOUT_PROVIDER=paypal o PAYOUT_PROVIDER=stripe,paypal para permitir ambos.
  4. Mantén seleccionados los eventos PAYMENT.PAYOUTS-ITEM.* en el webhook.

6. Prueba el sandbox de PayPal

  1. Usa credenciales de sandbox.

    Define PAYPAL_ENV=sandbox, usa el Client ID y el secret de la aplicación de sandbox, y el ID de webhook de sandbox.

  2. Crea una cuenta de comprador de sandbox.

    El PayPal Developer Dashboard proporciona cuentas personales de prueba. Inicia sesión en sandbox.paypal.com con ese comprador cuando se abra el checkout.

  3. Completa un pago de prueba.

    Aprueba el pedido y espera la redirección de vuelta a FastRestful.

  4. Comprueba la recepción del webhook.

    Abre Admin → Payment events. Deberías ver CHECKOUT.ORDER.APPROVED, luego PAYMENT.CAPTURE.COMPLETED, y la factura debería quedar pagada.

  5. Reenvía una entrega si es necesario.

    En el panel de PayPal, abre las entregas de eventos del webhook y reenvía el evento fallido. FastRestful deduplica por ID de evento.

Solución de problemas del webhook de PayPal

Respuesta de FastRestfulSignificadoSolución
400 PayPal webhook is not configured.Falta el client ID o el client secret, o el registro de administración está desactivado.Completa el client ID y el secret y activa el registro. Reinicia si usas variables de entorno.
400 Bad signature.Falta el ID de webhook, pertenece a otra aplicación u otro entorno, o se eliminaron las cabeceras de firma.Copia el ID de webhook de la misma aplicación de sandbox o live. No uses la URL ni el client secret. Comprueba que tu proxy reenvía las cabeceras Paypal-*.
404 Unknown invoice for PayPal capture.La captura llegó antes de que existiera la referencia local de la factura o el evento provino de otra instalación.Reenvía el evento desde PayPal después de confirmar que este checkout lo creó esta instalación.
{"status":"ignored"}El evento no es uno que FastRestful gestione, o la referencia de suscripción o pedido es desconocida.Comprueba que los tipos de evento anteriores estén seleccionados. Confirma que este entorno de FastRestful creó el checkout.
{"status":"duplicate"}El mismo ID de evento se entregó dos veces.No hagas nada. Es la protección de idempotencia funcionando.

Flutterwave, paso a paso

  1. Crea y verifica una cuenta de Flutterwave.

    Completa el perfil empresarial y el KYC antes de usar el modo live.

  2. Copia las claves de API.

    Abre Settings → API Keys. Copia la clave pública y la clave secreta. Las claves de test y live son distintas.

  3. Añade la URL del webhook.

    Abre Settings → Webhooks y define:

    URL del webhook de Flutterwave
    https://api.example.com/api/v1/billing/flutterwave-webhook/
  4. Crea un secret hash.

    Introduce una cadena aleatoria larga como secret hash del webhook. Pon el mismo valor en FLUTTERWAVE_WEBHOOK_SECRET o en el registro de administración. Es un valor que tú eliges, no una clave que genere Flutterwave.

  5. Introduce las claves en FastRestful.

    Edita la fila Flutterwave en Admin → Payment gateways, o define FLUTTERWAVE_PUBLIC_KEY, FLUTTERWAVE_SECRET_KEY y FLUTTERWAVE_WEBHOOK_SECRET.

  6. Prueba un checkout.

    FastRestful gestiona charge.completed con estado successful. Los demás eventos se confirman y se ignoran.

Paystack, paso a paso

  1. Crea y activa una cuenta de Paystack.

    Completa los pasos de activación empresarial antes de usar claves live.

  2. Copia las claves de API.

    Abre Settings → API Keys & Webhooks. Copia las claves pública y secreta para el modo test o live.

  3. Añade la URL del webhook.
    URL del webhook de Paystack
    https://api.example.com/api/v1/billing/paystack-webhook/
  4. Deja en blanco el secreto del webhook.

    Paystack firma cada webhook con tu clave secreta usando HMAC-SHA512. FastRestful recurre a PAYSTACK_SECRET_KEY cuando PAYSTACK_WEBHOOK_SECRET está vacío. Solo define un valor alternativo si el soporte de Paystack te da una clave de firma separada.

  5. Introduce las claves en FastRestful.

    Edita la fila Paystack en Admin → Payment gateways, o define PAYSTACK_PUBLIC_KEY y PAYSTACK_SECRET_KEY.

  6. Prueba un checkout.

    FastRestful gestiona charge.success y compara el importe en la unidad mínima de la moneda (por ejemplo, kobo para NGN).

Razorpay, paso a paso

  1. Crea y verifica una cuenta de Razorpay.

    Completa el KYC y activa los pagos live.

  2. Genera claves de API.

    Abre Account & Settings → API Keys y genera una clave. Copia el Key ID y el Key Secret.

  3. Añade el webhook.

    Abre Account & Settings → Webhooks → Add New Webhook y define:

    URL del webhook de Razorpay
    https://api.example.com/api/v1/billing/razorpay-webhook/

    Selecciona payment_link.paid. FastRestful crea un Razorpay Payment Link para el checkout y concilia ese evento. Define un secreto de webhook robusto; Razorpay firma con HMAC-SHA256 y el mismo valor debe guardarse en FastRestful.

  4. Introduce las claves en FastRestful.

    Edita la fila Razorpay en Admin → Payment gateways, o define RAZORPAY_KEY_ID, RAZORPAY_KEY_SECRET y RAZORPAY_WEBHOOK_SECRET.

  5. Prueba un checkout.

    Abre el Payment Link, paga con un método de prueba y confirma que la factura queda pagada y el evento se registra una sola vez.

La prueba de aceptación de 10 minutos

Ejecuta esto para cada proveedor antes de pasar a producción:

  • El proveedor aparece configurado y habilitado en Admin → Payment gateways.
  • Un checkout de prueba abre la página del proveedor y vuelve a la URL correcta del frontend.
  • El webhook firmado llega y aparece una sola vez en Admin → Payment events.
  • La factura se marca como pagada solo después del webhook, no con la redirección.
  • La suscripción se activa y una clave de consumidor funciona.
  • Un reembolso vuelve al método de pago original y actualiza el libro mayor.
  • Si los pagos están habilitados, una transferencia de prueba llega al destino del proveedor y se concilia.
  • Una entrega duplicada del webhook se confirma sin liquidar dos veces.

Errores comunes con webhooks

ErrorQué ocurreSolución
Usar http://localhost como URL del webhookEl proveedor no puede llegar a tu máquina.Usa una URL HTTPS pública o un túnel para pruebas locales.
Mezclar credenciales de test y liveEl checkout se abre, pero falla la verificación del webhook o se cobra a la cuenta equivocada.Mantén todo el conjunto en el mismo modo: claves, ID o secreto del webhook y entorno del proveedor.
Pegar la URL del webhook de PayPal como PAYPAL_WEBHOOK_IDCada evento de PayPal devuelve Bad signature.Copia el ID de webhook desde la página de detalle Webhooks de la aplicación.
Usar la clave secreta de Stripe como secreto del webhookLas entregas de Stripe fallan la verificación.Usa el secreto de firma del endpoint (whsec_…).
Olvidar suscribirse a un eventoEl proveedor nunca lo envía, así que la factura queda abierta.Selecciona la lista de eventos de ese proveedor exactamente como se muestra arriba.
Cambiar la URL del túnelLas entregas van a un host antiguo y fallan.Actualiza el panel del proveedor y FastRestful a la vez.
Importe o moneda incorrectosFastRestful rechaza la liquidación para proteger el libro mayor.Haz que el plan y el precio del proveedor coincidan exactamente.
El proxy elimina las cabeceras de firmaLa verificación falla incluso con los secretos correctos.Reenvía las cabeceras del proveedor sin cambios a través de Nginx, Cloudflare o tu balanceador de carga.

Lista de verificación para salir a producción

  1. Cambia a credenciales live.

    Sustituye las claves, los IDs de webhook y los secretos de prueba por valores live. Define PAYPAL_ENV=live para PayPal.

  2. Registra las URL de webhook de producción.

    Usa tu nombre de host real de API, no un túnel, y confirma que HTTPS funciona desde internet pública.

  3. Define la clave publicable del frontend.

    Usa la clave publicable live de Stripe y recompila el frontend.

  4. Haz coincidir los precios y los plan IDs.

    Confirma que los Stripe Price IDs y los PayPal Billing plan IDs apuntan a objetos live con el importe, la moneda y el intervalo exactos.

  5. Realiza un pago real pequeño y reembólsalo.

    Verifica el webhook, la factura, el derecho de uso, el reembolso y los asientos del libro mayor. Es la única forma de probar el flujo live.

  6. Vigila los eventos del primer día.

    Revisa Admin → Payment events en busca de fallos y confirma que el panel del proveedor muestra entregas correctas.

Experiencia8 min de lectura

Biblioteca de medios y CDN

Un único flujo de almacenamiento para recursos multimedia, logotipos de productos, fotos de proveedores, avatares de usuarios e imágenes del CMS. Sistema de archivos local en desarrollo; S3 + CloudFront en producción.

Tipos admitidos y límites

TipoExtensionesLímite
Imagenjpg, jpeg, png, webp, gif8 MB
Vídeomp4, webm64 MB
Audiomp3, wav, ogg16 MB
Documentopdf, txt, csv16 MB
Archivozip32 MB

La validación comprueba la extensión, el tipo de contenido declarado, la firma de bytes mágicos y el tamaño. Los bytes idénticos dentro de un mismo espacio de trabajo se deduplican mediante checksum SHA-256. GET /api/v1/media/supported-types/ determina las sugerencias de tipos aceptados en la UI.

Modos de almacenamiento

MEDIA_STORAGEComportamiento
localAlmacenamiento del sistema de archivos de Django en MEDIA_ROOT; servido en /media/.
s3S3 mediante django-storages. Los nombres de objeto UUID son inmutables y se escriben con una cabecera de caché inmutable de un año.

El modo S3 requiere boto3 y django-storages en el entorno de producción. manage.py check falla si falta el bucket y advierte cuando no se configura ni un dominio CDN ni una ACL de lectura pública.

Configuración de CloudFront

  1. Crea un bucket privado con Block all public access habilitado.
  2. Crea una distribución de CloudFront con el bucket como origen y Origin Access Control (OAC).
  3. Concede a la distribución s3:GetObject sobre arn:aws:s3:::<bucket>/* mediante la política de bucket generada.
  4. Apunta MEDIA_CDN_DOMAIN a la distribución o a un CNAME con un certificado ACM.
  5. Opcionalmente, define MEDIA_CDN_DISTRIBUTION_ID para habilitar las acciones de purga.
Como los nombres de los objetos son inmutables, las cargas reemplazadas obtienen una clave nueva. El almacenamiento en caché de CDN de larga duración es seguro y rara vez se necesitan purgas. Configura MEDIA_S3_ACL=public-read solo cuando sirvas directamente desde S3 sin CloudFront.

Flujos de trabajo de la biblioteca

  • Consola: el personal sube y gestiona la biblioteca; los inquilinos ven un estante de solo lectura de su espacio de trabajo en /dashboard/media o /vendor/media.
  • Colecciones: carpetas o categorías por espacio de trabajo con búsqueda, filtros y movimientos masivos.
  • Preajustes de renombrado: kebab, snake, Title Case, UPPER o mantener, con prefijos, sufijos y secuencias con relleno.
  • Puntos focales: focal_x/focal_y por recurso (0–100) usados por los bloques de imagen del CMS.
  • Selección por rango: haz clic con Mayús en un rango, descarga, copia la URL y abre el recurso anterior o siguiente en el panel lateral.
  • Indicadores de uso: consulta dónde se referencia un recurso antes de eliminarlo.

Funcionamiento del selector

Elegir un recurso de la biblioteca copia sus bytes en el campo de destino. Sustituir o eliminar el recurso de la biblioteca nunca rompe una imagen elegida, y cada modelo conserva su propio ciclo de vida de almacenamiento. Los recursos de otros espacios de trabajo se rechazan.

Destinos conectados: logotipo de producto, perfil o portada de proveedor, avatar de usuario, identidad visual del administrador, imágenes de categoría, imágenes del CMS y medios de bloques de contenido.

API de medios

EndpointPropósito
GET/POST /api/v1/media/Listado con tipo, búsqueda y ordenación, y carga multipart.
PATCH/DELETE /api/v1/media/{id}/Metadatos, texto alternativo, etiquetas y eliminación.
POST /api/v1/media/bulk-delete/Eliminación por lotes por IDs.
GET /api/v1/media/supported-types/Registro de tipos y límites.
GET /api/v1/media/storage-info/Diagnóstico de backend, bucket, CDN, ACL y URL de ejemplo, solo para personal.

Entorno

Consulta Configuration para ver la matriz de almacenamiento de medios y especificaciones, incluidos la URL del endpoint, el dominio CDN, el ID de distribución y el comportamiento de la ACL.

Experiencia12 min de lectura

Estudio de newsletter

Email marketing solo para personal con audiencias, plantillas basadas en bloques, campañas, pruebas A/B de asunto, segmentos, automatizaciones, analítica por enlace y correo transaccional del sistema.

Estudio de newsletter de FastRestful con crecimiento, entregabilidad, campañas, suscriptores y actividad de correo
El estudio de newsletters es una superficie operativa independiente dentro del plano de control, no una pestaña de configuración escondida.

Inicio rápido

  1. Abre /admin/newsletter/ → Settings y configura el proveedor, el remitente, la URL pública del backend, la dirección postal y el texto de baja.
  2. Lists & contacts → crea una lista; añade o importa contactos como email, name, tags.
  3. Templates → duplica una plantilla inicial integrada o empieza en blanco, diseña con el editor de bloques y luego guarda y previsualiza.
  4. Campaigns → elige una plantilla, listas, un segmento opcional y el asunto o asuntos, y envíate una prueba.
  5. Automations → añade pasos de email y de espera; las altas en listas o las etiquetas activan la inscripción.
  6. System emails → vincula plantillas a disparadores transaccionales.
Configuración del proveedor: para ver los pasos exactos en el panel de SES, Mailgun, SendGrid, Postmark, Brevo, Mailjet, SparkPost, Resend o SMTP personalizado, consulta External integrations → Email.
trabajo programado
python3.11 manage.py newsletter_beat
# or schedule the Celery tasks:
# newsletter.send_due_campaigns
# newsletter.process_automations

Proveedores de email

ProveedorNotas sobre credenciales
SMTP (personalizado)Host, puerto, usuario, contraseña, TLS/SSL; los campos vacíos heredan EMAIL_*.
Amazon SESCredenciales SMTP y región.
MailgunClave de API y dominio de envío; compatible con la región de la UE.
SendGridClave de API Bearer.
PostmarkToken de servidor.
BrevoClave de API.
MailjetClave de API y secreto.
SparkPostClave de API Bearer.
ResendClave de API Bearer.

Los secretos se cifran en reposo. Un botón de prueba envía a través del proveedor seleccionado antes de que lances una campaña.

Plantillas y diseñador

  • Bloques: header, hero, texto, imagen, botón, separador, espaciador, imagen + texto, características, cita, enlaces sociales, HTML sin formato, footer.
  • Bloques avanzados: columnas, testimonio, tabla, vídeo, tarjeta de producto, banner CTA, nota de footer.
  • Variantes para diseños de hero, tamaño y alineación del texto, marcos y leyendas de imagen, estilo, tamaño y alineación del botón, estilo y ancho del separador, radio del tema y ancho del contenido.
  • Arrastrar y soltar, reordenación con teclado, vista previa en vivo con debounce, alternativa en texto plano, preheader y URL saneadas.
  • Placeholders: {{first_name}}, {{action_url}}, {{message}}, {{site_name}}, {{unsubscribe_url}}, {{preferences_url}}.
  • 18 plantillas integradas para lanzamientos, resúmenes, webinars, casos prácticos, recuperación de clientes, NPS, promociones, registros de cambios, editoriales, destacados de la comunidad, onboarding y anuncios de servicio.

Campañas

  • La audiencia es la unión de las listas seleccionadas ∩ el segmento opcional, sin duplicados; solo contactos suscritos, excluyendo las direcciones con rebotes o quejas.
  • Las pruebas A/B de asunto dividen un porcentaje de destinatarios, esperan una ventana y luego envían la variante ganadora al resto. También puedes decidir el ganador manualmente cuando quieras.
  • Reenviar a no abiertos crea un borrador dirigido solo a los contactos que no abrieron la campaña original.
  • Programación, pausa, reanudación y cancelación, envío de prueba y calendario de campañas.
  • Informes: entregas, aperturas, clics, bajas, comparación A/B, tabla de clics por enlace, cronología de interacción y destinatarios más recientes.
  • Los valores UTM predeterminados se aplican a los enlaces de campaña; solo se aceptan destinos http(s).

Segmentos y automatizaciones

Los segmentos combinan listas, etiquetas (todas o cualquiera), estado del contacto, ventanas de interacción (abrió, hizo clic, no abrió en N días) y recencia de alta. Los recuentos se evalúan en vivo y los reutilizan las campañas.

Las automatizaciones se activan por alta en una lista, etiqueta, acción manual o API. Los pasos envían un email o esperan N horas. Las ejecuciones avanzan de forma idempotente y registran los fallos. La inscripción se deduplica por contacto.

Emails del sistema

Si una plantilla activa del estudio está vinculada a un disparador, se renderiza en HTML + texto; de lo contrario, se envía el mensaje plano heredado. Las claves vinculadas incluyen bienvenida, restablecimiento de contraseña, código de inicio de sesión, alerta de seguridad, aviso de plataforma, factura abierta, pago fallido, proveedor aprobado, alerta de cuota, invitación a organización y resumen de actividad.

Registro público y preferencias

  • POST /api/v1/newsletter/subscribe/ con confirmación opcional de doble opt-in.
  • GET /confirm/<token>/, GET /unsubscribe/<token>/ y POST de un clic según RFC 8058.
  • Centro de preferencias en /api/v1/newsletter/preferences/<token>/ para activar o desactivar listas o darte de baja globalmente.
  • El píxel de apertura y las redirecciones de clic reescriben los enlaces cuando el seguimiento está habilitado.
  • El correo saliente incluye las cabeceras List-Unsubscribe y List-Unsubscribe-Post.

Entregabilidad y operaciones

  • Gráficos de rebotes, quejas, bajas y crecimiento; mantén las tasas de rebotes y quejas cerca de cero.
  • Mapa de calor de horas de envío por día de la semana local × hora, con recomendaciones de mejores ventanas.
  • Estimaciones de audiencia y direcciones de muestra antes del envío.
  • Página de contactos con estado, etiquetas, campos personalizados, pertenencias, supresiones, entregas, eventos y ejecuciones de automatización.
  • Exportaciones CSV de contactos, destinatarios de campañas y enlaces.
  • Ejecuta newsletter_beat cada pocos minutos para programaciones, decisiones A/B y esperas de automatización.
Experiencia8 min de lectura

Anuncios y banners

Banners públicos diseñados desde el administrador para barras superiores, ubicaciones del footer y anuncios dentro de la página, con segmentación, programación, reglas de descarte, experimentos visuales y analítica de impresiones y clics.

Ubicaciones

ClaveDónde aparece
topbarBarra de ancho completo sobre el header público.
footerBanner de ancho completo sobre la cuadrícula del footer.
footer_leftEspacio publicitario del footer izquierdo.
footer_rightEspacio publicitario del footer derecho.
centerBanner dentro de la página, entre el header y el contenido.

Se sirve un banner por ubicación, elegido por prioridad y luego por recencia. Un banner puede dirigirse a varias ubicaciones.

Segmentación y programación

  • Rutas: patrones de inclusión y exclusión como /pricing, /docs/* o *.
  • Audiencia: todos, visitantes sin sesión o usuarios con sesión iniciada.
  • Idioma y dispositivo: listas de permitidos separadas por comas; la tablet recurre a móvil cuando se permite móvil.
  • Programación: marcas de tiempo de inicio y fin y un interruptor de activación.
  • Prioridad: los números más altos ganan cuando coinciden varios banners.

Diseño y elementos integrados

  • Diseños: barra, tarjeta, dividido, minimalista.
  • Badge, titular, cuerpo, etiqueta, URL, estilo y apertura en nueva pestaña del CTA, imagen, lado, colores, degradados, alineación y vista previa en vivo.
  • Icono o emoji opcional, patrones decorativos (puntos, cuadrícula, rayas, brillo) y animaciones de entrada seguras para movimiento reducido.
  • 32 banners integrados para lanzamientos, confianza y estado, promociones, eventos, ciclo de vida, editorial, comunidad y campañas de temporada.
  • HTML personalizado con los placeholders {{click_url}}, {{dismiss_url}} y {{impression_url}} para que el seguimiento siga funcionando.
  • Frecuencia de descarte: en cada carga de página, una vez por sesión, una vez al día o una sola vez.

Entrega y seguimiento

endpoints públicos
GET  /api/v1/announcements/?path=/pricing&locale=en&placement=topbar
POST /api/v1/announcements/<id>/impression/
POST /api/v1/announcements/<id>/dismiss/
GET  /api/v1/announcements/<id>/click/

Los payloads incluyen HTML renderizado en el servidor con estilos inline, además de impression_url, dismiss_url y frequency. Los eventos registran ubicación, ruta, idioma, dispositivo, referrer, user agent e IP.

Experimentos e informes

  • Los banners con la misma prioridad reparten el tráfico por peso (1–1000).
  • Define un nombre de experimento y una etiqueta de variante en varios banners; se elige una variante por solicitud según el peso.
  • Los informes de experimentos muestran impresiones, clics, CTR y la variante líder.
  • Los informes grafican la actividad diaria de 30 y 90 días y desglosan por ubicación, páginas principales, dispositivos y eventos recientes.
  • Las listas del administrador muestran contadores, acciones de activación y pausa, y registros de eventos de solo lectura.

Operaciones

Los eventos de banners son de solo añadido. El estado de descarte se guarda en el navegador del visitante y se cuenta en el servidor. El script público omite los user agents de bots; usa un user agent de navegador normal para las pruebas de banners públicos.

Experiencia7 min de lectura

Enlaces cortos

Enlaces cortos listos para campañas, redirecciones, códigos QR, valores UTM predeterminados, alternativas, analítica de clics y comprobaciones de destinos rotos, disponibles tanto en el panel del consumidor como en el estudio del proveedor.

  • Crea enlaces cortos con un slug personalizado, destino, etiquetas, tipo de redirección, caducidad y estado activo.
  • Redirecciones 301 o 302; los enlaces caducados o deshabilitados pueden recurrir a un destino seguro o a una página 410 con marca.
  • Valores UTM predeterminados (utm_source, utm_medium, utm_campaign) añadidos en el momento de la redirección; los parámetros de campaña entrantes tienen prioridad.
  • Generación de QR en SVG con color personalizado y metadatos de campaña.
  • Analítica de clics con país, dispositivo, referrer y contexto de campaña.
  • Comprobaciones de estado de destinos rotos con detalles del error y nueva comprobación con un clic.
  • Importación y exportación CSV y acciones de selección masiva.

Abre Links en el panel del consumidor (/dashboard/links) o en el estudio del proveedor (/vendor/links). El editor incluye título, destino, slug, etiquetas, tipo de redirección, caducidad, interruptor de activación y ámbito de todo el sitio solo para personal. La tabla ofrece acciones de copiar, QR, volver a comprobar, editar, eliminar, estado de salud y estado.

VariablePropósito
SHORTLINK_BASE_URLOrigen público de enlaces cortos, por ejemplo https://go.example.com.
NEWSLETTER_TRACKING_BASE_URLOrigen alternativo cuando la base de enlaces cortos está vacía.
FRONTEND_URLOrigen alternativo final.
programar comprobaciones de estado
python3.11 manage.py checklinks --limit 200 --timeout 6
EndpointPropósito
GET/POST /api/v1/short-links/Lista y crea enlaces del espacio de trabajo.
PATCH/DELETE /api/v1/short-links/{id}/Edita o elimina.
GET /api/v1/short-links/{id}/qr/QR SVG con color opcional.
POST /api/v1/short-links/{id}/check/Vuelve a comprobar el estado del destino.
GET /api/v1/short-links/export/Exportación CSV.
POST /api/v1/short-links/import/Importación CSV.

Las redirecciones públicas resuelven por slug, registran el clic y luego redirigen. Las listas del administrador incluyen columnas de clics y estado, acciones de volver a comprobar, activar y deshabilitar, una acción rápida «Acortar un enlace» y un registro de clics de solo lectura.

Experiencia12 min de lectura

Sitio, CMS e idiomas

El plano de control de Django es responsable del shell público: identidad, valores predeterminados de búsqueda y compartición, navegación, páginas, entradas del blog, documentos legales, CSS y JS personalizados, modo de mantenimiento y capas de idioma.

Superficies del operador

Ruta de administraciónPosee
/admin/platform/sitesettings/Política del marketplace, recursos de marca, metadatos globales, textos de header y footer, anuncio, contacto de soporte, política de dos factores y modo de mantenimiento.
/admin/platform/sitenavigationitem/Enlaces ordenados de header y footer, ubicación, visibilidad y comportamiento de apertura en nueva pestaña.
/admin/platform/contentpage/Páginas, entradas del blog, borradores legales, secciones estructuradas, medios de portada, SEO y estado de publicación.
/admin/platform/siteasset/Fragmentos personalizados de CSS y JS, alcance por ruta, vista previa e historial de revisiones.
/admin/platform/sitelocale/Idiomas integrados, capas del administrador, cobertura de traducción, importación y exportación.

Configuración del sitio

  • Logotipo, favicon e imagen para compartir en redes con selector de medios y limpieza tras la confirmación.
  • Título y descripción meta globales, y fallback de imagen para compartir.
  • Modo del marketplace, porcentaje de comisión predeterminado e indicador de mantenimiento.
  • Etiqueta y destino del CTA del header (deben indicarse juntos).
  • Banner de anuncio activado, texto y URL.
  • Titular, resumen, copyright y email de soporte del footer.
  • Desafío integrado o Google reCAPTCHA para formularios públicos.
  • Política obligatoria de dos factores para todas las cuentas.
  • Colores del tema, fuentes y vista previa en vivo del shell público.

Contenido estructurado

Las páginas y entradas se componen de secciones ordenadas, no de HTML sin formato. Los tipos de sección disponibles incluyen prosa, tabla, código, imagen, vídeo, dividido, cita, pestañas, código multilenguaje, ejemplo de endpoint, testimonios, lista de características, FAQ, pasos, métricas, cuadrícula de tarjetas, separador, hero, tira de logotipos, cronología, lista de enlaces, aviso destacado, colección de API, colección de categorías, APIs principales y artículos recientes.

  • La prosa admite párrafos separados por una línea en blanco; los elementos de lista van uno por línea.
  • Las acciones requieren una etiqueta y un destino; los enlaces aceptan rutas del sitio, HTTPS, mailto o tel.
  • Los borradores nunca aparecen públicamente; las páginas publicadas aparecen en el contenido del sitio, los metadatos y las rutas del sitemap.
  • El SEO a nivel de página sobrescribe los valores globales por campo.
  • Las páginas legales se unen al grupo legal predeterminado del footer solo después de publicarse.

CSS y JS personalizados

Admin → Custom assets inyecta CSS o JavaScript en el sitio público sin necesidad de un despliegue. Cada fragmento tiene un tipo, una ubicación (head o footer) y un ámbito (todo el sitio, rutas seleccionadas o una página). Las rutas admiten coincidencias exactas y comodines /prefix/*.

  • Payload público: GET /api/v1/platform/assets/ devuelve los fragmentos activos y el csp_nonce configurado.
  • Vista previa: cada fragmento tiene una vista previa en un iframe dentro del administrador con inyección forzada mediante ?fr_preview_asset=<id>.
  • Revisiones: cada guardado crea una instantánea inmutable con autor y nota; cualquier revisión se puede restaurar como una entrada nueva.
  • CSP: define el mismo nonce en Site settings y en tu política de edge; las etiquetas lo reciben automáticamente.

Idiomas y capas de traducción

El inglés es el paquete de origen canónico. El francés se distribuye completo. Cualquier otro idioma es una capa dispersa del administrador que se combina sobre el inglés en tiempo de ejecución.

  • Abre Site locales → Manage translations para inspeccionar la cobertura, editar el francés integrado o añadir un idioma.
  • El francés integrado aparece al 100 % sin una fila en la base de datos. Guardar un campo crea una capa del administrador sin cambiar el fallback incluido.
  • Exporta JSON o TypeScript, traduce sin conexión y vuelve a importar. Las claves desconocidas se ignoran y se notifican.
  • La API pública de idiomas devuelve las capas activas; el frontend las combina sobre el inglés y el francés integrados.
  • Después de editar lib/i18n/*.json, ejecuta npm run export:i18n y reinicia la API para actualizar su caché de proceso.

Modo de mantenimiento

El mantenimiento pausa todas las rutas del frontend y las llamadas a la API y al gateway de clientes. El admin del personal, las sondas de salud, los callbacks del proveedor de identidad y los webhooks firmados de pagos y pagos a proveedores siguen disponibles. La disponibilidad pública se expone de forma anónima con el indicador de mantenimiento, el aviso y el intervalo de reintento.

Contratos públicos

EndpointExpone
GET /api/v1/platform/branding/Logotipo, favicon y hora de actualización.
GET /api/v1/platform/site-metadata/Título, descripción, imagen social, favicon y hora de actualización.
GET /api/v1/platform/site-content/Navegación activa, textos del shell y páginas y entradas publicadas.
GET /api/v1/platform/site-pages/Metadatos de rutas publicadas para SEO y sitemap.
GET /api/v1/platform/availability/Indicador de mantenimiento, aviso e intervalo de reintento.
GET /api/v1/platform/assets/CSS y JS personalizados activos y nonce de CSP.
GET /api/v1/platform/locales/Capas de idioma activas.
Avanzado14 min de lectura

Integraciones externas, paso a paso

Email, almacenamiento de objetos, inicio de sesión único, infraestructura y webhooks salientes. Cada sección te indica primero qué hacer en el sitio web del proveedor y luego exactamente qué valores copiar en FastRestful.

Los pagos tienen su propia guía. Stripe, PayPal, Flutterwave, Paystack, Razorpay, los webhooks y los pagos se tratan en Pasarelas de pago, paso a paso.

¿Qué valor prevalece?

  • Las variables de entorno proporcionan valores predeterminados para el despliegue.
  • Los registros gestionados desde el administrador sobrescriben los valores de entorno coincidentes campo por campo.
  • Desactivar un registro del administrador desactiva ese proveedor en todas partes, aunque las claves de entorno sigan definidas.
  • Los valores del proveedor en el frontend se incorporan en tiempo de compilación. Recompila después de cambiar NEXT_PUBLIC_*.
  • Ejecuta la acción de prueba del proveedor antes de enviar tráfico real.

Proveedores de email y newsletters

FastRestful puede enviar emails de campaña, automatizaciones y del sistema a través de tu propio proveedor. Configúralo en Admin → Newsletter → Email settings o hereda SMTP de las variables de entorno EMAIL_*. Las claves de API y los secretos se cifran en reposo.

La configuración en seis pasos

  1. Crea una cuenta con un proveedor.

    Usa un proveedor transaccional como Amazon SES, Mailgun, SendGrid, Postmark, Brevo, Mailjet, SparkPost, Resend o cualquier host SMTP.

  2. Verifica tu dominio de envío o dirección del remitente.

    La mayoría de los proveedores no entregarán hasta que se verifique el dominio o el email. Añade los registros DNS que te proporcione el proveedor.

  3. Crea la clave de API o las credenciales SMTP.

    Usa el permiso mínimo que permita enviar email. Para SMTP, copia el host, el puerto, el usuario y la contraseña.

  4. Introduce los valores en FastRestful.

    Abre Admin → Newsletter → Email settings. Elige el proveedor, pega las credenciales y define el nombre del remitente, el email del remitente, el reply-to, la dirección postal y el texto de baja.

  5. Define la URL pública del backend.

    Se usa en píxeles de seguimiento, enlaces de confirmación y enlaces de baja. Debe ser el origen público que llega a Django, no el servidor de desarrollo del frontend.

  6. Envíate un email de prueba.

    Usa la acción de prueba integrada. Revisa el código fuente completo del mensaje para comprobar el remitente y los enlaces esperados antes de enviar una campaña.

Guía rápida de proveedores

ProveedorQué hacer en el sitio del proveedorQué pegar en FastRestful
SMTP (personalizado)Obtén el host, el puerto, el usuario y la contraseña de tu host de correo o panel de alojamiento.Host, puerto, usuario, contraseña, TLS/SSL.
Amazon SESVerifica el dominio o el remitente, solicita acceso a producción y luego crea credenciales SMTP en la consola de SES.Host SMTP como email-smtp.us-east-1.amazonaws.com, puerto 587, usuario y contraseña SMTP. Mantén TLS activado.
MailgunAñade y verifica el dominio de envío y luego crea una clave de API. Anota si el dominio está en la región de EE. UU. o de la UE.Clave de API, dominio de envío, región de la UE opcional y endpoint de API opcional.
SendGridVerifica un remitente o dominio y luego crea una clave de API con permiso Mail Send.Clave de API Bearer.
PostmarkCrea un servidor y verifica una firma de remitente o un dominio.Token de servidor.
BrevoVerifica el remitente o el dominio y crea una clave de API v3.Clave de API.
MailjetVerifica el remitente o el dominio y crea una clave de API y un secreto.Clave de API y secreto.
SparkPostVerifica el dominio de envío y crea una clave de API con permiso de envío.Clave de API Bearer.
ResendVerifica el dominio de envío y crea una clave de API.Clave de API Bearer.

La entregabilidad es tarea del DNS. Autentica SPF, DKIM y DMARC antes de aumentar el volumen. Empieza con envíos pequeños, supervisa los rebotes y las quejas, y mantén operativo el enlace de baja. Las campañas, automatizaciones y el correo del sistema pueden usar plantillas distintas, pero comparten el mismo proveedor.

Almacenamiento de objetos y CDN

El almacenamiento en el sistema de archivos local es adecuado para desarrollo. En producción conviene usar almacenamiento compatible con S3 más una CDN, para que las cargas sobrevivan a los despliegues y los recursos se carguen rápido.

1. Crea el bucket de S3 y los permisos

  1. Crea un bucket privado.

    En la consola de AWS, crea un bucket en la región que quieras. Mantén activado Block all public access. CloudFront lo leerá mediante OAC.

  2. Crea un usuario o rol de IAM.

    Se admite la cadena de credenciales estándar: variables de entorno, un perfil de instancia o IRSA en Kubernetes. No codifiques las claves en el repositorio.

  3. Concede solo los permisos que necesita FastRestful.
    política IAM mínima
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": "arn:aws:s3:::my-media-bucket"
        },
        {
          "Effect": "Allow",
          "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
          "Resource": "arn:aws:s3:::my-media-bucket/*"
        }
      ]
    }
  4. Instala las bibliotecas de almacenamiento.

    Ejecuta pip install boto3 django-storages en el entorno del backend y añade las bibliotecas a los requisitos de tu despliegue.

  5. Configura los valores de entorno.
    backend/.env
    MEDIA_STORAGE=s3
    MEDIA_S3_BUCKET=my-media-bucket
    MEDIA_S3_REGION=us-east-1
    # MEDIA_S3_ENDPOINT_URL=   # only for S3-compatible providers
    # MEDIA_S3_ACL=            # omit when using CloudFront OAC
  6. Reinicia y sube un recurso de prueba.

    Abre la biblioteca multimedia y sube una imagen. Debería aparecer en el bucket y cargarse desde la URL configurada de la CDN o de S3.

2. Coloca CloudFront delante del bucket

  1. Crea una distribución de CloudFront.

    Elige el bucket como origen y crea un Origin Access Control (OAC).

  2. Actualiza la política del bucket.

    Permite que la distribución de CloudFront lea los objetos. La consola de CloudFront puede generar la política por ti.

  3. Configura los valores de FastRestful.
    backend/.env
    MEDIA_CDN_DOMAIN=cdn.example.com
    MEDIA_CDN_DISTRIBUTION_ID=E1234567890ABC
    # MEDIA_S3_ACL=public-read   # only if serving S3 directly, not recommended
  4. Permite la invalidación de caché.

    Añade cloudfront:CreateInvalidation a la política de IAM si quieres que funcione el botón de purga de la biblioteca de medios.

  5. Prueba con una carga nueva.

    Sube un archivo nuevo, ábrelo a través del dominio de la CDN, sustituyelo y usa la acción de purga.

3. Proveedores compatibles con S3

Cloudflare R2, MinIO, DigitalOcean Spaces y servicios similares funcionan a través de la API de S3. Configura MEDIA_S3_ENDPOINT_URL con el endpoint S3 del proveedor y mantén el bucket privado si el proveedor admite una CDN o URLs firmadas. Verifica la carga, la descarga y la eliminación antes de depender de él en producción.

4. Almacenamiento de especificaciones OpenAPI

De forma predeterminada, los contratos OpenAPI importados se guardan en la base de datos. Para guardarlos en S3, configura:

backend/.env
SPEC_STORAGE=s3
SPEC_S3_BUCKET=my-spec-bucket
SPEC_S3_PREFIX=specs/
SPEC_S3_REGION=us-east-1
# SPEC_S3_ENDPOINT_URL=

Consulta Biblioteca multimedia y CDN para conocer los límites de carga, los tipos de archivo admitidos y el comportamiento de la CDN.

Inicio de sesión único

Tanto OIDC como SAML conservan destinos relativos seguros y tokens de invitación de organización. El inicio de sesión con contraseña puede seguir habilitado como alternativa.

OIDC, paso a paso

  1. Crea una aplicación OIDC en tu proveedor de identidad.

    Usa Okta, Auth0, Microsoft Entra ID, Google Workspace, Keycloak, Authentik o cualquier proveedor OIDC compatible.

  2. Registra la URL de callback.
    URI de redirección
    https://api.example.com/api/v1/auth/sso/callback/

    Usa el nombre de host exacto al que acceden los usuarios. Una barra final de más o de menos hará fallar el callback.

  3. Permite el flujo de código de autorización y los ámbitos.

    Solicita openid, email y profile.

  4. Copia el emisor, el ID de cliente y el secreto de cliente.
    backend/.env
    SSO_ISSUER=https://login.example.com/realms/acme
    SSO_CLIENT_ID=fastrestful
    SSO_CLIENT_SECRET=...
  5. Reinicia el backend.

    El botón de SSO permanece oculto hasta que se configure el proveedor.

  6. Prueba con una identidad real.

    Inicia sesión con el botón y confirma que el callback vuelve a la ruta esperada del frontend.

SAML 2.0, paso a paso

  1. Instala la dependencia opcional.

    Ejecuta pip install lxml antes de habilitar SAML.

  2. Copia los metadatos SP.

    Entrega esta URL a tu proveedor de identidad o sube el XML que devuelva:

    metadatos SP
    https://api.example.com/api/v1/auth/saml/metadata/
  3. Configura la ACS URL y el ID de entidad en el IdP.

    El servicio de consumo de aserciones es:

    ACS URL
    https://api.example.com/api/v1/auth/saml/callback/

    El ID de entidad predeterminado es fastrestful. Puedes cambiarlo con SSO_SAML_ENTITY_ID.

  4. Copia la URL de SSO del IdP y el certificado de firma.
    backend/.env
    SSO_SAML_ENABLED=1
    SSO_SAML_ENTITY_ID=fastrestful
    SSO_SAML_SSO_URL=https://idp.example.com/sso
    SSO_SAML_IDP_CERT=-----BEGIN CERTIFICATE-----...
    # SSO_SAML_AUDIENCE=fastrestful
  5. Reinicia y prueba.

    Inicia un inicio de sesión desde el frontend y confirma que la aserción del IdP vuelve a la página esperada.

Proveedores de infraestructura

ServicioQué hacerConfiguración de FastRestful
PostgreSQLAprovisiona una base de datos gestionada o tu propio servidor. Habilita las copias de seguridad automáticas y supervisa los límites de conexiones.DATABASE_URL. Obligatorio en producción.
RedisAprovisiona una instancia gestionada de Redis. Habilita la persistencia si dependes de los reintentos de Celery.REDIS_URL. Obligatorio en producción.
CeleryEjecuta un worker y un proceso beat con systemd, Supervisor o el gestor de procesos de tu plataforma.CELERY_BROKER_URL (valor predeterminado: REDIS_URL).
NginxTermina TLS, haz proxy a Gunicorn, sirve /static/ y /media/, y reenvía las cabeceras de host y de IP del cliente.Consulta Despliegue → Nginx.
Cloudflare / CDNHaz proxy de DNS, habilita TLS y aumenta los límites de carga para que coincidan con la configuración de medios. Mantén las rutas de webhook fuera de una caché agresiva.Reglas de DNS y caché.
Ejecuta el planificador. Celery beat impulsa la liquidación mensual, la escalada de moderación, el correo y las comprobaciones de disponibilidad. Sin un broker, ejecuta los comandos de liquidación manualmente. Consulta Operaciones.

Herramientas de API y webhooks salientes

OpenAPI, Swagger y Postman

  • Importación de OpenAPI: importa OpenAPI 3.x o Swagger 2.0 a una versión en borrador. La canalización de versiones concilia los endpoints y marca los cambios incompatibles.
  • Esquema de la plataforma: expórtalo en /api/schema/ con python3.11 manage.py spectacular --file schema.yml --validate.
  • Swagger UI: el backend lo sirve en /api/docs/.
  • Postman / kits de inicio: los endpoints del producto exponen paquetes descargables para los consumidores.

Webhooks salientes, paso a paso

  1. Crea el endpoint en FastRestful.

    Abre la sección de endpoints de webhook del plano de control y añade la URL de tu receptor. Debe ser HTTPS.

  2. Elige los eventos y un secreto de firma.

    Guarda un secreto robusto. FastRestful firma el cuerpo sin procesar de la solicitud con HMAC-SHA256.

  3. Envía una entrega de prueba.

    Confirma que tu receptor devuelve una respuesta 2xx.

  4. Verifica la firma en tu servidor.

    Compara tu propio HMAC-SHA256 del cuerpo sin procesar con la cabecera X-FastRestful-Signature. El valor es sha256=<hex>. El nombre del evento está en X-FastRestful-Event.

  5. Observa el registro de entregas.

    Los reintentos son seguros y el historial de entregas es evidencia de solo lectura. Gestiona los nombres de evento duplicados de forma idempotente.

Los webhooks de pago son independientes. Los webhooks de proveedores liquidan dinero y se registran en el panel de cada proveedor. Los webhooks salientes de proveedores son para tus propias integraciones. No apuntes un proveedor de pagos a un endpoint de webhook de proveedor.

Lista de verificación de aceptación de la integración

  • El proveedor aparece configurado y habilitado en la página de administración o de configuración.
  • Un mensaje o una carga de prueba real llega al proveedor y la URL devuelta carga.
  • El correo de prueba llega; SPF, DKIM y DMARC pasan.
  • Los medios subidos se guardan en el bucket y se sirven a través de la CDN.
  • El callback de OIDC o SAML vuelve a la ruta esperada del frontend.
  • Las firmas de los webhooks salientes se verifican en el receptor.
  • Los reintentos no duplican efectos secundarios.
  • Las credenciales de prueba y de producción no se mezclan.
Avanzado9 min de lectura

Copias de seguridad y actualizaciones

Una ruta repetible de copia de seguridad, restauración y actualización para un despliegue autoalojado de FastRestful. Las copias de seguridad van primero; el método de actualización depende de cómo compraste y desplegaste el producto.

¿Instalación con licencia de Dakidarts? Usa Licencias & actualizaciones oficiales para obtener versiones oficiales firmadas y reversión con un clic. Esta guía sigue cubriendo el plan de copia de seguridad y restauración, y la ruta de actualización manual del código fuente.

Qué incluir en las copias de seguridad

DatosPor quéMétodo
PostgreSQLInquilinos, productos, versiones, suscripciones, facturas, auditoría, contenido y metadatos de claves.Volcado lógico nocturno más copia continua del proveedor.
Medios en S3Recursos de la biblioteca, logotipos, avatares e imágenes del CMS.Versionado y replicación entre regiones cuando sea necesario.
Blobs de especificaciónContratos OpenAPI cuando SPEC_STORAGE=s3.Incluidos en la copia de seguridad de S3.
Secretos de entornoDJANGO_SECRET_KEY, FIELD_ENCRYPTION_KEY y credenciales del proveedor.Gestor de secretos con control de acceso e historial de rotación.
Configuración de compilación del frontendValores de NEXT_PUBLIC_* y configuración de alojamiento.Infraestructura como código o notas de despliegue.
Advertencia sobre la clave de cifrado. Perder FIELD_ENCRYPTION_KEY hace que las claves de API cifradas y los secretos de los proveedores sean irrecuperables. Haz una copia de seguridad por separado de la base de datos, con un control de acceso estricto.

Copia de seguridad de PostgreSQL

shell
pg_dump --format=custom "$DATABASE_URL" > fastrestful-$(date +%F-%H%M).dump
pg_dump --format=plain "$DATABASE_URL" | gzip > fastrestful-$(date +%F-%H%M).sql.gz

# Verify the dump is readable
pg_restore --list fastrestful-$(date +%F-%H%M).dump > /dev/null

Restaurar en una base de datos limpia

shell
createdb fastrestful_restore
pg_restore --clean --if-exists --no-owner \
  --dbname=fastrestful_restore fastrestful-2026-10-21.dump

# Point a staging deployment at the restored database and run:
python3.11 manage.py migrate --check
python3.11 manage.py check

Prueba las restauraciones cada trimestre. Una copia de seguridad que nunca se ha restaurado es una suposición, no un plan de recuperación.

Dos formas de actualizar

RutaÚsala cuandoEmpieza aquí
Centro de actualizaciones oficialCompraste FastRestful a Dakidarts y ejecutas un despliegue desde código fuente o en una VM.Licencias y actualizaciones oficiales
Actualización manual desde código fuenteMantienes un fork propio, compilas tus propias imágenes o no usas LicenseHub.La secuencia que se describe a continuación.

Secuencia de actualización manual

Usa esto solo para un despliegue personalizado que no gestione el centro de actualizaciones oficial.

  1. Lee las notas de la versión y comprueba si hay cambios de migración o de entorno.
  2. Haz copias de seguridad de PostgreSQL, los medios y los secretos.
  3. Pon la plataforma en modo de mantenimiento si una migración requiere pausar las escrituras.
  4. Trae el código e instala las dependencias del backend y del frontend.
  5. Ejecuta las migraciones, recopila los archivos estáticos y compila el frontend.
  6. Reinicia la API y los workers; verifica la preparación y una solicitud de prueba.
  7. Sal del modo de mantenimiento y supervisa la tasa de errores, la profundidad de las colas y la recepción de webhooks.
Después de cualquiera de las dos rutas de actualización, reinicia Gunicorn, el worker de Celery y beat, y el proceso de compilación del frontend si se ejecuta en el mismo host. Luego comprueba /api/health/ready, envía una solicitud de prueba y abre Admin → Eventos de pago para confirmar que ninguna entrega de proveedor falló durante el reinicio.
shell
git pull --ff-only
pip install -r backend/requirements.txt
npm ci

python3.11 backend/manage.py migrate --noinput
python3.11 backend/manage.py collectstatic --noinput
npm run build

sudo systemctl restart fastrestful
sudo systemctl restart fastrestful-worker fastrestful-beat
curl -f https://api.example.com/api/health/ready

Reversión

  • La reversión del código es sencilla solo si la versión anterior no requería una migración de base de datos irreversible.
  • Conserva una instantánea de la base de datos antes de cada migración. Restaura la instantánea y la versión de código correspondiente a la vez.
  • Nunca edites en producción una migración ya aplicada; añade una nueva migración correctiva.
  • Tras la reversión, vuelve a ejecutar la solicitud de prueba e inspecciona las tareas en cola para detectar suposiciones sobre el esquema.

Seguridad de las migraciones

verificación previa
python3.11 manage.py showmigrations
python3.11 manage.py makemigrations --check --dry-run
python3.11 manage.py migrate --plan
  • Primero los cambios aditivos, después el relleno de datos y, en una versión posterior, elimina los campos antiguos.
  • Evita bloqueos prolongados de tablas de medición, registro de solicitudes y auditoría con alto volumen.
  • Activa el modo de mantenimiento para las migraciones que cambien columnas de estado de dinero o de estado de versión.
  • Mantén Celery en pausa hasta que terminen las migraciones.

Versiones del frontend

La compilación del frontend es estática y autocontenida. Mantén el origen de la API y la URL del sitio público alineados con el despliegue. Si despliegas una compilación nueva que espera nuevos campos de la API, publica primero el backend o mantén el contrato compatible con versiones anteriores.

Avanzado9 min de lectura

Observabilidad

Estado, logs, métricas y colas para una plataforma en la que las solicitudes, el dinero y la moderación dejan evidencia.

Estado y preparación

SondaQué responde
GET /api/health/live¿El proceso está activo?
GET /api/health/ready¿Puede el proceso acceder a la base de datos y a la caché compartida?
GET /api/schema/¿Se puede servir el contrato de la API?
Renderizado de rutas del frontend¿Puede el shell público cargar la marca y el contenido?

Usa la preparación para la pertenencia al balanceador de carga. Una caída de la caché devuelve 503 con la dependencia que falla, en lugar de servir con estado exclusivamente local.

Contexto de la solicitud

  • Cada respuesta de la API incluye metadatos de la solicitud en los logs de la aplicación. Conserva el ID de solicitud a través de tu proxy inverso.
  • Los logs de solicitudes del gateway incluyen suscripción, producto, endpoint, estado, latencia y vistas previas redactadas.
  • Los eventos de proveedor almacenan IDs de evento y hashes de payload, no secretos sin procesar.
  • Los eventos de auditoría vinculan actor, acción, organización, objetivo y metadatos.

Señales que supervisar

ÁreaSeñalUmbral de acción
APITasa de 5xx, latencia p95Genera una alerta si los 5xx se mantienen o si la latencia empeora.
GatewayTasa de errores del upstream, número de circuitos abiertosInvestiga la salud del proveedor antes de aumentar las cuotas.
Base de datosConexiones, consultas lentas, discoEscala o añade índices antes de la saturación.
RedisMemoria, expulsiones, errores de conexiónLas expulsiones pueden alterar el comportamiento de cuotas y límites de velocidad.
CeleryProfundidad de cola, fallos de tareas, latido de beatAlerta si se atasca la cola de liquidación o de correo.
DineroWebhooks fallidos, reembolsos pendientes, excepciones de pagosConcilia antes de reintentar a ciegas.
Correo electrónicoTasa de rebotes, quejas, tasa de bajasSuprime e investiga cuando supere lo normal.

Reglas de registro

  • Nunca registres claves de API sin procesar, secretos de proveedores ni payloads de pago completos.
  • Mantén las vistas previas de solicitudes y respuestas acotadas y redactadas.
  • Registra IDs de eventos de proveedor y resultados de liquidación, no datos de tarjetas.
  • Usa campos estructurados cuando sea posible: ID de solicitud, organización, producto, endpoint y estado.
  • Separa la evidencia de auditoría de los logs normales de la aplicación.

Colas y tareas programadas

shell
celery -A config inspect ping
celery -A config inspect active
celery -A config inspect reserved
celery -A config inspect scheduled

Supervisa las colas default y billing por separado. La liquidación se ejecuta mensualmente; la moderación y las notificaciones cada 15 minutos; las comprobaciones de disponibilidad, a diario.

Conjunto mínimo de alertas

  • Preparación fallando durante más de 2 minutos.
  • Tasa de 5xx de la API por encima del objetivo de servicio.
  • Circuito del gateway abierto o tasa de errores del upstream disparada.
  • Fallos de webhooks o eventos de proveedor sin procesar.
  • Falta el latido de Celery beat; la profundidad de la cola aumenta.
  • Saturación de disco y de conexiones de la base de datos.
  • Fallo de copia de seguridad o última copia correcta demasiado antigua.
  • Caída inesperada de las inscripciones en dos factores del personal.

Comandos de diagnóstico

shell
python3.11 manage.py check --deploy
python3.11 manage.py showmigrations
python3.11 manage.py prune_telemetry --request-log-days 90 --usage-event-days 365
python3.11 manage.py check_api_availability
python3.11 manage.py checklinks --limit 200 --timeout 6
Avanzado8 min de lectura

Escalado

Dónde escala FastRestful sin problemas, dónde necesita infraestructura y qué estado debe permanecer compartido.

Escala las capas por separado

topología
edge / CDN
  ├── frontend static assets
  └── API reverse proxy
        ├── Django / Gunicorn replicas
        ├── Celery workers (default queue)
        ├── Celery workers (billing queue)
        ├── Celery beat (one instance)
        ├── PostgreSQL primary + read capacity
        └── Redis (shared cache + broker)

Capa web

  • Ejecuta varias instancias de Gunicorn/Django sin estado detrás de un balanceador de carga.
  • Las sesiones residen en la base de datos; la caché y los límites de velocidad usan Redis. No dependas de la memoria local en producción.
  • Dimensiona los workers para la solicitud más lenta del gateway (tiempo de espera predeterminado: 15 segundos).
  • Termina TLS en el edge y conserva el host original para el enrutamiento de productos.

Base de datos

  • Usa PostgreSQL con agrupación de conexiones a medida que aumente el número de workers.
  • Tablas de alto volumen: eventos de uso, registros de solicitudes, eventos de auditoría y entregas de webhooks.
  • Purga la telemetría de forma programada y archiva la evidencia de auditoría según la política.
  • Mantén las escrituras de estado de dinero en transacciones; no fragmentes las tablas de facturas ni de libro mayor sin un plan de migración.

Redis

  • Se requiere una caché compartida para los límites de velocidad y la idempotencia del gateway.
  • Una caída de Redis devuelve un 503 reintentable antes de reservar la cuota; el gateway no recurre a estado por proceso.
  • Supervisa las expulsiones. Perder registros de idempotencia puede permitir llamadas duplicadas al upstream tras cambios de TTL.
  • Usa una base de datos o instancia de Redis independiente para el broker de Celery si aumenta la presión de la caché.

Capacidad del gateway

  • Las cuotas y los límites de velocidad se aplican por suscripción y endpoint, no por proceso.
  • La latencia del upstream domina el tiempo de solicitud; mantén tiempos de espera y reintentos conservadores.
  • El almacenamiento de idempotencia crece con el volumen de solicitudes; dimensiona Redis para el TTL configurado.
  • Usa enrutamiento por host de producto con TLS comodín para evitar un cuello de botella de ruta central en el edge.

Workers y tareas programadas

  • Ejecuta una sola instancia de beat; varios planificadores beat pueden duplicar tareas temporizadas.
  • Escala las colas billing y default por separado.
  • Mantén la liquidación idempotente; las reejecuciones son seguras por diseño.
  • Aplica contrapresión a las colas de correo y moderación con la concurrencia de los workers en lugar de desactivar los reintentos.

Multimedia y CDN

  • Mueve las cargas a S3 antes de que el ciclo de vida del disco local sea un problema.
  • Sirve a través de CloudFront con nombres de objeto inmutables y caché de larga duración.
  • Mantén privado el acceso al origen; evita políticas de bucket públicas.
  • Usa la purga por recurso solo cuando se reutilice intencionadamente una clave de objeto.

Lista de verificación de capacidad

  • Las alertas de preparación y de 5xx están conectadas al sistema de guardias.
  • PostgreSQL tiene margen para conexiones, disco e IOPS.
  • Redis tiene margen para la caché y los registros de idempotencia.
  • Se supervisan la profundidad de las colas de Celery y el latido de beat.
  • El almacenamiento de objetos y la CDN están fuera del servidor web.
  • La retención de telemetría se configura antes del crecimiento, no después.
Avanzado10 min de lectura

Modelo de datos y permisos

Las entidades que definen FastRestful, los límites de inquilino que las rodean y los invariantes que mantienen coherentes el dinero y las versiones.

Inquilinos

Organization es el límite del inquilino. Un usuario se une mediante una Membership con un rol. La organización activa viaja explícitamente y se resuelve en el servidor antes de acceder a los objetos.

RolIntención
PropietarioControl total del espacio de trabajo, facturación, equipo y operaciones de proveedores. El último propietario está protegido.
AdminEquipo, aplicaciones, claves, suscripciones, publicación, facturación y soporte.
DesarrolladorAplicaciones, claves, pruebas de endpoints y publicación cuando esté permitido.
FacturaciónFacturas, cupones, reembolsos, pagos y métodos de pago.
LectorVisibilidad del espacio de trabajo de solo lectura.

Entidades principales

DominioEntidades
IdentidadUser, Organization, Membership, OrganizationInvite, VendorProfile, TwoFactorDevice, LoginCode
CatálogoCategory, ApiProduct, ApiVersion, Endpoint, ApiAvailabilityCheck
AccesoApplication, ApiKey, Plan, Subscription, Coupon
MediciónUsageEvent, MonthlyCounter
DineroInvoice, Payout, LedgerEntry, PaymentEvent, PayoutProviderEvent, RefundRequest
PlataformaSiteSettings, PlatformPlan, PlatformSubscription, SiteNavigationItem, ContentPage, SiteLocale, SiteAsset
InteracciónEmailList, Contact, Campaign, EmailTemplate, Automation, Banner, ShortLink
ConfianzaAbuseReport, ModerationAppeal, ModerationPolicy, SafetyEnforcement, ProfileBlock, DirectMessage
OperacionesRequestLog, WebhookEndpoint, WebhookDelivery, Ticket, TicketMessage, AuditEvent, ExportJob

Invariantes

  • Un producto tiene una sola versión activa a la vez.
  • El contrato y el catálogo de endpoints de una versión activa no se pueden editar.
  • Una suscripción tiene condiciones comerciales inmutables; los cambios crean un plan nuevo.
  • Una clave de API pertenece exactamente a una aplicación y no puede cruzar entre aplicaciones.
  • Un ID de evento de proveedor se registra una sola vez; las repeticiones no liquidan dos veces.
  • Los pagos siguen una máquina de estados monótona.
  • Las entradas del libro mayor son de solo anexado.
  • El último propietario activo del espacio de trabajo no se puede eliminar ni degradar.

Comprobaciones de permisos

OperaciónAutoridad requerida
Cambios de equipo y espacio de trabajoPropietario o administrador
Publicación o promoción de productoPropietario, administrador o desarrollador de la organización propietaria
Factura, reembolso, pago, cupónPropietario, administrador o facturación
Configuración de la plataformaSuperusuario o permisos explícitos de personal
Revisión del perfil de proveedorPersonal con permiso sobre el modelo de proveedor
Decisión de moderaciónPersonal con permiso sobre el modelo de seguridad

Eliminación y retención

  • Los tickets nunca se eliminan; permanecen como evidencia de soporte.
  • El historial de versiones publicadas sigue disponible para auditoría incluso después de la descontinuación.
  • Los eventos de auditoría y los recibos de proveedores son de solo anexado.
  • Los registros de solicitudes y los eventos de uso se purgan según la retención configurada.
  • Las eliminaciones de medios usan el ciclo de vida de los recursos y deben respetar las referencias en uso.

Extender el modelo

  1. Parte de un flujo de trabajo real, no de un campo hipotético.
  2. Mantén los datos exclusivos de la plataforma fuera de los serializadores anónimos.
  3. Valida en la capa de modelo/API; añade restricciones de base de datos para el dinero y las transiciones de estado.
  4. Añade pruebas de contrato para permisos, límites de inquilino e idempotencia.
  5. Documenta la superficie del operador antes de lanzar el modelo.
Avanzado8 min de lectura

Extensiones

Amplía la experiencia pública y el flujo operativo sin bifurcar el núcleo: recursos personalizados, secciones del CMS, capas de idioma, webhooks y patrones de administración.

CSS y JavaScript personalizados

Admin → Recursos personalizados inyecta un fragmento en el sitio público. Cada fragmento tiene un tipo, una ubicación, un alcance y un estado activo.

CampoOpciones
TipoCSS o JavaScript
UbicaciónEncabezado o pie de página
AlcanceTodo el sitio, rutas seleccionadas o una página
Patrones de rutaRutas exactas y comodines /prefix/*
  • Cada guardado crea una revisión inmutable con autor y nota; cualquier revisión se puede restaurar como una entrada nueva.
  • Previsualiza el sitio en vivo en un iframe de administración con el fragmento inyectado a la fuerza.
  • Usa el nonce CSP configurado tanto en la configuración del sitio como en la política del edge; las etiquetas inyectadas lo reciben automáticamente.
  • Trata los fragmentos como código de operador de confianza. Pueden cambiar el estilo o instrumentar el sitio público.

Secciones estructuradas del CMS

Las páginas y publicaciones se componen de secciones ordenadas. El editor incluye prosa, tabla, código, imagen, vídeo, split, cita, pestañas, grupos de código, muestras de endpoints, testimonios, funciones, FAQ, pasos, métricas, tarjetas, separadores, hero, franja de logotipos, cronología, lista de enlaces, avisos, colecciones de API, colecciones de categorías, API destacadas y artículos recientes.

  • Usa secciones estructuradas en lugar de pegar HTML arbitrario.
  • Define juntos la etiqueta de acción y el destino.
  • Usa rutas del sitio o destinos HTTPS, mailto o tel.
  • Mantén un texto alternativo de imagen significativo; el cuerpo del texto puede servir como pie de foto.
  • Las páginas publicadas se incorporan a la navegación y a los metadatos del sitemap solo cuando están activas.

Capas de idioma

El inglés es el paquete canónico; el francés se incluye completo. Añade otro idioma en la administración, importa un paquete JSON o TypeScript y sobrescribe solo las claves que necesites.

  • Los valores incluidos siguen siendo la alternativa cuando una clave de la capa está vacía.
  • Las claves desconocidas se ignoran y se notifican durante la importación.
  • Exporta JSON o TypeScript para traducir sin conexión.
  • Ejecuta npm run export:i18n después de editar el paquete del frontend y reinicia la API.

Webhooks salientes

Los webhooks de proveedor entregan eventos firmados a endpoints HTTPS con un historial de entregas seguro para reintentos. Guarda el secreto de firma en el espacio de trabajo del proveedor y verifica la firma antes de actuar sobre un payload.

  • Usa una URL de endpoint estable y devuelve un 2xx rápidamente.
  • Trata los eventos como de entrega al menos una vez y haz que los manejadores sean idempotentes.
  • Usa el registro de entregas para inspeccionar el estado de las respuestas y las vistas previas.
  • No reutilices las rutas de webhook del proveedor de pagos para eventos de proveedores.

Patrón de extensión de la administración

  1. Registra el modelo con comportamiento explícito de listado, filtrado, búsqueda y permisos.
  2. Añade un formulario de administración específico en lugar de exponer campos internos sin procesar.
  3. Usa eventos de auditoría para las acciones que cambian el estado.
  4. Añade una página de vista previa o de informe solo cuando responda a una pregunta real del operador.
  5. Prueba los límites de permisos y la separación entre serializadores públicos y privados.

Patrón de extensión de la API

  • Aplica el alcance del inquilino antes de cada consulta.
  • Usa serializadores explícitos de solicitud y respuesta.
  • Devuelve códigos de error estables para el comportamiento del cliente.
  • Haz que los reintentos sean seguros con idempotencia cuando haya dinero o estado involucrados.
  • Añade anotaciones OpenAPI para que el esquema siga siendo utilizable.
Referencia10 min de lectura

Administración

El plano de control del personal es una superficie de administración de Django que tiene en cuenta los permisos para las operaciones de la plataforma. No usa métricas de demostración ni omite los permisos de modelo.

Panorama de operaciones del plano de control del personal de FastRestful con tráfico, catálogo, ingresos y colas de decisiones
La vista general del personal es una instantánea en vivo, consciente de los permisos, de los registros actuales de la plataforma.

Límite de acceso

  • El acceso del personal requiere is_staff. Un rol admin en un espacio de trabajo no es personal de la plataforma.
  • Se puede exigir doble factor para todas las cuentas desde la configuración del sitio.
  • Se respetan los permisos de modelo de Django y el comportamiento registrado de ModelAdmin.
  • Las lecturas de administración pueden ser más amplias que las escrituras; la propiedad de los objetos y el estado del proveedor siguen condicionando las acciones con consecuencias.
  • Toda acción sensible debe crear un evento de auditoría con actor, objetivo y metadatos.

Vista general de operaciones

/admin/ muestra una instantánea en vivo y de solo lectura creada a partir de los registros actuales: tráfico, API públicas, consumidores activos, espacios de trabajo activos, mensajes de contacto, adopción del doble factor, avisos de la plataforma, colas de atención, estado de pagos, flujo de auditoría, experiencia del sitio y cobertura de idiomas.

  • Acciones rápidas: crear API, revisar proveedores, configuración del sitio, planes de plataforma, estudio de contenido, newsletter, banners, enlaces.
  • Colas de decisión: proveedores, moderación, apelaciones, restricciones de seguridad, soporte, webhooks fallidos, pagos, facturas y bandeja de contacto.
  • Panel de pagos: ingresos por proveedor, suscripciones activas, MRR, pagos pendientes, recepciones de webhooks, reembolsos y enlaces de gateway.

Secciones del plano de control

SecciónModelos / flujos de trabajo
Catálogo de APIProductos, categorías, versiones, endpoints, revisiones, comprobaciones de disponibilidad y configuración del portal.
ProveedoresRevisión, aprobación, suspensión y reenvío del perfil de proveedor.
Finanzas y pagosPasarelas de pago, facturas, pagos, libro mayor, cupones, eventos de pago, reembolsos y eventos de proveedor.
Tickets de soporteColas, prioridad, estado, contexto de solicitud y respuestas.
Confianza y seguridadInformes de abuso, apelaciones, política de moderación, bloqueos de perfil y libro de medidas de aplicación.
Fiabilidad y usoRegistros de solicitudes, registros de idempotencia, eventos de uso, contadores mensuales y eventos de auditoría.
Espacios de trabajo y accesoOrganizaciones, membresías, invitaciones, aplicaciones, claves de API, planes, suscripciones y planes de plataforma.
IntegracionesEndpoints de webhook e historial de entregas.
Newsletter y correo electrónicoPlantillas, listas, contactos, segmentos, campañas, automatizaciones, correo rastreado, eventos y configuración.
Experiencia del sitioMedios, colecciones, configuración del sitio, navegación, páginas de contenido, recursos personalizados e idiomas.
Identidad y seguridadUsuarios, códigos de inicio de sesión, grupos, tokens en lista negra o pendientes.
Mensajería y comunidadAvisos de la plataforma, mensajes de contacto, mensajes directos, preferencias, seguimientos, notificaciones de usuario y mensajes de tickets.

Moderación y seguridad

  • Los informes incluyen tipo/etiqueta del objetivo, categoría, evidencia, prioridad, plazo de SLA, asignación y resúmenes de resolución privados y públicos.
  • El personal configura las ventanas de SLA por prioridad, los umbrales de escalado y las ventanas de apelación en Moderation policy.
  • Los informes cerrados elegibles se pueden apelar una vez dentro de la ventana; la decisión pública original permanece adjunta.
  • Las apelaciones aceptadas reabren el caso con un SLA nuevo derivado de la política.
  • Resolver un informe confirmado puede emitir una medida de seguridad auditable: advertencia, restricción de comunidad, restricción de publicación o restricción de plataforma.
  • Los registros de medidas muestran puntos, motivo público, fechas de vigencia y estado, y solo el usuario afectado o los miembros activos del proveedor pueden leerlos.

Soporte y equipo

  • Los tickets vinculan consumidor, producto, suscripción y, opcionalmente, el contexto del registro de solicitudes.
  • Los mensajes actualizan la marca de tiempo de actividad del ticket para que las colas sigan ordenadas por la última respuesta.
  • Las invitaciones de equipo, los cambios de rol, la desactivación y la eliminación solo pueden hacerlos propietarios o administradores; el último propietario activo no se puede eliminar.
  • Las invitaciones se almacenan con hash, son de un solo uso, están vinculadas al correo y caducan.

Planes de plataforma y conciliación

  • Máximo cinco planes de plataforma; los códigos permanecen estables después de su creación.
  • Precio mostrado, IDs de proveedor anuales/mensuales, límite de espacios de trabajo, límite de publicaciones de API, beneficios y recomendación.
  • Los planes de pago no se publican hasta que exista un importe y un ID de precio recurrente del proveedor.
  • La conciliación de suscripciones de plataforma de solo lectura muestra el estado y los derechos sin permitir que el personal se desvíe del proveedor.

Avisos de la plataforma

Los avisos creados por el personal se distribuyen a bandejas de entrada por usuario. La audiencia puede ser todas las cuentas o solo el personal; los niveles son info, notice y critical. Los recuentos de entrega aparecen en la instantánea de operaciones.

Auditoría y exportaciones

  • Eventos de auditoría de solo anexado con actor, acción, organización, objetivo y metadatos.
  • Los trabajos de exportación admiten flujos de revisión de seguridad y retención.
  • Las listas de administración ofrecen vistas filtradas, búsqueda y CSV cuando corresponde.
  • Nunca incluyas secretos sin procesar, claves de API ni payloads de proveedores en los metadatos de auditoría.

Gestión de idiomas

Idiomas del sitio → Gestionar traducciones muestra los idiomas incluidos y gestionados, la cobertura y las claves que faltan. El francés incluido se puede editar mediante una capa de administración. La importación y exportación admiten literales JSON y TypeScript; las claves desconocidas se ignoran y se notifican.

Referencia10 min de lectura

Referencia de la API

La API de FastRestful es una superficie de Django REST Framework con raíz en /api/v1/. El backend sirve OpenAPI y este es el contrato autoritativo.

URLs base y documentación

SuperficieURL
Raíz de la APIhttps://api.example.com/api/v1/
Esquema OpenAPI/api/schema/
Swagger UI/api/docs/
Estado/api/health/live, /api/health/ready
Host de productohttps://{product-slug}.api.example.com
Alias de ruta del producto/api/v1/{product-slug}/...

Autenticación

obtener tokens
curl --request POST \
  --url 'https://api.example.com/api/v1/auth/token/' \
  --header 'Content-Type: application/json' \
  --data '{"username":"[email protected]","password":"..."}'

# Response
{"access":"...", "refresh":"...", "user": {...}}
llamada autenticada
curl --request GET \
  --url 'https://api.example.com/api/v1/dashboard/consumer/' \
  --header 'Authorization: Bearer <access>' \
  --header 'X-Organization: <organization-uuid>'

Espacios de nombres

PrefijoPropósito
/auth/Token, refresh, registro, me, cierre de sesión, restablecimiento de contraseña, perfil, 2FA, SSO, SAML e invitaciones.
/orgs/, /memberships/, /organization-invites/Espacios de trabajo, roles, invitaciones y equipo.
/products/, /versions/, /endpoints/, /plans/, /categories/Catálogo y ciclo de vida de la API.
/applications/, /keys/, /subscriptions/Acceso de consumidores y derechos.
/dashboard/Modelos de lectura resumidos de consumidores y proveedores.
/gateway/execute/Envoltorio seguro del gateway heredado (se prefieren las rutas directas).
/request-logs/, /usage-events/, /usage-counters/Medición y observabilidad.
/invoices/, /payouts/, /ledger/, /coupons/, /billing/Dinero, reembolsos y webhooks de proveedores.
/support/ (tickets, ticket-messages)Cola de soporte y respuestas.
/media/, /media-collections/Biblioteca multimedia y selector.
/newsletter/Registro público, seguimiento y preferencias.
/short-links/Enlaces cortos, QR, clics, estado, importación/exportación.
/announcements/Entrega de banners públicos y eventos.
/platform/Configuración, marca, metadatos, contenido del sitio, planes, suscripciones, idiomas, recursos y disponibilidad.
/moderation-appeals/, /safety-enforcements/Historial de casos de seguridad y restricciones.
/messages/, /blocks/, /reports/, /reviews/Comunidad y confianza.
/audit-events/, /export-jobs/Registro de auditoría y exportaciones.
/webhook-endpoints/, /webhook-deliveries/Gestión de webhooks firmados.

Mapa de endpoints principales

Método + rutaPropósito
POST /auth/token/, POST /auth/token/refresh/Inicio de sesión con contraseña y refresh de token rotativo.
POST /auth/register/Crea un usuario y, opcionalmente, su primer espacio de trabajo.
GET /auth/me/Usuario de sesión, organizaciones y capacidad de publicación.
GET /orgs/, GET /memberships/Espacios de trabajo y pertenencia por rol.
GET /products/, GET /products/{slug}/Catálogo de productos público y visible para el inquilino.
POST /products/{slug}/import-spec/Importa un contrato OpenAPI o Swagger a una versión en borrador.
GET /versions/{id}/diff/?against=Compara dos contratos de versión.
POST /versions/{id}/promote/Promociona una versión validada y retira la versión activa anterior.
GET /products/{slug}/publication-readiness/Devuelve las cuatro puertas de publicación.
GET /applications/, GET /keys/Aplicaciones de consumidores y credenciales con alcance.
POST /keys/{id}/rotate/, POST /keys/{id}/revoke/Sustituye o revoca una clave de forma segura.
GET /subscriptions/, POST /{id}/cancel/Planes activos y cancelación.
POST /subscriptions/{id}/change-plan/Cambia a otro plan elegible.
POST /gateway/execute/Envoltorio seguro del gateway heredado.
GET /dashboard/consumer/, GET /dashboard/vendor/Modelos de lectura resumidos de consumidores y proveedores.
GET /request-logs/Historial de solicitudes redactado y con alcance de inquilino.
GET /usage-events/, GET /usage-counters/Detalle de medición y contadores mensuales.
GET /invoices/, POST /invoices/{id}/pay/Historial de facturación y checkout del proveedor.
POST /invoices/{id}/refund/Reembolso total o parcial a través de la pasarela original.
GET /payouts/, POST /payouts/{id}/transfer/Liquidación a proveedores y transferencia del proveedor.
POST /payouts/{id}/reconcile/Aplica el resultado estricto del proveedor a un pago.
GET/POST /media/, GET /media/supported-types/Biblioteca multimedia y validación de cargas.
POST /newsletter/subscribe/Registro público en listas, con doble opt-in opcional.
GET /short-links/, GET /short-links/{id}/qr/Gestión de enlaces, redirecciones y recursos QR.
GET /announcements/?path=Mejor banner público para cada ubicación.
GET /platform/branding/, GET /platform/site-content/Shell público, metadatos, navegación y contenido publicado.
GET /platform/plans/, GET /platform/subscription/Planes de plataforma y derecho actual.
GET /platform/locales/, GET /platform/assets/Capas de idioma activas y recursos personalizados.
GET /tickets/, GET/POST /ticket-messages/Cola de soporte, respuestas y contexto de solicitud.
GET /reports/, GET /moderation-appeals/Historial de casos de seguridad y elegibilidad para apelación.
GET /webhook-endpoints/, GET /webhook-deliveries/Configuración de webhooks salientes y evidencia de entrega.
GET /audit-events/, GET /export-jobs/Registro de auditoría y estado de exportación.

Paginación y filtrado

Los endpoints de listado usan un contrato de número de página: page, page_size, search, ordering y filtros de recursos. Las respuestas usan {count, next, previous, results}. La ordenación acepta un nombre de campo, opcionalmente precedido por -.

ejemplo
GET /api/v1/products/?page=2&page_size=25&search=delivery&ordering=-rating_average
GET /api/v1/invoices/?status=paid&ordering=-created_at
GET /api/v1/request-logs/?status_class=server&ordering=-created_at

Forma del error

Los errores de validación usan el objeto de DRF indexado por campo. Los errores del gateway y de la plataforma usan un objeto JSON con un código legible por máquina, un mensaje para personas y metadatos de reintento opcionales.

error típico
{
  "detail": "Monthly quota exceeded.",
  "code": "quota_exceeded",
  "retry_after": 300
}

Forma de la llamada al gateway

solicitud directa
GET https://signal-stack.api.example.com/v2/deliveries?limit=10
X-API-Key: fr_live_…
Idempotency-Key: request-8241

{
  "status": 200,
  "latency_ms": 84,
  "content_type": "application/json",
  "data_preview": "...",
  "headers": {...}
}

Webhooks

Hay dos tipos de webhook en FastRestful. Mantenlos separados:

TipoDirecciónPropósito
Webhooks salientes de proveedoresFastRestful → tu servidorNotifica a tus sistemas sobre los eventos de la plataforma. Firmados con X-FastRestful-Signature: sha256=<hex> y X-FastRestful-Event.
Webhooks del proveedor de pagosProveedor → FastRestfulLiquidan facturas, suscripciones, reembolsos y pagos. Los esquemas de firma varían según el proveedor.
rutas del proveedor de pagos
POST /api/v1/billing/stripe-webhook/
POST /api/v1/billing/paypal-webhook/
POST /api/v1/billing/flutterwave-webhook/
POST /api/v1/billing/paystack-webhook/
POST /api/v1/billing/razorpay-webhook/
  • Los endpoints de webhook de proveedores deben usar HTTPS y almacenar un secreto de firma.
  • Las entregas se firman, se reintentan de forma segura y se registran con el estado y una vista previa de la respuesta.
  • Los webhooks del proveedor de pagos se registran en el panel de cada proveedor, no en la sección de webhooks de proveedores.
  • Los IDs de eventos de proveedor son únicos; los eventos firmados duplicados se confirman sin liquidar dos veces.
  • La configuración y las listas de eventos de webhook están en Pasarelas de pago, paso a paso.

Flujo de trabajo de OpenAPI

shell
cd backend
python3.11 manage.py spectacular --file schema.yml --validate

Usa el esquema generado para SDKs, Postman o pruebas de contrato. Los contratos OpenAPI a nivel de producto son independientes: se importan en versiones de API y se promocionan a través de la canalización de versiones.

Cómo desbloquearte

Si un endpoint devuelve un código inesperado, comprueba primero el ID de solicitud, el método de autenticación, la cabecera del espacio de trabajo y el estado de la suscripción. La Guía de solución de problemas cubre los modos de fallo habituales en orden.