Memo/Heroku

https://dexlab.net:443/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

gem install pg
...
Can't find the 'libpq-fe.h header
  • 解決
    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の情報を取得
    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アプリケーション名の変更

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

ログをhttpsで受信する

  • heroku側。Drain側ホスト名、ユーザ、パスワード等を設定
    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 を使う必要がある
      # basic認証
      sudo htpasswd -c /etc/nginx/.htpasswd heroku
      
      # nginxの設定
      sudo vim /etc/nginx/conf.d/heroku_log_drains.conf
      ----
      log_format postdata $request_body;
      
      server {
        listen 443;
        server_name localhost;
      
        ssl on;
        ssl_certificate_key /etc/nginx/cert.key;
        ssl_certificate /etc/nginx/cert.pem;
        ssl_prefer_server_ciphers on;
        ssl_session_timeout 5m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        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';
      
        location /heroku-log-drains/myapp {
          auth_basic "Restricted";
          auth_basic_user_file /etc/nginx/.htpasswd;
          access_log /var/log/nginx/heroku-myapp.log postdata;
          proxy_set_header Host $host;
          proxy_pass https://127.0.0.1:10443/heroku-log-drains/dummy;
          proxy_redirect default;
        }
      
        location /heroku-log-drains/dummy {
          return 200;
        }
      }
      ----
      sudo service nginx restart
  • テスト: SSL証明書の検証を無視する場合は 「-k」 オプション追加
    curl -v -X POST -d "key1=val1" -d "key2=val2" "https://user:pass@logger.example.com/heroku-log-drains/myapp"
    
    tail /var/log/nginx/heroku-myapp.log

SSL Heartbleed bug対応


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


PostgreSQLのバージョン確認

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

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


httpsの場合

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

  1. ssl:endpointアドオンの追加
    heroku addons:add ssl:endpoint --app YOUR-APP
  2. SSL certificateの追加
    heroku certs:add www.example.com.key www.example.com.crt --app YOUR-APP
  3. カスタムドメインの登録
    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
  4. DNSレコードの追加
    www.example.com CNAME YOUR-APP.herokussl.com
  • SSL証明書を更新する場合
    heroku certs:update www.example.com.key www.example.com.crt --app YOUR-APP

httpの場合

  1. カスタムドメインの登録
    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
  2. 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
  • update
    vim Gemfile
    ----
    rails '3.2.11'
    ----
    
    bundle update rails
    
    git push heroku master

ログをrsyslogで受信する

  • ログ出力アプリのホスト:logs.example.com
  • ログ収集ホスト名:host1.example.com
  • heroku側。Drain側ホスト名を設定。Drain IDをメモ。
    heroku drains:add syslog://host1.example.com:514
    
    heroku drains -x
    syslog://logs.example.com (d.9173ea1f-6f14-4976-9cf0-7cd0dafdcdbc)
    
    #削除する場合
    heroku drains:remove syslog://host1.example.com:514
  • 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の独自コマンド
  • \COPYコマンド
    # 対象DB URLを確認
    heroku config
    
    # DBへ接続
    heroku pg:psql [DATABASE_URL]
    
    # productsテーブルをテキスト形式でエクスポート
    => \copy products to '/tmp/products.txt';
    
    # productsテーブルにテキスト形式でインポート
    => \copy products from '/tmp/products.txt';
    
    # zipテーブルにcsv形式でインポート
    \copy zip FROM '/tmp/zip.csv' WITH CSV
  • COPYコマンド
    # productsテーブルをテキスト形式でエクスポート
    echo "copy products to STDOUT;" | heroku pg:psql DATABASE_URL > products.txt
    
    # テーブル情報を見る
    echo "\d" | heroku pg:psql DATABASE_URL
                         リレーションの一覧
     スキーマ |       名前        ||     所有者     
    ----------+-------------------+------------+----------------
     public   | products          | テーブル   | **************
     public   | products_id_seq   | シーケンス | **************
     public   | schema_migrations | テーブル   | **************

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が用意されている。このプラグインを追加後に表示される
  • 手動追加
    # デフォルトDBを見えるようにするだけ
    heroku addons:add heroku-postgresql
    
    # dev を新規に追加
    heroku addons:add heroku-postgresql:dev
    
    heroku config
    HEROKU_POSTGRESQL_BLACK_URL: postgres://USERNAME:PASSWORD@ec2-54-243-237-247.compute-1.amazonaws.com:5432
    
    heroku pg:psql HEROKU_POSTGRESQL_BLACK_URL
    => \?
    => \q
  • 複数DBがある場合、指定DB(HEROKU_POSTGRESQL_[COLOR]_URL)をデフォルト(DATABASE_URL)に指定する
    heroku pg:promote HEROKU_POSTGRESQL_[COLOR]_URL

Airbrake(Hoptoad)

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

New Relic

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

PG Backups

  • 2015-03月から heroku-postgresql に統合された
    • コマンドが heroku pg:backups に変更
    • バックアップの開始。分の指定はできないようだ
      heroku pg:backups schedule DATABASE_URL --at '00:00 UTC' --app <app id>
      
      # スケジュール一覧
      heroku pg:backups schedules --app <app id>
      
      # バックアップ一覧
      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)頃開始
      heroku addons:add pgbackups:auto-week
      
      # バックアップ一覧を見る
      heroku pgbackups
      
      ID    Backup Time          Size   Database
      ----  -------------------  -----  -------------------------------------------
      b001  2012/10/02 21:04.39  4.2KB  HEROKU_POSTGRESQL_MAROON_URL (DATABASE_URL)
      
      # バックアップ
      heroku pgbackups:capture --expire
      
      # リストア先のDBを調べる。HEROKU_POSTGRESQL_[COLOR NAME] になっている
      heroku config | grep POSTGRESQL
      
      # 新しいDBにリストア
      heroku pgbackups:restore HEROKU_POSTGRESQL_COLOR
      
      # 新しいDBに接続
      heroku pg:psql HEROKU_POSTGRESQL_COLOR b001
      
      # urlを調べるAmazonS3にバックアップされている
      heroku pgbackups:url b001
      "https://s3.amazonaws.com/hkpgbackups/app12345@heroku.com/b001.dump?authparameters"
      
      # urlを指定してリストア
      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
      heroku addons:add heroku-postgresql:dev
      
      # 作成完了まで15分程度かかる
      heroku pg:wait
      
      # URL
      heroku config | grep DATABASE_URL
      DATABASE_URL:                 postgres://lsdndlgkaikivy:P_hVyj9wFswjgNLY5c3ENXKNmW@ec2-54-243-243-46.compute-1.amazonaws.com:5432/d4tbv4kdc0807c
      
      # 情報表示
      heroku pg:info
      === HEROKU_POSTGRESQL_MAROON_URL (DATABASE_URL)
      Plan:        Dev
      Status:      available
      Connections: 0
      PG Version:  9.1.6
      Created:     2012-10-03 03:07 UTC
      Data Size:   6.0 MB
      Tables:      2
      Rows:        0/10000 (In compliance)
      Fork/Follow: Unavailable
      
      === HEROKU_POSTGRESQL_NAVY_URL
      Plan:        Dev
      Status:      available
      Connections: 0
      PG Version:  9.1.6
      Created:     2012-10-03 03:27 UTC
      Data Size:   5.9 MB
      Tables:      0
      Rows:        0/10000 (In compliance)
      Fork/Follow: Unavailable
      
      # console
      sudo yum install postgresql
      heroku pg:psql
      d4tbv4kdc0807c=> \?
      d4tbv4kdc0807c=> \q

ClearDB MySQL Database

  • ClearDB MySQL Database | Heroku Dev Center
    • MySQLを使えるようにするaddon
      heroku addons:add cleardb:ignite
      
      # URL
      heroku config | grep CLEARDB_DATABASE_URL
      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をインストールする場合
    rpm -ivh http://yum.postgresql.org/9.1/redhat/rhel-6-x86_64/pgdg-centos91-9.1-4.noarch.rpm
    yum install postgresql91 --enablerepo=pgdg91
    ldconfig
    
    heroku addons:add heroku-postgresql:dev
    heroku pg:psql [--app app_name]
    => \q
  • DB URLを確認。DATABASE_URL か HEROKU_POSTGRESQL_[COLOR]_URL
    heroku config [--app app_name]
  • ローカルにダンプ
    PGPASSWORD=mypassword pg_dump -Fc --no-acl --no-owner -h myhost -U myuser mydb > mydb.dump
  • ローカルにダンプからリストア
    PGPASSWORD=mypassword pg_restore --verbose --clean --no-acl --no-owner -h myhost -U myuser -d mydb latest.dump
  • S3へアップロードしてある状態からリストア
    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 テーブルを作る
    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

  • local dbをpushしようとしたときに発生
    heroku db:push DATABASE_URL
    
    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した時に発生する
    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
    • rvmで対応しているrubyをいれる。1.9.3はdb:pushで失敗するため、1.9.2を指定
      rvm install ruby-1.9.2-p290
      rvm use ruby-1.9.2-p290 --default

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

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

アプリの移設

  • 古いアプリ: old-app
  • 新しいアプリ: new-app (cedar stack)
  1. 新しいアプリの準備
    # 新しいアプリを取得
    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
  2. 新しいアプリのデプロイ
    git push heroku master
  3. 古いアプリを停止
    heroku maintenance:on --app old-app
  4. 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
  5. ドメイン設定。重複が許可されないため、古いほうを削除し新しいほうに付け替える
    # 古いアプリのドメインを削除
    heroku domains:remove "www.example.com" --app old-app
    
    # 新しいアプリにドメイン追加
    heroku domains:add "www.example.com" --app new-app
  6. 検証
  7. DNS切り替え

CLIコマンド

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

Windows環境にインストール

  1. https://toolbelt.heroku.com/windows から heroku-toolbelt.exe をダウンロードして、インストール
  2. PATHを通すために再起動が必要。
  3. 再起動せずにためすには、
    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 psで現在のプロセスを確認して再起動
    heroku ps -a app-id
    
    heroku restart web.1 -a app-id
    heroku restart worker.1 -a app-id

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

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

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

  • 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のインストール、アップデート、バージョン表示

# インストール
gem install heroku

# アップデート
gem update heroku

# バージョン確認
heroku version
heroku-gem/2.32.6 (x86_64-linux) ruby/1.9.2 autoupdate
  • herokuアカウントのメールアドレス、パスワードを保存
    heroku keys:add

アプリ

  • アプリ一覧
    heroku apps
  • アプリ情報
    # アプリ情報
    heroku info --app damp-temple-5458
    
    === damp-temple-5458
    Git URL:       git@heroku.com:damp-temple-5458.git
    Owner Email:   example@example.com
    Repo Size:     1M
    Slug Size:     1M
    Stack:         cedar
    Web URL:       http://damp-temple-5458.herokuapp.com/
    
    # アプリ設定
    heroku config --app damp-temple-5458
    
    === damp-temple-5458 Config Vars
    GEM_PATH: vendor/bundle/ruby/1.9.1
    LANG:     en_US.UTF-8
    PATH:     bin:vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin

現在のプロセス数表示

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

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

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

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

  • デフォルトのタイムゾーン: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 アプリケーション名
  • GUI
  1. 該当アプリを選択 > Settings
  2. Delete app... > アプリケーション名を入力し削除

アカウント登録

  1. https://api.heroku.com/signup からユーザ登録。メールアドレスが必要
  2. 認証メールが届くのでクリック
  3. パスワードの設定
  4. 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.
  5. サンプルプロジェクト作成
    git clone git://github.com/heroku/ruby-sample.git
    cd ruby-sample
    heroku create
    git push heroku master
  6. 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/
  • アプリ一覧
    heroku list
    
    === My Apps
    guarded-coast-1989

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:37 (61d)