- 投稿日:2020-07-28T22:06:13+09:00
Mac×Laravel×MAMPで環境構築からデータベース接続まで
さっそくタイトルにある通り進めていきましょう。
MAMPのインストール
MAMPの公式サイトにアクセスします。
Free Downloadをクリックします。
macアイコンの下「MAMP & MAMP PRO 5.~」をクリックするとダウンロードが開始されます。
無事インストールされたら、アプリケーションフォルダ内のMAMPアイコンをクリックして起動します。
MAMPが起動後、Start Servers をクリックすることで、
Apacheサーバー・・Webサーバー
MySQLサーバー・・データベースサーバー
を同時に起動できます。しばらくすると、Apacheサーバー、MySQLサーバーともに緑色のランプがついたら起動できています。
MAMPの設定
メニュー内 MAMP から Preferences をクリックします。
Portsをクリックすると、ApacheやMysqlが使用するポート番号が表示されます。
初期設定ではApacheのポート番号が8888、MySQLのポート番号が8889になっていますが、
一般的には、
Apacheのポート番号は80
MySQLのポート番号は3306
を使うことが多いですので、特に問題がなければ、画面中央の「Set Web & MySQL ports to 80 & 3306」をクリックします。
Apacheのポート番号は80
MySQLのポート番号は3306
になっていればOKです。以上でMAMPのインストールおよび設定が完了です。
composerのインストール
PHPのライブラリやパッケージを管理するcomposerというツールがあります。
Laravelもcomposerを使ってインストールしますので、下記リンクよりダウンロードしインストールしてください。
インストール後、コマンドプロンプトでcomposer --versionと入力してください。
$ composer --version Composer version 1.4.2このようにバージョンが表示されればOKです。
Laravelのインストール
composerがインストールされている状態で、htdocsディレクトリに移動します。
初期設定でインストールした場合は下記フォルダになるかと思います。
$ cd /Application/MAMP/htdocshtdocsフォルダに移動後、下記のコマンドを入力してください。
$ composer create-project --prefer-dist laravel/laravel 任意のアプリケーション名Laravelの起動
作成したプロジェクトフォルダへ移動して、簡易サーバーを立ち上げてみます。
$ php artisan serveと入力し、
$ php artisan serve Laravel development server started: <http://127.0.0.1:8000> [Tue Apr 23 20:24:32 2019] 127.0.0.1:51707 [200]: /favicon.icoと表示されたら、グーグルクロムなどのブラウザでhttp://127.0.0.1:8000
と入力します。こんな画面が表示されればOKです。
phpmyadminでデータベース作成
「Open WebStart page」をクリックしてください。すると、以下のようなブラウザに飛びます。
下にスクロールして、
「phpMyAdmin」をクリック。すると以下のブラウザに飛びますので、
ここで、任意の名前のデーターベースを作成しましょう。MAMPの情報を控える
そうしましたら、先ほどのWelcome to MAMPのページでMAMPの情報をメモしてください。
.envの修正
デフォルトだと以下のようになっています。
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_USERNAME=root DB_PASSWORD=これを、MAMPの情報を元に、以下のように変えます。
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock DB_DATABASE=先ほど作ったデータベース名 DB_USERNAME=root DB_PASSWORD=root次はdatabase.phpです。
database.phpの修正
デフォルトのdatabase.phpはこうなっています。
'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''),それを、以下のように変えます。
'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', '先ほど作ったデータベース名'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', 'root'),以上で環境構築とデータベース接続まで行えるはずです!
では、良き開発ライフを!!!
- 投稿日:2020-07-28T22:06:13+09:00
Mac×Laravel×MAMPで開発環境構築からデータベース接続まで
さっそくタイトルにある通り進めていきましょう。
MAMPのインストール
MAMPの公式サイトにアクセスします。
Free Downloadをクリックします。
macアイコンの下「MAMP & MAMP PRO 5.~」をクリックするとダウンロードが開始されます。
無事インストールされたら、アプリケーションフォルダ内のMAMPアイコンをクリックして起動します。
MAMPが起動後、Start Servers をクリックすることで、
Apacheサーバー・・Webサーバー
MySQLサーバー・・データベースサーバー
を同時に起動できます。しばらくすると、Apacheサーバー、MySQLサーバーともに緑色のランプがついたら起動できています。
MAMPの設定
メニュー内 MAMP から Preferences をクリックします。
Portsをクリックすると、ApacheやMysqlが使用するポート番号が表示されます。
初期設定ではApacheのポート番号が8888、MySQLのポート番号が8889になっていますが、
一般的には、
Apacheのポート番号は80
MySQLのポート番号は3306
を使うことが多いですので、特に問題がなければ、画面中央の「Set Web & MySQL ports to 80 & 3306」をクリックします。
Apacheのポート番号は80
MySQLのポート番号は3306
になっていればOKです。以上でMAMPのインストールおよび設定が完了です。
composerのインストール
PHPのライブラリやパッケージを管理するcomposerというツールがあります。
Laravelもcomposerを使ってインストールしますので、下記リンクよりダウンロードしインストールしてください。
インストール後、コマンドプロンプトでcomposer --versionと入力してください。
$ composer --version Composer version 1.4.2このようにバージョンが表示されればOKです。
Laravelのインストール
composerがインストールされている状態で、htdocsディレクトリに移動します。
初期設定でインストールした場合は下記フォルダになるかと思います。
$ cd /Application/MAMP/htdocshtdocsフォルダに移動後、下記のコマンドを入力してください。
$ composer create-project --prefer-dist laravel/laravel 任意のアプリケーション名Laravelの起動
作成したプロジェクトフォルダへ移動して、簡易サーバーを立ち上げてみます。
$ php artisan serveと入力し、
$ php artisan serve Laravel development server started: <http://127.0.0.1:8000> [Tue Apr 23 20:24:32 2019] 127.0.0.1:51707 [200]: /favicon.icoと表示されたら、グーグルクロムなどのブラウザでhttp://127.0.0.1:8000
と入力します。こんな画面が表示されればOKです。
phpmyadminでデータベース作成
「Open WebStart page」をクリックしてください。すると、以下のようなブラウザに飛びます。
下にスクロールして、
「phpMyAdmin」をクリック。すると以下のブラウザに飛びますので、
ここで、任意の名前のデーターベースを作成しましょう。MAMPの情報を控える
そうしましたら、先ほどのWelcome to MAMPのページでMAMPの情報をメモしてください。
.envの修正
デフォルトだと以下のようになっています。
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_USERNAME=root DB_PASSWORD=これを、MAMPの情報を元に、以下のように変えます。
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock DB_DATABASE=先ほど作ったデータベース名 DB_USERNAME=root DB_PASSWORD=root次はdatabase.phpです。
database.phpの修正
デフォルトのdatabase.phpはこうなっています。
'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''),それを、以下のように変えます。
'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', '先ほど作ったデータベース名'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', 'root'),以上で環境構築とデータベース接続まで行えるはずです!
では、良き開発ライフを!!!
- 投稿日:2020-07-28T12:36:21+09:00
【初心者・備忘録】Win10+Rails+MySQLで新規プロジェクト立ち上げ
新規立ち上げまでにエラーに数回引っかかったので
備忘録として。開発環境
- Windows10
- Ruby 2.6.6
- Rails 5.2.4.3
- MySQL 8.0.20
手順
- コマンドで
rails new アプリ名 -d mysql
を実行
- (-d mysqlでデフォルトのSQLiteからMySQLへデータベース変更ができる)
- MySQLで新規user作成 ※allグローバル権限を与える
- 新規userのパス認証を
catching_sha_password
からmysql_native_password
へ変更- Railsアプリ内の
database.yml
ファイル開く→使用するMySQLのusername、passwordに書き換える- Railsアプリ内の
gemfile
ファイル開く→MySQLの項目を自分が使っているバージョンに書き換える- コマンドで
bundle install
を実行- コマンドで
rails db:create
を実行→Railsがデータベース生成してくれる!
- 投稿日:2020-07-28T12:07:24+09:00
【初心者向け?】SQL超マスター〜複雑なテーブルにへこたれない編〜【Railsとの比較あり】
はじめに
Rails
を利用していると、普通に使っている分にはどんなSQLが発行されるんだろう?
ということを考えずとも、欲しいレコードが簡単に取得できますよね。Rails
を学び始めた頃からすごいな〜と思っていましたが、今になってもやはり凄いなと思います。ただ1つ、便利だからこそ生じる弊害があります。それは
>>>SQLが書けなくなる<<<
別に、「SQLが書けなくても
ActiveRecord
とかが頑張ってくれるから困らないじゃん」と思っている方もいらっしゃるかもしれません。私もそう思っていました。
しかし、例えRails
であっても、テーブル構造が複雑になってくると、どんなSQLを発行したいのか?
という部分が分からないと、Rails
でどう書いたらデータが取れるのか?というのが分からなくなります。業務中に、そういった場面と直面する機会が最近格段に増え物凄く困った、危機感を持った、というのが私の体験談であり、結果として「やばい、SQL勉強し直そう」と思うきっかけとなりました。
なんとなくでRails
でレコードを取得している方は、この記事で一緒に学び直しましょう!環境
- Docker for Mac 2.3.0.3
- Ruby 2.6.6
- Rails 6.0.3
- MySQL 8.0
- DBeaver 7.1.0
環境構築
- こちらからリポジトリをcloneする
$ docker-compose build
を実行$ docker-compose up -d
を実行$ docker-compose exec web rails db:create
を実行$ docker-compose exec web rails db:migrate
を実行$ docker-compose exec web rails db:seed
を実行- こちらの記事を参考に、
MySQL
とDBeaver
を接続するDBeaver
との接続後、students
テーブルにレコードが 6 件登録されていることを確認できればOK※DBeaver との接続時、MySQL の
root
パスワードを要求されると思います。
パスワードはdocker-compose.yml
のMYSQL_ROOT_PASSWORD
に指定した値を入力してください。(未設定の場合はpassword
が設定されます。)今回使用するテーブル
初級編〜SELECTの基礎を学ぶ〜
※ここからは
DBeaver
のSQLコンソール
を使用していきます。sql_master_development
がデフォルト選択されるよう設定を行って下さい。
universities
テーブルのレコードを全件取得する手始めに
universities
テーブルのレコードを全件取得してみましょう。これは簡単ですね!
universitiesテーブルのレコードを全件取得する
select * from universities;これは
Rails
だと以下のようになります。University.all特定のUniversityのレコードを取得する
では、次は
name
がUniversityA
のレコードを全件取得しましょう。
name
がUniversityA
のレコードを全件取得するselect * from universities where name = 'UniversityA';これは
Rails
だと以下のようなイメージです。University.where(name: 'UniversityA')
where
が出て来たので、find_by
もSQL
で書いてみましょう。
※1件のみ取得したい時はlimit
を使用します。
name
がUniversityA
のレコードを1件取得するselect * from universities where name = 'UniversityA' limit 1;中級編 テーブルを結合して、欲しいレコードを取得する
UniversityA
に紐づいたstudents
レコードを全件取得するテーブル結合について(簡易版)
≈
universities
テーブルとstudents
テーブルはuniversity_students
という中間テーブルによって紐づけられています。そのため、該当レコードを取得するためにはテーブル同士の結合が必要になります。
テーブル結合には内部結合(JOIN/INNER JOIN)
と外部結合(LEFT JOIN)
があります。
- 内部結合・・・あるカラムの値が一致しているレコードを取得し、結合して表示する
- 外部結合・・・あるカラムの値が一致していない場合でもテーブルを結合し、全件表示する
今回のような場合は
内部結合
か外部結合
か考えながら、まずは最終的に欲しい情報であるstudents
テーブルと中間テーブルであるuniversity_students
テーブルを結合して、students
レコードを全件取得してみましょう。※結合の構文は
inner join(left join)
結合するテーブル名
on
結合先テーブル名
.カラム名
=結合するテーブル名
.カラム名
name
がUniversityA
のレコードを1件取得するselect students.* from students inner join university_students on students.id = university_students.student_id;取得できましたか?
これはRails
だと以下のようになります。Student.joins(:university_student)結合したテーブルを使って、
UniversityA
に紐づいたstudents
レコードを全件取得するでは、次は本題である
UniversityA
に紐付いたstudents
レコードを全件取得していきましょう。
先ほどstudents
テーブルとuniversity_students
テーブルを結合したので、今回は追加でuniversity_students
テーブルとuniversities
テーブルを結合します。そして、
universities
レコードのname
カラムがUniversityA
であるものを特定すると、UniversityA
に紐づいたstudents
レコードを全件取得することができます。
StudentA
〜StudentF
まで取得できていたらOKです
UniversityA
に紐づいたstudents
レコードを全件取得するselect students.* from students inner join university_students on students.id = university_students.student_id inner join universities on university_students.university_id = universities.id where universities.name = 'UniversityA';これを
Rails
で書くと以下のようになります。Student.joins(:university).where(universities: { name: 'UniversityA' })この辺りから「
Rails
スゲー!!」という気持ちが大きくなってくるのではないでしょうか?
joins
が:university
のみの記述で良いのは、Model(Student)
でhas_one :university, through: :university_student
を定義しているからです。Railsは関連付けさえ綺麗に定義できれば上記のように記述をどんどん簡略化できるのでよいですね
UniversityA
に所属しているStudentA
のcourse_registrations
レコードを全件取得するこの辺から関連するテーブルが増えてきてごちゃごちゃします。
一つずつ紐解いて考えていきましょう。ここでは
UniversityA
大学に所属しているStudentA
さんのcourse_registration
レコード、つまり履修登録情報を取得します。ここで簡単に仕様を説明します。
course_registrations
レコードは年度毎に作成されます。
StudentA
さんは、2020年度
の時点で2回生です。
そのため、course_registrations
レコードは2レコード作成されています。
students
テーブルとcourse_registrations
テーブルはstudent_course_registrations
という中間テーブルを持っています。
UniversityA
大学に所属しているStudentA
さんのcourse_registration
レコードを全件取得するselect course_registrations.* from course_registrations inner join student_course_registrations on course_registrations.id = student_course_registrations.course_registration_id inner join students on student_course_registrations.student_id = students.id inner join university_students on students.id = university_students.student_id inner join universities on university_students.university_id = universities.id where universities.name = 'UniversityA' and students.name = 'StudentA';これを
Rails
で書くとこうなります。CourseRegistration.joins(student: :university) .where( students: { name: 'StudentA' }, universities: { name: 'UniversityA' } )ここまで書いた私「Railsやばい」
自分で生のSQLを全部書く時間と比較してどうでしょう?
Rails
凄い。さて、まだこれはテーブル結合として「まだ」優しいです。
この時点ではまだ、全て年度の履修を登録した
という情報しか取得できていません。
最初のER図を見た時に少し嫌な予感がした、という方。正しい判断です。
次はある年度
に履修した全ての科目
を取得してみましょう!
UniversityA
に所属しているStudentA
の2020
年度のCourseRegistration(履修登録情報)
に紐付いたsubjects
レコードを全件取得する見出しがカオスになってきました。
ただ、ここまでの知識を活かせばそう難しくないと思います。
subjects
テーブルとcourse_registrations
テーブルにも、例によってsubject_course_registrations
という中間テーブルがいます。
では、今までの知識を活かして取得してみましょう!
UniversityA
に所属しているStudentA
の2020
年度のCourseRegistration(履修登録情報)
に紐付いたsubjects
レコードを全件取得するselect subjects.* from subjects inner join subject_course_registrations on subjects.id = subject_course_registrations.subject_id inner join course_registrations on subject_course_registrations.course_registration_id = course_registrations.id inner join student_course_registrations on course_registrations.id = student_course_registrations.course_registration_id inner join students on student_course_registrations.student_id = students.id inner join university_students on students.id = university_students.student_id inner join universities on university_students.university_id = universities.id where universities.name = 'UniversityA' and students.name = 'StudentA' and course_registrations.year = '2020';これを
Rails
で書くと以下のようになります。Subject.joins(course_registration: { student: :university }) .where( universities: { name: 'UniversityA' }, students: { name: 'StudentA' }, course_registrations: { year: '2020' } )やっぱり
Rails
って凄いですね。。。
UniversityA
に所属するTeacherA
が受け持っている科目基礎英語
を2020年度
に受講する生徒を全件取得する
subjects
レコードを取得したから、今度はどうせteachers
レコードでも取得するんでしょうと思われた方もいるかもしれません。
ですが、恐らくワンパターンすぎて飽きてきたという方もいるでしょう。
私も流石に(ちょっともういいかな……)と思えてきたため、teachers
レコードを追加するのは各自で試してみていただければ、と思います。今度は生徒ではなく、教員側がデータベースに登録された情報を参照したい場合を考えてみます。
表題のようなレコードが欲しい、というケースですが、例えば
教員
が 「今年度の出席簿を作りたいな……」と思った時に、履修対象者を全件取得したい、といった時に起こり得そうですね。
UniversityA
に所属するTeacherA
が受け持っている科目基礎英語
を2020年度
に受講する生徒を全件取得するselect distinct students.* from students inner join student_course_registrations on student_course_registrations.student_id = students.id inner join course_registrations on course_registrations.id = student_course_registrations.course_registration_id inner join subject_course_registrations on subject_course_registrations.course_registration_id = course_registrations.id inner join subjects on subjects.id = subject_course_registrations.subject_id inner join subject_teachers on subject_teachers.subject_id = subjects.id inner join teachers on teachers.id = subject_teachers.teacher_id inner join university_teachers on university_teachers.university_id = teachers.id inner join universities on university_teachers.university_id = universities.id where universities.name = 'UniversityA' and teachers.name = 'TeacherA' and subjects.name = '基礎英語' and course_registrations.year = '2020';これを
Rails
で書くと以下のようになります。Student.joins(course_registrations: { subjects: { teachers: :university } }) .where( course_registrations:{ subjects: { name: '基礎英語' }, teachers: { name: 'TeacherA' }, universities: { name: 'UniversityA' }, course_registrations: { year: '2020' } } )上級(?)編 結合したテーブルを使って合計値を出す
各生徒ごとの総取得単位を取得する
ただレコードをとるだけでは面白くないので、次は生徒の名前と、総取得単位を取得し閲覧したいと思います。
取得するのは以下のようなデータです。
student_name total_credit StudentA 13 StudentB 13 StudentC 8 StudentD 7 ・・・ ・・・ 今回は
生徒
ごとの単位の合計
を出すので、students
テーブルとsubjects
テーブルの情報が必要になります。1人の生徒には年度ごとに
履修登録情報
が紐づいていて、履修登録情報
に各科目
の情報が紐づいている、というのは一度SQLを書いたので問題ないと思います。キモとなるのは、
1人ずつ
単位の合計値をまとめたい
という点だと思います。
情報をまとめたい場合はGROUP BY
を使います。group by (カラム名)また、カラムの合計値を出す時は
SUM関数
を使います。sum(カラム)そして、先程の表を見ると、少しヘッダーの表示がカラム名と異なっていたと思います。
AS
でエイリアスをつける必要がありそうですね。上記のことを踏まえて、SQLを書いてみましょう!
各生徒ごとの総取得単位を取得する
select students.name as student_name, sum(subjects.credit) as sum_credit FROM students inner join student_course_registrations ON student_course_registrations.student_id = students.id inner join course_registrations ON course_registrations.id = student_course_registrations.course_registration_id inner join subject_course_registrations ON subject_course_registrations.course_registration_id = course_registrations.id inner join subjects ON subjects.id = subject_course_registrations.subject_id group by students.nameこれはRailsで書くと以下のようになります。
Student.joins(course_registrations: :subjects) .group('students.name') .sum(:credit)書く量が全然違いますよね。
ただ、これを書こうと思った時に、結局どんな感じのSQLが発行されて欲しいのか?というところがわからないと、「???」となると思います。(私は毎回そうなっていました)また、「上みたいな場合だと
Ruby
でなんとかできそうだから、map
とかeach_with_object
使ってなんとかしちゃお」と私は思いがちだったのですが、純粋に値が必要なだけであればデータベースから直接取得できるので、Ruby
でゴリ押すのではなく、いい感じのSQL
を発行して必要な値を取得する、というのも必要なスキルだなと思いました最後に
親子関係のあるテーブルならまだ良いのですが、親子孫曽孫……のような構成のテーブルがあった時に、「親から曽孫ってどうやってとるんだ!?!?」と混乱することが多かったのですが、「どのテーブルのレコードが主人公になっているのか?」を意識しながら書いていくとそんなに複雑ではないということが分かったと思います。
また、Railsでレコードを取得する時も少し混乱してしまいがちですが、SQLのテーブル結合を意識するとシンプルに書いていくことができるので、
こんなSQLが発行されて欲しい!
というのを意識しながら書いていくと良いですねRailsでシンプルに書いていこうと思うと、Modelに定義する
関連付け
が大事だという話を少ししました。テーブルが複雑になればなるほど、この関連付け
の定義も難しくなります(ここ最近私が頭を抱えているところです。)次はRailsで条件付きの
has_one
・has_many
の定義の仕方を学べるようなQiitaが書けたらと思っています
- 投稿日:2020-07-28T10:00:39+09:00
【mysql】Access denied for userが出たときの対処法
Mysql(ver8)の開発用DBを、さくっと作りたい人向け。
そして、せっかちでじっくりドキュメントを読みたくない人向けです。
コピペしたけど実行したら、うまくいかないって場合に読んでみてください。そもそもちゃんとドキュメント読めという話は一旦置いておいて・・。
以下のようなエラーが出たときの対処法。
28000Access denied for user 'xxxxx'@'xxxxxxxxxxxxx' (using password: YES)42000Access denied for user 'xxxxx'@'xxxxxxxxxxxxx' (using password: YES)参考
前提
Mysqlのデータベースは、「localhost」に構築済。
各コマンドは、rootユーザで実行。
作成するユーザは、ユーザID:test パスワード:test1.データベースの作成
create database testDB;2.ユーザの作成(コピペを間違える。。)
create user 'test'@'192.168.0.1' identified by 'test';以下のエラーがでます。
28000Access denied for user 'test'@'192.168.0.1' (using password: YES)2-1.ユーザの作成(やり直し)
一度、ユーザを削除
drop user 'test'@'192.168.0.1';上記のdropコマンド実行後に以下コマンド
create user 'test'@'localhost' identified by 'test'; --localhostからのアクセスを許可もしくは
create user 'test'@'%' identified by 'test'; --全hostからのアクセスを許可3.DBに接続
接続しようとすると、権限が無いので、以下のエラーが発生。
42000Access denied for user 'test'@'localhost' (using password: YES)3-1.権限の付与
※以下コマンドの「localhost」の部分は、適宜「%」にするなど、変更してください。
GRANT ALL ON testDB.* TO 'test'@'localhost'; --testDBに対するすべての権限を付与もしくは
GRANT ALL ON *.* TO 'test'@'localhost'; --全DBに対するすべての権限を付与これでデータベースを操作できるようになるはず。
- 投稿日:2020-07-28T01:04:39+09:00
サーバー二台でdocker + MySQLを用いてレプリケーション
ラズパイをサーバー化して環境構築をしているのですが、大苦戦中です。
CPUのアーキテクチャが組込用なので便利なdocker imageが全然使えないという。。。
SSL認証のときも大変でしたが、それはまた別の記事で。※今回はラズパイをDBサーバーとしましたが、通常のオンプレサーバーであっても同じ書き方でできるはずです。
1.やりたいこと
1.1.レプリケーション
サーバー1にマスターDBをおき、サーバー2にスレイブDBをおいて、スレイブでマスターDBの更新を検知して全くDBを保持すること
片方のサーバーが物理的に壊れてもDBのデータは残ります。(うっかりdrop tableなんてオペミスは無理ですが)1.2.レプリケーションの設定をdockerで簡略化
結構めんどくさいので、新しいサーバーにもdocker-compose up -dの1コマンドで環境を設定できたら楽です
2.手順
2.1.全体の構成
サーバー構成
192.168.0.2 → master用サーバー
192.168.0.3 → slave用サーバーディレクトリ構成
├── db
│ ├── Dockerfile
│ ├── conf
│ │ ├── master.cnf
│ │ └── slave.cnf
│ └── sql
│ ├── init_master.sql
│ └── init_slave.sql
├── docker-compose.yml↑treeコマンドで表示したのですが、みづらいですねすみません。
2.2.docker-compose.ymlの作成
docker-compose.ymlにてdbディレクトリをビルドします
そしてdbディレクトリには必要な設定ファイルを仕込むのですが、まずはdocker-composeだけ載せますとdocker-compose.ymlversion: '3' services: db: build: ./db command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: db_name MYSQL_USER: user MYSQL_PASSWORD: password TZ: 'Asia/Tokyo'。 volumes: # 初期データを投入するSQLが格納されているdir - ./db/sql:/docker-entrypoint-initdb.d # 永続化するときにマウントするdir - /var/lib/mysql:/var/lib/mysqlbuild: ./dbにてdocker-compose.ymlと同じ階層のdbディレクトリをビルドしています。
2.3.dockerfileとconfigファイルの作成
次にdockerfileを書きます。
これは一部、マスターとスレーブで書き換えが要りますDockerfileFROM mysql:5.7 # 読み込むconfファイルをマスターかスレーブかでコメントアウトして分岐させる #ENV conf_file ./conf/slave.cnf ENV conf_file ./conf/master.cnf ADD $conf_file /etc/mysql/my.cnf RUN chmod 644 /etc/mysql/my.cnfこれまではほとんどmasterとslaveで個別の設定はありませんでした。
次にmasterとslaveのそれぞれのconfファイルを設定していきます。
master.conf[mysqld] user=mysql server-id = 1 log-bin binlog-format = MIXEDslave.conf[mysqld] user=mysql server-id=2 log-bin read_only2.4.DB初期化時に読み込まれるファイルの作成
次にdbディレクトリがビルドされるときの初期化のsqlを書きます
init_master.sql-- slaveが使用するユーザーを設定(slaveのサーバーの内部IPに合わせる) CREATE USER 'replica'@'192.168.0.3' IDENTIFIED BY 'replica'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.3';init_slave.sql-- MASTER_LOG_FILEやMASTER_LOG_POSの調べ方は後述 CHANGE MASTER TO MASTER_HOST='192.168.0.2', MASTER_PORT=3306, MASTER_USER='replica', MASTER_PASSWORD='replica', MASTER_LOG_FILE='3ae7abcabc-bin.000003', MASTER_LOG_POS=1234;init_slave.sqlのmaster_log_fileやmaster_log_posの調べ方ですが、マスターDBサーバーのコンテナに入って
$docker exec -it <container_id> bash #mysql -u root -p password >show master status\G;こんな順番でコマンドを入力するとマスターのログファイルの位置が取得できます。
mysql 5.7以降だったか、わざわざこんなことをしなくても
MASTER_AUTO_POSITION=1
と設定するだけでいけるとかなんとかこれでレプリケーションできるかと思います。
何もミスってなければslaveのサーバーにて
$docker exec -it <container_id> bash #mysql -u root -p password >show slave status\G;こんな感じでDBコンテナに入ってコマンドを打つとずらーっと表示されますが
Slave_IO_Running: Yes Slave_SQL_Running: Yesこの2つのパラメータがYesになります
connectingとか書いてたらだめです。ずらーっと表示されている下の方にエラー内容が出ます
Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error:※これは正常な状態です
ここに出てくるエラーナンバーやエラーメッセージを頼りにデバッグしたらできるかと思います。
どうしても自動化しきれていませんが、だいぶ再現するのが楽にはできたかなと思います。
何か補足があったらぜひお願いいたします。あ、あと既にテーブルがあって運用中のDBをマスタースレーブ構成にしたい場合は、masterでダンプしてそのデータをslaveでリストアして反映する必要があります。
https://qiita.com/marienplatz/items/3255b2d7f7f922ab115a
こっちに書きましたので参考までに
- 投稿日:2020-07-28T00:43:36+09:00
Laravel×Herokuデプロイ(MySQL) + Cloudinary
はじめに
この記事は既にLaravelアプリを作成済みである状態から説明する。
Herokuコマンドが使用できる状態であることを前提に進めていく。
なるべくHerokuコマンドを使用しないで操作していきますLaravelアプリフォルダ直下にてProcfileを作成する
Procfileとは
ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。
Procfileファイルの作成
コマンド操作により、アプリ直下に移動したのち、下記のコマンドを実行する
touch Procfile上記コマンドを実行後、Laravelアプリ直下にProcfileが作成されていることを確認する。
Procfileファイルの編集
Procfileには、何もコードが記載されていない状態である。
ここに下記のコードを記載する。web: vendor/bin/heroku-php-apache2 public/varchar型の文字数を191に制限
app\Providers\AppServiceProvider.phpを編集する
<?php 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() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); // この一行を追加 } }上記のコードで変更箇所は二箇所である。
変更と言っても2行追加したのみで、他は何も変更は要らない。
この記載が必要になる理由は、本番環境のDBを用意する際、つまりherokuでマイグレーションを実行する際にエラーが出るのを防ぐためである。Githubに変更を保存しよう
この記事でGitについては詳しく解説はしない。
Githubにデータの変更を全て反映させておきましょう。add commit pushHerokuでの作業
サインアップ
こちらをクリックしてherokuへの会員登録を行いましょう。
ログイン後~Heroku上でアプリの作成
Step1 アプリ作成①
ログインすると下記のような画面に遷移できるので、【New】ボタンから【Create new app】を選択しましょう。
Step2 アプリ作成②
【App name】に任意の名前を入力し、【Create app】を選択します。
【choose a region】は特に変更しなくても構いません。
Herokuアプリの設定
Step1 ClearDB MySQLの追加
初めて挑戦している方のために、写真を多用しております。
なお、Herokuに今回初めて、サインアップしてこの作業に挑んでいる方は、先にクレジットカードをHerokuに登録しておく必要があります。
登録しておかないと、ClearDB MySQLの追加ができません。
ログイン後、下記の画像にあるアイコン(画面右上)をクリックし、クレジットの登録を行いましょう。手順①
先程【Create new app】から作成したアプリをheroku上でクリックすると下記の画像のように、【Overview~Setting】のタブが開けるページへと遷移できる。
【Resources】タブをクリックすると、下記と同じ画面になることが確認できると思います。
【Find more add ons】をクリックします。
手順②
下記のページへと遷移されるので、【ClearDB MySQL】を探します。
手順③
手順④
【Install ClearDB MySQL】をクリックします。
その後、手順①のページへと戻りましょう。
手順⑤
手順①ではなかったClearDB MySQLが追加できたのが確認できます。
手順①〜⑤はコマンドでも操作できます
heroku addons:add cleardbStep2 DB情報を確認し、Configにセットする
手順① 【Settings】タブをクリックし、【Reveal Config Vars】をクリックする
手順② Valueにあたる部分、下記図で言うとmysql以下をメモ帳にメモする
手順③ Reveal Config Varsにkeyとvalueを追加する
メモ帳にメモしたものを参照しながら入力していく。
手順②でメモした値は下記の情報となっています。CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true上記、[ユーザー名][パスワード][ホスト名][データベース名]の他、デプロイする際には下記の情報も追加で、Reveal Config Varsに入力するとよいでしょう。
// Reveal Config Varsに入力しておくもの(データベース情報をもとに入力) DB_DATABASE = データベース名 DB_HOST = ホスト名 DB_PASSWORD = パスワード DB_USERNAME = ユーザー名 // 追加でいれておくもの DB_CONNECTION = mysql APP_ENV = heroku APP_KEY = ここはローカルのenv.ファイルにあるAPP_KEYの値を入れる(php artisan key:generateで生成される) APP_NAME = 任意の名前 LANG = ja_JP.UTF-8 TZ = Asia/Tokyo手順②はコマンドでも操作できます
heroku config | grep CLEARDB_DATABASE_URL手順③はコマンドでも操作できます
heroku config:set DB_DATABASE= データベース名 heroku config:set DB_HOST= ホスト名 heroku config:set DB_USERNAME= ユーザー名 heroku config:set DB_PASSWORD= パスワード heroku config:set APP_KEY=$(php artisan key:generate --show) heroku config:set APP_ENV=heroku heroku config:set LANG=ja_JP.UTF-8 heroku config:set TZ=Asia/TokyoStep3 GithubとHerokuの連携
手順① 【Deploy】をクリックし、画面中央の【Github】から該当のリポジトリを選択、最後にDeploy Branchをクリックします
手順①はコマンドでも操作できます
git push heroku masterマイグレーションの実行
heroku run php artisan migrateWebサイトを確認
コマンドでも操作できます
heroku openCloudinaryとHerokuの連携
既にLaravelアプリを作成済みで、Cloudinaryを使用して写真を保存するなどの処理を書いていることを前提に進めますが、この記事を見てくださっている方の中には、Herokuにデプロイしたものの、これからCloudinaryと連携したアプリを作成しようと考えている方もいると思い、簡単にCloudinaryについて紹介します。
Cloudinaryとは
画像を管理するクラウドサービスで、画像の保存、変換、配信がとても簡単できます。
こちらをクリックし、アカウントを開設してみましょう。Cloudinaryを使用する目的
本番環境からでもCloudinaryに写真を保存できるように設定し、HerokuからCloudinaryに保存してある写真をとりだせるようにするため。
Cloudinaryへログイン(ここから作業です)
Dashboardを開き、下記の3つをメモする。
Revealをクリックすると値がきちんと表示されます。Cloud name: API Key: API Secret:Configにセットする
Herokuに戻り、【Setting】タブをクリック、Reveal Config Varsをクリックし、下記のようにkeyとvalueをセットする
CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値 CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値 CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値コマンドでも操作できます
heroku config:set CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値 heroku config:set CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値 heroku config:set CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値ここまでの【Reveal Config Vars】は下記のようにセットしてあります
Herokuでアプリを開き挙動を確認しましょう
写真投稿アプリを作成している場合、本番環境でも写真を投稿したら、Cloudinaryに写真が保存できていることが確認できるかと思います。
おまけ
GUIツールを使用して本番環境のDBを可視化しよう
- macユーザー
- Sequel proをダウンロード
- windowsユーザー
- Table Plusをダウンロード
Sequel pro使用方法
Table plusもやることは同じです。
適宜読み替えてトライしてください。ダウンロードしたSequel proを立ち上げます
下記の図のように画面が表示されます。
- ホスト(hostname)
- ユーザー名(username)
- パスワード(password)
- データベース(dbname)
これらの項目にCLEARDB_DATABASE_URLのそれぞれの値を入力しましょう
CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true入力後、接続テストを行い、問題なければ【お気に入りに追加】を押した後に、接続を押しましょう
本番環境のデータが可視化できることを確認します。
まとめ
Laravelではデータベースとの接続情報は、.envに記載されている。つまりGithubにデータベースとの接続情報はアップロードされません。
そのため、本番環境用にデータベースとの接続情報を記載してやる何かが必要です。
それが今回でいうConfigです。
コマンドでも操作できますが、今回はherokuのwebサイト上から操作してみました。
もう一つ大事なことはherokuではClearDB MySQLを使用できるということです。
注意点として.envに記載のDB情報をconfigの中に書かないことをあげておきます。
configにセットするDB情報は、本番環境用のDB情報です。つまり今回でいうとClearDB MySQLの情報になる訳です。
- 投稿日:2020-07-28T00:43:36+09:00
Laravel×Herokuデプロイ(MySQL) + Cloudinary
はじめに
この記事は既にLaravelアプリを作成済みである状態から説明する。
Herokuコマンドが使用できる状態であることを前提に進めていく。
なるべくHerokuコマンドを使用しないで操作していきますLaravelアプリフォルダ直下にてProcfileを作成する
Procfileとは
ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。
Procfileファイルの作成
コマンド操作により、アプリ直下に移動したのち、下記のコマンドを実行する
touch Procfile上記コマンドを実行後、Laravelアプリ直下にProcfileが作成されていることを確認する。
Procfileファイルの編集
Procfileには、何もコードが記載されていない状態である。
ここに下記のコードを記載する。web: vendor/bin/heroku-php-apache2 public/varchar型の文字数を191に制限
app\Providers\AppServiceProvider.phpを編集する
<?php 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() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); // この一行を追加 } }上記のコードで変更箇所は二箇所である。
変更と言っても2行追加したのみで、他は何も変更は要らない。
この記載が必要になる理由は、本番環境のDBを用意する際、つまりherokuでマイグレーションを実行する際にエラーが出るのを防ぐためである。Githubに変更を保存しよう
この記事でGitについては詳しく解説はしない。
Githubにデータの変更を全て反映させておきましょう。add commit pushHerokuでの作業
サインアップ
こちらをクリックしてherokuへの会員登録を行いましょう。
ログイン後~Heroku上でアプリの作成
Step1 アプリ作成①
ログインすると下記のような画面に遷移できるので、【New】ボタンから【Create new app】を選択しましょう。
Step2 アプリ作成②
【App name】に任意の名前を入力し、【Create app】を選択します。
【choose a region】は特に変更しなくても構いません。
Herokuアプリの設定
Step1 ClearDB MySQLの追加
初めて挑戦している方のために、写真を多用しております。
なお、Herokuに今回初めて、サインアップしてこの作業に挑んでいる方は、先にクレジットカードをHerokuに登録しておく必要があります。
登録しておかないと、ClearDB MySQLの追加ができません。
ログイン後、下記の画像にあるアイコン(画面右上)をクリックし、クレジットの登録を行いましょう。手順①
先程【Create new app】から作成したアプリをheroku上でクリックすると下記の画像のように、【Overview~Setting】のタブが開けるページへと遷移できる。
【Resources】タブをクリックすると、下記と同じ画面になることが確認できると思います。
【Find more add ons】をクリックします。
手順②
下記のページへと遷移されるので、【ClearDB MySQL】を探します。
手順③
手順④
【Install ClearDB MySQL】をクリックします。
その後、手順①のページへと戻りましょう。
手順⑤
手順①ではなかったClearDB MySQLが追加できたのが確認できます。
手順①〜⑤はコマンドでも操作できます
heroku addons:add cleardbStep2 DB情報を確認し、Configにセットする
手順① 【Settings】タブをクリックし、【Reveal Config Vars】をクリックする
手順② Valueにあたる部分、下記図で言うとmysql以下をメモ帳にメモする
手順③ Reveal Config Varsにkeyとvalueを追加する
メモ帳にメモしたものを参照しながら入力していく。
手順②でメモした値は下記の情報となっています。CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true上記、[ユーザー名][パスワード][ホスト名][データベース名]の他、デプロイする際には下記の情報も追加で、Reveal Config Varsに入力するとよいでしょう。
// Reveal Config Varsに入力しておくもの(データベース情報をもとに入力) DB_DATABASE = データベース名 DB_HOST = ホスト名 DB_PASSWORD = パスワード DB_USERNAME = ユーザー名 // 追加でいれておくもの DB_CONNECTION = mysql APP_ENV = heroku APP_KEY = ここはローカルのenv.ファイルにあるAPP_KEYの値を入れる(php artisan key:generateで生成される) APP_NAME = 任意の名前 LANG = ja_JP.UTF-8 TZ = Asia/Tokyo手順②はコマンドでも操作できます
heroku config | grep CLEARDB_DATABASE_URL手順③はコマンドでも操作できます
heroku config:set DB_DATABASE= データベース名 heroku config:set DB_HOST= ホスト名 heroku config:set DB_USERNAME= ユーザー名 heroku config:set DB_PASSWORD= パスワード heroku config:set APP_KEY=$(php artisan key:generate --show) heroku config:set APP_ENV=heroku heroku config:set LANG=ja_JP.UTF-8 heroku config:set TZ=Asia/TokyoStep3 GithubとHerokuの連携
手順① 【Deploy】をクリックし、画面中央の【Github】から該当のリポジトリを選択、最後にDeploy Branchをクリックします
手順①はコマンドでも操作できます
git push heroku masterマイグレーションの実行
heroku run php artisan migrateWebサイトを確認
コマンドでも操作できます
heroku openCloudinaryとHerokuの連携
既にLaravelアプリを作成済みで、Cloudinaryを使用して写真を保存するなどの処理を書いていることを前提に進めますが、この記事を見てくださっている方の中には、Herokuにデプロイしたものの、これからCloudinaryと連携したアプリを作成しようと考えている方もいると思い、簡単にCloudinaryについて紹介します。
Cloudinaryとは
画像を管理するクラウドサービスで、画像の保存、変換、配信がとても簡単できます。
こちらをクリックし、アカウントを開設してみましょう。Cloudinaryを使用する目的
本番環境からでもCloudinaryに写真を保存できるように設定し、HerokuからCloudinaryに保存してある写真をとりだせるようにするため。
Cloudinaryへログイン(ここから作業です)
Dashboardを開き、下記の3つをメモする。
Revealをクリックすると値がきちんと表示されます。Cloud name: API Key: API Secret:Configにセットする
Herokuに戻り、【Setting】タブをクリック、Reveal Config Varsをクリックし、下記のようにkeyとvalueをセットする
CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値 CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値 CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値コマンドでも操作できます
heroku config:set CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値 heroku config:set CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値 heroku config:set CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値ここまでの【Reveal Config Vars】は下記のようにセットしてあります
Herokuでアプリを開き挙動を確認しましょう
写真投稿アプリを作成している場合、本番環境でも写真を投稿したら、Cloudinaryに写真が保存できていることが確認できるかと思います。
おまけ
GUIツールを使用して本番環境のDBを可視化しよう
- macユーザー
- Sequel proをダウンロード
- windowsユーザー
- Table Plusをダウンロード
Sequel pro使用方法
Table plusもやることは同じです。
適宜読み替えてトライしてください。ダウンロードしたSequel proを立ち上げます
下記の図のように画面が表示されます。
- ホスト(hostname)
- ユーザー名(username)
- パスワード(password)
- データベース(dbname)
これらの項目にCLEARDB_DATABASE_URLのそれぞれの値を入力しましょう
CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true入力後、接続テストを行い、問題なければ【お気に入りに追加】を押した後に、接続を押しましょう
本番環境のデータが可視化できることを確認します。
まとめ
Laravelではデータベースとの接続情報は、.envに記載されています。
つまりGithubにデータベースとの接続情報はアップロードされません。
そのため、本番環境用にデータベースとの接続情報を記載してやる何かが必要です。
それが今回でいうConfigです。
コマンドでも操作できますが、今回はherokuのwebサイト上から操作してみました。
もう一つ大事なことはherokuではClearDB MySQLを使用できるということです。
注意点として.envに記載のDB情報をconfigの中に書かないことをあげておきます。
configにセットするDB情報は、本番環境用のDB情報です。
つまり今回でいうとClearDB MySQLの情報ということになります。
- 投稿日:2020-07-28T00:43:36+09:00
【初めてのデプロイ】Laravel×Herokuデプロイ(MySQL) + Cloudinary
はじめに
初めてLaravelでMySQLを使用したアプリをデプロイしてみたい方に向けた記事です。
この記事は既にLaravelアプリを作成済みである状態から説明します。
Herokuコマンドが使用できる状態であることを前提に進めていく。
なるべくHerokuコマンドを使用しないで操作していきますLaravelアプリフォルダ直下にてProcfileを作成する
Procfileとは
ProcfileはHerokuアプリの起動時に実行するプロセスを定義するためのファイルです。
Procfileファイルの作成
コマンド操作により、アプリ直下に移動したのち、下記のコマンドを実行する
touch Procfile上記コマンドを実行後、Laravelアプリ直下にProcfileが作成されていることを確認する。
Procfileファイルの編集
Procfileには、何もコードが記載されていない状態である。
ここに下記のコードを記載する。web: vendor/bin/heroku-php-apache2 public/varchar型の文字数を191に制限
app\Providers\AppServiceProvider.phpを編集する
<?php 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() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); // この一行を追加 } }上記のコードで変更箇所は二箇所である。
変更と言っても2行追加したのみで、他は何も変更は要らない。
この記載が必要になる理由は、本番環境のDBを用意する際、つまりherokuでマイグレーションを実行する際にエラーが出るのを防ぐためである。Githubに変更を保存しよう
この記事でGitについては詳しく解説はしない。
Githubにデータの変更を全て反映させておきましょう。add commit pushHerokuでの作業
サインアップ
こちらをクリックしてherokuへの会員登録を行いましょう。
ログイン後~Heroku上でアプリの作成
Step1 アプリ作成①
ログインすると下記のような画面に遷移できるので、【New】ボタンから【Create new app】を選択しましょう。
Step2 アプリ作成②
【App name】に任意の名前を入力し、【Create app】を選択します。
【choose a region】は特に変更しなくても構いません。
Herokuアプリの設定
Step1 ClearDB MySQLの追加
初めて挑戦している方のために、写真を多用しております。
なお、Herokuに今回初めて、サインアップしてこの作業に挑んでいる方は、先にクレジットカードをHerokuに登録しておく必要があります。
登録しておかないと、ClearDB MySQLの追加ができません。
ログイン後、下記の画像にあるアイコン(画面右上)をクリックし、クレジットの登録を行いましょう。手順①
先程【Create new app】から作成したアプリをheroku上でクリックすると下記の画像のように、【Overview~Setting】のタブが開けるページへと遷移できる。
【Resources】タブをクリックすると、下記と同じ画面になることが確認できると思います。
【Find more add ons】をクリックします。
手順②
下記のページへと遷移されるので、【ClearDB MySQL】を探します。
手順③
手順④
【Install ClearDB MySQL】をクリックします。
その後、手順①のページへと戻りましょう。
手順⑤
手順①ではなかったClearDB MySQLが追加できたのが確認できます。
手順①〜⑤はコマンドでも操作できます
heroku addons:add cleardbStep2 DB情報を確認し、Configにセットする
手順① 【Settings】タブをクリックし、【Reveal Config Vars】をクリックする
手順② Valueにあたる部分、下記図で言うとmysql以下をメモ帳にメモする
手順③ Reveal Config Varsにkeyとvalueを追加する
メモ帳にメモしたものを参照しながら入力していく。
手順②でメモした値は下記の情報となっています。CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true上記、[ユーザー名][パスワード][ホスト名][データベース名]の他、デプロイする際には下記の情報も追加で、Reveal Config Varsに入力するとよいでしょう。
// Reveal Config Varsに入力しておくもの(データベース情報をもとに入力) DB_DATABASE = データベース名 DB_HOST = ホスト名 DB_PASSWORD = パスワード DB_USERNAME = ユーザー名 // 追加でいれておくもの DB_CONNECTION = mysql APP_ENV = heroku APP_KEY = ここはローカルのenv.ファイルにあるAPP_KEYの値を入れる(php artisan key:generateで生成される) APP_NAME = 任意の名前 LANG = ja_JP.UTF-8 TZ = Asia/Tokyo手順②はコマンドでも操作できます
heroku config | grep CLEARDB_DATABASE_URL手順③はコマンドでも操作できます(下記コマンドは1行ずつ実行します)
heroku config:set DB_DATABASE= データベース名 heroku config:set DB_HOST= ホスト名 heroku config:set DB_USERNAME= ユーザー名 heroku config:set DB_PASSWORD= パスワード heroku config:set APP_KEY=$(php artisan key:generate --show) heroku config:set APP_ENV=heroku heroku config:set LANG=ja_JP.UTF-8 heroku config:set TZ=Asia/TokyoStep3 GithubとHerokuの連携
手順① 【Deploy】をクリックし、画面中央の【Github】から該当のリポジトリを選択、最後にDeploy Branchをクリックします
連携コマンド操作
heroku git:remote -a herokuアプリ名;手順①はコマンドでも操作できます
git push heroku masterマイグレーションの実行
heroku run php artisan migrateHeroku上でGithubとHerokuを連携したあとに、マイグレーションを実行します
この際にエラーがでてしまうのは、GitとHerokuの連携がうまく行われていないことがおおいです。
その場合は、上記連携コマンド操作
とgit push heroku master
をコマンドで実行しましょう。Webサイトを確認
Open app をクリックします
ここまででLaravelアプリ(MySQL使用)のデプロイは完了です
コマンドでも操作できます
heroku openCloudinaryとHerokuの連携
既にLaravelアプリを作成済みで、Cloudinaryを使用して写真を保存するなどの処理を書いていることを前提に進めますが、この記事を見てくださっている方の中には、Herokuにデプロイしたものの、これからCloudinaryと連携したアプリを作成しようと考えている方もいると思い、簡単にCloudinaryについて紹介します。
Cloudinaryとは
画像を管理するクラウドサービスで、画像の保存、変換、配信がとても簡単できます。
こちらをクリックし、アカウントを開設してみましょう。Cloudinaryを使用する目的
本番環境からでもCloudinaryに写真を保存できるように設定し、HerokuからCloudinaryに保存してある写真をとりだせるようにするため。
Cloudinaryへログイン(ここから作業です)
Dashboardを開き、下記の3つをメモする。
Revealをクリックすると値がきちんと表示されます。Cloud name: API Key: API Secret:Configにセットする
Herokuに戻り、【Setting】タブをクリック、Reveal Config Varsをクリックし、下記のようにkeyとvalueをセットする
CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値 CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値 CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値コマンドでも操作できます
heroku config:set CLOUDINARY_API_KEY = 上記でメモしたAPI Keyの値 heroku config:set CLOUDINARY_API_SECRET = 上記でメモしたAPI Secretの値 heroku config:set CLOUDINARY_CLOUD_NAME = 上記でメモしたCloud nameの値ここまでの【Reveal Config Vars】は下記のようにセットしてあります
Herokuでアプリを開き挙動を確認しましょう
写真投稿アプリを作成している場合、本番環境でも写真を投稿したら、Cloudinaryに写真が保存できていることが確認できるかと思います。
おまけ
GUIツールを使用して本番環境のDBを可視化しよう
- macユーザー
- Sequel proをダウンロード
- windowsユーザー
- Table Plusをダウンロード
Sequel pro使用方法
Table plusもやることは同じです。
適宜読み替えてトライしてください。ダウンロードしたSequel proを立ち上げます
下記の図のように画面が表示されます。
- ホスト(hostname)
- ユーザー名(username)
- パスワード(password)
- データベース(dbname)
これらの項目にCLEARDB_DATABASE_URLのそれぞれの値を入力しましょう
CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true入力後、接続テストを行い、問題なければ【お気に入りに追加】を押した後に、接続を押しましょう
本番環境のデータが可視化できることを確認します。
まとめ
Laravelではデータベースとの接続情報は、.envに記載されています。
つまりGithubにデータベースとの接続情報はアップロードされません。
そのため、本番環境用にデータベースとの接続情報を記載してやる何かが必要です。
それが今回でいうConfigです。
コマンドでも操作できますが、今回はherokuのwebサイト上から操作してみました。
もう一つ大事なことはherokuではClearDB MySQLを使用できるということです。
注意点として.envに記載のDB情報をconfigの中に書かないことをあげておきます。
configにセットするDB情報は、本番環境用のDB情報です。
つまり今回でいうとClearDB MySQLの情報ということになります。