Setup staging สำหรับการ deploy Rails แอพ ด้วย Capistrano

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

ในโพสนี้ผมสมมติเราเคย deploy Rails แอพโดยใช้ capistrano มาบ้างแล้ว และในครั้งนี้เราก็จะใช้ capistrano เช่นกันในการ deploy แอพสำหรับสภาวะ staging โดยแอพที่รันเป็น staging ก็ยังรันอยู่บน server เดียวกับของ production แต่เราจะใช้ database เป็นของ staging เอง ไม่ปนกับ database ของ production ซึ่งมีขั้นตอนดังนี้

แก่ไขไฟล์ /config/deploy/staging.rb โดยหน้าตาของโค้ดคอนฟิกจะคล้ายๆ กับไฟล์ /config/deploy/production.rb จะต่างกันตรงที่เราจะต้องทำการระบุ ค่าของ stage และระบุค่าของ rails_env เพื่อบอก capistrano ว่าเรากำลังจะ deploy ภายใต้สภาวะ staging นะ

set :stage, :staging
set :rails_env, :staging

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

เราจะต้องบอก Rails ด้วยว่าจะ setup แอพอย่างไรภายใต้สถาวะ staging โดยสร้างไฟล์ /config/environments/staging.rb ในที่นี้ผมอยากให้แอพของเรามีค่า setting เหมือนกับสภาวะที่เป็น production ดังนั้นเราก็จะอ้างอิงโค้ดของ production.rb โดยใส่โค้ดด้านล่างลงไปในไฟล์ staging.rb

require File.expand_path('../production.rb', __FILE__)

สำหรับโพสนี้ ผมจะ set ให้ Rails แอพ ที่รันภายใต้ staging ใช้ฐานข้อมูลแยกจากฐานข้อมูล production ที่มีคนใช้จริง ในกรณีที่เราจะต้องทำการแก้ไข ทดลอง หรือดีบักจะได้ไม่กระทบกับข้อมูลของผู้ใช้ ดังนั้นให้แก้ไขไฟล์ database.yml โดยเพิ่มสถานะ :stating เข้าไป และบอกว่าถ้าอยู่ในสภาวะ staging แล้วให้หันมาใช้ database ที่ชื่อ myapp_staging แทน

default: &default
  adapter: postgresql
  encoding: utf8
  pool: 5

production:
  <<: *default
  database: myapp_production

staging:
  <<: *default
  database: myapp_staging

สมมติว่าผมมีโดเมนอยู่แล้วชื่อ myapp.com และแอพของผมก็รัน production อยู่ที่ myapp.com เพื่อให้ง่ายต่อการจำ ผมเลยอยากเซต url ของการเข้าแอพในโหมดของ staging ให้เป็น staging.myapp.com สิ่งที่ผมต้องทำก็คือ เข้าไปเพิ่มโดเมนคอนฟิกไฟล์สำหรับ staging.myapp.com ที่ web server (ผมใช้ nginx เป็น webserver และใช้ Phusion passenger เป็น application server ครับ) โดยเข้าไปที่ /etc/nginx/conf.d/ แล้วทำการสร้างไฟล์ staging_myapp.conf โดยมีเนื้อหาในไฟล์ดังนี้

server {
  server_name staging.myapp.com;
  root /path/to/myapp/current/public;

  passenger_app_env staging;
  passenger_enabled on;
  passenger_ruby /usr/local/rvm/gems/ruby-2.4.3/wrappers/ruby;
}

จากนั้นรันคำสั่ง $ sudo service nginx restart

Note: ในส่วนของโดเมนเราจะต้องเข้าไป config ที่หน้า dashboard ของผู้ให้บริการโดเมนที่เราใช้บนิการอยู่ โดยเข้าไปเพิ่มค่า staging ใน A Record ของโดเมน ซึ่งในทีนี้ก็คือ myapp.com

กลับมาที่เครื่อง local development ของเรา ตอนนี้ทุกอย่างพร้อมแล้ว เราจะทำการ deploy แอพของเราในสภาวะ staging ได้โดยใช้คำสั่ง

$ bundle exec cap staging deploy

แล้วรอ caspistrano รันจนจบแค่นี้ก็เรียบร้อย เราสามารถเข้าไปดูแอพที่รันในสถานะ staging ได้โดยเปิดเบราเซอร์ขึ้นมาแล้วเข้าไปที่ staging.myapp.com

ขอให้โชคดีครับ

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