บทความนี้จะแนะนำวิธี ติดตั้ง ERPNext 16 ซึ่งเป็นเวอร์ชั่นล่าสุด โดยจะติดตั้ง บน Ubuntu 24.04 ด้วยคลาวด์ของ AWS EC2 หรือ Hetzner Cloud

ถ้าคุณกำลังมองหาโปรแกรม ERP มาใช้งานในองค์กร แบบฟรีๆ ผมขอแนะนำโปรแกรม ERPNext ซึ่งเป็น Open Source เราสามารถนำมาใช้ได้ฟรี เพียงแต่อาจมีค่าใช้จ่ายด้าน Server นิดหน่อย ซึ่งขอแนะนำให้ ติดตั้ง บน Ubuntu 24.04 โดยบทความนี้จะแนะนำวิธี ติดตั้ง ERPNext 16 ซึ่งเป็นเวอร์ชั่นล่าสุด โดยจะติดตั้ง บน Ubuntu 24.04 ด้วยคลาวด์ของ AWS EC2 หรือ Hetzner Cloud
เมื่อเริ่มใช้งาน Ubuntu ใหม่ๆ ต้องเริ่มด้วยการ Update packages ก่อนครับ
sudo apt-get update && sudo apt-get upgrade -yเปลี่ยน TimeZone ให้เปิดดู TimeZone ด้วยคำสั่ง
dateถ้า TimeZone ไม่ตรงกับที่เราต้องการ ให้เปลี่ยนได้เลยครับ เช่น
timedatectl set-timezone "Asia/Bangkok"อาจพิจารณาเปิดพอร์ตเหล่านี้ครับ
sudo ufw allow 22,25,143,80,443,3306,3022,8000/tcp
sudo ufw enableในกรณีที่เราต้องการใช้งาน Multi-Bench เราจะรันคำสั่ง bench init หลายครั้ง ซึ่งแต่ละครั้ง frappe bench จะสร้างโฟลเดอร์แยกออกไป แต่ละโฟลเดอร์จะไม่เกี่ยวกัน จะมี Environment เป็นของตัวเอง เช่น
bench init frappe-bench-1
bench init frappe-bench-2ในกรณีนี้ frappe bench จะสร้างพอร์ตใหม่ให้เราอัตโนมัติ เช่น
frappe-bench-1 ได้พอร์ต 8000, 9000, 13000, 12000, 11000
frappe-bench-2 ได้พอร์ต 8001, 9001, 13001, 12001, 11001
เราอาจพิจารณาใส่พอร์ตเหล่านี้ เพิ่มเติมเข้าไปใน UFW
เมื่ออัพเดท Ubuntu เสร็จแล้ว สร้างบัญชีผู้ใช้ใหม่
sudo adduser frappe
sudo usermod -aG sudo frappe
su frappe
cd /home/frappeเมื่อมีบัญชีผู้ใช้ใหม่แล้ว ให้ติดตั้ง Python ครับ Ubuntu 24.04 มาพร้อมกับ Python 3.12 เราสามารถใช้งานได้เลย
sudo apt-get install python3-dev python3-setuptools python3-pip python3-distutils python3-venvติดตั้ง pip
sudo apt install python3-pip
python3 -m pip install --upgrade pipcurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bashในกรณีใช้ Zsh
source ~/.zshrc
nvm install 20
sudo apt-get install npmหรือถ้าใช้ Bash
source ~/.bashrc
nvm install 20
sudo apt-get install npmติดตั้ง Redis Server เพื่อจัดการ Cache
sudo apt-get install redis-serverMariaDB ที่ใช้สำหรับ ERPNext เวอร์ชั่น 16 ทาง Frappe แนะนำว่าต้องใช้ MariaDB เวอร์ชั่น 10.11.x ขึ้นไป
sudo apt-get install software-properties-commonsudo apt install mariadb-server mariadb-clientโปรแกรมจิปาถะต่างๆ
sudo mysql_secure_installationต้องมี sudo ด้วยครับ
หลังใช้คำสั่งนี้ จะมีคำถามเด้งขึ้นมาให้ตอบตามนี้ครับ
Enter current password for root: กดปุ่ม Enter ผ่านได้เลยครับเพราะเรายังไม่มีพาสเวิร์ด
Switch to unix_socket authentication [Y/n]: Y
Change the root password? [Y/n]: Y It will ask you to set new MySQL root password at this step. This can be different from the SSH root user password.
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] N (ตอบ N เพราะในอนาคตเราจะใช้โปรแกรมวิเคราะห์ข้อมูล Metabase เชื่อมต่อดาต้าเบสแบบ remotely)
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
sudo nano /etc/mysql/mariadb.conf.d/erpnext.cnfให้คัดลอกโค้ดนี้ใส่เข้าไปในไฟล์
[mysqld]
innodb-file-format=barracuda
innodb-file-per-table=1
innodb-large-prefix=1
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[mysql]
default-character-set = utf8mb4และ Enable Remote Access โดยเข้าไปที่ไฟล์ 50-server.cnf
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnfให้แก้ bind-address = 127.0.0.1 เป็น bind-address = 0.0.0.0
แล้วล็อกอินไปที่ MariaDB
mysql -u root -pใส่รหัสผ่าน
เสร็จแล้วจะเข้ามาที่หน้าจอ MariaDB Command Line
ให้รันคำสั่ง ตามโค้ดด้านล่างนี้
เสร็จแล้วให้รีสตาร์ท MariaDB Server
sudo systemctl restart mariadbsudo apt-get install git
sudo npm install -g yarnสำหรับคำสั่ง npm install ถ้าใช้ sudo แล้วไม่เวิร์ค ให้ตัด sudo ออก
npm install -g yarnsudo -H pip3 install frappe-bench --break-system-packages
bench --versionหมายเหตุ: ใน Ubuntu 24.04 ต้องใส่
--break-system-packagesเพื่อติดตั้ง pip packages ระดับ system
ตอนนี้เรามี bench cli บน Ubuntu 24.04 เรียบร้อยแล้ว สามารถใช้คำสั่ง bench ได้เลย
bench init frappe-bench --frappe-branch version-16 --python python3.12คำสั่งนี้สำคัญนะครับ เราต้องระบุ python เวอร์ชั่น 3.12 เข้าไปใน bench init ด้วย
cd frappe-bench
sed -i '/web:/ s/$/ --noreload/' Procfile
pip3 install honcho
yarn add node-sass
sudo chmod -R o+rx /home/frappe
bench startสร้าง เว็บไซต์บน Frappe
bench new-site yourdomain.comอย่าลืม เพิ่มเว็บไซต์ เข้าไปที่ hosts
bench --site yourdomain.com add-to-hostsERPNext
bench get-app erpnext --branch version-16HRMS
bench get-app hrms --branch version-16Payments
bench get-app payments --branch version-16Print Designer (Optional)
bench get-app https://github.com/frappe/print_designerbench --site yourdomain.com install-app erpnext
bench --site yourdomain.com install-app hrms
bench --site yourdomain.com install-app payments
bench --site yourdomain.com install-app print_designerอย่าลืมรันคำสั่ง migrate ครับ
bench --site yourdomain.com migrateใช้คำสั่ง
bench --site yourdomain.com enable-scheduler
bench --site yourdomain.com set-maintenance-mode off
sudo bench setup production <username>ในกรณีของเรา username คือ frappe ดังนั้นใช้คำสั่ง
sudo bench setup production frappeเมื่อถึงขั้นตอนนี้ เราจะได้
Nginx และ Supervisorctl
ทั้ง Nginx และ Supervisorctl อยู่ใน status running
สามารถเปิดเว็บไซต์ที่ http://yourdomain.com
bench config dns_multitenant on
sudo apt-get install certbot python3-certbot-nginx
sudo -H bench setup lets-encrypt yourdomain.combench config dns_multitenant on
bench new-site your-site2-name
bench setup nginx
sudo service nginx reloadข้อมูลที่เราคีย์เข้าระบบ ERP เป็นข้อมูลที่มีความสำคัญมาก ทำหายไม่ได้เด็ดขาด ดังนั้นเราต้องรู้คำสั่งเบื้องต้นในการบำรุงรักษา ฐานข้อมูล ใน ERPNext
ทุกๆคำสั่งต่อไปนี้ ต้องทำงานในโฟลเดอร์ frappe-bench
bash~/frappe-bench$ bench [command]
สำรองข้อมูล + ไฟล์ที่เราอัพโหลดเช่น ไฟล์ภาพพนักงาน ไฟล์ภาพทรัพย์สินถาวร ไฟล์โลโก้บริษัท เป็นต้น
bench --site {sitename} backup --with-filesหรือ สำรองข้อมูล เฉพาะ ฐานข้อมูล
bench --site {sitename} backupสำรองข้อมูลในทุกๆ ไซต์ พร้อมกัน
bench backup-all-sitesไฟล์ต่างๆที่ได้จากการสำรองข้อมูลจะถูกเก็บไว้ที่
~/frappe-bench/sites/your-site/private/backups/เมื่อต้องการเรียกคืนข้อมูลที่เคยสำรองเอาไว้ ให้เราดูว่าไฟล์ที่สำรอง เก็บไว้ที่ไหน เช่น
bench --site {your site} backup --with-filesจะได้ไฟล์ทั้งหมด 4 ไฟล์:
bench new-site {sitename-ใหม่}bench --site {sitename-ใหม่} --force restore [path ฐานข้อมูล] \
--with-private-files [path ไฟล์ส่วนตัว] \
--with-public-files [path ไฟล์สาธารณะ]เสร็จแล้วสั่งให้ Frappe sync ฐานข้อมูล
bench --site {sitename-ใหม่} migratebench update --resetsudo bench renew-lets-encryptPain Point: เมื่อสร้าง DocType ใหม่ แล้ว Custom? checkbox ติดอยู่ตลอด แม้เปิด Developer Mode แล้ว
Solution: ต้องใช้คำสั่ง bench set-config แทนการแก้ไข site_config.json โดยตรง
bench set-config -g developer_mode 1อ่านเพิ่มเติม: แก้ปัญหา Custom? Always True ใน Frappe 16
ในกรณีที่เราติดตั้ง Custom app แล้วเกิดปัญหา ModuleNotFoundError!
bench setup requirements
sudo supervisorctl restart allปัญหา: หลังจาก Import ข้อมูลมาจากฐานข้อมูลเก่า แล้วเกิดปัญหา Scheduler Inactive
วิธีแก้:
bench --site your-domain.com set-config pause_scheduler 0ปัญหา: หลังจาก Import ข้อมูลจากฐานข้อมูลเก่า (หรือแม้แต่หลัง restart ปกติ) Scheduler กลับกลายเป็น Inactive เราอาจเห็น error เช่น Scheduler is inactive. Cannot enqueue job. — โดยเฉพาะเมื่อ submit POS Closing Entry หรือ job ที่ใช้ background queue อื่นๆ
สาเหตุที่แท้จริง: Scheduler สามารถอยู่ในสถานะ paused ได้แม้ว่า pause_scheduler จะเป็น 0 ใน site_config แล้ว Flag นี้ไม่ได้ถูกอ่านอย่างถูกต้องทุกครั้งหลัง restart ทำให้ scheduler ติดอยู่ในสถานะครึ่งๆ ค้าง ที่ bench doctor แสดงว่า "paused" และ "inactive" แต่ bench scheduler status บอกว่า "enabled" การตั้งค่า pause_scheduler เป็น 0 อย่างเดียวไม่สามารถแก้ได้
_วิธีแก้ที่ถูกต้อง — disable → enable cycle:
# ขั้นตอนที่ 1: Disable แล้ว Enable scheduler (บังคับให้อ่าน config ใหม่)
bench --site your-domain.com disable-scheduler
bench --site your-domain.com enable-scheduler
# ขั้นตอนที่ 2: Restart เต็มรูปแบบเพื่อให้ workers รับ new state
bench restart
# ขั้นตอนที่ 3: ตรวจสอบ — งานควรแสดงใน queue แล้ว
bench doctorหลังจากทำ cycle แล้ว, bench doctor ควรแสดง jobs ที่อยู่ใน queue อย่าง active ใน default และ long queues:
Queue: default
Number of Jobs: 30
Queue: long
Number of Jobs: 57
ถ้า POS Closing Entry ล้มเหลวก่อนหน้านี้ ให้ลอง submit ใหม่ — ควรจะผ่านแล้ว
Pain Point: หลังจากติดตั้ง ERPNext บนเซิร์ฟเวอร์ที่มี RAM เพียงพอแล้ว แต่เว็บไซต์กลับแสดง Error 504 Gateway Time-out โดยเฉพาะเมื่อโหลดหน้าที่ต้องดึงข้อมูลจากฐานข้อมูลจำนวนมาก เซิร์ฟเวอร์มีการใช้งาน Disk I/O สูงมาก ทั้งที่ CPU ยังมีทรัพยากรเหลืออยู่
สาเหตุ: ค่าเริ่มต้นของ MariaDB สำหรับ innodb_buffer_pool_size คือเพียง 128MB เท่านั้น เมื่อ buffer pool มีขนาดเล็กเกินไป ทุกการ query ฐานข้อมูลต้องอ่านจาก Disk แทนที่จะอ่านจาก RAM ทำให้เกิดปัญหา I/O bottleneck และ request timeout ในการใช้งานจริง
ที่ MooCoding เราเจอปัญหานี้บน Deployment ของ AWS Solution Ltd. บนเซิร์ฟเวอร์ที่มี RAM 16GB เว็บไซต์เกิด Error 504 แทบทุกหน้า หลังจากตรวจสอบ buffer pool hit rate พบว่าอยู่ที่ใกล้ 0% ยืนยันว่าทุกการ query ต้องอ่านจาก Disk
Solution: เพิ่มค่า innodb_buffer_pool_size ให้อยู่ที่ประมาณ:
ขั้นที่ 1. ตรวจสอบค่า buffer pool ปัจจุบัน:
mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"ถ้าค่าที่ได้คือ 134217728 (128MB) แสดงว่าต้องเพิ่มค่านี้
ขั้นที่ 2. สร้างไฟล์ config ที่ปรับแต่งแล้ว (อย่าแก้ไขไฟล์ 50-server.cnf โดยตรง):
sudo nano /etc/mysql/mariadb.conf.d/99-frappe-optimized.cnfให้วางการตั้งค่านี้ — ปรับ innodb_buffer_pool_size ตาม RAM ของเซิร์ฟเวอร์:
[mysqld]
# เซิร์ฟเวอร์ RAM 16GB ที่รัน App + DB บนเครื่องเดียวกัน → ใช้ ~40%
innodb_buffer_pool_size = 6G
# เซิร์ฟเวอร์ DB เฉพาะ RAM 16GB → ใช้ ~60%
# innodb_buffer_pool_size = 8G
innodb_log_file_size = 512M
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
max_allowed_packet = 256M
max_connections = 500
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mariadb-slow.log
long_query_time = 2
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ciขั้นที่ 3. สร้างโฟลเดอร์สำหรับ slow query log:
sudo mkdir -p /var/log/mysql
sudo chown mysql:adm /var/log/mysql
sudo chmod 750 /var/log/mysqlขั้นที่ 4. รีสตาร์ท MariaDB:
sudo systemctl restart mariadbขั้นที่ 5. ตรวจสอบว่าการตั้งค่าใหม่มีผลแล้ว:
mysql -e "SHOW VARIABLES WHERE Variable_name IN (
'innodb_buffer_pool_size', 'slow_query_log', 'max_connections');"เพิ่มเติม — ลดค่า swappiness (ฐานข้อมูลไม่ชอบ Swap):
echo 1 | sudo tee /proc/sys/vm/swappiness
echo 'vm.swappiness = 1' | sudo tee /etc/sysctl.d/99-db-tuning.conf
sudo sysctl -p /etc/sysctl.d/99-db-tuning.confหมายเหตุ: หลังจาก MariaDB รีสตาร์ทแล้ว buffer pool ต้องใช้เวลาในการ warm up ค่า hit rate จะค่อยๆ ดีขึ้นในชั่วโมงแรก หลังจากผ่านไปไม่กี่วัน hit rate ควรจะอยู่ที่ใกล้ 99.9%+ และ Error 504 ควรหายไปอย่างถาวร
การ Deploy ERPNext Ubuntu 24.04 ต้องติดตั้งซอฟท์แวร์ ต่อไปนี้ให้แล้วเสร็จก่อนติดตั้ง Frappe Bench
sudo apt-get install xvfb libfontconfig fonts-firacode font-manager jq -y
sudo apt-get install bubblewrap ansible -y # for OpenAI/Codex
sudo apt install ttf-mscorefonts-installer -y # clicked righ arrow at Configuration Page then say Yes
sudo apt-get install libmysqlclient-dev curl -y
sudo apt-get install libcups2-dev xfonts-75dpi xfonts-base -y
sudo wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox_0.12.6.1-2.jammy_amd64.deb
sudo dpkg -i wkhtmltox_0.12.6.1-2.jammy_amd64.deb
wkhtmltopdf --version # wkhtmltopdf 0.12.6.1 (with patched qt)
sudo rm wkhtmltox_0.12.6.1-2.jammy_amd64.deb
sudo wget https://www.f0nt.com/?dl_name=sipafonts/THSarabunNew.zip # download Sarabun Fonts from font.com
sudo apt-get install unzip
sudo unzip 'index.html?dl_name=sipafonts%2FTHSarabunNew.zip'
mkdir -p ~/.fonts
sudo mv 'THSarabunNew Bold.ttf' ~/.fonts/
sudo mv 'THSarabunNew BoldItalic.ttf' ~/.fonts/
sudo mv 'THSarabunNew Italic.ttf' ~/.fonts/
sudo mv 'THSarabunNew.ttf' ~/.fonts/
fc-cache -f -v # Update Font Cache
sudo rm -rf __MACOSX
sudo rm 'index.html?dl_name=sipafonts%2FTHSarabunNew.zip'MariaDB [(none)]> SELECT host,user FROM mysql.user;
+-----------+---------------+
| Host | User |
+-----------+---------------+
| localhost | mariadb.sys |
| localhost | mysql |
| localhost | root |
+-----------+---------------+
MariaDB [(none)]> CREATE USER 'root'@'%' IDENTIFIED BY 'your-password';
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> EXIT;