利用免費fly.io空間,部署Laravel並連接MySQL資料庫(二)

2023/08/30閱讀時間約 12 分鐘

根據上一篇部署完畢Laravel 專案後,本章要來幫線上專案設定資料庫,fly.io 部署MySQL免費容量是3GB,在設定的時候要記得設定size,避免超過要收費。

接下來來建置mysql 應用程序並創建屬於 mysql volume ,避免數據資料遺失,而一個 volume 只能綁定一個應用程序,其他應用程序不可以共享,且volume設定的區域必須要跟運行的Laravel專案是同一個區域才能訪問它

創建MySQL 應用程序

首先我們先來創建屬於mysql 應用程序

// 創建一個資料夾
mkdir demo-mysql

//切到​資料夾
cd demo-mysql

// 創建 mysql app
fly launch
raw-image

接著執行 fly launch,我將專案命名為demo-mysql,並選擇區域與一開始的laravel專案一樣是region = Tokyo

raw-image
raw-image

這邊執行完畢可以看到flyctl幫我創建了一個fly.toml的檔案

raw-image

接著創建 volume 名字設定為剛剛取的 demo-mysql,fly.io文件給的是默認SIZE 10,這邊我們改為SIZE 3GB 避免要被收費,這邊要注意的是命名 volume 名稱僅允許使用字母數字字符和下劃線,最多 30 個字符

fly volumes create demomysql --size 3 # gb
raw-image

接著會出現一段紅字警告

Warning! Individual volumes are pinned to individual hosts. You should create two or more volumes per application. You will have downtime if you only create one. Learn more at https://fly.io/docs/reference/volumes/

raw-image

這段文字只是通知建議你至少要配置兩個以上的volumes 給你的應用程式,不過我們小專案不管他,直接給他YES下去

接著一樣選擇區域Tokyo

raw-image

創建完畢後可以看到 volumes 訊息

raw-image

接下來設定mysql secrets,加密我們的mysql 密碼們

# Set secrets:
# MYSQL_PASSWORD - password set for user $MYSQL_USER
# MYSQL_ROOT_PASSWORD - password set for user "root"

fly secrets set MYSQL_PASSWORD=password MYSQL_ROOT_PASSWORD=password
raw-image

接著編輯fly.toml設定改成下列這樣,這是fly.io V2版的寫法,根據官網說法使用mysql 8.0版本在記憶體空間上,可能會有不足,故以下語法可以增加記憶體(這邊我先不採用,避免產生額外費用)

// Give the vm 2GB of ram
fly scale memory 2048

fly.toml 檔案設定如下

app = "demo-mysql"
kill_signal = "SIGINT"
kill_timeout = 5

# 這是選擇的地區​
primary_region = "nrt"

[processes]
app = '--datadir /data/mysql --default-authentication-plugin mysql_native_password --performance-schema=OFF --innodb-buffer-pool-size 64M'

[mounts]
source="mysqldata"
destination="/data"

[env]
MYSQL_DATABASE = "laravel "
MYSQL_USER = "non_root_user"

# 使用mysql 8版本​
[build]
image = "mysql:8.0.32"

修改完畢後,就可以開始部署我們的 mysql 了

fly deploy

部署完畢後圖案就會從板手改成打勾

raw-image
raw-image

設定完成後因為 volumes 是存放在在fly.io主機上,要確認線上資料庫的連線,需要透過 WireGuard 進行連接,在demo-mysql專案裡使用flyctl proxy連接到主機並映射到本地。

// 使用這段本地連接遠端主機​
flyctl proxy 3306 -a demo-mysql​

//如果 3306 port衝突可修改以下
​flyctl proxy 13306 -a demo-mysql

這裡映射完畢後可以利用本地MySQL GUI 開啟,記得這裡的shell要一直開著。

raw-image

使用 root 帳號登入,發現沒有額外設定的MYSQL_USER = "non_root_user"的帳號,在使用連線資料庫時應該避免使用root帳號操作,故這邊們額外添加 non_root_user 帳號權限

raw-image
// 登入 root 帳號
mysql -u root -p password (你的root密碼)
// 登入後設定額外帳號權限​
CREATE USER 'non_root_user'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON laravel.* TO 'non_root_user'@'%';

FLUSH PRIVILEGES;
raw-image

接下來我們要將我們 laravel 專案設定demo-mysql 連線方式,並執行migrate確認資料庫有正常將 table 塞進去

根據官網文件說明,有四種方式可以進行設定遷移

  1. 通過fly.toml [deploy] 配置(將在每個部署中運行)
[deploy]
release_command = "php /var/www/html/artisan migrate --force"
  1. 通過以下中的啟動腳本.fly/scripts:
echo "/usr/bin/php /var/www/html/artisan migrate --force" > ".fly/scripts/db.sh"
  1. 通過fly ssh consol
fly ssh console -C "php /var/www/html/artisan migrate --force"
  1. 通過fly ssh console:
fly ssh console
cd /var/www/html/
php artisan migrate --force

這邊選擇使用修改fly.toml的方式,在fly.toml增加release_command = "php /var/www/html/artisan migrate --force",執行部署時更新migrate

設定Laravel 專案連線資料庫

先修改fly.toml [env]加上資料庫資料,這邊 host 在創建時,命名app應用程序為demo-mysql,在設定fly.toml DB_HOST的規定需要加上.internal。

DB_DATABASE 對應demo-mysq 資料夾 fly.toml[env]上的MYSQL_DATABASE = "laravel"

DB_USERNAME 對應demo-mysq 資料夾 fly.toml[env]上的MYSQL_USER = "non_root_user"

DB_CONNECTION = "mysql"
DB_HOST = "demo-mysql.internal"
DB_DATABASE= "laravel"

完整設定laravel fly.toml 檔案如下

app = "laravel-demo-v1"
primary_region = "nrt"
console_command = "php /var/www/html/artisan tinker"

[build]
[build.args]
NODE_VERSION = "18"
PHP_VERSION = "8.1"

[deploy]
release_command = "php /var/www/html/artisan migrate --force"

[env]
APP_ENV = "production"
LOG_CHANNEL = "stderr"
LOG_LEVEL = "info"
LOG_STDERR_FORMATTER = "Monolog\\Formatter\\JsonFormatter"
SESSION_DRIVER = "cookie"
SESSION_SECURE_COOKIE = "true"
DB_CONNECTION = "mysql"
DB_HOST = "demo-mysql.internal"
DB_DATABASE= "laravel"
DB_USERNAME="non_root_user"

[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
processes = ["app"]
raw-image

接下來是 laravel 本身.env的設定,修改DB_USERNAMEDB_PASSWORD的部分,並將APP_ENV環境變數改成正式站,到時候執行時才可以正確執行migrate

raw-image

再來記得把敏感資訊加密(註:為方便理解跟如何填寫故呈現出來,這邊機敏資料會改掉,不用擔心,第一次練習也要避免將機敏資料公開歐)

fly secrets set DB_USERNAME=<MYSQL_USER> DB_PASSWORD=<MYSQL_PASSWORD>

設定完畢後執行部署

fly deploy
raw-image

測試資料庫Mirgate

部署成功後,因部署後因為我們有設定release_command = "php /var/www/html/artisan migrate --force" ,故在執行deploy時會一併執行migrate,來看看資料庫是否有table資料

raw-image

接著我們來測試資料庫執行,這邊試著執行migrate:rollback,確認可以直接操作資料。

因為我們正在操作production 環境變數的資料庫,故Laravel 會跳出畫面,這邊選擇Yes

raw-image

接著系統執行

raw-image

我們再確認一次資料庫是否已經都rollback了,這邊可以看到 table 都回到原始狀態了,確認操作資料庫沒問題,接下來就可以開始試著開發一些有趣小專案哩

raw-image


小結:

這邊利用fly.io 嘗試將小專案部署上去,利用免費空間來簡單製作一些流量不大的side project,且亦不用額外設定SSL的問題,部署完畢又直接幫我們產生網址,可以直接丟給朋油們看看小作品的畫面,也可以多練習CRUD的功能,接著下一步大家可以試著簡單做出一個TodoList 並存到資料庫,部署給朋油玩玩看吧~摳丁愉快~



需要看第一章節的可以往這裡走~

利用免費fly.io空間,學習如何部署第一個Laravel 專案!(一)

文件參考

https://fly.io/docs/app-guides/mysql-on-fly/

https://fly.io/docs/laravel/the-basics/databases/























13會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
留言0
查看全部
發表第一個留言支持創作者!