#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

- 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 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>

- 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" を選択

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS