以前は「アップグレードする方法は無いからapp作り直せ」って書いてあった気がするけど今はある。

$ heroku stack
=== help-me-hackers Available Stacks
  bamboo-mri-1.9.2
  cedar
  cedar-14 (beta)
* bamboo-ree-1.8.7
$ heroku stack:set cedar
$ git push heroku master
$ heroku stack
=== help-me-hackers Available Stacks
  bamboo-mri-1.9.2
  bamboo-ree-1.8.7
  cedar-14 (beta)
* cedar

もっと丁寧にやる方法がちゃんと書いてあるからそちらを参考に・・・。

Migrating to the Celadon Cedar Stack | Heroku Dev Center

Legacy routing EOL on October 20th.

On Ocober 20th 2014 we are turning off the legacy “.heroku.com” routing path.

herokuのbamboo stackが使ってたlegacy routingが廃止されるということで、昔、www無しでアクセスしたい場合に直接IPで指定してた系のサービスがアクセスできなくなった。

U2Plusにも通知が来てたのでメンテしてる@tkawaさんに聞いてみたらGehirnのDNSで対応したらしい。

俺も使ってみたらアラ便利。ALIASレコードが使えて無料で2ドメインまで、レコード無制限ってのは海外含めてあんまり無いんじゃない?

Gehirnって聞くようになってからだいぶ経つのでいきなり無くなる感じはしないし、ええやんけ!

GehirnDNS | ゲヒルンサービスサイト

指定したIPからの接続しか受け付けない(古いタイプの)システムと連携したい場合にHerokuだと困る。

ProximoというAddonは固定IP付きのproxyを提供してくれる。rest-clientとかで接続するときにproximoの提供するproxyを設定してリクエストすればOK

require "rest-client"

RestClient.proxy = ENV["PROXIMO_URL"]
res = RestClient.get("http://api.someservice.com/endpoint")

puts "status code", res.code
puts "headers", res.headers

これで固定IP + https + 証明書が必須なシステムとかとも連携できる。httpsの通信をhttp proxy経由で可能かな?とちょっと心配だったけどproxyは中身知らんぷりでそのまま転送するので大丈夫。

proximoはリクエスト数がPlan毎に決まってるので必要なリクエストでだけproxy経由して節約する。

mysqlとかよりroleとか色々うるさいので面倒ですよね。

$ curl `heroku pgbackups:url a001` > foo.dump
$ PGPASSWORD=XXXXX pg_restore --verbose --clean --no-acl --no-owner -U foo -d foo_development foo.dump

herokuのbamboo stackからcedar stackへのアップグレードは無理なので新規に作ってDBを移行後ドメインを切り替えた。

tapsを使ったdb:pull/db:pushはruby1.9.2とruby.19.3の間のmarshal互換性の断絶で無理なので(このbamboo stackはruby1.9.2で動いてる)pgbackups(pg_dump)を使う。

pgbackupsを使ってpg_dumpを取得したあと、postgres.heroku.comの下記の右側にある矢印アイコンのメニューの中のpg_restoreを選ぶとrestoreコマンドが親切に出るのでそれでさっきのdumpを読み込んで完了。

Lokkaももうちょっとドラスティックに変えていこうかなと思っています。仕事外の時間でちまちまと進めます。

herokuでsmtpを使うためにsendgrid addonを入れる。(smtpにgmailを使う場合は要らない)

$ heroku addons:add sendgrid:starter
# config/environment.rb:

(snip)

ActionMailer::Base.smtp_settings = {
  :address        => 'smtp.sendgrid.net',
  :port           => '587',                                                                                            
  :authentication => :plain,
  :user_name      => ENV['SENDGRID_USERNAME'],                                                                         
  :password       => ENV['SENDGRID_PASSWORD'],                                                                         
  :domain         => 'heroku.com',
  :enable_starttls_auto => true
}
# config/initializers/exception_notification.rb:
AppName::Application.config.middleware.use ExceptionNotification::Rack,
  :email => {
    :email_prefix => "[AppName] ",
    :sender_address => %{"notifier" <notifier@example.com>},
    :exception_recipients => %w{komagata@example.com}
  }
# Gemfile:
gem 'exception_notification'
# config/environments/production.rb:

(snip)

  # config.action_mailer.raise_delivery_errors = false
  config.action_mailer.raise_delivery_errors = true

(snip)

  config.action_mailer.perform_deliveries = true
end
$ heroku labs:enable user-env-compile

これすると行ける。理由はわからん・・・。

Herokuでwww.foo.comとかじゃなくfoo.comのようなrootドメインを使うのは面倒です。 (root, naked, bare, zone apex domainなど色んな呼び方があるのもググり辛くて面倒な要因)

以前は「このIPをAレコードに設定してね」と公式ドキュメントにも書いてあったのですが現在は「SimpleDNSなどの仮想Aレコード的なものが使えるサービスを使え、もしくは逆に考えるんだ。rootドメインなんて使わなくってもいいさ・・・と。」と書いてあります。

そんなジョースター卿のような逆転の発送はなかなかできませんし、SimpleDNSは$3/moだったりしてちょっと高い。

ところが12レコードまで無料でHeroku向け設定をポチッとやってくれるDozensというサービスを発見。

DNSを自由に簡単に。Dozens(ダズンズ)

ワーオ!Add Heroku Records?なんていうチェックボックスがあるぞ!

こいつはくせえ、名サービス以上の匂いがプンプンするぜ!

お名前.comのDNSなんて使ってる場合じゃねえ!

rake db:resetがherokuではできないので下記。

$ heroku pg:reset DATABASE_URL --confirm my-app

ceder stackバージョン。

ほぼ下記のまんまです。

Creating Static Sites in Ruby with Rack | Heroku Dev Center

$ mkdir -p public/{images,js,css}
$ touch site/{config.ru,public/index.html}
# Gemfile:
source :rubygems
gem 'rack'
# config.ru:
use Rack::Static,
  urls: ['/images', '/js', '/css'],
  root: 'public'

run lambda { |env|
  [
    200,
    {
      'Content-Type'  => 'text/html',
      'Cache-Control' => 'public, max-age=86400'
    },
    File.open('public/index.html', File::RDONLY)
  ]
}

komagata.orgはまんまコレなのでソースへのリンクも置いておきます。heroku便利ですね。

komagata/komagata-org · GitHub