fly.ioでデプロイする時に遭遇したエラーやつまずき
私の開発環境
OS: windows 11
言語: PHP 8
フレームワーク: Laravel 10
DB: MySQL 8
デプロイ先: Fly.io
■flyctlのインストール時
事象: flyコマンドが効かない
原因・解決策:
私の環境ではインストールしただけではパスが通っていなかった。
インストール終了時に
flyctl was installed successfully to /home/xxxx/.fly/bin/flyctl
Manually add the directory to your $HOME/.bash_profile (or similar)
export FLYCTL_INSTALL="/home/xxxx/.fly"
export PATH="$FLYCTL_INSTALL/bin:$PATH"
と出ていた。
上記コマンドを実行するとflyコマンドが使えるようになった。
事象: ターミナルを再起動後にflyコマンドが効かなくなる
原因・解決策:
私の環境(wsl)では上記コマンドが永続しないので直接で.bashrc
に記述すると解決した
■ fly launch中
事象: launch中にエラー発生
Building image WARN Failed to start remote builder heartbeat: failed to restart VM 48ed666a712028: failed_precondition: unable to restart machine, not currently started or stopped !
WARNING: There are active incidents. Please check `fly incidents list` or visit [https://status.flyio.net](https://status.flyio.net/)
Error: failed to fetch an image or build from source: failed to restart VM 48ed666a712028: failed_precondition: unable to restart machine, not currently started or stopped (Request ID: 01J34RGE3AHY278MK0DJQZ62MR-nrt) (Trace ID: 648776538402557e7522e0741a5d46ef)
原因・解決策:
fly.io側でインシデントが発生していた模様
時間経過で解決
事象: launchやdeploy中にエラー
failed to fetch an image or build from source: error building: failed to solve: process "/bin/sh -c composer install --optimize-autoloader --no-dev && mkdir -p storage/logs && php artisan optimize:clear && chown -R www-data:www-data /var/www/html && echo \"MAILTO=\\\"\\\"\\n* * *www-data /usr/bin/php /var/www/html/artisan schedule:run\" > /etc/cron.d/laravel && cp .fly/entrypoint.sh /entrypoint && chmod +x /entrypoint" did not complete successfully: exit code: 2
原因・解決策:
Dockerfileとfly.tomloのphpのバージョンを合わせたら解決した
[
build.args
]
NODE_VERSION = '18'
PHP_VERSION = '8.2'
■DB(My SQL)アプリ作成と接続
事象: 作成したMy SQLアプリが立ち上がらない
公式ドキュメントに沿ってdeployまでは完了済み
→ しかしすぐにsuspendedになる
→ 再度deployしたみたが変化なし
経過:
fly logs
コマンドでログを確認するとMySQLサーバーが終了・再起動を繰り返していること分かった。
2024-07-20T00:59:45.452 app[683d449f717348] nrt [info] WARN could not unmount /rootfs: EINVAL: Invalid argument
2024-07-20T00:59:45.453 app[683d449f717348] nrt [info] [ 4.731207] reboot: Restarting system
2024-07-20T00:59:45.861 runner[683d449f717348] nrt [info] machine has reached its max restart count (10)
原因・解決策:
mysql imageのバージョンを
8
→ 8.1
に変更したら解決した
事象: アプリからDBに接続できない
原因①
アプリ側のfly.toml
のDB_HOST
の記述が間違っていた
公式ドキュメント
Name the app whatever you’d like. The name will become a hostname our application uses to connect to the database, such as `my-mysql.internal`.
# アプリに好きな名前を付ける。 この名前は、my-mysql.internalのように、アプリケーションがデータベースに接続する際に使用するホスト名になります。
DB_HOST
名はアプリ名.internal
にするのが正解
原因②
マイグレーションしていない
私のような初心者にありがちなミス。
デプロイ時に自動でテーブルも作成されるものと思っていたり、マイグレーションの存在自体を忘れている
一応コマンドを共有しておくと
fly ssh console
でアプリのコンソールに触れる
cd /var/www/html/
php artisan migrate --force
※なぜ--force
をつけるのか?
だいたいの本番環境ではマイグレーションは確認なしでは行えないようになっているので本番環境でマイグレーションを実行する場合は、--force
を付けることで実行が可能になる。
■ブラウザでフロントの動作検証中
事象: とあるページにアクセスすると500エラーになる
経過:
とあるページにアクセスすると500エラーになる
→ resources/js
に追加したファイルを必要とするページだった
→ ログ確認
→ {"message":"Unable to locate file in Vite manifest: resources/js/cropper.js.",
→ Vite のマニフェストファイルに記載された resources/js/cropper.js
を見つけられないという問題が発生していた
原因・解決策:
vite.config.js
にresources/js/cropper.js
を追加後に再デプロイ
export default defineConfig({
plugins: [
laravel({
input: [
'resources/css/app.css',
'resources/js/app.js',
'resources/js/cropper.js', ← 追加
],
refresh: true,
}),
],
~ 省略 ~
Discussion