herokuにデプロイした経験がないのであまり力になれないかもしれませんが、
https://teratail.com/questions/251305
こちらは試してみましたか?
【heroku】”php artisan migrate”が実行できない(laravel・MySQL)
解決したいこと
Laravelで【インスタグラムのような画像投稿できるWebアプリ】を作っております。
現在、無料版herokuを使ってデプロイしようとしているのですが、”php artisan migrate”でエラーが発生いたします。
解決方法について、どうかご教示ください。
デプロイしたいアプリの仕様
- アプリ内で用意しているHTMLのFormで画像を投稿すると、public(/storage)ディレクトリに保存される
- DBへは投稿された画像の文字列のみが保存される
- 画像表示はシンボリックリンクを用いている
発生しているエラー
今回、下記のYouTube動画を参照しながら、自作アプリをデプロイしようといたしました。
過去に1度だけ、この動画を参照しながら自力でデプロイできた経験がありました。
ただ、その時にデプロイしたアプリには『画像投稿の機能』は含まれておりませんでした。
今回も同様の手順で行っていたところ、動画22分付近の【ターミナルに”php artisan migrate”を入力する】を実行した時点で、下記のエラーメッセージが発生いたしました。
production.ERROR:
SQLSTATE[HY000] [2002] Connection timed out
(SQL: select * from information_schema.tables where table_schema = heroku_cb8bb29ed26a23b and table_name = migrations and table_type = 'BASE TABLE')
{"exception":"[object] (Illuminate\\Database\\QueryException(code: 2002):
SQLSTATE[HY000] [2002] Connection timed out
(SQL: select * from information_schema.tables where table_schema = heroku_cb8bb29ed26a23b and table_name = migrations and table_type = 'BASE TABLE')
at /app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:703)
エラー発生から自分で試したこと
エラーの原因を探るため、"heroku run php artisan tinker"をターミナルに入力すると、以下のようになりました。
heroku run php artisan tinker
Running php artisan tinker on ⬢ damp-journey-33395... up, run.5398 (Free)
Psy Shell v0.10.9 (PHP 8.0.12 — cli) by Justin Hileman
>>> config
PHP Error: Undefined constant "config" in Psy Shell code on line 1
>>> config('database.default')
=> "mysql"
>>> config('database.connections.mysql')
=> [
"driver" => "mysql",
"url" => "mysql://"ユーザーネーム":"パスワード"@"ホスト"/"データベース"?reconnect=true",
"host" => "ホスト",
"port" => "8889",
"database" => "データベース",
"username" => "ユーザーネーム",
"password" => "パスワード",
"unix_socket" => "",
"charset" => "utf8mb4",
"collation" => "utf8mb4_unicode_ci",
"prefix" => "",
"prefix_indexes" => true,
"strict" => true,
"engine" => null,
"options" => [],
しかし、原因を見つけることができません。
今回デプロイしようとしているアプリには画像投稿機能が含まれているため、『AWS・EC2』を導入する必要があるとも考えてました。
しかし、色々と調べると、それ以前の問題ではないかと考えております。
このエラーに対し10日ほど費やしましたが、解決の糸口さえ掴めません。
私の力量では、自力での解決は不可能と判断し、恥ずかしながら、この問題について投稿させていただきました。
何卒、よろしくお願いいたします。
3Answer
Comments
@okaa
Questionerご教示くださり、誠にありがとうございました。
早速実行してみます!@okaa
Questionerお教えいただきましたURLの内容についてはクリアしておりました。
私のエラーは別の問題のようですT T- そうですか。残念です。そして私はもうここまでのようです。なんとなく上手くいきそうな記事を列挙しておきます。おそらく調べ尽くしてると思いますが。。
https://qiita.com/yukibe/items/5c1910e259ff4e6498db
https://qiita.com/rope19181/items/992c6b11f4155a3d910c
https://shkn.hatenablog.com/entry/2019/06/23/163502
https://trialanderror.jp/heroku-mysql-start/#outline__2_4
検討をお祈りしております。。。。 @okaa
Questioner参考記事をご教示いただき、ありがとうございました。
あとは自力で健闘します!
回答ではありませんが、 質問に貼られている config('database.connections.mysql')
の内容のうち、 url と database と username と password はすべて伏せ字にしてください。 database と username と password が分かれば誰でもあなたのデータベースを読み書きできてしまいます。 url 文字列にもこれらの情報がすべて含まれています。
heroku config
の出力についても同様に CLEARDB_DATABASE_URL と DATABASE_URL と DB_DATABASE と DB_USERNAME と DB_PASSWORD を伏せ字にしてください。 APP_KEY も多分見せてはいけない値だと思います。
その後、以下の手順でデータベースのパスワードをリセットしてください。
リセットすると Heroku の CLEARDB_DATABASE_URL と DB_PASSWORD が変化すると思います。その値を元に設定をやり直してください。
Comments
@okaa
Questionerご指摘くださり、誠にありがとうございます。
早急に対応させていただきます!
エラーの原因は config('database.connections.mysql')
のうち port の値が8889になっているせいです。3306にする必要があります。
database.php で 'port' => env('DB_PORT', '8889')
のように設定しているのであれば、 DB_PORT 環境変数を3306にセットすることで設定を上書きできます。 'port' => '8889'
のようにべた書きで設定しているのであれば、前述のように env()
を使う形に変えるか、または値を直接書き換えてください。
Comments
@okaa
Questioner上記ご回答くださり、誠にありがとうございます!
早速対応させていただきます!
またセキュリティについてもご教示くださり、ありがとうございます!!- 補足です。開発環境に MAMP の MySQL を入れている場合、8889にしないと接続できません。 DB_PORT を .env では8889に、 Heroku では3306にセットするのがベターです。
MySQL はデフォルトではポート3306で通信を待ち受けます。一方で MAMP はオールインワンの開発環境パッケージであるため、システムに元から入っている MySQL が使っているかもしれないポートと衝突しないように、ポート8889で待ち受ける MySQL を起動します。 @okaa
Questioner補足情報までいただき、誠にありがとうございました。
先ほどご教示いただきました内容を実行し、解決いたしました!
本当にありがとうございました!