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