Por qué alojar ERPNext en un VPS
Un ERP centraliza los datos más sensibles de la empresa: asientos contables, márgenes, fichas de clientes y proveedores, nóminas. Las ofertas SaaS suelen facturar por usuario al mes, lo que se encarece a medida que los equipos crecen. En un VPS dedicado, pagas el servidor una vez, añades todos los usuarios que necesitas y la base de datos permanece bajo tu control, con copias de seguridad según tus propias reglas.
ERPNext se apoya en Frappe, un framework Python/JavaScript que hace el código fuente legible y extensible. Una instancia propia te permite actualizar a tu ritmo, elegir apps complementarias (HRMS, e-Commerce, Education, Healthcare) y escribir tus propios módulos sin depender de un proveedor.
Las ventajas concretas de un ERPNext auto-alojado
- Sin coste por usuario: añade equipos sin aumentar la factura.
- Soberanía sobre los datos contables y de RRHH, que permanecen en tu servidor.
- Todos los módulos disponibles (contabilidad, inventario, CRM, fabricación, nóminas) sin nivel de pago.
- Personalización libre mediante el framework Frappe y las apps complementarias.
- Copias de seguridad y retención gestionadas, adaptadas a tus obligaciones legales.
- Escalabilidad: aumenta RAM/vCPU a medida que crece el volumen de transacciones.
Los módulos clave de ERPNext
ERPNext cubre el ciclo operativo completo de una empresa. Contabilidad: plan de cuentas multidivisa, libro mayor, informes normativos (balance, cuenta de resultados), gestión del IVA y conciliación bancaria. Ventas y compras: presupuestos, pedidos, albaranes, facturas y abonos con flujos de aprobación. Gestión de inventario: múltiples almacenes, lotes y números de serie, inventarios rotativos, valoración FIFO o promedio móvil. CRM: leads, oportunidades, campañas y pipeline comercial con cuadro de actividades. Fabricación: listas de materiales (BOM), órdenes de fabricación, seguimiento de puestos de trabajo y mermas. RRHH: fichas de empleados, ausencias, asistencia, nóminas configurables por país y evaluación del desempeño.
Cada módulo se activa desde el escritorio de ERPNext; solo instalas lo que necesitas, y los derechos de acceso se definen por rol a nivel de documento.
Requisitos de hardware y software
ERPNext es más exigente que la media. Cuenta con un mínimo de 2 vCPU y 4 GB de RAM para uso de prueba, y 4 vCPU / 8 GB de RAM para producción con varios usuarios simultáneos. Reserva 20 GB de disco para la base de datos MariaDB, Redis y los archivos subidos.
En cuanto al software: Docker y Docker Compose v2 (>= 2.20), un nombre de dominio (p. ej. erp.myapp.com) apuntando a la IP del VPS y el puerto 443 abierto en entrada. ERPNext usa MariaDB 10.6+ como base de datos principal y Redis para caché y workers en tiempo real — ambos están incluidos en el stack frappe_docker; no es necesario instalarlos por separado.
Desplegar ERPNext con Frappe Docker y HTTPS
Preparar el VPS y Docker
Por SSH, actualiza el sistema (
apt update && apt upgrade -y) e instala Docker concurl -fsSL https://get.docker.com | sh. Añade tu usuario al grupo docker:usermod -aG docker $USER. Comprueba condocker compose version(v2 requerido).Obtener frappe_docker
Clona el repositorio oficial y elige la rama correspondiente a la versión objetivo:
git clone https://github.com/frappe/frappe_docker cd frappe_dockerLa carpeta
overrides/contiene compose partials para Caddy (HTTPS automático), Traefik y la app HRMS — combínalos según tus necesidades.Configurar el entorno
Copia
example.enva.envy ajusta las variables clave:cp example.env .envEn
.env, defineFRAPPE_SITE_NAME_HEADER,DB_PASSWORD,REDIS_CACHEy, si usas el override de Caddy,LETSENCRYPT_EMAILy el dominio enCaddyfile. Nunca despliegues con contraseñas por defecto.Lanzar el stack
Inicia todos los servicios:
docker compose --project-name erpnext \ -f compose.yaml \ -f overrides/compose.mariadb.yaml \ -f overrides/compose.redis.yaml \ -f overrides/compose.https.yaml \ up -dLuego crea el sitio ERPNext e instala la app:
docker compose exec backend bench new-site erp.myapp.com \ --mariadb-root-password <rootpwd> \ --admin-password <adminpwd> docker compose exec backend bench --site erp.myapp.com install-app erpnext docker compose exec backend bench --site erp.myapp.com migrateSigue los logs para confirmar que todos los servicios (db, redis, workers, scheduler) están sanos:
docker compose logs -f.Configurar el reverse proxy
Si no usas el override de Caddy incluido, coloca Nginx delante de ERPNext. Ejemplo mínimo:
server { listen 443 ssl; server_name erp.myapp.com; ssl_certificate /etc/letsencrypt/live/erp.myapp.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/erp.myapp.com/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; } }Con Caddy basta un
Caddyfilesencillo:erp.myapp.com { reverse_proxy backend:8000 }— el certificado Let's Encrypt se obtiene y renueva automáticamente.Asegurar y hacer copias de seguridad
Restringe los puertos internos (MariaDB 3306, Redis 6379) al loopback o a la red Docker interna. Programa copias de seguridad regulares con
bench backupy almacénalas fuera del VPS:docker compose exec backend bench --site erp.myapp.com backup --with-filesLos archivos de copia se guardan en
sites/erp.myapp.com/private/backups/dentro del volumensites— cópialos a un almacenamiento de objetos externo (S3, Garage) para recuperación ante desastres.Primera conexión
Abre la dirección de tu aplicación e inicia sesión con el usuario
Administratory la contraseña de administrador definida enbench new-site. Espera unos minutos tras la instalación antes de que la dirección responda — las migraciones iniciales se ejecutan en segundo plano. ERPNext continúa con su asistente de configuración: idioma, zona horaria, moneda, ejercicio fiscal y empresa.
Posinstalación: empresa, ejercicio y usuarios
Una vez conectado como Administrator, ve a Configuración → Ajustes del sistema para confirmar la zona horaria y el formato de fecha, y luego a Contabilidad → Plan de cuentas para adaptar la estructura a las normas locales (ERPNext incluye planes de cuentas para cerca de cien países).
Crea tu empresa en Contabilidad → Empresa: introduce la moneda base, el número fiscal y el ejercicio fiscal de inicio. ERPNext crea automáticamente las cuentas de cierre y los asientos de apertura.
Para los usuarios, ve a Configuración → Usuarios y permisos → Usuario: asigna roles de negocio (Accounts Manager, Stock User, HR Manager…) en lugar de derechos documento a documento. Los roles se combinan: un usuario puede ser a la vez Sales User y Purchase User sin derechos de administración.
Monitorización y mantenimiento
ERPNext ofrece varios puntos de entrada para supervisar una instancia en producción.
bench doctor es el comando de diagnóstico integrado: comprueba el estado de los workers Celery, el scheduler y la conexión Redis. Ejecútalo desde el contenedor:
docker compose exec backend bench doctorUn worker ausente o una cola bloqueada aparece de inmediato.
Logs de la aplicación — los logs de ERPNext están en sites/<site>/logs/ dentro del volumen sites:
- web.log: errores HTTP y trazas Python del backend Gunicorn;
- worker.error.log: excepciones de los workers Celery (tareas programadas, envío de correos);
- scheduler.log: ciclos del planificador.
Copia de seguridad automatizada — crea un trabajo cron en el host para ejecutar bench backup diariamente y copiar los archivos a almacenamiento remoto:
0 3 * * * docker compose -p erpnext exec -T backend \
bench --site erp.myapp.com backup --with-files \
&& rclone copy /path/to/backups remote:erpnext-backupsActualizaciones — antes de cada actualización a una versión mayor, haz una copia completa, lee las notas de la versión, prueba en una copia y luego: bench update --reset dentro del contenedor. Las migraciones de esquema se aplican automáticamente, pero algunas versiones mayores de ERPNext requieren actualizar primero a la versión menor más alta (p. ej. v14 → v14.x latest antes de pasar a v15).
Resolución de errores comunes
Caída del worker: RedisBroadcastError o ConnectionRefusedError hacia Redis
Error en worker.error.log: redis.exceptions.ConnectionRefusedError: [Errno 111] Connection refused. Causa: el contenedor Redis se detuvo o reinició tras un OOM. Comprueba: docker compose ps redis — si está en Exited, reinícialo con docker compose up -d redis y luego los workers. Si el fallo se repite, aumenta la RAM del VPS o limita el número de workers en common_site_config.json.
Migración de esquema bloqueada: frappe.exceptions.SchemaChangedError
Error durante bench migrate: SchemaChangedError: <DocType> has been manually modified. Causa: una columna fue modificada manualmente en la base de datos, ERPNext se niega a sobreescribir. Solución: bench --site erp.myapp.com migrate --skip-failing, luego inspecciona el doctype afectado en la interfaz y relanza migrate sin el flag.
Timeout de bench: Traceback ... requests.exceptions.ReadTimeout
Error durante una acción larga (importación CSV masiva, recálculo de inventario): ReadTimeout: HTTPConnectionPool. Aumenta el timeout de Gunicorn en common_site_config.json: "gunicorn_workers": 2, "web_timeout": 120. Reinicia el servicio web: docker compose restart backend.
Conexión MariaDB rechazada: OperationalError: (2003, "Can't connect to MySQL server on 'db'")
Error al ejecutar bench new-site o al iniciar los workers. Causa habitual: el contenedor MariaDB aún no está listo o el health check ha fallado. Comprueba: docker compose logs db | tail -20. Si MariaDB muestra [ERROR] InnoDB: Page 0 log sequence number, los ficheros de base de datos están corruptos — restaura desde la última copia de seguridad. Si es un simple retraso de arranque, espera 30 segundos y relanza el comando.
Sitio en blanco tras bench migrate: TemplateNotFound
ERPNext muestra una página en blanco o un error Jinja tras una actualización. Causa: los assets estáticos no se reconstruyeron. Ejecuta: docker compose exec backend bench --site erp.myapp.com clear-cache && bench build --app erpnext. Reiniciar el contenedor frontend (si es independiente) también puede ser suficiente.
ERPNext vs Odoo Community: cuándo elegir uno u otro
Desplace la tabla
| Criterio | ERPNext | Odoo Community |
|---|---|---|
| Licencia | GPL v3 — código y módulos libres | LGPL v3 (core) — módulos Enterprise propietarios |
| Módulos incluidos | Contabilidad, inventario, CRM, fabricación, RRHH — todos gratuitos | Núcleo funcional; módulos avanzados reservados a Odoo Enterprise de pago |
| Lenguaje / stack | Python + Frappe, JS vanilla en el cliente | Python + OWL (framework JS propio) |
| Interfaz | Escritorio de apps, formularios configurables sin código | Vista kanban/lista, studio low-code (Enterprise) |
| Complejidad de instalación | Stack Docker oficial bien documentado | Docker disponible, pero menos experiencia comunitaria |
| Comunidad | Activa en GitHub y foro Frappe; fuerte en India y África | Muy amplia; denso ecosistema de partners en Europa |
| Ideal para | Pymes que buscan un ERP completo gratuito, fabricación, multidivisa | Empresas que quieren CRM avanzado o e-commerce Odoo sin desarrollo personalizado |
ERPNext evoluciona con versiones mayores que incluyen migraciones de esquema: antes de cada actualización, haz un bench backup completo y prueba la subida de versión en una copia antes de aplicarla en producción. Las migraciones entre versiones mayores deben seguir el camino oficial (p. ej. v14 → v15 sin saltar versiones).
La documentación oficial
Para la configuración avanzada y las opciones propias de la herramienta, consulta la documentación oficial de ERPNext y el repositorio frappe_docker. Esta guía cubre el despliegue en VPS; la documentación del editor sigue siendo la referencia para ajustes finos, actualizaciones mayores y casos de uso específicos.