2

Rails 4 アプリで PostGIS を使用できるように、運用データベースに月額 50 ドルを支払うことを検討しています。私の問題は、「ステージング」環境で開発を続けたいのですが、2 つの運用データベースに支払うことをまだ正当化できないことです。ステージングは​​明らかにプロダクションのクローンにすぎないため、両方のアプリを同じ DB URL ( post ) にポイントするだけで、大きな頭痛の種になる可能性があります。

データベースを分割する方法、または推奨する別の戦略はありますか?

heroku サポートからの最初の回答はノーですが、無駄な回避策があることを願っています。

ありがとう!

4

3 に答える 3

2

まず、月額 50 ドルの追加料金を支払うことを強くお勧めします。そのために、フォークパイプラインなどのあらゆる種類のクールなものと、これが一種のハッキーであるという事実を取得します。ステージング データベースをクリアしたときに、これが本番データを消去することになるかどうかは正直わかりません。これを試す前にバックアップを作成してください。

この回答は、ビジネス上の決定ではなく、技術的な課題に対する回答と見なします。難しい話は抜きにして、

Heroku Postgres スキーマを使用して同じデータベースに複数の環境を設定する

最初に、既存の開発データベースを削除し、実稼働データベースを実稼働アプリに追加しました。

heroku addons:add heroku-postgresql:crane

> Adding heroku-postgresql:crane on test-shared-app... done, v# ($50/mo)
> Attached as HEROKU_POSTGRESQL_RED_URL

これにより、色の下にデータベースがアタッチされたので、アプリに適した色にRED置き換えます。HEROKU_POSTGRESQL_RED_URL

これにより、データベースが本番アプリにアタッチされますが、ステージングのために同じアプリに接続する必要があります。まず、ステージング スキーマを作成します

heroku run "bundle exec rails runner 'ActiveRecord::Base.connection.execute(%q{CREATE SCHEMA staging})'"

次に、ステージング アプリを作成します。詳細については、アプリの複数の環境の管理を参照してください。

heroku create --remote staging test-shared-app-staging
heroku config:set RACK_ENV=staging RAILS_ENV=staging --remote staging

次に、既存のアプリから環境データをコピーします。URL の末尾に追加します。?schema_search_path=staging

heroku config --remote heroku --shell
# make note of your database URLs
heroku config:set --remote staging \
  DATABASE_URL=postgres://...?schema_search_path=staging \
  HEROKU_POSTGRESQL_RED_URL=postgres://...?schema_search_path=staging

そしてステージングにプッシュ

git push staging master

次に、ステージングで移行を実行します

heroku run --remote staging bundle exec rake db:migrate

そして試してみてください。

私の「アプリ」はhttp://test-shared-app.herokuapp.com/postshttp://test-shared-app-staging.herokuapp.com/postsで実行されています。ソースはhttps://github.com/benmanns/heroku-shared-appで確認できます。

于 2013-08-20T21:44:37.930 に答える
1

私があなただったら、適切なタイミング (お金を稼ぎ始めたり、ユーザーを増やしたりするなど) まで本番 DB を使用します。実稼働 DB のすべてのテーブルを複製し、新しいテーブルに "stag_{original_table_name} のような名前を付けて新しい名前を付けます。したがって、同じテーブルの 2 つの異なるセットを持つことになります。モデルでは、新しいテーブルを使用するようにします。ステージング環境:

class Foo < ActiveRecord::Base
  self.table_name = "staging_#{self.class.name}" if Rails.env.staging?

私はかなり安いです...そして、これは真のRailsマスターの目には醜い解決策かもしれません.

于 2013-08-20T19:39:49.710 に答える
1

Heroku Schemasは、これに対する別のアプローチです。これは基本的に単一のコマンドを実行して、Benjamin Manns の複数スキーマのソリューションを適用できる Heroku プラグインです。

于 2013-11-30T01:11:39.267 に答える