+1

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

  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


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í