概要
heroku上のrailsアプリを別アカウントに引っ越しする(dbはpostgresql)
前提
heroku cliをインストールしておく。
https://devcenter.heroku.com/ja/articles/heroku-cli
記事作成時点
heroku --version
heroku/7.47.6 darwin-x64 node-v12.16.2
アプリの移行
# 現行アカウントにログイン
heroku login
# ソースをダウンロード
heroku git:clone -a 現行アプリ名
cd 現行アプリ名
# git remoteを削除
git remote rm heroku
# git remoteを確認
git remote -v
# 設定している環境変数があれば控えておく(basic認証用パスワード等)
heroku config -a アプリ名
# ログアウト
heroku logout
# 必要に応じてruby,railsのバージョン変更、ソース修正等実施
# 新アカウントにログイン
heroku login
# 新アカウントにアプリを作成
heroku create 移行用アプリ名
# git remoteを確認(create時に自動設定されるはず)
git remote -v
# アプリのデプロイ
git push heroku master
# 環境変数を設定(必要に応じて)
heroku config:set BASIC_AUTH_PASSWORD="password" -a 移行用アプリ名
heroku config:set BASIC_AUTH_USERNAME="user" -a 移行用アプリ名
# 環境変数確認
heroku config
# アドオン追加(必要に応じて)
heroku addons:create heroku-postgresql:hobby-basic
heroku addons:create papertrail:choklad
# addon で登録されているのを確認
heroku addons
# ログアウト
heroku logout
dynoのアップグレード(必要に応じて)
webブラウザでherokuのアプリ設定画面を開く
Resources->Change dyno types->Hobbyなど
移行開始連絡
これ以降アプリ触っても責任取れない旨を通知(必要に応じて)
DBの移行
# 現行アカウントにログイン
heroku login
# メンテナンスモードにする
heroku maintenance:on -a 現行アプリ名
# ワーカーを停止しておく(あれば)
heroku ps:scale worker=0 -a 現行アプリ名
# 現行データ件数確認等(必要に応じて)
heroku run rails c -a 現行アプリ名
MyModel.count
# マニュアルバックアップする
heroku pg:backups capture -a 現行アプリ名
# バックアップ結果を確認する
heroku pg:backups -a 現行アプリ名
# バックアップのdumpファイルをローカルに取得する
heroku pg:backups:download -a 現行アプリ名
# 現行アカウントからログアウト
heroku logout
# dumpをアップロード(例はs3)
# 好きな方法でs3にアップロード
# ファイルを公開(パブリックアクセス)に変更
# ファイルのURLを取得
# 新アカウントにログイン
heroku login
# リストア実施
heroku pg:backups restore 'https://kwgch-upload.s3-ap-northeast-1.amazonaws.com/db_migration/latest.dump' DATABASE_URL
# 移行件数確認
heroku run rails c
MyModel.count
# workerの起動(あれば)
heroku ps:scale worker=1
動作確認
よしなに
問題が発生した場合
現行アプリを再開する
# メンテナンスモードoffにする
heroku maintenance:off -a 現行アプリ
# ワーカーを起動しておく(あれば)
heroku ps:scale worker=1 -a 現行アプリ
問題が発生しなかった場合
アプリ名変更
※アプリ名を変更することで、URLも変更される
現行アカウント
現行アプリ名 → バックアップ用アプリ名
新アカウント
移行用アプリ名 → 現行アプリ名
移行終了連絡
(必要に応じて)
そのほか
本番移行前に、手順書の作成と、リハーサルの実施をおすすめします。
本番は1人でさわるより、ペアオペが望ましいです。