-
- maimuzo
- 1266ポイント
- 投稿時間:2008/10/02 22:30
現在個人的にRailsアプリケーションを開発中で、完成後にはオープンソースとして公開予定です。 現在、将来的な公開に向けて各種ユーザ名やパスワードをなどを、ソースから分離しようと思って作業中です。 具体的には、subversionやgitなどのバージョン管理システムを使っているものとし、最新版のソース一式を使って実際にサービスも稼働するし、同時にそのソースも公開するような状況を想定しています。 このことから、パスワードなどはバージョン管理システム外に保存され、実行時またはデプロイ時に取り込まれる必要があります。 デプロイはcapistranoを使う予定です。 Rubyのスクリプトファイルの中に文字列としてパスワードなどが埋め込まれている場合は、pitというgemを使うと、うまく処理できそうな事が解りました。 http://ruby-sapporo.org/events/workshop/9/ ただ、config/database.ymlのproductionのパスワードのように、ymlファイルの中に文字列が入っている場合、pitはうまく動いてくれません。 解決方法として 1. cap deployの後にpitなどからymlファイルを動的に生成するレシピをサーバサイドで実行する (database.ymlのproduction部は消しておき、サーバサイドで生成したproduction部のymlを追記する) 2. サーバ内にあらかじめ実行環境用のdatabase.ymlなどを用意しておき、cap deployの後にこられを上書きするレシピを実行する を考えました。 が、いまいちかなーと思いまして、どうするのが一番スマートか、みなさまのアイデアを頂きたく思っております。
- 回答数 (4)
- クリップ数 (0)
- アクセス数 (2861)
- 回答
質問の回答ではないのですがすみませんpitってこれですかね 初めて知りました。
config/database.ymlを読み込む部分を password部分をpitから読むようにハックすればいいのではないかと思い 少し調べてみました pitをはじめて使ったのでもしかしたら間違っているかもしれませんが.. ■database.ymlが読み込まれている箇所調査
.config/boot.rb Rails.boot! が呼ばれるbootしていなければ config/preinitializer.rb をloadしたいのですが無いので vendor/railsがなければgemでインストールされているrailsをbootコピペする ブログに貼るmodule Rails class << self def boot! unless booted? preinitialize pick_boot.run end end def preinitialize load(preinitializer_path) if File.exist?(preinitializer_path) end def pick_boot (vendor_rails? ? VendorBoot : GemBoot).new end end endこんな感じで呼ばれるコピペする ブログに貼るclass Boot def run load_initializer Rails::Initializer.run(:set_load_path) end endConfiguretionあたりを読めばわかりそうコピペする ブログに貼る/usr/lib/ruby/gems/1.8/gems/rails-2.1.1/lib/initializer.rb class Initializer def self.run(command = :process, configuration = Configuration.new) yield configuration if block_given? initializer = new configuration initializer.send(command) initializer end end■解決案コピペする ブログに貼るclass Configuretion def database_configuration require 'erb' YAML::load(ERB.new(IO.read(database_configuration_file)).result) end def initialize_database if configuration.frameworks.include?(:active_record) ActiveRecord::Base.configurations = configuration.database_configuration ActiveRecord::Base.establish_connection end end end
Configuration::database_configuration を上書きしてPitを割り込ませればいけそう!? rake rails:freeze:gems していれば 以下のinitializerを読みに行くので vendor/rails/railties/lib/initializer.rbに書き換える そうすると ~/.pit/default.yamlコピペする ブログに貼るclass Configuretion def database_configuration require 'erb' database_yml = YA::load(ERB.new(IO.read(database_configuration_file)).result) require 'pit' config = Pit.get("database", :require => { "password" => "your db password" }) database_yml["development"]["password"] = config["password"] database_yml end endを読みに行くようになりました. こんなのどうでしょうかコピペする ブログに貼る--- database: password: [password]![]()
質問の回答ではないのですがすみませんpitってこれですかねですです。 他にも同じ機能を持ったgemがあったと思ったんですが、忘れちゃいました。 他にも便利なgemたくさんありそうですよね。config/database.ymlを読み込む部分を password部分をpitから読むようにハックすればいいのではないかと思い 少し調べてみましたおぉ、スゲーまじハックしてる^^ これプラグイン化しとけば、使い回しできそうですね。 でも、どの部分をPitで上書きするのかは、毎回カスタマイズが必要か・・・ いっそ、config/database.ymlを使わずに、全部Pit使って管理するようなプラグインにすればいいのかな? ■一応自分のコードも晒してみる
自分であげた2. サーバ内にあらかじめ実行環境用のdatabase.ymlなどを用意しておき、cap deployの後にこられを上書きするレシピを実行するのレシピを書いてみました。Capfileに追加しておいて、別途サーバの~/secret.database.ymlに隠しておきたい設定を書いています。 Pitと違って部分的に置き換えるわけじゃないので小回り効かないですが、動作負荷的にはやさしいのかな。(デーモンとなったときどこまで初期化されるのか把握してないですが)まだレシピの書き方わかってないので不自然・・・コピペする ブログに貼るnamespace :deploy do task :start, :roles => :app do run "cat ~/secret.database.yml >> #{current_path}/config/database.yml" end task :restart, :roles => :app do run "cat ~/secret.database.yml >> #{current_path}/config/database.yml" end end
config/database.ymlを使わずに、全部Pit使って管理するようなプラグインにすればいいのかなまだ未調査なんですが どうもDBのConfig読み込まれるフェーズ自体がかなり初期の段階なので もし,プラグインが読み込まれる前だったらハックしかないかなぁとおもいますね
cat ~/secret.database.yml >> #{current_path}/config/database.ymlおぉ そうきましたか![]()
2
回答
4
回答
3
回答
3
回答
2
回答
2
回答
7
回答
1
回答
2
回答


