🪂

fly.ioでデプロイする時に遭遇したエラーやつまずき

2024/07/21に公開

私の開発環境

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のバージョンを
88.1に変更したら解決した

事象: アプリからDBに接続できない

原因①
アプリ側のfly.tomlDB_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.jsresources/js/cropper.jsを追加後に再デプロイ

export default defineConfig({
  plugins: [
    laravel({
      input: [
        'resources/css/app.css',
        'resources/js/app.js',
        'resources/js/cropper.js', ← 追加
      ],
      refresh: true,
    }),
  ],

~ 省略 ~

Discussion