デメリット/向いてない用途
記事:
perl -p -i -e "s#url = git\@heroku.com:#url = https://git.heroku.com/#g" .git/config # remoteへ接続できるか検証 git ls-remote <remote repo name>
ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }
HEROKU_APP=your-app heroku domains -a $HEROKU_APP # *.herokudns.com ならACMが使われている # 対象ドメインが herokudns.com へのCNAMEに変われば、ssl addonは不用。 dig www.example.com # ssl addonの削除。ownerのみ有効。コラボレータでは失敗 heroku addons:destroy ssl --app YOUR-APP
一部の項目のEmail通知はあるので、SlackのEmailインテグレーションを使えば通知はできる。
外部Addonを使う方法が一般的だろうが、metricsをAPIで取得する方法が不明
gem install pg ... Can't find the 'libpq-fe.h header
sudo yum install postgresql-devel
herokuはAWSベースでデフォルトでは固定IPが無いため、herokuからホストにアクセスするケースで、ホスト側でIP制限をするのが困難。
そのため有料Addonがある
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", ... }
HEROKU_TOKEN=$(heroku auth:token) HEROKU_APP=app-id curl -X GET https://api.heroku.com/apps/$HEROKU_APP/addons \ -H "Accept: application/vnd.heroku+json; version=3" \ -H "Authorization: Bearer $HEROKU_TOKEN"
heroku rename <new name> --app <old name>
git remote rm heroku git remote add heroku git@heroku.com:<new name>.git
heroku drains:add https://user:pass@logger.example.com/heroku-log-drains/myapp -a myapp
# 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
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
heroku pg:info -r staging -app [YOUR APP ID]
httpとは違うendpointが割り当てられる。
heroku addons:add ssl:endpoint --app YOUR-APP
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
www.example.com CNAME YOUR-APP.herokussl.com
heroku certs:update 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 === YOUR-APP Domain Names YOUR-APP.herokuapp.com www.example.com
www.example.com CNAME YOUR-APP.herokuapp.com.
セキュリティアップデート等でバージョンを上げる場合。
heroku側で新しいバージョンとアップグレード方法が記載されたメールが来る
vim Gemfile ---- rails '3.2.11' ---- bundle update rails git push heroku master
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
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
# 対象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
# 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 | テーブル | **************
# すべてのアドオン一覧 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
heroku addons:add sendgrid:starter
デフォルトDBはPostgreSQLなのでそれに接続するアドオン
# デフォルト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
heroku pg:promote HEROKU_POSTGRESQL_[COLOR]_URL
DATABASE_URL=$(heroku config:get DATABASE_URL -a your-app) your_process
# 追加 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
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 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'
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
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
PG Backups でpg_dump, pg_restoreを使うためには、PostgreSQLをherokuと同じバージョンにする必要がある。
2012-10-04 (木) 11:57:19現在heroku側:9.1.6、yum:"8.4.13"ではpg_dumpの再にバージョン違いで怒られる
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
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
heroku pgbackups:restore DATABASE 'http://s3.amazonaws.com/.....mydb.dump?authparameters'
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
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
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
heroku db:push DATABASE_URL Taps Server Error: PGError: ERROR: time zone displacement out of range: "2012-10-03 12:00:00.000000+5894889600"
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 install ruby-1.9.2-p290 rvm use ruby-1.9.2-p290 --default
heroku config ! App not found # 以下なら正しい heroku config --app [アプリケーション名]
git remote add heroku git@heroku.com:[アプリケーション名].git # または vi .git/config ---- [remote "heroku"] url = git@heroku.com:[アプリケーション名].git fetch = +refs/heads/*:refs/remotes/heroku/* ----
# 新しいアプリを取得 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
# 新旧アプリに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
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
# 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