fly.ioでLaravelデプロイメント:シンボリックリンクが機能しない問題の解決
laravelのWEBアプリケーションで画像のアップロード機能などを搭載している場合、一般的にはstorageフォルダ下に保存すると思います。
ローカル環境であれば、アップロードされた画像などを参照する際には以下のようなシンボリックを設定を行うことが多いですが、fly.ioだと結構詰まるポイントがたくさんあったので共有したいと思います。
php artisan storage:link
fly.ioとは
一部無料でアプリケーションをデプロイできる。
すげー
シンボリックを設定する
fly launch
を行うとルートディレクトリ下にDockerfileが生成されると思います。
そこにRUN php artisan storage:link
を追加して記述してください。
これで、シンボリックが設定されます。
fly ssh console
でssh接続をしコマンドを打つ方法もありますが、VMがアイドル状態になると自動的に停止され、何か新しいリクエストが送られるとVMが自動的に再起動されるためシンボリック情報を逐一設定するはめになるので、コンテナが作られるのと同時にシンボリックを設定してもらうよう記述しています。
# なんか色々書いてある
RUN php artisan storage:link
EXPOSE 8080
マウントする
シンボリックを設定したからといって、一喜一憂してはいけません。
先ほどの理由で、VMが再起動の行われるとアップロードされた画像が消されてしまいます。
そのため、時間が経った後に自分の作ったwebサイトを閲覧すると画像が正しく読み込まれません。
(404エラーが返ります。)
手順1:regionの確認
以下のコマンドを入力して、machine processの数とregionを確認してください。
日本であればregionはnrtで設定されてることが多いと思います、また、machine processの数も2個がデフォルトっぽいです。
コマンド
fly status
出力例:下の例だとregionはams
Machines
PROCESS ID VERSION REGION STATE ROLE CHECKS LAST UPDATED
app 5683945bd46448 1 ams started 2023-10-03T09:54:04Z
app e82d922f010908 1 ams started 2023-10-03T09:54:25Z
手順2:volumeの追加
先ほど確認したregionとマシンプロセスの数を元に以下のコマンドを入力してください。
fly volumes create storage_vol --region region名 --count マシンプロセスの数
手順3:fly.tomlの編集
下の文を追加してください。
[mounts]
source="storage_vol"
destination="/var/www/html/storage"
手順4:設定ファイルの追加
シェルスクリプトを作成します。
ファイルを作成した後、以下の記述を書き込んでください。
先頭の1をファイル名に追加しないと、cache.shが先に実行されてしまってうまくいかないっぽいので気をつけてください。
touch .fly/scripts/1_storage_init.sh
FOLDER=/var/www/html/storage/app
if [ ! -d "$FOLDER" ]; then
echo "$FOLDER is not a directory, copying storage_ content to storage"
cp -r /var/www/html/storage_/. /var/www/html/storage
echo "deleting storage_..."
rm -rf /var/www/html/storage_
fi
手順5:デプロイ
ここまできたらデプロイしてください。うまくいけばちゃんと機能するはずです。
fly deploy
よくあるエラー
手順2にてregionなどの設定を適切に行わないと、watch your deployment at アプリケーションのURL
の画面でデプロイが終わりません。作成したボリュームはダッシュボード上でも参照できるのできちんと確認しましょう。
おわりに
参考にした記事を置いておきます。
まだ記事を書くことに慣れていませんので、誤字やまちがった情報などがあれば教えていただければ幸いです。
マウント方法【公式ドキュメント】:https://fly.io/docs/laravel/the-basics/laravel-volume-storage/