Redis สำหรับ ERPNext บน Mac

ปรับแต่ง Redis ERPNext บน Mac

การติดตั้ง ERPNext บน Mac ค่อนข้างจุกจิก ไหนจะต้องจัดการ Redis อีก หลายคนจึงแนะนำให้ติดตั้งบน Docker แต่ผมอยากลองปรับแต่ง Mac ดูว่าจะไหวมั๊ย


อนึ่ง การสร้าง Multiple Redis Ports บน Mac ที่เขียนไว้ในบทความก่อนหน้า ยังไม่ได้ครอบคลุมถึงการปรับแต่ง Redis สำหรับ ERPNext บน Mac ​แบบละเอียด ซึ่งจะขอแบ่งมาเขียนในบทความนี้


ในบทความ Multiple Redis Ports บน Mac เรามาถึงตรงที่ เราสามารถติดตั้ง frappe-bench ได้สำเร็จ โดยใช้คำสั่ง

bench init frappe-bench

แต่ถ้าเราใช้คำสั่งถัดไป คือ

bench start

เราอาจเจอปัญหา Address already in use

❯ cd frappe-bench
❯ bench start
/Users/manotlj/Anaconda/anaconda3/lib/python3.8/subprocess.py:848: RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used
  self.stdout = io.open(c2pread, 'rb', bufsize)
/Users/manotlj/Anaconda/anaconda3/lib/python3.8/subprocess.py:848: RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used
  self.stdout = io.open(c2pread, 'rb', bufsize)
/Users/manotlj/Anaconda/anaconda3/lib/python3.8/subprocess.py:848: RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used
  self.stdout = io.open(c2pread, 'rb', bufsize)
15:17:48 system           | redis_queue.1 started (pid=15435)
15:17:48 redis_queue.1    | 15435:C 14 Aug 2021 15:17:48.509 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
15:17:48 redis_queue.1    | 15435:C 14 Aug 2021 15:17:48.509 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=15435, just started
15:17:48 redis_queue.1    | 15435:C 14 Aug 2021 15:17:48.509 # Configuration loaded
15:17:48 redis_queue.1    | 15435:M 14 Aug 2021 15:17:48.510 * Increased maximum number of open files to 10032 (it was originally set to 256).
15:17:48 redis_queue.1    | 15435:M 14 Aug 2021 15:17:48.510 * monotonic clock: POSIX clock_gettime
15:17:48 redis_queue.1    | 15435:M 14 Aug 2021 15:17:48.511 # Warning: Could not create server TCP listening socket 127.0.0.1:11000: bind: Address already in use
15:17:48 redis_queue.1    | 15435:M 14 Aug 2021 15:17:48.511 # Failed listening on port 11000 (TCP), aborting.
15:17:48 system           | redis_cache.1 started (pid=15434)
15:17:48 system           | redis_queue.1 stopped (rc=1)
15:17:48 system           | redis_socketio.1 started (pid=15436)
15:17:48 redis_socketio.1 | 15436:C 14 Aug 2021 15:17:48.511 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
15:17:48 redis_socketio.1 | 15436:C 14 Aug 2021 15:17:48.511 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=15436, just started
15:17:48 redis_socketio.1 | 15436:C 14 Aug 2021 15:17:48.511 # Configuration loaded
15:17:48 redis_socketio.1 | 15436:M 14 Aug 2021 15:17:48.512 * Increased maximum number of open files to 10032 (it was originally set to 256).
15:17:48 redis_socketio.1 | 15436:M 14 Aug 2021 15:17:48.512 * monotonic clock: POSIX clock_gettime
15:17:48 redis_socketio.1 | 15436:M 14 Aug 2021 15:17:48.513 # Warning: Could not create server TCP listening socket 127.0.0.1:12000: bind: Address already in use
15:17:48 redis_socketio.1 | 15436:M 14 Aug 2021 15:17:48.513 # Failed listening on port 12000 (TCP), aborting.
15:17:48 redis_cache.1    | 15434:C 14 Aug 2021 15:17:48.508 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
15:17:48 redis_cache.1    | 15434:C 14 Aug 2021 15:17:48.508 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=15434, just started
15:17:48 redis_cache.1    | 15434:C 14 Aug 2021 15:17:48.508 # Configuration loaded
15:17:48 redis_cache.1    | 15434:M 14 Aug 2021 15:17:48.509 * Increased maximum number of open files to 10032 (it was originally set to 256).
15:17:48 system           | redis_socketio.1 stopped (rc=1)
15:17:48 redis_cache.1    | 15434:M 14 Aug 2021 15:17:48.509 * monotonic clock: POSIX clock_gettime
15:17:48 redis_cache.1    | 15434:M 14 Aug 2021 15:17:48.510 # Warning: Could not create server TCP listening socket 127.0.0.1:13000: bind: Address already in use
15:17:48 redis_cache.1    | 15434:M 14 Aug 2021 15:17:48.510 # Failed listening on port 13000 (TCP), aborting.
15:17:48 system           | redis_cache.1 stopped (rc=1)
...
...
...
15:17:48 system           | worker_short.1 stopped (rc=-15)
15:17:48 system           | schedule.1 stopped (rc=-15)
15:17:48 system           | worker_long.1 stopped (rc=-15)
15:17:48 system           | worker_default.1 stopped (rc=-15)
15:17:48 system           | watch.1 stopped (rc=-15)
15:17:48 system           | socketio.1 stopped (rc=-15)
15:17:48 system           | web.1 stopped (rc=-15)

~/frappe-bench
❯
Redis Ports already in use
Redis Ports already in use

ให้ลองเปิดโฟลเดอร์ frappe-bench ด้วยคำสั่ง

cd ~/frappe-bench
code .

แล้วเปิด Procfile ออกมาดู จะเห็นว่าใน Procfile ระบุค่า Configuration ของ redis ไว้ที่โฟลเดอร์ config แต่เรากำหนดไว้ที่ “/usr/local/etc/” นั่นหมายความว่าเรามี redis conf อยู่ 2 โฟลเดอร์ แต่ดันทำงานบนพอร์ตเดียวกัน มันจึงฟ้อง

Address already in use

frappe-bench Procfile
Procfile

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

ปัญหาที่ผมเจอคือ Python บน Mac มันฟ้อง Error แปลกๆ เมื่อใช้งานร่วมกับ Frappe Framework เช่น

Python error
virtualenv is not compatible

ถ้าติดตั้ง Python ผ่าน Homebrew หรือผ่าน pyenv แล้วยังมีปัญหา ผมแนะนำให้ลองติดตั้ง Anaconda แล้วใช้คำสั่ง

conda activate <virtualenv-name>

ทุกๆครั้งที่เปิดเครื่อง Mac มันจะ activate ให้อัตโนมัติ ลองใช้คำสั่ง

which python3

เครื่องจะตอบ /Users/<your-username>/Anaconda/anaconda3/bin/python3

แสดงว่าเรากำลังใช้ Python บน Anaconda


Anaconda

ดาวน์โหลด macOS graphical installer

ดับเบิ้ลคลิ๊กไฟล์ที่ดาวน์โหลดมา แล้วก็ทำตามกระบวนการติดตั้งปกติของ Mac ครับ แต่จะมาติดปัญหาตรงหน้าจอ

Select a Destination

เครื่องมันจะขึ้น Default เป็น Install for me only พร้อมข้อความเตือน

You cannot install Anaconda3 in this location, …

ไม่เป็นไรครับให้เลือก Install on a specific disk แล้วเลือกโฟลเดอร์ "Users/<your-username>/"

จะสร้างโฟลเดอร์ Anaconda ก็ได้ครับ ดังนั้นโฟลเดอร์ของผมจะเป็น

Users/manotlj/Anaconda/

คลิ๊กปุ่ม Continue นั่งรอซักครู่ พอมันติดตั้งเสร็จ ก็ทำขั้นตอนต่อไปได้เลยครับ

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

conda env list

เพื่อดูว่า ณ ตอนนี้เรามี environment อะไรบ้าง แต่ถ้าจะสร้าง environment สำหรับ frappe ผมจะสร้างโดยใช้คำสั่ง

conda create --name frappe

ลองเข้าไปดูที่โฟลเดอร์ Anaconda ที่เราสร้างไว้ในขั้นตอนการติดตั้ง คลิ๊กเข้าไปดูโฟลเดอร์ envs ดูครับ

virtualenv frappe
virtualenv frappe

ทำงานร่วมกับ VSCode

ถ้าต้องการให้ conda environment แสดงบน VSCode — Python Environment ให้สร้าง conda environment ด้วยคำสั่ง

conda create -n <env-name> python=<python-version> <libraries>

เช่นผมต้องการสร้าง Environment สำหรับ Flask ผมจะใช้คำสั่ง

conda create -n env-flask python=3.8 flask
❯ conda create -n env-flask python=3.8 flask
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /Users/manotlj/Anaconda/anaconda3/envs/env-flask

  added / updated specs:
    - flask
    - python=3.8


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    certifi-2021.5.30          |   py38hecd8cb5_0         139 KB
    click-8.0.1                |     pyhd3eb1b0_0          79 KB
    importlib-metadata-4.6.4   |   py38hecd8cb5_0          38 KB
    itsdangerous-2.0.1         |     pyhd3eb1b0_0          18 KB
    jinja2-3.0.1               |     pyhd3eb1b0_0         110 KB
    libcxx-12.0.0              |       h2f01273_0         805 KB
    markupsafe-2.0.1           |   py38h9ed2024_0          20 KB
    openssl-1.1.1l             |       h9ed2024_0         2.2 MB
    python-3.8.11              |       h88f2d9e_1        10.3 MB
    wheel-0.37.0               |     pyhd3eb1b0_1          33 KB
    zipp-3.5.0                 |     pyhd3eb1b0_0          13 KB
    ------------------------------------------------------------
                                           Total:        13.7 MB

The following NEW packages will be INSTALLED:

  ca-certificates    pkgs/main/osx-64::ca-certificates-2021.7.5-hecd8cb5_1
  certifi            pkgs/main/osx-64::certifi-2021.5.30-py38hecd8cb5_0
  click              pkgs/main/noarch::click-8.0.1-pyhd3eb1b0_0
  flask              pkgs/main/noarch::flask-1.1.2-pyhd3eb1b0_0
  importlib-metadata pkgs/main/osx-64::importlib-metadata-4.6.4-py38hecd8cb5_0
  itsdangerous       pkgs/main/noarch::itsdangerous-2.0.1-pyhd3eb1b0_0
  jinja2             pkgs/main/noarch::jinja2-3.0.1-pyhd3eb1b0_0
  libcxx             pkgs/main/osx-64::libcxx-12.0.0-h2f01273_0
  libffi             pkgs/main/osx-64::libffi-3.3-hb1e8313_2
  markupsafe         pkgs/main/osx-64::markupsafe-2.0.1-py38h9ed2024_0
  ncurses            pkgs/main/osx-64::ncurses-6.2-h0a44026_1
  openssl            pkgs/main/osx-64::openssl-1.1.1l-h9ed2024_0
  pip                pkgs/main/osx-64::pip-21.0.1-py38hecd8cb5_0
  python             pkgs/main/osx-64::python-3.8.11-h88f2d9e_1
  readline           pkgs/main/osx-64::readline-8.1-h9ed2024_0
  setuptools         pkgs/main/osx-64::setuptools-52.0.0-py38hecd8cb5_0
  sqlite             pkgs/main/osx-64::sqlite-3.36.0-hce871da_0
  tk                 pkgs/main/osx-64::tk-8.6.10-hb0a8c7a_0
  werkzeug           pkgs/main/noarch::werkzeug-1.0.1-pyhd3eb1b0_0
  wheel              pkgs/main/noarch::wheel-0.37.0-pyhd3eb1b0_1
  xz                 pkgs/main/osx-64::xz-5.2.5-h1de35cc_0
  zipp               pkgs/main/noarch::zipp-3.5.0-pyhd3eb1b0_0
  zlib               pkgs/main/osx-64::zlib-1.2.11-h1de35cc_3


Proceed ([y]/n)? y


Downloading and Extracting Packages
zipp-3.5.0           | 13 KB     | ################################################################################# | 100%
importlib-metadata-4 | 38 KB     | ################################################################################# | 100%
libcxx-12.0.0        | 805 KB    | ################################################################################# | 100%
python-3.8.11        | 10.3 MB   | ################################################################################# | 100%
markupsafe-2.0.1     | 20 KB     | ################################################################################# | 100%
click-8.0.1          | 79 KB     | ################################################################################# | 100%
jinja2-3.0.1         | 110 KB    | ################################################################################# | 100%
wheel-0.37.0         | 33 KB     | ################################################################################# | 100%
certifi-2021.5.30    | 139 KB    | ################################################################################# | 100%
openssl-1.1.1l       | 2.2 MB    | ################################################################################# | 100%
itsdangerous-2.0.1   | 18 KB     | ################################################################################# | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate env-flask
#
# To deactivate an active environment, use
#
#     $ conda deactivate


╭─ ~                                                                                               
╰─                                                                                                                       

เมื่อเข้าไปที่ VSCode จะเห็น “env-flask” วางอยู่ใน Python Environment Lists

Select Python Interpreter
Select Python Interpreter

DBngin

ดาวน์โหลด DBngin for Mac แล้วติดตั้งตามปกติครับ

DBngin
DBngin

โปรแกรมนี้จะช่วยให้เราเห็นภาพรวมทั้งหมด ว่าเราใช้ทรัพยากรอะไรอยู่บ้าง มันทำงานหรือหยุดทำงาน


ตัวเลือกอื่นๆ

ติดตั้ง pyenv

แนะนำให้ติดตั้งด้วย Homebrew โดยใช้คำสั่ง

brew install pyenv

ที่ Terminal ให้รันโค้ดนี้ ทีละบรรทัดครับ

echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
echo 'eval "$(pyenv init -)"' >> ~/.zshrc

ปิด Terminal แล้วเปิดขึ้นมาใหม่ ติดตั้ง Python build dependencies เพิ่มเติม

brew install openssl readline sqlite3 xz zlib

คราวนี้ก็ติดตั้ง Python เวอร์ชั่นที่ต้องการครับ เช่น

pyenv install 3.9.6

คำสั่งอื่นๆ

ถ้าต้องการอัพเกรด pyenv ให้ใช้คำสั่ง

brew upgrade pyenv

ถอนการติดตั้ง pyenv ออกจาก Mac

brew uninstall pyenv
rm -rf ~/.pyenv

pyenv-virtualenv

การทำงานบน Mac ปกติจะติดตั้งโปรแกรมต่างๆ ด้วย Homebrew นะครับ pyenv-virtualenv ก็เช่นกันครับ

brew install pyenv-virtualenv

เพิ่มโค้ดนี้เข้าไปในไฟล์ .zshrc ครับ

eval "$(pyenv virtualenv-init -)"

เสร็จแล้วสร้าง virtualenv ครับ เนื่องจากผมต้องการทำงานบน frappe framework ผมจึงตั้งชื่อเป็น frappe ดังนี้

pyenv virtualenv frappe

Redis สำหรับ ERPNext

Configuration Redis ที่ติดมากับ Frappe

ตามที่เกริ่นไว้ข้างต้น Frappe จะมองหา redis.conf จากโฟลเดอร์ “frappe-bench/config/”

แต่ในกรณีที่เราจัดการ Redis เองเราจะเก็บไว้ที่ “/usr/local/etc/” ดังนั้นวิธีที่ง่ายที่สุดคือ ให้เราเข้าไปที่โฟลเดอร์ frappe-bench

แล้วเปิดทั้งโฟลเดอร์ด้วย VSCode ดังนี้

cd ~/frappe-bench
code .

จะเห็นไฟล์ Procfile ให้เปิดไฟล์นี้แล้วลบ Redis ทั้ง 3 บรรทัดทิ้งไปครับ

Redis configuration in ERPNext
Redis in config folder

หลังจากลบแล้วจะได้ตามรูปนี้ครับ

Procfile after delete redis
Procfile after delete redis

ไม่ต้องกังวลเรื่องโฟลเดอร์ที่ใช้เก็บ redis.conf นะครับ เพราะ Frappe มันมองหา Redis ด้วย URL เพื่อประกอบความเข้าใจ ลองเข้าไปที่ “frappe-bench/sites/common_site_config.json”

common_site_config.json
common_site_config.json

จะเห็นเขาตั้งค่า Redis เอาไว้เป็น URL ตามภาพครับ จึงไม่เกี่ยวกับ Path บนโฟลเดอร์

Redis URL
Redis URL

แก้ไข Redis Config

เข้าไปที่โฟลเดอร์ “/usr/local/etc/”

แล้วคัดลอกโค้ดเหล่านี้ไปวางทีละไฟล์ครับ

ตรวจทาน

ก่อนใช้คำสั่ง bench start ให้ตรวจดูสิ่งเหล่านี้

ดูว่า Redis ทำงานมั๊ย

ด้วยคำสั่ง

ps aux | grep redis

ถ้าเราได้ใช้คำสั่ง

launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redisxxxxx.plist

ตามที่แนะนำไว้ใน บทความก่อน จะส่งผลให้ Redis ทำงานทุกครั้งเมื่อเปิดเครื่อง Mac ดังนั้นเราควรจะได้ลิสต์ของ Redis ตามรูปนี้ครับ

ps aux grep redis
ps aux | grep redis

หรือถ้าได้ติดตั้งโปรแกรม CleanMyMac สามารถดูได้ที่

Speed -> Optimization -> View All … Items… -> Launch Agents

CleanMyMac
CleanMyMac

MariaDB ทำงานมั๊ย

ตรวจดูด้วยคำสั่ง

lsof -n -P -i TCP -s TCP:LISTEN
❯ lsof -n -P -i TCP -s TCP:LISTEN
COMMAND    PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
nginx      752 manotlj    6u  IPv4 0x51a4cd3972581993      0t0  TCP *:8080 (LISTEN)
redis-ser  754 manotlj    6u  IPv4 0x51a4cd396c782ad3      0t0  TCP 127.0.0.1:6379 (LISTEN)
redis-ser  754 manotlj    7u  IPv6 0x51a4cd3965a80bab      0t0  TCP [::1]:6379 (LISTEN)
Kite       804 manotlj    6u  IPv4 0x51a4cd396ac81683      0t0  TCP 127.0.0.1:46624 (LISTEN)
redis-ser  888 manotlj    6u  IPv4 0x51a4cd39723aaad3      0t0  TCP 127.0.0.1:11000 (LISTEN)
redis-ser  888 manotlj    7u  IPv6 0x51a4cd396b0b3bab      0t0  TCP [::1]:11000 (LISTEN)
redis-ser  896 manotlj    6u  IPv4 0x51a4cd39723a9683      0t0  TCP 127.0.0.1:13000 (LISTEN)
redis-ser  896 manotlj    7u  IPv6 0x51a4cd396b0b552b      0t0  TCP [::1]:13000 (LISTEN)
redis-ser  906 manotlj    6u  IPv4 0x51a4cd39723a8c5b      0t0  TCP 127.0.0.1:12000 (LISTEN)
redis-ser  906 manotlj    7u  IPv6 0x51a4cd396b0b4ecb      0t0  TCP [::1]:12000 (LISTEN)
nginx      994 manotlj    6u  IPv4 0x51a4cd3972581993      0t0  TCP *:8080 (LISTEN)
mariadbd  1135 manotlj   17u  IPv6 0x51a4cd396b0b486b      0t0  TCP *:3306 (LISTEN)
mariadbd  1135 manotlj   18u  IPv4 0x51a4cd396fa3d993      0t0  TCP *:3306 (LISTEN)
...
...
...

~
❯

หรือตรวจสอบจาก CleanMyMac เช่นเดียวกันครับ

All Services for ERPNext
All Services for ERPNext

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

  • Can’t connect to MySQL server …

ถ้าลืมเปิด MariaDB ในขณะสั่ง bench start จะเกิด Error

pymysql.err.OperationalError
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 61] Connection refused)")
...
...
...

แก้ด้วยการ start MariaDB


  • Buying -> Server Error
  • Selling -> Server Error
SELECT list is not in GROUP BY clause ...

จะเจอหลังจากติดตั้ง ERPNext และล็อกอินเข้าไปใช้งาน เมื่อคลิ๊กเลือก Buying เครื่องจะฟ้อง Error นี้

ปัญหานี้ผมพบเมื่อติดตั้งทั้ง MySQL และ MariaDB บนเครื่อง Mac ให้แก้ด้วยการถอนการติดตั้งทั้งหมดออกไป แล้วล้างโฟลเดอร์ที่เกี่ยวข้องออกทั้งหมด รีสตาร์ท Mac แล้วติดตั้ง MariaDB ใหม่

Buying Server Error
Buying Server Error
Selling Server Error
Selling Server Error

ดูรายละเอียดการติดตั้ง MariaDB บน Mac


เริ่มทำงาน

เมื่อตรวจทานความพร้อมเสร็จแล้วสั่ง bench start ได้เลยครับ

# Terminal 1
cd ~/frappe-bench
bench start
❯ bench start
/Users/manotlj/Anaconda/anaconda3/lib/python3.8/subprocess.py:848: RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used
  self.stdout = io.open(c2pread, 'rb', bufsize)
/Users/manotlj/Anaconda/anaconda3/lib/python3.8/subprocess.py:848: RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used
  self.stdout = io.open(c2pread, 'rb', bufsize)
/Users/manotlj/Anaconda/anaconda3/lib/python3.8/subprocess.py:848: RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used
  self.stdout = io.open(c2pread, 'rb', bufsize)
/Users/manotlj/Anaconda/anaconda3/lib/python3.8/subprocess.py:848: RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used
  self.stdout = io.open(c2pread, 'rb', bufsize)
/Users/manotlj/Anaconda/anaconda3/lib/python3.8/subprocess.py:848: RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used
  self.stdout = io.open(c2pread, 'rb', bufsize)
15:22:41 system           | schedule.1 started (pid=20493)
15:22:41 system           | worker_short.1 started (pid=20492)
15:22:41 system           | watch.1 started (pid=20494)
15:22:41 system           | web.1 started (pid=20495)
15:22:41 system           | socketio.1 started (pid=20496)
/Users/manotlj/Anaconda/anaconda3/lib/python3.8/subprocess.py:848: RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used
  self.stdout = io.open(c2pread, 'rb', bufsize)
/Users/manotlj/Anaconda/anaconda3/lib/python3.8/subprocess.py:848: RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used
  self.stdout = io.open(c2pread, 'rb', bufsize)
15:22:41 system           | worker_long.1 started (pid=20498)
15:22:41 system           | worker_default.1 started (pid=20499)
15:22:41 socketio.1       | listening on *: 9000
15:22:42 watch.1          |
15:22:42 watch.1          | yarn run v1.22.10
15:22:42 watch.1          | $ node esbuild --watch
15:22:44 watch.1          | clean: postcss.plugin was deprecated. Migration guide:
15:22:44 watch.1          | https://evilmartians.com/chronicles/postcss-8-plugin-migration
15:22:44 watch.1          | clean: postcss.plugin was deprecated. Migration guide:
15:22:44 watch.1          | https://evilmartians.com/chronicles/postcss-8-plugin-migration
15:22:44 watch.1          | clean: postcss.plugin was deprecated. Migration guide:
15:22:44 watch.1          | https://evilmartians.com/chronicles/postcss-8-plugin-migration
15:22:46 web.1            |  * Running on http://0.0.0.0:8000/ (Press CTRL+C to quit)
15:22:46 web.1            |  * Restarting with stat
15:22:47 web.1            |  * Debugger is active!
15:22:47 web.1            |  * Debugger PIN: 303-442-146
15:22:51 watch.1          | clean: postcss.plugin was deprecated. Migration guide:
15:22:51 watch.1          | https://evilmartians.com/chronicles/postcss-8-plugin-migration
15:22:51 watch.1          | Watching for changes...
15:22:51 watch.1          | clean: postcss.plugin was deprecated. Migration guide:
15:22:51 watch.1          | https://evilmartians.com/chronicles/postcss-8-plugin-migration
15:22:52 watch.1          | clean: postcss.plugin was deprecated. Migration guide:
15:22:52 watch.1          | https://evilmartians.com/chronicles/postcss-8-plugin-migration
15:22:52 watch.1          | 3:22:52 PM: Compiled 0 files...
15:22:52 watch.1          |
15:22:52 watch.1          | clean: postcss.plugin was deprecated. Migration guide:
15:22:52 watch.1          | https://evilmartians.com/chronicles/postcss-8-plugin-migration

*** จากประสบการณ์ RuntimeWarning: line buffering… ที่ฟ้องบน Python3 ในบรรทัดแรกๆ ที่แสดงใน Log ไม่มีผลเสียหายต่อการทำงานครับ

วิธีดูว่า bench start ทำงานเรียบร้อยมั๊ย ให้ดูใน Log บน Terminal ว่ามี

Watching for changes…

ขึ้นมามั๊ย ถ้าบรรทัดนี้ขึ้นมา ก็แสดงว่ามันทำงานปกติครับ

ปล่อยหน้าจอ Terminal ไว้ครับไม่ต้องทำอะไรกับมัน ให้เปิด Terminal อีกตัวบนแท็บใหม่ ด้วยกดปุ่ม command + T พร้อมกัน แล้วเข้าไปที่โฟลเดอร์ frappe-bench เพื่อสร้าง Site ครับ


สร้าง Site

# Terminal 2
cd ~/frappe-bench
bench new-site sitename.local

ขั้นตอนนี้ให้เตรียม พาสเวิร์ด ไว้ 2 ชุดครับ

  1. สำหรับ MySQL ซึ่งได้สร้างไว้ตอนติดตั้ง MySQL หรือ MariaDB
  2. เป็นพาสเวิร์ดสำหรับล็อกอินเข้าใช้งาน Frappe ซึ่งจะสร้างในขั้นตอนนี้ครับ
Set Administrator password
Set Administrator password

วิธีแก้ Error

tabDefaultValue missing…

❯ bench new-site bunchee.local
MySQL root password:
ERROR 4047 (HY000) at line 10: InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE.
Table 'tabDefaultValue' missing in the restored site. Database not installed correctly, this can due to lack of permission, or that the database name exists. Check your mysql root password, validity of the backup file or use --force to reinstall
ERROR 4047 (HY000) at line 10: InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE.
Table 'tabDefaultValue' missing...

แก้ด้วยการใส่โค้ดนี้เข้าไปในไฟล์ my.cnf ซึ่งวางไว้ที่ “/usr/local/etc/my.cnf”

innodb_read_only_compressed = FALSE

Site <site-name> already exists

ปัญหานี้เกิดจากเราสร้าง site ในชื่อเดียวกันเกิน 1 ครั้ง ให้เปิดโฟลเดอร์ frappe-bench แล้วลบโฟลเดอร์ <site-name> ทิ้งครับ

cd ~/frappe-bench
code .
delete site-name
delete site-name

สร้าง Site สำเร็จ

ถ้าสร้าง Site สำเร็จ จะได้ Log ตามนี้ครับ

❯ bench new-site bunchee.local --force
MySQL root password:

Installing frappe...
Updating DocTypes for frappe        : [========================================] 100%
Updating country info               : [========================================] 100%
Set Administrator password:
Re-enter Administrator password:
*** Scheduler is disabled ***
Current Site set to bunchee.local

~/frappe-bench                                                                                                     2m 16s
❯

ERPNext

เมื่อสร้าง Site เสร็จ ก็ติดตั้ง ERPNext โดยยังอยู่ที่โฟลเดอร์ frappe-bench

Get App

คำสั่งนี้เป็นการคัดลอก ERPNext repository จาก Github

# Terminal 2
bench get-app erpnext
❯ bench get-app erpnext

Getting erpnext
$ git clone https://github.com/frappe/erpnext  --depth 1 --origin upstream
Cloning into 'erpnext'...
remote: Enumerating objects: 7229, done.
remote: Counting objects: 100% (7229/7229), done.
remote: Compressing objects: 100% (5930/5930), done.
remote: Total 7229 (delta 2026), reused 3243 (delta 1015), pack-reused 0
Receiving objects: 100% (7229/7229), 18.25 MiB | 8.14 MiB/s, done.
Resolving deltas: 100% (2026/2026), done.
Updating files: 100% (6791/6791), done.

Installing erpnext
$ ./env/bin/python -m pip install -q -U -e ./apps/erpnext
$ yarn install
yarn install v1.22.10
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
warning Workspaces can only be enabled in private projects.
[4/4] 🔨  Building fresh packages...
$ yarn run snyk-protect
yarn run v1.22.10
$ snyk protect
Successfully applied Snyk patches

✨  Done in 4.16s.
✨  Done in 14.76s.
$ bench build --app erpnext
✔ Application Assets Linked


yarn run v1.22.10
$ node esbuild --production --apps erpnext --run-build-command
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
File                                                        Size

erpnext/dist/js/
├─ bank-reconciliation-tool.bundle.PEPU4PCT.js              15.62 Kb
├─ erpnext-web.bundle.J434WXAN.js                           3.69 Kb
├─ erpnext.bundle.KO2PORUW.js                               155.02 Kb
├─ item-dashboard.bundle.BRJNQLV5.js                        10.37 Kb
├─ point-of-sale.bundle.RBU6HA3O.js                         90.26 Kb
└─ marketplace.bundle.HBJ7UEBR.js                           275.99 Kb

erpnext/dist/css/
├─ erpnext-web.bundle.LZLEOHSK.css                          9.15 Kb
├─ erpnext.bundle.W3R4YAMT.css                              40.99 Kb
└─ erpnext_email.bundle.GFE2VM7P.css                        0.50 Kb

erpnext/dist/css-rtl/
├─ erpnext-web.bundle.K3NPG2IC.css                          9.15 Kb
├─ erpnext.bundle.ZTQ7GJA5.css                              40.98 Kb
└─ erpnext_email.bundle.PNG2YP3K.css                        0.50 Kb

 DONE  Total Build Time: 2.374s

clean: postcss.plugin was deprecated. Migration guide:
https://evilmartians.com/chronicles/postcss-8-plugin-migration
✨  Done in 3.62s.

หลังจากดาวน์โหลดโค้ดมาจาก Github เรียบร้อยแล้ว ก็สั่งติดตั้งครับ

Install App

ขั้นตอนนี้จะไม่มีปัญหาอะไรนะครับ ถ้า MariaDB ถูกติดตั้งไว้ถูกต้อง

bench install-app erpnext
❯ bench install-app erpnext

Installing erpnext...
Updating DocTypes for erpnext       : [========================================] 100%
Updating customizations for Address
Updating customizations for Contact

~/frappe-bench                                                                                                     3m 25s
❯

Development Mode

เมื่อติดตั้ง Site และ ERPNext เสร็จแล้ว เข้าไปที่โฟลเดอร์ sites เลือกโฟลเดอร์ sitename.local ในที่นี้จะเป็น bunchee.local เปิดไฟล์ site_config.json เพิ่มโค้ด

"developer_mode": 1,

เข้าไปดังภาพ

site_config.json
site_config.json

Login ครั้งแรก

เปิด Web Browser พิมพ์ http://localhost:8000 ล็อกอินด้วย

Username: Administrator

Password: ที่สร้างตอนใช้คำสั่ง bench new-site sitename.local

หน้าจอ Login
Login
Password Created point
Password Created point

สรุป

แนะนำให้ใช้ Python บน Anaconda มันทำงานร่วมกับ zsh – Shell และ PATH บน Mac ได้ค่อนข้างนิ่ง

ขั้นตอนการตั้งค่า Redis สำหรับ ERPNext บน Mac

  1. หลังจากติดตั้ง ERPNext เสร็จแล้วเปิดไฟล์ Procfile ในโฟลเดอร์ frappe-bench
  2. ลบค่า Configuration ที่เกี่ยวกับ Redis ทิ้งทั้งหมด
  3. เปิดไฟล์ redis11000.conf, redis12000.conf และ redis13000.conf เพื่อแก้ไขโค้ด
  4. ตรวจดูว่า Redis พอร์ต 11000, 12000 และ 13000 ทำงานมั๊ย

โบนัส

ขั้นตอนการ Login ครั้งแรก

ระบุ Credential

Login Success
Login Success

เลือกภาษาหลัก

Default Language
Default Language

เลือกประเทศ ทั้งนี้ TimeZone และ Currency จะขึ้นมาเองตามประเทศที่เลือก

Country
Country

ชนิดธุรกิจเป็นแบบไหน

Type of Business
Type of Business

โลโก้ และชื่อบริษัท

Entity
Entity

อัพโหลดโลโก้

Upload Logo
Upload Logo

กดปุ่ม Next

Go to Next step
Go to Next step

ธนาคาร และผังบัญชี

Bank and Accounts chart
Bank and Accounts chart

กำลังทำงาน

Setting up
Setting up

ทำงานเสร็จ

Done
Done

รูปนี้หลังจากติดตั้ง และล็อกอินสำเร็จ

ERPNext success install
ERPNext success install

เพิ่มชื่อผู้ใช้

ตรง User > Administrator คลิ๊กตรงเส้นประ ข้างรูป Printer เลือก New User

New User
New User

ใส่ข้อมูลของท่าน แล้วกดปุ่ม Save

Input Fields
Input Fields

Email Domain – Office 365

เลือก Settings มองหา Email Domain คลิ๊กเลือก

Email Domain
Email Domain

ในหน้าจอ Email Domain คลิ๊กปุ่ม + Add Email Domain

Add email domain
Add email domain

ใส่รายละเอียดตามรูปครับ

Email Domain Settings
Email Domain Settings

Cron job

ตอนสั่ง bench init frappe-bench เครื่องมันจะสร้าง crontab ให้อัตโนมัติ ให้เปิด crontab -e แล้วแก้ไข Scripts ดังนี้

เปลี่ยนจาก

0 */6 * * *  cd /Users/<user-name>/frappe-bench && /Users/<user-name>/Anaconda/anaconda3/bin/bench --verbose --site all backup >> /Users/<user-name>/frappe-bench/logs/backup.log 2>&1 # bench auto backups set for every 6 hours

เป็น

0 */6 * * * cd ~/frappe-bench && ~/Documents/CustomScripts/backupFrappe.sh

สร้างไฟล์ backupFrappe.sh ในโฟลเดอร์ “~/Documents/CustomScripts/” พร้อมกับเปิดไฟล์ด้วย VSCode โดยใช้คำสั่ง

touch ~/Documents/CustomScripts/backupFrappe.sh && code $_

ใส่โค้ดนี้เข้าไปครับ

#!/bin/zsh

which bench
bench --version
cd ~/frappe-bench
bench --site <site-name>.local backup --backup-path /Users/<user-name>/Documents/backupFrappe/ --verbose

กำหนดให้ไฟล์ backupFrappe.sh Executable ด้วยคำสั่ง

chmod +x ~/Documents/CustomScripts/backupFrappe.sh

อย่าลืมสร้างโฟลเดอร์ backupFrappe ใน ~/Documents ครับ ด้วยคำสั่ง

mkdir ~/Documents/backupFrappe

และอย่าลืมเปลี่ยน <site-name>.local เป็นชื่อ Site ของท่านครับ โดยของผมจะเป็น

#!/bin/zsh

which bench
bench --version
cd ~/frappe-bench
bench --site bunchee.local backup --backup-path /Users/manotlj/Documents/backupFrappe/ --verbose

ถ้าใครใช้ Cronitor สามารถเชื่อมต่อดังนี้

cronitor discover
# or
~/cronitor discover

สั่ง Execute ครั้งแรก

cronitor exec <your-key> cd ~/frappe-bench && ~/path/to/backupFrappe.sh
# or
~/.cronitor exec <your-key> cd ~/frappe-bench && ~/path/to/backupFrappe.sh

ของผมจะเป็น

❯ ~/cronitor exec wIbCtz "cd ~/frappe-bench && ~/Documents/CustomScripts/backupFrappe.sh"

ดูรายละเอียดที่ Developer Playground: Crontab Mac


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

สมัครรับบทความ

ท่านจะได้รับบทความเกี่ยวกับเทคนิคในการเขียนโค้ด การสร้างเว็บไซต์ ความรู้ด้านบัญชี ภาษีอากร และอื่นๆ

0 0 votes
ให้คะแนนบทความ
Notify of
guest
0 ความเห็นทั้งหมด
Inline Feedbacks
ดูความเห็นทั้งหมด

บทความแนะนำ

Flask Python framework โดย สรุป

Flask Python framework + Emmet

สรุป วิธีสร้างเว็บไซต์ด้วยภาษา Python โดยใช้ Flask framework และ การตั้งค่า VSCode เพื่อให้สามารถใช้ Emmet ร่วมกับ Flask framework ได้

Redis บน Debian AWS EC2

Redis บน Debian AWS EC2

ติดตั้ง Redis แบบ Manual บน ระบบปฏิบัติการ Debian ที่อยู่บน EC2 ของ AWS Cloud จะช่วยให้การปรับแต่ง Redis เช่น การเพิ่มพอร์ต ทำได้ง่ายขึ้น

Colorize VIM

Developer Playground: Colorize VIM

ตกแต่ง VIM Editor ให้ดู Colorize ด้วย VIM Plug และมันยังมีประโยชน์ต่อการเขียนโค้ดด้วย เพราะมันจะแสดงข้อมูลที่สำคัญบริเวณขอบล่างของหน้าจอ

0
แสดงความเห็นได้นะx
()
x
Scroll to Top
Share on facebook
Share on twitter
Share on linkedin