Deploy แอพ Rails 6 บน Digital Ocean ตอนที่ 2 - Passenger Nginx และ Capistrano

จากโพสครั้งที่แล้ว Deploy แอพ Rails 6 บน Digital Ocean 9 ตอนที่ 1 - สร้าง Droplets, SSH, ติดตั้ง Ruby และ PostgreSQL เราได้ติดตั้งและเตรียม Droplet VPS ของเราไว้ระดับหนึ่งแล้ว ในตอนที่ 2 นี้ เราจะดำเนินการต่อให้เสร็จ ในส่วนของ application server (Phussion Passenger), web server (Nginx) และทำ automatic deploy แอพของเราด้วย Capistrano

สำหรับท่านใดที่ติดตามโพสของผมแล้วคันไม้คันมืออยากจะลอง deploy แอพ Rails บน Digital Ocean บ้าง สามารถเข้าไปสมัครได้ผ่าน referral link ของผมตรงนี้ ได้เลย เมื่อเข้าไปที่ลิ้งแล้วกด Sign Up คุณจะได้รับ Credit $50 สำหรับ 30 วัน เมื่อสมัครเข้าใช้งาน

Create Rails App ที่ local machine

สำหรับ Rails แอพที่เราจะเอามา deploy ผมจะขอใช้แอพ Memberwoot ซึ่งเป็นแอพ Rails 6 ที่เคยทำเอาไว้แล้วในโพสก่อนหน้า

เนื่องจากในโพสซีรี่ย์นี้เราจะทำการ deploy โดยใช้ Capistrano ซึ่งจำเป็นจะต้องมี git repository (github หรือ bitbucket) เป็นของแอพเองเพื่อให้ capistrano ทำการดึงแอพสถานะล่าสุดจาก repositoty แล้ว deploy มันไปยัง Droplet หรือ VPS ของเรา

แอพ Memberwoot ที่ผมใช้เป็นตัวอย่างนั้นมี git repository อยู่แล้ว ถ้าคุณมีแอพ Rails ที่จะใช้ทดลองและมี git repository อยู่แล้วก็ข้ามไปยังหัวข้อถัดไปได้เลย แต่ถ้าคุณต้องการใช้แอพนี้ในการทดลอง deploy ไปพร้อมๆ กับโพสนี้ก็ทำได้แต่ต้องแก้ไขอะไรนิดหน่อย ก่อนอื่นให้คุณไปสร้าง repository ใหม่ที่ Github หรือ ฺBitbucket ไว้ก่อน สมมติว่า repository มีชื่อว่า myapp จากนั้นให้คุณ clone memberwoot จาก github ของ memberwoot มายังเครื่อง local ของคุณโดยใช้คำสั่งด้านล่าง

$ git clone git@github.com:worrawutp/memberwoot.git myapp

พารามิเตอร์ myapp ด้านหลังของคำสั่งจะเป็นการบอก git ว่าหลังจาก clone มาแล้วให้เปลี่ยนชื่อโฟลเดอร์ของโปรเจคให้เป็น myapp ด้วย

จากนั้นทำการแก้ไขค่าของ remote url จากเดิมให้เป็นค่า url ของ git repository ที่คุณสร้างขึ้น นั้นก็คือ repocitory myapp โดยใช้คำสั่งด้านล่าง (สมมติว่าคุณใช้ github) แล้วทำการ push local repository ขึ้นไปยัง origin repository ของคุณ โดยการรันคำสั่ง

$ git remote set-url origin git@github.com:<your_git_username>/myapp.git
$ git push -u origin master

ติดตั้ง Git และติดต่อกับ repository ของแอพ Memberwoot

สำหรับการทำ automatic deployment ร่วมกับ Capistrano เราจะต้องติดตั้ง Git ไว้บน server และจะต้องเซตค่าให้สามารถทำการ ssh จาก server เข้าไปยัง git repository เพื่อดึงโค้ดจาก repository memberwoot ของเราให้ได้ด้วย ซึ่งมีขั้นตอนดังนั้

ssh เข้าไปที่ Droplet server ด้วย user devwoot (หรือ user ที่มีสิทธิ sudo) แล้วใช้คำสั่งด้านล่างนี้เพื่อติดตั้ง Git เวอร์ชั่นล่าสุด

$ sudo yum -y install  https://centos7.iuscommunity.org/ius-release.rpm
$ sudo yum -y install  git2u-all

จากนั้นสลับ user ไปเป็น memberwoot หรือ user อื่นที่ตั้งไว้สำหรับแอพของคุณ โดยใช้คำสั่ง su - memberwoot แล้วทำการสร้าง SSH key ซึ่ง key อันนี้จะถูกใช้เพื่ออนุญาตให้ Droplet สามารถ ssh เข้าไปติดต่อกับ Github/Bitbucket ได้

[memberwoot@devwoot-rails-showcase ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/memberwoot/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/memberwoot/.ssh/id_rsa.
Your public key has been saved in /home/memberwoot/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:fbyJW/J4UMFKswRW0TIJcbhvb+D88IcxiJR6G20A8xs memberwoot@devwoot-rails-showcase
The key's randomart image is:
+---[RSA 2048]----+
|        =*+=     |
|      o...B +    |
|       + = * .   |
|        E.o..    |
|       oSB.oo    |
|      . = Oooo   |
|       . B++++   |
|        . oO= .  |
|          o++.   |
+----[SHA256]-----+
[memberwoot@devwoot-rails-showcase ~]$

ตอนรันคำสั่ง ssh-keygen แล้วให้คุณเคาะ enter ตอบทั้ง 3 ครั้ง โดยไม่ต้องใส่ค่าอะไรทั้งสิ้น สุดท้ายเราจะได้ไฟล์ id_rsa.pub (public key) และ id_rsa (private key) เก็บอยู่ที่ ~memberwoot/.ssh

จากนั้นให้ดูเนื้อหาในไฟล์ id_rsa.pub ด้วยคำสั่ง cat ~memberwoot/.ssh/id_rsa.pub แล้ว copy เนื้อหานั้นแล้วเข้าไปที่หน้า github repository ของแอพในที่นี้คือ memberwoot แล้วหาแท็ป settings กดเข้าไปแล้วเลือกหัวข้อ Deploy keys ที่เมนูด้านซ้าย แล้วกดปุ่ม Add deploy key ก็จะเจอช่องให้ใส่ค่าของ SSH key ให้วางค่า SSH key ที่เรา copy มาลงไป ตั้งชื่อให้เรียบร้อยแล้วกด Add key แค่นี้

เสร็จแล้วให้กลับมาที่ server ซึ่งตอนนี้ใช้ user memberwoot อยู่ ให้เปิดไฟล์ .bash_profile ขึ้นมาแก้ไข โดยเพิ่มโค้ดด้านล่างเข้าไปที่บรรทัดสุดท้ายของไฟล์ โดยโค้ดชุดนี้จะทำการสั่งให้รัน ssh-agent และ ssh-add ทุกครั้งที่เรา login ด้วย memberwoot เข้ามา ซึ่งทั้ง ssh-agent และ ssh-add จำเป็นสำหรับการรัน ssh จาก Droplet เข้าไปที่ github

# automatically run ssh-agent
if [ -z "SSH_AUTH_SOCK" ]; then
        eval `ssh-agent -s`
        ssh-add ~/.ssh/id_rsa
fi

เสร็จแล้วให้ logout ออกมาจาก Droplet VPS แล้ว ssh login เข้าไปใหม่ด้วย memberwoot แล้วลองใช้คำสั่ง ssh -T git@github.com เพื่อทดลอง ssh จาก VPS ไปยัง github ซึ่งถ้าทำงานได้ปกติจะได้ผลลัพธ์ดังนี้

[memberwoot@devwoot-rails-showcase ~]$ ssh -T git@github.com
The authenticity of host 'github.com (52.74.223.119)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,52.74.223.119' (RSA) to the list of known hosts.
Hi worrawutp/memberwoot! You've successfully authenticated, but GitHub does not provide shell access.

Install Phusion Passenger and Nginx

โมดูลชุดสุดท้ายที่เราจะติดตั้งคือ web server และ application server ขออธิบายให้เห็นภาพสั้นๆ ว่า web server ทำหน้าที่รับ/ส่ง network request/response ผ่านทาง protocal อย่าง HTTP หรือ protocal อื่นบน internet ตัวอย่างหน้าที่ของ web server คือคอยรับ request ของ user ที่ใช้เว็บแอพของเราผ่านทางเบราเซอร์และส่ง response จากเว็บแอพที่รันอยู่ทาง server กลับไปหาเบราเซอร์หรือผู้ใช้ให้ถูกต้อง ตัวอย่างของ web server ที่ใช้กันเช่น Nginx, Apache, IIS เป็นต้น แต่เนื่องจากเว็บแอพ Rails ของเราไม่สามารถสื่อสารกับ web server ได้โดยตรงจึงต้องมีสิ่งที่เรียกว่า application server มาช่วยเป็นตัวกลางเชื่อมต่อระหว่างแอพ Rails และ web server อีกที

สำหรับโปรเจคนี้เราจะใช้ Nginx เป็น web server และ Phusion Passenger ทำหน้าที่เป็น application server เรามาเริ่มกันติดตั้งกันเลย (อ้างอิงขั้นตอนการติดตั้งจาก Phusion Passenger Deployment tutorial for Ruby application

ssh เข้าไปที่ Droplet server ด้วย user devwoot หรือ user ที่มีสิทธิ su แล้วรันคำสั่งด้านล่างเพื่อทำการลง EPEL และ update library package ของ CentOS ก่อน

$ sudo yum install -y epel-release yum-utils
$ sudo yum-config-manager --enable epel
$ sudo yum clean all && sudo yum update -y

จากนั้นทดลองรันคำสั่ง date แล้วตรวจสอบดูว่าวันที่ที่โชว์ขึ้นมาตรงกับปัจจุบันหรือไม่ ถ้าไม่ให้รันคำสั่งด้านล่างเพื่อเป็นการแก้ไข

sudo yum install -y ntp
sudo chkconfig ntpd on
sudo ntpdate pool.ntp.org
sudo service ntpd start

รันคำสั่งด้านล่างเพื่อติดตั้ง Phusion passenger และ Nginx ในคราวเดียวกัน

$ sudo yum install -y pygpgme curl
$ sudo curl --fail -sSLo /etc/yum.repos.d/passenger.repo https://oss-binaries.phusionpassenger.com/yum/definitions/el-passenger.repo



$ sudo yum install -y nginx passenger || sudo yum-config-manager --enable cr && sudo yum install -y nginx passenger

เสร็จแล้วให้เปิดไฟล์ /etc/nginx/conf.d/passenger.conf ขึ้นมาแล้ว uncomment บรรทัดที่มี passenger_root, passenger_ruby, passenger_instance_registry_dir (เอาเครื่องหมาย # ที่อยู่ด้านหน้าออก) จากนั้นทำการ restart Nginx ด้วยคำสั่ง

$ sudo service restart nginx

ตอนนี้ phussion passenger และ Nginx น่าจะสามารถทำงานได้แล้ว เราจะทำการตรวจสอบสถานะว่ามันทำงานได้โอเคหรือไม่โดยรันคำสั่งต่อไปนี้

$ sudo /usr/bin/passenger-config validate-install

มันจะถามว่าจะ validate อะไร ให้เลือก Passenger itself ถ้าผลลัพธ์ที่ได้ขึ้นแบบนี้แสดงว่า Phusion passenger มีสถานะปกติดี

 * Checking whether this Passenger install is in PATH... ✓
 * Checking whether there are no other Passenger installations... ✓

แล้วรันคำสั่งด้านล่างเพื่อดูว่า Phusion passenger และ Nginx ทำงานอยู่หรือไม่

$ sudo /usr/sbin/passenger-memory-stats

ถ้าทุกอย่างปกติดีเราควรจะต้องเห็นว่ามี process ของทั้ง Passenger และ Nginx รันอยู่ดังรูป สถานะของ phusion passenger ที่แสดงว่าทำงานปกติ

Install and config Capistrano

Capistrano ช่วยให้เราสามารถสั่ง deploy แอพ Rails เข้าไปรันใน Droplet VPS (deploy to production) จากเครื่อง local/development ได้เลย โดยหลักการคือเมื่อเราสั่ง deploy จากเครื่อง local, Capistrano จะทำการ clone โปรเจคจาก master branch ใน git repository ของแอพ (ในที่นี้คือแอพ memberwoot) มายัง VPS แล้วทำการ deploy ซึ่งจะมีการ copy ไฟล์ ตรวจสอบไฟล์ สร้างฐานข้อมูล รัน migration รันและคอมไพล์ไฟล์ต่างๆ ไปมาเกิดขึ้นมากมายในขั้นตอนนี้ โดย Capistrano จะมีไฟล์ที่ชื่อว่า deploy.rb ซึ่งเราสามารถเข้าไปกำหนดค่าพารามิเตอร์และใส่สคริปบางอย่างเพื่อปรับแต่งการ deploy ให้เป็นไปตามที่เราต้องการ เมื่อเสร็จสิ้นการ deploy ในแต่ละครั้ง Capistrano จะระบุสถานะของโฟลเดอร์ล่าสุดที่ทำการ clone มาจากแอพ repository ว่าเป็น current ซึ่งเราจะอ้างอิงโฟลเดอร์ public ที่อยู่ภายใน current กับ Nginx เพื่อบอกว่าจะเว็บแอพของเราเริ่มรันจาก public โฟลเดอร์นี้

ถ้าพร้อมแล้ว เรามาเริ่มติดตั้งและกำหนดค่าของ Capistrano กันเลย

เปิด Gemfile ที่อยู่ใน root ของโปรเจคในเครื่อง local โดยเพิ่ม gem ที่เกี่ยวกับ Capistrano เข้าไปใน block ของ group :development

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'capistrano', '~> 3.11', require: false
  gem 'capistrano-rails', '~> 1.4', require: false
  gem 'capistrano-bundler'
  gem 'capistrano-passenger'
  gem 'capistrano-rvm'
end

รันคำสั่ง bundle ที่ command window เสร็จแล้วรันคำสั่ง bundle exec cap install STAGES=production ต่อ จะมี config ไฟล์ของ Capistrano ถูกสร้างขึ้นได้แก่ Capfile, config/deploy.rb และ config/deploy/production.rb

ให้แก้ไขไฟล์ Capfile ก่อนโดยใส่โค้ดต่อไปนี้ในบรรทัดสุดท้ายของไฟล์

require "capistrano/rvm"
require "capistrano/bundler"
require "capistrano/rails/assets"
require "capistrano/rails/migrations"
require "capistrano/passenger"

ต่อไปแก้ไขไฟล์ config/deploy.rb ให้มีโค้ดดังนี้ โดยเปลี่ยนชื่อ application และ repo_url ให้สอดคล้องกับแอพและ repository ของคุณ

lock "~> 3.11.0"

set :application, "memberwoot"
set :repo_url, "git@github.com:worrawutp/memberwoot.git"
set :deploy_to, "/home/memberwoot/memberwoot"
set :tmp_dir, "/home/memberwoot/tmp"
set :pty, true
set :rvm_ruby_version, '2.5.5'

set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/master.key', 'config/credentials.yml.enc')
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')

set :passenger_restart_with_sudo, false
set :passenger_restart_with_touch, false
set :passenger_rvm_ruby_version, '2.5.5'

before "deploy:assets:precompile", "deploy:yarn_install"
namespace :deploy do
  desc "Run rake yarn install"
  task :yarn_install do
    on roles(:web) do
      within release_path do
        execute("cd #{release_path} && yarn install --silent --no-progress --no-audit --no-optional")
      end
    end
  end
end

สุดท้ายแก้ไขไฟล์ config/deploy/production.rb โดยใส่โค้ดต่อไปนี้ลงไป

server "1.2.3.4",
  user: "memberwoot",
  roles: %w{web app db},
  ssh_options: {
    user: "memberwoot",
    keys: %w(~/.ssh/id_rsa_digitalocean),
    forward_agent: false,
    auth_methods: %w(publickey password)
  }

อย่าลืมเปลี่ยนค่าของ server IP ให้เป็น IP ของ Droplets และเปลี่ยนชื่อของ user และชื่อ public key ไฟล์ด้วย

เริ่ม Deploy ได้

ก่อนที่จะสั่ง deploy ให้เราแน่ใจว่าสถานะของ git ของโปรเจคไม่มีรายการรอ commit เหลืออยู่และ master branch ของเราอัพเดตตรงกับ git repository ของ github/bitbucket แล้ว ให้เปิด command line window ขึ้นมาแล้วไปที่ root directory ของโปรเจคแล้วรันคำสั่ง

$ bundle exec cap production deploy

สำหรับการ deploy แอพครั้งแรก เมื่อรันคำสั่งแล้วเราจะเจอ error เนื่องจาก Capistrano จะหา linked file ชื่อ database.yml, master.key และ credentials.yml.enc ใน Droplet VPS ไม่เจอ (ตามที่เราระบุไว้ในไฟล์ config/deploy.rb ก่อนหน้านั้น) เพราะเรายังไม่ได้เอาไปใส่ไว้ (ที่ต้องรันให้เกิด error ก่อนเพราะว่าผมต้องการแน่ใจว่า Capistrano สามารถ ssh ไปที่ Droplet VPS ของเราได้และสร้างโฟลเดอร์เอาไว้ให้เราก่อน) เราจะ copy ไฟล์ database.yml, master.key และ credentials.yml.enc จากเครื่อง local ไปไว้ที่ ไดเรกทอรี /home/memberwoot/memberwoot/shared/config ของ Droplet โดยใช้คำสั่ง scp ดังนี้

$ scp config/database.yml config/master.key config/credentials.yml.enc memberwoot@devwoot-rails-showcase:/home/memberwoot/memberwoot/shared/config

จากนั้นสั่ง bundle exec cap production deploy อีกครั้ง Capistrano ก็จะทำการ deploy โดยสังเหตุว่า Capistrano จะทำการรันคำสั่งหลายคำสั่งเพื่อเซตอัพโปรเจคโฟล์เดอร์ตั้งแต่รัน bundle, yarn install, asset precompile, database migration จนถึง restart passenger application ให้จนจบ

ขั้นตอนของการสั่ง deploy ก็มีเพียงเท่านี้ ถ้าเราอัพเดตโค้ดและต้องการจะ deploy ในครั้งต่อไป เราก็แค่ push repository จาก local ไปยัง remote แล้วรันคำสั่ง bundle exec cap production deploy เหมือนเดิม Capistrano ก็จะวิ่งไปหยิบเอาโค้ดของเราจาก remote repository มาทำการ compile และ deploy ไปยัง Droplet VPS ให้โดยอัตโนมัติ

Note อย่างที่ทราบว่าแอพ memberwoot ของผมพัฒนาบน Windows 10 แต่ทำการ deploy ไปยัง CentOs ผมถือโอกาสแชร์ปัญหาและแนวทางแก้ไขกับปัญหาที่เกี่ยวกับความแตกต่างของ platgorm ที่ผมเจอมาระหว่างการ deploy ดังนี้

  1. ก่อนทำการ deploy ให้แก้ไขไฟล์ในโฟลเดอร์ bin ทั้งหมด โดยให้ make sure ว่า path ของโปรแกรท ruby ที่ระบุอยู่ที่บรรทัดบนสุดของแต่ละไฟล์นั้นเป็น
    #!/usr/bin/env ruby
    

    ถ้ามี .exe ให้เอาออก

  2. ระหว่าง deploy คุณอาจเจอ error ขึ้นมาแบบนี้
    Your bundle only supports platforms ["x64-mingw32"] but your local platforms are
    ["ruby", "x86_64-linux"], and there's no compatible match between those two
    lists.
    

    แก้ไขได้โดยให้รันคำสั่งด้านล่างเพื่อเพิ่ม platform ruby และ x86_64-linux เข้าไปใน Gemfile.lock ทำการ commit และ push master repository ต่อไป

    $ bundle lock --add-platform ruby
    $ bundle lock --add-platform x86_64-linux
    

ตั้งค่า Nginx สำหรับโดเมน

เมื่อ deploy เสร็จแล้วเราก็ต้องการที่จะเข้ามาใช้แอพของเราในโหมด production บ้าง สิ่งที่คุณต้องมีก่อนคือ domain name ซึ่งต้องทำการเซตค่า DNS ใช้ชี้มาที่ server IP ของ Droplet VPS ของเรา จากนั้นจึงมาทำการเซตอัพ domain สำหรับแอพที่ฝั่ง Droplet VPS ซึ่งในที่นี้คือ memberwoot

ก่อนอื่นเราต้องหาค่าของ ruby-command ที่ passenger รู้จักก่อน โดยพิมพ์คำสั่ง

$ passenger-config about ruby-command

ในที่นี้ค่าที่ผมได้คือ /usr/local/rvm/gems/ruby-2.5.5/wrappers/ruby ซึ่งผมจะเอามันไปใส่ในไฟล์ .conf ของ Nginx ในขั้นตอนต่อไป

สร้างไฟล์ .conf ให้กับโดเมนของแอพและทำการแก้ไขโดยพิมพ์คำสั่งด้านล่าง (จะใช้ nano ก็ได้ถ้าคุณไม่ใช้ vi) ในที่นี้ผมสมมติว่าโดเมนที่ผมจะใช้รันแอพชื่อ memberwoot.devwoot.com

$ sudo vi /etc/nginx/conf.d/member.devwoot.conf

ใส่โค้ดด้านล่างนี้ลงไปในไฟล์ member.devwoot.conf

server {
        listen 80;
        server_name <ชื่อ server_name.com ของคุณ>;

        root /home/memberwoot/memberwoot/current/public;

        passenger_enabled on;
        passenger_ruby /usr/local/rvm/gems/ruby-2.5.5/wrappers/ruby;

        location ~ ^/(assets|packs) {
                expires max;
                gzip_static on;
        }
}

จากนั้นรันคำสั่งด้านล่างเพื่อ restart Nginx

$ sudo service nginx restart

เสร็จแล้วลองเปิดหน้าเว็บแอพขึ้นมาใหม่ เว็บแอพรันได้แล้วและสามารถเปิดเข้ามาดูได้จากโดเมนเนมที่เราเซ็ตไว้

Note ถ้าคุณใช้ CentOS เหมือนในโพสตัวอย่างนี้ คุณอาจจะเจอปัญหา Internal Error 500 นั้นเป็นเพราะ CentOS จะทำการเปิดใช้ SELinux เป็นค่าตั้งต้นซึ่งมันจะทำการควบคุมระบบรักษาความปลอดภัยโดยการจำกัดสิทธิของการเข้าถึงไฟล์ เราจะต้องทำการแก้ไขค่าตั้งต้นดังกล่าวก่อน โดยเปิดไฟล์ /etc/sysconfig/selinux ขึ้นมาแก้ไข (ใช้สิทธิ su) โดยเปลี่ยนบรรทัดที่มี SELINUX=enforcing ไห้เป็น SELINUX=disabled จากนั้นให้ทำการ reboot server ด้วยคำสั่ง

$ sudo systemctl reboot

รอสักพักให้ reboot เสร็จ แล้ว ssh login เข้ามาใหม่ จากนั้นทำการแก้ไข permission ของโฟลเดอร์ user ที่เราใช้ deploy แอพและโฟลเดอร์ของชื่อแอพ (จากตัวอย่างผมตั้งเป็นชื่อเดียวกัน) โดยอนุญาตให้ execute ได้ ในที่นี้ user ที่ deploy แอพของผมชื่อ memberwoot เราจะแก้ permission โดยใช้คำสั่ง

$ sudo chmod g+x,o+x /home/memberwoot
$ sudo chmod g+x,o+x /home/memberwoot/memberwoot

สุดท้ายให้ restart Nginx ด้วยคำสั่ง $ sudo service nginx restart แล้วรีเฟรสเบราเซอร์ใหม่ก็จะเห็นว่าสามารถเข้าแอพได้แล้ว

สรุป

ในตอนนี้เราได้ทำการ setup ทั้ง Phussion passenger ซึ่งเป็น application server และ Nginx ซึ่งเป็น web server และใช้ Capistrano ในการทำ automatic deployment ตาม capistrano script ที่เรากำหนด

เป็นอย่างไรบ้างครับกับการ deploy แอพ Rails บน Digital Ocean แรกๆ หลายท่านอาจจะรู้สึกว่า โห แค่ deploy แอพทำไมมันหลายขั้นตอนยุ่งยากอะไรขนาดนี้ ไม่แปลกครับ เพราะจากวันแรกที่ผม Deploy Rails เพื่อไปรันในโหมด production จนวันนี้ ผมก็ยังรู้สึกว่ามันยุ่งยากหลายขั้นตอนอยู่ เพียงแต่ว่าทำหลายครั้งจนเริ่มชินขึ้นมาแล้วเท่านั้นเอง

ถึงแม้ว่ามันจะดูยุ่งยากไปหน่อย แต่มันก็ไม่ถึงกับยากจนเกินไป โดยส่วนตัวแล้วผมก็ยังเห็นว่าการ deploy ผ่าน Cloud VPS อย่าง Digital Ocean ก็ยังเป็นตัวเลือกอันดับต้นๆ ของผมอยู่ในเวลาที่ผมเขียนโพสอยู่ขณะนี้ ถึงแม้ว่าจะมีทางเลือกมากขึ้นในการ deploy แอพ Rails อย่างเช่น การใช้บริการของ AWS Elastic Beanstalk หรือ Google Cloud Platform ซึ่งผมเคยเขียนโพสเกี่ยวกับการ deploy แอพ Rails บน GCP App Engine ไป ก่อนหน้านั้น

ทั้งนี้อาจเป็นเพราะว่าผมมีความมั่นใจกับขั้นตอนและวิธีการเซ็ตอัพแอพ Rails เพื่อรันบน VPS Cloud อย่าง Digital Ocean ว่ายังไงผมก็สามารถ deploy สำเร็จได้อย่างแน่นอน และค่าใช้จ่ายก็ยังอยู่ในระดับที่จ่ายได้ ในขณะที่ 2 อย่างหลังผมเคยใช้แต่ไม่ค่อยประทับใจเท่าไหร่ ท่านไหนลอง deploy แอพ Rails เป็นอย่างไรกันบ้าง ทักมาแลกเปลี่ยนประสบการณ์กันบ้างนะครับ

แชร์โพสได้จากลิ้งด้านล่าง ขอบคุณครับ