Capistrano

Capistrano เป็นเครื่องมือ open-source สำหรับการรันสคริปต์บนเซิร์ฟเวอร์ระยะไกลโดยทั่วไปจะใช้สำหรับการ deploy แอปผ่านการเชื่อมต่อ SSH Capistrano เขียนด้วย Ruby เป็นส่วนประกอบของ Ruby on Rails framework ดังนั้นจึงใช้กันอย่างแพร่หลายสำหรับการ deploy แอป Ruby อย่างไรก็ตาม มันสามารถทำงานร่วมกับภาษาโปรแกรมอื่นๆได้อย่างง่ายดายเช่น php

ในบทความนี้มาดูวิธีการ deploy แอปพลิเคชัน php จากระยะไกลผ่านเครื่องมือ Capistrano ในขั้นตอนแรกคุณจะต้อง:

  • สร้าง PHP environment ด้วย Apache แอปพลิเคชันเซิร์ฟเวอร์
  • การสร้าง SSH public key และเพิ่มไปยัง Ruk-Com Cloud แดชบอร์ด
  • GIT repository เพื่อเก็บแอปพลิเคชัน php ที่คุณต้องการ deploy (สำหรับตอนนี้เครื่องมือ Capistrano 3 รองรับประเภท GIT VCS เท่านั้น)
  • คัดลอกโปรเจกต์นี้ไว้ที่เครื่องของคุณ

หมายเหตุ: คำสั่งด้านล่างควรดำเนินการกับเครื่องของคุณเช่นเดียวกับที่คุณใช้ในระหว่างการสร้างคู่คีย์ SSH เพื่อหลีกเลี่ยงข้อผิดพลาดในการอนุญาต/การเชื่อมต่อ

การติดตั้ง Capistrano

1. การใช้ Capistrano คุณต้องติดตั้ง Ruby ที่เครื่องคอมพิวเตอร์ของคุณโดยรันคำสั่งนี้:

apt-get install ruby rubygems

2. จากนั้นติดตั้งเครื่องมือ Capistrano โดยป้อนคำสั่งต่อไปนี้:

gem install capistrano

3. ตรวจสอบให้แน่ใจว่าคุณมีโฟลเดอร์ config ในไดเร็กทอรีที่เครื่องของคุณพร้อมกับโปรเจ็กต์ (เนื่องจากเป็นโฟลเดอร์เริ่มต้นที่มีการกำหนดค่าสำหรับ Ruby on Rails) หากคุณไม่มี ให้สร้างโฟลเดอร์นี้:

mkdir {path_to_your_project}/config

Capify แอปพลิเคชันของคุณ

หลังการติดตั้ง คุณต้อง capify แอปพลิเคชันของคุณ เช่นกำหนดค่า Capistrano สำหรับการ deploy แอปโดยไปที่โฟลเดอร์ root ของโปรเจกต์ php และดำเนินการคำสั่งนี้:

cap install

สิ่งนี้จะสร้างไฟล์และไดเร็กทอรีใหม่ในโครงการของคุณ:

  • Capfile คือไฟล์ Capistrano หลักที่ดูแลการกำหนดค่าและ globs ที่จำเป็นสำหรับงานที่กำหนดเอง
  • config/deploy/ โฟลเดอร์ที่มีสองไฟล์ (staging.rb และ production.rb) สำหรับการตั้งค่าการ deploy เฉพาะของ environment
  • config/deploy.rb Ruby script ที่มีการกำหนดค่าแอปพลิเคชันและคำแนะนำ Capistrano
  • lib/capistrano/tasks/ โฟลเดอร์สำหรับงานที่คุณกำหนดเอง

เคล็ดลับ: คุณสามารถลองใช้ capistrano-jelastic gem ที่ดูแลโดย gerado-navarro เพื่อ deploy แอป Relis ให้เป็น PaaS & IaaS โดยอัตโนมัติ

ตั้งค่าการกำหนดค่าเอง

1. ไปที่ไฟล์ config/deploy.rb และกำหนดค่าให้สอดคล้องกับการตั้งค่าของคุณ ในขั้นต้นจะดูเหมือนรูปแบบนี้:

# config valid only for Capistrano 3.1
    lock '3.2.1'
    
    set :application, 'my_app_name'
    set :repo_url, '[email protected]:me/my_repo.git'
    
    # Default branch is :master
    # ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call
    
    # Default deploy_to directory is /var/www/my_app
    # set :deploy_to, '/var/www/my_app'
    
    # Default value for :scm is :git
    # set :scm, :git
    
    # Default value for :format is :pretty
    # set :format, :pretty
    
    # Default value for :log_level is :debug
    # set :log_level, :debug
    
    # Default value for :pty is false
    # set :pty, true
    
    # Default value for :linked_files is []
    # set :linked_files, %w{config/database.yml}
    
    # Default value for linked_dirs is []
    # set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
    
    # Default value for default_env is {}
    # set :default_env, { path: "/opt/ruby/bin:$PATH" }
    
    # Default value for keep_releases is 5
    # set :keep_releases, 5
    
    namespace :deploy do
    
      desc 'Restart application'
      task :restart do
        on roles(:app), in: :sequence, wait: 5 do
          # Your restart mechanism here, for example:
          # execute :touch, release_path.join('tmp/restart.txt')
        end
      end
    
      after :publishing, :restart
    
      after :restart, :clear_cache do
        on roles(:web), in: :groups, limit: 3, wait: 10 do
          # Here we can do anything such as:
          # within release_path do
          #   execute :rake, 'cache:clear'
          # end
        end
      end
    
    end

แก้ไขสตริงต่อไปนี้:

  • ใส่ชื่อแอปพลิเคชันของคุณ
set :application, "my_app_name"
  • ระบุ URL ไปยัง VSC repository ด้วยโค้ดแอปพลิเคชัน PHP
set :repo_url, "[email protected]:me/my_repo.git"

หมายเหตุ: คุณต้องแนบ SSH public key กับบัญชี GIT ของคุณ (อันเดียวกับที่คุณเพิ่มลงในแดชบอร์ด) มิฉะนั้นคุณจะได้รับ “การอนุญาตถูกปฏิเสธ”; เกิดข้อผิดพลาดขณะพยายาม deploy แอปพลิเคชันของคุณ

คุณสามารถใช้ลิงก์ https: ประเภทต่อไปนี้:
set :repo_url, “https://example.net/GIT_user_name/repo_name.git”

ในกรณีนี้ไม่จำเป็นต้องมีการตรวจสอบสิทธิ์และคุณสามารถระบุ URL ไปยัง PHP open-source repository ที่คุณต้องการ deploy


  • ยกเลิกคอมเมนต์บรรทัดต่อไปนี้และระบุไดเร็กทอรีที่แอปพลิเคชันที่คุณจะ deploy (โดยค่านี้เป็นค่าเริ่มต้นสำหรับ PHP app servers):
# set :deploy_to, '/var/www/webroot'
  • ยกเลิกคอมเมนต์บรรทัดต่อไปนี้
set :scm, :git
set :format, :pretty
set :pty, true
  • ลบสตริงที่มีโค้ดต่อท้ายไฟล์ (เริ่มต้นจากคำสั่ง namespace :deploy do) และวางบรรทัดต่อไปนี้แทน:
namespace :deploy do
        desc 'Restart Apache'
        task :apache do
            on roles(:app) do
                execute :sudo, "service httpd restart"
            end
        end
    
        desc 'Creating symlink'
        task :symlink do
            on roles(:app) do
                execute :rm, "-rf /var/www/webroot/ROOT"
                execute :ln, "-s /var/www/webroot/current /var/www/webroot/ROOT"
            end
        end
    
        desc 'Restart Apache and create symlink'
        task :restart
        before :restart, :symlink
        before :restart, :apache
    
    end
    
    after 'deploy:publishing', 'deploy:restart'

คุณสามารถกำหนดค่าเพิ่มเติมได้ในไฟล์นี้ (เช่น ระบุสาขาของ repository หรือลิงก์ไฟล์/โฟลเดอร์เพิ่มเติม)

กดปุ่ม Save เพื่อบันทึกการเปลี่ยนแปลง

2. จากนั้นไปที่ไฟล์ config/deploy/staging.rb เนื้อหาเริ่มต้นคือ:

# Simple Role Syntax
    # ==================
    # Supports bulk-adding hosts to roles, the primary server in each group
    # is considered to be the first unless any hosts have the primary
    # property set.  Don't declare `role :all`, it's a meta role.
    
    role :app, %w{[email protected]}
    role :web, %w{[email protected]}
    role :db,  %w{[email protected]}
    
    # Extended Server Syntax
    # ======================
    # This can be used to drop a more detailed server definition into the
    # server list. The second argument is a, or duck-types, Hash and is
    # used to set extended properties on the server.
    
    server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value
    
    # Custom SSH Options
    # ==================
    # You may pass any option but keep in mind that net/ssh understands a
    # limited set of options, consult[net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start).
    #
    # Global options
    # --------------
    #  set :ssh_options, {
    #    keys: %w(/home/rlisowski/.ssh/id_rsa),
    #    forward_agent: false,
    #    auth_methods: %w(password)
    #  }
    #
    # And/or per server (overrides global)
    # ------------------------------------
    # server 'example.com',
    #   user: 'user_name',
    #   roles: %w{web app},
    #   ssh_options: {
    #     user: 'user_name', # overrides user setting above
    #     keys: %w(/home/user_name/.ssh/id_rsa),
    #     forward_agent: false,
    #     auth_methods: %w(publickey password)
    #     # password: 'please use keys'
    #   }

ขั้นตอนแรกให้คุณแก้ไข Role 3 ส่วน: Simple Role Syntax โดยวาง {[email protected]} แทน {[email protected]} ใช้ค่าต่อไปนี้:

  • nodeid – ค่าโหนดไอดีของคอนเทนเนอร์ Apache แอปพลิเคชันเซิร์ฟเวอร์ใน environment ของคุณ
  • uid – ตัวเลขก่อนสัญลักษณ์ @ ในการเชื่อมต่อ SSH หลังจากนั้นแก้ไขบรรทัดการตั้งค่าเซิร์ฟเวอร์ (ในส่วนของ Extended Server Syntax):
  • ระบุโฮสต์ SSH ของคุณ เช่นเซิร์ฟเวอร์ ‘gate.manage.ruk-com.cloud
  • ใส่ค่า {nodeid}_{uid} สำหรับพารามิเตอร์ user เช่น user: ‘190403-136’ ดังนั้นการตั้งค่าเซิร์ฟเวอร์ของคุณจะมีลักษณะดังนี้
server 'gate.manage.ruk-com.cloud', user: '190403-136', roles: %w{web app}, my_property: :my_value

ขั้นตอนสุดท้ายระบุพอร์ตเซิร์ฟเวอร์ที่จะใช้สำหรับการเชื่อมต่อ SSH:

set :ssh_options, {
    port: 3022
}

อย่าลืมกดปุ่ม Save เพื่อบันทึกการกำหนดค่าด้วยตนเอง

3. เปิด Capfile (อยู่ในโฟลเดอร์ root ในโปรเจกต์เครื่องของคุณ) และเพิ่มหนึ่งบรรทัดนี้เข้าไป:

Rake::Task[:staging].invoke

กำหนดค่า SSH Agent

1. ตรวจสอบให้แน่ใจว่าคุณมี ssh-agent ที่ทำงานอยู่ในระบบของคุณ

2. เพิ่ม private SSH key ของคุณไปยัง agent ซึ่งควรสอดคล้องกับ public SSH key ที่คุณเพิ่มไปในแดชบอร์ด

ssh-add {full_path_to_the_necessary_private_SSH_key}

3. คุณสามารถตรวจสอบว่าเพิ่มคีย์ได้ถูกต้องหรือไม่โดยป้อนคำสั่ง ssh-add -lcommand

ตรวจสอบการกำหนดค่า

คุณสามารถตรวจสอบให้แน่ใจว่าทุกอย่างได้รับการกำหนดค่าอย่างถูกต้องโดยไปที่โฟลเดอร์ root ที่เครื่องของคุณแล้วพิมพ์คำสั่งด้านล่าง:

cap staging deploy:check

Capistrano จะเชื่อมต่อกับคอนเทนเนอร์ระยะไกล สร้างโฟลเดอร์ที่จำเป็นในไดเร็กทอรีที่ deploy (ระบุไว้ในพารามิเตอร์ set :deploy_to) และตรวจสอบเซิร์ฟเวอร์ทั้งระยะไกลและภายในเครื่องเพื่อดูว่ามีไฟล์ที่จำเป็นทั้งหมด เช่น สิทธิ์ที่จำเป็น เครื่องมือ ฯลฯ อยู่หรือไม่

หากมีสิ่งใดผิดพลาดไป คุณจะได้รับข้อความแสดงข้อผิดพลาดที่เกี่ยวข้อง

Deploy Application

ดำเนินการ deploy แอปพลิเคชันของคุณโดยรันคำสั่งด้านล่างในโฟลเดอร์ root ของโปรเจ็กต์:

cap staging deploy

เมื่อการดำเนินการนี้เสร็จสมบูรณ์ ให้ไปที่ URL ของ environment และตรวจดูให้แน่ใจว่าได้ deploy แอปของคุณเรียบร้อยแล้ว