+1

Deploy với Ubuntu VPS (Phần 4): Zero-downtime Deployment

DÁM MƠ LỚN, ĐỪNG PHÍ HOÀI TUỔI TRẺ - là cuốn sách dạo gần đây mình đọc. Trong đó có câu:

Những ngày mười tám đôi mươi ta đều mơ những giấc mơ lớn, đều khao khát đạp tung tất cả để bay ra khỏi vòng tay của gia đình, mẹ cha.

Những ngày hăm lăm nhìn lại hình như giấc mơ đã tiêu hao đi ít nhiều… Ta chậm lại, bớt kì vọng hơn, cũng bớt nỗ lực hơn.

Để rồi những bộn bề của cuộc sống cuốn giấc mơ của bạn đi như dòng nước hững hờ cuốn trôi chiếc lá. Cứ thế, bạn vội vã trưởng thành, vội vã yêu, vội vã sống, vội vã quên đi khát khao mình từng có.

Bung mình ra sống một đời nhiệt huyết rực rỡ hay thu mình lại bình bình yên yên nơi góc nhà… lựa chọn là ở bạn?

Chính những dòng này đã khiến mình bật máy lên để hoàn thành nốt series về deploy. Nó ko phải là ước mơ gì lớn lao, nhưng nó là mong muốn trước kia của mình. Tiếp nối các bài viết trong series này, bài này mình sẽ chia sẻ về Zero-downtime, chiến thuật deploy phổ biến và hiệu quả.

1. Tìm hiểu và cài đặt tool Deployer ở máy local

Zero-downtime được hiểu là cách deploy ko có thời gian chết - cái tên nó như thế mà =)). Nói là Zero-downtime nhưng để đạt được điều này cần phải kết hợp rất nhiều yếu tố: thiên thời, địa lợi, ông bà phù hộ...

  • Cài đặt deployer
    curl -LO https://deployer.org/deployer.phar
    
  • Move deployer.phar vào thư mục dep
    sudo mv deployer.phar /usr/local/bin/dep
    
  • Thêm quyền execute cho thư mục dep
    chmod +x /usr/local/bin/dep
    

2. Clone source code từ github về local và setup config cho Deployer

Các bạn clone dự án từ github về máy local, sau đó vào thư mục dự án và tạo branch mới cho việc setup deployer nhé. VD: git checkout -b task/#1/setup_deployer

  • Khởi tạo file deploy.php
    dep init
    
  • Sửa file deploy.php: Các bạn có thể vào link này để xem config của mình. Nếu các bạn có thắc mắc về một vài config bị comment đi, thì ở phía dưới mình có giải thích nhé.

3. Cho phép máy local được phép ssh vào user deploy trên server

  • Lấy ssh-key của máy local
    cat ~/.ssh/id_rsa.pub
    
  • ssh lên server bằng user của mình và chuyển sang user deploy
    sudo su deploy
    
  • Truy cập vào folder .ssh của user deploy
    cd /home/deploy/.ssh/
    
  • Tạo file authorized_keys
    touch authorized_keys
    
  • Thêm quyền 600 cho file mới tạo
    chmod 600 authorized_keys
    
  • Sửa file này bằng Vim
    vi authorized_keys
    
  • Paste ssh-key vừa lấy được dưới máy local vào file này: Các bạn có thể search các phím tắt khi sử dụng Vim để thao tác với file này nhé.
  • Kiểm tra xem đã ssh được bằng user deploy chưa
    ssh deploy@45.76.190.30
    

4. Kiểm tra config và tiến hành deploy thử từ local lên server

  • Trong lần chạy đầu tiên, sửa file deploy.php
    • Comment dòng before('deploy:symlink', 'artisan:migrate');
    • Lần chạy tiếp theo ko cần comment.
    • Vì sao phải comment trong lần chạy đầu tiên? Vì chưa có config của database trong file .env trên server.
  • Chạy Deployer dưới local
    dep deploy production
    

Các lưu ý khi chạy deployer:

  • Nếu thông báo lỗi "... User Closure":

    1. Comment 3 dòng sử dụng Closure function trong routes/api.php
    2. Sửa file routes/web.php: Route::view('/', 'welcome');
  • Nếu thông báo lỗi "sudo: no tty present and no askpass program specified":

    1. ssh lên server với user deploy
    2. sudo vi /etc/sudoers
    3. Sửa %sudo ALL=(ALL:ALL) ALL thành %sudo ALL=(ALL:ALL) NOPASSWD:ALL
  • Nếu thông báo lỗi thiếu thư viện unzip khi chạy task deploy:vendors

    sudo apt-get install unzip
    

5. Thay đổi virtual host để trỏ Web Application về thư mục vừa deploy

  • ssh lên server:
    ssh deploy@45.76.190.30
    
  • Truy cập vào thư mục current chứa code mới nhất vừa deploy xong:
    cd game_from_avengers_with_love/current
    
  • Tạo file .env từ file .env.example
    cp .env.example .env
    
  • Generate key
    php artisan key:generate
    
  • Sửa lại config DB trong .env
    vi .env
    
  • Sửa file deploy.conf
    sudo vi /etc/nginx/conf.d/deploy.conf
    
  • Trỏ đường dẫn root về current/public
    root /home/deploy/code/game_from_avengers_with_love/public;
    
    thành
    root /home/deploy/game_from_avengers_with_love/current/public;
    
  • Restart lại nginx
    sudo service nginx restart
    

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí