Asked Jun 5th, 2018 3:22 AM 159 0 1
  • 159 0 1
0

Vấn đề build lại project nuxtjs khi đang triển khai trên server?

Share
  • 159 0 1

Em có một project code bằng nuxtjs đang chạy trên server. Vấn đề của em là nếu em cập nhật code thì phải build code lại nhưng nếu như thế em sẽ phải dừng lệnh npm start lại để build code hay stop port đang mở chạy project này để cập nhật code mới mà vưà build ra(hiện tại em đang dùng pm2 để mở port ), như thế khi em tắt port đang mở sẽ gây gián đoạn dịch vụ nếu có người dùng đang vào. nếu không tắt port đang chạy mà cứ để thế build thì sẽ có lỗi. bác nào gặp vấn đề này rồi có cao kiến gì tư vấn em với. Em cảm ơn.

Jun 6th, 2018 12:39 AM

Bạn có đang dùng pm2 deploy không nhỉ? VD: pm2 deploy ecosystem.config.json production

0
| Reply
Share
Leng Keng @good_boy95_minh_ngoc
Jun 6th, 2018 2:52 AM

đúng mình đang dùng pm2 để mở port cho con này, nhưng cấu như bạn bảo thì chưa

0
| Reply
Share

1 ANSWERS


Answered Jun 5th, 2018 5:59 AM
+6

Bạn có thể tham khảo chiến lược deploy của Capistrano 😄

Cấu trúc thư mục của bạn sẽ có dạng kiểu như sau:

releases
shared
current -> /deploy/app/releases/20180605125001

Cụ thể thì

  • Thư mục releases có chứa source codes. Mỗi lần bạn muốn deploy code mới là bạn sẽ tạo một thư mục mới để clone code vào đó. Chẳng hạn như giờ bạn cần deploy, bạn sẽ clone code vào thư mục releases/20180605125001, ngày mai bạn deploy tiếp, và lưu code mới tại thư mục mới là releases/20180606091511, chứ không phải pull code về ở thư mục cũ
  • Bạn có một symbolic link, để trỏ đến thư mục chứa code cần deploy. Symbolic link này sẽ được thay đổi khi bạn deploy code mới. Chẳng hạn hiện thì symbolic link current trỏ đến thư mục /deploy/app/releases/20180605125001, ngày mai bạn deploy tiếp, và sau đó sẽ cần đổi symbolic link sang /deploy/app/releases/20180606091511. Cuối cùng bạn restart lại pm2 là được. Bởi pm2 vốn là chạy với script ở trong thư mục /deploy/app/current, bạn có deploy bao nhiêu lần đi chăng nữa thì thư mục deploy vẫn là /deploy/app/current, chỉ có điều current sẽ trỏ đến các thư mục khác nhau mà thôi. 😄
  • Thư mục shared để chứa những file, hay thư mục cần phải được giữ lại khi swap symbolic link (chẳng hạn như thư mục chứa sessions, file upload, logs ...), bạn cũng dùng sybolic link để link thư mục, file từ releases vào đây.

Khi thực hiện deploy, mà cụ thể ở đây là bạn cần build code nuxjs, thì bạn cứ build ở thư mục mới của bạn (trong lúc này pm2 vẫn chạy với thư mục release cũ nên sẽ không ảnh hưởng gì), sau khi build xong, bạn swap symbolic link, và restart lại pm2 để nó dựng server nodejs mới là được 😄

Bản thân pm2 cũng có cơ chế zero downtime (trong lúc dựng server node mới thì nó vẫn giữ server node cũ chạy, dựng xong thì mới tắt cái cũ đi), nên bạn sẽ có thể deploy mà gần như không hề bị gián đoạn dịch vụ.

Share
Van Hung @vhung
Jun 8th, 2018 1:38 AM

@thangtd90 Cảm ơn chia sẽ của bạn về chiến lược deploy của Capistrano, mình thấy rất bổ ích, nhưng mà mình thấy nếu cứ mỗi lần deploy mình tạo một folder thì sau 100 lần deploy thì server mình phải chứa 100 bộ source nên mình thấy khá lãng phí nhỉ

0
| Reply
Share
Jun 8th, 2018 2:26 AM

@vhung Thực tế thì chỉ giữ lại 2, 3, 5 hay một con số khác cho số lần deploy trước đó thôi. Các phiên bản release cũ hơn thì sẽ được tự động xóa bỏ.

+1
| Reply
Share
Thang Tran Duc @thangtd90
Jun 8th, 2018 6:36 AM

@vhung Như bạn @huukimit trả lời ở trên, thì bạn chỉ cần giữ lại một số source deploy gần đây nhất (để rollback lại nếu cần). Ví dụ như khi tạo đến thư mục release thứ 6, thì bạn cần có cơ chế để xoá cái cũ nhất đi, để sau khi deploy thành công, bao giờ cũng có không quá 5 thư mục releases 😄

0
| Reply
Share