ERPNext security hardening

A self-hosted ERPNext is only as secure as its permissions, login policy, network edge, API surface and update routine. This page sets out the decisions, build order, checks and handover for each.

On this page

ERPNext security hardening starts with who can reach the desk

Hardening a self-hosted ERPNext means deciding who can sign in, what each signed-in user can see and change, which custom code and API routes are exposed, how traffic is encrypted at the Nginx edge, how backups are kept and restored, and how security updates reach the system in time. Of these, access is where most of the risk sits. An ERPNext instance usually holds accounting ledgers, stock valuations, supplier bank details and salary-related records, and it is often reachable from the office network and sometimes from the internet. The first question is not which firewall rule to add. It is who can reach the desk at all, and what that person can do once they arrive.

The difficulty is that a default installation works well enough to hide its exposure. Users log in, documents save, and reports run, so nothing appears broken. Over time, permissions accumulate. A role added for a one-off audit is never removed, a user permission restricting a sales rep to one territory is skipped for a new hire, and a shared accounts login survives a staff change. Each change looks harmless on its own. Custom fields, client scripts, integrations and the Server Scripts feature widen the attack surface in the same way, because each one can expose data or actions that the standard role matrix was not designed to govern.

Start with a written access review before changing any setting. List every active user, every role they hold, and every user permission that limits their records by company, warehouse or cost center. Compare that list with current staff and with the people who need access to payroll-adjacent or banking data. Confirm which accounts are system users and which are website or portal users, since they are governed differently. Check that the Administrator account is not used day to day and that its password and any recovery arrangement are held by named people. Decide, for each sensitive role, who approves additions and how often access is recertified.

Next, decide how users authenticate. ERPNext supports two-factor authentication for desk users, and LDAP login against Active Directory or OpenLDAP with group-to-role mapping at each login. Single sign-on through Social Login Keys is a separate design decision and is covered on the SSO and identity integration page. For this section, the requirement is simpler: every account that can reach the desk should have an enforced second factor or come through a directory that your team already controls. Confirm with your own environment whether the chosen two-factor method and LDAP settings meet your internal policy before relying on them.

Finally, check the surfaces that bypass the standard role matrix. Confirm that Server Scripts are disabled unless a documented need exists, since from version 15 they must be enabled explicitly through the server_script_enabled setting. Review which whitelisted methods and API endpoints are reachable by which roles, and confirm that API keys belong to dedicated service users rather than personal accounts. Record every custom script and integration in an inventory so that a permission review can include them. The API design itself belongs to the REST API integration page, but its exposure belongs in this review.

Which ERPNext settings and components carry the security boundary

A self-hosted ERPNext is protected by a small set of settings and services that sit between users and company data. Each card names one component, its role at the boundary, and what to confirm during hardening.

Login and two-factor settings

Login is the first gate to every ERPNext record. Review whether two-factor authentication is enforced for all users or only for administrators, and confirm which accounts can still sign in with a local password. If you connect LDAP or a Social Login Key provider, check that disabling a user in the directory also blocks access in ERPNext, and that local administrator accounts are kept for recovery and tested.

Role Permission Manager and User Permissions

Role Permission Manager sets which roles can read, write, create, submit or export each DocType, while User Permissions restrict a user to specific records such as one company or warehouse. Together they decide what a signed-in user sees. Export the permission matrix for review, and test each role with a non-administrator account against sensitive DocTypes such as salary and bank data.

Server Scripts and server_script_enabled

Server Scripts run Python on document events or as API endpoints, so they execute with server privileges. From version 15 they are disabled by default and must be enabled with the server_script_enabled setting. Keep it off unless there is a documented need, list every enabled script, and move approved logic into a version-controlled custom app. Frappe Cloud public shared benches do not allow Server Scripts.

Nginx reverse proxy and TLS

Nginx is the public entry point that terminates TLS and forwards requests to the ERPNext web processes and the Socket.io service. Check that plain HTTP redirects to HTTPS, that only the required paths are exposed, that certificates renew automatically, and that internal application ports cannot be reached from outside the network. Confirm header and cipher settings with your security team.

Socket.io and Redis services

Socket.io delivers real-time updates to the browser, and Redis supports caching, job queues and the background workers. Neither should be exposed to the internet. Confirm that both listen only on internal interfaces, that access requires authentication where your deployment supports it, and that they are monitored and restarted with the rest of the stack. Verify the ports in your bench or frappe_docker service layout.

MariaDB and bench backups

MariaDB holds every ERPNext record, so database access should be limited to the application and administrators, with no public listener. Bench backup tooling produces database and file backups that must be copied offsite and restored in test exercises. Ask your team to confirm backup encryption, retention periods and who can read backup files, and schedule restore tests on a fixed cadence.

Which hardening choices fit your risk and team

This table compares the main hardening choices for a self-hosted ERPNext site: Server Scripts, network exposure, login method, patching responsibility and hosting model. Read each row to match an option to your risk appetite and team capacity. Every choice trades operational load against control, so decide them together, since loosening one control often adds work to another.

DecisionWhen it fitsOperational cost
Server ScriptsKeep disabled for most sites. Enable only for a named automation that the business owns and that has been reviewed.Enabling adds a recurring review of each script and a check after every upgrade. Keeping them disabled moves new logic into reviewed custom apps.
Internet exposureFits a public portal or customer-facing workflow that cannot sit behind a client, with TLS terminated at Nginx and an access log review process.Highest ongoing load: continuous log review, rate limiting, prompt patching and a tested incident response path.
VPN or ZTNA access onlyFits staff-only use from known locations or managed devices, such as finance and warehouse teams.Recurring cost for the access layer and device management. Partner and contractor accounts must be issued and removed on that layer too.
Local ERPNext accountsFits small teams with few users, a handful of named administrators and no central directory.Admins create, change and remove each user and reset passwords in ERPNext. Leavers must be removed by hand and checked regularly.
Directory-backed login (LDAP or social login)Fits organizations already running Active Directory, OpenLDAP or a central identity provider with a formal leaver process.Initial setup and testing of LDAP Settings or OAuth endpoints. Group-to-role mappings need review whenever directory groups change.
Self-managed patchingFits teams with an internal platform group that can test each minor release on staging and run bench updates on a schedule.Recurring internal staff time for each release, staging upkeep and rollback drills. Confirm your team has that capacity before choosing this option.
Frappe support planFits regulated sites that need a vendor warranty path, since Frappe ties warranty coverage to a listed version and a matching plan.Recurring subscription fee for the plan. Ask which versions, response terms and security notices the plan covers before signing.
Frappe Cloud hostingFits teams that want Frappe to run hosting, backups and patching, provided the data location and configuration limits are acceptable.Recurring hosting fees by plan tier. Confirm which settings you can change, since public shared benches do not allow Server Scripts.
Self-hosted serversFits organizations with data residency rules, air-gapped networks or infrastructure teams that need full control of settings.You carry server, database, backup and patch operations. Costs recur as staff time and infrastructure, and are largely fixed per environment.

ERPNext security hardening in a set order

This sequence hardens a self-hosted ERPNext site in an order where each control can be tested before the next one depends on it. It starts with a supported version, then closes the network path, sets identity and permissions, and finishes with backups and a recorded baseline. Each step ends with a check you can repeat after upgrades and configuration changes.

  1. Confirm a supported version and patch level

    Check that the site runs a version still listed as supported on Frappe's supported versions page. According to that page, version 14 reached end of life on January 31, 2026, version 15 is planned to be supported until the end of 2027, and version 16 until the end of 2029. Apply the latest minor release for your major version, since both supported lines receive frequent minor releases. Check: the Frappe and ERPNext app versions match a listed release, and the site loads with no pending migration errors. Ask your internal owner or partner to confirm this in writing before any other step begins.

  2. Restrict the network path and enforce TLS

    Expose only the Nginx front end to users, and keep MariaDB, Redis, the Socket.io service and background workers off public interfaces. Terminate TLS at Nginx with a certificate from your own trust chain, turn off plain HTTP for the site, and compare headers and cipher settings with your organization's baseline. If you run frappe_docker, read the published ports in the Compose file and do not assume the defaults are safe. Check: a scan from outside the allowed network finds only the intended HTTPS port, and the certificate chain validates in a standard client.

  3. Set the login policy and two-factor authentication

    Define password rules, session timeouts and two-factor authentication, starting with administrators and then extending to every role that can reach business data. Confirm the exact setting names in your ERPNext version, since the controls sit in system settings and user records and can change between releases. If you plan to use LDAP or a Social Login Key, decide that now so local accounts are limited to a documented break-glass administrator. Check: a test user without a second factor is blocked from the desk, and the break-glass account is recorded and tested.

  4. Build the role matrix and user permissions

    Map each job function to the DocTypes it needs, with read, write, create, submit, cancel and export rights set per role. Add user permissions where the business needs record-level limits, such as restricting users to one company, warehouse or cost center. Review the matrix with finance, stock and sales owners, and remove the System Manager role from anyone who does not administer the site. Check: sign in as a non-admin user for each role and try to open, export and change records outside its scope. Every attempt should fail.

  5. Keep Server Scripts disabled unless reviewed

    Leave the server script setting off by default. According to the Frappe documentation, Server Scripts run Python on document events or as API endpoints, and from version 15 they are disabled by default until the server_script_enabled setting is turned on. Enable them only for a documented requirement with a named owner, a code review and a test on staging. Frappe Cloud public shared benches do not allow them, so confirm your hosting model first. Check: the setting is off in production, and each enabled script has a review record and a permission test run from a non-admin account.

  6. Restrict API access and token scope

    Inventory every API key and token, the user each one acts as, and the methods and DocTypes it can reach. Issue tokens to dedicated integration users that hold only the permissions the integration needs, and revoke any tied to a former employee or a retired test system. Allow external callers only to whitelisted methods, and keep administrator credentials out of middleware. Confirm how your version handles whitelisted methods before relying on them. Check: a call with a token outside its scope returns an authorization error, and a revoked token fails on its next request.

  7. Configure and test backups and restores

    Schedule database and file backups using the bench backup tooling or your container equivalent, and store copies outside the application host. Set retention and encryption to match the classification of your financial and personal data, and document who can read backup storage. Restore a backup into an isolated environment, then compare record counts, a sample of submitted invoices and the user list with production. Check: the restore completes in the separate environment and the spot checks match. A backup that has never been restored is not yet proven.

  8. Record the hardened baseline

    Write down the version and patch level, network exposure, TLS configuration, login policy, role matrix, Server Script status, API token inventory and latest backup restore result. Store the record under change control with the date and the name of the approver. Repeat the permission and restore checks after each minor release and each configuration change, and compare the results with the baseline. Check: an independent reviewer can reproduce each recorded setting from the baseline document without asking the implementer.

Role and user permissions: where access actually gets decided

Role permissions decide what a role can do on each DocType. In ERPNext, the Role Permission Manager and the permission rules on each DocType control read, write, create, submit, cancel, delete, export, print and report access for that role. The same role can hold broad rights on Sales Invoice and none on Stock Entry, so a role name alone tells you little. User permissions sit on top of these rules. They limit which linked values a user can see, such as a company, cost center or warehouse. A user with create rights on Sales Invoice who has a user permission for one company will only see and work with that company's records. Hardening starts by checking both layers separately, because a correct role can be silently widened or narrowed by the user permissions attached to the account.

Permissions drift over time. People move from sales to finance, from finance to stock, or take on cover for a colleague on leave. An administrator adds a role to unblock a task, and the change is rarely reversed when the task is finished. Each addition looks small, but a user can end up holding rights from several roles plus user permissions created for a previous job. Removing a role does not automatically remove the user permissions set up alongside it, so the review must cover both. Schedule a recurring access review, tie role changes to a request that names the business owner, and record who approved each change so drift is visible before an auditor or incident finds it.

The System Manager role should be rare. It gives broad administrative power across the desk, including configuration changes that affect every user, and it is designed for system administration rather than daily accounting or stock work. Ask for a list of every account that holds it and confirm that each holder needs it for administration, not convenience. Keep a small number of named administrators, give them separate accounts for everyday work, and make sure business users receive narrower roles that match their tasks. The Administrator account should be protected under its own controls and used only for break-glass situations. Treat any new grant of System Manager as a decision that needs a documented reason.

Review the role matrix with the business owners who will live with the outcome. Build a matrix with users or roles in rows, DocTypes and actions in columns, and user permission scopes noted for each. Ask the accounting owner who may post journal entries, change accounts, or close a period. Ask the stock owner who may create stock entries, adjust valuation, or work across which warehouses. Ask the production owner who may release work orders and issue materials. Look for segregation of duties problems, such as one person who can both create a supplier and approve its payment. Owners should sign off their own area, and sensitive rights such as access to scripts and bulk data import should be listed and approved separately.

Verify the matrix with test accounts rather than assuming it from role names. Create test users that carry each role and each user permission combination, then attempt the actual tasks on a test site that mirrors production configuration. Try to open, edit, submit, cancel, export and print records outside the permitted scope, and check list views, report results, link field search results and API responses, since these can expose data differently from the form view. Record each result with the user, the action and the outcome. Repeat the tests after every role change, every upgrade and every custom app or script deployment. Ask any implementation partner to include this testing in the written scope and to hand over the test accounts and results.

How hardening differs for bench, Docker and Frappe Cloud deployments

A single bench on your own server places every hardening control with your team. The Frappe application, MariaDB, Redis and Nginx share one host, so the host firewall, the web server configuration and the file layout decide most of your exposure. Work from the outside in and confirm each layer before users arrive.

  • Host firewall: Allow inbound traffic only on the ports the web server needs. Keep MariaDB and Redis bound to local interfaces so no other host can reach them.
  • Nginx and TLS: Terminate TLS in Nginx with a current certificate, redirect plain HTTP to HTTPS, and add security headers your application team has tested. Check protocol versions and ciphers against your security policy.
  • File permissions: Run the bench under a dedicated system user. Restrict the site configuration file, which holds database and encryption credentials, to that user and to the web server group that needs read access.
  • Server Scripts: Leave server_script_enabled off unless a documented business need exists, because Server Scripts run Python on the server.

Before go-live, test each layer from outside the network and confirm that database and cache ports do not respond from another host.

Hardening controls to set, record and recheck

Each card names one control area in a self-hosted ERPNext deployment, the setting or decision behind it, and the evidence to keep. Record the value you set, the date you set it, and the person who approved it, then recheck the same items after every upgrade, configuration change or new integration.

Two-factor and session policy

Require two-factor authentication for privileged roles first, then for every user who can sign in. Set session timeouts and failed-login handling in the System Settings, and keep the chosen values in your change record. Evidence to keep: a list of accounts with two-factor enabled, a screenshot or export of the active session settings, and a dated approval for any exception. Recheck after each new user batch or identity provider change.

TLS certificates and redirects at Nginx

Terminate HTTPS at Nginx with a certificate your team can renew, and redirect all plain HTTP requests to HTTPS. Confirm that the site URL in ERPNext uses the https scheme so generated links and emails do not point to insecure addresses. Evidence to keep: the Nginx configuration under version control, certificate expiry dates with the renewal owner, and a test result showing that HTTP requests redirect correctly. Recheck when certificates renew or the proxy configuration changes.

Server Scripts disabled by default

Server Scripts run Python on document events or as API endpoints, so they carry code execution risk. From version 15, Frappe disables them by default, and they must be enabled with the server_script_enabled setting. Keep them off unless a reviewed change requires them, and record who approved each script. Evidence to keep: the current value of the setting, the change ticket for any enablement, and a list of existing scripts with owners. Recheck after every upgrade and after any user with System Manager rights is added.

Scoped API keys and tokens

Issue API keys to a dedicated integration user with only the DocTypes and permissions that the integration needs, not a general administrator account. Review which whitelisted methods each integration can call, and rotate or revoke keys when an integration is retired or its owner leaves. Evidence to keep: a register of keys with the owning user, purpose, scope and last review date. Ask your integration partner or internal team to confirm which permissions each integration uses before you grant them.

Separate admin and daily accounts

Give each administrator a separate account for system work, such as bench commands, configuration and user management, and a standard account for daily accounting, stock or sales work. Keep the administrator account out of routine documents and reports, and use the role permission and user permission settings to limit what each daily user can see. Evidence to keep: the list of administrator accounts, the roles assigned to each, and a periodic review record. Recheck when staff change roles.

Backing services, secrets and backups

Keep MariaDB and Redis reachable only from the application hosts, never from the public network, and confirm the firewall rules after every infrastructure change. Store database passwords, API secrets and mail credentials in environment files with restricted file permissions, outside the web root and out of version control. Encrypt offsite backups and test a restore. Evidence to keep: firewall rule exports, file permission checks, encryption settings for backup storage, and a dated restore test record.

How to test that ERPNext security hardening holds and fails safely

Each hardening control needs a test that tries to break it, written before go-live and repeated after every bench update, app change or role edit. Treat the control list as a set of claims and write one pass or fail check for each. Record the test account, the ERPNext and Frappe versions, the date and the expected result so a second engineer can rerun the same check. A single successful test proves little if the next update quietly reopens a gap.

Start with permissions. Create a non-admin test user with the role it would normally hold, limited to one company or customer through user permissions. Attempt to open, list, search, report on and export records outside that scope. Repeat the same attempts through the REST API, because list views and API calls can follow different code paths. Then confirm that Server Scripts stay unavailable. With server_script_enabled not set, a user should not be able to create or run a Server Script, and a call to a script endpoint should fail. Run this on your own environment, since Frappe Cloud public shared benches do not allow Server Scripts at all.

Next, test the access paths. Issue an API token with the narrowest scope you intend to allow, then call a DocType or method outside that scope and confirm the request is refused. Log in with a fresh browser session as a user whose role requires two-factor authentication and confirm the prompt appears. Remove a test account in LDAP or the identity provider and confirm ERPNext access ends. For transport, request the site over plain HTTP and confirm a redirect to HTTPS. From a machine outside your network, inspect the certificate chain, hostname match and expiry date with a tool your team already trusts.

Failure behavior matters as much as success. Enter wrong passwords repeatedly and confirm the lockout threshold and lock duration in your version's settings, then check that API calls cannot bypass the lock. Trigger errors with malformed requests and missing records, and confirm the error page shows a generic message without stack traces, file paths, database errors or framework version details. Then confirm denied actions reach your logs. Check the application logs, the reverse proxy access log and any audit trail, and verify each entry includes the user, timestamp and action. Confirm that retention is long enough for your incident process and that logs leave the host.

Finally, restore the latest backup onto a separate host running the same versions and apps. Log in, compare record counts and sample transactions against the source, and confirm the scheduler and background workers start. A restore that succeeds only on the original server does not prove recovery. An independent penetration test of the deployed environment is a separate engagement. Scope it in writing with the tester, agree on rules of engagement and test windows, and ask for findings that map to the controls above. Internal checks confirm the controls work as designed. An outside tester checks whether they can be bypassed.

What drives the effort and cost of ERPNext hardening

This table lists the factors that change how much work ERPNext hardening takes and what it costs to keep secure. Read each row as a question to answer before requesting a quote, then use the last column to see which choices reduce the scope. The main takeaway is that custom code, integrations and internet exposure usually add more review and testing than the number of users alone.

DriverWhy it changes effort or costHow to keep it down
Users and rolesEach custom role needs a permission matrix designed, tested and reviewed per DocType.Reuse standard roles where they fit, and limit custom roles to documented job functions.
Companies and cost centersEach company, cost center or warehouse restriction needs user permission rules and test cases.Model only the companies that need legal or data separation, and group users by function.
Custom apps and Server ScriptsEvery custom app and enabled Server Script needs code review, security testing and upgrade testing.Remove unused code, keep Server Scripts disabled unless needed, and package approved changes in a reviewed app.
Integrations calling the APIEach integration needs its own API credentials, scoped permissions, whitelisted methods and error handling review.Use one dedicated integration user per system with the minimum roles, and expose only required methods.
Internet exposurePublic access adds TLS configuration behind Nginx, login protection, two-factor authentication and endpoint review.Place internal access behind a VPN or private network, and publish only the endpoints that customers or partners need.
Identity integrationLDAP login and Social Login Keys each need configuration, group to role mapping and testing of sign-in paths.Choose one primary identity source and document the group mapping and the local administrator accounts.
Compliance and audit evidenceAccess reviews, change records, backup restore tests and configuration proof must be collected and kept.Agree the evidence list with your auditor first, then keep it in version control or a ticketing system as work happens.
Number of environmentsDevelopment, staging and production each need the same hardening, and drift between them creates extra checks.Keep staging close to production, define settings in code, and promote changes through the same process each time.
Deployment modelFrappe Cloud, Docker or a bench install on your own servers leave different parts of the stack under your control.Match the model to your team's skills, and confirm in writing which layers the hosting provider manages.

What to monitor, back up, patch and document after go-live

Hardening an ERPNext instance is not finished at go-live. The controls you set on day one drift over time as people change roles, credentials age, certificates approach expiry and new minor releases ship. Assign a named owner for each recurring task below, and agree in writing which of them your internal team runs and which, if any, a partner covers under a retainer.

Start with access. Review users, roles and user permissions on a fixed schedule, and treat every role change as a security event. Leavers and movers are the most common source of excess rights in an ERP, because accounting and stock permissions often accumulate silently. Check the list of users with System Manager or other administrative roles separately, and confirm that Server Scripts remain disabled unless a documented need exists. Rotate API keys and secrets used by integrations on a schedule, and retire keys belonging to systems that no longer exist. For monitoring, watch failed logins and permission denials in your logs and your reverse proxy. Repeated failures from one account or address, or a sudden burst of denials on sensitive DocTypes such as Journal Entry or Payment Entry, should trigger investigation.

Patching needs its own routine. Frappe and ERPNext publish frequent minor releases for each supported major version, and the GitHub releases page shows this pattern. Track the releases for the version you run, then apply each one through bench update and bench migrate on a staging copy of production first, with your custom apps tested against it. Do not apply minor releases directly to production. The version support windows and the planning for major moves are covered in the upgrades section of this page series, so this section only concerns the routine of applying updates safely.

Backups count only when they restore. Schedule a restore test at a defined interval: restore the most recent backup to a separate environment, confirm that the site loads, that files are present and that a sample of transactions reconciles. Record the result, the time taken and any gaps. Also confirm that backups are stored outside the primary server and that the encryption keys needed to read them are held separately from the backup set. Renewing TLS certificates belongs on the same calendar. Check expiry dates for the Nginx certificate and any internal certificate authority, and test renewal on staging so that an expiring certificate does not become an outage.

Documentation is what allows someone other than the original builder to keep the system secure. Maintain five artifacts and keep them under version control: the permission matrix showing each role, its DocTypes and its user permission restrictions; the Server Scripts register listing each script, its owner, its purpose and the business reason it is enabled; the network and TLS configuration, including firewall rules, Nginx settings and certificate locations; the backup and restore runbook with the steps, owners and last successful test date; and a change log recording every permission change, script change, configuration change and applied update. An auditor or new administrator should be able to reconstruct the security state of the system from these records alone.

How long and how much does ERPNext security hardening cost?

What drives the cost of ERPNext security hardening?

Scope drives most of the cost: how many sites and benches you run, how many roles and users need review, which custom apps and Server Scripts are in use, whether single sign-on is connected, and how many environments must be hardened and tested. The hardening fee covers planning, configuration, testing, documentation and handover, and it is largely one-time. Hosting is a separate, recurring cost. According to the ERPNext pricing page, self-hosting ERPNext is free under GPL-3.0, Frappe Cloud shared site hosting starts at 5 US dollars per month, Frappe Cloud servers start at 20 US dollars per month for shared instances, and dedicated servers start at 125 US dollars per month. Those figures are platform hosting prices, not hardening fees. Ask for a quote that separates the one-time engagement from any recurring hosting or retainer cost.

How long does an ERPNext hardening project usually take?

Duration depends on the written scope, so no general timeline applies to every ERPNext environment. The main factors are the number of roles and user permissions to review, whether business owners are available for sign-off, how many custom apps and integrations need checks, whether a staging host already mirrors production, and how much TLS, backup and API work is needed. A single bench with a standard role set is usually simpler than a multi-company deployment with custom apps and identity integrations. Ask for the timeline, the milestones and the dependencies on your side to be written into the scope before work starts, and confirm how changes to scope affect dates.

Can our internal team harden ERPNext without outside help?

Yes, an experienced internal team can harden ERPNext, provided it has Frappe administration skills and a staging environment for testing. The core checklist covers role permissions and user permissions, keeping Server Scripts disabled unless a documented need exists (they are disabled by default from version 15), two-factor authentication, TLS termination behind Nginx, restricting API access, tested backups, and timely security updates. The harder part is independent review: someone other than the builder must test access paths and confirm that the controls work as documented. Outside help is most useful for that review, for an accelerated first pass, or for documentation that auditors and internal reviewers will read.

What do we need to provide for an ERPNext hardening engagement?

Most of the effort on the client side is access and decisions. You will need a role matrix that lists each role, the DocTypes it can touch, and who approves changes to it. You will need admin access to a staging host that mirrors production as closely as possible, and a named technical contact who can grant access to servers, databases and the Nginx configuration. Business owners must be available to review permission rules for finance, stock, sales and production, because they know which users should see which records. You will also need current backup records, a list of custom apps and integrations, and a change window for any work that touches production.

How is a fixed-scope quote built for ERPNext hardening?

A fixed-scope quote follows from a written scope agreed before work starts. The scope lists the systems and environments in scope, the controls to be configured or verified, the deliverables such as configuration records, test results and runbooks, the responsibilities of each party, the assumptions made, and what is excluded. DeployOpen does not publish a price list, so the quote is derived from that document. To compare quotes, ask each provider for the same scope, an itemized list of deliverables, the assumptions behind the estimate, the process for handling change requests, and what happens if the client cannot supply a role matrix or staging access on time.

When does an ERPNext hardening retainer make sense?

A retainer makes sense when the environment will keep changing after the first hardening project and someone must keep controls working. DeployOpen offers ongoing support, upgrades and continuous testing as retainers. ERPNext releases are frequent: the frappe/erpnext releases page lists minor releases for both version 15 and version 16 within a single month. According to Frappe's supported versions page, version 15 is planned for support until the end of 2027 and version 16 until the end of 2029, so an upgrade plan is needed on that timeline. A retainer also suits organizations that need recurring access reviews, patch testing on staging and regular restore tests. Ask what the retainer covers, how emergency work is handled, and how it is priced against the written scope.

Does the hosting choice change the ERPNext hardening work?

Yes, the hosting model changes which controls you can apply and who is responsible for them. Frappe Cloud public shared benches do not allow Server Scripts, so the script review step does not apply there, and the platform handles parts of the network, TLS and backup layers. On a self-hosted deployment, whether bench-based or in containers from frappe_docker, your team controls the Nginx configuration, the firewall, the database, Redis and backup jobs, so the hardening scope is larger. Confirm which layers the provider manages, which ones you manage, and how the responsibility split appears in the written scope and the runbook.

How DeployOpen scopes, hardens and hands over ERPNext security work

DeployOpen plans, implements, hardens, documents and supports self-hosted open-source platforms inside your own infrastructure, and ERPNext security hardening follows the same arc. Engagements are fixed-scope, with the scope, deliverables and timeline agreed in writing before work starts.

How we scope

  • Inventory the ERPNext version, deployment method (bench, Docker Compose or Frappe Cloud) and hosting location before agreeing any changes.
  • Map roles, user permissions and any Server Scripts or custom apps that touch sensitive DocTypes such as accounting and payroll.
  • Agree in writing which controls are in scope, including two-factor authentication, TLS termination, API restrictions and backup verification.

How we build

  • Review role and user permission rules, then tighten them on a staging copy of your site before anything reaches production.
  • Keep Server Scripts disabled unless a documented need exists, and confirm the server_script_enabled setting matches that decision.
  • Configure TLS behind Nginx, restrict REST API access and test each control with negative tests that confirm unauthorized requests fail.

How we hand over

  • Deliver a configuration record listing each hardening setting, its value, its owner and the test that verifies it.
  • Provide a runbook for applying ERPNext security updates, including staging validation of bench update and migrate steps.
  • Document backup schedules, restore test steps and the evidence your team needs to keep for internal or external assessments.

How we support

  • Ongoing support, upgrades and continuous security testing are available as retainers once the initial handover is complete.
  • Retainers can cover periodic review of ERPNext release notes so security patches on supported versions are scheduled promptly.
  • Ask your DeployOpen contact to confirm retainer scope, response expectations and which environments are covered before signing.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.