Thứ năm, 09/07/2015 | 00:00 GMT+7

Cách triển khai ứng dụng Rails với Git Hooks trên Ubuntu 14.04

Trong hướng dẫn này, ta sẽ chỉ cho bạn cách sử dụng Git hooks để tự động hóa việc triển khai môi trường production của ứng dụng Rails đến server Ubuntu 14.04 từ xa. Sử dụng Git hooks sẽ cho phép bạn triển khai ứng dụng của bạn bằng cách đẩy các thay đổi lên server production , thay vì phải kéo và thực hiện những việc như thực hiện di chuyển database theo cách thủ công. Khi bạn tiếp tục làm việc trên ứng dụng của bạn , việc cài đặt một số hình thức triển khai tự động, chẳng hạn như Git hook, sẽ giúp bạn tiết kiệm thời gian về lâu dài.

Cài đặt cụ thể này sử dụng một móc Git đơn giản “sau khi nhận”, ngoài Puma làm server ứng dụng, Nginx làm Reverse Proxy cho Puma và PostgreSQL làm database .

Nếu bạn chưa quen với Git Hooks và muốn tìm hiểu thêm trước khi tiếp tục, hãy đọc hướng dẫn này: Cách sử dụng Git Hooks để tự động hóa các việc triển khai và phát triển .

Yêu cầu

Bạn sẽ yêu cầu quyền truy cập vào user không phải root có quyền siêu user trên server Ubuntu của bạn. Trong cài đặt ví dụ của ta , ta sẽ sử dụng một user được gọi là deploy . Hướng dẫn này sẽ chỉ cho bạn cách cài đặt : Cài đặt server ban đầu với Ubuntu 14.04 . Nếu bạn muốn triển khai mà không cần nhập password , hãy đảm bảo cài đặt SSH key .

Bạn cần cài đặt Ruby trên server của bạn . Nếu bạn chưa làm như vậy, bạn có thể cài đặt nó cùng với Rails bằng rbenv hoặc RVM .

Bạn cũng cần có ứng dụng Rails được quản lý trong repository lưu trữ git trên máy phát triển local của bạn. Nếu bạn chưa có và muốn làm theo, ta sẽ cung cấp một ứng dụng ví dụ đơn giản.

Bắt đầu nào!

Cài đặt PostgreSQL

Hầu hết các môi trường Rails production sử dụng PostgreSQL làm database , vì vậy hãy cài đặt nó trên server của bạn ngay bây giờ.

Trên server sản xuất của bạn, hãy cập nhật apt-get:

  • sudo apt-get update

Sau đó cài đặt PostgreSQL bằng các lệnh sau:

  • sudo apt-get install postgresql postgresql-contrib libpq-dev

Lưu ý: Bạn cũng nên cài đặt PostgreSQL trên máy phát triển của bạn để có thể cài đặt local pg gem, bộ điều hợp PostgreSQL. Điều này sẽ được yêu cầu để chạy bundle install khi ta thêm đá quý vào Gemfile của ứng dụng của bạn. Do các bước cài đặt khác nhau tùy theo hệ điều hành, nên đây là một bài tập dành cho người đọc.

Tạo user database production

Để đơn giản hóa mọi thứ, hãy đặt tên user database production giống với tên ứng dụng của bạn. Ví dụ: nếu ứng dụng của bạn được gọi là “appname”, bạn nên tạo một user PostgreSQL như sau:

  • sudo -u postgres createuser -s appname

Ta muốn đặt password của user database , vì vậy hãy nhập console PostgreSQL như sau:

  • sudo -u postgres psql

Sau đó, đặt password cho user database , “tên ứng dụng” trong ví dụ, như sau:

  • \password appname

Nhập password mong muốn của bạn và xác nhận nó.

Thoát khỏi console PostgreSQL bằng lệnh này:

  • \q

Bây giờ ta đã sẵn sàng để cấu hình ứng dụng của bạn với thông tin kết nối database thích hợp.

Chuẩn bị ứng dụng Rails của bạn

Trên máy phát triển của bạn, rất có thể là máy tính local của bạn, ta sẽ chuẩn bị triển khai ứng dụng của bạn.

Tùy chọn: Tạo ứng dụng Rails

Lý tưởng nhất là bạn đã có một ứng dụng Rails mà bạn muốn triển khai. Nếu đúng như vậy, bạn có thể bỏ qua phần phụ này và thực hiện các thay thế thích hợp trong khi theo dõi. Nếu không, bước đầu tiên là tạo một ứng dụng Rails mới.

Các lệnh này sẽ tạo một ứng dụng Rails mới, có tên là “appname”, trong folder chính của ta . Vui lòng thay thế “tên ứng dụng” được đánh dấu bằng một cái gì đó khác:

  • cd ~
  • rails new appname

Sau đó thay đổi vào folder ứng dụng:

  • cd appname

Đối với ứng dụng mẫu của ta , ta sẽ tạo một bộ điều khiển giàn giáo để ứng dụng của ta sẽ có thứ gì đó để hiển thị:

  • rails generate scaffold Task title:string note:text

Bây giờ, hãy đảm bảo ứng dụng của ta nằm trong repository lưu trữ git.

Khởi tạo Git Repo

Nếu ứng dụng của bạn chưa có trong repository lưu trữ Git vì lý do nào đó, hãy khởi tạo nó và thực hiện commit ban đầu.

Trên máy phát triển của bạn, thay đổi folder ứng dụng của bạn. Trong ví dụ của ta , ứng dụng của ta được gọi là “appname” và nó nằm trong folder chính của ta :

  • cd ~/appname
  • git init
  • git add -A
  • git commit -m 'initial commit'

Bây giờ ta hãy tinh chỉnh ứng dụng của bạn để chuẩn bị cho nó kết nối với database PostgreSQL production của ta .

Cập nhật cấu hình database

Trên máy phát triển của bạn, hãy chuyển sang folder ứng dụng của bạn nếu bạn chưa ở đó. Trong ví dụ của ta , ứng dụng của ta được gọi là “appname” và nó nằm trong folder chính của ta :

  • cd ~/appname

Bây giờ hãy mở file cấu hình database trong trình soạn thảo yêu thích của bạn. Ta sẽ sử dụng vi :

  • vi config/database.yml

Tìm phần sản xuất của cấu hình database ứng dụng của bạn và thay thế nó bằng thông tin kết nối database production của bạn. Nếu bạn đã làm theo ví dụ được cài đặt chính xác, nó sẽ trông giống như sau (thay thế bất kỳ giá trị nào nếu thích hợp):

đoạn trích config / database.yml
production:   <<: *default   host: localhost   adapter: postgresql   encoding: utf8   database: appname_production   pool: 5   username: <%= ENV['APPNAME_DATABASE_USER'] %>   password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %> 

Lưu và thoát. Điều này chỉ định rằng môi trường production của ứng dụng phải sử dụng database PostgreSQL được gọi là “appname_production” trên localhost — server production . Lưu ý tên user và password database được đặt thành các biến môi trường. Ta sẽ chỉ định chúng trên server sau.

Cập nhật Gemfile

Nếu Gem file chưa có gem điều hợp PostgreSQL, pg và gem Puma được chỉ định, bạn nên thêm chúng ngay bây giờ.

Mở Gemfile của ứng dụng trong trình soạn thảo yêu thích của bạn. Ta sẽ sử dụng vi ở đây:

  • vi Gemfile

Thêm các dòng sau vào Gemfile:

Trích đoạn Gemfile
group :production do   gem 'pg'   gem 'puma' end 

Lưu và thoát. Điều này chỉ rõ rằng môi trường production nên sử dụng đá quý pgpuma .

Cấu hình Puma

Trước khi cấu hình Puma, bạn nên tra cứu số lõi CPU mà server của bạn có. Bạn có thể dễ dàng thực hiện điều đó, trên server của bạn , bằng lệnh sau:

  • grep -c processor /proc/cpuinfo

Bây giờ, trên máy phát triển của bạn, hãy thêm cấu hình Puma vào config/puma.rb Mở file trong editor :

  • vi config/puma.rb

Copy paste cấu hình này vào file :

config / puma.rb
# Change to match your CPU core count workers 2  # Min and Max threads per worker threads 1, 6  app_dir = File.expand_path("../..", __FILE__) shared_dir = "#{app_dir}/shared"  # Default to production rails_env = ENV['RAILS_ENV'] || "production" environment rails_env  # Set up socket location bind "unix://#{shared_dir}/sockets/puma.sock"  # Logging stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true  # Set master PID and state locations pidfile "#{shared_dir}/pids/puma.pid" state_path "#{shared_dir}/pids/puma.state" activate_control_app  on_worker_boot do   require "active_record"   ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished   ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env]) end 

Thay đổi số lượng workers thành số lõi CPU của server của bạn. Ví dụ giả sử bạn có 2 lõi.

Lưu và thoát. Điều này cấu hình Puma với vị trí của ứng dụng của bạn và vị trí của socket , log và PID của nó. Vui lòng sửa đổi file hoặc thêm bất kỳ tùy chọn nào khác mà bạn yêu cầu.

Commit những thay đổi gần đây của bạn:

  • git add -A
  • git commit -m 'added pg and puma'

Trước khi tiếp tục, hãy tạo một khóa bí mật sẽ được sử dụng cho môi trường production ứng dụng của bạn:

  • rake secret
rake secret sample output:
29cc5419f6b0ee6b03b717392c28f5869eff0d136d8ae388c68424c6e5dbe52c1afea8fbec305b057f4b071db1646473c1f9a62f803ab8386456ad3b29b14b89

Bạn sẽ sao chép kết quả và sử dụng nó để đặt SECRET_KEY_BASE cho ứng dụng của SECRET_KEY_BASE trong bước tiếp theo.

Tạo Puma Upstart Script

Hãy tạo một tập lệnh Upstart init để ta có thể dễ dàng bắt đầu và dừng Puma, đồng thời đảm bảo nó sẽ bắt đầu khi server khởi động .

Trên server production của bạn, hãy download công cụ Jungle Upstart từ repository Puma GitHub vào folder chính của bạn:

  • cd ~
  • wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma-manager.conf
  • wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma.conf

Bây giờ hãy mở file puma.conf được cung cấp, vì vậy ta có thể cấu hình user triển khai Puma:

  • vi puma.conf

Tìm hai dòng chỉ định setuidsetgid , đồng thời thay thế “ứng dụng” bằng tên của user và group triển khai của bạn. Ví dụ: nếu user triển khai của bạn được gọi là "triển khai", các dòng sẽ trông như thế này:

puma.conf đoạn trích 1/2
setuid deploy setgid deploy 

Bây giờ, hãy tìm dòng có dòng này: exec /bin/bash <<'EOT' . Thêm các dòng sau vào bên dưới nó, đảm bảo thay thế tên user và password PostgreSQL và bí mật rake mà bạn đã tạo trước đó:

puma.conf đoạn trích 2 của 2
  export APPNAME_DATABASE_USER='appname'   export APPNAME_DATABASE_PASSWORD='appname_password'   export SECRET_KEY_BASE='rake_secret_generated_above' 

Lưu và thoát.

Bây giờ sao chép các tập lệnh vào folder Dịch vụ khởi động:

  • sudo cp puma.conf puma-manager.conf /etc/init

Tập lệnh puma-manager.conf tham chiếu /etc/puma.conf cho các ứng dụng mà nó sẽ quản lý. Hãy tạo và chỉnh sửa file khoảng không quảng cáo đó ngay bây giờ:

  • sudo vi /etc/puma.conf

Mỗi dòng trong file này phải là đường dẫn đến ứng dụng mà bạn muốn puma-manager quản lý. Ta sẽ triển khai ứng dụng của bạn vào một folder có tên “appname” trong folder chính của user . Trong ví dụ của ta , nó sẽ như sau (hãy đảm bảo cập nhật đường dẫn đến nơi ứng dụng của bạn sẽ hoạt động:

/etc/puma.conf
/home/deploy/appname 

Lưu và thoát.

Bây giờ ứng dụng của bạn đã được cấu hình để bắt đầu lúc khởi động, thông qua Upstart. Điều này nghĩa là ứng dụng của bạn sẽ bắt đầu ngay cả sau khi server của bạn được khởi động lại. Lưu ý ta chưa triển khai ứng dụng, vì vậy ta chưa muốn bắt đầu nó.

Cài đặt và cấu hình Nginx

Để ứng dụng có thể truy cập internet, ta nên sử dụng Nginx làm web server .

Cài đặt Nginx bằng apt-get:

  • sudo apt-get install nginx

Bây giờ hãy mở khối server mặc định bằng editor :

  • sudo vi /etc/nginx/sites-available/default

Thay thế nội dung của file bằng khối mã sau. Đảm bảo thay thế các phần được đánh dấu bằng tên user và tên ứng dụng thích hợp (hai vị trí):

/ etc / nginx / sites-available / default
upstream app {     # Path to Puma SOCK file, as defined previously     server unix:/home/deploy/appname/shared/sockets/puma.sock fail_timeout=0; }  server {     listen 80;     server_name localhost;      root /home/deploy/appname/public;      try_files $uri/index.html $uri @app;      location @app {         proxy_pass http://app;         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;         proxy_set_header Host $http_host;         proxy_redirect off;     }      error_page 500 502 503 504 /500.html;     client_max_body_size 4G;     keepalive_timeout 10; } 

Lưu và thoát. Điều này cấu hình Nginx như một Reverse Proxy , vì vậy các yêu cầu HTTP được chuyển tiếp đến server ứng dụng Puma thông qua socket Unix. Hãy thoải mái thực hiện bất kỳ thay đổi nào khi bạn thấy phù hợp.

Ta sẽ tạm dừng khởi động lại Nginx vì ứng dụng này chưa tồn tại trên server . Ta sẽ chuẩn bị ứng dụng tiếp theo.

Chuẩn bị production Git từ xa

Trên server production của bạn, hãy cài đặt git với apt-get:

  • sudo apt-get install git

Sau đó, tạo một folder cho repository từ xa. Ta sẽ tạo một repository git trần trong folder chính có tên là “appname_production”. Hãy đặt tên cho repository từ xa của bạn bất cứ điều gì bạn muốn (ngoại trừ đừng đặt nó trong ~/appname vì đó là nơi ta sẽ triển khai ứng dụng):

  • mkdir ~/appname_production
  • cd ~/appname_production
  • git init --bare

Vì đây là một repository trống, không có folder làm việc và tất cả các file nằm trong .git trong một cài đặt thông thường đều nằm trong chính folder chính.

Ta cần tạo git hook sau khi nhận, là đoạn script sẽ chạy khi server production nhận được git push. Mở file hooks/post-receive trong editor :

  • vi hooks/post-receive

Copy paste tập lệnh sau vào file post-receive :

hooks / post-nhận
#!/bin/bash  GIT_DIR=/home/deploy/appname_production WORK_TREE=/home/deploy/appname export APPNAME_DATABASE_USER='appname' export APPNAME_DATABASE_PASSWORD='appname_password'  export RAILS_ENV=production . ~/.bash_profile  while read oldrev newrev ref do     if [[ $ref =~ .*/master$ ]];     then         echo "Master ref received.  Deploying master branch to production..."         mkdir -p $WORK_TREE         git --work-tree=$WORK_TREE --git-dir=$GIT_DIR checkout -f         mkdir -p $WORK_TREE/shared/pids $WORK_TREE/shared/sockets $WORK_TREE/shared/log          # start deploy tasks         cd $WORK_TREE         bundle install         rake db:create         rake db:migrate         rake assets:precompile         sudo restart puma-manager         sudo service nginx restart         # end deploy tasks         echo "Git hooks deploy complete"     else         echo "Ref $ref successfully received.  Doing nothing: only the master branch may be deployed on this server."     fi done 

Đảm bảo cập nhật các giá trị được đánh dấu sau:

  • GIT_DIR : folder của repository git mà bạn đã tạo trước đó
  • WORK_TREE : folder mà bạn muốn triển khai ứng dụng của bạn (thư mục này phải trùng với vị trí mà bạn đã chỉ định trong cấu hình Puma)
  • APPNAME_DATABASE_USER : Tên user PostgreSQL (bắt buộc cho các việc rake)
  • APPNAME_DATABASE_PASSWORD : Mật khẩu PostgreSQL (bắt buộc đối với các việc cào)

Tiếp theo, bạn nên xem lại các lệnh giữa các comment về # end deploy tasks # start deploy tasks# end deploy tasks . Đây là các lệnh sẽ chạy mỗi khi nhánh chính được đẩy đến production git remote ( appname_production ). Nếu bạn để nguyên chúng, server sẽ cố gắng thực hiện những điều sau cho môi trường production ứng dụng của bạn:

  • Chạy gói
  • Tạo database
  • Di chuyển database
  • Biên dịch trước các nội dung
  • Khởi động lại Puma
  • Khởi động lại Nginx

Nếu bạn muốn thực hiện bất kỳ thay đổi nào hoặc thêm tính năng kiểm tra lỗi, hãy thực hiện điều đó tại đây.

Sau khi bạn xem xong kịch bản sau khi nhận, hãy lưu và thoát.

Tiếp theo, làm cho tập lệnh có thể thực thi:

  • chmod +x hooks/post-receive

Sudo không password

Vì hook sau khi nhận cần chạy các lệnh sudo, ta sẽ cho phép user triển khai sử dụng sudo password (thay thế tên user triển khai của bạn tại đây nếu nó khác):

  • sudo sh -c 'echo "deploy ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/90-deploy'

Điều này sẽ cho phép user deploy chạy các lệnh sudo mà không cần cung cấp password . Lưu ý bạn có thể sẽ muốn hạn chế những gì các lệnh mà user triển khai có thể chạy với các quyền siêu user . Ở mức tối thiểu, bạn cần sử dụng xác thực SSH key và tắt xác thực password .

Thêm từ xa Git production

Bây giờ ta đã cài đặt mọi thứ trên server production , hãy thêm điều khiển git từ xa production vào kho ứng dụng của ta .

Trên máy phát triển của bạn, hãy đảm bảo bạn đang ở trong folder ứng dụng của bạn :

  • cd ~/appname

Sau đó, thêm một điều khiển từ xa git mới có tên "production" trỏ đến repository git trần, appname_production , mà bạn đã tạo trên server production của bạn . Thay thế tên user (triển khai), địa chỉ IP server và tên repository từ xa (appname_production):

  • git remote add production deploy@production_server_public_IP:appname_production

Bây giờ ứng dụng của bạn đã sẵn sàng để triển khai với git push.

Triển khai đến Sản xuất

Với tất cả các bước chuẩn bị đã hoàn thành, bây giờ bạn có thể triển khai ứng dụng của bạn lên server production bằng cách chạy lệnh git sau:

  • git push production master

Điều này chỉ đơn giản là đẩy nhánh chính local của bạn đến điều khiển từ xa production mà bạn đã tạo trước đó. Khi điều khiển từ xa production nhận được push, nó sẽ thực thi tập lệnh hook sau post-receive mà ta đã cài đặt trước đó. Nếu bạn cài đặt mọi thứ một cách chính xác, ứng dụng của bạn bây giờ sẽ có sẵn tại địa chỉ IP công cộng của server production của bạn.

Nếu bạn đã sử dụng ứng dụng mẫu của ta , bạn có thể truy cập vào http:// production_server_IP /tasks trong trình duyệt web và thấy nội dung như sau:

Ứng dụng Rails mẫu

Kết luận

Bất kỳ lúc nào bạn thực hiện thay đổi đối với ứng dụng của bạn , bạn có thể chạy cùng một lệnh git push để triển khai tới server production của bạn . Điều này một mình sẽ giúp bạn tiết kiệm rất nhiều thời gian trong suốt vòng đời của dự án của bạn.

Hướng dẫn này chỉ đề cập đến hook "sau khi nhận", nhưng có một số loại hook khác có thể giúp cải thiện tự động hóa quy trình triển khai của bạn. Đọc hướng dẫn này để tìm hiểu thêm về Git hook: Cách Sử dụng Git Hooks Để Tự động hóa Nhiệm vụ Triển khai và Phát triển !


Tags:

Các tin liên quan

Cách sử dụng Prometheus để giám sát server Ubuntu 14.04 của bạn
2015-06-30
Cách cài đặt control panel Ajenti và Ajenti V trên Ubuntu 14.04
2015-06-26
Cách tự động hóa cài đặt WordPress trên Ubuntu 14.04 bằng Ansible
2015-06-25
Cách cài đặt Công cụ giám sát Munin trên Ubuntu 14.04
2015-06-20
Cách cài đặt và cấu hình mod_deflate trên Ubuntu 14.04
2015-06-17
Cách cài đặt MongoDB trên Ubuntu 14.04
2015-06-15
Cách cài đặt và sử dụng ArangoDB trên Ubuntu 14.04
2015-06-12
Cách cài đặt Lita Chat Bot cho IRC trên Ubuntu 14.04
2015-06-10
Cách cài đặt và cấu hình Ansible trên Ubuntu 14.04
2015-06-05
Triển khai ứng dụng Rails trên Ubuntu 14.04 với Capistrano, Nginx và Puma
2015-06-03