- 追加された行はこの色です。
- 削除された行はこの色です。
#contents
** 概要 [#t74fcab8]
- Herokuとはなにか?
-- アプリケーションを稼働させるためのプラットフォーム
-- PaaS (Platform as a Service)
-- 公式サイト: https://www.heroku.com/
- サポート言語 (2017年8月現在)
-- Node.js / Ruby / Java / PHP / Python / Go / Scala / Clojure
- 前提条件 / 知識
-- Heroku無償アカウント登録済み
-- Ruby on Rails / Ruby
-- Unixコマンド / Vim
-- Git
-- PostgreSQL
- ローカル開発環境
-- OS X 10.11 El Capitan
-- VirtualBox 5.0.20
-- Vagrant 1.9.7
-- Ubuntu 16.04 (LTS)
-- Git 2.7.4
-- Ruby 2.4.1
-- Rails 5.1.3
-- PostgreSQL 9.6.3
** ローカル開発環境の構築 [#z2e0b481]
*** Vagrant初期設定 [#o1b0eb27]
- Ubuntu 16.04 (64bit) のbox (テンプレート) を追加
$ vagrant box add Ubuntu16.04 https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-vagrant.box
- Vagrant用ディレクトリ作成
$ mkdir heroku_lessons
$ cd heroku_lessons
- Vagrantの初期化
$ vagrant init Ubuntu16.04
- ネットワークアダプター設定
$ vi Vagrantfile
--------------------
config.vm.network "private_network", ip: "192.168.78.90"
--------------------
- Vagrant起動
$ vagrant up
- SSH接続確認
$ vagrant ssh
- apt-getアップデート
$ sudo apt-get update
*** Gitインストール [#lecd194a]
- gitインストール
$ sudo apt-get install git
$ git --version
git version 2.7.4
- git初期設定 (Global)
$ git config --global user.name "Yuji Shimojo"
$ git config --global user.email "y.shimojo@example.com"
$ git config --global color.ui true
*** Rubyインストール [#z81b25ce]
- 事前に必要なパッケージをインストール
$ sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libpq-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev
> - ruby-build / ruby-devインストール
>
> $ sudo apt-get install -y ruby-build ruby-dev
// - ruby-build / ruby-devインストール
//
// $ sudo apt-get install -y ruby-build ruby-dev
- rbenvインストール
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
- rbenv初期化
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ exec $SHELL
- ruby-buildインストール
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
$ exec $SHELL
- 確認
$ echo "${PATH}"
/home/ubuntu/.rbenv/plugins/ruby-build/bin:/home/ubuntu/.rbenv/shims:/home/ubuntu/.rbenv/bin:/home/ubuntu/.rbenv/shims:/home/ubuntu/.rbenv/bin:/home/ubuntu/bin:/home/ubuntu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
- インストール可能なRubyバージョン一覧表示
$ rbenv install --list
- 最新安定板のCRuby (2.4.1) インストール
$ sudo rbenv install 2.4.1
- Rubyの構成をアクティベート
$ sudo rbenv global 2.4.1
- システムで使用しているrbenvバージョン確認
$ rbenv global
2.4.1
- 各バージョン確認
$ rbenv version
2.4.1 (set by /home/ubuntu/.rbenv/version)
$ ruby --version
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
$ gem --version
2.6.11
- Gem構成の確認
$ gem env
RubyGems Environment:
- RUBYGEMS VERSION: 2.6.11
- RUBY VERSION: 2.4.1 (2017-03-22 patchlevel 111) [x86_64-linux]
- INSTALLATION DIRECTORY: /home/ubuntu/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0
- USER INSTALLATION DIRECTORY: /home/ubuntu/.gem/ruby/2.4.0
- RUBY EXECUTABLE: /home/ubuntu/.rbenv/versions/2.4.1/bin/ruby
- EXECUTABLE DIRECTORY: /home/ubuntu/.rbenv/versions/2.4.1/bin
- SPEC CACHE DIRECTORY: /home/ubuntu/.gem/specs
- SYSTEM CONFIGURATION DIRECTORY: /home/ubuntu/.rbenv/versions/2.4.1/etc
- RUBYGEMS PLATFORMS:
- ruby
- x86_64-linux
- GEM PATHS:
- /home/ubuntu/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0
- /home/ubuntu/.gem/ruby/2.4.0
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :backtrace => false
- :bulk_threshold => 1000
- "install" => "--no-rdoc --no-ri"
- "update" => "--no-rdoc --no-ri"
- REMOTE SOURCES:
- https://rubygems.org/
- SHELL PATH:
- /home/ubuntu/.rbenv/versions/2.4.1/bin
- /home/ubuntu/.rbenv/libexec
- /home/ubuntu/.rbenv/plugins/ruby-build/bin
- /home/ubuntu/bin
- /home/ubuntu/.local/bin
- /home/ubuntu/.rbenv/plugins/ruby-build/bin
- /home/ubuntu/.rbenv/shims
- /home/ubuntu/.rbenv/bin
- /usr/local/sbin
- /usr/local/bin
- /usr/sbin
- /usr/bin
- /sbin
- /bin
- /usr/games
- /usr/local/games
- /snap/bin
- rbenvをリハッシュ
$ rbenv rehash
- rbenvリハッシュの自動化 (rbenv-rehash gemのインストール)
$ sudo gem i rbenv-rehash
*** Ruby on Railsインストール [#x5bb7495]
- 依存解決のためのNode.jsをインストール
$ curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
$ sudo apt-get install -y nodejs
- gemが自動生成するri docドキュメントの無効化
$ echo 'install: --no-rdoc --no-ri' >> ~/.gemrc
$ echo 'update: --no-rdoc --no-ri' >> ~/.gemrc
- インストール可能なRailsバージョン一覧表示
$ gem query -ra -n "^rails$"
- 最新版のRails 5.1.3をインストール
$ sudo gem install rails -v 5.1.3
- Railsバージョン確認
$ rails -v
Rails 5.1.3
*** PostgreSQLインストール [#u37e62d3]
- 公式リポジトリ追加
$ sudo sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
$ wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt-get update
- 最新版のPostgreSQL 9.6インストール
$ sudo apt-get install -y postgresql-common
$ sudo apt-get install -y postgresql-9.6 libpq-dev
- PostgreSQLバージョン確認
$ psql --version
psql (PostgreSQL) 9.6.3
- DB接続確認 &color(red){※}; エラー発生
$ psql -l
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
- Postgres設定ファイル編集
$ sudo vi /etc/postgresql/9.6/main/postgresql.conf
listen_addresses = 'localhost'
- DBユーザー作成
$ sudo -u postgres createuser ubuntu -s
$ sudo systemctl restart postgresql
$ psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
** PaaS (Heroku) の仕組みを知ろう [#m15462e6]
- IaaS
-- Local Env: Ruby/Rails, Database, Web Server, Source Code
-- Server: Ruby/Rails, Database, Web Server, Source Code, Analytics, Logging
- Heroku (PaaS)
-- Source Code
-- Dependencies: ライブラリの依存関係を示したファイル (RubyのGemfile, Node.jsのpackage.json等)
-- Procfile: Heroku上で動かしたいコマンド一覧
-- Slug: Source CodeとDependenciesをまとめたファイル
-- Dyno: Linuxコンテナ (Slugを読み込んで稼働, 容易に起動/破棄/スケールアウトが可能)
-- Addon: 本番環境に必要なツールを提供 (Addon:Logging, Addon:Mail, Addon:Analytics等)
- Herokuの制約
-- Dyno上のディスク領域は揮発性のため永続データはAddon:Databaseや外部のストレージサービス利用が必要
-- Slugにもサイズ制限があるためJS, CSS, Images等は外部ストレージに保存する必要あり
-- 基本機能の利用は無料だがDynoにアクセスが一定期間無いとスリープになり次回アクセス時に起動に数秒掛かる
** Heroku CLIインストール [#p95dd0ee]
- Debian/Ubuntu用の公式インストールシェルスクリプトをダウンロード&実行
$ wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
- Herokuバージョン確認
$ heroku --version
heroku-cli/6.13.7 (linux-x64) node-v8.2.1
- &color(red){※}; OS X (Elcapitan) 上にインストールする場合は以下参照
- Homebrewアップデート
$ brew upgrade
$ brew update
- Heroku (Heroku CLI) インストール
$ brew install heroku
- Herokuバージョン確認
$ heroku --version
heroku-cli/6.13.7 (darwin-x64) node-v8.2.1
- 秘密鍵/公開鍵作成
$ ssh-keygen -t rsa -C y.shimojo@example.com
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa): /home/ubuntu/.ssh/id_heroku_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ubuntu/.ssh/id_heroku_rsa.
Your public key has been saved in /home/ubuntu/.ssh/id_heroku_rsa.pub.
- Herokuアカウントとの紐付け (heroku login)
$ heroku login
Enter your Heroku credentials:
Email: y.shimojo@example.com
Password: ********
Logged in as y.shimojo@example.com
- 公開鍵の登録 (アップロード)
$ heroku keys:add /home/ubuntu/.ssh/id_heroku_rsa.pub
Uploading /home/ubuntu/.ssh/id_heroku_rsa.pub SSH key... done
** Railsアプリケーションを作ろう [#sa73c6ca]
- rails newでmymemoアプリ作成 (postgres使用)
$ rails new mymemo -d postgresql
- Gemfile編集
$ cd mymemo
$ vi Gemfile
gem 'therubyracer', platforms: :ruby
- Rails Server起動 &color(red){※}; エラー発生
$ rails s
Could not find gem 'therubyracer' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
- Bundlerをインストール &color(red){※}; --no-document オプション無しの場合はRDocもインストール
$ sudo gem install bundler --no-document
- Gemの依存性解決 (bundle install)
$ bundle install
- Rails Server起動 (再実行)
$ rails s
=> Booting Puma
=> Rails 5.0.5 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.9.1 (ruby 2.3.1-p112), codename: Private Caller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
- ブラウザ経由で 192.168.78.90:3000 へ接続しRailsのデフォルトページが表示されることを確認
- Scaffoldを使ってRailsアプリ作成 &color(red){※}; エラー発生
$ rails g scaffold Memo title:string body:text
- 解決方法
$ sudo rbenv exec gem install bundler
$ rbenv rehash
$ bundle config build.nokogiri --with-xml2-config=/usr/local/opt/libxml2/bin/xml2-config --with-xslt-config=/usr/local/opt/libxslt/bin/xslt-config
$ bundle config build.mini_portile2 --use-system-libraries
$ bundle install
$ rbenv rehash
- Scaffold再実行
$ rails g scaffold Memo title:string body:text
Running via Spring preloader in process 13342
invoke active_record
create db/migrate/20170806093511_create_memos.rb
create app/models/memo.rb
invoke test_unit
create test/models/memo_test.rb
create test/fixtures/memos.yml
invoke resource_route
route resources :memos
invoke scaffold_controller
create app/controllers/memos_controller.rb
invoke erb
create app/views/memos
create app/views/memos/index.html.erb
create app/views/memos/edit.html.erb
create app/views/memos/show.html.erb
create app/views/memos/new.html.erb
create app/views/memos/_form.html.erb
invoke test_unit
create test/controllers/memos_controller_test.rb
invoke helper
create app/helpers/memos_helper.rb
invoke test_unit
invoke jbuilder
create app/views/memos/index.json.jbuilder
create app/views/memos/show.json.jbuilder
create app/views/memos/_memo.json.jbuilder
invoke test_unit
create test/system/memos_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/memos.coffee
invoke scss
create app/assets/stylesheets/memos.scss
invoke scss
create app/assets/stylesheets/scaffolds.scss
- データベース作成
$ bundle exec rake db:create
Created database 'mymemo_development'
Created database 'mymemo_test'
- テーブル作成
$ bundle exec rake db:migrate
== 20170806093511 CreateMemos: migrating ======================================
-- create_table(:memos)
-> 0.0051s
== 20170806093511 CreateMemos: migrated (0.0063s) =============================
- Rails Server起動
$ rails s
- ブラウザ経由で 192.168.78.90:3000/memos へ接続しCRUDアプリが動作することを確認
- 依存関係にあるGemをインストール
$ bundle install
- Git初期設定
$ pwd
/home/ubuntu/mymemo
$ git init
$ git add .
$ git commit -m "initial commit"
** heroku createしてみよう [#g4e5d129]
- Gemfile内にherokuで必要なgemを追記
$ vi Gemfile
gem 'rails_12factor', group: :production
- Procfileを作成
$ vi Procfile
web: bundle exec rails server -p $PORT
$ git add .
$ git commit -m "Gemfile updated, Procfile added"
- Herokuアプリを作成 (heroku createコマンドでgit remote repositoryも自動的に作成)
$ heroku create
Creating app... done, ⬢ tranquil-headland-xxxxx
https://tranquil-headland-90386.herokuapp.com/ | https://git.heroku.com/tranquil-headland-xxxxx.git
** Heroku上で確認してみよう [#ec6631ab]
- Gitプッシュ
$ git push heroku master
- Heroku上にDB作成 (Addon利用)
$ heroku addons:add heroku-postgresql
Creating heroku-postgresql on ⬢ tranquil-headland-xxxxx... free
Database has been created and is available
! This database is empty. If upgrading, you can transfer
! data from another database with pg:copy
Created postgresql-encircled-xxxxx as DATABASE_URL
Use heroku addons:docs heroku-postgresql to view documentation
- DBマイグレート
$ heroku run rake db:migrate
- Herokuアプリの情報表示 (URL等)
$ heroku apps:info
=== tranquil-headland-xxxxx
Addons: heroku-postgresql:hobby-dev
Auto Cert Mgmt: false
Dynos:
Git URL: https://git.heroku.com/tranquil-headland-xxxxx.git
Owner: y.shimojo@example.com
Region: us
Repo Size: 0 B
Slug Size: 0 B
Stack: heroku-16
Web URL: https://tranquil-headland-xxxxx.herokuapp.com/
- ブラウザ経由で https://tranquil-headland-xxxxx.herokuapp.com/memos へアクセスしCRUDアプリを確認
- Heroku上のリポジトリとローカルの紐付けが解除されている場合
$ heroku apps:info
▸ No app specified.
▸ USAGE: heroku info my-app
- Herokuアプリ一覧表示
$ heroku list
=== y.shimojo@example.com Apps
tranquil-headland-xxxxx
- Herokuアプリ名を指定して情報表示 (heroku apps:info --app [app_name] でも可)
$ heroku info tranquil-headland-xxxxx
=== tranquil-headland-xxxxx
Addons: heroku-postgresql:hobby-dev
Auto Cert Mgmt: false
Dynos: web: 1
Git URL: https://git.heroku.com/tranquil-headland-xxxxx.git
Owner: y.shimojo@example.com
Region: us
Repo Size: 37 KB
Slug Size: 38 MB
Stack: heroku-16
Web URL: https://tranquil-headland-xxxxx.herokuapp.com/
** heroku ps/logs/maintenanceを使おう [#e1c8f1ca]
- プロセス確認コマンド
$ heroku ps
Free dyno hours quota remaining this month: 550h 0m (100%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping
=== web (Free): bundle exec rails server -p $PORT (1)
web.1: up 2017/08/06 10:52:12 +0000 (~ 4m ago)
- Dynoの台数を変更するコマンド (1=>2) &color(red){※}; 有料プラン登録必要
$ heroku ps:scale web=2
Scaling dynos... !
▸ Cannot update to more than 1 Free size dynos per process type.
- ログ確認コマンド &color(red){※}; デフォルト1,500行まで保存
$ heroku logs
- ログ確認コマンド (ストリーム表示)
$ heroku logs --tail
- メンテナンスモード切り替え
$ heroku maintenance:on
- メンテナンスモードの状態表示
$ heroku maintenance
on
- メンテナンスモード解除
$ heroku maintenance:off
** One-off Dynosを使ってみよう [#p4c14c8a]
- heroku runでDynoに対してコマンド実行する際に裏側ではOne-off Dynoという一時的なDynoが起動
- bashコマンド実行
$ heroku run bash
~ $ ls
app bin config config.ru db Gemfile Gemfile.lock lib log package.json Procfile public Rakefile README.md test tmp vendor
~ $ exit
exit
- rails consoleコマンド実行
$ heroku run rails console
irb(main):001:0> m = Memo.new({title:"hoge",body:"hogehoge"})
=> #<Memo id: nil, title: "hoge", body: "hogehoge", created_at: nil, updated_at: nil>
irb(main):002:0> m.save
(1.3ms) BEGIN
SQL (1.7ms) INSERT INTO "memos" ("title", "body", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["title", "hoge"], ["body", "hogehoge"], ["created_at", "2017-08-06 11:07:29.045107"], ["updated_at", "2017-08-06 11:07:29.045107"]]
(2.1ms) COMMIT
=> true
irb(main):003:0> auit
- ブラウザ経由でデータが追加されていることを確認
** heroku releasesを使ってみよう [#yf791370]
- index.html.erbに "hello world" 追記
$ vi app/views/memos/index.html.erb
<p>hello world</p>
<p>hello world</p>
- Rails Server起動しブラウザ経由 (192.168.78.90:3000/memos) で確認
- Gitプッシュ
$ git add .
$ git commit -m "added hello world"
$ git push heroku master
- Gitプッシュの度に作成されるリリース履歴を確認
$ heroku releases
=== tranquil-headland-xxxxx Releases - Current: v6
v6 Deploy 24731a70 y.shimojo@example.com 2017/08/06 11:15:12 +0000 (~ 1m ago)
v5 Deploy 80b93304 y.shimojo@example.com 2017/08/06 10:52:04 +0000 (~ 24m ago)
v4 Set LANG, RACK_ENV, RAILS_ENV, RAILS_LOG_TO_STDOUT, RAILS_SERVE_STATIC_FILES, SECRET_KEY_BASE config vars yjshimojo@gmail.com 2017/08/06 10:52:03 +0000 (~ 24m ago)
v3 Attach DATABASE (@ref:postgresql-encircled-86963) y.shimojo@example.com 2017/08/06 10:42:49 +0000 (~ 33m ago)
v2 Enable Logplex y.shimojo@example.com 2017/08/06 10:35:32 +0000 (~ 40m ago)
v1 Initial release y.shimojo@example.com 2017/08/06 10:35:32 +0000 (~ 40m ago)
- ロールバック (バージョン指定も可)
$ heroku releases:rollback
** 環境変数を使ってみよう [#vc8f7599]
- APIキーやDBホストは環境変数にセットすることが推奨
- 環境変数のセット
$ heroku config:set mykey=value
- 環境変数の確認 (key指定)
$ heroku config:get mykey
- 環境変数の確認
$ heroku config
- 環境変数のアンセット
$ heroku config:unset mykey
- プログラム内から環境変数を参照
$ vi app/views/memos/index.html.erb
<p><%= ENV['mykey'] %></p>
- Gitプッシュ
$ git add .
$ git commit -m "mykey added"
$ git push heroku master
- ブラウザ経由でmykeyの値が表示されていることを確認
** foremanを使ってみよう [#e0822fe7]
- foremanインストール
$ sudo apt-get install ruby-foreman
- 環境変数をローカル環境でも参照する方法 (.envファイルを作成)
$ vi .env
mykey=mylocalvalue
- 実行の際は rails s ではなく foreman コマンドを使用 (ポート番号: 5000)
$ foreman start
- &color(red){※}; 未解決: ブラウザ経由で 192.168.78.90:5000/memos へアクセスしてもサイト表示不可
- ローカル環境用の環境変数をgit ignoreに追加
$ vi .gitignore
.env
- Heroku環境の環境変数は
-- Dashboard >> アプリ選択 >> Settings >> "Reveal Config Vars" を選択