Setting up Frappe with docker for production!

Published on April 30, 2026

Tutorial

We read the docs, bugtracker and hunted for the details so you don’t have to. This is how to set up Frappe with the

Before we dive in: What is Frappe?

Frappe is an Open Source project … The company behind it offers a hosted version. Maybe you should look into that.

Installation

Frappe is just the base framework. Individual docker images can be created to make applications available, a “site” created and the applications added to the site {.is-warning}

Podman-compose has issues, the dockerfiles and install scripts are community supported, devs have a history of breaking things, install paths and updates. Official documentation is often unclear, incomplete. {.is-danger}

Requirements

RAM up to ~10 concurrent users: 8 GB 10–50 concurrent users: 16 GB

Disk Space Minimally 30 GB free disk space

Get started with the Custom Image Creation

This guide is based on https://github.com/frappe/frappe_docker/blob/main/docs/02-setup/02-build-setup.md

and enhanced with currently undocumented information. Please compare the source above for changes not added to this guide.

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

https://github.com/frappe/telephony is a dependency of Helpdesk, without it Helpdesk will not install into the site. Check if the telephony branch to be used is still “develop” {.is-warning}

Create JSON with desired apps

While erpnext and hrms have the “version-xx” branches, helpdesk, telephony and crm have currently not {.is-info}

Example apps.json:

 {
   "url": "https://github.com/frappe/erpnext",
   "branch": "version-16"
 },
 {
   "url": "https://github.com/frappe/hrms",
   "branch": "version-16"
 },
 {
   "url": "https://github.com/frappe/telephony",
   "branch": "develop"
 },
 {
   "url": "https://github.com/frappe/helpdesk",
   "branch": "main"
 },
 {
   "url": "https://github.com/frappe/crm",
   "branch": "main"
 }
]

To add new applications, prune the current images and rebuild the images. Adding new applications to the apps.json and running the docker build command is not enough {.is-info}

Build the images

docker build \
 --build-arg=FRAPPE_PATH=https://github.com/frappe/frappe \
 --build-arg=FRAPPE_BRANCH=version-16 \
 --secret=id=apps_json,src=apps.json \
 --tag=custom:16 \
 --file=images/layered/Containerfile .

Create Compose File

Add and modify the env file

cp example.env custom.env

Then run

docker compose --env-file custom.env     -f compose.yaml     -f overrides/compose.mariadb.yaml     -f overrides/compose.redis.yaml     -f overrides/compose.noproxy.yaml     config > compose.custom.yaml

Run the environment docker compose -p frappe -f compose.custom.yaml up -d

Frappe

As designated user, download the git repository and follow: https://github.com/frappe/frappe_docker/blob/main/docs/02-setup/07-single-server-example.md

the basic auth for Traefik is user: admin, password: set in the env file

<sitename> needs to match the actual IP/HOST, that this app is running on. In my case I picked a generic name ABC_Items, which lead to 404 - Not Found and the reason I’m posting here… I changed the sitename to my actual IP 10.0.0.70 and was greeted withe the Web UI..

Commands

Create a new site docker compose -p frappe exec backend bench new-site erpnext-test.int.essyo.pl —mariadb-user-host-login-scope=‘172.%.%.%’

Add application to site docker compose -p frappe exec backend bench —site erpnext-test.int.essyo.pl install-app erpnext

Delete Site docker compose -p frappe exec backend bench drop-site dotosotest —no-backup

ISSUES

https://github.com/frappe/frappe_docker/issues/711#issuecomment-3646161854

A clear list of tools used (e.g., React, PostgreSQL, Docker, Terraform). This helps with SEO and shows your range.

Visuals: Screenshots of the UI, architecture diagrams, or “Before vs. After” performance graphs. Technical readers want to see the logic.

The “Why”: Never just say you used a tool; explain why that tool was the correct choice for that specific problem. This proves you are a consultant, not just a coder.

Lessons Learned (Optional but great): Briefly mentioning a hurdle you overcame shows maturity and honesty.

Client