Por qué alojar tu facturación de forma autónoma
Los proveedores SaaS de facturación cobran por usuario o por volumen de transacciones. FreshBooks empieza en 19 $/mes para un solo usuario; QuickBooks Online oscila entre 35 y 90 $/mes según el plan. A medida que crece tu equipo o aumenta el número de clientes, la factura SaaS sigue una curva lineal sin relación con el valor entregado. En un VPS de entrada a 99 DH/mes, Invoice Ninja funciona sin límite de usuarios ni de clientes, y el coste permanece fijo independientemente del crecimiento. Los datos de facturación quedan en tu infraestructura, sujetos a tu propia política de retención, sin pasar por los servidores de un tercero. Más de 100.000 empresas en todo el mundo han elegido el despliegue autoalojado de Invoice Ninja.
Lo que obtienes con Invoice Ninja 5.13.45
- Presupuestos, facturas recurrentes, abonos y órdenes de compra en una interfaz unificada
- Pasarelas de pago integradas: Stripe, PayPal, SEPA, Mollie, GoCardless y más de veinte adicionales
- Portal de cliente autoalojado con visualización y pago de facturas en línea
- Seguimiento del tiempo facturable por proyecto y tarea, enlazable a líneas de factura
- API REST completa y webhooks para conectar tu ERP, CRM o flujo contable
- Autenticación OIDC genérica añadida en la versión 5.13.43 (18 de septiembre de 2026) para SSO empresarial
- Soporte multidivisa y multiidioma con renderizado de PDF nativo en el servidor
- Módulo white-label opcional a 30 $/año para eliminar el pie de página «Created with Invoice Ninja»
Requisitos mínimos para Invoice Ninja 5.13.45
La versión 5.13.45, publicada el 9 de octubre de 2026, exige un entorno mínimo preciso. Reserva al menos 2 GB de RAM para el conjunto del stack: el contenedor PHP-FPM de Invoice Ninja consume entre 300 y 500 MB bajo carga, MySQL 8.4 LTS ocupa entre 400 y 700 MB según el buffer pool configurado, y Redis 7.4 permanece ligero con 30–50 MB en reposo. Un VPS con 2 vCPU y 4 GB de RAM ofrece margen cómodo para la generación paralela de PDF. Reserva al menos 10 GB para los volúmenes Docker. MySQL 8.4 LTS es recomendado por la documentación oficial con garantías de compatibilidad hasta 2032; evita MariaDB por incompatibilidades conocidas con ciertas migraciones de Invoice Ninja v5. Se requieren Docker Engine 24+ y Docker Compose v2.x.
Desplegar Invoice Ninja en un VPS
Preparar el directorio de trabajo
Conéctate por SSH a tu VPS y crea un directorio dedicado:
mkdir -p /opt/invoiceninja/{data,logs,public} && cd /opt/invoiceninja. Este directorio alojará el archivo Compose, el archivo de entorno y los volúmenes persistentes. Verifica que Docker y Docker Compose v2 están instalados:docker compose versiondebe devolver una versión 2.x.Crear el archivo docker-compose.yml
Crea
/opt/invoiceninja/docker-compose.ymlcon los siguientes servicios. El serviciodbusa la imagenmysql:8.4con un volumen nombradodb_data. El servicioredisusaredis:7.4-alpine. El servicioappusainvoiceninja/invoiceninja:5.13.45y depende dedbyredis; monta./data:/var/www/app/storagey./public:/var/www/app/public. Expón el puerto9000solo internamente — nginx se encargará de la interfaz pública. Declara los tres servicios en una red bridgeapp-netinterna.Configurar las variables de entorno
Crea
/opt/invoiceninja/.env(nunca lo incluyas en control de versiones). Variables esenciales:APP_ENV=production,APP_DEBUG=false,APP_URL=https://votre-domaine.com,DB_HOST=db,DB_DATABASE=invoiceninja,DB_USERNAME=ninja,DB_PASSWORD=<contraseña_fuerte>,MYSQL_ROOT_PASSWORD=<root_pwd>,REDIS_HOST=redis,QUEUE_CONNECTION=redis,MAIL_MAILER=smtp,[email protected],MAIL_ENCRYPTION=tls. Usa contraseñas de al menos 32 caracteres aleatorios.Generar la clave de aplicación APP_KEY
Antes del primer arranque, genera la clave de cifrado Laravel. Levanta primero los contenedores de dependencias:
docker compose up -d db redis. Espera 20 segundos para que MySQL inicialice su directorio de datos, luego arranca la aplicación:docker compose up -d app. Genera la clave:docker compose exec app php artisan key:generate. Copia el valor devuelto (formatobase64:…) y configúralo comoAPP_KEYen.env. Reinicia el contenedor app:docker compose restart app.Configurar nginx como proxy inverso
Crea
/etc/nginx/sites-available/invoiceninja.conf. El bloqueserverescucha en el puerto 443 con un certificado Let's Encrypt. La directivarootapunta a/opt/invoiceninja/public. El bloquelocation /usatry_files $uri $uri/ /index.php?$query_string. El bloquelocation ~ \.php$pasa las peticiones afastcgi_pass 127.0.0.1:9000. Añadeclient_max_body_size 100M. Activa la configuración:ln -s /etc/nginx/sites-available/invoiceninja.conf /etc/nginx/sites-enabled/ && nginx -t && systemctl reload nginx.Ejecutar migraciones y primer acceso
Una vez configurado nginx, ejecuta las migraciones de base de datos:
docker compose exec app php artisan migrate --force. La operación tarda de 30 a 60 segundos. Abre luegohttps://votre-domaine.comen un navegador: el asistente de configuración te pedirá crear la cuenta de administrador e introducir los datos de tu empresa.Activar la cola de trabajos asíncronos
Invoice Ninja usa workers de Laravel para el envío de correos y la generación de PDF en segundo plano. En el archivo Compose, añade un servicio
workerque use la misma imageninvoiceninja/invoiceninja:5.13.45y ejecutephp artisan queue:work --sleep=3 --tries=3. Sin un worker activo, los correos de facturas se encolan pero nunca se envían.Configurar las pasarelas de pago
En el backoffice (Configuración > Pasarelas de pago), activa Stripe pegando tus claves pública y secreta del dashboard de Stripe. Para PayPal, usa las credenciales OAuth de tu aplicación REST de PayPal. Para SEPA vía GoCardless, introduce el access token de Sandbox y cambia a entorno de Producción tras las pruebas.
Para obtener un certificado TLS de Let's Encrypt con Certbot, instala el paquete python3-certbot-nginx y ejecuta certbot --nginx -d votre-domaine.com. Certbot modifica automáticamente la configuración de nginx para redirigir HTTP a HTTPS y renueva el certificado cada 60 días mediante un timer de systemd. Asegúrate de que el puerto 80 está abierto en tu firewall antes de ejecutar Certbot: ufw allow 80/tcp.
Conectar las pasarelas de pago
Invoice Ninja 5.13.45 soporta nativamente más de 25 pasarelas. Stripe es la más completa: gestiona pagos con tarjeta, domiciliación SEPA, transferencias ACH y, desde la versión 5.13.43, Stripe PromptPay para los mercados del Sudeste Asiático. Para activarla, crea una clave API restringida en el dashboard de Stripe con los permisos charges:write, customers:write y payment_methods:read. PayPal se integra vía REST API: crea una aplicación en el portal de desarrolladores de PayPal y recupera el client_id y el client_secret. Para domiciliación SEPA en Europa, GoCardless es la vía recomendada: el mandato lo firma el cliente en línea desde el portal Invoice Ninja. Mollie es una alternativa todo en uno apreciada por las empresas europeas.
Invoice Ninja autoalojado vs plan SaaS alojado
Desplace la tabla
| Invoice Ninja autoalojado en VPS | Invoice Ninja SaaS alojado | |
|---|---|---|
| Coste mensual | 99 DH/mes (VPS fijo) | Gratis hasta 20 clientes, luego 11–16 $/mes |
| Límite de clientes | Ilimitado | 20 clientes en el plan gratuito |
| Control de datos | Datos en tu infraestructura | Datos en Invoice Ninja Inc. |
| Actualizaciones | Manuales (comando docker pull) | Automáticas |
| White-label | 30 $/año (opcional) | Incluido en planes de pago |
| Mantenimiento del servidor | A tu cargo | Gestionado por el proveedor |
Copias de seguridad y actualizaciones de Invoice Ninja
La estrategia de copia de seguridad debe cubrir dos elementos distintos: la base de datos MySQL y el volumen de almacenamiento de archivos. Para MySQL, programa un volcado diario con docker compose exec db mysqldump -u ninja -p invoiceninja | gzip > /backups/invoiceninja-$(date +%Y%m%d).sql.gz mediante un cron o timer de systemd. Conserva al menos 30 días rotantes y prueba la restauración trimestralmente.
Para actualizar a una versión futura: actualiza el tag de la imagen en tu archivo Compose, descarga la nueva imagen con docker compose pull app, luego ejecuta docker compose up -d app worker seguido de docker compose exec app php artisan migrate --force. Revisa el changelog de GitHub antes de cualquier actualización mayor.
Resolución de errores comunes
Cuatro problemas aparecen con frecuencia durante el despliegue inicial.
Error SQLSTATE[HY000] [2002] Connection refused: MySQL aún no está lista cuando el contenedor app intenta conectarse. Añade una directiva healthcheck al servicio db y una condición service_healthy en el depends_on de app.
Los correos no se envían: verifica que el servicio worker está en marcha con docker compose ps worker. Si el estado es Exited, inspecciona los logs: docker compose logs worker.
Página en blanco o error 500 tras la migración: el directorio storage/ tiene permisos incorrectos. Ejecuta docker compose exec app chown -R www-data:www-data /var/www/app/storage && docker compose exec app php artisan config:clear && docker compose exec app php artisan cache:clear.
La generación de PDF produce archivos vacíos: verifica que la variable PDF_GENERATOR está definida (valores posibles: snappy, browsershot, phantom) y que el binario correspondiente está presente en la imagen.
Invoice Ninja autoalojado: conclusiones clave
Invoice Ninja 5.13.45, publicado el 9 de octubre de 2026, es una solución de facturación madura y mantenida activamente. La Elastic License 2.0 permite el autoalojamiento para cualquier uso interno sin restricciones: no pagas nada mientras no revendas el acceso como servicio. El stack Docker (imagen oficial + MySQL 8.4 LTS + Redis 7.4) es reproducible en menos de una hora en cualquier VPS con 2 GB de RAM. El módulo white-label sigue siendo opcional a 30 $/año. Si tu volumen de clientes supera los 20 o tus datos de facturación deben permanecer en tu infraestructura por razones legales o de cumplimiento, el despliegue autoalojado está justificado económica y técnicamente. Nuestro equipo está disponible en [email protected] para ayudarte a dimensionar tu VPS y configurar las copias de seguridad.