Sign inSign up

amirul123/allinone-erpnext

By amirul123

•Updated 2 days ago

ERP custom made with all official depedencies (such CMS,HRMS etc) and Malaysian Compliance(LHDN)

Image
Content management system
Databases & storage
0

5.4K

amirul123/allinone-erpnext repository overview

⁠ERPNext All-in-One

A single custom Docker image bundling ERPNext with a curated set of official Frappe apps and a Malaysia LHDN e-Invoicing integration - built straight from source via GitHub Actions, so nothing disappears when a container gets recreated.

Build and Push All-in-One ERPNext Image Docker Hub Docker Pulls Docker Image Size License GitHub release

⁠Why this exists

Frappe apps installed at runtime with bench get-app live only inside a container's writable layer - they vanish the moment that container is recreated (docker compose down && up, an image update, a host migration). This repo bakes every app directly into the image at build time, so the whole stack survives container recreation. Only the site's own data (in a separate volume) needs to persist, which you'd be doing anyway.

⁠Apps included

AppBranchPurpose
Frappe (core)version-16Base framework
ERPNextversion-16Accounting, inventory, sales, purchasing
HRMSversion-16Attendance, leave, payroll
TelephonydevelopRequired dependency of CRM & Helpdesk (call/SMS logging)
WhatsAppdevelopOfficial WhatsApp integration for messaging and notifications
CRMmainStandalone sales pipeline, modern UI
HelpdeskmainSupport ticketing
Insightsversion-3BI dashboards, cross-app reporting
BuilderdevelopNo-code website/portal builder
MyInvois (ERPGulf⁠)mainMalaysia LHDN e-Invoice compliance

Note on installing MyInvois: the repo is named myinvois, but the actual Frappe app/module inside it is myinvois_erpgulf. Use that name with bench install-app, not myinvois.

Note on Telephony: you won't need to pass --install-app telephony explicitly - Frappe auto-installs it as a required dependency the moment CRM or Helpdesk installs, as long as the code is present in the image (which it is here).

Base: Python 3.14, Node 24, built on frappe/frappe_docker's layered Containerfile.

⁠Branching & Tags

The workflow triggers on push to any branch and pushes the following image tags to Docker Hub:

  • <image>:<branch_name> — e.g. a push to 2.0 produces amirul123/allinone-erpnext:2.0
  • <image>:<sha> — exact commit SHA for immutable deployment pins

When pushing to main, the workflow additionally publishes:

  • <image>:v16 and <image>:latest — stable aliases
  • <image>:v16-YYYYMMDD — dated snapshot tag

⁠Repo structure

erpnext-allinone/
├── .github/
│   └── workflows/
│       └── build.yml
├── apps.json
├── compose.yaml
├── example.env
└── README.md

⁠One-time setup

  1. In this repo's Settings → Secrets and variables → Actions, add:
    • DOCKERHUB_USERNAME - your Docker Hub username
    • DOCKERHUB_TOKEN - a Docker Hub access token (Account Settings → Security → New Access Token - not your password)
  2. Push to any branch, or trigger manually from the Actions tab.

⁠Quick Start with Docker Compose

  1. Copy the sample environment file:
    cp example.env .env
    
  2. Edit .env to set your site name and database passwords.
  3. Start the containers:
    docker compose up -d
    
  4. Create your site and install all baked-in apps:
    docker compose exec backend bench new-site yoursite.local \
      --mariadb-root-password <password> \
      --admin-password <password> \
      --mariadb-user-host-login-scope=% \
      --install-app erpnext \
      --install-app hrms \
      --install-app crm \
      --install-app helpdesk \
      --install-app insights \
      --install-app builder \
      --install-app whatsapp \
      --install-app myinvois_erpgulf
    

--mariadb-user-host-login-scope=% avoids a subtle failure mode: without it, the database user is locked to the container's IP at creation time, and the first container restart (new IP) breaks every DB connection with Access denied.

5.(Optional) Install the required modules for your deployment only (if you already run install-app erpnext):

# HR & Payroll
docker compose exec backend bench --site ${SITE_NAME:-frontend} install-app hrms

# Sales CRM & Customer Service (telephony dependency is handled automatically)
docker compose exec backend bench --site ${SITE_NAME:-frontend} install-app crm
docker compose exec backend bench --site ${SITE_NAME:-frontend} install-app helpdesk

# Communications & Reporting
docker compose exec backend bench --site ${SITE_NAME:-frontend} install-app whatsapp
docker compose exec backend bench --site ${SITE_NAME:-frontend} install-app insights
docker compose exec backend bench --site ${SITE_NAME:-frontend} install-app builder

# Malaysia LHDN MyInvois Compliance
docker compose exec backend bench --site ${SITE_NAME:-frontend} install-app myinvois_erpgulf

⁠Environment Variables (.env)

Copy the template from example.env to .env before starting the Docker Compose cluster:

cp example.env .env
VariableExample ValueDescription
SITE_NAMEerp.yourdomain.com / frontendTarget Frappe site name
DB_PASSWORDdb_secret_passPassword for the MariaDB database user
DB_ROOT_PASSWORDmariadb_root_passMariaDB root administrative password
ADMIN_PASSWORDadmin_super_secretInitial password for the Frappe Administrator account
CONTAINER_PORT8080Host port mapped to the web server / reverse proxy
LETSENCRYPT_EMAIL[email protected]⁠Email for automated Let's Encrypt SSL certificates (if using Traefik)

⁠Operations & Maintenance

Database & File Backups Run backups manually or via cron. This exports the database dump and archives public/private uploaded files into sites/${SITE_NAME}/private/backups/:

docker compose exec backend bench --site ${SITE_NAME:-frontend} backup --with-files

Site Restoration To restore a site from an existing .sql.gz archive:

docker compose exec backend bench --site ${SITE_NAME:-frontend} restore \
  /path/to/backup.sql.gz \
  --mariadb-root-password ${DB_ROOT_PASSWORD}

Upgrade & Migration Workflow When updating to a newer image release, pull the image and apply migrations without data loss:

# 1. Pull latest images
docker compose pull

# 2. Recreate containers with new image
docker compose up -d

# 3. Apply database schema migrations
docker compose exec backend bench --site ${SITE_NAME:-frontend} migrate

# 4. Clear cache to reflect frontend asset updates
docker compose exec backend bench --site ${SITE_NAME:-frontend} clear-cache

⁠Useful Bench Commands

Access Frappe CLI utilities directly within the backend container:

Interactive Bench Shell:

docker compose exec backend bash

Frappe Python Console:

docker compose exec backend bench --site ${SITE_NAME:-frontend} console

List Installed Applications:

docker compose exec backend bench --site ${SITE_NAME:-frontend} list-apps

Restart Background Workers:

docker compose restart queue-short queue-long queue-default

⁠Local test build

git clone https://github.com/frappe/frappe_docker
cd frappe_docker
docker build \
  --build-arg=FRAPPE_PATH=https://github.com/frappe/frappe \
  --build-arg=FRAPPE_BRANCH=version-16 \
  --build-arg=PYTHON_VERSION=3.14.0 \
  --build-arg=NODE_VERSION=24.12.0 \
  --secret=id=apps_json,src=/path/to/apps.json \
  --tag=allinone-erpnext:test \
  --file=images/layered/Containerfile .

Requires Docker Engine v23.0+ (BuildKit default).

⁠License

Each bundled app retains its own upstream license (mostly MIT/GPL-3.0). This repo is just build tooling - see each app's own repository for licensing details. Not affiliated with or endorsed by Frappe Technologies Pvt. Ltd. or ERPGulf.

Tag summary

Content type

Image

Digest

sha256:cb3fe9c1c…

Size

1.6 GB

Last updated

2 days ago

docker pull amirul123/allinone-erpnext