4

所以,这是我的 capistrano 文件

load 'deploy/assets'
require "bundler/capistrano" 
set :application, "XXXXXX"
set :repository,  "XXXXXX"

set :scm, :git # You can set :scm explicitly or Capistrano will make an intelligent guess based on known version control directory names
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none`
set :repository , "XXXXXX"

role :web, "XXXXXX"                          # Your HTTP server, Apache/etc
role :app, "XXXXXX"                          # This may be the same as your `Web` server
role :db,  "XXXXXX", :primary => true # This is where Rails migrations will run
#role :db,  "your slave db-server here"

set :user, 'root'
set :use_sudo, false
set :deploy_to, "/var/www/#{application}"
set :deploy_via, :remote_cache
set :normalize_asset_timestamps, false

# if you want to clean up old releases on each deploy uncomment this:
# after "deploy:restart", "deploy:cleanup"

# if you're still using the script/reaper helper you will need
# these http://github.com/rails/irs_process_scripts

# If you are using Passenger mod_rails uncomment this:
namespace :deploy do

  task :start do ; end
  task :stop do ; end
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "touch #{File.join(current_path,'tmp','restart.txt')}"
  end
end

现在当我运行时cap deploy出现错误

Access denied for user 'root'@'localhost' (using password: NO)

我假设那是因为我的 database.yml 文件是

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
    adapter: mysql2
    encoding: utf8
    database: XXXXX
    username: root
    password: 
    socket: /tmp/mysql.sock

现在因为我有一个公共 github 帐户。我不想传递我的密码并将其发布到 github。如果我不输入密码,我将无法部署该应用程序。

处理这个问题的好方法是什么?

谢谢

4

2 回答 2

5

您还需要确保您的 SSH 系统得到很好的保护,以防止人们以 Capistrano 机器人的身份登录。我建议限制对受密码保护的密钥对的访问。

加密服务器上的 .yml 文件是没有用的,因为您必须给机器人提供密钥,该密钥将被存储。. . 在同一台服务器上。在您的机器上加密它可能是一个好主意。Capistrano 可以在发送前对其进行解密。

或者

我解决这个问题的方法是将数据库密码放在一个文件中,该文件仅对我运行我的应用程序的用户具有读取权限。然后,在 database.yml 中,我使用 ERB 读取文件:

production:
  adapter: mysql
  database: my_db
  username: db_user
  password: <%= begin IO.read("/home/my_deploy_user/.db") rescue "" end %>
于 2013-03-13T06:31:32.953 回答
1

我会推荐以下内容:

  1. 移至config/database.ymlconfig/database.yml.sample的仓库
  2. 删除 中的所有敏感信息config/database.yml.sample,例如密码,并将
    “示例”配置文件提交到您的存储库。
  3. 添加config/database.yml到您的.gitignore文件中,因此无法将其提交到 repo
  4. 在您的服务器上,手动复制 config/database.yml.sample到Capistrano 为您创建的目录中config/database.ymlshared/这应该您运行cap deploy:setup创建顶级目录sharedreleases目录的命令后完成。这应该在设置应用程序时手动完成一次。
  5. shared/config/database.yml服务器上,填写实际的数据库详细信息,包括密码。chmod该文件因此不应该被那些不应该访问的人读取。
  6. 将以下内容添加到您的部署脚本中:

    namespace(:customs) do
       task :symlink_db, :roles => :app do
        run <<-CMD
          ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml
        CMD
      end
    end
    after "deploy:update_code", "customs:symlink_db"
    
于 2013-03-13T06:36:33.117 回答