diff --git a/Docker/backupContainer.sh b/Docker/backupContainer.sh new file mode 100644 index 0000000..f79310a --- /dev/null +++ b/Docker/backupContainer.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +CONTAINER_NAME="$1" +BACKUP_DIR="$2" +VOLUME_NAME="$3" + +if [ -z "$BACKUP_DIR" ]; then + echo "Usage: $0 " + exit 1 +fi +if [ ! -d "$BACKUP_DIR" ]; then + echo "Directory $BACKUP_DIR does not exist" + exit 1 +fi + +#docker stop "$CONTAINER_NAME" +#docker commit "$CONTAINER_NAME" "${CONTAINER_NAME}_backup" +#docker save -o "$BACKUP_DIR/${CONTAINER_NAME}_backup.tar" "${CONTAINER_NAME}_backup" +#docker start "$CONTAINER_NAME" +#docker image rm -f "${CONTAINER_NAME}_backup" + +# Backup volume +if [ "$VOLUME_NAME" ]; then + echo "Backup up volume $VOLUME_NAME" + docker run --rm -v "$VOLUME_NAME":/data -v "$BACKUP_DIR":/backup busybox tar czf /backup/"$VOLUME_NAME".tar.gz -C /data . +fi + +# Extract image name +# IMAGE=$(docker inspect --format '{{.Config.Image}}' "$CONTAINER_NAME") +IMAGE="${CONTAINER_NAME}_backup" +# Extract ports +PORTS=$(docker inspect --format '{{json .HostConfig.PortBindings}}' "$CONTAINER_NAME" | jq -r 'to_entries | map("-p \(.value[0].HostPort):\(.key | sub("/tcp|/udp"; ""))") | join(" ")') +# Extract volumes +VOLUMES=$(docker inspect --format '{{json .Mounts}}' "$CONTAINER_NAME" | jq -r '.[] | select(.Type == "bind" or .Type == "volume") | "-v " + .Source + ":" + .Destination' | xargs) +# Extract environment variables +ENV_VARS=$(docker inspect --format '{{json .Config.Env}}' "$CONTAINER_NAME" | jq -r 'map("-e " + .) | join(" ")') +# Extract network mode +NETWORK_MODE=$(docker inspect --format '{{.HostConfig.NetworkMode}}' "$CONTAINER_NAME") +[ "$NETWORK_MODE" != "default" ] && NETWORK="--network=$NETWORK_MODE" || NETWORK="" +# Extract restart policy +RESTART_POLICY=$(docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' "$CONTAINER_NAME") +[ "$RESTART_POLICY" != "no" ] && RESTART="--restart=$RESTART_POLICY" || RESTART="" +# Extract privileged mode +PRIVILEGED=$(docker inspect --format '{{.HostConfig.Privileged}}' "$CONTAINER_NAME") +[ "$PRIVILEGED" == "true" ] && PRIV="--privileged" || PRIV="" +# Extract entrypoint (if set) +ENTRYPOINT=$(docker inspect --format '{{json .Config.Entrypoint}}' "$CONTAINER_NAME" | jq -r 'if . != null then "--entrypoint \"" + join(" ") + "\"" else "" end') +# Extract command (CMD) +CMD=$(docker inspect --format '{{json .Config.Cmd}}' "$CONTAINER_NAME" | jq -r 'if . != null then join(" ") else "" end') +# Construct final `docker run` command +RUN_COMMAND="docker run -d --name $CONTAINER_NAME $PORTS $VOLUMES $ENV_VARS $NETWORK $RESTART $PRIV $ENTRYPOINT $IMAGE $CMD" + +# echo "$RUN_COMMAND" +echo "$RUN_COMMAND" > "$BACKUP_DIR/${CONTAINER_NAME}_deploy.sh" diff --git a/Docker/installPortainer.sh b/Docker/installPortainer.sh new file mode 100644 index 0000000..52a6645 --- /dev/null +++ b/Docker/installPortainer.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +PRIMARY_NIC=$(ip route | awk '/default/ {print $5}') +IP_ADDRESS=$(ip -4 addr show "$PRIMARY_NIC" | awk '/inet / {print $2}' | cut -d/ -f1) + +if ! [ -x "$(command -v docker)" ]; then + read -p "Docker not detected. Do you want to install it?" -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "Installing docker" + # https://docs.docker.com/engine/install/ubuntu/ + # Add Docker's official GPG key: + sudo apt-get update + sudo apt-get install ca-certificates curl + sudo install -m 0755 -d /etc/apt/keyrings + sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc + sudo chmod a+r /etc/apt/keyrings/docker.asc + + # Add the repository to Apt sources: + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + sudo apt-get update + + sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + else + exit 1 + fi +fi +if [ ! "$(docker ps -a -q -f name=portainer)" ]; then + echo "Installing portainer" + if ! (docker volume ls --format "{{.Name}}" | grep -q "^portainer_data$"); then + echo "Create portainer volume" + docker volume create portainer_data + fi + docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts +fi + +echo "You can now access Portainer on https://$IP_ADDRESS:9443" diff --git a/Docker/restoreContainer.sh b/Docker/restoreContainer.sh new file mode 100644 index 0000000..97eb848 --- /dev/null +++ b/Docker/restoreContainer.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +CONTAINER_NAME="$1" +BACKUP_DIR="$2" +VOLUME_NAME="$3" + +if [ -z "$BACKUP_DIR" ]; then + echo "Usage: $0 " + exit 1 +fi +if [ ! -d "$BACKUP_DIR" ]; then + echo "Directory $BACKUP_DIR does not exist" + exit 1 +fi + +# Load image +docker load -i "$BACKUP_DIR/${CONTAINER_NAME}_backup.tar" + +if [ ! -f "${BACKUP_DIR}/${VOLUME_NAME}".tar.gz ]; then + echo "Restoring volume ${VOLUME_NAME}" + docker volume create "$VOLUME_NAME" + docker run --rm -v "$VOLUME_NAME":/data -v "$BACKUP_DIR":/backup busybox tar xzf /backup/"$VOLUME_NAME".tar.gz -C /data +fi + +echo "Restore complete. Deploy using: ${BACKUP_DIR}/${CONTAINER_NAME}_deploy.sh"