Update
This commit is contained in:
parent
a78825fa1a
commit
fdc57f0daa
109
backup.rb
Normal file
109
backup.rb
Normal file
@ -0,0 +1,109 @@
|
||||
#!/usr/bin/env ruby
|
||||
require 'logger'
|
||||
require 'rake'
|
||||
require 'fileutils'
|
||||
|
||||
# apt install ruby genisoimage
|
||||
# mkdir -p /opt/backup/isoupload && touch /opt/backup/backup.log
|
||||
|
||||
# Store all backup files
|
||||
$backup_dir = '/opt/backup/isoupload'
|
||||
|
||||
# Delete all backup files older than $keep_days
|
||||
$keep_days = 14
|
||||
|
||||
# Generate missing backup files newer than $check_days
|
||||
$check_days = 7
|
||||
|
||||
# Path to pack
|
||||
$pack_path = '/var/www/%<year>d/%<month>02d/%<day>02d'
|
||||
|
||||
# Path in ISO
|
||||
$path_in_iso = '/%<year>d/%<month>02d/%<day>02d'
|
||||
|
||||
# ISO file name
|
||||
$iso_name = '%<year>d/%<month>02d/%<year>d-%<month>02d-%<day>02d.iso'
|
||||
|
||||
# ISO volume name (CD label)
|
||||
$iso_volume = '%<year>d-%<month>02d-%<day>02d'
|
||||
|
||||
$s3_subdir = ''
|
||||
|
||||
$log_file = '/opt/backup/backup.log'
|
||||
# $log_file = STDOUT
|
||||
|
||||
# Generate backup file for given date
|
||||
def generate(date)
|
||||
date_info = {
|
||||
year: date.year,
|
||||
month: date.month,
|
||||
day: date.day,
|
||||
hour: date.hour,
|
||||
min: date.min
|
||||
}
|
||||
|
||||
pack_path = $pack_path % date_info
|
||||
path_in_iso = $path_in_iso % date_info
|
||||
iso_name = $iso_name % date_info
|
||||
iso_volume = $iso_volume % date_info
|
||||
|
||||
if !File.exist?(pack_path)
|
||||
$logger.warn "#{pack_path} is missing, skipping."
|
||||
return
|
||||
end
|
||||
|
||||
Dir.chdir($backup_dir) do
|
||||
if File.exist?(iso_name)
|
||||
$logger.info "#{iso_name} exists, skipping."
|
||||
return
|
||||
end
|
||||
|
||||
FileUtils.mkdir_p(File.dirname(iso_name))
|
||||
Rake.sh 'ionice', 'genisoimage', '-U', '-J', '-quiet',
|
||||
'-dir-mode', '555', '-file-mode', '444',
|
||||
'-uid', '0', '-gid', '0',
|
||||
'-o', iso_name,
|
||||
'-V', iso_volume,
|
||||
'-graft-points', "#{path_in_iso}=#{pack_path}"
|
||||
|
||||
if File.exist?(iso_name)
|
||||
$logger.info "#{iso_name} generated."
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def upload
|
||||
# Pre-configure /root/.rclone.conf file
|
||||
Rake.sh 'ionice', 'rclone', 'copy', $backup_dir, "scaleway:#{$s3_subdir}", '--transfers', '1'
|
||||
end
|
||||
|
||||
def purge
|
||||
purge_time = Time.now - 86400 * $keep_days
|
||||
Dir.chdir($backup_dir) do
|
||||
# Strict to only *.iso and *.xz
|
||||
Dir.glob('**/{*.iso,*.xz}') do |file|
|
||||
mtime = File.mtime(file)
|
||||
mtime_string = mtime.strftime('%Y-%m-%d %H:%M:%S')
|
||||
if mtime < purge_time
|
||||
$logger.info "Deleting #{file} (#{mtime_string})"
|
||||
# File.unlink(file)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
raise "check_days must be smaller than keep_days" unless $check_days < $keep_days
|
||||
raise "check_days must be greater than 0" unless $check_days > 0
|
||||
|
||||
$logger = Logger.new($log_file)
|
||||
|
||||
$logger.info "Keep #{$keep_days} days, check #{$check_days} days"
|
||||
|
||||
# Loop through days
|
||||
now = Time.now
|
||||
$check_days.downto(1) do |day|
|
||||
generate(now - 86400 * day)
|
||||
end
|
||||
|
||||
upload
|
||||
purge
|
50
backup.sh
Normal file
50
backup.sh
Normal file
@ -0,0 +1,50 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Make a new folder at /opt/backup: mkdir -p /opt/backup && touch /opt/backup/backup.log && cd /opt/backup
|
||||
# Save this file at /opt/backup/backup.sh
|
||||
# Set a cronjob: 0 3 * * * /bin/bash /opt/backup/backup.sh > /opt/backup/backup.log 2>&1
|
||||
|
||||
# Get the relative path of the backup script
|
||||
backup_script=$(dirname "$realpath $0")
|
||||
|
||||
# Loading the Config
|
||||
rclone_config_name=""
|
||||
rclone_config_pass=""
|
||||
s3_bucket_name=""
|
||||
backup_folder_name="$(date +"%Y_%m_%d_%I_%M_%p")"
|
||||
|
||||
# Website and Database
|
||||
website_folder=""
|
||||
website_folder_exclude=""
|
||||
database_name=""
|
||||
|
||||
# Remove old db dump
|
||||
cd /opt/backup
|
||||
rm /opt/backup/dbbackup-*
|
||||
rm /opt/backup/website-*
|
||||
|
||||
# Generating a database dump backup
|
||||
# if $database_name exists, then dump the database, else skip
|
||||
if [ -n "$database_name" ]; then
|
||||
mysqldump -u root $database_name > dbbackup-$backup_folder_name.sql
|
||||
tar -zcvf dbbackup-$backup_folder_name.tar.gz dbbackup-$backup_folder_name.sql
|
||||
fi
|
||||
|
||||
# if $website_folder_exclude exists, then tar the website folder excluding the $website_folder_exclude
|
||||
if [ -n "$website_folder_exclude" ]; then
|
||||
tar --exclude $website_folder_exclude -zcvf website-$backup_folder_name.tar.gz $website_folder
|
||||
else
|
||||
tar -zcvf website-$backup_folder_name.tar.gz $website_folder
|
||||
fi
|
||||
|
||||
# if $rclone_config_pass exists, then set the rclone config password, else skip
|
||||
if [ -n "$rclone_config_pass" ]; then
|
||||
export RCLONE_CONFIG_PASS=$rclone_config_pass
|
||||
fi
|
||||
|
||||
# Copy the database and website backup
|
||||
if [ -n "$database_name" ]; then
|
||||
rclone copy /opt/backup/dbbackup-$backup_folder_name.tar.gz $rclone_config_name:$s3_bucket_name/$backup_folder_name
|
||||
fi
|
||||
|
||||
rclone copy /opt/backup/website-$backup_folder_name.tar.gz $rclone_config_name:$s3_bucket_name/$backup_folder_name
|
Loading…
Reference in New Issue
Block a user