- vừa được xem lúc

Deploy Laravel9 and Mysql , Redis , Queue Jobs Laravel to Railway

0 0 14

Người đăng: Code Pro

Theo Viblo Asia

  1. Tham khảo : https://invariance.dev/2022-08-04-deploy-laravel-on-railway.html
  2. API : https://linebotbe-production.up.railway.app/
  3. 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 : 

image.png => 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 . image.png => Sử dụng các thông tin này . image.png => Sau khi chạy ta sẽ có như sau : image.png => Mọi thao tác hoàn toàn giống như trên local . image.png => Như bình thường ta vẫn có thể connect bằng nhiều ứng dụng khác ví dụ VS Code image.png => Dùng VS Code có vẻ load dữ liệu nhanh hơn so với SQL Heidi . image.png

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ả image.png image.png

Service Server để xử lí image.png => 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 image.png

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 image.png 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 image.png

  • 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 : image.png image.png

  • 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 image.png Redis railway trong Vs Code image.png => 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ả image.png image.png image.png image.png image.png image.png

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 

image.png image.png

Deploy Client Vercel

Bình luận

Bài viết tương tự

- vừa được xem lúc

Deploy app Laravel App lên Heroku có kết nối Database

Trong bài hôm nay, thì mình sẽ giới thiệu cho các bạn cách để deploy một app Laravel lên Heroku bằng git và Heroku CLI. Heroku là nền tảng đám mây cho phép các lập trình viên xây dựng, triển khai, quản lý và mở rộng ứng dụng, nó rất linh hoạt và dễ sử dụng, cung cấp cho một con đường đơn giản nhất đ

0 0 57

- vừa được xem lúc

Những việc cần làm khi deploy một Rails app sử dụng Docker và CircleCI

Bài viết gốc: dnlblog.com. Khi bạn sử dụng docker cho ứng dụng của mình, việc deploy trở nên đơn giản hơn rất nhiều. Nếu bạn kết hợp với CircleCI nữa thì mọi thứ còn tuyệt vời hơn nữa.

0 0 31

- vừa được xem lúc

Deploy application Machine Learning into Cloud Foundry by Docker

Chào mọi người, nội dung của blog nói về việc deploy một ứng dụng Machine Learning lên Cloud Foundry bằng Docker. Tổng quan một số khái niệm cơ bản:.

0 0 47

- vừa được xem lúc

How to Deploy React App to GitHub Pages | Hosting a React App for Free using Github Pages

How to Deploy React App to GitHub Pages | Hosting a React App for Free using Github Pages. . In this video, we will Deploy React App to GitHub Pages. .

0 0 55

- vừa được xem lúc

Deploy thủ công ứng dụng Django

Đối với một developer mà nói, mục đích cuối cùng của chúng ta khi phát triển một sản phẩm là có thể đưa sản phẩm ấy đến được với người dùng, và deploy là bước cuối cùng mà chúng ta cần thực hiện. Tron

0 0 274

- vừa được xem lúc

Docker – Những lý do bạn nên sử dụng Docker cho triển khai ứng dụng của bạn

Đối với những ma mới bắt đầu tập tẹ triển khai (deploy) ứng dụng thì một phần không nhỏ sẽ có chút bỡ ngỡ với Docker và những khái niệm liên quan. Phần lớn các nền tảng, framework, dịch vụ thứ 3 đều b

0 0 74