[ADD]Volumes backup image with save plan

This commit is contained in:
Fabien Bourgeois 2016-10-07 12:22:46 +02:00
parent 835aca780d
commit 9f05ffff85
6 changed files with 111 additions and 0 deletions

7
backups/base.yml Normal file
View File

@ -0,0 +1,7 @@
version: '2'
services:
rsyncvolumes:
build: ./rsyncvolumes
image: rsyncvolumes:base

View File

@ -0,0 +1,18 @@
FROM debian:jessie
MAINTAINER Yaltik - Fabien Bourgeois <fabien@yaltik.com>
ENV SOURCE /var/lib/docker/volumes
ENV DEST /var/backups/
RUN apt-get update && apt-get install --no-install-recommends -y \
cron gettext-base rsync python-minimal libpython-stdlib
COPY crontab /etc/crontab
RUN chmod 644 /etc/crontab
WORKDIR /opt/backup
COPY rsync.template .
COPY plan.tpl.py .
COPY launch.sh .
CMD bash launch.sh

View File

@ -0,0 +1,4 @@
# hourly backup
# m h dom mon dow user command
0 * * * * root /bin/bash /opt/backup/rsync.sh
0 1 * * * root /bin/python /opt/backup/plan.py

View File

@ -0,0 +1,5 @@
#!/bin/bash
envsubst < /opt/backup/rsync.template > /opt/backup/rsync.sh
envsubst < /opt/backup/plan.tpl.py > /opt/backup/plan.py
cron -f

View File

@ -0,0 +1,74 @@
# -*- coding: utf-8 -*-
from zipfile import ZipFile, ZIP_DEFLATED
from datetime import datetime
from os import walk, unlink
from os.path import join as osjoin
from glob import glob
# Backup plan for Docker volumes
# ::::::::::::::::::::::::::::::
#
# Keep :
#
# - all saves the last week
# - one save per week the last month
# - one save per month the last year
# Volumes Backup
# ==============
dt = datetime.now()
zipname = '{0}.zip'.format(dt.strftime('%Y-%m-%d_%H-%M-%S'))
zippath = '${DEST}' + zipname
# Zip files
def zipdir(path, ziph):
# ziph is zipfile handle
for root, dirs, files in walk(path):
for file in files:
ziph.write(osjoin(root, file))
f = ZipFile(zippath, 'w', ZIP_DEFLATED)
zipdir('${SOURCE}', f)
f.close()
# Filter all obsolete save files
# ==============================
def notkeep(fname):
fname = fname.split('/')[-1]
ds = fname.split('_')
if len(ds) <= 1:
return False
ds = ds[0]
d = datetime.strptime(ds, '%Y-%m-%d')
delta = dt - d
if delta.days > 365:
return True
elif delta.days > 31:
# if (delta.days %% 30) != 0:
if (d.day != 1):
return True
elif delta.days > 7:
# if (delta.days %% 7) != 0:
if (d.weekday() != 0) and (d.day != 1):
return True
else:
return False
# Filters zip files and keeps only legitimate ones
# ================================================
files = glob('${DEST}/*.zip')
backups_to_remove = filter(notkeep, files)
if len(backups_to_remove) > 0:
print('Save files outdated, will be deleted : \n\n* ' +
'\n* '.join(backups_to_remove))
for b in backups_to_remove:
unlink(b)

View File

@ -0,0 +1,3 @@
#!/bin/bash
rsync -av ${SOURCE} ${DEST}