Memo/Heroku

http://dexlab.net/pukiwiki/index.php?Memo/Heroku
 

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のみ実行可能

Can't find the 'libpq-fe.h header

  1. gem install pg
  2. ...
  3. Can't find the 'libpq-fe.h header
  • 解決
    1. sudo yum install postgresql-devel

固定IPを使う

herokuはAWSベースでデフォルトでは固定IPが無いため、herokuからホストにアクセスするケースで、ホスト側でIP制限をするのが困難。
そのため有料Addonがある


CURLからRESTリクエストを投げる

  • Getting Started with the Platform API | Heroku Dev Center
  • サンプル:heroku appの情報を取得
    1. HEROKU_TOKEN=$(heroku auth:token)
    2. curl -X POST https://api.heroku.com/apps \
    3. -H "Accept: application/vnd.heroku+json; version=3" \
    4. -H "Authorization: Bearer $HEROKU_TOKEN"
    5.  
    6. {
    7.   "created_at":"2013-05-21T22:36:48-00:00",
    8.   "id":"01234567-89ab-cdef-0123-456789abcdef",
    9.   "git_url":"git@heroku.com:cryptic-ocean-8852.git",
    10.   "name":"cryptic-ocean-8852",
    11.   ...
    12. }

addonのidを調べる

  1. HEROKU_TOKEN=$(heroku auth:token)
  2. curl -X GET https://api.heroku.com/apps/<APP ID>/addons \
  3.  -H "Accept: application/vnd.heroku+json; version=3" \
  4.  -H "Authorization: Bearer $HEROKU_TOKEN"

herokuアプリケーション名の変更

  • herokuコマンドで、remote, local両方変更される
    1. heroku rename <new name> --app <old name>
  • heroku管理画面でも変更できるが、ローカル側は手動変更が必要
    1. git remote rm heroku
    2. git remote add heroku git@heroku.com:<new name>.git

ログをhttpsで受信する

  • heroku側。Drain側ホスト名、ユーザ、パスワード等を設定
    1. heroku drains:add https://user:pass@logger.example.com/heroku-log-drains/myapp -a myapp
  • nginxの例: v1.8
    • Module ngx_http_core_module $request_body を使うには proxy_pass を使う必要がある
      1. # basic認証
      2. sudo htpasswd -c /etc/nginx/.htpasswd heroku
      3.  
      4. # nginxの設定
      5. sudo vim /etc/nginx/conf.d/heroku_log_drains.conf
      6. ----
      7. log_format postdata $request_body;
      8.  
      9. server {
      10.   listen 443;
      11.   server_name localhost;
      12.  
      13.   ssl on;
      14.   ssl_certificate_key /etc/nginx/cert.key;
      15.   ssl_certificate /etc/nginx/cert.pem;
      16.   ssl_prefer_server_ciphers on;
      17.   ssl_session_timeout 5m;
      18.   ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
      19.   ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
      20.  
      21.   location /heroku-log-drains/myapp {
      22.     auth_basic "Restricted";
      23.     auth_basic_user_file /etc/nginx/.htpasswd;
      24.     access_log /var/log/nginx/heroku-myapp.log postdata;
      25.     proxy_set_header Host $host;
      26.     proxy_pass https://127.0.0.1:10443/heroku-log-drains/dummy;
      27.     proxy_redirect default;
      28.   }
      29.  
      30.   location /heroku-log-drains/dummy {
      31.     return 200;
      32.   }
      33. }
      34. ----
      35. sudo service nginx restart
  • テスト: SSL証明書の検証を無視する場合は 「-k」 オプション追加
    1. curl -v -X POST -d "key1=val1" -d "key2=val2" "https://user:pass@logger.example.com/heroku-log-drains/myapp"
    2.  
    3. tail /var/log/nginx/heroku-myapp.log

SSL Heartbleed bug対応


PostgreSQLのバージョンアップ方法


PostgreSQLのバージョン確認

  1. heroku pg:info -r staging -app [YOUR APP ID]

カスタムドメインを設定する


httpsの場合

httpとは違うendpointが割り当てられる。

  1. ssl:endpointアドオンの追加
    1. heroku addons:add ssl:endpoint --app YOUR-APP
  2. SSL certificateの追加
    1. heroku certs:add www.example.com.key www.example.com.crt --app YOUR-APP
  3. カスタムドメインの登録
    1. heroku domains:add www.example.com --app YOUR-APP
    2.  
    3. heroku domains --app YOUR-APP
    4.  
    5. Endpoint                  Common Name(s)                        Expires               Trusted
    6. ------------------------  ------------------------------------  --------------------  -------
    7. YOUR-APP.herokussl.com    www.example.com                       2010-01-01 01:00 UTC  True
  4. DNSレコードの追加
    1. www.example.com CNAME YOUR-APP.herokussl.com
  • SSL証明書を更新する場合
    1. heroku certs:update www.example.com.key www.example.com.crt --app YOUR-APP

httpの場合

  1. カスタムドメインの登録
    1. heroku domains:add www.example.com --app YOUR-APP
    2.  
    3. heroku domains --app YOUR-APP
    4.  
    5. === YOUR-APP Domain Names
    6. YOUR-APP.herokuapp.com
    7. www.example.com
  2. DNSレコードの追加
    1. 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
  • update
    1. vim Gemfile
    2. ----
    3. rails '3.2.11'
    4. ----
    5.  
    6. bundle update rails
    7.  
    8. git push heroku master

ログをrsyslogで受信する

  • ログ出力アプリのホスト:logs.example.com
  • ログ収集ホスト名:host1.example.com
  • heroku側。Drain側ホスト名を設定。Drain IDをメモ。
    1. heroku drains:add syslog://host1.example.com:514
    2.  
    3. heroku drains -x
    4. syslog://logs.example.com (d.9173ea1f-6f14-4976-9cf0-7cd0dafdcdbc)
    5.  
    6. #削除する場合
    7. heroku drains:remove syslog://host1.example.com:514
  • logs.example.com(CentOS6.3)側
    • 514/tcp を解放する。ソースIPは 10.0.0.0/8
      1. vim /etc/rsyslog.conf
      2. ----
      3. $ModLoad imtcp
      4. $InputTCPServerRun 514
      5. ----
      6.  
      7. vim /etc/rsyslog.d/99-heroku.conf
      8. ----
      9. :HOSTNAME,isequal,"d.9173ea1f-6f14-4976-9cf0-7cd0dafdcdbc" /var/log/heroku-logs.example.com.log
      10. & ~
      11. ----
      12. service rsyslog restart

テーブル単位のインポート/エクスポート

  • \COPY でテーブル単位でファイルにインポート/エクスポートできる。
    • COPYはSTDIN/STDOUTしか使えない。ファイルへはsuperuserが必要。copyはSQLコマンドだが、\copyはpsqlの独自コマンド
  • \COPYコマンド
    1. # 対象DB URLを確認
    2. heroku config
    3.  
    4. # DBへ接続
    5. heroku pg:psql [DATABASE_URL]
    6.  
    7. # productsテーブルをテキスト形式でエクスポート
    8. => \copy products to '/tmp/products.txt';
    9.  
    10. # productsテーブルにテキスト形式でインポート
    11. => \copy products from '/tmp/products.txt';
    12.  
    13. # zipテーブルにcsv形式でインポート
    14. \copy zip FROM '/tmp/zip.csv' WITH CSV
  • COPYコマンド
    1. # productsテーブルをテキスト形式でエクスポート
    2. echo "copy products to STDOUT;" | heroku pg:psql DATABASE_URL > products.txt
    3.  
    4. # テーブル情報を見る
    5. echo "\d" | heroku pg:psql DATABASE_URL
    6.                      リレーションの一覧
    7.  スキーマ |       名前        |     型     |     所有者    
    8. ----------+-------------------+------------+----------------
    9.  public   | products          | テーブル   | **************
    10.  public   | products_id_seq   | シーケンス | **************
    11.  public   | schema_migrations | テーブル   | **************

addon

  1. # すべてのアドオン一覧
  2. heroku addons:list
  3.  
  4. # インストール済みアドオンの一覧
  5. heroku addons
  6.  
  7. # add
  8. heroku addons:add newrelic:standard
  9.  
  10. # remove
  11. heroku addons:remove newrelic:standard
  12.  
  13. # upgrade(有料)
  14. heroku addons:upgrade newrelic:professional
  15.  
  16. # アドオンヘルプをブラウザで開く
  17. heroku addons:open newrelic

AmazonRDS


SendGrid?


heroku-postgresql

デフォルトDBはPostgreSQLなのでそれに接続するアドオン

  • Heroku Postgres
    • pgbackupsを追加した際に、自動でこれもインストールされる
    • heroku createした直後は DATABASE_URL は存在しないが、一つDBが用意されている。このプラグインを追加後に表示される
  • 手動追加
    1. # デフォルトDBを見えるようにするだけ
    2. heroku addons:add heroku-postgresql
    3.  
    4. # dev を新規に追加
    5. heroku addons:add heroku-postgresql:dev
    6.  
    7. heroku config
    8. HEROKU_POSTGRESQL_BLACK_URL: postgres://USERNAME:PASSWORD@ec2-54-243-237-247.compute-1.amazonaws.com:5432
    9.  
    10. heroku pg:psql HEROKU_POSTGRESQL_BLACK_URL
    11. => \?
    12. => \q
  • 複数DBがある場合、指定DB(HEROKU_POSTGRESQL_[COLOR]_URL)をデフォルト(DATABASE_URL)に指定する
    1. heroku pg:promote HEROKU_POSTGRESQL_[COLOR]_URL

Airbrake(Hoptoad)

  • Airbrake | Heroku Dev Center
    • Webアプリケーションで発生したエラーを検知し、エラー情報をWebサービス上で管理/確認できるサービス
    • 旧名: Hoptoad

New Relic

  • New Relic | Heroku Dev Center
    • Webアプリケーションのパフォーマンス計測と運用状況のモニタリングを提供
      1. # 追加
      2. heroku addons:add newrelic:standard
      3.  
      4. # 追加
      5. curl https://raw.github.com/gist/2253296/newrelic.yml > config/newrelic.yml
      6. vi Gemfile
      7. ----
      8. configure :production do
      9.   gem 'newrelic_rpm'
      10. end
      11. ----
      12. bundle install --without production
      13.  
      14. # コミット
      15. git add .
      16. git commit -m "Added New Relic Plugin"
      17. git push heroku master
      18.  
      19. # ブラウザで開く
      20. heroku addons:open newrelic

PG Backups

  • 2015-03月から heroku-postgresql に統合された
    • コマンドが heroku pg:backups に変更
    • バックアップの開始。分の指定はできないようだ
      1. heroku pg:backups schedule DATABASE_URL --at '00:00 UTC' --app <app id>
      2.  
      3. # スケジュール一覧
      4. heroku pg:backups schedules --app <app id>
      5.  
      6. # バックアップ一覧
      7. heroku pg:backups --app <app id>
    • バックアップ期間は heroku-postgresql に影響する。hobyなら5回分
  • 記事

以下古い情報

  • PG Backups
    • postgresqlのバックアップ。"--app app_name"が指定可能
    • デフォルトのタイムゾーン:PST(太平洋標準時)=JST - 17
    • 手動: b001〜,
    • 自動: a001〜, PST 20:05(JST 3:05)頃開始
      1. heroku addons:add pgbackups:auto-week
      2.  
      3. # バックアップ一覧を見る
      4. heroku pgbackups
      5.  
      6. ID    Backup Time          Size   Database
      7. ----  -------------------  -----  -------------------------------------------
      8. b001  2012/10/02 21:04.39  4.2KB  HEROKU_POSTGRESQL_MAROON_URL (DATABASE_URL)
      9.  
      10. # バックアップ
      11. heroku pgbackups:capture --expire
      12.  
      13. # リストア先のDBを調べる。HEROKU_POSTGRESQL_[COLOR NAME] になっている
      14. heroku config | grep POSTGRESQL
      15.  
      16. # 新しいDBにリストア
      17. heroku pgbackups:restore HEROKU_POSTGRESQL_COLOR
      18.  
      19. # 新しいDBに接続
      20. heroku pg:psql HEROKU_POSTGRESQL_COLOR b001
      21.  
      22. # urlを調べるAmazonS3にバックアップされている
      23. heroku pgbackups:url b001
      24. "https://s3.amazonaws.com/hkpgbackups/app12345@heroku.com/b001.dump?authparameters"
      25.  
      26. # urlを指定してリストア
      27. heroku pgbackups:restore DATABASE_URL 'http://s3.amazonaws.com/.....mydb.dump?authparameters'
  • PG Backups | Add-ons | Heroku
    • plus: FREE, 手動:7回
    • auto-week: FREE, 自動バックアップ。日:7回、手動:2回
    • auto-month: FREE, 自動バックアップ。日:7回、週:5回、手動:10回

Heroku Postgres

  • Heroku Postgres | Heroku Dev Center
    • PostgreSQLを使えるようにするアドオン
    • PostgreSQL 9.1
      1. heroku addons:add heroku-postgresql:dev
      2.  
      3. # 作成完了まで15分程度かかる
      4. heroku pg:wait
      5.  
      6. # URL
      7. heroku config | grep DATABASE_URL
      8. DATABASE_URL:                 postgres://lsdndlgkaikivy:P_hVyj9wFswjgNLY5c3ENXKNmW@ec2-54-243-243-46.compute-1.amazonaws.com:5432/d4tbv4kdc0807c
      9.  
      10. # 情報表示
      11. heroku pg:info
      12. === HEROKU_POSTGRESQL_MAROON_URL (DATABASE_URL)
      13. Plan:        Dev
      14. Status:      available
      15. Connections: 0
      16. PG Version:  9.1.6
      17. Created:     2012-10-03 03:07 UTC
      18. Data Size:   6.0 MB
      19. Tables:      2
      20. Rows:        0/10000 (In compliance)
      21. Fork/Follow: Unavailable
      22.  
      23. === HEROKU_POSTGRESQL_NAVY_URL
      24. Plan:        Dev
      25. Status:      available
      26. Connections: 0
      27. PG Version:  9.1.6
      28. Created:     2012-10-03 03:27 UTC
      29. Data Size:   5.9 MB
      30. Tables:      0
      31. Rows:        0/10000 (In compliance)
      32. Fork/Follow: Unavailable
      33.  
      34. # console
      35. sudo yum install postgresql
      36. heroku pg:psql
      37. d4tbv4kdc0807c=> \?
      38. d4tbv4kdc0807c=> \q

ClearDB MySQL Database

  • ClearDB MySQL Database | Heroku Dev Center
    • MySQLを使えるようにするaddon
      1. heroku addons:add cleardb:ignite
      2.  
      3. # URL
      4. heroku config | grep CLEARDB_DATABASE_URL
      5. CLEARDB_DATABASE_URL:         mysql://bb90a5fe375494:2a5cab27@us-cdbr-east-02.cleardb.com/heroku_f2afab3ef1a046c?reconnect=true
  • ClearDB MySQL Database | Add-ons | Heroku
    • ignite: $0/month、5MBストレージ、10コネクション、I/O低、デイリーバックアップ
    • punch: $9.99/month、1GBストレージ、15コネクション、I/O中、デイリーバックアップ

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の再にバージョン違いで怒られる

  • [〜]はカレントディレクトリがheroku リポジトリ内なら省略可
  • CentOS6.3 x86_64 に PostgreSQL9.1をインストールする場合
    1. rpm -ivh http://yum.postgresql.org/9.1/redhat/rhel-6-x86_64/pgdg-centos91-9.1-4.noarch.rpm
    2. yum install postgresql91 --enablerepo=pgdg91
    3. ldconfig
    4.  
    5. heroku addons:add heroku-postgresql:dev
    6. heroku pg:psql [--app app_name]
    7. => \q
  • DB URLを確認。DATABASE_URL か HEROKU_POSTGRESQL_[COLOR]_URL
    1. heroku config [--app app_name]
  • ローカルにダンプ
    1. PGPASSWORD=mypassword pg_dump -Fc --no-acl --no-owner -h myhost -U myuser mydb > mydb.dump
  • ローカルにダンプからリストア
    1. PGPASSWORD=mypassword pg_restore --verbose --clean --no-acl --no-owner -h myhost -U myuser -d mydb latest.dump
  • S3へアップロードしてある状態からリストア
    1. heroku pgbackups:restore DATABASE 'http://s3.amazonaws.com/.....mydb.dump?authparameters'

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 テーブルを作る
    1. rails generate migration add_item_table
    2.  
    3. vi db/migrate/20121004030233_add_item_table.rb
    4. ----
    5. class AddItemTable < ActiveRecord::Migration
    6.   def change
    7.     create_table "item", :force => true do |t|
    8.       t.integer  "item_id"
    9.       t.integer  "item_name"
    10.       t.datetime "created_at"
    11.       t.datetime "updated_at"
    12.     end
    13.   end
    14. end
    15. ----
    16. rake db:migrate
    17.  
    18. # ローカルのスキーマ確認
    19. sqlite3 db/development.sqlite3
    20. sqlite> .schema item
    21. CREATE TABLE "item" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "item_id" integer, "item_name" integer, "created_at" datetime, "updated_at" datetime);
    22. sqlite> .quit
    23.  
    24. # herokuへdeproy
    25. git add .
    26. git commit -m "add item table"
    27. git push heroku master
    28. heroku run rake db:migrate
    29. # 確認
    30. heroku pg:psql
    31. => \d item
    32.                                     テーブル "public.item"
    33.    カラム   |             型              |                      修飾語                      
    34. ------------+-----------------------------+---------------------------------------------------
    35.  id         | integer                     | not null default nextval('item_id_seq'::regclass)
    36.  item_id    | integer                     | 
    37.  item_name  | integer                     | 
    38.  created_at | timestamp without time zone | 
    39.  updated_at | timestamp without time zone | 
    40. インデックス:
    41.     "item_pkey" PRIMARY KEY, btree (id)
    42. => \q
  • item_idをbigintに変更
    1. rails generate migration item_item_id_integer_to_bigint
    2. vi db/migrate/20121004031247_item_item_id_integer_to_bigint.rb
    3. ----
    4. class ItemItemIdIntegerToBigint < ActiveRecord::Migration
    5.   def self.up
    6.     change_column :item, :item_id, :integer, :limit => 8
    7.   end
    8.  
    9.   def self.down
    10.     change_column :item, :item_id, :integer
    11.   end
    12. end
    13. ----
    14. rake db:migrate
    15.  
    16. # ローカルのスキーマ確認。integer(8) に変わった
    17. sqlite3 db/development.sqlite3
    18. sqlite> .schema item
    19. CREATE TABLE "item" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "item_id" integer(8), "item_name" integer, "created_at" datetime, "updated_at" datetime);
    20. sqlite> .quit
    21.  
    22. # herokuへdeproy
    23. git add .
    24. git commit -m "add item table"
    25. git push heroku master
    26. heroku run rake db:migrate
    27. # 確認
    28. heroku pg:psql
    29. => \d item
    30.                                     テーブル "public.item"
    31.    カラム   |             型              |                      修飾語                      
    32. ------------+-----------------------------+---------------------------------------------------
    33.  id         | integer                     | not null default nextval('item_id_seq'::regclass)
    34.  item_id    | bigint                      | 
    35.  item_name  | integer                     | 
    36.  created_at | timestamp without time zone | 
    37.  updated_at | timestamp without time zone | 
    38. インデックス:
    39.     "item_pkey" PRIMARY KEY, btree (id)
    40. => \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
  1. rvmsudo gem install heroku taps sqlite3 execjs therubyracer
  2.  
  3. rails new catalog
  4. cd catalog
  5.  
  6. # 以下を最後に追加
  7. vi Gemfile
  8. ----
  9. gem 'execjs'
  10. gem 'therubyracer'
  11. ----
  12. bundle install --without production
  13.  
  14. rails server
  15. # http://localhost:3000/ をブラウザで開いて見る。Ctrl+Cで中止
  16.  
  17. # gitにcommit
  18. git init
  19. git add .
  20. git commit -m "Init"
  21.  
  22. # herokuでは production は"pg"に変える必要がある。
  23. vi Gemfile
  24. ----
  25. group :production do
  26.   gem "pg"
  27. end
  28. group :development, :test do
  29.   gem 'sqlite3'
  30. end
  31. ----
  32.  
  33. # gemライブラリーのバージョンエラーのメッセージが出る場合は Gemfile.lock を一度削除。bundle installコマンドで再生成される
  34. rm Gemfile.lock
  35. bundle install --without production
  36. rails server
  37.  
  38. # heroku
  39. heroku create
  40. git add Gemfile.lock
  41. git commit Gemfile Gemfile.lock
  42. git push heroku master
  43. # または
  44. git push git@heroku.com:[アプリケーション名].git master --force
  45.  
  46. # dbを利用するテスト
  47. rails generate scaffold Product name:string price:float url:string
  48. rake db:migrate
  49. rake db:seed
  50. rm public/index.html
  51. vi config/routes.rb
  52. ----
  53. root :to => 'products#index' 
  54. ----
  55. # ローカルで動作確認。http://localhost:3000/ をブラウザで開いてレコードの追加、編集、削除等をやってみる
  56. rails server
  57.  
  58. # gitにコミット
  59. git add .
  60. git rm public/index.html
  61. git commit -m "Scaffold products"
  62.  
  63. # herokuに送信
  64. git push heroku master
  65. # heroku db 作成
  66. heroku run rake db:migrate
  67. # heroku db 初期値インポート
  68. heroku run rake db:seed

Taps Server Error: PGError

  • local dbをpushしようとしたときに発生
    1. heroku db:push DATABASE_URL
    2.  
    3. Taps Server Error: PGError: ERROR:  time zone displacement out of range: "2012-10-03 12:00:00.000000+5894889600"
  • 解決
    • rvm等で1.9.2へダウングレードする

Invalid RUBY_VERSION specified:

  • git pushした時に発生する
    1. git push heroku master
    2.  
    3. -----> Ruby/Rails app detected
    4.  !
    5.  !     Invalid RUBY_VERSION specified:
    6.  !     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,
    7.        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,
    8.        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,
    9.        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
    • rvmで対応しているrubyをいれる。1.9.3はdb:pushで失敗するため、1.9.2を指定
      1. rvm install ruby-1.9.2-p290
      2. rvm use ruby-1.9.2-p290 --default

ブラウザでアプリケーション名を変更した場合、console側の名前も合わせる

  • ブラウザでアプリケーション名を変更するとローカルで認識しなくなる
    1. heroku config
    2.  !    App not found
    3.  
    4. # 以下なら正しい
    5. heroku config --app [アプリケーション名]
  • .git/config の中に記載があるので、変更したアプリケーション名に合わせる
    1. git remote add heroku git@heroku.com:[アプリケーション名].git
    2. # または
    3. vi .git/config
    4. ----
    5. [remote "heroku"]
    6.         url = git@heroku.com:[アプリケーション名].git
    7.         fetch = +refs/heads/*:refs/remotes/heroku/*
    8. ----

アプリの移設

  • 古いアプリ: old-app
  • 新しいアプリ: new-app (cedar stack)
  1. 新しいアプリの準備
    1. # 新しいアプリを取得
    2. git clone git://github.com/heroku/ruby-sample.git new-app
    3. cd new-app/
    4.  
    5. # heroku作成
    6. heroku create --remote cedar new-app
    7. http://obscure-sierra-8167.herokuapp.com/ | git@heroku.com:obscure-sierra-8167.git
    8. Git remote cedar added
    9.  
    10. # 別名 heroku として登録
    11. git remote add heroku git@heroku.com:obscure-sierra-8167.git
  2. 新しいアプリのデプロイ
    1. git push heroku master
  3. 古いアプリを停止
    1. heroku maintenance:on --app old-app
  4. DBの移行
    1. # 新旧アプリにpgbackupsを追加
    2. heroku addons:add pgbackups:auto-week --app old-app
    3. heroku addons:add pgbackups:auto-week --app new-app
    4.  
    5. # 新しいアプリに新規DBを用意
    6. heroku-postgresql:dev
    7. HEROKU_POSTGRESQL_[COLOR]_URL
    8.  
    9. # old-app をS3へエクスポート
    10. heroku pgbackups:capture --expire --app old-app
    11.  
    12. # 新しいDBにS3からインポート
    13. heroku pgbackups:restore HEROKU_POSTGRESQL_[COLOR]_URL `heroku pgbackups:url --app old-app` --app new-app
    14.  
    15. # 新しいDBをデフォルト(DATABASE_URL)に切り替え
    16. heroku pg:promote HEROKU_POSTGRESQL_[COLOR]_URL
    17.  
    18. # プロセスを再起動
    19. heroku restart
  5. ドメイン設定。重複が許可されないため、古いほうを削除し新しいほうに付け替える
    1. # 古いアプリのドメインを削除
    2. heroku domains:remove "www.example.com" --app old-app
    3.  
    4. # 新しいアプリにドメイン追加
    5. heroku domains:add "www.example.com" --app new-app
  6. 検証
  7. DNS切り替え

CLIコマンド

  • CLI Usage | Heroku Dev Center
    1. Webアプリケーションのバージョンアップ(release)
    2. リリース管理機能(release / rollback)
    3. メンテナンス画面への切り替え(maintenance)
    4. データベースのバックアップ取得(pgbackups)
    5. データベースのリストア(pgbackups:restore)
    6. ログの確認(logs)
    7. 実行プロセスであるdyno数の変更(dynos)
    8. バックグラウンドジョブであるworker数の変更(workers)
    9. アプリケーションの再起動(restart)
  • コマンド引数 "--app app_name" を省略するには .git/config に[remote "heroku"] 項目が必要
    1. git remote add heroku git@heroku.com:damp-temple-5458.git

Windows環境にインストール

  1. https://toolbelt.heroku.com/windows から heroku-toolbelt.exe をダウンロードして、インストール
  2. PATHを通すために再起動が必要。
  3. 再起動せずにためすには、
    1. set HerokuPath=C:\Program Files (x86)\Heroku
    2. set PATH=%PATH%;C:\Program Files (x86)\Heroku\bin;C:\Program Files (x86)\git\cmd;C:\Program Files (x86)\Git\cmd
    3.  
    4. heroku login
    5.  
    6. heroku version
    7. heroku/toolbelt/3.43.2 (i386-mingw32) ruby/2.1.7
    8. heroku-cli/5.2.9-e9df6ac (windows-386) go1.6.2
    9. You have no installed plugins.

特定のweb,workerを再起動

特定のdynoだけ応答不能になる事がある

  • heroku psで現在のプロセスを確認して再起動
    1. heroku ps -a app-id
    2.  
    3. heroku restart web.1 -a app-id
    4. heroku restart worker.1 -a app-id

前のバージョンにロールバック

  • リリースしたが動作しない場合に、以前の状態に戻せる
    1. # リリースバージョンの一覧を表示
    2. heroku releases
    3.  
    4. # 一つ前のバージョンにロールバック
    5. heroku releases:rollback
    6.  
    7. # バージョンを指定してロールバック
    8. heroku releases:rollback v10

インストール済みアプリからソースコード取得

  • herokuのGit URLを調べる
    1. heroku info --app app_name | grep git@
    2.  
    3. Git URL:       git@heroku.com:damp-temple-5458.git
  • ローカルにclone
    1. git clone git@heroku.com:damp-temple-5458.git
  • 修正して再デプロイ
    1. git add .
    2. git commit -m "commit message"
    3. git push origin master
  • "git push heroku master"が使いたい場合、別名登録する
    1. git remote add heroku git@heroku.com:damp-temple-5458.git
    2. # または以下ファイルを直接編集
    3. vi .git/config

CUIのインストール、アップデート、バージョン表示

  1. # インストール
  2. gem install heroku
  3.  
  4. # アップデート
  5. gem update heroku
  6.  
  7. # バージョン確認
  8. heroku version
  9. heroku-gem/2.32.6 (x86_64-linux) ruby/1.9.2 autoupdate
  • herokuアカウントのメールアドレス、パスワードを保存
    1. heroku keys:add

アプリ

  • アプリ一覧
    1. heroku apps
  • アプリ情報
    1. # アプリ情報
    2. heroku info --app damp-temple-5458
    3.  
    4. === damp-temple-5458
    5. Git URL:       git@heroku.com:damp-temple-5458.git
    6. Owner Email:   example@example.com
    7. Repo Size:     1M
    8. Slug Size:     1M
    9. Stack:         cedar
    10. Web URL:       http://damp-temple-5458.herokuapp.com/
    11.  
    12. # アプリ設定
    13. heroku config --app damp-temple-5458
    14.  
    15. === damp-temple-5458 Config Vars
    16. GEM_PATH: vendor/bundle/ruby/1.9.1
    17. LANG:     en_US.UTF-8
    18. PATH:     bin:vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin

現在のプロセス数表示

  1. heroku ps
  2. === run: one-off processes
  3. run.1: complete 2012/10/01 12:05:24 (~ 14m ago): `bundle exec irb`
  4.  
  5. === web: `bundle exec ruby web.rb -p $PORT`
  6. web.1: up 2012/10/01 12:01:45 (~ 18m ago)

httpアクセスログの表示

  1. heroku logs --tail

メンテナンス/エラー画面の表示

  • Maintenance Mode | Heroku Dev Center
    1. heroku maintenance:on
    2. heroku maintenance:off
    3.  
    4. # 現在のモードの表示
    5. heroku maintenance
    6. off
    • メンテナンスページの変更。S3など任意のURLを指定できる。空を指定するとデフォルトに戻る。指定したURLはIFRAMEで開かれる
      1. heroku config:add MAINTENANCE_PAGE_URL=http://s3.amazonaws.com/heroku_pages/maintenance.html
    • エラーページの変更。S3など任意のURLを指定できる。空を指定するとデフォルトに戻る。指定したURLはIFRAMEで開かれる。HTTP STATUS 503になる
      1. heroku config:add ERROR_PAGE_URL=http://s3.amazonaws.com/heroku_pages/error.html

ロケール、タイムゾーンの変更

  • デフォルトのタイムゾーン:PST(太平洋標準時)=JST - 17
  1. heroku config:add TZ=Asia/Tokyo
  2. heroku config:add LANG=ja_JP.UTF-8

stackの確認(bamboo, cedar等)

  1. heroku stack --app アプリケーション名

DB関係

  • ローカル
    1. # db 作成
    2. heroku run rake db:migrate
    3.  
    4. # db 初期値インポート
    5. heroku run rake db:seed
    6.  
    7. # db:pull, db:push するために必要なモジュール
    8. gem install taps
    9.  
    10. # dbダウンロード(指定DBの初期化、インポートがされるので注意)
    11. heroku db:pull sqlite://path/to/保存ファイル名.sqlite3 --app アプリケーション名
    12. heroku db:pull sqlite://mydb.sqlite3
    13. heroku db:pull mysql://root:mypass@localhost/mydb.mysql
    14. heroku db:pull postgres://postgres:mypass@remotehost/mydb.postgres
    15.  
    16. # heroku config のデータベースURLでも良い。db/development.sqlite3 が上書きされる
    17. heroku db:pull DATABASE_URL
    18.  
    19. # dbアップロード
    20. heroku db:push sqlite://path/to/アップロードファイル名.sqlite --app アプリケーション名
    21. heroku db:push sqlite://mydb.sqlite
    22. heroku db:push mysql://root:mypass@localhost/mydb.mysql
    23. heroku db:push postgres://postgres:mypass@remotehost/mydb.postgres
    24.  
    25. # localのdb/development.sqlite3 をpush
    26. heroku db:push DATABASE_URL

アプリの削除

  • CUI
    1. heroku destroy アプリケーション名
  • GUI
  1. 該当アプリを選択 > Settings
  2. Delete app... > アプリケーション名を入力し削除

アカウント登録

  1. https://api.heroku.com/signup からユーザ登録。メールアドレスが必要
  2. 認証メールが届くのでクリック
  3. パスワードの設定
  4. heroku Toolbeltインストール(ruby, gitはインストール済みとする)
    1. rvmsudo gem install heroku
    2.  
    3. # ログイン(初回だけ) 公開鍵が無ければ作ってくれる
    4. heroku login
    5. Enter your Heroku credentials.
    6. Email: example@example.com
    7. Password (typing will be hidden):
    8. Could not find an existing public key.
    9. Would you like to generate one? [Yn] y
    10. Generating new SSH public key.
    11. Uploading SSH public key /home/hoge/.ssh/id_rsa.pub... done
    12. Authentication successful.
  5. サンプルプロジェクト作成
    1. git clone git://github.com/heroku/ruby-sample.git
    2. cd ruby-sample
    3. heroku create
    4. git push heroku master
  6. URLをブラウザで開いてみる「Hello, world」が表示されたら成功
    1. # GUI環境
    2. heroku open
    3.  
    4.  
    5. # CUI環境ではURLをコピーしてブラウザに貼り付け
    6. heroku info
    7.  
    8. === guarded-coast-1989
    9. Git URL:       git@heroku.com:guarded-coast-1989.git
    10. Owner Email:   example@example.com
    11. Repo Size:     1M
    12. Slug Size:     1M
    13. Stack:         cedar
    14. Web URL:       http://guarded-coast-1989.herokuapp.com/
  • アプリ一覧
    1. heroku list
    2.  
    3. === My Apps
    4. guarded-coast-1989

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-09 (日) 20:27:30 (378d)