0

Deploy Ứng Dụng Laravel sử dụng Deployer

Prerequisites

  • Ubuntu 16.04
  • LEMP (Linux, Nginx, MySQL, PHP)
  • PHP (php-xml, php-mbstring), Composer, Git

Step 1 — Setting up your Local Development Environment

  • Ta sẽ tạo và deploy ứng dụng laravel từ local, nên ta cần cấu hình môi trường phát triển local trước, Deployer sẽ kiểm soát quá trình deploy từ local lên server
  • Trên local, ta mở terminal và download Deployer installer sử dụng curl
    curl -LO https://deployer.org/deployer.phar
    
  • Tiếp theo ta cần rerify bộ cài đặt vừa download về bằng đoạn mã php sau
    php -r "if (hash_file('sha1', 'deployer.phar') === '35e8dcd50cf7186502f603676b972065cb68c129') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('deployer.phar'); } echo PHP_EOL;"
    
  • 35e8dcd50cf7186502f603676b972065cb68c129 là chuỗi hash SHA-1, ta cần thay chuỗi hash này bằng chuỗi hash mới nhất tại trang: Deployer - download page
  • Và kết quả ta thu được:
    Output
    Installer verified
    
  • Để cài đặt ta chạy câu lệnh sau:
    sudo mv deployer.phar /usr/local/bin/dep
    sudo chmod +x /usr/local/bin/dep
    
  • Tất nhiên ta cũng cần tạo một ứng dụng Laravel rồi:
    composer create-project --prefer-dist laravel/laravel laravel-app
    
  • Sau khi cấu hình xong môi trường ở local, ta sẽ tiến hành tạo repository trên Git và đẩy ứng dụng laravel của mình lên

Step 2 — Connecting to Your Remote Git Repository

  • Tạo ssh key trên local
    ssh-keygen -t rsa -b 4096 -f  ~/.ssh/gitkey
    
  • Kết quả của câu lệnh trên là cặp ssh key gitKeygitKey.pub được tạo ra bên trong thư mục ~/.ssh
  • Tạo file config ssh
    touch ~/.ssh/config
    
  • Và update nội dung bên trong
    Host mygitserver.com
        HostName mygitserver.com
        IdentityFile ~/.ssh/gitkey
    
  • Nếu ta sử dụng github thì HostName ở đây chính là github.com
  • Lưu file config lại và phân quyền cho nó
    chmod 600 ~/.ssh/config
    
  • Tiếp theo ta sẽ thực hiện copy gitpub.pub lên Git server theo theo hướng dẫn sau
  • Test kết nối với Git
    ssh -T git@mygitserver.com
    

Step 3 — Configuring the Deployer User

  • Ở bước này ta sẽ tiến hành tạo user Deployer trên server
  • Tạo user
    sudo adduser deployer
    
  • Thêm user deloyer vào group www-data để cấp quyền ghi log, cache, và upload file
    sudo usermod -aG www-data deployer
    sudo chfn -o umask=022 deployer
    sudo chown deployer:www-data /var/www/html
    sudo chmod g+s /var/www/html
    
  • Chuyển sang user deployer
    su - deployer
    
  • Tạo cặp ssh key để có thể kéo code về server
    ssh-keygen -t rsa -b 4096
    
  • Hiện thị public key với lệnh
    cat ~/.ssh/id_rsa.pub
    
  • Copy public key này lên github tương tự như ở Step 2
  • Ở trên local, ta cũng tạo cặp ssh key để có thể ssh trực tiếp vào user Deployer trên server
    ssh-keygen -t rsa -b 4096 -f  ~/.ssh/deployerkey
    
  • Copy public key
    cat ~/.ssh/deployerkey.pub
    
  • Lên server, paste key vừa copy vào file sau
    nano ~/.ssh/authorized_keys
    
  • Phân quyền và thoát
    chmod 600 ~/.ssh/authorized_keys
    exit
    
  • Giờ đây ta có thể ssh trực tiếp vào user deployer với command sau:
    ssh deployer@your_server_ip  -i ~/.ssh/deployerkey
    

Step 4 — Configuring Nginx

  • Trước tiên ta cần xóa bỏ config mặc định của nginx
    sudo rm /etc/nginx/sites-available/default
    
  • Thêm config mới
    sudo nano /etc/nginx/sites-available/example.com 
    
  • Với nội dung như sau:
        server {
            listen 80;
            listen [::]:80;
    
            root /var/www/html/laravel-app/current/public;
            index index.php index.html index.htm index.nginx-debian.html;
    
            server_name example.com www.example.com;
    
            location / {
                    try_files $uri $uri/ /index.php?$query_string;
            }
    
    
            location ~ \.php$ {
                    include snippets/fastcgi-php.conf;
    
                    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
                    fastcgi_param DOCUMENT_ROOT $realpath_root;
    
                    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    
            }
    
            location ~ /\.ht {
                    deny all;
            }
    
    }
    
  • Lưu ý: bạn cần thay các phiên bản php tương tứng, domain hay thư mục gốc tương ứng của bạn vào nhé
  • Tạo Symbolic link đến thư mục sites-enabled
    sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
    
  • Check cú pháp bằng câu lệnh
    sudo nginx -t
    
  • Khởi động lại nginx
    sudo systemctl restart nginx
    

Step 5 — Configuring MySQL

  • Login vào MySql với user root (Sau đó nhập vào password là root nhé, đây là mặc định)
    mysql -u root -p
    
  • Tạo database
    mysql> CREATE DATABASE laravel_database DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  • Tạo user
    mysql> CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'password';
    
  • Cấp quyền cho user laravel_user vừa tạo
    mysql> GRANT ALL ON laravel_database.* TO 'laravel_user'@'localhost';
    
  • Reload và exit
    mysql> FLUSH PRIVILEGES;
    mysql> EXIT;
    

Step 6 — Deploying the Application

  • Di chuyển vào thư mục root của ứng dụng
    cd /path/to/laravel-app
    
  • Từ thư mục gốc này ta sẽ tạo file deploy.php để chứa các thông tin cấu hình và các task để thực hiện deploy
    dep init -t Laravel
    
  • Ta sẽ tiến hành update file deploy.php vừa tạo ra
        ...
    // Project name
    set('application', 'laravel-app');
    
    // Project repository
    set('repository', 'git@mygitserver.com:username/repository.git');
    
    . . .
    
    // Hosts
    
    host('your_server_ip')
        ->user('deployer')
        ->identityFile('~/.ssh/deployerkey')
        ->set('deploy_path', '/var/www/html/laravel-app');
    
  • Tiếp theo ta cần bỏ comment sau đi before('deploy:symlink', 'artisan:migrate');
        ...
    // Migrate database before symlink new release.
    
    //before('deploy:symlink', 'artisan:migrate');
    
  • Việc làm này sẽ giúp ta tự động chạy migrate để cập nhật DB mỗi lần deploy
  • Trước khi thực hiện deploy, ta cần tạo và đẩy code lên repo Github
        git init
        git add .
        git commit -m 'Initial commit for first deployment.'
        git remote add origin git@mygitserver.com:username/repository.git
        git push origin master
    
  • Và cuối cùng ta dùng lệnh dev để deploy ứng dụng
        dep deploy
    
  • Nếu mọi cấu hình bên trên của ta không có vấn đề gì thì kết quả ta thu được sẽ như sau
    Deployer's output
    ✈︎ Deploying master on your_server_ip
    ✔ Executing task deploy:prepare
    ✔ Executing task deploy:lock
    ✔ Executing task deploy:release
    ➤ Executing task deploy:update_code
    ✔ Ok
    ✔ Executing task deploy:shared
    ✔ Executing task deploy:vendors
    ✔ Executing task deploy:writable
    ✔ Executing task artisan:storage:link
    ✔ Executing task artisan:view:clear
    ✔ Executing task artisan:cache:clear
    ✔ Executing task artisan:config:cache
    ✔ Executing task artisan:optimize
    ✔ Executing task deploy:symlink
    ✔ Executing task deploy:unlock
    ✔ Executing task cleanup
    Successfully deployed!
    
  • Lên server kiểm tra thư mục /var/www/html/laravel-app ta sẽ thấy cấu trúc bên dưới:
    ├── .dep
    ├── current -> releases/1
    ├── releases
    │   └── 1
    └── shared
        ├── .env
        └── storage
    
  • releases là thư mục chứa các phát hành
  • current là symlink đến bản phát hành cuối
  • .dep là thư mục chứa dữ liệu đặc biệt phục vụ cho Deployer
  • shared là thư mục chưa file cầu hình .env và thư mục storage, nó sẽ được symlink đến bản phát hành tương ứng
  • Tất nhiên tới đây ứng dụng của ta vẫn chưa thể hoạt động được vì file cấu hình .env vẫn đang rỗng, ta sẽ tiến hành cấu hình server ngay bây giờ
  • Login server sử dụng user deployer
    ssh deployer@your_server_ip  -i ~/.ssh/deployerkey
    
  • Mở file .env lên
    nano /var/www/html/laravel-app/shared/.env
    
  • Và update nó như sau:
    APP_NAME=Laravel
    APP_ENV=production
    APP_KEY=base64:cA1hATAgR4BjdHJqI8aOj8jEjaaOM8gMNHXIP8d5IQg=
    APP_DEBUG=false
    APP_LOG_LEVEL=error
    APP_URL=http://example.com
    
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=laravel_database
    DB_USERNAME=laravel_user
    DB_PASSWORD=password
    
    BROADCAST_DRIVER=log
    CACHE_DRIVER=file
    SESSION_DRIVER=file
    QUEUE_DRIVER=sync
    
    REDIS_HOST=127.0.0.1
    REDIS_PASSWORD=null
    REDIS_PORT=6379
    
  • Tất nhiên bên trên chỉ là ví dụ, ta cần thay cấu hình tương ứng vào:APP_URL, APP_KEY, DATABASE,...
  • Sau khi cấu hình xong server ta sẽ quay lại local và thực hiện deploy
    dep deploy
    
  • Kết quả thu được sau khi deploy tại link: (http://example.com)

Step 7 — Running a Typical Deployment

  • Để thực hiện deploy, ta chỉ cần thực hiện đơn giản như ví dụ sau:
  • Sửa 1 file bất kỳ, ví dụ ta sửa file routes/web.php
    <?php
    
    . . .
    
    Route::get('/', function () {
        return view('welcome');
    });
    
    Route::get('/greeting', function(){
        return 'Welcome!';
    });
    
  • Sau đó commit:
    git commit -am 'Your commit message.'
    
  • Push code lên Git
    git push origin master
    
  • Chạy câu lệnh deploy
    dep deploy
    

Tài liệu tham khảo

How to Automatically Deploy Laravel Applications with Deployer on Ubuntu


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í