File tree 5 files changed +82
-0
lines changed
5 files changed +82
-0
lines changed Original file line number Diff line number Diff line change @@ -25,6 +25,25 @@ def self.[](filename)
25
25
26
26
def remove
27
27
File . delete ( @path ) if File . exists? ( path )
28
+ after_remove_hook
29
+ end
30
+
31
+ def after_create_hook
32
+ upload_to_s3 if SiteSetting . enable_s3_backups?
33
+ end
34
+
35
+ def after_remove_hook
36
+ remove_from_s3 if SiteSetting . enable_s3_backups?
37
+ end
38
+
39
+ def upload_to_s3
40
+ return unless fog_directory
41
+ fog_directory . files . create ( key : @filename , public : false , body : File . read ( @path ) )
42
+ end
43
+
44
+ def remove_from_s3
45
+ return unless fog
46
+ fog . delete_object ( SiteSetting . s3_backup_bucket , @filename )
28
47
end
29
48
30
49
def self . base_directory
@@ -49,4 +68,23 @@ def self.remove_old
49
68
all_backups [ SiteSetting . maximum_backups ..-1 ] . each { |b | b . remove }
50
69
end
51
70
71
+ private
72
+
73
+ def fog
74
+ return @fog if @fog
75
+ return unless SiteSetting . s3_access_key_id . present? &&
76
+ SiteSetting . s3_secret_access_key . present? &&
77
+ SiteSetting . s3_backup_bucket . present?
78
+ require 'fog'
79
+ @fog = Fog ::Storage . new ( provider : 'AWS' ,
80
+ aws_access_key_id : SiteSetting . s3_access_key_id ,
81
+ aws_secret_access_key : SiteSetting . s3_secret_access_key )
82
+ end
83
+
84
+ def fog_directory
85
+ return @fog_directory if @fog_directory
86
+ return unless fog
87
+ @fog_directory ||= fog . directories . get ( SiteSetting . s3_backup_bucket )
88
+ end
89
+
52
90
end
Original file line number Diff line number Diff line change 714
714
allow_restore : " Allow restore, which can replace ALL site data! Leave false unless you plan to do restore a backup"
715
715
maximum_backups : " The maximum amount of backups to keep on disk. Older backups are automatically deleted"
716
716
backup_daily : " Automatically create a site backup once a day"
717
+ enable_s3_backups : " Upload backups to S3 when complete. Make sure you have filled in your s3 credentials."
718
+ s3_backup_bucket : " The remote bucket to hold backups. WARNING: Make sure it is a private bucket."
717
719
718
720
active_user_rate_limit_secs : " How frequently we update the 'last_seen_at' field, in seconds"
719
721
previous_visit_timeout_hours : " How long a visit lasts before we consider it the 'previous' visit, in hours"
Original file line number Diff line number Diff line change @@ -419,6 +419,11 @@ backups:
419
419
backup_daily :
420
420
client : false
421
421
default : false
422
+ enable_s3_backups :
423
+ client : false
424
+ default : false
425
+ s3_backup_bucket :
426
+ client : false
422
427
423
428
uncategorized :
424
429
Original file line number Diff line number Diff line change @@ -38,6 +38,8 @@ def run
38
38
39
39
create_archive
40
40
41
+ after_create_hook
42
+
41
43
remove_old
42
44
43
45
notify_user
@@ -236,6 +238,12 @@ def create_archive
236
238
`gzip --best #{ tar_filename } `
237
239
end
238
240
241
+ def after_create_hook
242
+ log "Executing the after_create_hook for the backup"
243
+ backup = Backup . create_from_filename ( "#{ File . basename ( @archive_basename ) } .tar.gz" )
244
+ backup . after_create_hook
245
+ end
246
+
239
247
def notify_user
240
248
log "Notifying '#{ @user . username } ' of the success of the backup..."
241
249
# NOTE: will only notify if @user != Discourse.site_contact_user
Original file line number Diff line number Diff line change 27
27
Backup . remove_old
28
28
end
29
29
end
30
+
31
+ context ".after_create_hook" do
32
+ it "calls upload_to_s3 if the SiteSetting is true" do
33
+ SiteSetting . stubs ( :enable_s3_backups? ) . returns ( true )
34
+ b1 . expects ( :upload_to_s3 ) . once
35
+ b1 . after_create_hook
36
+ end
37
+
38
+ it "calls upload_to_s3 if the SiteSetting is false" do
39
+ SiteSetting . stubs ( :enable_s3_backups? ) . returns ( false )
40
+ b1 . expects ( :upload_to_s3 ) . never
41
+ b1 . after_create_hook
42
+ end
43
+ end
44
+
45
+ context ".after_remove_hook" do
46
+ it "calls remove_from_s3 if the SiteSetting is true" do
47
+ SiteSetting . stubs ( :enable_s3_backups? ) . returns ( true )
48
+ b1 . expects ( :remove_from_s3 ) . once
49
+ b1 . after_remove_hook
50
+ end
51
+
52
+ it "calls remove_from_s3 if the SiteSetting is false" do
53
+ SiteSetting . stubs ( :enable_s3_backups? ) . returns ( false )
54
+ b1 . expects ( :remove_from_s3 ) . never
55
+ b1 . after_remove_hook
56
+ end
57
+ end
58
+
30
59
end
31
60
You can’t perform that action at this time.
0 commit comments