Actually, I should clarify—I have a love-hate relationship with ERP systems. They save businesses, sure, but setting them up usually involves sacrificing a weekend and maybe a small part of your sanity. ERPNext is one of the good ones—open source, Python-based, and actually usable—but the installation process? It can be a beast if you don’t know exactly where the landmines are.
Well, that’s not entirely accurate. I spent last Tuesday setting up a fresh instance for a client on Ubuntu 24.04 (Noble Numbat). “Hey, it’s 2026, surely the scripts are foolproof by now,” I thought. Spoiler: they aren’t. They’re better, but you can still trip over Python versions and permission errors if you aren’t paying attention.
And rather than giving you a sanitized list of commands that works in a perfect vacuum, here is the messy, real-world log of how I got ERPNext running on Ubuntu 24.04 without throwing my laptop out the window.
The Pre-Flight Check (Don’t Skip This)
First off, hardware. Do not—I repeat, do not—try to run this on a 1GB RAM instance. You might get it to boot, but the moment you run a build or a heavy report, MariaDB will crash, and you’ll be sad. I used a 4GB RAM VPS for this setup. If you’re cheaping out with 2GB, you absolutely need to add swap space immediately.
I ran this on a fresh install of Ubuntu 24.04.2 LTS. If you’re on an older version, upgrade. If you’re on a newer non-LTS, you’re brave, but I wouldn’t recommend it for an ERP.
Start by updating the packages. I know, standard advice, but I skipped this once in 2024 and spent four hours debugging a dependency conflict.
sudo apt update && sudo apt upgrade -y
sudo apt install git curl python3-dev python3-setuptools python3-pip python3-venv software-properties-common libmysqlclient-dev mariadb-server redis-server -y
The Database Situation
MariaDB configuration is where 90% of installations fail silently. ERPNext requires a specific character set and file format. If you don’t set this now, the installation script will yell at you later—or worse, it won’t, and you’ll get weird encoding errors three months from now.
Open up the config file. On Ubuntu 24.04, it’s usually tucked away in /etc/mysql/mariadb.conf.d/50-server.cnf.
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
You need to add this block under [mysqld]. I keep this snippet in my notes app because I can never remember the exact variable names:
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[mysql]
default-character-set = utf8mb4
Restart the service. If it fails to restart, you probably made a typo. Check journalctl -xe. I once spent 20 minutes staring at a config file only to realize I missed a bracket.
sudo systemctl restart mariadb
sudo mysql_secure_installation
During the secure installation, set a root password you’ll remember. You’ll need it in about five minutes.
The “Frappe” User
You shouldn’t run ERPNext as root. Bad practice. Create a dedicated user. I stick with frappe because it’s the default in all the docs and fighting defaults is a losing battle here.
sudo useradd -m -s /bin/bash frappe
sudo usermod -aG sudo frappe
sudo passwd frappe
Switch to this user for everything that follows. Seriously, log out of root. su - frappe.
Node.js: The Moving Target
This is where things get opinionated. Ubuntu 24.04 ships with a decent version of Node, but ERPNext (specifically the Frappe framework) is picky. As of early 2026, Node 20 is the sweet spot (LTS). Don’t try to use Node 22 or 23 just to be on the “bleeding edge”—you’ll break the asset build process.
I use NVM (Node Version Manager) because I don’t trust system package managers with Node versions.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 20
nvm use 20
npm install -g yarn
I verified this setup with Node v20.11.0 and npm 10.2.4. If you see version numbers wildly different from that, double-check what NVM is doing.
Installing Bench (The CLI Tool)
Bench is the command-line tool that manages everything. It’s actually pretty slick once it’s running. Install it via pip. Note the --break-system-packages flag—on Ubuntu 24.04, Python environments are managed more strictly (PEP 668), so you either use a venv (recommended) or force it (lazy, but works for the CLI tool).
I prefer creating a directory for the bench first, then installing the tool inside a virtual environment to keep things clean.
pip3 install frappe-bench --break-system-packages
Wait, scratch that. I actually prefer installing it globally so I can run it anywhere, but Ubuntu 24.04 hates that. The cleanest way I found this week was just adding ~/.local/bin to my PATH and installing it locally as the user.
pip3 install frappe-bench
export PATH=$PATH:/home/frappe/.local/bin
Initializing the Framework
Here is the moment of truth. We initialize the bench. This downloads the Frappe framework (the backbone of ERPNext) and sets up the Python virtual environment.
bench init --frappe-branch version-15 frappe-bench
I’m sticking with version-15 here. I know v16 is making waves in the dev channels, but for a production ERP? I want boring. I want stable. I want to sleep at night.
The OOM Killer “Gotcha”
While bench init was running, I watched htop. On my 4GB instance, memory usage spiked to 3.1GB during the yarn install phase. If I had been on a 2GB box, the OOM (Out of Memory) killer would have sniped the process right there. I’ve seen it happen a dozen times. If your installation fails with “Command failed: yarn install”, check your RAM.
Installing ERPNext
Once the bench is initialized, move into the directory:
cd frappe-bench
Now, create a new site. This creates a database in MariaDB for you. It will ask for that root password you set earlier.
bench new-site erp.example.com
Finally, get the ERPNext app itself. It’s separate from the framework.
bench get-app --branch version-15 erpnext
bench --site erp.example.com install-app erpnext
Production Setup (Nginx & Supervisor)
Right now, you can start it with bench start, but that’s for developers. It runs on port 8000 and dies if you close your terminal. For production, you need Nginx and Supervisor to manage the processes.
This part usually scares people, but Bench automates it nicely:
sudo bench setup production frappe
Answer “Yes” to allowing it to overwrite config files. It will configure Nginx to proxy requests and Supervisor to keep the Python workers alive.
One weird thing I noticed on Ubuntu 24.04 specifically: sometimes Nginx doesn’t reload automatically after this step because of a syntax ambiguity in the generated config. I had to manually run:
sudo nginx -t
sudo systemctl reload nginx
If nginx -t fails, check the /etc/nginx/conf.d/frappe-bench.conf file. Sometimes it doubles up on the




