Bunchee
Back to Blog

ติดตั้ง ERPNext 15 บน Ubuntu 22.04

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

ติดตั้ง ERPNext 15 บน Ubuntu 22.04

ถ้าคุณกำลังมองหาโปรแกรม ERP มาใช้งานในองค์กร แบบฟรีๆ ผมขอแนะนำโปรแกรม ERPNext ซึ่งเป็น Open Source เราสามารถนำมาใช้ได้ฟรี เพียงแต่อาจมีค่าใช้จ่ายด้าน Server นิดหน่อย ซึ่งขอแนะนำให้ ติดตั้ง บน Ubuntu 22.04 โดยบทความนี้จะแนะนำวิธี ติดตั้ง ERPNext 15 ซึ่งเป็นเวอร์ชั่นล่าสุด โดยจะติดตั้ง บน Ubuntu 22.04 ด้วยคลาวด์ของ AWS EC2

สิ่งที่ต้องเตรียม

  • Python 3.10+ (Default python บน Ubuntu 22.04 คือ Python 3.10)
  • pip
  • Node.js 18+
  • Redis 5
  • MariaDB 10.6.x - 10.8.x
  • yarn
  • wkhtmltopdf
  • git
  • cron
  • NGINX

สเปคฮาร์ดแวร์ขั้นต่ำ

  • 2 vCPU Core
  • 4 GB RAM
  • 50 GB Storage

แอพที่จะติดตั้งบน ERPNext

ก่อนติดตั้ง Frappe

สร้างบัญชีผู้ใช้ใหม่บน Ubuntu 22.04

เมื่อเริ่มใช้งาน 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

Multiple Bench

ในกรณีที่เราต้องการใช้งาน 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 ครับ โดยอาจจะติดตั้งโดยตรง หรือติดตั้งผ่าน Anaconda แล้วแต่ความชอบครับ แต่ผมแนะนำให้ติดตั้งผ่าน Anaonda ครับมันไม่ค่อยจุกจิก

ติดตั้ง Python 3.11 ผ่าน Anaconda

curl -O https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh
bash Anaconda3-2024.02-1-Linux-x86_64.sh -b

ถ้าต้องการใช้งาน Conda ให้ activate Conda โดยรันคำสั่ง

source /home/frappe/anaconda3/bin/activate

แล้วตามด้วย

conda init

ถ้าต้องการปิดการใช้งาน Conda ให้ใช้คำสั่ง

conda deactivate

บางคนอาจจะชอบให้ Conda activate ตัวเองโดยอัตโนมัติ ให้ใช้คำสั่ง

conda config --set auto_activate_base true

ถ้าต้องการปิดการทำงาน ก็ใช้คำสั่ง

conda config --set auto_activate_base false

หมายเหตุ: ถ้าเราไม่ได้ activate Conda เราจะใช้คำสั่ง Bench ไม่ได้นะครับ ดังนั้นก่อนทำงานในโฟลเดอร์ frappe-bench ให้ activate Conda ก่อนทุกครั้งครับ

เทคนิคเล็กๆน้อยๆคือ ให้สร้างคำสั่ง alias ไว้ใน .zshrc หรือ .bashrc โดยคัดลอกโค้ดนี้เข้าไป

alias frappe="source /home/frappe/anaconda3/bin/activate  && cd ~/frappe-bench"

ติดตั้ง Python 3.11 ด้วยตัวเอง

การติดตั้ง Python มากกว่า 1 เวอร์ชั่นจะสร้างปัญหากับ ERPNext พอสมควร ดังนั้นต้องติดตั้งอย่างระมัดระวัง สำหรับคนที่ใช้ Ubuntu 23.04 จะมีเวอร์ชั่น 3.11 มาให้แล้ว สามารถข้ามขั้นตอนนี้ไปได้เลยครับ

เสร็จแล้วก็เพิ่ม repository ของ python เข้าไป

sudo add-apt-repository ppa:deadsnakes/ppa -y
sudo apt-get update

ขั้นตอนต่อไป ติดตั้ง python

sudo apt-get install python3-dev python3.11-dev python3-setuptools python3-pip python3-distutils

หรือ แนะนำให้ติดตั้งแบบเต็มเวอร์ชั่นไปเลย

sudo apt-get install python3.11-full

ต่อไปก็ ติดตั้ง pip

sudo apt install python3-pip
python3 -m pip install --upgrade pip

ติดตั้ง Python Virtual Environment

sudo apt-get install python3.10-venv python3.11-venv

ขั้นตอนนี้สำคัญ ต้องติดตั้ง venv ทั้ง python3.10 และ python3.11 ไม่งั้นจะพบ Error ตอนติดตั้ง ERPNext

กำหนดให้ Python 3.11 เป็นค่า Default

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.11 2

เปลี่ยน Python เวอร์ชั่น ด้วยคำสั่ง

sudo update-alternatives --config python

ให้เลือกเบอร์ 2

NodeJS

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

ในกรณีใช้ Zsh

source ~/.zshrc
nvm install 18
sudo apt-get install npm

หรือถ้าใช้ Bash

source ~/.bashrc
nvm install 18
sudo apt-get install npm

Redis Server

ติดตั้ง Redis Server เพื่อจัดการ Cache

sudo apt-get install redis-server

ติดตั้ง MariaDB

MariaDB ที่ใช้สำหรับ ERPNext เวอร์ชั่น 15 ทาง Frappe แนะนำว่าต้องใช้ MariaDB เวอร์ชั่น 10.6.x ขึ้นไป แต่ไม่ควรเกิน เวอร์ชั่น 10.8.x

sudo apt-get install software-properties-common
sudo apt install mariadb-server mariadb-client

โปรแกรมจิปาถะต่างๆ

sudo apt-get install xvfb libfontconfig wkhtmltopdf
sudo apt-get install libmysqlclient-dev curl

ตั้งค่า MariaDB Server

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

แก้ไขค่า config ใน mysql

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 [(none)]> SELECT host,user FROM mysql.user;
+-----------+---------------+
| Host      | User          |
+-----------+---------------+
| localhost | mariadb.sys   |
| localhost | metabase_user |
| localhost | mysql         |
| localhost | root          |
+-----------+---------------+
4 rows in set (0.001 sec)

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)

หรือจำเพาะเจาะจงเฉพาะ Server ที่เราต้องการใช้งาน

MariaDB [(none)]> CREATE USER 'root'@'remote-server-ip' IDENTIFIED BY 'your-password';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'remote-server-ip' 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;

อธิบายโค้ด: SELECT host, user FROM mysql.user; => เป็นการตรวจดูก่อนว่า User root อยู่ตรงไหนบ้าง ซึ่งจากโค้ดตัวอย่างจะเห็นว่า User root จะ Active บน localhost เท่านั้น หมายความว่ามันยังไม่รองรับการเชื่อมต่อแบบ Remote

CREATE USER 'root'@'%' IDENTIFIED BY 'your-password'; => เป็นการ Active ให้ User root ทำงานได้ทุกหมายเลข IP หรือสามารถ Remote ได้นั่นเอง

สำหรับคำสั่งอื่นๆ เป็นคำสั่ง Routine ทั่วไปครับ

เสร็จแล้วให้รีสตาร์ท MariaDB Server

sudo systemctl restart mariadb

เสร็จแล้วให้เปิด Firewall สำหรับ Remote Server

sudo ufw allow from x.x.x.x to any port 3306

โดยเปลี่ยน x.x.x.x เป็นหมายเลข IP ของ Remote Server

เมื่อมาถึงขั้นตอนนี้ให้ลองทดสอบเชื่อมต่อแบบ Remote ดูครับ ให้ไปที่ Remote Server แล้วพิมพ์คำสั่ง

mysql -u root -h x.x.x.x -p

ถ้าใส่รหัสผ่านแล้ว สามารถเข้าไปที่หน้าจอของ MariaDB ได้ก็ถือว่าสำเร็จ หมายเหตุ: ให้แทน x.x.x.x ด้วยหมายเลข IP ของ MariaDB Server

yarn และ git

sudo apt-get install git
sudo npm install -g yarn

สำหรับคำสั่ง npm install ถ้าใช้ sudo แล้วไม่เวิร์ค ให้ตัด sudo ออก

npm install -g yarn

เริ่มติดตั้ง Frappe

sudo -H pip3 install frappe-bench
bench --version

ตอนนี้เรามี bench cli บน Ubuntu 22.04 เรียบร้อยแล้ว สามารถใช้คำสั่ง bench ได้เลย

bench init frappe-bench --frappe-branch version-15 --python python3.11

คำสั่งนี้สำคัญนะครับ เราต้องระบุ python เวอร์ชั่น 3.11 เข้าไปใน 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-hosts

สามารถเข้าไปตรวจสอบไฟล์ hosts ได้ที่

nano /etc/hosts

หรือถ้าต้องการแก้ไขไฟล์ hosts ด้วยตัวเอง ให้ไปที่ root ก่อนนะครับ ดังนี้

sudo su
sudo nano /etc/hosts

เพิ่ม Apps เข้าไปใน Frappe

ERPNext

bench get-app erpnext --branch version-15

HRMS

bench get-app hrms --branch version-15

Payments

bench get-app payments --branch version-15

สำหรับ Apps ข้างล่างนี้เป็น Custom Apps เป็นเพียงตัวเลือก (Options) จะติดตั้งหรือไม่ก็ได้ครับ

Print Designer

bench get-app https://github.com/frappe/print_designer

ERPNext Expenses

bench get-app https://github.com/Upeosoft-Limited/erpnext-expense-management-module.git

Credit: Upeosoft

ติดตั้งทุก Apps เข้าเว็บไซต์

bench --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
bench --site yourdomain.com install-app erpnext_expenses

อย่าลืมรันคำสั่ง migrate ครับ

bench --site yourdomain.com migrate

เปลี่ยน Development เป็น Production

ใช้คำสั่ง

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

Enable SSL certificate for https

bench config dns_multitenant on
sudo apt-get install certbot python3-certbot-nginx
sudo -H bench setup lets-encrypt yourdomain.com

เพิ่มเว็บไซต์ (Multitenancy)

bench config dns_multitenant on
bench new-site your-site2-name
bench setup nginx
sudo service nginx reload

การบำรุงรักษา

สำรองข้อมูล

ข้อมูลที่เราคีย์เข้าระบบ ERP เป็นข้อมูลที่มีความสำคัญมาก ทำหายไม่ได้เด็ดขาด ดังนั้นเราต้องรู้คำสั่งเบื้องต้นในการบำรุงรักษา ฐานข้อมูล ใน ERPNext

ทุกๆคำสั่งต่อไปนี้ ต้องทำงานในโฟลเดอร์ frappe-bench

~/frappe-bench$ bench [command]

สำรองข้อมูล + ไฟล์ที่เราอัพโหลดเช่น ไฟล์ภาพพนักงาน ไฟล์ภาพทรัพย์สินถาวร ไฟล์โลโก้บริษัท เป็นต้น

bench --site {sitename} backup --with-files

หรือ สำรองข้อมูล เฉพาะ ฐานข้อมูล

bench --site {sitename} backup

สำรองข้อมูลในทุกๆ ไซต์ พร้อมกัน

bench backup-all-sites

หรือ

bench --verbose --site all backup

ไฟล์ต่างๆที่ได้จากการสำรองข้อมูลจะถูกเก็บไว้ที่

~/frappe-bench/sites/your-site/private/backups/

เรียกคืนข้อมูล

เมื่อต้องการเรียกคืนข้อมูลที่เคยสำรองเอาไว้ ให้เราดูว่าไฟล์ที่สำรอง เก็บไว้ที่ไหน เช่น

bench --site {your site} backup --with-files
Backup Summary for {your site} at 2023-12-07 09:37:06.707378
Config  : ./{your site}/private/backups/20231207_093704-{your site}-site_config_backup.json 415.0B
Database: ./{your site}/private/backups/20231207_093704-{your site}-database.sql.gz         2.0MiB
Public  : ./{your site}/private/backups/20231207_093704-{your site}-files.tar               50.0KiB
Private : ./{your site}/private/backups/20231207_093704-{your site}-private-files.tar       130.0KiB

จะเห็นว่าเมื่อสั่งสำรองข้อมูลด้วย tag --with-files เราจะได้ไฟล์ทั้งหมด 4 ไฟล์ และเก็บไว้ที่ ./{your site}/private/backups/{ชื่อไฟล์}

  1. config file ไว้เก็บชื่อ ฐานข้อมูล เป็นต้น

  2. ไฟล์ฐานข้อมูล ลงท้ายด้วย .sql.gz

  3. ไฟล์สาธารณะ ลงท้ายด้วย .tar

  4. ไฟล์ส่วนตัว ลงท้ายด้วย .tar

กรณีที่ต้องการเรียกคืนมาที่ ไซต์ เดิม

bench --site {sitename-เดิม} --force restore [path ฐานข้อมูล] --with-private-files[path ไฟล์ส่วนตัว] --with-public-files[path ไฟล์สาธารณะ]

กรณีที่ต้องการเรียกคืนมาที่ ไซต์ ใหม่

bench new-site {sitename-ใหม่}
bench --site {sitename-ใหม่} --force restore [path ฐานข้อมูล] --with-private-files[path ไฟล์ส่วนตัว] --with-public-files[path ไฟล์สาธารณะ]

เช่น

bench --site {sitename-ใหม่} --force restore ./{sitename-เก่า}/private/backups/20231207_093704-{sitename-เก่า}-database.sql.gz \
--with-private-files ./{sitename-เก่า}/private/backups/20231207_093704-{sitename-เก่า}-private-files.tar \
--with-public-files ./{sitename-เก่า}/private/backups/20231207_093704-{sitename-เก่า}-files.tar

เครื่องจะให้เราใส่รหัสผ่าน สำหรับ MariaDB

MySQL root password: <ระบุ MariaDB พาสเวิร์ด>

เมื่อใช้คำสั่งข้างต้น จะได้หน้าจอแบบนี้

SETVAL(`crm_note_id_seq`, 1, 0)
1
SETVAL(`prospect_opportunity_id_seq`, 1, 0)
1
SETVAL(`pwa_notification_id_seq`, 1, 0)
1
SETVAL(`web_form_list_column_id_seq`, 1, 0)
1
App frappe already installed
*** Scheduler is enabled ***
Site {sitename-ใหม่} has been restored with files

เสร็จแล้วสั่งให้ Frappe sync ฐานข้อมูล และสร้างไฟล์ที่จำเป็นสำหรับ {sitename-ใหม่}

bench --site {sitename-ใหม่} migrate

จะเห็นหน้าจอ Terminal แสดงผลแบบนี้ครับ

bench --site {sitename-ใหม่} migrate
Migrating {sitename-ใหม่}
Updating DocTypes for frappe        : [========================================] 100%
Updating DocTypes for erpnext       : [========================================] 100%
Updating DocTypes for hrms          : [========================================] 100%
Updating DocTypes for payments      : [========================================] 100%
Updating DocTypes for print_designer: [========================================] 100%
Updating Dashboard for frappe
Updating Dashboard for erpnext
Updating Dashboard for hrms
Updating Dashboard for payments
Updating Dashboard for print_designer
Updating customizations for Address
Updating customizations for Contact
Queued rebuilding of search index for {sitename-ใหม่}

วิธีเชื่อมต่อกับ External MariaDB

bench set-mariadb-host {IP Address ของ MariaDB}

เสร็จแล้วสร้าง site ใหม่

bench new-site {sitename-ใหม่} --mariadb-root-password {your-mariadb-password}

วิธีตั้งชื่อ ฐานข้อมูล

ถ้าเราไม่กำหนดชื่อ ฐานข้อมูล Frappe จะตั้งชื่อฐานข้อมูลให้เรา อาจทำให้เราจำชื่อฐานข้อมูลไม่ได้ ดังนั้นถ้าเราต้องการตั้งชื่อ ฐานข้อมูล เอง ให้ทำดังนี้

bench new-site {sitename-ใหม่} --db-name {your-database-name} --mariadb-root-password {your-mariadb-password}

วิธี Update frappe-bench cli

ตรวจดูให้แน่ใจ ว่าเราอยู่ที่โฟลเดอร์ frappe-bench แล้วพิมพ์คำสั่ง

source env/bin/activate
pip install --upgrade frappe-bench

วิธี Update App Frappe ERPNext และ Apps อื่นๆ

sudo supervisorctl stop all
bench update --reset

ข้อสังเกต:

หลัง bench update --reset ทำงานเสร็จแล้ว มันจะ migrate ฐานข้อมูล ให้อัตโนมัติ

แต่เนื่องจากเราสั่งปิด Services ทั้งหมด ด้วยคำสั่ง sudo supervisorctl stop all ทำให้การ migrate ไม่สำเร็จ โดยมี Warning ดังนี้: Migrating [yoursitename.com] Service redis_cache is not running.

Cannot run bench migrate without the services running. If you are running bench in development mode, make sure that bench is running:

ดังนั้นในกรณีนี้เราไม่ต้องใช้คำสั่ง sudo supervisorctl stop all ก็ได้ ให้ใช้คำสั่ง bench update --reset ได้เลย

วิธีตั้งค่า Locale บน Ubuntu 22.04

ถ้า Ubuntu 22.04 ฟ้องว่า

manpath: can't set the locale; make sure $LC_* and $LANG are correct

ให้แก้ด้วยคำสั่ง

sudo dpkg-reconfigure locales

จะมีหน้าจอเลือกภาษา Pop-up ขึ้นมา ให้เลือกภาษาไทย ดังนี้

th_TH.UTF-8 UTF-8

วิธี Upgrade MariaDB

  1. Backup database
mysqldump -u [username] -p [database_name] > backup.sql
  1. หยุดการทำงานของ MariaDB
sudo systemctl stop mariadb
  1. ลบ MariaDB ออกจาก Hard disk
sudo apt-get purge mariadb-server mariadb-client mariadb-common
sudo apt-get autoremove
sudo apt-get autoclean
  1. ลบ User และ Group
sudo userdel -r mysql
sudo groupdel mysql
  1. ลบ MariaDB Configuration และ Database files
sudo rm -rf /etc/mysql/
sudo rm -rf /var/lib/mysql/

Renew Certificates (SSL)

sudo bench renew-lets-encrypt

คำสั่งนี้จะตรวจสอบ Certificates ทั้งหมดที่เรามีใน ERPNext ถ้าโดเมนไหนยังไม่หมดอายุ มันจะข้ามอัตโนมัติ มันจะ Renew เฉพาะโดเมนที่หมดอายุเท่านั้น ซึ่งทำให้การ Renew Certificates สะดวกมากๆ

วิธีแก้ปัญหาเบื้องต้น

มีการแก้ไขไฟล์ แล้ว update erpnext ไม่ได้

Pain Point: กรณีที่มีบางไฟล์มีการแก้ไข เช่นไฟล์ translations -> th.csv เราได้เข้าไปแก้ภาษาไทย ให้ดูสละสลวยมากขึ้น ถ้าเราใช้คำสั่ง bench update ไฟล์ th.csv จะโดนแทนที่ด้วยไฟล์ต้นฉบับ

Solution: ให้ใช้คำสั่งดังนี้

เข้าไปที่โฟลเดอร์

frappe-bench/apps/erpnext/erpnext

และ

frappe-bench/apps/frappe/frappe

ทีละโฟลเดอร์ แล้วใช้คำสั่ง

git status

เพื่อดูว่ามีไฟล์ที่โดนแก้ไขอยู่บ้างมั๊ย ถ้ามี ให้ใช้คำสั่ง

git add --all
git stash

เสร็จแล้วจึงใช้คำสั่ง

bench update

เมื่อ bench update ทำงานเสร็จแล้ว เราก็ดึงไฟล์ th.csv กลับมา โดยเข้าไปที่แต่ละโฟลเดอร์ที่กล่าวมาข้างต้น แล้วใช้คำสั่ง

git stash apply

ถ้าการ Restore Database มีปัญหา เช่นเครื่องมันฟ้องแบบนี้

b'/usr/bin/bash: line 1: file: command not found\n'

ให้แก้โดย ติดตั้ง package file

sudo apt-get install file

ใช้คำสั่ง bench update แล้วเครื่องค้าง

Pain Point: หลังจากรันคำสั่ง bench update แล้วเครื่องค้างนานเกินไป ไม่จำเป็นต้องนั่งรอนะครับ ให้รีบู๊ตเครื่องใหม่

Solution: พอเครื่องรีสตาร์ทเรียบร้อยแล้ว ให้ใช้คำสั่ง

bench update --reset

supervisor มีปัญหา หลังสร้าง app ใหม่

Pain Point: หลังใช้คำสั่ง bench new-app <app-name> แล้ว supervisor จะรีสตาร์ทใหม่ แต่อาจเกิดปัญหาในบางจุด ทำให้ supervisor รีสตาร์ทไม่สำเร็จ เช่น ข้อมูลด้านล่างนี้ node-socketio เกิด Error (spawn error)

frappe-bench-workers:frappe-bench-frappe-schedule: stopped
frappe-bench-workers:frappe-bench-frappe-short-worker-0: stopped
frappe-bench-workers:frappe-bench-frappe-long-worker-0: stopped
frappe-bench-web:frappe-bench-frappe-web: stopped
frappe-bench-workers:frappe-bench-frappe-schedule: started
frappe-bench-workers:frappe-bench-frappe-short-worker-0: started
frappe-bench-workers:frappe-bench-frappe-long-worker-0: started
frappe-bench-web:frappe-bench-node-socketio: ERROR (spawn error)
frappe-bench-web:frappe-bench-frappe-web: started
ERROR: sudo supervisorctl restart frappe-bench-workers: frappe-bench-web:

Solution: ให้แก้ดังนี้ รันคำสั่งเหล่านี้ทีละคำสั่ง

bench setup socketio
bench setup supervisor
bench setup redis
sudo supervisorctl reload

ModuleNotFoundError!

ในกรณีที่เราติดตั้ง Custom app เช่น หลังใช้คำสั่งนี้

bench get-app https://github.com/Upeosoft-Limited/erpnext-expense-management-module.git
bench --site [SITE_NAME] install-app erpnext_expenses

แล้วเกิดปัญหา ModuleNotFoundError! ที่ Web Browser ให้ลองแก้โดยไปที่ Server แล้วรันคำสั่ง

bench setup requirements
sudo supervisorctl restart all

หรือถ้าเป็น Development mode ให้ใช้ bench restart แทน

bench setup requirements
bench restart

ถ้ายังแก้ไม่ได้ให้ใช้คำสั่ง

bench update --reset
bench setup requirements

ข้อระวังกรณี Import ข้อมูลจากฐานข้อมูลเก่า

Pain Point: หลังจาก Import ข้อมูลมาจากฐานข้อมูลเก่า แล้วพบ Bug เช่นเรา Import ข้อมูลพนักงานมา ตรงรหัสพนักงานมีเครื่องหมายคำพูดติดมาด้วย ซึ่งปกติไม่ต้องมี เมื่อ ERPNext ดึงข้อมูลเหล่านี้ไปประมวลผล จะทำให้เกิด Bug โปรแกรมทำงานแบบไม่เต็มร้อย

ปัญหาเกิดจากการ Import 1

Solution: ให้แก้ดังนี้

1. คลิ๊กตรงชื่อ

ปัญหาเกิดจากการ Import 2

2. ให้ลบเครื่องหมายคำพูดออก

3. เสร็จแล้วกดปุ่ม Rename

ปัญหาเกิดจากการ Import 3

เมื่อกลับมาที่หน้าจอ Employee ให้ Refresh เราจะได้รหัสพนักงานที่ไม่มีเครื่องหมายคำพูด ซึ่งจะทำให้โปรแกรม ERPNext กลับมาทำงานเป็นปกติ

ปัญหาเกิดจากการ Import 4

Scheduler Inactive

Pain Point: หลังจาก Import ข้อมูลมาจากฐานข้อมูลเก่า แล้วเกิดปัญหา

Scheduler Inactive Scheduler is inactive. Cannot import data.

Scheduler Inactive

เช่น ในกรณีที่คุณขายของบน Lazada และมีรายการขายค่อนข้างมาก คุณคงไม่สามารถคีย์ข้อมูลแบบ Manual ได้นะครับ จำเป็นต้อง Import ข้อมูลจาก Lazada เข้ามา แต่ถ้า Scheduler Inactive อยู่ คุณจะ Import ข้อมูลไม่ได้ครับ

Solution: มีวิธีแก้ไขปัญหาดังนี้

1. ให้ลองใช้คำสั่ง bench doctor จะเห็น Terminal แสดงข้อมูลประมาณนี้ครับ

bench doctor
-----Checking scheduler status-----
Scheduler paused for your-domain.com
your-domain.com: frappe.conf.pause_scheduler is SET
Scheduler inactive for your-domain.com
Workers online: 2
-----None Jobs-----

2. ให้ใช้คำสั่ง

bench --site your-domain.com set-config pause_scheduler 0

Scheduler ก็จะกลับมาทำงานปกติครับ และคุณสามารถ Import ข้อมูลจาก Lazada ได้แล้ว

ทำความเข้าใจโครงสร้างไฟล์

ปัญหานี้อาจเกิดจากเราเปลี่ยนสภาพแวดล้อมจาก Production ไป Development แล้วลืมเอากลับมาเป็น Production และด้วยเหตุอันใดก็ตามเราบังเอิญไปย้ายฐานข้อมูลไปไว้ที่ไหม่ ทำให้ค่า Config ติดไปด้วย ดังนั้นเราจึงต้องทำความเข้าใจโครงสร้างไฟล์ที่เกี่ยวกับค่า Config

โครงสร้างไฟล์ที่เป็นค่า Config ของ Frappe/ERPNext จะอยู่ที่โฟลเดอร์ sites ตามรูปนี้ครับ

โครงสร้างไฟล์

โดยในโฟลเดอร์ sites จะมีไฟล์ common_site_config.json ซึ่งทุกๆไซต์จะใช้งานไฟล์นี้ร่วมกัน ให้สังเกตคำว่า common

ค่า Config มีอะไรบ้างดูตามรูปนี้ครับ

common_site_config

จะเห็นว่าค่า maintenance_mode และ pause_scheduler แสดงเป็นเลข 1 หมายความว่ามันอยู่ในสถานะเปิด มันจึงส่งผลให้ Scheduler Inactive ในทุกๆไซต์

ถ้าต้องการปิด maintenance_mode เรามี 2 ทางเลือก

1. แก้ maintenance_mode และ pause_scheduler ในไฟล์ common_site_config.json ให้เป็นเลข 0 หรือ

2. ให้เราไปแก้ทีละไซต์ในไฟล์ site_config.json ตามรูปนี้

site_config

วิธีทำ Master-Slave

master_slave

สิ่งที่ต้องเตรียม เลข IP Address ของ Master Server

ฝั่ง Master

(Master มีข้อมูลอยู่แล้ว)

1. กำหนด Server ID ให้ Master โดยรันคำสั่ง

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

แล้วแก้ไขไฟล์ 50-server.cnf ดังนี้ โดยคอมเม้นท์บรรทัด bind-address

[mysqld]
server-id = 1
log-bin = mysql-bin
#comment bind-address
#bind-address = 127.0.0.1

เสร็จแล้ว restart MariaDB

sudo systemctl restart mariadb

2. เข้าไปที่ MariaDB เพื่อสร้าง User rep_user โดยกำหนดให้เป็น Slave User ดังนี้

mysql -u root -p

ใส่รหัสผ่านเพื่อเข้าสู่หน้าจอของ MariaDB แล้วสร้าง User ได้เลย

CREATE USER 'rep_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'rep_user'@'%';
FLUSH PRIVILEGES;

3. คัดลอกฐานข้อมูลจาก Master ไปที่ Slave

บน Terminal MariaDB รันคำสั่ง

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS\G

จะได้ผลลัพธ์ออกมาหน้าตาประมาณนี้

MariaDB [(none)]> SHOW MASTER STATUS\G
*************************** 1. row ***************************
            File: master-bin.000009
        Position: 43510
    Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.000 sec)

จดข้อมูล File และ Position เอาไว้ เสร็จแล้วออกไปที่หน้าจอ Terminal Ubuntu เพื่อสำรองไฟล์ฐานข้อมูล

mysqldump -u root -p --all-databases --master-data > backup.sql

ใช้โปรแกรม FileZilla เพื่อ ดาวน์โหลดไฟล์ backup.sql และอัพโหลดไปไว้ที่ Slave Server

ฝั่ง Slave

1. กำหนด Server ID ให้ Slave โดยรันคำสั่ง

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

แล้วแก้ไขไฟล์ 50-server.cnf ดังนี้ โดยคอมเม้นท์บรรทัด bind-address

[mysqld]
server-id = 2
#comment bind-address
#bind-address = 127.0.0.1

เสร็จแล้ว restart MariaDB

2. วาง Database ที่คัดลอกมาจาก Master โดยรันคำสั่งนี้บน Ubuntu

mysql -u root -p < backup.sql

เสร็จแล้วให้เข้าไปที่ MariaDB terminal แล้วรันคำสั่ง

STOP SLAVE;
CHANGE MASTER TO
    MASTER_HOST='master_ip',
    MASTER_USER='rep_user',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='master-bin.000009',
    MASTER_LOG_POS=43510;
START SLAVE;

สรุปการติดตั้ง ERPNext 15 บน Ubuntu 22.04

การ Deploy ERPNext Ubuntu 22.04 ต้องติดตั้งซอฟท์แวร์ ต่อไปนี้ให้แล้วเสร็จก่อนติดตั้ง Frappe Bench

1. ติดตั้ง Python 3.11

2. NodeJS V20+ ผ่าน NVM

3. Redis Server V5

4. MariaDB V10.6-10.8

5. Yarn และ Git

6. Nginx, cron และ wkhtmltopdf

บทความที่เกี่ยวของ

เอกสารอ้างอิง