#!/bin/bash

#//// GREG POUR LE GARAGE NUMERIQUE \\\\#

# Script automatisant le push de conteneur vers un registre privé de backups ainsi que les volumes correspondants.
# Le docker login au registre doit être effectué au moins une fois manuellement.
# Configurer l'adresse du registre ainsi que les informations sur le serveur de backups
# Les volumes et labels sont archivés et transférés par ssh vers le serveur de backup une fois par mois (le 1er).

############################## CONFIG ##############################

date=`date +%d-%m`
# dockerregistry="monregistre.mondomaine.com"
dockerregistry=""
# sshHost="user@server-IP"
sshHost=""
# sshPort=9999
sshPort=
backupFolder="~/docker-volumes-backup/"
# exceptions=( "container1" "container2")
#exceptions=( "" )

############################## CONTAINERS BACKUP ##############################

# LISTING DES CONTAINERS
stack=$(docker ps -aq)

for container in $stack
do
    echo "backup du conteneur $container"
    # GET CONTAINER NAME
    docker inspect --format='{{.Name}}' $container > containers.txt
    containerName=$(sed 's/[/]*//' containers.txt)

    for exception in ${exceptions[@]}
    do
        if [ $container == $exception ]
        then
            break
        else
            # COMMIT AND PUSH TO REGSTRY
            docker container commit $container $dockerregistry$containerName-backup:$date
            docker push $dockerregistry$containerName-backup:$date
        fi
    done
done

# CLEANING
rm -rf containers.txt

############################## VOLUMES & LABELS BACKUP ##############################

if [ ${date:0:02} == "01" ]
then
    # LISTING DES VOLUMES
    volumes=$(docker volume ls -q)

    for volume in $volumes
    do
        echo "backup du volume $volume"

        # GET CONTAINER ID
        containerId=$(docker ps -a -q --filter volume=$volume)
        # GET CONTAINER NAME
        docker inspect --format='{{.Name}}' $containerId > volumes.txt
        container=$(sed 's/[/]*//' volumes.txt)

        # STOP THE CONTAINER (FOR VOLUMES INTEGRITY)
        docker stop $container
        # BACKUP VOLUME IN ARCHIVE
        docker run -v $volume:/volume -v $(pwd)/backup:/backup --rm loomchild/volume-backup backup volumes/$container-volume:$date
        # BACKUP DOCKER VOLUMES LABELS
        docker inspect $volume -f "{{json .Labels}}" > backup/labels/$container-labels.json
        # RESTART THE CONTAINER
        docker start $container

        # CLEANING
        rm -rf volumes.txt
    done

    # MV VOLUMES & LABELS BACKUP TO BACKUP HOST
    scp -r -P $sshPort $(pwd)/backup/* $sshHost:$backupFolder
    # CLEANING
    rm -rf containers.txt; rm -rf $(pwd)/backup/volumes/*; rm -rf $(pwd)/backup/labels/*

    echo "copie des archives de volumes vers le serveur de backup ok"
fi

echo "backup des containers terminée"
