Deploy Ứng Dụng Laravel sử dụng Deployer
Bài đăng này đã không được cập nhật trong 4 năm
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 curlcurl -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
gitKey
vàgitKey.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 groupwww-data
để cấp quyền ghi log, cache, và upload filesudo 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ạomysql> 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 deploydep 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ụngdep 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