Pomoc Automatyczny backup kontenerów

goruss

System Engineer
Q Specialist
20 Październik 2020
114
7
18
24
QNAP
null
Ethernet
null
Witam,
W jaki sposób zautomatyzować proces backupu kontenerów, tak aby można było je szybko przywrócić poprzez import kilkoma kliknięciami w container station?
Dotychczas miałem ustawioną synchronizację całego katalogu /Container, ale to poza samymi plikami niewiele mi dawało i w przypadku problemów musiałem kontener przywracać ręcznie.
Zależy mi na jakimś skrypcie, który cyklicznie robiłby backup kontenerów.
Mogę liczyć na pomoc?
 
OK dzięki.
Czy mając backup katalogu /Container w qnap oraz przywracając go - czy container station normalnie się uruchomi oraz czy kontenery będą działać adekwatnie do daty kopii?
 
W jaki sposób zautomatyzować proces backupu kontenerów, tak aby można było je szybko przywrócić poprzez import kilkoma kliknięciami w container station?
jeśli naciśniesz EXPORT , to ci zrobi kopię jego plus ustawień samego kontenera (entrypoint etc etc) , polecam robić na wyłączonym kontenerze (zwłaszcza dla baz danych).

zgadnij czemu tam często piszę o tym docker-compose ? bo to mega ułatwia sprawe:
docker-compose.yml
Kod:
version: '3.3'
services:
    portainer-ce:
        ports:
            - '9000:9000'
        container_name: portainer
        volumes:
            - '/var/run/docker.sock:/var/run/docker.sock'
            - 'portainer_config:/data'
        restart: always
        image: portainer/portainer-ce
    qbittorrent:
        container_name: qbittorrent
        environment:
            - PUID=${apps_puid}
            - PGID=${apps_guid}
            - TZ=${apps_timezone}
            - WEBUI_PORT=${qbitorrent_port}
        ports:
            - '6881:6881'
            - '6881:6881/udp'
            - '${qbitorrent_port}:9092'
        volumes:
            - 'qbittorrent_config:/config'
            - '${download_path}:/downloads'
        restart: ${apps_restartpolicy}
        image: linuxserver/qbittorrent
volumes:
    portainer_config:
        driver: local
    qbittorrent_config:
        driver: local

.env
Kod:
########################ustawienia kontenerow##################################
# primary user ID -> id -u
apps_puid=1000
# primary group ID -> id -g
apps_guid=1000
# should container be up after reboot ?  https://docs.docker.com/config/containers/start-containers-automatically/
apps_restartpolicy=unless-stopped
# all applications timezone https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
apps_timezone=Europe/Warsaw
########################pobieranie torrent##################################
#qbitorrent webport - https://hub.docker.com/r/linuxserver/qbittorrent
qbitorrent_port=9092
#path where downloaded data will be https://hub.docker.com/r/linuxserver/qbittorrent
download_path=/media/mmedia/Downloads
Połączono posty:

jak robisz kopie ?
kopiujesz folder gdzie masz te pliki w/w + wolumeny/bindy - wrzucasz to w zipa i tyle w temacie

restore ?
rozpakujesz konkretnego ZIP w miejsce docelowe, SSH -> docker-compose up -d , po chwili to samo się włącza.
sprawdzasz czy appka działa, tyle w temacie.

nowa wersja kontenerów ?
SSH -> włazisz do folderu z plikem docker-compose.yml -> docker-compose pull ; docker-compose up -d --force-recreate
sprawdzasz czy appka działa, tyle w temacie.
 
Dotychczas używałem wbudowanego w Qnap HBS 3 Hybrid Backup Sync i robiłem jednostronną synchronizację całego udziału /Container , ale w logach widziałem błędy w przesyłaniu niektórych plików (widocznie jakieś systemowe pliki ze względu na prawa dostępu nie pozwalało przesyłać). W związku z tym mam obawę czy taki backup po przywróceniu byłyby skuteczny. W związku z tym szukam jakiegoś innego, pewnego ale i automatycznego sposobu backuupu kontenerów.
Muszę przetestować powyższe przykłady.
P.S. chciałem za wszelką cenę uniknąć dodatkowych kontenerów typu portainer gdyż każdy takowy obciąża mojego ubogiego nasa.
 
typu portainer gdyż każdy takowy
ta ? przetestowałeś czy tylko tak sobie piszemy ?
Połączono posty:

tak żeby nie być goło słownym docker container stats portainer - nie klikam nic po portainer
1678730835503.png

zużycie CPU ? poniżej 1%
pamięć ? 0,26% z 16 GB ... to nieco ponad 40 MB ?

poważnie z tym obciążeniem ? ehhh , cycki mi opadły
 
Trochę się nie rozumiemy, ale mniejsza z tym. Powiedzmy, że jestem na tyle wiekowy, że interesują mnie wyłącznie proste rozwiązania zaszyte w jednej komendzie wiersza poleceń. Jeżeli takich nie znajdę to trudno...
Ponadto mój serwer ma 1 GB RAM i zużycie na poziomie 85%...
 
Kiedyś zmajstrowałem coś takiego - chyba nawet działało :D
Bash:
#!/bin/bash

###############
# MAIN BACKUP #
###############

# Where backup should be located
BACKUP_DIR='/mnt/kopia/docker/'

# How many days keep backups
BACKUP_RETAIN_DAYS=7

# Date format used in filename
# Filename will be [volume_name]-[date].tar.gz
BACKUP_DATE_FORMAT='%Y-%m-%d_%H-%M-%S'

##########
# DOCKER #
##########

# What to backup?
# MOUNT / VOLUME
SOURCE_TYPE='MOUNT'

# Skip mounts in backup
SKIP_MOUNT=("docker.sock")

# Pause container on backup?
PAUSE_ON_BACKUP=1

#################
# REMOTE BACKUP #
#################

# SEND BACKUP TO REMOTE LOCATION?
SEND_TO_REMOTE=0

# Transfer type
# 1=FTP
# 2=SFTP
# 3=rsync to other dir
TYPE=3

# FTP / SFTP
# Login Data
#USERNAME="userz"
#PASSWORD="someStrongRandomPassword"

# FTP / SFTP
# IP or hostname
#SERVER="backup4free.org"

# FTP / SFTP
# Port
# Default for FTP 21
# Default for SFTP 22
#PORT="21"

# FTP / SFTP / RSYNC
# Remote directory where the backup will be placed
REMOTEDIR="./docker/"

##############################
# Don't edit below this line #
##############################

function check_root() {
    [ $EUID -eq 0 ] || _exit "$LINENO: This script must be run as root"
}

function _exit() {
    echo -e "$*"
    echo
    exit 1
}

function check_deps() {
    if [ ! -x "/usr/bin/jq" ]; then
        echo "ERROR: missing jq"
        echo "Trying to install jq from apt repos"
        apt update        2>/dev/null 1>/dev/null
        apt install jq -y 2>/dev/null 1>/dev/null
    fi
    [ -x "/usr/bin/jq" ] || _exit "$LINENO: Cannot install jq!"
}

check_root
check_deps

if [ $SOURCE_TYPE = "MOUNT" ]; then
    DOCKER_CONTAINERS=$(docker container ls --format "{{.Names}}")
    CONTAINERS=($DOCKER_CONTAINERS)

    for container in "${CONTAINERS[@]}"
    do
        if [ $PAUSE_ON_BACKUP = 1 ]; then
            docker pause $container
        fi
        echo "Working on $container"
        CONTAINER_MOUNTS=$(docker container inspect $container --format '{{range .Mounts}}{{println .Source}}{{end}}')
        MOUNTS=($CONTAINER_MOUNTS)
        for mount in "${MOUNTS[@]}"
        do
            echo "Working on mount $mount"
            mount_name=$(echo $mount|cut -d'/' -f4-|sed 's#/#_#g')
            if [[ ! " ${SKIP_MOUNT[*]} " =~ " $mount_name " ]]; then
                echo "Backing up to $backup_filename..."
                fdate=`date +$BACKUP_DATE_FORMAT`
                backup_filename="$mount_name-$fdate.tar.gz"
                tar czf $BACKUP_DIR$backup_filename $mount
                echo "Working on $mount ... done!"
                echo ""
            else
                echo "Skipped..."
                echo ""
            fi
        done
        if [ $PAUSE_ON_BACKUP = "1" ]; then
            docker unpause $container
        fi
    done
elif [ $SOURCE_TYPE = "VOLUME" ]; then
    echo "Getting docker volumes ..."
    DOCKER_VOLUMES=$(docker volume ls -q)
    VOLUMES=($DOCKER_VOLUMES)
    echo "Getting docker volumes ... done!"

    for volume in "${VOLUMES[@]}"
    do
        echo "Working on $volume ..."
        # there should be only one mountpoint in volume - the ZERO
        volume_path=$(docker volume inspect $volume | jq .[0].Mountpoint)
        volume_path=$(echo $volume_path | sed -e 's/\"//g')
        echo "$volume is mounted at $volume_path ..."
        fdate=`date +$BACKUP_DATE_FORMAT`
        backup_filename="$volume-$fdate.tar.gz"
        echo "Backing up to $backup_filename..."
        tar czf $BACKUP_DIR$backup_filename $volume_path
        echo "Working on $volume ... done!"
        echo ""
    done
else
    _exit "[SOURCE] Please select a valid type"
fi

# DELETE FILES OLDER THAN SETTING
if [ ! -z ${BACKUP_DIR} ]; then
    echo "Removing backups older than ${BACKUP_RETAIN_DAYS} days..."
    find ${BACKUP_DIR}* -mtime +${BACKUP_RETAIN_DAYS} -exec rm {} \;
fi

if [ $SEND_TO_REMOTE -eq 1 ]; then
    echo "Finding files that will be send to remote location..."
    FILES_TO_SEND_=$(find $BACKUP_DIR -maxdepth 1 -type f -mtime -1 -printf '%f\n')
    FILES_TO_SEND=($FILES_TO_SEND_)
    echo "Done"

    for FILE in "${FILES_TO_SEND[@]}"
    do
        echo "Processing $FILE"
        if [ $TYPE -eq 1 ]; then    # FTP
            echo "Using FTP remote location"
            cd $BACKUP_DIR
            echo "Connecting and sending file"
            ftp -p -n -i $SERVER $PORT <<EOF
            user $USERNAME $PASSWORD
            binary
            put $FILE $REMOTEDIR/$FILE
            quit
EOF
        elif [ $TYPE -eq 2 ]; then  # SFTP
            echo "Using SFTP remote location"
            cd $BACKUP_DIR
            echo "Connecting and sending file"
            rsync --rsh="sshpass -p $PASSWORD ssh -p $PORT -o StrictHostKeyChecking=no -l $USERNAME" $FILE $SERVER:$REMOTEDIR
        elif [$TYPE -eq 3 ]; then   # RSYNC
            echo "Using DIR as remote location"
            cd $BACKUP_DIR
            echo "Copying files..."
            rsync -Pcauv $BACKUP_DIR $REMOTEDIR
            break
        else
            _exit "[FTP] Please select a valid type"
        fi
    done
fi
 
  • Lubię to
Reakcje: Damian
Duże dzięki.
Natomiast dalej mam wątpliwość czy nie można tego zrobić żadnym narzędziem od Qnap?
Albo jeszcze inaczej - zawartość każdego z kontenerów w moim przypadku ma "swoje" kopie bezpieczeństwa i jestem w stanie sobie poradzić z każdym z kontenerów na swój sposób.
Interesuje mnie posiadanie kopii całej struktury container station tak, aby po przywróceniu struktura całego container station była owzorowana adekwatnie do dany kopii. Czy osiągnę to poprzez zwykłe kopiowanie całego katalogu /Container?
 
OK, zainstalowałem tego portainera (z poziomu container station) - teraz to dopiero się zacznie... :)
Rozumiem, że ten jeden kontener znajduje się z container station, a całą resztę dodaję poprzez portainera - czy tak?
Jeśli tak, to jak bezproblemowo poprzenosić kontenery z container station do portainera?
 
@goruss - nie karaj się Container Station
wywal tamtego portainer'a
odpal SSH, wklep dwa polecenia
Kod:
docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
i pod adresem http://QNAP:9000/ będzie portainer
powinien widzieć Twoje wszystkie kontenery.
 
  • Lubię to
Reakcje: yaroslavik
Dobra, mam i wszystko widać.
Zaczynam zabawę i nie zawracam głowy.
Natomiast ostatnie pytanie - czy to że zarządzam kontenerami z poziomu portainera zmienia coś jeżeli chodzi o kwestie automatyzacji backupów kontenerów?
EDIIT
Czy mam rozumieć, że to co poniżej zaimplementowane e ENV portainera będzie wykonywało kopię kontenerów?
Kod:
########################ustawienia kontenerow##################################
# primary user ID -> id -u
apps_puid=1000
# primary group ID -> id -g
apps_guid=1000
# should container be up after reboot ?  https://docs.docker.com/config/containers/start-containers-automatically/
apps_restartpolicy=unless-stopped
# all applications timezone https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
apps_timezone=Europe/Warsaw
########################pobieranie torrent##################################
#qbitorrent webport - https://hub.docker.com/r/linuxserver/qbittorrent
qbitorrent_port=9092
#path where downloaded data will be https://hub.docker.com/r/linuxserver/qbittorrent
download_path=/media/mmedia/Downloads
 
To może nie tak zapytam,
Backup kontenerów potrzebny mi jest wyłącznie do tego, że jak robię aktualizację kontenera i coś się "wysypie" to chciałbym w prosty sposób odtworzyć poprzednią wersję.
W takim razie w jaki sposób nawet ręcznie (obojętnie czy to portainer czy container station) robić te kopie i je odtwarzać?
Przepraszam, za tak lakoniczne być może dla Was pytanie, ale widzę w programach do zarządzania kontenerami ich listę, obrazy, oraz volumeny i o ile volumeny mogę skopiować ręcznie, obrazy wyeksportować z poziomu container station to nie wiem jak zrobić kopię i potem odtworzyć ustawienia kontenera i tu prośba o wskazówki.
 
Dobra, mam i wszystko widać.
Zaczynam zabawę i nie zawracam głowy.
Natomiast ostatnie pytanie - czy to że zarządzam kontenerami z poziomu portainera zmienia coś jeżeli chodzi o kwestie automatyzacji backupów kontenerów?
EDIIT
Czy mam rozumieć, że to co poniżej zaimplementowane e ENV portainera będzie wykonywało kopię kontenerów?
Kod:
########################ustawienia kontenerow##################################
# primary user ID -> id -u
apps_puid=1000
# primary group ID -> id -g
apps_guid=1000
# should container be up after reboot ?  https://docs.docker.com/config/containers/start-containers-automatically/
apps_restartpolicy=unless-stopped
# all applications timezone https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
apps_timezone=Europe/Warsaw
########################pobieranie torrent##################################
#qbitorrent webport - https://hub.docker.com/r/linuxserver/qbittorrent
qbitorrent_port=9092
#path where downloaded data will be https://hub.docker.com/r/linuxserver/qbittorrent
download_path=/media/mmedia/Downloads
Nie to nie robi backupów. To jest plik ze zmiennymi które są wykorzystywane w pliku docker-compose.yml. Czyli jeśli w yml jest - PUID=${apps_puid} to ${apps_puid} jest podmieniane 1000 (zgodnie z env).
 
Jeśli oczekujesz takiego automatu, pstryk i już to - nie ma Back up and restore data

Docker to środowisko deweloperskie, Twoją broszką jest zadbać o backup samemu.

w sumie to powinno byc na początku tematu ...

z doświadczenia mówię:
1. musisz mieć kopię wolumenów/bindów (wyłącz kontener , spakuj folder(y) do zipa)
2. musisz mieć kopię co i jak było włączone (i tutaj przydaje się docker-compose)
 

Użytkownicy znaleźli tą stronę używając tych słów:

  1. Portainer
  2. unifi
  3. Hybrid Backup Sync
  4. Container Station
  5. hybrid backup
  6. kopia
  7. unifi controler
  8. ssl dla kontenerow
  9. container station folder
  10. non-root
  11. kontenery
  12. hybrid
  13. portainer aktualizacja
  14. mysql dump
  15. qbittorrent x19
  16. docker backup
  17. qbitorrent
  18. nextcloud
  19. backup mysql
  20. backup kontenera
  21. docker
  22. volume
  23. cron
  24. backup kontenerów