Full open-source ERP (Frappe-based). Replaces SAP Business One / NetSuite / Microsoft Dynamics 365 Business Central. Modules for accounting, sales, purchasing, stock, manufacturing, projects, HR.
The heaviest service in PMA — multi-container (web + worker + scheduler + queues + nginx + postgres + redis-cache + redis-queue + socketio). 4-8 GB RAM. First boot can take 10+ minutes.
| Field | Value |
|---|---|
| Containers | ${CONTAINER_PREFIX}erpnext + 7 sidecars (worker, scheduler, queue-short/long, websocket, nginx, redis-cache, redis-queue, postgres) |
| Image | frappe/erpnext (multiple — base + custom plugins) |
| Internal port | 8000 (web) / 9000 (socketio) |
| External port | ${ERPNEXT_PORT} (default 8084) |
| Database | PostgreSQL (multi-site capable — site_database field in manifest) |
| Storage | erpnext-sites (config + apps) + erpnext-postgres-data + redis volumes |
| Backup type | database + volume (sites) |
| Classification | enterprise |
| Profiles | enterprise, full |
| Default SSO | frappe (Frappe OAuth provider, Authentik-backed) |
ERPNext has the most service-specific recipes of any PMA service — Frappe has rich CLI semantics. Highlights:
| Recipe | What it does |
|---|---|
just erpnext-bench ARGS |
Access Frappe bench CLI (the underlying admin tool) |
just erpnext-console |
Open Frappe Python console (live debugger against your data) |
just erpnext-migrate |
Run schema migrations (after image upgrade) |
just erpnext-clear-cache |
Clear cache (after config changes) |
just erpnext-reset-password PASSWORD |
Reset Administrator password |
just erpnext-list-users |
List users |
just erpnext-create-user --email=… --firstname=… --lastname=… [--admin] |
Create user |
just erpnext-enable-user EMAIL / -disable-user / -block-user / -delete-user |
User state |
just erpnext-list-roles |
List available ERPNext roles |
just erpnext-add-role ROLE USER / -remove-role |
Role assignment |
just erpnext-list-role-profiles |
List Role Profiles (bundles of roles) |
just erpnext-apply-profile PROFILE USER |
Apply a Role Profile |
just erpnext-app-install APP |
Install a Frappe app (HR module, education, etc.) |
just erpnext-apps |
List installed apps |
just erpnext-backup |
Frappe-native backup (in addition to PMA-level just backup erpnext) |
just erpnext-clone --from=ENV --to=ENV |
Copy ERPNext data between envs |
just erpnext-logs / -logs-init |
Logs (init logs useful during first boot) |
just erpnext-status / -restart |
Lifecycle |
just up
just erpnext-logs-init # follow configurator output during first boot
# This can take 10+ minutes. Status flips to healthy when ready.
The configurator container does first-time setup (creates the site, installs ERPNext app, runs initial migrations). Subsequent boots are quick.
just erpnext-create-user --email=cfo@example.com --firstname=Sarah --lastname=Smith --admin
# Creates user + assigns "System Manager" + "Administrator" roles
just erpnext-app-install hrms # HR module
just erpnext-migrate # run migrations after install
just erpnext-clear-cache
just erpnext-list-role-profiles
# Accounts User, Sales User, Purchase Manager, ...
just erpnext-apply-profile "Sales User" alice@example.com
just backup erpnext # PMA-level (db + sites volume)
# Or Frappe-native (useful for cross-Frappe-version restore)
just erpnext-backup
just erpnext-console
# Then in the Python REPL:
>>> frappe.get_doc("Sales Invoice", "SI-2024-0042")
sso.type: frappeERPNext has its own OAuth provider format (/method/frappe.integrations.oauth2.openid_profile). The PMA SSO flow registers an Authentik application with this endpoint as the userinfo URL.
just sso-check erpnext # verify SSO is wired
just sso-fix erpnext # re-apply from manifest
First-login auto-provisions the user. Map Authentik groups to Frappe Role Profiles for granular permissions:
# In your Authentik group config
# Add a property mapping that translates Authentik groups → Frappe roles
Frappe-side, this is configured in Frappe → Integrations → Social Login Key → Authentik.
First boot is slow. 10+ minutes. Use just erpnext-logs-init to watch. Don't restart in the middle — the configurator is idempotent but a half-finished setup needs the configurator to re-complete.
Multi-site capable. ERPNext supports multiple sites per install (site1.local, site2.local). PMA's manifest pins to one site (site_database: _1bd3e0294da19198). Adding more sites needs manifest changes.
Frappe migrate on every image upgrade. Major version bumps need bench migrate to run. ERPNext's startup script runs this automatically, but it can take 30+ minutes on a large dataset. Phase-2 force-recreate in release-run allows for this; phase-4 verify retries.
Background workers matter. The worker and scheduler containers do real work — invoice generation, email sending, document submission. If they're unhealthy, the web UI looks fine but nothing happens in the background. just status erpnext shows all containers.
Storage grows fast. With invoices, attachments, item images, the erpnext-sites volume grows. Plan for ~5-50 GB depending on usage. Off-host backups are non-negotiable.
Administrator vs System Manager. "Administrator" is the bootstrap superuser. "System Manager" is a high-privilege role you assign to humans. Don't use "Administrator" as a daily-driver account.
Common migration paths:
| From | Approach |
|---|---|
| SAP Business One | Export master data (customers, items, suppliers) as CSV → ERPNext bulk-import via Data Import Tool. Transactions are harder — usually start fresh in ERPNext + keep SAP read-only for historical lookups. |
| QuickBooks | Export Chart of Accounts + customers + items → import. ERPNext has a QuickBooks importer in the marketplace. |
| Odoo | More complex — Odoo and ERPNext have different conceptual models. Plan for 2-4 weeks of careful per-module migration with a consultant. |
See /pma/cookbook/migrate-from-cloud-saas for the general pattern.
/pma/reference/cli/users — user-management recipes./pma/cookbook/upgrade-a-service-safely — Frappe major-version upgrades.