I. SETUP trên server
Cấu hình Deployer User
1.1 Khởi tạo deployer user
Deployer sử dụng giao thức SSH để thực hiện các command trên server. Do đó, ở bước đầu tiên, chúng ta sẽ tạo ra một user mới, cái mà Deployer có thể dùng để login vào và thực hiện các command qua SSH.
Server yêu cầu chạy Linux và đã cài LEMP Stack (Linux + Nginx + MySQL/MongoDB + PHP).
Bắt đầu tạo user mới có tên là deployer và cấu hình nó:
$ sudo adduser deployer
Laravel cần quyền đọc ghi dữ liệu để lưu cache file và upload file. Do đó, các thư mục tạo bởi deployer phải có quyền đọc ghi qua Nginx web server. Thêm nhóm quyền nginx vào user deployer bằng command sau:
$ sudo usermod -aG nginx deployer
Tiếp theo, cần cấu hình mặc định quyền khi tạo mới file, folder bằng user deployer là 644 (file) và 755 (folder). Điều này giúp cho deployer có thể đọc và ghi file, trong khi các nhóm hoặc user khác có thể đọc được.
Thực hiện cấu hình này bằng lệnh umask =022 như sau:
$ sudo chfn -o umask=022 deployer
Source code upload lên server sẽ lưu ở /var/www/html/laravel-app, nên chúng ta cần đổi ownership của folder cho user deployer và nhóm người dùng nginx:
$ sudo chown deployer:nginx /var/www/html/laravel-app
User deployer cần quyền sửa các file và folder trong /var/www/html/laravel-app ngay cả khi được tạo sau này. Như vậy mọi file, folder, sub-folder được tạo trong folder đều kế thừa permission của folder cha. Thực hiện câu lệnh sau để set group id cho folder:
$ sudo chmod g+s /var/www/html/laravel-app
1.2 Kết nối server với Github
Deployer sẽ clone Git repo về máy server qua SSH, vì vậy ở bước này sẽ hướng dẫn các bạn generate SSH key để cấu hình trên Github. Nếu ở bước 2 các bạn đã push code bằng cách SSH thì bước này cũng tương tự như vậy nhé.
Thao tác trên máy server: chuyển về user deployer vừa tạo ở bước 1.1
$ su - deployer
Tiếp theo, generate SSH key pair với deployer user. Bước này bạn có thể cần accept tên file, password mặc định. (Enter 3 phát là được =))).
$ ssh-keygen -t rsa -b 4096
Hiển thị public key vừa tạo:
$ cat ~/.ssh/id_rsa.pub
Copy public key này và cấu hình SSH trên phần setting của Github. Tham khảo chi tiết ở đây nhé:
Test thử kết nối trên máy server với Github phát xem sao:
$ ssh -T git@github.com
Hi huulc! You've successfully authenticated, but GitHub does not provide shell access.
OK, để cửa sổ đó, mình quay về máy local làm tiếp. (Mở 1 gitbash mới nhé).
1.3 Kết nối server với máy local
Ở máy local, chúng ta cũng sẽ kết nối đến máy server qua SSH. Bước này chúng ta sẽ generate SSH key ở máy local, rồi add nó vào máy server. Cũng khá đơn giản, bắt đầu nhé.
Thao tác trên máy local: bật gitbash, chạy command sau. Thoải mái thay đổi tên file deployerkey nhé.
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/deployerkey
Copy đoạn public key hiện ra ở câu lệnh dưới đây:
$ cat ~/.ssh/deployerkey.pub
Thao tác trên máy server: Paste đoạn public key vừa copy vào server bằng các bước dưới đây:
$ nano ~/.ssh/authorized_keys
Dán public key vào editer và bấm CTRL-X, Y, rồi bấm ENTER để lưu và thoát.
Giới hạn quyền đọc ghi của file authorized_keys:
$ chmod 600 ~/.ssh/authorized_keys
NOTE: Nếu không Giới hạn quyền đọc ghi của file authorized_keys sẽ gặp lỗi: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
Bây giờ máy local của bạn đã có thể kết nối đến máy server rồi.
$ ssh deployer@your_server_ip -i ~/.ssh/deployerkey
1.4 Deploy ứng dụng
Thực hiện trên máy local Mở gitbash tại folder code đã push lên Github
$ cd laravel-app
$ dep init -t Laravel
Tiếp theo, mở file deploy.php bằng text editor mà bạn yêu thích. Ở đây mình dùng Visual Studio Code: Chúng ta cần chỉnh sửa lại cấu hình ở một số trường trong file
# deploy.php
...
// Project name
set('application', 'laravel-app');
// Project repository
set('repository', 'git@mygitserver.com:username/repository.git');
. . .
// Hosts
host('staging')
->setHostname('ip_server')
->setRemoteUser('name_remote')
->setDeployPath('~/')
->set('branch', 'staging')
->set('keep_releases', 4)
->set('labels', ['env' => 'staging', 'name' => 'staging'])
->set('minimum_version', '0.0.0');
host('production')
->setHostname('ip_server')
->setRemoteUser('name_remote')
->setDeployPath('~/')
->set('branch', 'production')
->set('keep_releases', 4)
->set('labels', ['env' => 'production', 'name' => 'production'])
->set('minimum_version', '0.0.0');
task('overwrite-env', function(){
$host = get('branch');
$targetEnv = "/env/$host.env";
// run("cp -f {{release_path}}$targetEnv ~/shared/.env");// enable first time only
});
Deploy thử
vender/bin/dep deploy develop
Cảm ơn bạn đã trả lời.