Vấn đề build lại project nuxtjs khi đang triển khai trên server?
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.
1 CÂU TRẢ LỜI
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ụcreleases/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ạipm2
là được. Bởipm2
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ềucurrent
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ụ.
@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ỉ
@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ỏ.
Bạn có đang dùng
pm2 deploy
không nhỉ? VD:pm2 deploy ecosystem.config.json production
đú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