Heroku †
- https://heroku.com/
- Ruby, Ruby on Rails, Dyno, PostgreSQL, memcacheのWebアプリを簡単にデプロイできるPaaS。Salesforce.comにより買収。
- Rack(Ruby版WSGI 実行環境毎の差違を吸収)のフレームワークなら動作する。Ruby on Rails等
- gitでソースコード管理
- 料金: Usage & Billing
- スペック: Platform Architecture
- 無料
- Slug: 最大200MB (圧縮したアプリケーションサイズ)
- Webアプリケーションサーバ(Dyno)の1プロセス。750 dyno-hours。1ヶ月720なので少し余裕がある。
- リクエスト: 10 requests per second. 平均レスポンス: 100ms
- メモリ: 1dyno 最大512MB
- DB: PostgreSQL 5MB, MySQL 5MB(ClearDBアドオン)
- cron: 1回/1日
- ログ:直近の100行
- Ruby: ruby-1.9.3-p0, ruby-1.9.3-p125, ruby-1.9.2-p290, ruby-1.8.7
- 無料アドオンの利用
- 有料
- 有料アドオンの利用
- 複数のWebアプリケーションサーバプロセス
- DB: PostgreSQL 5MB以上
- cron: 1回/1時間
- Heroku Status サービスの死活チェック
- stack: herokuの実行環境ランタイム
- Cedar: Ruby以外の言語(Java、Python、Node.js、Scalaなど)等が実行可能
- Bamboo: Rubyのみ実行可能
ログをS3へ転送 †
Billing/Invoice(請求書) †
ACM(Automated Certificate Management): SSL証明書の自動更新 †
監視/Monitoring †
一部の項目のEmail通知はあるので、SlackのEmailインテグレーションを使えば通知はできる。
- Alert Configuration
- Response Time Threshold:
- default: 1000ms
- Sensitivity: 1 min, 5 min, 10 min
- Failed Requests Percentage Threshold
- default: 5.0 %
- Sensitivity: 1 min, 5 min, 10 min
外部Addonを使う方法が一般的だろうが、metricsをAPIで取得する方法が不明
Can't find the 'libpq-fe.h header †
gem install pg
...
Can't find the 'libpq-fe.h header
固定IPを使う †
herokuはAWSベースでデフォルトでは固定IPが無いため、herokuからホストにアクセスするケースで、ホスト側でIP制限をするのが困難。
そのため有料Addonがある
CURLからRESTリクエストを投げる †
- Getting Started with the Platform API | Heroku Dev Center
- サンプル:heroku appの情報を取得
HEROKU_TOKEN=$(heroku auth:token)
curl -X POST https://api.heroku.com/apps \
-H "Accept: application/vnd.heroku+json; version=3" \
-H "Authorization: Bearer $HEROKU_TOKEN"
{
"created_at":"2013-05-21T22:36:48-00:00",
"id":"01234567-89ab-cdef-0123-456789abcdef",
"git_url":"git@heroku.com:cryptic-ocean-8852.git",
"name":"cryptic-ocean-8852",
...
}
addonのidを調べる †
HEROKU_TOKEN=$(heroku auth:token)
curl -X GET https://api.heroku.com/apps/<APP ID>/addons \
-H "Accept: application/vnd.heroku+json; version=3" \
-H "Authorization: Bearer $HEROKU_TOKEN"
herokuアプリケーション名の変更 †
ログをhttpsで受信する †
SSL Heartbleed bug対応 †
PostgreSQLのバージョンアップ方法 †
PostgreSQLのバージョン確認 †
heroku pg:info -r staging -app [YOUR APP ID]
カスタムドメインを設定する †
httpsの場合 †
httpとは違うendpointが割り当てられる。
- ssl:endpointアドオンの追加
heroku addons:add ssl:endpoint --app YOUR-APP
- SSL certificateの追加
heroku certs:add www.example.com.key www.example.com.crt --app YOUR-APP
- カスタムドメインの登録
heroku domains:add www.example.com --app YOUR-APP
heroku domains --app YOUR-APP
Endpoint Common Name(s) Expires Trusted
------------------------ ------------------------------------ -------------------- -------
YOUR-APP.herokussl.com www.example.com 2010-01-01 01:00 UTC True
- DNSレコードの追加
www.example.com CNAME YOUR-APP.herokussl.com
httpの場合 †
- カスタムドメインの登録
heroku domains:add www.example.com --app YOUR-APP
heroku domains --app YOUR-APP
=== YOUR-APP Domain Names
YOUR-APP.herokuapp.com
www.example.com
- DNSレコードの追加
www.example.com CNAME YOUR-APP.herokuapp.com.
railsのアップデート †
セキュリティアップデート等でバージョンを上げる場合。
heroku側で新しいバージョンとアップグレード方法が記載されたメールが来る
- rails (2013-01-11)
- 3.2.11
- 3.1.10
- 3.0.19
- 2.3.15
ログをrsyslogで受信する †
- logs.example.com(CentOS6.3)側
- 514/tcp を解放する。ソースIPは 10.0.0.0/8
vim /etc/rsyslog.conf
----
$ModLoad imtcp
$InputTCPServerRun 514
----
vim /etc/rsyslog.d/99-heroku.conf
----
:HOSTNAME,isequal,"d.9173ea1f-6f14-4976-9cf0-7cd0dafdcdbc" /var/log/heroku-logs.example.com.log
& ~
----
service rsyslog restart
テーブル単位のインポート/エクスポート †
- \COPY でテーブル単位でファイルにインポート/エクスポートできる。
- COPYはSTDIN/STDOUTしか使えない。ファイルへはsuperuserが必要。copyはSQLコマンドだが、\copyはpsqlの独自コマンド
addon †
# すべてのアドオン一覧
heroku addons:list
# インストール済みアドオンの一覧
heroku addons
# add
heroku addons:add newrelic:standard
# remove
heroku addons:remove newrelic:standard
# upgrade(有料)
heroku addons:upgrade newrelic:professional
# アドオンヘルプをブラウザで開く
heroku addons:open newrelic
AmazonRDS †
SendGrid †
heroku-postgresql †
デフォルトDBはPostgreSQLなのでそれに接続するアドオン
- Heroku Postgres
- pgbackupsを追加した際に、自動でこれもインストールされる
- heroku createした直後は DATABASE_URL は存在しないが、一つDBが用意されている。このプラグインを追加後に表示される
- DATABASE_URLは動的に変わるのでアプリケーションに埋め込んではいけない。EC2ベースで固定IPも無いのでファイアウォール設定は難しい。
Airbrake(Hoptoad) †
New Relic †
PG Backups †
- 2015-03月から heroku-postgresql に統合された
- 記事
以下古い情報
Heroku Postgres †
ClearDB MySQL Database †
pd_dump pg_restoreを使うためにPostgreSQLをインストール †
PG Backups でpg_dump, pg_restoreを使うためには、PostgreSQLをherokuと同じバージョンにする必要がある。
2012-10-04 (木) 11:57:19現在heroku側:9.1.6、yum:"8.4.13"ではpg_dumpの再にバージョン違いで怒られる
ERROR:BIGINTを含むテーブルをdb:pushした場合にINTEGERに変わってしまいrange over †
- 前提
- herokuのデフォルトDBはPostgreSQL
- 問題
- テーブルにBIGINT型のカラムがある場合、インポート時に発生
- エクスポートで "heroku db:pull sqlite://mydb.sqlite3" するとローカルにsqlite3形式で保存される
- インポートで "heroku db:push sqlite://mydb.sqlite3" するとBIGINTの型がINTEGERに変わってしまい、データがINTEGERの範囲を超えていたら"range over"エラーが発生する
- 解決方法
- インポート/エクスポート時に"Postgres bigint"はサポートしていない。BIGINTのカラムをアプリでstringとして扱う。
- pgbackupsアドオンを使って、pg_dump, pg_restoreで行う
テーブルの作成/変更 †
- localのデフォルトはsqlite3
- herokuのデフォルトはpostgresql
- item テーブルを作る
rails generate migration add_item_table
vi db/migrate/20121004030233_add_item_table.rb
----
class AddItemTable < ActiveRecord::Migration
def change
create_table "item", :force => true do |t|
t.integer "item_id"
t.integer "item_name"
t.datetime "created_at"
t.datetime "updated_at"
end
end
end
----
rake db:migrate
# ローカルのスキーマ確認
sqlite3 db/development.sqlite3
sqlite> .schema item
CREATE TABLE "item" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "item_id" integer, "item_name" integer, "created_at" datetime, "updated_at" datetime);
sqlite> .quit
# herokuへdeproy
git add .
git commit -m "add item table"
git push heroku master
heroku run rake db:migrate
# 確認
heroku pg:psql
=> \d item
テーブル "public.item"
カラム | 型 | 修飾語
------------+-----------------------------+---------------------------------------------------
id | integer | not null default nextval('item_id_seq'::regclass)
item_id | integer |
item_name | integer |
created_at | timestamp without time zone |
updated_at | timestamp without time zone |
インデックス:
"item_pkey" PRIMARY KEY, btree (id)
=> \q
- item_idをbigintに変更
rails generate migration item_item_id_integer_to_bigint
vi db/migrate/20121004031247_item_item_id_integer_to_bigint.rb
----
class ItemItemIdIntegerToBigint < ActiveRecord::Migration
def self.up
change_column :item, :item_id, :integer, :limit => 8
end
def self.down
change_column :item, :item_id, :integer
end
end
----
rake db:migrate
# ローカルのスキーマ確認。integer(8) に変わった
sqlite3 db/development.sqlite3
sqlite> .schema item
CREATE TABLE "item" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "item_id" integer(8), "item_name" integer, "created_at" datetime, "updated_at" datetime);
sqlite> .quit
# herokuへdeproy
git add .
git commit -m "add item table"
git push heroku master
heroku run rake db:migrate
# 確認
heroku pg:psql
=> \d item
テーブル "public.item"
カラム | 型 | 修飾語
------------+-----------------------------+---------------------------------------------------
id | integer | not null default nextval('item_id_seq'::regclass)
item_id | bigint |
item_name | integer |
created_at | timestamp without time zone |
updated_at | timestamp without time zone |
インデックス:
"item_pkey" PRIMARY KEY, btree (id)
=> \q
ruby1.9.2, rails3.2.8のdeproy †
- 環境
- CentOS6.4 x86_64
- ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
- Rails 3.2.8
- heroku-gem/2.32.6 (x86_64-linux) ruby/1.9.2 autoupdate
- slug: 13.6MB
rvmsudo gem install heroku taps sqlite3 execjs therubyracer
rails new catalog
cd catalog
# 以下を最後に追加
vi Gemfile
----
gem 'execjs'
gem 'therubyracer'
----
bundle install --without production
rails server
# http://localhost:3000/ をブラウザで開いて見る。Ctrl+Cで中止
# gitにcommit
git init
git add .
git commit -m "Init"
# herokuでは production は"pg"に変える必要がある。
vi Gemfile
----
group :production do
gem "pg"
end
group :development, :test do
gem 'sqlite3'
end
----
# gemライブラリーのバージョンエラーのメッセージが出る場合は Gemfile.lock を一度削除。bundle installコマンドで再生成される
rm Gemfile.lock
bundle install --without production
rails server
# heroku
heroku create
git add Gemfile.lock
git commit Gemfile Gemfile.lock
git push heroku master
# または
git push git@heroku.com:[アプリケーション名].git master --force
# dbを利用するテスト
rails generate scaffold Product name:string price:float url:string
rake db:migrate
rake db:seed
rm public/index.html
vi config/routes.rb
----
root :to => 'products#index'
----
# ローカルで動作確認。http://localhost:3000/ をブラウザで開いてレコードの追加、編集、削除等をやってみる
rails server
# gitにコミット
git add .
git rm public/index.html
git commit -m "Scaffold products"
# herokuに送信
git push heroku master
# heroku db 作成
heroku run rake db:migrate
# heroku db 初期値インポート
heroku run rake db:seed
Taps Server Error: PGError †
Invalid RUBY_VERSION specified: †
- git pushした時に発生する
git push heroku master
-----> Ruby/Rails app detected
!
! Invalid RUBY_VERSION specified:
! Valid versions: ruby-1.9.3-p0, ruby-1.9.3-p125, rbx-1.2.4, rbx-2.0.0dev-20120115-1.9, rbx-2.0.0dev-20120115-1.8, rbx-2.0.0dev-20120123-1.9,
rbx-2.0.0dev-20120123-1.8, ruby-1.9.2-p290, jruby-1.6.5.1, jruby-1.6.7, ruby-1.9.3, ruby-1.9.2, ruby-1.8.7, ruby-1.9.3-jruby-1.7.0.preview1,
ruby-1.8.7-jruby-1.7.0.preview1, ruby-1.9.3-jruby-1.7.0.preview2, ruby-1.8.7-jruby-1.7.0.preview2, ruby-1.9.3-jruby-1.7.0.RC1,
ruby-1.8.7-jruby-1.7.0.RC1, ruby-1.9.3-rbx-2.0.0dev, ruby-1.8.7-rbx-2.0.0dev
ブラウザでアプリケーション名を変更した場合、console側の名前も合わせる †
アプリの移設 †
- 古いアプリ: old-app
- 新しいアプリ: new-app (cedar stack)
- 新しいアプリの準備
# 新しいアプリを取得
git clone git://github.com/heroku/ruby-sample.git new-app
cd new-app/
# heroku作成
heroku create --remote cedar new-app
http://obscure-sierra-8167.herokuapp.com/ | git@heroku.com:obscure-sierra-8167.git
Git remote cedar added
# 別名 heroku として登録
git remote add heroku git@heroku.com:obscure-sierra-8167.git
- 新しいアプリのデプロイ
git push heroku master
- 古いアプリを停止
heroku maintenance:on --app old-app
- DBの移行
# 新旧アプリにpgbackupsを追加
heroku addons:add pgbackups:auto-week --app old-app
heroku addons:add pgbackups:auto-week --app new-app
# 新しいアプリに新規DBを用意
heroku-postgresql:dev
HEROKU_POSTGRESQL_[COLOR]_URL
# old-app をS3へエクスポート
heroku pgbackups:capture --expire --app old-app
# 新しいDBにS3からインポート
heroku pgbackups:restore HEROKU_POSTGRESQL_[COLOR]_URL `heroku pgbackups:url --app old-app` --app new-app
# 新しいDBをデフォルト(DATABASE_URL)に切り替え
heroku pg:promote HEROKU_POSTGRESQL_[COLOR]_URL
# プロセスを再起動
heroku restart
- ドメイン設定。重複が許可されないため、古いほうを削除し新しいほうに付け替える
# 古いアプリのドメインを削除
heroku domains:remove "www.example.com" --app old-app
# 新しいアプリにドメイン追加
heroku domains:add "www.example.com" --app new-app
- 検証
- DNS切り替え
CLIコマンド †
shell script中のループ †
- data.csv が複数行ある場合、単純に「heroku run rake」を実行すると1行目を処理して止まる。
- これは、stdinがherokuコマンドに取られるためのようだ。
- 対策として「< /dev/null」を足している
#!/bin/bash
i=0
cat "data.csv" | while IFS=',' read -a cols || [ -n "${cols}" ]; do
if [ $i == 0 ]; then
# skip header line
i=$(($i+1))
continue;
fi
heroku run rake example:example param1=${cols[1]} --app ${cols[0]} < /dev/null 2>/dev/null | grep -A 100 '^Called from' | grep -v "^Called from"
done
rake task一覧 †
heroku run rake --tasks -a $HEROKU_APP
heroku run rake -T -a $HEROKU_APP
Windows環境にインストール †
- 以下Heroku Toolbeltは旧版。新版はHeroku CLI
- https://toolbelt.heroku.com/windows から heroku-toolbelt.exe をダウンロードして、インストール
- PATHを通すために再起動が必要。
- 再起動せずにためすには、
set HerokuPath=C:\Program Files (x86)\Heroku
set PATH=%PATH%;C:\Program Files (x86)\Heroku\bin;C:\Program Files (x86)\git\cmd;C:\Program Files (x86)\Git\cmd
heroku login
heroku version
heroku/toolbelt/3.43.2 (i386-mingw32) ruby/2.1.7
heroku-cli/5.2.9-e9df6ac (windows-386) go1.6.2
You have no installed plugins.
特定のweb,workerを再起動 †
特定のdynoだけ応答不能になる事がある
前のバージョンにロールバック †
インストール済みアプリからソースコード取得 †
- herokuのGit URLを調べる
heroku info --app app_name | grep git@
Git URL: git@heroku.com:damp-temple-5458.git
- ローカルにclone
git clone git@heroku.com:damp-temple-5458.git
- 修正して再デプロイ
git add .
git commit -m "commit message"
git push origin master
- "git push heroku master"が使いたい場合、別名登録する
git remote add heroku git@heroku.com:damp-temple-5458.git
# または以下ファイルを直接編集
vi .git/config
CUIのインストール、アップデート、バージョン表示 †
- herokuアカウントのメールアドレス、パスワードを保存
heroku keys:add
アプリ †
現在のプロセス数表示 †
heroku ps
=== run: one-off processes
run.1: complete 2012/10/01 12:05:24 (~ 14m ago): `bundle exec irb`
=== web: `bundle exec ruby web.rb -p $PORT`
web.1: up 2012/10/01 12:01:45 (~ 18m ago)
httpアクセスログの表示 †
heroku logs --tail
メンテナンス/エラー画面の表示 †
ロケール、タイムゾーンの変更 †
- デフォルトのタイムゾーン:PST(太平洋標準時)=JST - 17
heroku config:add TZ=Asia/Tokyo
heroku config:add LANG=ja_JP.UTF-8
stackの確認(bamboo, cedar等) †
heroku stack --app アプリケーション名
DB関係 †
- ローカル
# db 作成
heroku run rake db:migrate
# db 初期値インポート
heroku run rake db:seed
# db:pull, db:push するために必要なモジュール
gem install taps
# dbダウンロード(指定DBの初期化、インポートがされるので注意)
heroku db:pull sqlite://path/to/保存ファイル名.sqlite3 --app アプリケーション名
heroku db:pull sqlite://mydb.sqlite3
heroku db:pull mysql://root:mypass@localhost/mydb.mysql
heroku db:pull postgres://postgres:mypass@remotehost/mydb.postgres
# heroku config のデータベースURLでも良い。db/development.sqlite3 が上書きされる
heroku db:pull DATABASE_URL
# dbアップロード
heroku db:push sqlite://path/to/アップロードファイル名.sqlite --app アプリケーション名
heroku db:push sqlite://mydb.sqlite
heroku db:push mysql://root:mypass@localhost/mydb.mysql
heroku db:push postgres://postgres:mypass@remotehost/mydb.postgres
# localのdb/development.sqlite3 をpush
heroku db:push DATABASE_URL
アプリの削除 †
- CUI
heroku destroy アプリケーション名
- 該当アプリを選択 > Settings
- Delete app... > アプリケーション名を入力し削除
アカウント登録 †
- https://api.heroku.com/signup からユーザ登録。メールアドレスが必要
- 認証メールが届くのでクリック
- パスワードの設定
- heroku Toolbeltインストール(ruby, gitはインストール済みとする)
rvmsudo gem install heroku
# ログイン(初回だけ) 公開鍵が無ければ作ってくれる
heroku login
Enter your Heroku credentials.
Email: example@example.com
Password (typing will be hidden):
Could not find an existing public key.
Would you like to generate one? [Yn] y
Generating new SSH public key.
Uploading SSH public key /home/hoge/.ssh/id_rsa.pub... done
Authentication successful.
- サンプルプロジェクト作成
git clone git://github.com/heroku/ruby-sample.git
cd ruby-sample
heroku create
git push heroku master
- URLをブラウザで開いてみる「Hello, world」が表示されたら成功
# GUI環境
heroku open
# CUI環境ではURLをコピーしてブラウザに貼り付け
heroku info
=== guarded-coast-1989
Git URL: git@heroku.com:guarded-coast-1989.git
Owner Email: example@example.com
Repo Size: 1M
Slug Size: 1M
Stack: cedar
Web URL: http://guarded-coast-1989.herokuapp.com/
|
|