<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.comfac.net/index.php?action=history&amp;feed=atom&amp;title=ERPNext_v15_Docker_Setup_Guide</id>
	<title>ERPNext v15 Docker Setup Guide - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.comfac.net/index.php?action=history&amp;feed=atom&amp;title=ERPNext_v15_Docker_Setup_Guide"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=ERPNext_v15_Docker_Setup_Guide&amp;action=history"/>
	<updated>2026-06-05T09:46:59Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://mediawiki.comfac.net/index.php?title=ERPNext_v15_Docker_Setup_Guide&amp;diff=208&amp;oldid=prev</id>
		<title>Justinaquino: &quot;Add ERPNext v15 Docker Setup Guide; index in Main Page&quot;</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=ERPNext_v15_Docker_Setup_Guide&amp;diff=208&amp;oldid=prev"/>
		<updated>2026-03-31T08:50:51Z</updated>

		<summary type="html">&lt;p&gt;&amp;quot;Add ERPNext v15 Docker Setup Guide; index in Main Page&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;FORCETOC&lt;br /&gt;
= ERPNext v15 — Docker Setup Guide =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Based on the original tutorial by Rein Simacon. Updated 2025 | ERPNext v15.31.3 | Docker Compose v2&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
This guide walks you through running ERPNext v15 on your local machine using Docker. A Docker-based setup starts faster and uses fewer resources than a virtual machine — making it ideal for:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Students&amp;#039;&amp;#039;&amp;#039; exploring ERPNext, database design, REST APIs, and webhooks in a live environment&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;IT staff and evaluators&amp;#039;&amp;#039;&amp;#039; testing ERPNext before committing to a full deployment&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Thin-client demos&amp;#039;&amp;#039;&amp;#039; — ERPNext v15 can comfortably serve companies under 50 users on modest hardware&lt;br /&gt;
&lt;br /&gt;
If you break something, you can tear it all down and start fresh in minutes.&lt;br /&gt;
&lt;br /&gt;
== Default Credentials ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Value&lt;br /&gt;
|-&lt;br /&gt;
| URL || &amp;lt;code&amp;gt;http://localhost:8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Username || &amp;lt;code&amp;gt;Administrator&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Password || &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;⚠ These are for local testing only. Never expose this setup to the internet without changing passwords and adding HTTPS.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Minimum Hardware Requirements ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Resource !! Minimum !! Recommended&lt;br /&gt;
|-&lt;br /&gt;
| RAM || 4 GB || 8 GB&lt;br /&gt;
|-&lt;br /&gt;
| CPU || 2 cores || 4 cores&lt;br /&gt;
|-&lt;br /&gt;
| Disk || 10 GB free || 20 GB free&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
RAM is the critical constraint. ERPNext runs multiple services simultaneously (MariaDB, Redis ×2, backend workers, scheduler, websocket, nginx). Less than 4 GB will cause containers to crash-loop.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview ==&lt;br /&gt;
&lt;br /&gt;
ERPNext in Docker is composed of several services that work together:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Service !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;frontend&amp;lt;/code&amp;gt; || Nginx reverse proxy — serves the web UI on port 8080&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt; || Frappe/ERPNext Python application server&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;websocket&amp;lt;/code&amp;gt; || Node.js Socket.IO server for real-time updates&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;queue-long&amp;lt;/code&amp;gt; || Background worker for long-running jobs (imports, reports)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;queue-short&amp;lt;/code&amp;gt; || Background worker for short jobs (emails, notifications)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;scheduler&amp;lt;/code&amp;gt; || Cron-like service for scheduled tasks&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; || MariaDB 10.6 database&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;redis-cache&amp;lt;/code&amp;gt; || In-memory cache for session and page data&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;redis-queue&amp;lt;/code&amp;gt; || Message broker for the job queues&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;configurator&amp;lt;/code&amp;gt; || One-time setup container (runs once, then exits)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;create-site&amp;lt;/code&amp;gt; || One-time site creation container (runs once, then exits)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Step 1 — Install Docker ==&lt;br /&gt;
&lt;br /&gt;
Install &amp;#039;&amp;#039;&amp;#039;Docker Engine&amp;#039;&amp;#039;&amp;#039; and the &amp;#039;&amp;#039;&amp;#039;Docker Compose plugin&amp;#039;&amp;#039;&amp;#039; (v2).&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Download and install &amp;#039;&amp;#039;&amp;#039;Docker Desktop&amp;#039;&amp;#039;&amp;#039;: [https://www.docker.com/products/docker-desktop/ docker.com/products/docker-desktop]&lt;br /&gt;
&lt;br /&gt;
Docker Desktop bundles both Docker Engine and the Compose plugin.&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu / Debian Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install Docker Engine&lt;br /&gt;
curl -fsSL https://get.docker.com | sh&lt;br /&gt;
&lt;br /&gt;
# Add your user to the docker group (so you don&amp;#039;t need sudo every time)&lt;br /&gt;
sudo usermod -aG docker $USER&lt;br /&gt;
&lt;br /&gt;
# Log out and back in, then verify&lt;br /&gt;
docker --version&lt;br /&gt;
docker compose version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; This guide uses &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt; (v2, no hyphen). The older &amp;lt;code&amp;gt;docker-compose&amp;lt;/code&amp;gt; (v1) is deprecated. If your system only has v1, replace &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;docker-compose&amp;lt;/code&amp;gt; in all commands below.&lt;br /&gt;
&lt;br /&gt;
=== Useful References ===&lt;br /&gt;
* [https://christitus.com/docker-guide/ Chris Titus Docker Guide]&lt;br /&gt;
* [https://flathub.org/apps/com.github.sdv43.whaler Optional GUI for Linux (Flatpak — Whaler)]&lt;br /&gt;
&lt;br /&gt;
== Step 2 — Create a Working Directory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p ~/docker/erpnext&lt;br /&gt;
cd ~/docker/erpnext&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 3 — Create the Docker Compose File ==&lt;br /&gt;
&lt;br /&gt;
Create a file named &amp;lt;code&amp;gt;pwd.yml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nano pwd.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paste the following content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
  backend:&lt;br /&gt;
    image: frappe/erpnext:v15.31.3&lt;br /&gt;
    deploy:&lt;br /&gt;
      restart_policy:&lt;br /&gt;
        condition: on-failure&lt;br /&gt;
    volumes:&lt;br /&gt;
      - sites:/home/frappe/frappe-bench/sites&lt;br /&gt;
      - logs:/home/frappe/frappe-bench/logs&lt;br /&gt;
&lt;br /&gt;
  configurator:&lt;br /&gt;
    image: frappe/erpnext:v15.31.3&lt;br /&gt;
    deploy:&lt;br /&gt;
      restart_policy:&lt;br /&gt;
        condition: none&lt;br /&gt;
    entrypoint:&lt;br /&gt;
      - bash&lt;br /&gt;
      - -c&lt;br /&gt;
    command:&lt;br /&gt;
      - &amp;gt;&lt;br /&gt;
        ls -1 apps &amp;gt; sites/apps.txt;&lt;br /&gt;
        bench set-config -g db_host $$DB_HOST;&lt;br /&gt;
        bench set-config -gp db_port $$DB_PORT;&lt;br /&gt;
        bench set-config -g redis_cache &amp;quot;redis://$$REDIS_CACHE&amp;quot;;&lt;br /&gt;
        bench set-config -g redis_queue &amp;quot;redis://$$REDIS_QUEUE&amp;quot;;&lt;br /&gt;
        bench set-config -g redis_socketio &amp;quot;redis://$$REDIS_QUEUE&amp;quot;;&lt;br /&gt;
        bench set-config -gp socketio_port $$SOCKETIO_PORT;&lt;br /&gt;
    environment:&lt;br /&gt;
      DB_HOST: db&lt;br /&gt;
      DB_PORT: &amp;quot;3306&amp;quot;&lt;br /&gt;
      REDIS_CACHE: redis-cache:6379&lt;br /&gt;
      REDIS_QUEUE: redis-queue:6379&lt;br /&gt;
      SOCKETIO_PORT: &amp;quot;9000&amp;quot;&lt;br /&gt;
    volumes:&lt;br /&gt;
      - sites:/home/frappe/frappe-bench/sites&lt;br /&gt;
      - logs:/home/frappe/frappe-bench/logs&lt;br /&gt;
&lt;br /&gt;
  create-site:&lt;br /&gt;
    image: frappe/erpnext:v15.31.3&lt;br /&gt;
    deploy:&lt;br /&gt;
      restart_policy:&lt;br /&gt;
        condition: none&lt;br /&gt;
    volumes:&lt;br /&gt;
      - sites:/home/frappe/frappe-bench/sites&lt;br /&gt;
      - logs:/home/frappe/frappe-bench/logs&lt;br /&gt;
    entrypoint:&lt;br /&gt;
      - bash&lt;br /&gt;
      - -c&lt;br /&gt;
    command:&lt;br /&gt;
      - &amp;gt;&lt;br /&gt;
        wait-for-it -t 120 db:3306;&lt;br /&gt;
        wait-for-it -t 120 redis-cache:6379;&lt;br /&gt;
        wait-for-it -t 120 redis-queue:6379;&lt;br /&gt;
        export start=`date +%s`;&lt;br /&gt;
        until [[ -n `grep -hs ^ sites/common_site_config.json | jq -r &amp;quot;.db_host // empty&amp;quot;` ]] &amp;amp;&amp;amp; \&lt;br /&gt;
          [[ -n `grep -hs ^ sites/common_site_config.json | jq -r &amp;quot;.redis_cache // empty&amp;quot;` ]] &amp;amp;&amp;amp; \&lt;br /&gt;
          [[ -n `grep -hs ^ sites/common_site_config.json | jq -r &amp;quot;.redis_queue // empty&amp;quot;` ]];&lt;br /&gt;
        do&lt;br /&gt;
          echo &amp;quot;Waiting for sites/common_site_config.json to be created&amp;quot;;&lt;br /&gt;
          sleep 5;&lt;br /&gt;
          if (( `date +%s`-start &amp;gt; 120 )); then&lt;br /&gt;
            echo &amp;quot;could not find sites/common_site_config.json with required keys&amp;quot;;&lt;br /&gt;
            exit 1&lt;br /&gt;
          fi&lt;br /&gt;
        done;&lt;br /&gt;
        echo &amp;quot;sites/common_site_config.json found&amp;quot;;&lt;br /&gt;
        bench new-site --no-mariadb-socket --admin-password=admin --db-root-password=admin --install-app erpnext --set-default frontend;&lt;br /&gt;
&lt;br /&gt;
  db:&lt;br /&gt;
    image: mariadb:10.6&lt;br /&gt;
    healthcheck:&lt;br /&gt;
      test: mysqladmin ping -h localhost --password=admin&lt;br /&gt;
      interval: 1s&lt;br /&gt;
      retries: 15&lt;br /&gt;
    deploy:&lt;br /&gt;
      restart_policy:&lt;br /&gt;
        condition: on-failure&lt;br /&gt;
    command:&lt;br /&gt;
      - --character-set-server=utf8mb4&lt;br /&gt;
      - --collation-server=utf8mb4_unicode_ci&lt;br /&gt;
      - --skip-character-set-client-handshake&lt;br /&gt;
      - --skip-innodb-read-only-compressed&lt;br /&gt;
    environment:&lt;br /&gt;
      MYSQL_ROOT_PASSWORD: admin&lt;br /&gt;
    volumes:&lt;br /&gt;
      - db-data:/var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
  frontend:&lt;br /&gt;
    image: frappe/erpnext:v15.31.3&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - websocket&lt;br /&gt;
    deploy:&lt;br /&gt;
      restart_policy:&lt;br /&gt;
        condition: on-failure&lt;br /&gt;
    command:&lt;br /&gt;
      - nginx-entrypoint.sh&lt;br /&gt;
    environment:&lt;br /&gt;
      BACKEND: backend:8000&lt;br /&gt;
      FRAPPE_SITE_NAME_HEADER: frontend&lt;br /&gt;
      SOCKETIO: websocket:9000&lt;br /&gt;
      UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1&lt;br /&gt;
      UPSTREAM_REAL_IP_HEADER: X-Forwarded-For&lt;br /&gt;
      UPSTREAM_REAL_IP_RECURSIVE: &amp;quot;off&amp;quot;&lt;br /&gt;
      PROXY_READ_TIMEOUT: 120&lt;br /&gt;
      CLIENT_MAX_BODY_SIZE: 50m&lt;br /&gt;
    volumes:&lt;br /&gt;
      - sites:/home/frappe/frappe-bench/sites&lt;br /&gt;
      - logs:/home/frappe/frappe-bench/logs&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;8080:8080&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  queue-long:&lt;br /&gt;
    image: frappe/erpnext:v15.31.3&lt;br /&gt;
    deploy:&lt;br /&gt;
      restart_policy:&lt;br /&gt;
        condition: on-failure&lt;br /&gt;
    command:&lt;br /&gt;
      - bench&lt;br /&gt;
      - worker&lt;br /&gt;
      - --queue&lt;br /&gt;
      - long,default,short&lt;br /&gt;
    volumes:&lt;br /&gt;
      - sites:/home/frappe/frappe-bench/sites&lt;br /&gt;
      - logs:/home/frappe/frappe-bench/logs&lt;br /&gt;
&lt;br /&gt;
  queue-short:&lt;br /&gt;
    image: frappe/erpnext:v15.31.3&lt;br /&gt;
    deploy:&lt;br /&gt;
      restart_policy:&lt;br /&gt;
        condition: on-failure&lt;br /&gt;
    command:&lt;br /&gt;
      - bench&lt;br /&gt;
      - worker&lt;br /&gt;
      - --queue&lt;br /&gt;
      - short,default&lt;br /&gt;
    volumes:&lt;br /&gt;
      - sites:/home/frappe/frappe-bench/sites&lt;br /&gt;
      - logs:/home/frappe/frappe-bench/logs&lt;br /&gt;
&lt;br /&gt;
  redis-queue:&lt;br /&gt;
    image: redis:6.2-alpine&lt;br /&gt;
    deploy:&lt;br /&gt;
      restart_policy:&lt;br /&gt;
        condition: on-failure&lt;br /&gt;
    volumes:&lt;br /&gt;
      - redis-queue-data:/data&lt;br /&gt;
&lt;br /&gt;
  redis-cache:&lt;br /&gt;
    image: redis:6.2-alpine&lt;br /&gt;
    deploy:&lt;br /&gt;
      restart_policy:&lt;br /&gt;
        condition: on-failure&lt;br /&gt;
    volumes:&lt;br /&gt;
      - redis-cache-data:/data&lt;br /&gt;
&lt;br /&gt;
  scheduler:&lt;br /&gt;
    image: frappe/erpnext:v15.31.3&lt;br /&gt;
    deploy:&lt;br /&gt;
      restart_policy:&lt;br /&gt;
        condition: on-failure&lt;br /&gt;
    command:&lt;br /&gt;
      - bench&lt;br /&gt;
      - schedule&lt;br /&gt;
    volumes:&lt;br /&gt;
      - sites:/home/frappe/frappe-bench/sites&lt;br /&gt;
      - logs:/home/frappe/frappe-bench/logs&lt;br /&gt;
&lt;br /&gt;
  websocket:&lt;br /&gt;
    image: frappe/erpnext:v15.31.3&lt;br /&gt;
    deploy:&lt;br /&gt;
      restart_policy:&lt;br /&gt;
        condition: on-failure&lt;br /&gt;
    command:&lt;br /&gt;
      - node&lt;br /&gt;
      - /home/frappe/frappe-bench/apps/frappe/socketio.js&lt;br /&gt;
    volumes:&lt;br /&gt;
      - sites:/home/frappe/frappe-bench/sites&lt;br /&gt;
      - logs:/home/frappe/frappe-bench/logs&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  db-data:&lt;br /&gt;
  redis-queue-data:&lt;br /&gt;
  redis-cache-data:&lt;br /&gt;
  sites:&lt;br /&gt;
  logs:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save and exit: &amp;lt;code&amp;gt;Ctrl+O&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Enter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Ctrl+X&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tip:&amp;#039;&amp;#039;&amp;#039; You can always get the latest version of this file from the official Frappe Docker repository: [https://github.com/frappe/frappe_docker/blob/main/pwd.yml frappe/frappe_docker — pwd.yml]&lt;br /&gt;
&lt;br /&gt;
== Step 4 — Start ERPNext ==&lt;br /&gt;
&lt;br /&gt;
From inside your working directory (&amp;lt;code&amp;gt;~/docker/erpnext&amp;lt;/code&amp;gt;), run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker compose -p pwd -f pwd.yml up -d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will:&lt;br /&gt;
# Pull all required images from Docker Hub (~1–2 GB total on first run)&lt;br /&gt;
# Create the named volumes for data persistence&lt;br /&gt;
# Start all services in the background&lt;br /&gt;
# Run &amp;lt;code&amp;gt;configurator&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;create-site&amp;lt;/code&amp;gt; once to initialize the database and site&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;First startup takes 3–10 minutes&amp;#039;&amp;#039;&amp;#039; depending on your internet speed and hardware. The &amp;lt;code&amp;gt;create-site&amp;lt;/code&amp;gt; container must complete before the UI becomes available.&lt;br /&gt;
&lt;br /&gt;
== Step 5 — Verify the Containers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker ps -a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expected output — you should see containers for &amp;lt;code&amp;gt;frontend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;websocket&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;queue-long&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;queue-short&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;scheduler&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;redis-cache&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;redis-queue&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;configurator&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;create-site&amp;lt;/code&amp;gt; containers will show &amp;lt;code&amp;gt;Exited (0)&amp;lt;/code&amp;gt; — this is &amp;#039;&amp;#039;&amp;#039;normal and expected&amp;#039;&amp;#039;&amp;#039;. They are one-time setup containers.&lt;br /&gt;
&lt;br /&gt;
If any persistent service shows &amp;lt;code&amp;gt;Restarting&amp;lt;/code&amp;gt;, check its logs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker logs &amp;lt;container_name&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 6 — Allow Port 8080 (Linux Firewall) ==&lt;br /&gt;
&lt;br /&gt;
If you are running on a Linux server with &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; enabled:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ufw allow 8080/tcp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are running on a cloud VM (GCP, AWS, Azure), also open port 8080 in your cloud firewall/security group settings.&lt;br /&gt;
&lt;br /&gt;
== Step 7 — Access ERPNext in Your Browser ==&lt;br /&gt;
&lt;br /&gt;
Open your browser and go to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://localhost:8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If accessing from another machine on the same network, replace &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; with the host machine&amp;#039;s IP address:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://192.168.x.x:8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 8 — Log In ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Value&lt;br /&gt;
|-&lt;br /&gt;
| Username || &amp;lt;code&amp;gt;Administrator&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Password || &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After logging in, you will be prompted to complete initial setup (site name, language, timezone, etc.).&lt;br /&gt;
&lt;br /&gt;
To verify the installed version: click &amp;#039;&amp;#039;&amp;#039;Help&amp;#039;&amp;#039;&amp;#039; (top-right) → &amp;#039;&amp;#039;&amp;#039;About&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Day-to-Day Operations ==&lt;br /&gt;
&lt;br /&gt;
=== Stop ERPNext ===&lt;br /&gt;
&lt;br /&gt;
Always stop containers cleanly before shutting down your machine or taking a backup:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker compose -p pwd -f pwd.yml stop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To stop all running containers system-wide (use with caution):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker stop $(docker ps -q)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Start ERPNext Again ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker compose -p pwd -f pwd.yml up -d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;up -d&amp;lt;/code&amp;gt; to restart, not &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. The &amp;lt;code&amp;gt;up&amp;lt;/code&amp;gt; command ensures all dependencies and network links are re-established correctly.&lt;br /&gt;
&lt;br /&gt;
=== View Live Logs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker compose -p pwd -f pwd.yml logs -f&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To follow logs for a specific service only (e.g., the backend):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker compose -p pwd -f pwd.yml logs -f backend&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Data Persistence ==&lt;br /&gt;
&lt;br /&gt;
All your ERPNext data (database records, uploaded files, site configuration) is stored in &amp;#039;&amp;#039;&amp;#039;Docker named volumes&amp;#039;&amp;#039;&amp;#039;, not inside the containers. This means:&lt;br /&gt;
&lt;br /&gt;
* Stopping or restarting containers &amp;#039;&amp;#039;&amp;#039;does not delete your data&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Deleting containers with &amp;lt;code&amp;gt;docker rm&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;does not delete your data&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Only explicitly removing volumes will delete data&lt;br /&gt;
&lt;br /&gt;
To list volumes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker volume ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To back up the database volume:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec pwd-db-1 mysqldump -u root -padmin --all-databases &amp;gt; erpnext_backup_$(date +%Y%m%d).sql&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nuclear Reset (Start Fresh) ==&lt;br /&gt;
&lt;br /&gt;
If your setup is broken and you want to wipe everything and start over:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Stop and remove all containers&lt;br /&gt;
docker compose -p pwd -f pwd.yml down&lt;br /&gt;
&lt;br /&gt;
# Remove all containers, volumes, and images (DESTROYS ALL DATA)&lt;br /&gt;
docker compose -p pwd -f pwd.yml down -v --rmi all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or to remove &amp;#039;&amp;#039;&amp;#039;all&amp;#039;&amp;#039;&amp;#039; Docker containers on the system (use with caution):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker rm -v -f $(docker ps -qa)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After a full reset, rerun Step 4 to start fresh.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Symptom !! Likely Cause !! Fix&lt;br /&gt;
|-&lt;br /&gt;
| Browser shows &amp;quot;connection refused&amp;quot; || Containers still starting up || Wait 3–5 more minutes, recheck &amp;lt;code&amp;gt;docker ps&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;frontend&amp;lt;/code&amp;gt; container keeps restarting || Not enough RAM || Free up memory or add swap&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;create-site&amp;lt;/code&amp;gt; exited with error || DB not ready in time || Run &amp;lt;code&amp;gt;docker compose -p pwd -f pwd.yml down -v&amp;lt;/code&amp;gt; then &amp;lt;code&amp;gt;up -d&amp;lt;/code&amp;gt; again&lt;br /&gt;
|-&lt;br /&gt;
| Login works but page is blank || Browser cache issue || Hard refresh (&amp;lt;code&amp;gt;Ctrl+Shift+R&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| Changes not saving || Disk full || Check with &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Next Steps for Students ==&lt;br /&gt;
&lt;br /&gt;
Once your ERPNext instance is running, here are good things to explore:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;REST API&amp;#039;&amp;#039;&amp;#039; — ERPNext has a built-in REST API. Try: &amp;lt;code&amp;gt;http://localhost:8080/api/resource/DocType&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Webhooks&amp;#039;&amp;#039;&amp;#039; — Configure under Settings → Webhooks to push data on document events&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Custom DocTypes&amp;#039;&amp;#039;&amp;#039; — Build your own data models without writing Python&lt;br /&gt;
* [https://frappeframework.com/docs Frappe Framework Docs]&lt;br /&gt;
* [https://docs.erpnext.com ERPNext Docs]&lt;br /&gt;
* [https://github.com/frappe/frappe_docker Frappe Docker repo]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;#039;&amp;#039;Original tutorial by Rein Simacon. Updated and expanded 2025.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Open Source]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:ERPNext]]&lt;br /&gt;
[[Category:Docker]]&lt;/div&gt;</summary>
		<author><name>Justinaquino</name></author>
	</entry>
</feed>