FOSSBilling de 0 a Hero: índice del curso

Por: Artiko
fossbillingbillingfacturacionhostingphpself-hostingindice

FOSSBilling de 0 a Hero

FOSSBilling es una aplicación PHP de facturación y automatización para negocios que venden servicios recurrentes: hosting compartido, dominios, licencias, retainers. Cubre el circuito completo — catálogo de productos, carrito, pedido, factura proforma, cobro por pasarela, aprovisionamiento en un panel de control, renovación, suspensión y cancelación — con 40 módulos en el núcleo, un área de cliente propia y una API JSON. Se instala en tu servidor, la base de datos es tuya y la licencia del código de la aplicación es Apache-2.0.

Su origen explica casi todo lo demás. FOSSBilling es un fork de BoxBilling, un producto comercial cuyo último release fue el 4.22.1.5 del 3 de abril de 2022. El repositorio FOSSBilling/FOSSBilling se creó el 18 de mayo de 2022 para rescatar ese código y publicarlo bajo licencia libre; el LICENSE todavía lleva doble copyright, “Copyright 2022 FOSSBilling” y “Copyright 2011-2021 Boxbilling, Inc”. El fork no fue cosmético: heredó un framework propio con router propio, contenedor Pimple y dos ORM conviviendo. Y heredó también el namespace: los módulos siguen viviendo bajo Box\Mod\ en 2026, con el issue #1679 abierto para renombrarlos.

Ahora la parte incómoda, que este curso pone al principio y no al final. El proyecto se declara beta en tres sitios oficiales. El README dice literalmente “FOSSBilling is under active development and currently considered beta. Expect rough edges and limited support.” La página de descargas dice “FOSSBilling is currently pre-production software”. Y el propio changelog de la versión que aquí se documenta cierra con la frase “0.8.5 should be considered the recommended security baseline.” No es marketing invertido: es la posición declarada del proyecto.

Los números que hay detrás de esa declaración: 32 advisories publicados, todos en 2026 — 4 críticos, 12 altos, 11 medios y 5 bajos. Los cuatro críticos, todos parcheados en 0.8.0, son un bypass de autenticación que permitía crear un administrador sin credenciales (CVE-2026-33543), una inyección de plantilla en Twig (CVE-2026-28496), una validación de rol defectuosa en la API (CVE-2026-27604) y un bypass de pago falsificando el IPN (CVE-2026-42341). El proyecto publica además una alerta central no descartable para toda instalación con versión igual o inferior a 0.7.2, con el título “This version of FOSSBilling is insecure”. De ahí la regla que atraviesa el curso entero: 0.8.5 es el mínimo, no una recomendación. Cualquier instancia por debajo de 0.8.0 se considera comprometible, no desactualizada.

El contexto de sostenibilidad importa igual de mucho para decidir. Detrás de FOSSBilling no hay fundación ni empresa: hay un Steering Committee de cinco personas, 108 contribuidores y un Open Collective con un ingreso anual de 791 dólares y 33 backers. La cadencia de releases tuvo huecos largos en 2024 y 2025 y se aceleró notablemente en 2026. No existe autenticación de dos factores en 0.8.5: el issue #62 sigue abierto en el milestone 0.9.x y el PR que la implementaba se cerró sin fusionar. Si tu criterio de compra incluye MFA en el panel de administración, hoy tienes que montarla fuera de la aplicación, y el capítulo 16 detalla las cuatro mitigaciones de infraestructura que quedan.

Con eso sobre la mesa, la decisión es tuya y este índice existe para que puedas tomarla antes de leer nada más. FOSSBilling tiene sentido cuando quieres control total del dato y del código, toleras parchear rápido cuando salga un advisory y tu operación cabe en los seis módulos de servicio y las cuatro pasarelas que existen de verdad. No lo tiene si necesitas MFA hoy, si dependes de una pasarela o un panel de virtualización que no está en el núcleo — no hay Proxmox, Virtualizor, VirtFusion ni SolusVM — o si tu cumplimiento normativo exige un proveedor con soporte contractual.

Recorrido del curso

flowchart TD
    A["Fundamentos e instalacion<br/>Cap. 1-3"] --> B["Operacion del negocio<br/>Cap. 4-9"]
    B --> C["Integraciones externas<br/>Cap. 10-12"]
    C --> D["Desarrollo y extension<br/>Cap. 13-15"]
    D --> E["Seguridad y produccion<br/>Cap. 16"]

El flujo de negocio que vas a montar

flowchart LR
    CLI["Cliente se registra"] --> CAR["Carrito y checkout"]
    CAR --> PED["Pedido en estado pending_setup"]
    PED --> FAC["Factura proforma"]
    FAC --> PAS["Pasarela de pago"]
    PAS --> IPN["ipn.php valida y crea transaccion"]
    IPN --> PAG["Factura pagada y numerada"]
    PAG --> ACT["Activacion del pedido"]
    ACT --> APR["Server manager o registrador aprovisiona"]
    APR --> ACTIVO["Servicio activo con expires_at"]
    ACTIVO --> CRON["Cron genera factura de renovacion"]
    CRON --> REC["Recordatorios de vencimiento"]
    REC --> COB{"Se paga a tiempo"}
    COB -->|Si| ACTIVO
    COB -->|No| SUS["Suspension automatica"]
    SUS --> CAN["Cancelacion tras el plazo"]

Los 16 capítulos

Bloque 1. Fundamentos e instalación

#CapítuloQué resuelve
1Qué es FOSSBilling y en qué estado está realmenteLos 40 módulos del núcleo, el fork de BoxBilling y sus rastros vivos en el código, la trampa de leer el AGPL del sitio web cuando la aplicación es Apache-2.0, los 32 advisories con sus cuatro críticos, la gobernanza real y una comparativa con WHMCS, Blesta y HostBill que termina en un árbol de decisión
2Instalación: VPS con nginx, PHP-FPM y MariaDB, y con DockerLos requisitos que comprueba el código y no coinciden con la documentación, el enlace oficial de descarga que hoy devuelve 404, un bloque nginx endurecido con las siete carencias del oficial corregidas, el asistente por dentro y el compose de producción con la trampa del volumen que tapa el código de la imagen
3config.php de la A a la Z, la CLI y los logsCada clave del único fichero de configuración con su default y su efecto real, trusted_proxies y el bucle de redirección infinito, el salt que no puedes perder, las treinta políticas del rate limiter, las seis discrepancias verificadas entre doc y código, los seis comandos de console.php y los once canales de Monolog

Bloque 2. Operación del negocio

#CapítuloQué resuelve
4Configuración inicial: empresa, monedas, impuestos y numeración de facturasEl orden exacto de configuración antes de vender nada, porque los datos de empresa, la tasa de IVA y la serie se congelan dentro de cada factura y no se recalculan nunca. El modelo de monedas de 0.8.x sin price_format, los tres proveedores de tasas de cambio y la mecánica del contador único de numeración
5Catálogo de productos: tipos, precios recurrentes, addons y promocionesLos siete tipos de producto frente a los seis módulos de servicio que existen de verdad, la tabla de precios con su trío de columnas por periodo, los límites reales — no hay periodos de 4 y 5 años tarificables ni prorrateo en upgrades — y el sistema de cupones con redenciones reservadas
6Clientes: grupos, campos personalizados, balance y el área de clienteLos estados que bloquean el login, los 20 campos personalizados, qué hacen y qué no hacen los grupos, el balance como tabla de movimientos y no como saldo, la impersonación que solo escribe client_id en la sesión, y el estado real del GDPR en el núcleo
7Pedidos y ciclo de vida del servicio: del carrito a la suspensiónQué crea createOrder() dentro de su transacción, los seis estados y las reglas exactas de transición con los mensajes de error que las delatan, el aprovisionamiento vía _callOnService, los batches de suspensión y cancelación del cron, y la cancelación al final del periodo de 0.8.5
8Facturación, pagos y cobranzaUna sola fila que pasa de proforma a factura, las cuatro condiciones del SQL que debe cumplir un pedido para generar renovación, los recordatorios con su candado reminded_at, las tres capas de deduplicación de una transacción, el claimForProcessing() atómico y los tres modos de reembolso
9Soporte, staff, permisos y correo salienteEl módulo Support con sus helpdesks y auto-cierre, el modelo de permisos reescrito en 0.8.4 a grupos con herencia y super_admin, los cuatro transportes de correo con DSN de Symfony Mailer, la cola mod_email_queue, las 46 plantillas del núcleo y un checklist de por qué no sale ningún correo

Bloque 3. Integraciones externas

#CapítuloQué resuelve
10Pasarelas de pago: Stripe, PayPal, IPN y tu propio adaptadorLas cuatro únicas pasarelas del núcleo y la purga de 2023 que explica por qué falta el resto, ipn.php línea a línea, Stripe con firma HMAC obligatoria y sus 12 eventos, PayPal Standard con _notify-validate y por qué VERIFIED no basta, y el esqueleto completo de un Payment_Adapter propio
11Server managers: aprovisionar hosting y escribir el tuyoLos seis managers del núcleo con sus puertos y trampas, el modelo servidor-plan-producto y los errores 701 a 704 al vincularlos, los 13 métodos abstractos verdaderos de Server_Manager frente a los seis que la web documenta y no existen, y el hecho central: FOSSBilling hoy no cubre VPS
12Dominios y registradores: TLDs, precios y tu propio Registrar_AdapterLos ocho ficheros de registrador y las cuatro marcas blancas de ResellerClub, el punto que todo el mundo malentiende — los precios por TLD los pones a mano, no se consultan al registrador —, el flujo de registro, transferencia y renovación, y las quince firmas abstractas reales del adaptador

Bloque 4. Desarrollo y extensión

#CapítuloQué resuelve
13Arquitectura interna y desarrollo de módulos propiosQue no es Symfony ni Laravel sino un framework propio que consume componentes prestados, el bootstrap de load.php con sus códigos de excepción, di.php servicio a servicio, RedBeanPHP congelado conviviendo con Doctrine 3, por qué no hay migraciones, y un módulo funcional completo con la estructura 0.8.x que ya no es la del example-module oficial
14La API JSON y los hooksLos tres roles enrutables, el Basic Auth con usuario literal admin o client, el CSRF y sus cuatro ubicaciones, el catálogo de códigos de error del 201 al 9999 y el detalle incómodo de que casi todos llegan con HTTP 200, los diez pasos del dispatcher, y los hooks con su gotcha: se persisten en base de datos y no se descubren hasta que corre el cron
15Temas Twig, widgets e internacionalizaciónEl orden de prioridad de TwigLoader para sobrescribir cualquier plantilla sin tocar el núcleo, la estructura real de un tema con esbuild, strict_variables = true como causa número uno de la página en blanco, el sandbox que limita las plantillas de email, los widgets con sus slots, y el estado real del español al 83,5 %

Bloque 5. Seguridad y producción

#CapítuloQué resuelve
16Seguridad, endurecimiento y puesta en producciónCómo leer un advisory y decidir si te afecta, las cuatro mitigaciones para la ausencia de 2FA, HTTPS en dos capas, cerrar /install, /data, /vendor y config.old.php, sacar path_data de la raíz web, endurecer el servidor, rotar lo que Monolog no rota, los backups que el núcleo no hace, el rendimiento y el actualizador de dos fases que puede dejarte el cron parado sin avisar

Rutas de lectura por perfil

Hoster que evalúa migrar desde WHMCS

Tu pregunta no es cómo se instala, es si se puede. Empieza por el capítulo 1 entero, sobre todo la comparativa y el árbol de decisión, y no lo cierres hasta contestar si toleras la ausencia de 2FA. Salta directo al capítulo 11 para comprobar que tu panel está entre los seis soportados y al capítulo 10 para lo mismo con tu pasarela: esas dos listas son cortas y decisivas. El capítulo 12 te dirá si tu registrador está cubierto y que los precios por TLD se cargan a mano. Con eso puedes decidir. Si la respuesta es sí, vuelve al 2, al 4 y al 7, y termina en el capítulo 16 antes de mover un solo cliente.

Freelance que factura servicios recurrentes

No necesitas aprovisionamiento automático: necesitas cobrar todos los meses sin perseguir a nadie. Instala con Docker siguiendo el capítulo 2, haz el capítulo 4 con calma — es el que evita que emitas facturas con el IVA mal congelado — y modela tus servicios como productos custom en el capítulo 5. El capítulo 8 es tu capítulo central: renovaciones automáticas, recordatorios y reembolsos. Conecta Stripe con el capítulo 10, deja el correo saliente funcionando con el capítulo 9 y puedes saltarte el 11, el 12 y el 13 por completo.

Desarrollador que quiere extenderlo

Lee el capítulo 3 para saber dónde mirar cuando algo falle, y luego vete derecho al bloque 4. El capítulo 13 es la base: sin entender Pimple, el router propio y la convivencia de los dos ORM, cualquier módulo que escribas va a pelear contra el framework. El capítulo 14 te da la superficie de integración y el sistema de eventos, y el 15 la capa de presentación. Si tu extensión es un adaptador, los esqueletos completos están en el capítulo 10 para pasarelas, el 11 para paneles y el 12 para registradores.

Requisitos previos

RequisitoPara qué¿Obligatorio?
PHP 8.3, 8.4 o 8.5El código comprueba min_version = '8.3'. Debian 12 y Ubuntu 22.04 necesitan Sury o ppa:ondrej/php
Extensiones PHPcurl, intl, openssl, pdo_mysql, xml, dom, iconv, json, zlib y gd — esta última es obligatoria en el código aunque la doc la liste como recomendada
MySQL 8.4+ o MariaDB 11.4+Almacén único. Crea la base en utf8mb4 tú mismo antes del asistente
nginx o Apache con TLSEl instalador y el área de cliente asumen HTTPS. certbot antes del asistente, no después
Manejo de shell, SQL y PHP básicoVas a editar config.php, leer logs y consultar tablas para diagnosticar
Nociones de TwigSolo desde el capítulo 15 en adelantePara el bloque 4
Una cuenta Stripe o PayPal en modo testProbar el circuito de cobro completo sin mover dineroPara el capítulo 10

Laboratorio recomendado

Monta dos entornos y no los confundas. Uno. Una instancia local con el compose oficial del capítulo 2, donde puedes romper cosas, borrar la base y volver a empezar. Ahí haces los capítulos 4 a 9 y todo el bloque de desarrollo. Dos. Un VPS pequeño con dominio real y certificado, porque hay tres cosas que no puedes probar en localhost: los IPN de las pasarelas, que necesitan una URL pública alcanzable; el correo saliente con SPF y DKIM; y el comportamiento detrás de un proxy inverso, que es donde aparece el bucle de redirección de force_https.

Advertencia: usa la demo pública oficial solo para mirar la interfaz. No cargues datos reales de clientes en ninguna instancia hasta haber completado el capítulo 16: entre la ausencia de 2FA y la superficie que queda abierta por defecto, una instancia recién instalada y expuesta a internet no está lista para datos de terceros.

Cómo usar este curso

  1. Los capítulos 1 a 3 no se saltan. El 1 decide si sigues; el 2 y el 3 son la base sobre la que todo lo demás asume estar apoyado.
  2. El 4 es irreversible en la práctica: los datos de empresa, la tasa de IVA y la serie de numeración se congelan en cada factura emitida. Hazlo antes de la primera venta.
  3. Del 5 al 9 se construye el negocio, en ese orden: no hay pedido sin producto, ni factura sin pedido, ni cobranza sin correo saliente.
  4. Del 10 al 12 se conecta con el mundo. Cada uno cierra con el esqueleto de un adaptador propio, por si tu proveedor no está.
  5. Del 13 al 15 se extiende el sistema. Son independientes del bloque de operación.
  6. El 16 se lee antes de abrir al público, no después del primer incidente.

Empieza por Qué es FOSSBilling y en qué estado está realmente →