Backup de banco de dados é fácil, mas enviar arquivo de backup para o Google Drive é outra história. Você deve habilitar a API do Drive nas configurações da sua conta e também criar uma conta de serviço, e mesmo assim você não pode fazer upload de arquivos diretamente para sua unidade – você deve fazer upload para a conta de serviço e, em seguida, conceder permissões para sua conta. Talvez haja uma maneira mais fácil, mas ainda não a encontrei:
# lib/tasks/server_db.rake
namespace :server_db do
desc 'Backup DB and upload to Google Drive'
task :backup do
pg_dump = 'pg_dump --no-acl --no-owner -U myproject_deploy myproject_production'
timestamp = Time.now.strftime('%Y-%m-%d-%H%M%S')
archive_path = "#{Rails.root}/db/myproject_production_#{timestamp}.sql.bz2"
`cd /var/www/myproject/current && #{pg_dump} | bzip2 - - > #{archive_path}`
require 'google/apis/drive_v2'
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = "#{Rails.root}/config/google_api_credentials.json"
drive = Google::Apis::DriveV2::DriveService.new
drive.authorization = Google::Auth.get_application_default([Google::Apis::DriveV2::AUTH_DRIVE_FILE])
metadata = {title: File.basename(archive_path, '.sql.bz2')}
file = drive.insert_file(metadata, upload_source: archive_path, content_type: 'application/x-bzip2')
perm_id = drive.get_permission_id_for_email('myproject@gmail.com')
perm = Google::Apis::DriveV2::Permission.new(role: 'writer', id: perm_id.id, type: 'user')
drive.insert_permission(file.id, perm)
FileUtils.remove_file(archive_path)
end
end
# Gemfile
gem 'google-api-client', require: false
// config/google_api_credentials.json
{
"type": "service_account",
"project_id": "myproject",
"private_key_id": "20d9dae73987xxxxxxxxxxxx",
"private_key": "-----BEGIN PRIVATE KEY-----nMIIEvAIBADANBgxxxxxxxxxxx==n-----END PRIVATE KEY-----n",
"client_email": "myproject-xxxxxxxx@myproject.iam.gserviceaccount.com",
"client_id": "103720xxxxxxxxxxx",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/myproject-xxxxxx%40myproject.iam.gserviceaccount.com"
}
# config/schedule.rb (whenever)
every(1.day, at: '02:00') { rake 'server_db:backup' }
Também há outra ideia de onde armazenar os dumps do banco de dados – no git repo! Porque ele armazena apenas diffs, então o repo com o arquivo bare dump.sql crescerá não tão rápido, e você pode ver facilmente as diferenças diárias (se em seu arquivo dump.sql cada linha db estiver em sua própria linha), e você pode facilmente obter repositório git privado gratuito em gitlab.com. Mas esta é uma história diferente.