如何自动将Heroku pgbackups发送到S3

时间:2011-05-07 16:17:41

标签: ruby-on-rails heroku

我们使用Heroku的PG备份,这非常棒http://addons.heroku.com/pgbackups

我目前每天手动将备份下载到我的计算机上,然后将其上传到我的S3帐户。有没有人知道如何设置一个cron作业来自动创建备份(每天都很好)并将其直接发送到我的S3帐户?

3 个答案:

答案 0 :(得分:4)

我修补了宝石来修复B Seven提到的系统调用。抓住数据库参数的正则表达式正在破裂,因为非共享数据库的新DATABASE_URL现在包含端口号。

https://github.com/mokolabs/heroku_s3_backup

如果你在Cedar堆栈上,那么这个补丁应该适合你。但是我在Bamboo上,因为与pg_dump的版本冲突,它对我不起作用。 Postgres是Bamboo上的8.x版本,因此pg_dump无法从新的非共享数据库转储数据,因为它们都在Postgres版本9.1上运行。

如果我能找到Bamboo堆栈的解决方法,我会在这里更新gem和我的评论。

答案 1 :(得分:3)

如果你将它添加到lib / tasks并且运行herkou的cron插件将运行:

namespace :heroku do
  desc "PostgreSQL database backups from Heroku to Amazon S3"
  task :backup => :environment do
    begin
      require 'right_aws'
      puts "[#{Time.now}] heroku:backup started"
      name = "#{ENV['APP_NAME']}-#{Time.now.strftime('%Y-%m-%d-%H%M%S')}.dump"
      db = ENV['DATABASE_URL'].match(/postgres:\/\/([^:]+):([^@]+)@([^\/]+)\/(.+)/)
      system "PGPASSWORD=#{db[2]} pg_dump -Fc -i --username=#{db[1]} --host=#{db[3]} #{db[4]} > tmp/#{name}"
      s3 = RightAws::S3.new(ENV['s3_access_key_id'], ENV['s3_secret_access_key'])
      bucket = s3.bucket("#{ENV['APP_NAME']}-heroku-backups", true, 'private')
      bucket.put(name, open("tmp/#{name}"))
      system "rm tmp/#{name}"
      puts "[#{Time.now}] heroku:backup complete"
    # rescue Exception => e
    #   require 'toadhopper'
    #   Toadhopper(ENV['hoptoad_key']).post!(e)
    end
  end
end

task :cron => :environment do
  Rake::Task['heroku:backup'].invoke

答案 2 :(得分:0)

恕我直言,最简单快速(10分钟)的方式是配置heroku-db-backup-s3 buildpack。没有代码需要,只需添加buildpack并设置一些环境变量和一个重新安排。