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):
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:
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ý pg
và puma
.
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 :
# 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 setuid
và setgid
, đồ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:
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 đó:
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:
/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í):
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
:
#!/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
và # 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:
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 !
Các tin liên quan
Cách sử dụng Prometheus để giám sát server Ubuntu 14.04 của bạn2015-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