Nodejs auto deployment with pm2

Đôi điều về pm2

pm2 là công cụ quản lý nodejs app: start, stop, restart, tự khởi động lại khi app crash, tự start app khi hệ điều hành restart… Bạn có thể xem cụ thể về các thao tác đó ở một bài viết của appconus.

Ngoài ra, pm2 còn hỗ trợ việc auto deployment nodejs app

Cài đặt pm2

Auto deployment nodejs app với pm2

Khởi tạo file cấu hình

Lệnh trên sẽ tạo file ecosystem.config.js ở thư mục gốc của dự án.
Cùng xem qua nó có gì:

Định nghĩa app

Trong mục apps sẽ là mảng các app sẽ chạy.

  • script: script sẽ dùng để start app, script này có thể là lệnh trực tiếp, hoặc có thể trỏ đến 1 bash script file
  • env: chỗ này sẽ định nghĩa các biến môi trường chung chung, các biến này sẽ được gán khi chạy app mà không có thêm tham số --env lát nữa mình sẽ nói rõ hơn trong mục chạy app.
  • env_production: nơi định nghĩa các biến môi trường cho một môi trường cụ thể, chữ production mình có thể thay thế bằng bất kỳ chữ gì khác, thông thường là staging, dev, test để tương ứng với convention chung.

1 script mà mình đang dùng cho dự án hiện tại:

Nhưng mình cho nó vào 1 file, và trỏ đến file đó: .start.sh:

Định nghĩa việc deploy

Mục deploy sẽ là 1 JSON Object với các key được đặt tuỳ ý, nhưng theo convention thì ta nên đặt các tên staging, dev, test, production.

Ở đây có 3 mục cần chú ý:

host

Nếu muốn deploy lên nhiều server cùng 1 lúc, thì ta truyền 1 mảng vào theo định dạng:

pm2 dùng giao thứ ssh để truy cập vào server, nên các thông số này cần theo cấu hình ssh của server bạn.

Mặc định thì pm2 sẽ truy cập qua port 22 (mặc định của giao thức ssh), nhưng để nâng cao tính bảo mật cho server, bạn nên đổi cổng mặc định của ssh service như 1 bài viết của appconus đã nói rõ về vấn đề này.

post-deploy

Đây là hook, sẽ thực thi ngay sau khi deploy, tức là sau khi pm2 clone hoặc pull code mới nhất về server.

Thường thì ta sẽ làm những việc sau:

  • Install các dependency bằng lệnh: npm install
  • Symlink các file config: ln -nfs ../shared/.env .env chẳng hạn
  • Chạy app: pm2 startOrRestart ecosystem.config.js --env production

Nhìn kỹ hơn tham số --env production 1 chút, production chính là môi trường sẽ chạy app, và các biến môi trường sẽ được lấy từ khai báo tương ứng trên mục apps.

Nếu bạn truyền tham số: --env foo thì nó sẽ lấy các biến môi trường được khai báo với key: env_foo.

Nếu không truyền tham số thì sẽ lấy ở: env.

Để code dễ đọc hơn, ta nên viết mỗi lệnh ở 1 dòng:

env

Biến môi trường ở đây sẽ override các khai báo trên kia, nên khai báo ở đâu thì khai báo 1 nơi thôi. Keep It Simple, Stupid 😀

Setup các folder cần thiết

Cú pháp:

Lệnh này sẽ tạo 1 số folder trong thư mục path mà bạn định nghĩa lúc nãy:

  • current: thư mục chứa code hiện tại, nó được symlink từ thư mục source. Mình cũng chả hiểu tại sao pm2 lại làm vậy nữa, vì pm2 quản lý các phiên bản thông qua file .deploys
  • .deploys chứa 1 hash code của các lần deploy, phục vụ cho việc roll back sau này.
  • shared: chứa các file sẽ dùng chung giữa các phiên bản, thường là file config, biến môi trường, các thông tin nhạy cảm, logs…
  • source: pm2 sẽ clone code vào đây.

Nhớ là để có thể clone code về, thì bạn cần sinh ssh key trên server, và add vào repo nhé.

Tương tự, để có thể deploy, tất nhiên máy bạn cần ssh được vào server 🙂

Tất nhiên, pm2 có support phương án deploy bằng private key, nhưng mình không ủng hộ phương án này, nên mình không nói về nó nhiều, lát nữa ình dẫn link, bạn muốn có thể tìm hiểu về nó.

Deploy

production là tên môi trường mà bạn định nghĩa ở mục deploy lúc nãy. pm2 sẽ lấy các thông tin trong đó để deploy.

Mặc định pm2 sẽ đọc file ecosystem.config.js để lấy thông tin, bạn có thể truyền đường dẫn đến 1 file config khác: pm2 deploy path/to/config/file production. Nhưng rườm rà quá, mình không bàn tới.

Revert

Muốn quay về các bản deploy trước:

Nếu muốn quay về xa hơn 1 chút thì thêm tham số n là lần deploy thứ n, tính từ hiện tại lùi lại, vd:

Bạn có 5 release: a, b, c, d, e, current là e:

Là quay về bản c. Revert tiếp:

Là quay về bản a.

Tới đây đủ dùng rồi á, mình dẫn link nếu bạn muốn tìm hiểu sâu hơn: http://pm2.keymetrics.io/docs/usage/deployment/

Thêm chút nữa

Trước mình có làm rails, deploy rails app thì có capistranomina.

Mình từng có làm 1 bài so găng capistrano và mina nhưng nếu so pm2 với cap hay mina thì mình thấy pm2 cùi hơn tụi nó nhiều :3

Nhưng mà không sao, pm2 vẫn phục vụ tốt nhu cầu cơ bản là đẹp rồi 🙂

Lập trình và hơn thế nữa

Spread the love
  •  
  •  
  •  
  •  
  •  

Leave a Reply

Be the First to Comment!

Notify of
avatar