Sign inSign up

alwynpan/db-backup

By alwynpan

•Updated almost 3 years ago

Image
0

141

alwynpan/db-backup repository overview

⁠github.com/tiredofit/docker-db-backup

GitHub release Build Status Docker Stars Docker Pulls Become a sponsor Paypal Donate


⁠About

This will build a container for backing up multiple types of DB Servers

Currently backs up CouchDB, InfluxDB, MySQL, Microsoft SQL, MongoDB, Postgres, Redis servers.

  • dump to local filesystem or backup to S3 Compatible services, and Azure.
  • select database user and password
  • backup all databases, single, or multiple databases
  • backup all to seperate files or one singular file
  • choose to have an MD5 or SHA1 sum after backup for verification
  • delete old backups after specific amount of time
  • choose compression type (none, gz, bz, xz, zstd)
  • connect to any container running on the same system
  • Script to perform restores
  • Zabbix Monitoring capabilities
  • select how often to run a dump
  • select when to start the first dump, whether time of day or relative to container start time
  • Execute script after backup for monitoring/alerting purposes

⁠Maintainer

⁠Table of Contents

NOTE: If you are using this with a docker-compose file along with a seperate SQL container, take care not to set the variables to backup immediately, more so have it delay execution for a minute, otherwise you will get a failed first backup.

⁠Prerequisites and Assumptions

  • You must have a working connection to one of the supported DB Servers and appropriate credentials

⁠Installation

⁠Build from Source

Clone this repository and build the image with docker build <arguments> (imagename) .

⁠Prebuilt Images

Builds of the image are available on Docker Hub⁠

Builds of the image are also available on the Github Container Registry⁠

docker pull ghcr.io/tiredofit/docker-db-backup:(imagetag)

The following image tags are available along with their tagged release based on what's written in the Changelog⁠:

Alpine BaseTag
latest:latest
docker pull docker.io/tiredofdit/db-backup:(imagetag)
⁠Multi Architecture

Images are built primarily for amd64 architecture, and may also include builds for arm/v7, arm64 and others. These variants are all unsupported. Consider sponsoring⁠ my work so that I can work with various hardware. To see if this image supports multiple architecures, type docker manifest (image):(tag)

⁠Configuration

⁠Quick Start
⁠Persistent Storage

The following directories are used for configuration and can be mapped for persistent storage.

DirectoryDescription
/backupBackups
/assets/scripts/preOptional Put custom scripts in this directory to execute before backup operations
/assets/scripts/postOptional Put custom scripts in this directory to execute after backup operations
⁠Environment Variables
⁠Base Images used

This image relies on an Alpine Linux⁠ base image that relies on an init system⁠ for added capabilities. Outgoing SMTP capabilities are handlded via msmtp. Individual container performance monitoring is performed by zabbix-agent⁠. Additional tools include: bash,curl,less,logrotate, nano.

Be sure to view the following repositories to understand all the customizable options:

ImageDescription
OS Base⁠Customized Image based on Alpine Linux
⁠Container Options
ParameterDescriptionDefault
BACKUP_LOCATIONBackup to FILESYSTEM, blobxfer or S3 compatible services like S3, Minio, WasabiFILESYSTEM
MODEAUTO mode to use internal scheduling routines or MANUAL to simply use this as manual backups only executed by your own meansAUTO
MANUAL_RUN_FOREVERTRUE or FALSE if you wish to try to make the container exit after the backupTRUE
TEMP_LOCATIONPerform Backups and Compression in this temporary directory/tmp/backups/
DEBUG_MODEIf set to true, print copious shell script messages to the container log. Otherwise only basic messages are printed.FALSE
CREATE_LATEST_SYMLINKCreate a symbolic link pointing to last backup in this format: latest-(DB_TYPE)-(DB_NAME)-(DB_HOST)TRUE
PRE_SCRIPTFill this variable in with a command to execute pre backing up
POST_SCRIPTFill this variable in with a command to execute post backing up
SPLIT_DBFor each backup, create a new archive. TRUE or FALSE (MySQL and Postgresql Only)TRUE
⁠Database Specific Options
ParameterDescriptionDefault_FILE
DB_AUTH(Mongo Only - Optional) Authentication Database
DB_TYPEType of DB Server to backup couch influx mysql mssql pgsql mongo redis sqlite3
DB_HOSTServer Hostname e.g. mariadb. For sqlite3, full path to DB file e.g. /backup/db.sqlite3x
DB_NAMESchema Name e.g. database or ALL to backup all databases the user has access to. Backup multiple by seperating with commas eg db1,db2x
DB_NAME_EXCLUDEIf using ALL - use this as to exclude databases seperated via commas from being backed upx
DB_USERusername for the database(s) - Can use root for MySQLx
DB_PASS(optional if DB doesn't require it) password for the databasex
DB_PORT(optional) Set port to connect to DB_HOST. Defaults are providedvariesx
INFLUX_VERSIONWhat Version of Influx are you backing up from 1.x or 2 series - AMD64 and ARM64 only for 2
MONGO_CUSTOM_URIIf you wish to override the MongoDB Connection string enter it here e.g. mongodb+srv://username:[email protected]x
This environment variable will be parsed and populate the DB_NAME and DB_HOST variables to properly build your backup filenames. You can overrde them by making your own entries
⁠For Influx DB2:

Your Organization will be mapped to DB_USER and your root token will need to be mapped to DB_PASS. You may use DB_NAME=ALL to backup the entire set of databases. For DB_HOST use syntax of http(s)://db-name

⁠Scheduling Options
ParameterDescriptionDefault
DB_DUMP_FREQHow often to do a dump, in minutes after the first backup. Defaults to 1440 minutes, or once per day.1440
DB_DUMP_BEGINWhat time to do the first dump. Defaults to immediate. Must be in one of two formats
Absolute HHMM, e.g. 2330 or 0415
Relative +MM, i.e. how many minutes after starting the container, e.g. +0 (immediate), +10 (in 10 minutes), or +90 in an hour and a half
DB_DUMP_TARGETDirectory where the database dumps are kept.${DB_DUMP_TARGET}/archive/
DB_DUMP_TARGET_ARCHIVEOptional Directory where the database dumps archives are kept.
DB_CLEANUP_TIMEValue in minutes to delete old backups (only fired when dump freqency fires). 1440 would delete anything above 1 day old. You don't need to set this variable if you want to hold onto everything.FALSE
DB_ARCHIVE_TIMEValue in minutes to move all files files older than (x) from DB_DUMP_TARGET to DB_DUMP_TARGET_ARCHIVE - which is useful when pairing against an external backup system.
  • You may need to wrap your DB_DUMP_BEGIN value in quotes for it to properly parse. There have been reports of backups that start with a 0 get converted into a different format which will not allow the timer to start at the correct time.
⁠Backup Options
ParameterDescriptionDefault_FILE
COMPRESSIONUse either Gzip GZ, Bzip2 BZ, XZip XZ, ZSTD ZSTD or none NONEZSTD
COMPRESSION_LEVELNumberical value of what level of compression to use, most allow 1 to 9 except for ZSTD which allows for 1 to 19 -3
ENABLE_PARALLEL_COMPRESSIONUse multiple cores when compressing backups TRUE or FALSETRUE
PARALLEL_COMPRESSION_THREADSMaximum amount of threads to use when compressing - Integer value e.g. 8autodetected
GZ_RSYNCABLEUse --rsyncable (gzip only) for faster rsync transfers and incremental backup deduplication. e.g. TRUEFALSE
ENABLE_CHECKSUMGenerate either a MD5 or SHA1 in Directory, TRUE or FALSETRUE
CHECKSUMEither MD5 or SHA1MD5
EXTRA_OPTSIf you need to pass extra arguments to the backup and database enumeration command, add them here e.g. --extra-command
EXTRA_DUMP_OPTSIf you need to pass extra arguments to the backup command only, add them here e.g. --extra-command
EXTRA_ENUMERATION_OPTSIf you need to pass extra arguments to the database enumeration command only, add them here e.g. --extra-command
MYSQL_MAX_ALLOWED_PACKETMax allowed packet if backing up MySQL / MariaDB512M
MYSQL_SINGLE_TRANSACTIONBackup in a single transaction with MySQL / MariaDBTRUE
MYSQL_STORED_PROCEDURESBackup stored procedures with MySQL / MariaDBTRUE
MYSQL_ENABLE_TLSEnable TLS functionality for MySQL clientFALSE
MYSQL_TLS_VERIFY(optional) If using TLS (by means of MYSQL_TLS_* variables) verify remote hostFALSE
MYSQL_TLS_VERSIONWhat TLS v1.1 v1.2 v1.3 version to utilizeTLSv1.1,TLSv1.2,TLSv1.3
MYSQL_TLS_CA_FILEFilename to load custom CA certificate for connecting via TLS/etc/ssl/cert.pemx
MYSQL_TLS_CERT_FILEFilename to load client certificate for connecting via TLSx
MYSQL_TLS_KEY_FILEFilename to load client key for connecting via TLSx
  • When using compression with MongoDB, only GZ compression is possible.
⁠Backing Up to S3 Compatible Services

If BACKUP_LOCATION = S3 then the following options are used.

ParameterDescriptionDefault_FILE
S3_BUCKETS3 Bucket name e.g. mybucketx
S3_KEY_IDS3 Key ID (Optional)x
S3_KEY_SECRETS3 Key Secret (Optional)x
S3_PATHS3 Pathname to save to (must NOT end in a trailing slash e.g. 'backup')x
S3_REGIONDefine region in which bucket is defined. Example: ap-northeast-2x
S3_HOSTHostname (and port) of S3-compatible service, e.g. minio:8080. Defaults to AWS.x
S3_PROTOCOLProtocol to connect to S3_HOST. Either http or https. Defaults to https.httpsx
S3_EXTRA_OPTSAdd any extra options to the end of the aws-cli process executionx
S3_CERT_CA_FILEMap a volume and point to your custom CA Bundle for verification e.g. /certs/bundle.pemx
OR
S3_CERT_SKIP_VERIFYSkip verifying self signed certificates when connectingTRUE
  • When S3_KEY_ID and/or S3_KEY_SECRET is not set, will try to use IAM role assigned (if any) for uploading the backup files to S3 bucket.
⁠Upload to a Azure storage account by blobxfer

Support to upload backup files with blobxfer⁠ to the Azure fileshare storage.

If BACKUP_LOCATION = blobxfer then the following options are used.

ParameterDescriptionDefault_FILE
BLOBXFER_STORAGE_ACCOUNTMicrosoft Azure Cloud storage account name.x
BLOBXFER_STORAGE_ACCOUNT_KEYMicrosoft Azure Cloud storage account key.x
BLOBXFER_REMOTE_PATHRemote Azure path/docker-db-backupx

This service uploads files from backup targed directory DB_DUMP_TARGET. If the a cleanup configuration in DB_CLEANUP_TIME is defined, the remote directory on Azure storage will also be cleaned automatically.

⁠Maintenance

⁠Shell Access

For debugging and maintenance purposes you may want access the containers shell.

bash docker exec -it (whatever your container name is) bash

⁠Manual Backups

Manual Backups can be performed by entering the container and typing backup-now

  • Recently there was a request to have the container work with Kubernetes cron scheduling. This can theoretically be accomplished by setting the container MODE=MANUAL and then setting MANUAL_RUN_FOREVER=FALSE - You would also want to disable a few features from the upstream base images specifically CONTAINER_ENABLE_SCHEDULING and CONTAINER_ENABLE_MONITORING. This should allow the container to start, execute a backup by executing and then exit cleanly. An alternative way to running the script is to execute /etc/services.available/10-db-backup/run.
⁠Restoring Databases

Entering in the container and executing restore will execute a menu based script to restore your backups - MariaDB, Postgres, and Mongo supported.

You will be presented with a series of menus allowing you to choose:

  • What file to restore
  • What type of DB Backup
  • What Host to restore to
  • What Database Name to restore to
  • What Database User to use
  • What Database Password to use
  • What Database Port to use

The image will try to do autodetection based on the filename for the type, hostname, and database name. The image will also allow you to use environment variables or Docker secrets used to backup the images

The script can also be executed skipping the interactive mode by using the following syntax/

`restore <filename> <db_type> <db_hostname> <db_name> <db_user> <db_pass> <db_port>`

If you only enter some of the arguments you will be prompted to fill them in.

⁠Custom Scripts
⁠Path Options
ParameterDescriptionDefault
SCRIPT_LOCATION_PRELocation on filesystem inside container to execute bash scripts pre backup/assets/scripts/pre/
SCRIPT_LOCATION_POSTLocation on filesystem inside container to execute bash scripts post backup/assets/scripts/post/
⁠Pre Backup

If you want to execute a custom script before a backup starts, you can drop bash scripts with the extension of .sh in the location defined in SCRIPT_LOCATION_PRE. See the following example to utilize:

$ cat pre-script.sh
##!/bin/bash

# #### Example Pre Script
# #### $1=DB_TYPE (Type

Tag summary

Content type

Image

Digest

sha256:3f6959c67…

Size

171.7 MB

Last updated

almost 3 years ago

docker pull alwynpan/db-backup:3.12.0