Cấu hình và deploy tự động rails app lên Ubuntu server với nginx, unicorn, capistrano – P3

Capistrano

Nó là 1 gem giúp cho việc deploy lên server được thuận tiện, nhanh gọn lẹ hơn, và đặc biệt là hoàn toàn tự động, bạn chỉ việc cấu hình, xong mỗi khi deploy chỉ việc chạy 1 lệnh là nó làm toàn bộ cho mình.

Ngoài ra capistrano cũng hỗ trợ rất tốt cho việc chạy custom task, log và đặc biệt là rollback:
– Khi deploy, nó sẽ vẫn giữ nguyên phiên bản hiện tại cho đến khi phiên bản mới lên xong và sẵn sàng để chạy thì nó mới kich hoạt bản mới. Điều đó có nghĩa là bạn hoàn toàn yên tâm nếu quá trình deploy có xảy ra vấn đề (rớt mạng, đường truyền chập chờn, server down…)
– Nếu đã deploy thành công, và bạn không ưng ý với bản deploy này mà muốn dùng bản cũ hơn, capistrano mặc định lưu lại cho bạn 5 phiên bản gần đây nhất, và bạn chỉ cần chạy 1 câu lệnh là quay về được phiên bản đó 😀

Thêm capistrano vào Gemfile (ké: thêm cả unicorn luôn :P)

Tiếp đến, khởi tạo các file cấu hình cho deploy:

Lệnh này sẽ tạo ra 1 số file với cấu trúc sau:

Capfile

Đây là file định nghĩa các thư viện con của capistrano mà nó sẽ dùng trong việc deploy.

config/deploy.rb

Là file cấu hình chung cho việc deploy

Hoàn toàn dễ hiểu đúng không 🙂

Thư mục config/deploy/

Là thư mục chứa các cấu hình cụ thể cho từng môi trường deploy, mặc định lệnh trên sẽ tạo cho mình 2 môi trường là productionstaging. Trong phạm vi loạt bài này, mình chỉ cần môi trường production thôi:

Mấy cái role app, web, db có ý nghĩa gì thế?

Nó dùng để giới hạn phạm vi phân quyền cho các custom task của mình. Chạy task ở đúng role sẽ hạn chế được việc vượt quyền, gây nguy hại cho những vùng khác mà role task/role đó không được phép làm. Việc này tương tự như việc không login bằng tài khoản root như ở bài viết trước mình nói á.

Đáng lẽ ra với mỗi role thì sẽ dùng từng tài khoản tương ứng, nhưng trong phạm vi giới thiệu này thì mình dùng chung 1 tài khoản 😛

Thư mục lib/capistrano/tasks/

Chứa các custom task của mình, các task này sẽ rất hữu hiệu để điều khiển server khi nó đã chạy rồi 🙂
OK, vậy là xong phần dưới local, lên server để xem qua cấu trúc của capistrano 1 chút:

Cấu trúc server với capistrano

Trên thư muc /var/www/demo_deploy, ta sẽ thấy:

  • Thư mục release sẽ chứa những phiên bản code cũ, dùng để rollback nếu cần, các thư mục này được đặt tên theo thời gian nó được deploy.
  • Thư mục current sẽ trỏ đến thư mục hiện tại bên releases
  • Thư mục repo sẽ chứa thông tin về VCS repo của mình (trong bài viết này thì là github á)
  • Thư mục shared sẽ chứa các file được chia sẻ giữa các bản releases như database.yml, logs
    OK, nắm hết kiến thức rồi thì đến thời khắc quan trọng nhất: deploy

Deploy

Sau khi push code lên repo được chỉ định cho capistrano, bạn chỉ cần chạy 1 lệnh:

production là tên môi trường. Capistrano sẽ đọc thông tin trong 2 file: deploy.rbconfig/deploy/production.rb để tiến hành deploy.
Trong quá trình chạy, nó sẽ show ra 1 đống log trong terminal, bạn có thể theo dõi để biết tiến trình và kết quả.

Sau khi deploy thành công, nếu không có gì thay đổi, bạn truy cập vào link VPS của bạn sẽ thấy rails app được chạy rồi.

Nếu có biến, việc luôn luôn cần làm khi kiểm tra lỗi server là đọc log để biết thông tin, hiện với rails app, chúng ta có tất cả 3 loại log:
– rails log: /var/www/demo_deploy/shared/log/production.log
– unicorn log: /var/www/demo_deploy/shared/log/unicorn.access.log/var/www/demo_deploy/shared/log/unicorn.error.log (2 cái này mình có cấu hình trên kia á)
– nginx log: /var/log/nginx/demo_deploy.access.log/var/log/nginx/demo_deploy.error.log cũng cấu hình lúc nãy luôn 🙂

Phù, tới đây là cơ bản xong rồi đó. Bạn có thể lên githubn của capistrano để biết thêm về các tuỳ chọn cấu hình khác.

Thêm chút nữa

Tự động hoá việc cấu hình

Loạt bài viết này mình làm hoàn toàn thủ công, tuy nhiên, có 1 số cách để tự động hoá bớt cách thao tác:
capistrano-unicorn-nginx: gem này sẽ cấu hình sẵn cho mình rất nhiều thứ.
chef solo: một giải pháp cấu hình server hoàn toàn tự động bạn chỉ phải cấu hình thủ công 1 lần, lần tới, bạn muốn cấu hình 1 server thì chỉ việc lôi ra chạy lại là xong.

fix json gem error

Source code

Source code on git hub

Source code on git hub

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

Spread the love
  • 2
  •  
  •  
  •  
  •  
    2
    Shares

Leave a Reply

Be the First to Comment!

avatar
  Subscribe  
Notify of