mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 20:41:24 +08:00
FEATURE: Support backup uploads/downloads directly to/from S3.
This commit is contained in:

committed by
Guo Xiang Tan

parent
5039a6c3f1
commit
c29a4dddc1
65
lib/backup_restore/local_backup_store.rb
Normal file
65
lib/backup_restore/local_backup_store.rb
Normal file
@ -0,0 +1,65 @@
|
||||
require_dependency "backup_restore/backup_store"
|
||||
require_dependency "disk_space"
|
||||
|
||||
module BackupRestore
|
||||
class LocalBackupStore < BackupStore
|
||||
def self.base_directory(current_db = nil)
|
||||
current_db ||= RailsMultisite::ConnectionManagement.current_db
|
||||
base_directory = File.join(Rails.root, "public", "backups", current_db)
|
||||
FileUtils.mkdir_p(base_directory) unless Dir.exists?(base_directory)
|
||||
base_directory
|
||||
end
|
||||
|
||||
def self.chunk_path(identifier, filename, chunk_number)
|
||||
File.join(LocalBackupStore.base_directory, "tmp", identifier, "#{filename}.part#{chunk_number}")
|
||||
end
|
||||
|
||||
def initialize(opts = {})
|
||||
@base_directory = opts[:base_directory] || LocalBackupStore.base_directory
|
||||
end
|
||||
|
||||
def remote?
|
||||
false
|
||||
end
|
||||
|
||||
def file(filename, include_download_source: false)
|
||||
path = path_from_filename(filename)
|
||||
create_file_from_path(path, include_download_source) if File.exists?(path)
|
||||
end
|
||||
|
||||
def delete_file(filename)
|
||||
path = path_from_filename(filename)
|
||||
|
||||
if File.exists?(path)
|
||||
FileUtils.remove_file(path, force: true)
|
||||
DiskSpace.reset_cached_stats
|
||||
end
|
||||
end
|
||||
|
||||
def download_file(filename, destination, failure_message = "")
|
||||
path = path_from_filename(filename)
|
||||
Discourse::Utils.execute_command('cp', path, destination, failure_message: failure_message)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def unsorted_files
|
||||
files = Dir.glob(File.join(@base_directory, "*.{gz,tgz}"))
|
||||
files.map! { |filename| create_file_from_path(filename) }
|
||||
files
|
||||
end
|
||||
|
||||
def path_from_filename(filename)
|
||||
File.join(@base_directory, filename)
|
||||
end
|
||||
|
||||
def create_file_from_path(path, include_download_source = false)
|
||||
BackupFile.new(
|
||||
filename: File.basename(path),
|
||||
size: File.size(path),
|
||||
last_modified: File.mtime(path).utc,
|
||||
source: include_download_source ? path : nil
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user