Self-hosted service
frappe/bench avatar
frappe/bench

Bench is the deployment CLI around a Frappe site, and it is being rewritten

CLI to manage Multi-tenant deployments for Frappe apps

1,738 stars1,360 forksPythonGPL-3.0

At a glance

What is it?
A Python CLI that installs, updates and manages multiple Frappe sites on Unix-like systems, plus an easy-install script that goes through Docker. Its own README points at a new simplified bench that is under development, which is the main thing to weigh.
Who is it for?
Adopt bench if you run several Frappe sites on Unix-like hosts and want one tool for site creation, app installation and backups, since the multi-site management is the reason it exists. Do not start a new long-lived automation against it without checking the replacement, because the README announces a new simplified bench at frappe/bench-cli and this repository's default branch is develop.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 73 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The README tells you it is being replaced

The first thing above the fold is a note that the team is working on a new simplified bench, with a link to the frappe/bench-cli repository. The README describes it as an update rather than a replacement notice, and it is placed before the project description.

That single line changes how to evaluate everything else. Bench is not abandoned: the repository is not archived, the last push was on 2026-08-11, and releases went out as v5.31.0 on 2026-06-16 and v5.30.0 on 2026-06-12. But it is in the part of its life where the maintainers are working on a successor.

The default branch is develop rather than main, which in this ecosystem means the stable line lives on a branch or a tag and the development branch carries unreleased work. Plan your pin accordingly.

What follows here describes what bench does today, because that is what you would be adopting.

Multi-site management is the actual job

Bench is a command-line utility for installing, updating and managing multiple sites for Frappe applications on Unix-like systems, for both development and production. The package description is blunter about it: a CLI to manage multi-tenant deployments for Frappe apps.

The five features the README lists are the whole scope. Initializing a new bench to work on sites and apps. Creating a new Frappe site. Creating and installing apps usable on those sites. Managing sites. Managing site backups.

That last item is worth noting because it is where multi-tenancy bites. Bench manages multiple sites and site backups. If you have ten customer sites, you have ten backup schedules to think about, which is why the easy-install script exposes a backup schedule directly.

It is classified in pyproject.toml as a build tool with an Installation and Setup system topic and a Production/Stable development status, so the packaging metadata treats it as production tooling rather than a developer convenience.

The dependencies explain what the tool actually does

pyproject.toml lists Click, GitPython, honcho, Jinja2, python-crontab, requests, semantic-version, setuptools, tomli on Python below 3.11, and uv.

Each one is informative. The project script maps bench to bench.cli:cli.

The build backend is hatchling with the version read from bench/__init__.py, and both the sdist and wheel targets include the bench package.

easy-install.py gets you a running instance and two files you must not lose

The easy-install script is the fastest path to something running. It uses Docker with the Frappe Docker repository and works for both development and production setups. Download and run it.

sh
wget https://raw.githubusercontent.com/frappe/bench/develop/easy-install.py
python3 easy-install.py deploy [email protected] --sitename=subdomain.domain.tld --app=erpnext

The script installs Docker, fetches the required containers, sets up bench and a default ERPNext instance. When it finishes you reach the system at http://<your-server-ip> and log in with the Administrator password.

Two side effects are stated plainly and deserve attention. It generates the MySQL root password and an Administrator password and saves them to $HOME/passwords.txt for the user who ran it. It also generates a compose file at $HOME/<project-name>-compose.yml.

So after a successful run there are two files in the home directory, one containing credentials in plaintext and one containing the deployment definition. Neither is mentioned as being cleaned up, and the password file is not a file you want to leave in a home directory that gets backed up to a shared location.

Note also that the wget URL points at the develop branch rather than a tag, so the script you run is whatever is on that branch right now.

The build subcommand exposes the version matrix

Beyond deploy, the script has a build subcommand, and its options describe the defaults bench assumes. Python version defaults to 3.11.6 and NodeJS version to 18.18.2, both overridable with -y and -d. The Frappe branch defaults to version-15 and the Frappe repository to https://github.com/frappe/frappe.

The ERPNext version defaults to the latest stable, and apps are listed with -a. A path to an apps JSON defaults to frappe_docker/development/apps-example.json, so the app list is data rather than a hardcoded list.

Networking options are where production decisions appear: -q means no https and -m sets the HTTP port in that case, while -e supplies the email used for the SSL certificate. -p pushes the built image to a registry. -x deploys after building and -u upgrades after building, so build and the follow-up action are one invocation.

Two flags exist purely to protect you from a mistake: --confirm-site-mismatch, which allows overwriting existing .env sites when --sitename differs from the sites configured inside the .env, and -g for the backup schedule, a cron string defaulting to @every 6h.

Two supported paths, one recommendation

The README sets out that a bench setup provides two kinds of environment, development and production, and that each can be created in multiple ways: a containerized installation or a manual one.

The manual path is documented off-repository, in the Frappe install-and-setup tutorial. The containerised path is the frappe_docker repository, cloned directly.

sh
git clone https://github.com/frappe/frappe_docker.git

The recommendation is asymmetric and worth reading precisely: Docker is recommended for a production environment, while for development either method is acceptable. That is not a claim that manual install is deprecated; it is a statement about where the operational risk sits.

The officially supported Docker installation is described as usable for both development and production, which is why the easy-install script routes both cases through the same repository.

The third option mentioned is Frappe Cloud, offered for evaluating Frappe apps without managing hosting yourself. That is a hosted service rather than something in this repository, and it is positioned as an alternative to running bench at all.

Licence, packaging and who maintains it

The licence is GPL-3.0-only, stated both in the README badge and in pyproject.toml. GPL-3.0-only is a copyleft licence.

For most teams this is a non-issue, because bench is a command-line tool you install rather than a library you link.

The package is published on PyPI as frappe-bench, requires Python 3.10 or newer, and carries classifiers for a console environment, MacOS and OS Independent platforms. The listed author is Frappe Technologies Pvt Ltd, and the homepage in the project URLs points at frappe.io/bench while the documentation link goes to the framework docs.

The repository is small and tidy: a bench/ package directory, docs/, resources/, easy-install.py, pyproject.toml, a.flake8 config, a pre-commit config and a.releaserc for automated releases.

Editorial conclusion

Adopt bench if you run several Frappe sites on Unix-like hosts and want one tool for site creation, app installation and backups, since the multi-site management is the reason it exists. Do not start a new long-lived automation against it without checking the replacement, because the README announces a new simplified bench at frappe/bench-cli and this repository's default branch is develop. Verify first the Python floor, which is 3.10 or newer, and that you understand where the easy-install script writes credentials, since it saves the MySQL root and Administrator passwords to $HOME/passwords.txt and generates a compose file under $HOME.

Frequently asked questions

Is bench being replaced by a new tool?

The README carries a note that the team is working on a new simplified bench, linked at the frappe/bench-cli repository. This repository is not archived and its last push was on 2026-08-11, so check the successor before committing to long-lived automation.

Where does the easy-install script save the generated passwords?

It generates a MySQL root password and an Administrator password and saves them to $HOME/passwords.txt for the user who ran the setup. It also writes a compose file to $HOME/<project-name>-compose.yml.

What Python version does frappe-bench need?

Python 3.10 or newer, per the requires-python field in pyproject.toml. The easy-install script separately defaults the Python version inside the container to 3.11.6 and NodeJS to 18.18.2, both overridable with -y and -d.

Should I use Docker or a manual install for a Frappe bench?

The README recommends Docker installation for a production environment and says either the containerised or the manual method is fine for development. The officially supported Docker setup can be used for both development and production.

Official sources

  1. frappe/bench on GitHub
  2. License: GPL-3.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/frappe-bench.svg)](https://hysenlabs.com/projects/frappe-bench)