From 248363fea02b124a7deafefe47bafc9e356a0995 Mon Sep 17 00:00:00 2001 From: grimhilt Date: Mon, 23 Jan 2023 21:40:05 +0100 Subject: [PATCH] mtp --- dev.sh | 41 +++++++++++++++++ full_backup_docker.sh | 65 +++++++++++++++++++++++++++ pro.sh | 101 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 207 insertions(+) create mode 100644 dev.sh create mode 100644 full_backup_docker.sh create mode 100644 pro.sh diff --git a/dev.sh b/dev.sh new file mode 100644 index 0000000..c5b4dc7 --- /dev/null +++ b/dev.sh @@ -0,0 +1,41 @@ +ALL_CONTAINER=$(docker ps --format '{{.Names}}') +ALL_PROJECTS=$(for i in $ALL_CONTAINER; do docker inspect --format '{{ index .Config.Labels "com.docker.compose.project.working_dir"}}' $i; done | sort -u) + +EXPORT_DIR='./export' + +for project in $ALL_PROJECTS; do + PROJECT_NAME=${project##*/} + echo -e '\n project: '$project + + # exclude projects + # if [ "$project" != "/docker/synapse" ]; then + # continue; + # fi + + # all images + while read -r image; do + echo 'img: '$image + done < <(grep -Po "(?<=image: ).*$" $project/docker-compose.yml) + + # all containers name + while read -r name; do + echo 'container: '$name + echo $name + # docker inspect $name + # all volumes + while read -r volume; do + echo "vol: "$volume + done < <(docker inspect --format="{{.Mounts}}" $name) + done < <(grep -Po '(?<=container_name: ).*$' $project/docker-compose.yml) +done + + | grep '[\{.+\}]*' +# test multi volumes +# postgres +# jisti using config env + +# todo why doens't work everywhere +# todo +docker inspect --format="{{.Mounts}}" synapse + +[{bind /etc/localtime /etc/localtime ro false rprivate} {volume nextcloud_nextcloud /var/lib/docker/volumes/nextcloud_nextcloud/_data /var/www/html local rw true } {bind /docker/nextcloud/app/config /var/www/html/config rw true rprivate} {bind /docker/nextcloud/app/custom_apps /var/www/html/custom_apps rw true rprivate} {bind /media/nextcloud /var/www/html/data rw true rprivate} {bind /docker/nextcloud/app/themes /var/www/html/themes rw true rprivate}] \ No newline at end of file diff --git a/full_backup_docker.sh b/full_backup_docker.sh new file mode 100644 index 0000000..f31c67d --- /dev/null +++ b/full_backup_docker.sh @@ -0,0 +1,65 @@ +BACKUP_DIR='/docker/backup' +ALL_CONTAINER=$(docker ps --format '{{.Names}}') +ALL_PROJECTS=$(for i in $ALLCONTAINER; do docker inspect --format '{{ index .Config.Labels "com.docker.compose.project.working_dir"}}' $i; done | sort -u) + +EXPORT_DIR='./export' + +for project in $ALL_PROJECTS; do + PROJECT_NAME=${project##*/} + + #todo loop + read -p "Stop docker $PROJECT_NAME (y/n)?" choice + case "$choice" in + y|Y ) docker stop $PROJECT_NAME;; + n|N ) continue;; + * ) echo "invalid";; + esac + + mkdir $EXPORT_DIR/$PROJECT_NAME + echo "Exporting docker-compose.yml" + cp $project/docker-compose.yml $EXPORT_DIR/$PROJECT_NAME + + ALL_IMAGES="todo" + for j in $ALL_IMAGES; do + #save + ALL_VOLUMES=$(docker inspect -f '{{index .Mounts 0}}' $j) + for k in $ALL_VOLUMES; do + #save + done + done + +docker start $PROJECT_NAME + + #zip everything +done + +ALL_CONTAINER=$(docker ps --format '{{.Names}}') +ALL_PROJECTS=$(for i in $ALL_CONTAINER; do docker inspect --format '{{ index .Config.Labels "com.docker.compose.project.working_dir"}}' $i; done | sort -u) + +EXPORT_DIR='./export' + +for project in $ALL_PROJECTS; do + PROJECT_NAME=${project##*/} + echo -e '\n project: '$project + + # all images + while read -r image; do + echo 'img: '$image + done < <(grep -Po "(?<=image: ).*$" $project/docker-compose.yml) + + # all container name + while read -r name; do + echo 'container: '$name + while read -r volume; do + echo "vol: "$volume + done < <(docker inspect --format="{{.Mounts}}" $name | grep '[\{.+\}]*') + done < <(grep -Po '(?<=container_name: ).*$' $project/docker-compose.yml) +done + + +# test multi volumes +# postgres +# jisti using config env +docker inspect --format="{{.Mounts}}" synapse + +[{bind /etc/localtime /etc/localtime ro false rprivate} {volume nextcloud_nextcloud /var/lib/docker/volumes/nextcloud_nextcloud/_data /var/www/html local rw true } {bind /docker/nextcloud/app/config /var/www/html/config rw true rprivate} {bind /docker/nextcloud/app/custom_apps /var/www/html/custom_apps rw true rprivate} {bind /media/nextcloud /var/www/html/data rw true rprivate} {bind /docker/nextcloud/app/themes /var/www/html/themes rw true rprivate}] \ No newline at end of file diff --git a/pro.sh b/pro.sh new file mode 100644 index 0000000..58c0c76 --- /dev/null +++ b/pro.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash + +### Bash Environment Setup +# http://redsymbol.net/articles/unofficial-qbash-strict-mode/ +# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html +# set -o xtrace +set -o errexit +set -o errtrace +set -o nounset +set -o pipefail +IFS=$'\n' + +# Fully backup a docker-compose project, including all images, named and unnamed volumes, container filesystems, config, logs, and databases. +project_dir="${1:-$PWD}" +if [ -f "$project_dir/docker-compose.yml" ]; then + echo "[i] Found docker-compose config at $project_dir/docker-compose.yml" +else + echo "[X] Could not find a docker-compose.yml file in $project_dir" + exit 1 +fi + +project_name=$(basename "$project_dir") +backup_time=$(date +"%Y-%m-%d_%H-%M") +backup_dir="$project_dir/data/backups/$backup_time" + +# Source any needed environment variables +[ -f "$project_dir/docker-compose.env" ] && source "$project_dir/docker-compose.env" +[ -f "$project_dir/.env" ] && source "$project_dir/.env" + + +echo "[+] Backing up $project_name project to $backup_dir" +mkdir -p "$backup_dir" + +echo " - Saving docker-compose.yml config" +cp "$project_dir/docker-compose.yml" "$backup_dir/docker-compose.yml" + + +# Optional: run a command inside the container to dump your application's state/database to a stable file +echo " - Saving application state to ./dumps" +mkdir -p "$backup_dir/dumps" +docker-compose exec db /usr/bin/mysqldump -u gitea --password=fSYot2RrzN4y5Gtj --no-tablespaces gitea | gzip -9 > "$backup_dir/dumps/$MYSQL_DATABASE.sql.gz" +# your database/stateful service export commands to run inside docker go here, e.g. +# docker-compose exec postgres env PGPASSWORD="$POSTGRES_PASSWORD" pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" | gzip -9 > "$backup_dir/dumps/$POSTGRES_DB.sql.gz" +# docker-compose exec redis redis-cli SAVE +# docker-compose exec redis cat /data/dump.rdb | gzip -9 > "$backup_dir/dumps/redis.rdb.gz" + +# Optional: pause the containers before backing up to ensure consistency +# docker-compose pause + +for service_name in $(docker-compose config --services); do + image_id=$(docker-compose images -q "$service_name") + image_name=$(docker image inspect --format '{{json .RepoTags}}' "$image_id" | jq -r '.[0]') + container_id=$(docker-compose ps -q "$service_name") + + service_dir="$backup_dir/$service_name" + echo "[*] Backing up ${project_name}__${service_name} to ./$service_name..." + mkdir -p "$service_dir" + + # save image + echo " - Saving $image_name image to ./$service_name/image.tar" + docker save --output "$service_dir/image.tar" "$image_id" + + if [[ -z "$container_id" ]]; then + echo " - Warning: $service_name has no container yet." + echo " (has it been started at least once?)" + continue + fi + + # save config + echo " - Saving container config to ./$service_name/config.json" + docker inspect "$container_id" > "$service_dir/config.json" + + # save logs + echo " - Saving stdout/stderr logs to ./$service_name/docker.{out,err}" + docker logs "$container_id" > "$service_dir/docker.out" 2> "$service_dir/docker.err" + + # save data volumes + mkdir -p "$service_dir/volumes" + for source in $(docker inspect -f '{{range .Mounts}}{{println .Source}}{{end}}' "$container_id"); do + volume_dir="$service_dir/volumes$source" + echo " - Saving $source volume to ./$service_name/volumes$source" + mkdir -p $(dirname "$volume_dir") + cp -a -r "$source" "$volume_dir" + done + + # save container filesystem + echo " - Saving container filesystem to ./$service_name/container.tar" + docker export --output "$service_dir/container.tar" "$container_id" + + # save entire container root dir + echo " - Saving container root to $service_dir/root" + cp -a -r "/var/lib/docker/containers/$container_id" "$service_dir/root" +done + +echo "[*] Compressing backup folder to $backup_dir.tar.gz" +tar -zcf "$backup_dir.tar.gz" --totals "$backup_dir" && rm -Rf "$backup_dir" + +echo "[√] Finished Backing up $project_name to $backup_dir.tar.gz." + +# Resume the containers if paused above +# docker-compose unpause