Heroku(デプロイ)
デプロイとは
ネットワークを通じてWebアプリケーションなどのシステムを公開し、利用可能な状態にすることです。
Herokuとは
アプリケーションの公開、運用を行うためのサーバーを提供するサービスです。
基本機能だけであれば無料で使用でき、デプロイの手間が少なく容易であるというメリットがあります。
Herokuにデプロイする際には、Gitの仕組みを使用し、Gitで管理しているリポジトリをHerokuへ反映することで、Heroku上で該当するアプリケーションの操作が可能です。
デプロイ
CLIでHerokuを操作する方法
CLIをインストールすると、herokuというコマンドが使用できるようになり、ターミナルからHerokuへアクセスが可能になります。
Heroku CLIをインストール
ターミナルで、
% brew tap heroku/brew && brew install heroku
を入力し、インストール
Herokuにログイン方法
# Herokuへログインするためのコマンド % heroku login --interactive => Enter your Heroku credentials. # メールアドレスを入力し、エンターキーを押す => Email: # パスワードを入力して、エンターキーを押す => Password:
rails_12factorをGemfileに記述
rails_12factorは静的アセットファイルやログの保存先をHeroku用に微調整してくれるGemです。
# ファイルの一番下の行に追記する group :production do gem 'rails_12factor' end
:productionで指定すると本番環境のみで使用されるように指定できます。
Heroku上にアプリケーションを作成
% heroku create アプリ名
下記のコマンドを入力し、正しく設定できたことを確認
% git config --list | grep heroku
fatal: not in a git directory以外が表示されていれば大丈夫です。
Heroku上でMySQLの使用方法
ClearDBアドオン
ClearDBアドオンとは、MySQLを使うためのツールです。ClearDBというデータベースサービスが提供しているアドオンで、これを追加することにより、HerokuでMySQLを使用できるようになります。
% heroku addons:add cleardb Creating cleardb on ⬢ ajax-app-123456... free Created cleardb-vertical-00000 as CLEARDB_DATABASE_URL Use heroku addons:docs cleardb to view documentation
MySQLに対応するGemについて考慮する必要があり、設定を変更します
% heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`
% heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5} # 以下、コマンドの実行結果 Setting DATABASE_URL and restarting ⬢ ajax-app-123456... done, v◯◯ DATABASE_URL: mysql2://000000000000:0aa0000@us-cdbr-east-02.cleardb.com/heroku_aaa00000000?reconnect=true
credentials.yml.encの中身を確認方法
redentials.yml.encファイル
Railsにて、外部に漏らしたくない情報を扱う際に用いるファイルです。
通常時は、英数字の文字列で構成された暗号文が表示され、ファイル内に何が書かれているのか分からないようになっています。しかし、このcredentials.yml.encと対になるmaster.keyが存在する場合、credentials.yml.encの暗号文を復号し、ファイル内の記述を確認できます。
master.keyファイル
credentials.yml.encの暗号文を復号する、鍵の役割を持ったファイルです。特定のcredentials.yml.encと対になっているため、その他のcredentials.yml.encへは、効果を発揮しません。
また、master.keyは非常に重要なファイルなので、リモートリポジトリに反映されることは好ましくありません。そのため、デフォルトで.gitignoreに記述されており、Gitで管理されない仕組みになっています。
アプリケーションのディレクトリからconfig/credentials.yml.encを開き暗号文のみを確認できます。
ターミナルで
% EDITOR="vi" bin/rails credentials:edit
以下のような画面が確認できれば、credentials.yml.encをmaster.keyによって復号し、中身を確認できた状態と言えます。
「escキー」→「:」→「q」で閉じれます
Heroku上にmaster.keyを設置
heroku configコマンド
Heroku上で環境変数の参照・追加・削除等をする場合に用います。環境変数の追加であればheroku config:set 環境変数名="値"と実行します。
% heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
環境変数を確認
% heroku config
コミットをHerokuへプッシュした後に、環境変数を設定すると反映されません。コミットをHerokuへプッシュする前に設定します
アプリケーションをプッシュ
% git push heroku master
Heroku上でマイグレーションファイルを実行
% heroku run rails db:migrate Running rails db:migrate on ⬢ ajax-app-123456... up, run.8920 (Free) D, [2020-05-08T08:22:50.410454 #4] DEBUG -- : (2.9ms) SET NAMES utf8mb4, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 D, [2020-05-08T08:22:50.467023 #4] DEBUG -- : (2.6ms) SELECT @@innodb_file_per_table = 1 AND @@innodb_file_format = 'Barracuda' D, [2020-05-08T08:22:50.479166 #4] DEBUG -- : (11.6ms) CREATE TABLE `schema_migrations` (`version` varchar(255) NOT NULL PRIMARY KEY) D, [2020-05-08T08:22:50.499390 #4] DEBUG -- : (12.0ms) CREATE TABLE `ar_internal_metadata` (`key` varchar(255) NOT NULL PRIMARY KEY, `value` varchar(255), `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) D, [2020-05-08T08:22:50.504699 #4] DEBUG -- : (2.4ms) SELECT GET_LOCK('410119075843185555', 0) D, [2020-05-08T08:22:50.525145 #4] DEBUG -- : (2.8ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC I, [2020-05-08T08:22:50.527632 #4] INFO -- : Migrating to CreatePosts (20200407082548) == 20200407082548 CreatePosts: migrating ====================================== -- create_table(:posts) D, [2020-05-08T08:22:50.545176 #4] DEBUG -- : (11.5ms) CREATE TABLE `posts` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `content` text, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) -> 0.0126s == 20200407082548 CreatePosts: migrated (0.0128s) ============================= D, [2020-05-08T08:22:50.559351 #4] DEBUG -- : (2.4ms) BEGIN D, [2020-05-08T08:22:50.562044 #4] DEBUG -- : primary::SchemaMigration Create (2.5ms) INSERT INTO `schema_migrations` (`version`) VALUES ('20200407082548') D, [2020-05-08T08:22:50.573840 #4] DEBUG -- : (11.5ms) COMMIT D, [2020-05-08T08:22:50.584601 #4] DEBUG -- : ActiveRecord::InternalMetadata Load (3.2ms) SELECT `ar_internal_metadata`.* FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' LIMIT 1 D, [2020-05-08T08:22:50.595802 #4] DEBUG -- : (2.5ms) BEGIN D, [2020-05-08T08:22:50.598379 #4] DEBUG -- : ActiveRecord::InternalMetadata Create (2.4ms) INSERT INTO `ar_internal_metadata` (`key`, `value`, `created_at`, `updated_at`) VALUES ('environment', 'production', '2020-05-08 08:22:50', '2020-05-08 08:22:50') D, [2020-05-08T08:22:50.607963 #4] DEBUG -- : (9.4ms) COMMIT D, [2020-05-08T08:22:50.610566 #4] DEBUG -- : (2.4ms) SELECT RELEASE_LOCK('410119075843185555') |
公開を確認
% heroku apps:info ===ajax-app-123456 Addons: cleardb:ignite Auto Cert Mgmt: false Dynos: web: 1 Git URL: https://git.heroku.com/アプリ名.git Owner: sample@sample.com Region: us Repo Size: 165 KB Slug Size: 56 MB Stack: heroku-18 Web URL: https:/アプリ名.herokuapp.com/
Web URL: https://アプリ名.herokuapp.com/の部分のURLへアクセスすれば、公開されたページを見ることができます。
デプロイの流れ
はじめてデプロイをする場合
-
Herokuにアカウント登録する
-
Heroku CLIをインストールする
-
必要なGemを導入する
-
masterブランチへcommitする
-
Heroku上にアプリケーションを作成する
-
MySQLを使用できるように設定する
-
master.keyを環境変数として設定する
-
Herokuへアプリケーションの情報をpushする
-
Heroku上でマイグレーションを実行する
デプロイ済みのアプリケーションに変更修正を加えた場合
-
変更修正をcommitする
-
ブランチを作成していた場合は、masterブランチへマージする
-
Heroku上にpushする
-
(テーブルに変更を加えた場合は)Heroku上でマイグレーションを実行する