Skip to Content

ERPNEXT Installation Using Docker in Ubuntu


STEP 1 :  Create a Directory

mkdir Erpnext_Docker

STEP  2 : Change the current directory

​cd Erpnext_Docker

STEP 3 : Create a docker-compose.yml file

​nano docker-compose.yml  

STEP 4 : Copy and paste the below content

version: "3"


services:

  backend:

    image: frappe/erpnext:v15.19.1

    deploy:

      restart_policy:

        condition: on-failure

    volumes:

      - sites:/home/frappe/frappe-bench/sites

      - logs:/home/frappe/frappe-bench/logs


  configurator:

    image: frappe/erpnext:v15.19.1

    deploy:

      restart_policy:

        condition: none

    entrypoint:

      - bash

      - -c

    # add redis_socketio for backward compatibility

    command:

      - >

        ls -1 apps > sites/apps.txt;

        bench set-config -g db_host $$DB_HOST;

        bench set-config -gp db_port $$DB_PORT;

        bench set-config -g redis_cache "redis://$$REDIS_CACHE";

        bench set-config -g redis_queue "redis://$$REDIS_QUEUE";

        bench set-config -g redis_socketio "redis://$$REDIS_QUEUE";

        bench set-config -gp socketio_port $$SOCKETIO_PORT;

    environment:

      DB_HOST: db

      DB_PORT: "3306"

      REDIS_CACHE: redis-cache:6379

      REDIS_QUEUE: redis-queue:6379

      SOCKETIO_PORT: "9000"

    volumes:

      - sites:/home/frappe/frappe-bench/sites

      - logs:/home/frappe/frappe-bench/logs


  create-site:

    image: frappe/erpnext:v15.19.1

    deploy:

      restart_policy:

        condition: none

    volumes:

      - sites:/home/frappe/frappe-bench/sites

      - logs:/home/frappe/frappe-bench/logs

    entrypoint:

      - bash

      - -c

    command:

      - >

        wait-for-it -t 120 db:3306;

        wait-for-it -t 120 redis-cache:6379;

        wait-for-it -t 120 redis-queue:6379;

        export start=`date +%s`;

        until [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && \

          [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_cache // empty"` ]] && \

          [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_queue // empty"` ]];

        do

          echo "Waiting for sites/common_site_config.json to be created";

          sleep 5;

          if (( `date +%s`-start > 120 )); then

            echo "could not find sites/common_site_config.json with required keys";

            exit 1

          fi

        done;

        echo "sites/common_site_config.json found";

        bench new-site --no-mariadb-socket --admin-password=admin --db-root-password=admin --install-app erpnext --set-default frontend;


  db:

    image: mariadb:10.6

    healthcheck:

      test: mysqladmin ping -h localhost --password=admin

      interval: 1s

      retries: 15

    deploy:

      restart_policy:

        condition: on-failure

    command:

      - --character-set-server=utf8mb4

      - --collation-server=utf8mb4_unicode_ci

      - --skip-character-set-client-handshake

      - --skip-innodb-read-only-compressed # Temporary fix for MariaDB 10.6

    environment:

      MYSQL_ROOT_PASSWORD: admin

    volumes:

      - db-data:/var/lib/mysql


  frontend:

    image: frappe/erpnext:v15.19.1

    depends_on:

      - websocket

    deploy:

      restart_policy:

        condition: on-failure

    command:

      - nginx-entrypoint.sh

    environment:

      BACKEND: backend:8000

      FRAPPE_SITE_NAME_HEADER: frontend

      SOCKETIO: websocket:9000

      UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1

      UPSTREAM_REAL_IP_HEADER: X-Forwarded-For

      UPSTREAM_REAL_IP_RECURSIVE: "off"

      PROXY_READ_TIMEOUT: 120

      CLIENT_MAX_BODY_SIZE: 50m

    volumes:

      - sites:/home/frappe/frappe-bench/sites

      - logs:/home/frappe/frappe-bench/logs

    ports:

      - "8080:8080"


  queue-long:

    image: frappe/erpnext:v15.19.1

    deploy:

      restart_policy:

        condition: on-failure

    command:

      - bench

      - worker

      - --queue

      - long,default,short

    volumes:

      - sites:/home/frappe/frappe-bench/sites

      - logs:/home/frappe/frappe-bench/logs


  queue-short:

    image: frappe/erpnext:v15.19.1

    deploy:

      restart_policy:

        condition: on-failure

    command:

      - bench

      - worker

      - --queue

      - short,default

    volumes:

      - sites:/home/frappe/frappe-bench/sites

      - logs:/home/frappe/frappe-bench/logs


  redis-queue:

    image: redis:6.2-alpine

    deploy:

      restart_policy:

        condition: on-failure

    volumes:

      - redis-queue-data:/data


  redis-cache:

    image: redis:6.2-alpine

    deploy:

      restart_policy:

        condition: on-failure

    volumes:

      - redis-cache-data:/data


  scheduler:

    image: frappe/erpnext:v15.19.1

    deploy:

      restart_policy:

        condition: on-failure

    command:

      - bench

      - schedule

    volumes:

      - sites:/home/frappe/frappe-bench/sites

      - logs:/home/frappe/frappe-bench/logs


  websocket:

    image: frappe/erpnext:v15.19.1

    deploy:

      restart_policy:

        condition: on-failure

    command:

      - node

      - /home/frappe/frappe-bench/apps/frappe/socketio.js

    volumes:

      - sites:/home/frappe/frappe-bench/sites

      - logs:/home/frappe/frappe-bench/logs


volumes:

  db-data:

  redis-queue-data:

  redis-cache-data:

  sites:

  logs:


STEP 5 : Start the ERPNext Container

docker compose -p veevee -f docker-compose.yml up     (or)

docker  compose -p veevee up

STEP 6 : Stop the container

docker compose -p veevee down

STEP 7 : Delete the container

docker compose -p veevee down -v