AltFreeStack
CRM & Soportedocker-readySource-available🟡 Estándar · ~1GB

Invoice Ninja: alternativa Source-available a FreshBooks en 2026

Invoice Ninja gestiona facturas, presupuestos y gastos recurrentes con un portal de cliente para pagos online integrado, como alternativa auto-hospedable a FreshBooks o Bill.com para freelancers y pequeñas agencias.

El código es público y gratis para auto-hospedar, pero la licencia no es open source (OSI) — revisa sus condiciones exactas antes de un uso comercial.

Licencia Elastic License 2.010.3k estrellasSitio web Repositorio en GitHub

Audit Snapshot

Ver notas →
  • Licencia — No verificable en GitHub

  • GitHub — Activo

  • Último release — v5.13.47 · hace 3 días

  • Docker Compose — Parcial

  • Producción — No probado por AltFreeStack

Invoice Ninja vs. FreshBooks

Ventajas

  • Muy completo para freelancers y pequeñas agencias
  • Portal de cliente incluido de serie

A tener en cuenta

  • La v5 se distribuye bajo Elastic License 2.0, no una licencia OSI clásica
  • La interfaz de administración puede sentirse sobrecargada al principio

Guía rápida de instalación con Docker

Copia este docker-compose.yml, ajusta las contraseñas de ejemplo y ejecuta docker compose up -d en tu servidor. Ver la guía completa paso a paso →

💡 ¿SaaS oficial o self-hosted con AltFreeStack?

  • En la nube oficial: una cuota mensual recurrente y límites de uso en FreshBooks.
  • En tu propio VPS: gratis y auto-hospedable en tu propio servidor sin límites de uso — sin la cuota mensual del SaaS, aunque la licencia no es open source OSI (revísala antes de un uso comercial).
docker-compose.yml
services:
  app:
    image: invoiceninja/invoiceninja:5
    restart: unless-stopped
    ports:
      - "80:80"
    environment:
      APP_URL: http://localhost # CHANGE THIS TO YOUR DOMAIN
      APP_KEY: change-me-32-char-app-key # REQUIRED: generate a random secret before first run
      DB_HOST: db
      DB_DATABASE: ninja
      DB_USERNAME: ninja
      DB_PASSWORD: change-me-mysql-password # REQUIRED: generate a random secret before first run
    volumes:
      - ninja_data:/var/www/app/public/storage
    depends_on:
      - db
  db:
    image: mysql:8
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: ninja
      MYSQL_USER: ninja
      MYSQL_PASSWORD: change-me-mysql-password # must match DB_PASSWORD above
      MYSQL_ROOT_PASSWORD: change-me-mysql-root-password # REQUIRED: generate a random secret before first run
    volumes:
      - ninja_db_data:/var/lib/mysql
volumes:
  ninja_data:
  ninja_db_data:

🚀 Despliegue en 1 comando

Recomendado para novatos

Copia este único comando y pégalo en la consola de tu VPS recién creado (Vultr, DigitalOcean...). Descarga el script, lo muestra en pantalla para que veas exactamente qué va a hacer (nunca un pipe directo a ciegas) y, solo entonces, instala Docker si hace falta, crea los archivos con los secretos ya generados y arranca todo — sin nano, sin copiar y pegar bloques de código.

curl -sSL ".../api/deploy?stack=invoice-ninja" -o deploy.sh && cat deploy.sh && bash deploy.sh

Este docker-compose corresponde a un proyecto con actividad reciente en GitHub — último commit hoy.

¿Este docker-compose no te funciona? Repórtalo en GitHub →

Ficha técnica

Licencia
Elastic License 2.0
Categoría
CRM & Soporte
Sustituye a
FreshBooks, Bill.com
Stack técnico
PHP (Laravel)MySQLVue.js

Bajo el capó

Base de datos

MySQL

Lenguaje

PHP (Laravel)

Plataformas

Web · Mobile (iOS/Android)

Funcionalidades principales

  • Facturas, presupuestos y gastos recurrentes
  • Portal de cliente para pagos online
  • Múltiples pasarelas de pago (Stripe, PayPal, etc.)
💾 Copias de seguridad en 3 pasos (Día 2)

Mientras la carpeta ./data (el "volumen" mapeado al contenedor) exista en tu servidor, tus datos sobreviven a cualquier reinicio o actualización — es lo único que necesitas respaldar.

1. Crea una copia comprimida en el servidor

tar -czvf backup-$(date +%F).tar.gz ./data

2. Descárgala a tu ordenador

Desde la terminal de tu ordenador (no la de tu servidor):

scp root@TU_IP:~/app/backup-*.tar.gz ./

3. Restaura en caso de emergencia

tar -xzvf backup-archivo.tar.gz
🌐 Conectar tu dominio con SSL gratis

Paso 1 — Configura el DNS

En el panel de tu registrador de dominio (Cloudflare, Namecheap, GoDaddy...), crea un registro:

Tipo
A
Nombre/Host
@ (dominio raíz) o un subdominio, ej. app
Contenido/Valor
La IP pública de tu servidor

Espera entre 5 y 15 minutos a que el registro se propague por internet.

Paso 2 — Proxy inverso automático con Caddy

Un solo archivo, sin configurar Nginx ni certificados manuales — Caddy emite y renueva el HTTPS de Let's Encrypt solo.

Crea un archivo llamado Caddyfile:

tudominio.com {
    reverse_proxy localhost:80
}

Levanta Caddy con este comando (descarga la imagen y arranca en segundo plano):

docker run -d -p 80:80 -p 443:443 --name caddy --restart always -v $PWD/Caddyfile:/etc/caddy/Caddyfile -v caddy_data:/data caddy