Railsアプリのソースを公開するときパスワードをどうする? 質問と回答(Q&A)  

こんにちは ゲスト さん | ログイン | ヘルプ | okyuu.com Feed Feed

総合トップ / 質問 / プログラミング 質問 / 開発言語 質問 / Ruby 質問 / Railsアプリのソースを公開するときパスワードをどうする?

現在個人的に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! が呼ばれる
コピペする ブログに貼る
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
bootしていなければ config/preinitializer.rb をloadしたいのですが無いので vendor/railsがなければgemでインストールされているrailsをboot
コピペする ブログに貼る
class Boot
  def run
    load_initializer
    Rails::Initializer.run(:set_load_path)
  end
end
こんな感じで呼ばれる
コピペする ブログに貼る
/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
Configuretionあたりを読めばわかりそう
コピペする ブログに貼る
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
コピペする ブログに貼る
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
に書き換える そうすると ~/.pit/default.yaml
コピペする ブログに貼る
---
database:
  password: [password]
を読みに行くようになりました.  こんなのどうでしょうかhatena

質問の回答ではないのですがすみません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読み込まれるフェーズ自体がかなり初期の段階なので もし,プラグインが読み込まれる前だったらハックしかないかなぁとおもいますねlose-heart
cat ~/secret.database.yml >> #{current_path}/config/database.yml
おぉ そうきましたかattention

あなたの問題は解決しましたか?

okyuu.comはITエンジニアのための質問サイトです。あなたの質問に答えてくれるエンジニアがいるかもしれません。なんと回答率は89

はじめての方へ

バッヂ取得者一覧
smile2525

カテゴリ

特集

okyuu.comポイント獲得を競って、話題の賞品をゲットしよう! okyuu.comポイント獲得を競って、話題の賞品をゲットしよう!
新しい評価指標「okyuu.comポイント」を多く獲得して、話題の賞品を手に入れよう!
ソフトウェアを公開するのが楽しい 岡野真也さん ソフトウェアを公開するのが楽しい 岡野真也さん
ソフトウェアを公開するのが面白くてたまらない。作っては公開というのが彼のやり方だが、若きエンジニアにとってはそれくらいがちょうどいいのかもしれない。
コンピュータは世界を広げる実験道具 西尾泰和さん コンピュータは世界を広げる実験道具 西尾泰和さん
プログラミング、サイエンス、デザイン マルチな彼にとって、コンピュータは未知の世界を広げるための道具であることに変わりはない。今後の展開が楽しみだ。
理想のOS開発に人生を賭ける 川合秀実さん 理想のOS開発に人生を賭ける 川合秀実さん
OSASK計画代表の川合さんは、人生の1秒を惜しみながら独自OSの開発にいそしむ。
「楽しむ」それが豊かなエンジニアになるコツ 坂井恵さん 「楽しむ」それが豊かなエンジニアになるコツ 坂井恵さん
日本MySQLユーザ会の副代表を務める坂井恵さん。技術の現場で会社運営に興味を持ち、独立起業の道を選んだエンジニアだ。
夢はエンジニアに強い影響を与える本を書くこと 松信嘉範さん 夢はエンジニアに強い影響を与える本を書くこと 松信嘉範さん
ソニーの情報シスから日本を代表するMySQLのコンサルタントに。彼が魅せられたオープンソースの世界とは?
お友達紹介機能をつかってポイントGET! お友達紹介機能をつかってポイントGET!
お友達を招待してみんなでokyuuポイントをGETしよう!
オープンソースの活動「すごく、いい」 前坂徹さん オープンソースの活動「すごく、いい」 前坂徹さん
オープンソースプロジェクトで活躍する若き新鋭。コミュニティ活動の感想を尋ねると「すごく、いい」と満面の笑み。
コンピュータは創造力を刺激する 奥一穂さん コンピュータは創造力を刺激する 奥一穂さん
天才エンジニアとしての国際的な評価も高い奥一穂さん。世間からのスマートだとの評価には「自分は広く浅くだから」とさらり。
25歳からプログラミング「泣きながら覚えた」 庄司嘉織さん 25歳からプログラミング「泣きながら覚えた」 庄司嘉織さん
25歳でプログラマーに転向した。いまやjava-jaを立ち上げるなど精力的なエンジニアだ。
Rails勉強会@東京は“キャスト”の気持ちで 諸橋恭介さん Rails勉強会@東京は“キャスト”の気持ちで 諸橋恭介さん
大学時代、偶然手にしたMacが諸橋さんにITエンジニアの道を開いた。
"シャイモード"機能を活用しよう! "シャイモード"機能を活用しよう!
こんな質問してもいいのかな?そんなときは"シャイモード"で投稿!
RX-7とサーバ運用の意外な共通点 並河祐貴さん RX-7とサーバ運用の意外な共通点 並河祐貴さん
Amazon EC2を巧みに使いこなすTIS/SonicGardenの並河さん。「腕一本で食べていきたい」とITエンジニアを目指した。
「ブラックボックスは不安でしょ」 ひろせまさあきさん 「ブラックボックスは不安でしょ」 ひろせまさあきさん
エンジニアが楽しくて仕方がない。オープンソースを組み合わせてシステムを作り上げるのが彼の矜持のようだ。
Perlの地位向上を胸に 牧大輔さん Perlの地位向上を胸に 牧大輔さん
endeworksの牧大輔さんは社団法人JPAを立ち上げ、Perlの企業利用を促進したいという。
偶然からCTOへ ライブドアCTO池邉智洋さん 偶然からCTOへ ライブドアCTO池邉智洋さん
池邉智洋さんはライブドアCTOの技術メンバーを先頭で率いる。「まずはやって見せることも大事」と語る。