質問するログイン新規登録
Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

420閲覧

dockerで開発したlaravelで作ったapiをherokuにデプロイしたい

ryuichi-works

総合スコア40

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2024/01/30 14:47

編集2024/01/31 16:34

0

0

実現したいこと

herokuにdockerでローカル開発環境を作ったlaravelのapiをデプロイする

前提

技術構成
バックエンド:laravel
フロントエンド:Nextjs
DB:MySQL
の構成でレビューを投稿する様なwebアプリを作っています。
それぞれDockerfileで開発環境を構築、githubのリポジトリを分けて管理しています。

ローカル開発環境ではブラウザでの動作確認はできています。

herokuでMySqlを使うためにherokuのアドオンでjawsDBを追加しています

発生している問題・エラーメッセージ

問題としては、herokuのcontainer registoryにイメージをアップしそれを元にデプロイしようと試みていますが、その際に下記の画像の様にデプロイが動作していない様です(urlは隠しています)
イメージ説明

フォルダ構成
rootフォルダ名は仮のものです。

laravel-root
┣laravel関連ファイル
┣ docker
┃ ┗php
┃  ┣ apache
┃  ┃ ┗ 000-default.conf
┃  ┣ Dcokerfile(これはローカル環境用です)
┃  ┗ php.ini
┣ .env
┣ composer.json
┣ composer.lock
Dockerfile(デプロイで使う本番用Dockerfile)
docker-compose.yml
┣ docker-compose.develop.yml(ローカル環境でのymlファイル)
┣ docker-compose.production.yml
┃   (デプロイ用のDockerfileをローカルで確認用)
┣ Procfile

フォルダの構成概要:
・ローカル環境ではdocker/php/Dockerfileをlaravel-rootのdocker-compose.ymlにdocker-compose.develop.ymlに記載したローカル用のコードをコピーして動作させています。ローカルではlaravel apiは正常に動作しフロントのnextjsとのやりとりも問題ありません。

・本番へのデプロイではlaravel-rootのDockerfileをデプロイ用で用意し、それをheorku container registoryにpushする形にしています。

以下デプロイの際に流したコマンドとエラー文です
laravel-root階層で行なっています

個人情報などの部分は[隠し]に置き換えています

デプロイの際に流しているコマンド
docker build -t strii-api-heroku:strii-api-heroku .
heroku container:push strii-api-heroku -a strii-api
heroku container:release strii-api-heroku -a strii-api
heroku open (ここで添付画像の様にエラーとなります)

heroku logsコマンドでのエラー文

heroku

12024-01-30T10:53:48.440525+00:00 app[api]: Deployed strii-api-heroku (71266796715f) by user [隠し] 22024-01-30T10:53:48.440525+00:00 app[api]: Release v15 created by user [隠し] 32024-01-30T10:54:08.840223+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/" host=[隠し] request_id=23f3100e-a124-4af4-b926-7d9bdfd9d5e6 fwd="36.14.1.24" dyno= connect= service= status=503 bytes= protocol=https 42024-01-30T10:54:09.099891+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=[隠し] request_id=f04b12ea-c301-44b3-84bd-43aeda618770 fwd="36.14.1.24" dyno= connect= service= status=503 bytes= protocol=https

エラーの状態としては、herokuのdynoが立ち上がっていない様です。
heroku open で添付画像の様になり、
heroku psでプロセスを確認すると

heroku

1>>>heroku ps 2No dynos on ⬢ strii-api

となっており、
heroku container:release strii-api-heroku -a strii-apiを実行した時点でheroku psで確認しても上記の様にdynoが立ち上がっていない状態です

該当のソースコード

Dockerfile(本番環境用)

1# ・このDockerファイルはheroku container registoryにpushするイメージをbuildする本番環境用 2# のDockerfileである。 3# ・ローカル開発環境ではこのファイルは不要であるので注意されたし。 4# ・./docker/php/に作成したかったが 5# COPY . /var/www/html/strii-backendのCopy句が 6# 想定通りにコピーされないためこの階層に作成している 7 8FROM php:8.2-apache 9 10WORKDIR /var/www/html 11 12RUN apt-get update \ 13 && apt-get -y install libicu-dev libonig-dev libzip-dev unzip locales vim zlib1g-dev libpng-dev libjpeg-dev libfreetype6-dev libwebp-dev \ 14 && apt-get clean \ 15 && rm -rf /var/lib/apt/lists/* \ 16 && locale-gen en_US.UTF-8 \ 17 && localedef -f UTF-8 -i en_US en_US.UTF-8 \ 18 && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ 19 && docker-php-ext-install intl pdo_mysql zip bcmath gd exif \ 20 && a2enmod rewrite 21 22ENV \ 23 LANG=en_US.UTF-8 \ 24 LANGUAGE=en_US:en \ 25 LC_ALL=en_US.UTF-8 26 27COPY . /var/www/html/strii-backend 28 29# publicフォルダとstorageフォルダのパーミッションを設定 30RUN chown -R www-data:www-data /var/www/html/strii-backend/public /var/www/html/strii-backend/storage 31RUN chmod -R 775 /var/www/html/strii-backend/public /var/www/html/strii-backend/storage 32 33COPY --from=composer:2.5 /usr/bin/composer /usr/bin/composer 34 35# 各種設定ファイルをコンテナの設定ファイルにコピー 36COPY ./docker/php/php.ini /usr/local/etc/php/ 37COPY ./docker/php/apache/000-default.conf /etc/apache2/sites-enabled/000-default.conf 38 39# EXPOSE 80 40# heroku用に$PORTを使っている。ローカルで確認する時はコメントアウトすること 41# EXPOSE $PORT 42 43 44CMD ["/bin/sh", "-c", "apache2-foreground"] 45

下記のdocker-compose.ymlの内容は前述してある本番デプロイ用のDockerfileの動作をローカルで確認するために作成しています。ローカルでは動作しました。

dockerーcompose.yml(dockerーcompose.production.ymlをコピーしたもの)

1version: '3.8' 2 3services: 4 web_backend: 5 build: . 6 container_name: web_backend 7 tty: true 8 stdin_open: true 9 ports: 10 - 80:80 11 depends_on: 12 - db 13 db: 14 image: mysql:8.2 15 container_name: db 16 environment: 17 MYSQL_ROOT_PASSWORD: root 18 MYSQL_DATABASE: strii_db 19 MYSQL_USER: [隠し] 20 MYSQL_PASSWORD: [隠し] 21 TZ: 'Asia/Tokyo' 22 volumes: 23 - ./docker/db/data:/var/lib/mysql 24 - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf 25 ports: 26 - 3306:3306

以下、herokuが使うProcfileです

Procfile

1web: vendor/bin/heroku-php-apache2 strii-backend/public/

以下、heroku configコマンドの結果の環境変数などです

=== strii-api Config Vars DB_CONNECTION: mysql DB_DATABASE: [隠し] DB_HOST: [隠し] DB_PASSWORD: [隠し] DB_PORT: 3306 DB_USERNAME: [隠し] JAWSDB_URL: mysql:〜〜:3306/〜〜

以下、heroku stackコマンドの結果です

>>>heroku stack === ⬢ strii-api Available Stacks * container heroku-20 heroku-22

念の為、ローカル開発環境用で使ったdocker/php/Dockerfile、docker-compose.ymlも載せておきます。正常に動作しております。

docker/php/Dockerfile

1FROM php:8.2-apache 2 3RUN apt-get update \ 4 && apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales vim zlib1g-dev libpng-dev libjpeg-dev libfreetype6-dev libwebp-dev \ 5 && apt-get clean \ 6 && rm -rf /var/lib/apt/lists/* \ 7 && locale-gen en_US.UTF-8 \ 8 && localedef -f UTF-8 -i en_US en_US.UTF-8 \ 9 && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ 10 && docker-php-ext-install intl pdo_mysql zip bcmath gd exif \ 11 && pecl install xdebug \ 12 && docker-php-ext-enable xdebug \ 13 && a2enmod rewrite 14 15ENV \ 16 LANG=en_US.UTF-8 \ 17 LANGUAGE=en_US:en \ 18 LC_ALL=en_US.UTF-8 19 20COPY --from=composer:2.5 /usr/bin/composer /usr/bin/composer 21 22# 各種設定ファイルをコンテナの設定ファイルにコピー 23COPY php.ini /usr/local/etc/php/ 24COPY apache/000-default.conf /etc/apache2/sites-enabled/000-default.conf 25 26WORKDIR /var/www/html

dockerーcompose.yml(ローカル開発用)

1version: '3.8' 2 3services: 4 web_backend: 5 build: ./docker/php 6 container_name: web_backend 7 tty: true 8 stdin_open: true 9 ports: 10 - 80:80 11 volumes: 12 - ./:/var/www/html/strii-backend 13 - ./docker/php/php.ini:/usr/local/etc/php/php.ini 14 - ./docker/php/apache/000-default.conf:/etc/apache2/sites-enabled/000-default.conf 15 depends_on: 16 - db 17 db: 18 image: mysql:8.2 19 container_name: db 20 environment: 21 MYSQL_ROOT_PASSWORD: root 22 MYSQL_DATABASE: strii_db 23 MYSQL_USER: trainer 24 MYSQL_PASSWORD: trainer 25 TZ: 'Asia/Tokyo' 26 volumes: 27 - ./docker/db/data:/var/lib/mysql 28 - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf 29 ports: 30 - 3306:3306 31

※回答で指摘していただいたheroku.ymlの追記※
コメントアウトの部分は適宜試した部分で、最終的に下記のコードとなっています。build句の部分のみ使用

heroku.yml

1# setup: 2# addons: 3 # config: 4 # APP_KEY: = 5 # APP_ENV: production # アプリケーションの環境 6 # APP_DEBUG: true # デバッグモードを無効にする 7build: 8 docker: 9 web: Dockerfile 10 # config: 11 # APP_NAME: Laravel 12 # APP_DEBUG: true 13 # APP_KEY: base64〜 14 # DB_CONNECTION: mysql 15 # DB_DATABASE: 〜 16 # DB_HOST: 〜 17 # DB_PASSWORD: 〜 18 # DB_PORT: 3306 19 # DB_USERNAME: 〜 20# release: 21# run: 22 # web: php artisan serve --port $PORT 23 # web: heroku-php-apache2 public/ 24 # web: heroku-php-apache2 strii-backend/public/ 25

試したこと

やったことしてはchatGptを使いながら前述してきたイメージのbuildとheroku container registoryにpushするあたりまで動作するところまで出来ました。

現状herokuのdynoが立ち上がらないもしくは、立ち上がってもすぐに終了しているのが原因でどうやってdynoを立ち上がる様にするのかがわかっていません。

何日もデプロイできない状態が続いているので、herokuに詳しい方、分かる方がいましたら回答していただけると幸いです。
追加コードが必要な場合は指摘していただければ再度アップいたします。

補足情報(FW/ツールのバージョンなど)

laravel :9系
php: ^8.0.2
mysql:8.2
Docker: 20.10.24
Docker desctop: 4.18.0
Docker Compose v2.17.2
heroku/8.7.1 darwin-x64 node-v16.19.0

PC: mac book pro 13 inch 2020 intel
macOS: Monterey v12.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

  • APP_KEY が未登録
  • ローカル環境では .env から環境変数を読み取ってしまって動いている

といったような状況ではないでしょうか?
APP_DEBUG=true を設定することで詳細なエラーが得られるかも知れません。

また、コンテナとしてDockerfileから起動する場合、heroku.ymlが必要になりますがProcfileは不要です。

投稿2024/01/30 19:45

Eggpan

総合スコア3297

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryuichi-works

2024/01/31 17:24 編集

Eggpanさん回答ありがとうございます! 先に結果として、解決に至りませんでした。 指摘していただいた様に、本番環境用のDockerfileをローカルで.envを参照しない様に.envを削除し、環境変数をDockerfileのENV句で定義してローカルで試したところ動作しました。 このDockerfileを使って、質問の『該当のソースコード』に追記したheroku.ymlを使って、同様にデプロイを試みても同じくdynoが立ち上がりませんでした。 ここまで対処してdynoが立ち上がらなかったので、解決へのアプローチとして、『dynoが立ち上がった上での動作不良の場合』と『dynoがそもそも立ち上がらない』ことの2つの場合で考えてみようと思いました。 本質問では後者の『dynoがそもそも立ち上がらない』状態です。herokuのGUIでdynoを立ち上げようとしましたが、これでも立ち上がりませんでした。 ここまで対処して『dynoが立ち上がった上での動作不良の場合』へすら進展しなかったので、根本的な原因かもしれないと思い、心当たりとしてクレジットカードの登録をデビッドカードで登録しているため、他の引き落としの兼ね合いで残高が不足しているために、そもそも有料となったherokuでdynoの利用ができないのかもしれないと思いました。 なのでカードの残高を回復させつつ、指摘していただいた内容を反映してデプロイしてみて、それでもデプロイがうまくいかなければ、いったんEggpanさんの回答をベストアンサーにさせていただき、herokuへのデプロイは断念しようと思います。 追加のご指摘をいただければ幸いですが、回答していただきありがとうございました!
Eggpan

2024/02/01 04:39

HerokuのconfigでPORTが未設定ではないでしょうか?80を指定してみてください。 デフォルトだと8000番を利用するので、疎通出来ずDinoが落ちているのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問