├── backup.sh ├── run.sh ├── Dockerfile └── README.md /backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | DATETIME=$(date +"%s_%Y-%m-%d") 6 | NAME="$DATETIME.gz" 7 | 8 | echo "Clean dir" 9 | rm -rf /backup/* 10 | 11 | echo "Start dump $NAME" 12 | /usr/bin/mysqldump --single-transaction --quick --lock-tables=false -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE | gzip > "/backup/$NAME" 13 | 14 | echo "Start copy" 15 | rclone copy "/backup/$NAME" "$RCLONE_DEST" 16 | rm -rf "/backup/$NAME" 17 | 18 | echo "Curl check url" 19 | if [ "$CHECK_URL" = "**None**" ]; then 20 | echo "INFO: Define CHECK_URL with https://healthchecks.io to monitor sync job" 21 | else 22 | curl "$CHECK_URL" 23 | fi 24 | 25 | echo "Done" -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | set -e 4 | 5 | if [ "$RCLONE_DEST" = "**None**" ]; then 6 | echo "Please set RCLONE_DEST" 7 | return 1 8 | fi 9 | 10 | if [ "$SCHEDULE" = "**None**" ]; then 11 | echo "Please set SCHEDULE" 12 | return 1 13 | fi 14 | 15 | if [ "$MYSQL_HOST" = "**None**" ]; then 16 | echo "Please set MYSQL_HOST" 17 | return 1 18 | fi 19 | 20 | if [ "$MYSQL_USER" = "**None**" ]; then 21 | echo "Please set MYSQL_USER" 22 | return 1 23 | fi 24 | 25 | if [ "$MYSQL_DATABASE" = "**None**" ]; then 26 | echo "Please set MYSQL_DATABASE" 27 | return 1 28 | fi 29 | 30 | echo "$SCHEDULE /backup.sh" > /crontab.txt 31 | /usr/bin/crontab /crontab.txt 32 | exec /usr/sbin/crond -f -l 8 33 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine 2 | 3 | ENV MYSQL_HOST **None** 4 | ENV MYSQL_USER **None** 5 | ENV MYSQL_DATABASE **None** 6 | ENV RCLONE_DEST **None** 7 | ENV SCHEDULE **None** 8 | ENV CHECK_URL **None** 9 | 10 | RUN apk update && apk add --no-cache mysql-client curl 11 | RUN curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip && \ 12 | unzip rclone-current-linux-amd64.zip && \ 13 | cd rclone-*-linux-amd64 && \ 14 | cp rclone /usr/bin/ && \ 15 | chown root:root /usr/bin/rclone && \ 16 | chmod 755 /usr/bin/rclone 17 | 18 | ADD backup.sh /backup.sh 19 | ADD run.sh /run.sh 20 | RUN chmod +x /backup.sh && chmod +x /run.sh && chown root:root /usr/bin/rclone && chmod 755 /usr/bin/rclone 21 | RUN chown root:root /usr/bin/rclone && chmod 755 /usr/bin/rclone 22 | 23 | USER root 24 | 25 | CMD ["sh", "run.sh"] 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cron MySQL backup 2 | Automatic cron backup MySQL DB to remote server by RCLONE with simple settings 🌂 3 | 4 | ## Description 5 | This image making automatic backup from any mysql host to any server that support RCLONE util. 6 | 7 | ## Usage 8 | You can use mysql-backup by docker-compose: 9 | ``` 10 | version: '2' 11 | 12 | services: 13 | mysql-backup: 14 | image: vmpartner/mysql-buckup:v2.0.4 # Find latest image version on release page 15 | links: 16 | - mysql:mysql 17 | depends_on: 18 | - mysql 19 | environment: 20 | MYSQL_HOST: mysql 21 | MYSQL_USER: my_db_user 22 | MYSQL_PASSWORD: my_db_password 23 | MYSQL_DATABASE: my_db_name 24 | SCHEDULE: "0 */6 * * *" 25 | RCLONE_CONFIG_SELECTEL_TYPE: "swift" 26 | RCLONE_CONFIG_SELECTEL_ENV_AUTH: "false" 27 | RCLONE_CONFIG_SELECTEL_USER: "my_user" 28 | RCLONE_CONFIG_SELECTEL_KEY: "my_password" 29 | RCLONE_CONFIG_SELECTEL_AUTH: "https://auth.selcdn.ru/v1.0" 30 | RCLONE_CONFIG_SELECTEL_ENDPOINT_TYPE: "public" 31 | RCLONE_DEST: "selectel:my_container/my_math" 32 | CHECK_URL: "https://hc-ping.com/my_check_token" # Example https://healthchecks.io 33 | restart: unless-stopped 34 | ``` 35 | Used https://rclone.org/ for rsync to cloud 36 | 37 | You need set MYSQL, RCLONE details and periodic task SCHEDULE in cron format. If you don't know cron, please read more at https://en.wikipedia.org/wiki/Cron --------------------------------------------------------------------------------