##記事を書くに至るまで
独学でProgate、ドットインストールなどを駆使してプログラミングを勉強している現大学生です。挫折をしながらLaradockで作ったサイトをHerokuで公開できたのでその方法を書き残しておきます。
まず、
###どのように公開に至ったかというと、
自分のサイトを作りたい!→管理画面があるようなサイトを作りたい!→PHPでできるらしい!データベースはMySQLで!→laravelというフレームワークがあるらしい!→laradockというdockerとlaravelが合体したものがあるらしい!
また、
自分のサイトを作りたい!→サーバーレスというのがあるらしい!→HerokuというPaaSがあるらしい!
よってLaradock+Docker+MySQL+Heroku
という環境に至りました。
より良い環境もあるかとは思いますが、ひとまず公開できたのでこのやり方を自分で見返すためにも紹介していきたいと思います。
##はじめに
必要なもの(主はmacで開発しています)
- docker-composeのインストール
- docker環境(runnning状態であること)
- Herokuのアカウント(無料ですが、クレジットカードの登録をしないとできないこともあるので登録が必要)
これがあればとりあえずいけると思います。
##まず
デスクトップとかどこでもいいので、作成物をまとめるフォルダを作成して、そこにlaradock
をダウンロードします。
$ mkdir MyLaradock
$ cd MyLaradock
$ git init
$ git submodule add https://github.com/Laradock/laradock.git
git submodule
とは何か?一旦無視で大丈夫です!このまま行きましょう。
説明しておくと、laradock
は言うなれば、サイトの地盤作成キットのようなものです。なんでも入ってます。ですので開発するときは必要なものだけを起動させる必要があります。(という解釈で合ってますよね?)
laradock内に移動してあげて、laradockの設定をしていきます。はじめにおおもとの設定ファイル.env
を作る必要があります。laradock内にはenv-example
というのがあらかじめあるのでそれを.env
にしてあげるといいですね。
$ cd laradock
$ cp env-example .env
そしたら.envファイルの設定を少しいじります。つまりlaradockの設定をしていきます。
APP_CODE_PATH_HOST=../
の部分を変えましょう。
これはwebアプリのソースファイル(laravelの中身)をどこにするかですが、わかりやすいように名前をつけておいた方がいいので、値を../src
などに変更します。他にも変えておいた方がいい部分があるのでそれらもまとめて変更していきましょう。
APP_CODE_PATH_HOST=../
APP_CODE_PATH_HOST=../src //変更!
COMPOSE_PROJECT_NAME=laradock
COMPOSE_PROJECT_NAME=laradock-test //プロジェクト毎に新しいlaradock環境を作りたい場合変更しておく
DATA_PATH_HOST=~/.laradock/data
DATA_PATH_HOST=.laradock/data //データの保存先をlaradock毎に分離したい場合変更しておく
これで/MyLaradock/src
の中にアプリのファイルが入る!とlaradockが認識してくれました。
それでは早速、/MyLaradock/src
の中にlaravelを入れていきましょう。ここからdockerと一緒に動かしていくことになります。
ここで立ち上げるのはworkspace
という、のちにlaravelを入れるためのコンテナ、そしてwebサーバーも必要ですのでnginx
というwebサーバーも立ち上げます。
$ docker-compose up -d workspace nginx
docker-compose up
というコマンドは、イメージを作成して、さらにコンテナを作成・起動するコマンドだと思っていただければOKです!docker-compose ps
とコマンドを打って、コンテナが稼働状態(Stateの部分がUpに)なっていれば大丈夫です。次に進みましょう!
###Laravelをworkspaceにダウンロード
workspaceの中に入ってそこにlaravelをダウンロードしていきます。
docker-compose exec workspace bash //workspaceの中に入ります
//↓ここからworkspace内のコマンド↓
# composer create-project laravel/laravel . --prefer-dist //laravelをダウンロード
# exit //コンテナから出る
これで/MyLaradock/src
にlaravelのファイルがたくさん入ったかと思います。
しっかり入っているかページを確認してみましょう。
Macであればhttp://localhost
にアクセスしてみて、laravelの画面になっていれば上手くいっています。ナイス!!
##データベースの設定をしていく
今回はMySQLを使っていきたいと思います。ちなみにHerokuでは無料で使用できるデータベースの容量に制限が設定されているのですが、容量的には圧倒的にPostgreSQLがいいです。今回は個人的にMySQLしか予習していなかったのでMySQLで構築していきます。
まず、/MyLaradock/laradock/.env
のMYSQL_VERSIONの欄を5.7
にします。設定しないと最新バージョンになるのですが、とある設定を追加でしないとエラーが出てしまうので、特に理由がなければ5.7にしましょう。
### MYSQL #################################################
//変更後
MYSQL_VERSION=5.7 //ここを5.7にしました
MYSQL_DATABASE=default
MYSQL_USER=default
.env
ファイルはlaradockのものとlaravelのものと複数あるので間違わないように注意しましょう。
バージョンを変更したらコンテナを起動させます。
$ docker-compose up -d mysql
念の為またdocker-compose ps
でコンテナの稼働状態を確認しましょう。データベースのコンテナが稼働していたらOKです!
laravelのデータベースの設定もしましょう。laravel内の.env
を編集します。
DB_CONNECTION=mysql
DB_HOST=mysql //mysqlに変更しました
DB_PORT=3306
DB_DATABASE=default //laradock/.envのMYSQL_DATABASEと同じ値にする
DB_USERNAME=default //laradock/.envのMYSQL_USERと同じ値にする
DB_PASSWORD=secret //laradock/.envのMYSQL_PASSWORDと同じ値にする
ここまで来たら設定はOKです!これからはlaravelをいじってサイトを作っていきますが、ここは自分の好きなようにサイトを作ってください。ここではサイト作成に必要な設定だけ紹介して、laravel自体のコマンドなどは省略させていただきます。
##Laravel内の細かな設定
laravelをいじって、herokuで公開する上で色々とつまづいたところがあったのでここではその細かな設定をしていきます。
####Target class [〇〇〇Controller] does not exist対策
protected $namespace = 'App\Http\Controllers'; //追加
public function boot()
{
このようにすることでクラスがないと言われなくなります。
laravelをいじる上での一つの大きなエラーを起こす要因としてuse宣言や名前空間がうまくできていないということがあります。もしエラーが起きた場合は、その使っているクラスがきちんとuse宣言されているかなど確認すると良いかと思われます。
####マイグレーション時のエラー対策
herokuの無料プランでは、通常の文字数だと規定のデータ量を超えてしまい、マイグレーション時にエラーが出てしまいます。そのために文字数を制限する必要があります。
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema; //追加*
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
Schema::defaultStringLength(191); //追加*
}
####HTTPに接続になってしまうことへの対策
このままデプロイしてサイトを作るとhttpになります(鍵マークがついていない状態)。herokuは安全なのでhttpであっても問題ないらしいのですが、できれば鍵マークついていた方が気持ち的にいいと思うので、一部変更してhttps接続になるようにします。
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array|string|null
*/
protected $proxies = '*'; //これに変更する
##Herokuにデプロイする
いよいよHerokuを使ってサイトを公開していきます!
herokuにログインしてアプリを作成していきます。
場所は/MyLaradock上でターミナルを使ってログイン、アプリ作成して、アプリをリモートリポジトリとして登録していきます。また、herokuでサイトを公開するにはProcfileというものが必要なのでそれも作成します。
$ heroku login
ログインしたら,,,
$ heroku create [アプリ名(好きな名前をつけてください] --buildpack heroku/php
$ git remote add heroku https://git.heroku.com/[アプリケーション名].git
$ cd MyLaradock/src
$ echo web: vendor/bin/heroku-php-apache2 public/ > Procfile
ログインしてレポジトリを登録し、Procfileというものをsrcディレクトリ内に作成しました。
場所は再び/MyLaradockに戻しておいてください。
続いてherokuとデータベースの紐付けをしていきます。
herokuでデータベースを使うにはアドオンという機能を使ってデータベースを追加し、紐付け作業をします。MySqlを使うにはcleardbというアドオンを使います!
$ heroku addons:add cleardb
ここから紐付けして、このherokuアプリのデータベースはこれですよ、と教えてあげます。
どうやるかというと、cleardbにはCLEARDB_DATABASE_URL
という値があります。この値とherokuのconfigを紐付けるといった感じですね。やっていきましょう。
$ heroku config | grep CLEARDB_DATABASE_URL
CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true
///このurlを参考にして、それぞれの値を地道にheroku:configに入れていきます。///
$ heroku config:set DB_CONNECTION=mysql
$ heroku config:set DB_DATABASE=[データベース名]
$ heroku config:set DB_HOST=[ホスト名]
$ heroku config:set DB_USERNAME=[ユーザー名]
$ heroku config:set DB_PASSWORD=[パスワード]
####HerokuアプリにAPP_KEYを追加
herokuアプリに環境変数としてAPP_KEY
を設定してあげる必要があります。
やっていきましょう。
$ cd MyLaradock/laradock
$ docker-compose exec workspace php artisan --no-ansi key:generate --show
base64:xxxxx
/// この[base64:xxxxxxx]をheroku:configに設定します
cd .. ///MyLaradockに移動
$ heroku config:set APP_KEY=base64:xxxxx
$ heroku config ///これを実行してきちんと設定されているか確認しましょう。
##最後!
gitにpushしていきます!
$ cd MyLaradock
$ git add .
$ git commit -m 'create laradock app'
$ git subtree push --prefix src/ heroku master
///上だけだとデータベースの設定は反映されないので 'php artisan migrate'で設定を反映させて終わりです!
$ heroku run "php artisan migrate"
これでできるはずです ターミナルで heroku open
を実行してきちんとサイトが表示されるか確認してみてください!
以上で終わりたいと思います。ここまで読んでくれてありがとうございます。
間違った認識をしている部分もあるかと思います!笑
指摘や上手くいかないときはコメントしていただけると幸いです!もっと理解を深めたいので(^^)
ありがとうございました!
どんどんlaravel勉強していくぞー!
とても参考にしたサイトはこちら