Deploy Laravel9 and Mysql , Redis , Queue Jobs Laravel to Railway
- Tham khảo : https://invariance.dev/2022-08-04-deploy-laravel-on-railway.html
- API : https://linebotbe-production.up.railway.app/
- Client : https://linebotpro.vercel.app/
Service Database Mysql
- Ta sẽ tạo như bình thường , chọn Mysql , sau khi tạo xong ta sẽ có thông tin của database đó như sau :
MYSQLDATABASE : railway
MYSQLHOST : viaduct.proxy.rlwy.net
MYSQLPASSWORD : ff-g5E3HcFC5G3DC3FDG1C-D5ACcBH2A
MYSQLPORT : 49926
MYSQLUSER : root
MYSQL_DATABASE : railway
MYSQL_PRIVATE_URL :
MYSQL_ROOT_PASSWORD :
MYSQL_URL :
=> Ta sẽ dùng thông tin này login vào một hệ quản trị cơ sở dữ liệu ở máy tính , sau đó chạy file sql để tạo database , như ta vẫn thường hay làm để chạy file dữ liệu backup . => Sử dụng các thông tin này . => Sau khi chạy ta sẽ có như sau : => Mọi thao tác hoàn toàn giống như trên local . => Như bình thường ta vẫn có thể connect bằng nhiều ứng dụng khác ví dụ VS Code => Dùng VS Code có vẻ load dữ liệu nhanh hơn so với SQL Heidi .
Service Laravel - Jobs
Giải thích
-
NIXPACKS_START_CMD=php artisan queue:work & php artisan user:broadcast & php artisan user:statistical => các lệnh được nối với nhau bởi dấu ‘&’ sẽ chạy song song
-
NIXPACKS_START_CMD=php artisan queue:work && php artisan user:broadcast && php artisan user:statistical => các lệnh được nối với nhau bởi dấu ‘&&’ sẽ chạy tuần tự , có nghĩa là lệnh này xong rồi mới đến lệnh khác .
-
Vấn đề : Nếu project deploy có thêm biến NIXPACKS_START_CMD thì nó sẽ phải đợi các lệnh trong biến này chạy xong mới gọi là done deploy lúc đó mới public domain . => Nhưng thực tế thì ta phải muốn Project chạy Và các lệnh jobs này cũng phải chạy song song với project
Cách giải quyết : Sẽ có 3 service
- Database Mysql
- Service Laravel để chạy server
- Service Laravel để chạy các lệnh jobs => Cả 2 Laravel này đều call đển cùng database đó => Cả 2 đều được setup như nhau , cùng một mã nguồn từ github , nói chung mọi thứ giống nhau , chỉ khác là Service Laravel Jobs có thêm biến : NIXPACKS_START_CMD=php artisan queue:work & php artisan user:broadcast & php artisan user:statistical Laravel Server
- Env Railway Laravel
APP_DEBUG=true
APP_ENV=product
APP_KEY=base64:cfDBHY1xnKPgpyoOjt2o1K7y+M7rzJbxITSGwhjmQsI=
APP_NAME=LINE Bot - Support LINE OA
APP_URL=http://localhost
AWS_ACCESS_KEY_ID=
AWS_BUCKET=
AWS_DEFAULT_REGION=us-east-1
AWS_SECRET_ACCESS_KEY=
AWS_USE_PATH_STYLE_ENDPOINT=false
BROADCAST_DRIVER=log
CACHE_DRIVER=file
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
CLOUDINARY_CLOUD_NAME=
CLOUDINARY_URL=
DB_CONNECTION=mysql
DB_DATABASE=railway
DB_HOST=viaduct.proxy.rlwy.net
DB_PASSWORD=ff-g5E3HcFC5G3DC3FDG1C-D5ACcBH2A
DB_PORT=49926
DB_USERNAME=root
FILESYSTEM_DISK=local
GOOGLE_RECAPTCHA_KEY=6LfVKR8nAAAAAB9oHO-h_S4DEi6dK0gArr3E6WzE
GOOGLE_RECAPTCHA_SECRET=6LfVKR8nAAAAANKaCmS2frdoPhmu3sU8q3GY4C_c
JWT_SECRET=42dECw50z46hE9LcqV3ToGE989sjzO7BE9guR7CZUDPHsWB1R4RMzc850Rff5tWb
L5_SWAGGER_CONST_HOST=http://project.test/api/v1
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=
MAIL_FROM_NAME=${APP_NAME}
MAIL_HOST=smtp.gmail.com
MAIL_MAILER=smtp
MAIL_PASSWORD=
MAIL_PORT=587
MAIL_USERNAME=
MEMCACHED_HOST=127.0.0.1
MIX_PUSHER_APP_CLUSTER=${PUSHER_APP_CLUSTER}
MIX_PUSHER_APP_KEY=${PUSHER_APP_KEY}
QUEUE_CONNECTION=database
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
SESSION_DRIVER=file
SESSION_LIFETIME=120
Composer.json
https://github.com/linebot_be/blob/main/composer.json
=> Hình như Railway yêu cầi về php version >= 8.1.0 mới chạy được . Nếu sai version php và version của các package cũng không deploy được .
Composer.lock
https://github.com/linebot_be/blob/main/composer.lock
Một số file khác cần sửa code
public function boot()
{
if ($this->app->environment('production')) {
URL::forceScheme('https');
}
Paginator::useBootstrap();
}
- https://github.comlinebot_be/blob/main/app/Http/Middleware/TrustProxies.php
// protected $proxies;
protected $proxies = '*';
Laravel Jobs
- Setup hoàn toàn giống như Service Laravel Server
- Chỉ cần thêm biến này là được :
NIXPACKS_START_CMD=php artisan queue:work & php artisan user:broadcast & php artisan user:statistical
Kết quả
Service Server để xử lí => Service này mình không add thêm domain cho nó cũng được , vì có dùng đâu . Service Jobs để chạy các job
Service Redis
Tham khảo và làm theo : https://invariance.dev/2022-08-04-deploy-laravel-on-railway.html B1. Tạo Redis trên Railway Sau khi tạo ta sẽ có các thông tin như sau :
RAILWAY_RUN_AS_ROOT : true
RAILWAY_RUN_UID : 0
REDISHOST :
REDISPASSWORD :
REDISPORT : 42828
REDISUSER : default
REDIS_PASSWORD :
REDIS_PRIVATE_URL :
REDIS_URL :
Cho các thông tin đó vào .env :
REDIS_HOST=
REDIS_PASSWORD=
REDIS_PORT=42828
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
B2. Cài đặt redis và cập nhật các file cần thiết trên laravel
Chạy Lệnh : composer require predis/predis
src.env
APP_NAME="LINE Bot - Support LINE OA"
APP_ENV=local
APP_KEY=base64:cfDBHY1xnKPgpyoOjt2o1K7y+M7rzJbxITSGwhjmQsI=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=linebot
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
REDIS_HOST=monorail.proxy.rlwy.net
REDIS_PASSWORD=
REDIS_PORT=42828
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
FILESYSTEM_DISK=local
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
GOOGLE_RECAPTCHA_KEY=6LfVKR8nAAAAAB9oHO-h_S4DEi6dK0gArr3E6WzE
GOOGLE_RECAPTCHA_SECRET=6LfVKR8nAAAAANKaCmS2frdoPhmu3sU8q3GY4C_c
JWT_SECRET=42dECw50z46hE9LcqV3ToGE989sjzO7BE9guR7CZUDPHsWB1R4RMzc850Rff5tWb
L5_SWAGGER_CONST_HOST=http://project.test/api/v1
CLOUDINARY_CLOUD_NAME=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
CLOUDINARY_URL=
Src\composer.json
"predis/predis": "^2.2",
Src\config\database.php ``` 'redis' => [
'client' => 'predis',
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'),
],
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
'cache' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
],
Src\config\queue.php
` 'default' => env('QUEUE_DRIVER', 'redis'),`
B3. Chạy các lệnh
- Composer dump-autoload
- Php artisan optimize:clear
- Php artisan optimize
Kết quả
-
Các hàng đợi sẽ được lưu trên redis
-
Khi ta chạy lệnh queue để thực hiện hàng đợi thì các hàng đợi được gọi là thực hiện
-
Sau đó redis railway sẽ xóa các hàng đợi đó
-
Cái còn lại này chính là redis để lưu cache :
-
Mặc khác do ta dùng driver redis nên nó không dùng drive database nên nó không lưu vào bảng jobs nữa Redis railway trong Vs Code => Sử dụng kết nối với Redis trong extendsion Database
-
Điền các thông tin như sau :
Kết quả
Cập nhật các biến .env tương ứng trên API đã deploy để dùng Redis .
- Tương tự thì linebot_be_jobs và linebot_be_server đều có chung .env và chúng chỉ khác nhau biến NIXPACKS_START_CMD
APP_NAME=LINE Bot - Support LINE OA
APP_ENV=product
APP_KEY=base64:cfDBHY1xnKPgpyoOjt2o1K7y+M7rzJbxITSGwhjmQsI=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=
DB_PORT=
DB_DATABASE=
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=redis
FILESYSTEM_DISK=local
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=
REDIS_PASSWORD=
REDIS_PORT=42828
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=
MAIL_FROM_NAME=LINE Bot - Support LINE OA
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
MIX_PUSHER_APP_KEY=${PUSHER_APP_KEY}
MIX_PUSHER_APP_CLUSTER=${PUSHER_APP_CLUSTER}
GOOGLE_RECAPTCHA_KEY=6LfVKR8nAAAAAB9oHO-h_S4DEi6dK0gArr3E6WzE
GOOGLE_RECAPTCHA_SECRET=6LfVKR8nAAAAANKaCmS2frdoPhmu3sU8q3GY4C_c
JWT_SECRET=42dECw50z46hE9LcqV3ToGE989sjzO7BE9guR7CZUDPHsWB1R4RMzc850Rff5tWb
L5_SWAGGER_CONST_HOST=http://project.test/api/v1
CLOUDINARY_CLOUD_NAME=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
CLOUDINARY_URL=
NIXPACKS_START_CMD=php artisan queue:work & php artisan user:broadcast & php artisan user:statistical
Deploy Client Vercel
- https://vercel.com/nguyenvanmanh-ai/linebot => Cứ trỏ đến repo github của linebot_fe là tự động deploy được .
All rights reserved