以前にデプロイのお試しとして、Java Servlet で作成したプログラムを Heroku へデプロイしてみました。
その時にはデータベースを使用していない(「Hello World!」と表示するだけの)アプリのデプロイでしたので、今回はデータベースを使用している場合のデプロイ方法について解説します。
※ローカルで使用しているデータベースはMySQLを前提に解説しています。
- Heroku準備
- データベースのバックアップを取得
- Herokuへログイン
- アプリケーション用の領域確保
- サーバインスタンスのタイムゾーンを設定
- HerokuのMySQL(clearDB)を設定
- HerokuのMySQLにテーブルを作成する
- persistence.xmlの設定
- プロジェクトのwarファイルを作る
- WARファイルをHerokuにデプロイ
- まとめ
- 参考図書
Heroku準備
まずHerokuの準備は以前と同じですので、「Heroku へのアカウント登録」「Heroku CLIツールのインストール」「デプロイツールをインストール」まで、前回の記事を参考に準備しましょう。
データベースのバックアップを取得
ターミナル(コマンドプロンプト)を開き、現在のローカルのMySQLについて、 データベースのバックアップを取得します。
$ mysqldump -u root -p [データベース名] > [データベース名].sql Enter password: ********(rootユーザのパスワードを入力)
これで、[データベース名].sql という名前でバックアップファイルが作成されます。
これは後でHeroku上にデータベースを作成するときに使用します。
Herokuへログイン
ターミナル上で、Herokuにログインします。
$ heroku login -i Enter your Heroku credentials. Email: Herokuに登録したメールアドレスを入力 Password: Herokuに登録したパスワードを入力
Herokuにログイン成功すると以下のメッセージが表示されます。
Logged in as Herokuに登録したメールアドレス
アプリケーション用の領域確保
Heroku上に自分のアプリケーション用の領域を名前をつけて確保します。
Herokuでは他のユーザがすでに登録している領域の名前と同じものを登録できないため、独自の名前で領域を作成します。
今回は「hello-db-norris」という名前で作成します。
$ heroku create hello-db-norris Creating ⬢ hello-db-norris... done https://hello-db-norris.herokuapp.com/ | https://git.heroku.com/hello-db-norris.git
サーバインスタンスのタイムゾーンを設定
念のためサーバインスタンスのタイムゾーンを設定しておきます。
デフォルトがグリニッジ標準時に設定されていますので、タイムゾーンの設定を追加して日本時間に合わせます。
$ heroku config:add TZ=Asia/Tokyo --app hello-db-norris Setting TZ and restarting ⬢ hello-db-norris... done, v3 TZ: Asia/Tokyo
下記コマンドで設定が反映されているか確認します。
$ heroku run date -a hello-db-norris Running date on ⬢ hello-db-norris... up, run.5054 (Free) Thu Mar 4 08:48:18 JST 2021
表示される日付時刻が現在日付時刻であることと、タイムゾーンが JST となっているのを確認できればOKです。
HerokuのMySQL(clearDB)を設定
Herokuにクレジットカード情報と氏名、住所を登録します。
データベースを使用するのにクレジットカード情報の登録が必要ですが課金はされません。
登録ができたら、以下のコマンドを実行します。
$ heroku addons:create cleardb:ignite --app hello-db-norris Creating cleardb:ignite on ⬢ hello-db-norris... free Created cleardb-spherical-39242 as CLEARDB_DATABASE_URL Use heroku addons:docs cleardb to view documentation
以下のコマンドでデータベースのURLを確認します。
(Macの場合)
$ heroku config --app hello-db-norris | grep CLEARDB_DATABASE_URL CLEARDB_DATABASE_URL: mysql://bce320a8674be8:d852ed25@us-cdbr-east-03.cleardb.com/heroku_44f7cd486a498c3?reconnect=true
(Windowsの場合)
> heroku config --app hello-db-norris | findstr CLEARDB_DATABASE_URL CLEARDB_DATABASE_URL: mysql://be7e2ae07ffe78:x17x7746@us-cdbr-east-03.cleardb.com/heroku_7d616eab354e8ff?reconnect=true
表示されたURLの構造は mysql://(ユーザ名):(パスワード)@(ドメイン)/(データベース名)?reconnect=true となっています。
これらの設定は環境によって異なりますので、自分の環境に合わせて読み替えてくださいね。
この情報をもとに、まずターミナル(コマンドプロンプト)から以下のように入力してパスワードを入力すれば自分のPCからHerokuのMySQLにログインできます。
$ mysql -h us-cdbr-east-03.cleardb.com -u bce320a8674be8 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2342857 Server version: 5.6.50-log MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
次のコマンドを実行するため、一旦MySQLは exitコマンドで終了します。
Herokuに作成したMySQLデータベースは latin1 という文字コードで設定されているため、そのまま利用するとアプリケーション上で文字化けを発生する可能性があります。
そこで、下記のコマンドを実行して「UTF-8 の文字コードでMySQLを利用する」設定をHerokuに追加します。
(Macの場合)
$ heroku config:add CLEARDB_DATABASE_URL='mysql://bce320a8674be8:d852ed25@us-cdbr-east-03.cleardb.com/heroku_44f7cd486a498c3?reconnect=true&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8' Setting CLEARDB_DATABASE_URL and restarting ⬢ hello-db-norris... done, v6 CLEARDB_DATABASE_URL: mysql://bce320a8674be8:d852ed25@us-cdbr-east-03.cleardb.com/heroku_44f7cd486a498c3?reconnect=true&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
(Windowsの場合)
> heroku config:add CLEARDB_DATABASE_URL="mysql://be7e2ae07ffe78:c17d7746@us-cdbr-east-03.cleardb.com/heroku_7d616eab354e8ff?reconnect=true^^^&useSSL=false^^^&useUnicode=ture^^^&characterEncoding=utf8^^^&characterSetResults=utf8" --app hello-db-norris Setting CLEARDB_DATABASE_URL and restarting ? hello-db-norris... done, v6 CLEARDB_DATABASE_URL: mysql://be7e2ae07ffe78:c17d7746@us-cdbr-east-03.cleardb.com/heroku_7d616eab354e8ff?reconnect=true^^^&useSSL=false^^^&useUnicode=ture^^^&characterEncoding=utf8^^^&characterSetResults=utf8
Windowsの場合はコマンドで ^^^& とする点に注意です。
(私はこれに気が付かず、悩んでしまいました。)
& を文字情報としてHerokuに送るためにエスケープ処理をしています。
Windowsの場合、このようにしないとコマンドが正常に実行できません。
また、Macの場合はシングルクォーテーションを使用していますが、Windowsでは必ずダブルクォーテーションを使ってください。
HerokuのMySQLにテーブルを作成する
ターミナルでMySQLにログインしなおして、バックアップとして取得しておいて [データベース名].sql のファイルを実行します。
まずはMySQLへログインします。
$ mysql -h us-cdbr-east-03.cleardb.com -u bce320a8674be8 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2349475 Server version: 5.6.50-log MySQL Community Server (GPL) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
次に使用するデータベースを選択します。
mysql> use heroku_44f7cd486a498c3; Database changed mysql>
そしてファイルの実行です。
mysql> source (sqlファイルまでのパス)/[データベース名].sql Query OK, 0 rows affected (0.17 sec) Query OK, 0 rows affected (0.19 sec) mysql>
persistence.xmlの設定
persistance.xmlにHerokuのMySQLのURLを設定します。
さきほどの CLEARDB_DATABASE_URL の設定値を基に、persistence.xmlの接続情報タブの内容にあるURLを下記の通り変更しておきます。
jdbc:mysql://(ドメイン)/(データベース名)?reconnect=true&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
また、あわせてユーザー名とパスワードも変更します。
最後にスキーマ生成タブで database action と script generation を両方とも「なし」に設定します。
プロジェクトのwarファイルを作る
デプロイするWebアプリケーションのwarファイルを作成します。
Eclipseでプロジェクトを右クリック→エクスポート→WARファイルを選択すればOKです。
WARファイルをHerokuにデプロイ
作成したwarファイルをHrokuにデプロイするのですが、そのまえに自身のPCの環境を設定しておきます。
$ export PATH=$PATH:/Applications/Eclipse_2020-06.app/Contents/java/8/Home/bin
$ export JAVA_HOME=/Applications/Eclipse_2020-06.app/Contents/java/8/Home
設定ができたら、下記のコマンドでいよいよデプロイ開始です。
$ HEROKU_DEBUG=1 heroku war:deploy /Users/norris/Downloads/hello-db-norris.war --app hello-db-norris --webapp-runner 8.0.50.0 Uploading hello-db-norris.war java -Dheroku.appName=hello-db-norris -Xmx1g -Dheroku.webappRunnerVersion=8.0.50.0 -Dheroku.warFile=/Users/norris/Downloads/hello-db-norris.war -jar /Users/norris/.local/share/heroku/node_modules/@heroku-cli/plugin-java/lib/heroku-deploy-complete.jar -----> Packaging application... - app: hello-db-norris - including: webapp-runner.jar - including: /Users/norris/Downloads/hello-db-norris.war Procfile: =================== web: java $JAVA_OPTS -jar webapp-runner.jar ${WEBAPP_RUNNER_OPTS} --port $PORT .//Users/norris/Downloads/hello-db-norris.war =================== Heroku existing config variables: [CLEARDB_DATABASE_URL, TZ] -----> Creating build... - file: slug.tgz - size: 21MB Heroku Blob URL: https://s3-external-1.amazonaws.com/heroku-sources-production/f489373e-0d93-4449-ae59-95355631927c?AWSAccessKeyId=AKIAJ6LKZGKGPARPZE4A&Signature=AVby7fGJ2IThEC6ZsByLOXdquXc%3D&Expires=1614820182 -----> Uploading build... - success -----> Deploying... remote: remote: -----> Building on the Heroku-20 stack remote: -----> heroku-deploy app detected remote: -----> Installing JDK 1.8... done remote: -----> Discovering process types remote: Procfile declares types -> web remote: remote: -----> Compressing... remote: Done: 73.6M remote: -----> Launching... remote: Released v7 remote: https://miyazon-norris.herokuapp.com/ deployed to Heroku remote: -----> Done
これでデプロイ成功です!
最後に表示されているURLにアクセスすればページが表示されます!
まとめ
自身で作成したWebアプリケーションを公開して、色々な人に見てもらいましょう。
せっかく作成したアプリケーションなので、多くの人に使ってもらえると嬉しいですよね。