docker backups
> Updating README > Adding bash script
This commit is contained in:
parent
0ed9836d58
commit
2923de827e
@ -0,0 +1,56 @@
|
|||||||
|
<h1 align="center">Docker Backups</h1>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
A bash script that will stop all running containers. Create a <strong>.tar.gz</strong> files of those stopped containers then upload them to a specified save location. After the containers are successfully saved, it will proceed to restart them.
|
||||||
|
</br>
|
||||||
|
The script will log each step of the process including the time it takes for the script to execute.
|
||||||
|
</br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
You will need to change `[USERNAME]` to the one you use on your server. You will find this in **(3)** parts of the script.
|
||||||
|
|
||||||
|
## Folder Structure
|
||||||
|
|
||||||
|
If you have not done so already, create a new folder called `scripts` in your **~home** folder. This is where all your scripts will go.
|
||||||
|
|
||||||
|
Inside your `scripts` folder create a new folder called `backups`
|
||||||
|
|
||||||
|
When done your folders structure should look like this: `/home/[username]/scripts/backups`
|
||||||
|
|
||||||
|
## Script
|
||||||
|
|
||||||
|
Get the source code from this repo and save it as `docker_backups.sh` in the **backups** folder created in the previous step.
|
||||||
|
|
||||||
|
Next we need to change the permissions of this file so that the server can read it.
|
||||||
|
|
||||||
|
1. Right click on `docker_backups.sh` then Properties.
|
||||||
|
|
||||||
|
2. Click on `Permissions` tab at top.
|
||||||
|
|
||||||
|
3. Make sure Owner & Group reflect your `username` with `Read and Write` access to all.
|
||||||
|
|
||||||
|
4. Check the `Execute` box to allow executing the file as a program.
|
||||||
|
|
||||||
|
5. Close out the window.
|
||||||
|
|
||||||
|
## Run
|
||||||
|
|
||||||
|
Now we need to test and run the script.
|
||||||
|
|
||||||
|
* Make sure your terminal is open to the location of the `docker_backups.sh` file. Should be `~/scripts/backups`
|
||||||
|
|
||||||
|
* Run the script:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash docker_backups.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
The script should be running and should be printing to the terminal what step its on. This process will take a few minutes or so depending on how many running containers you have.
|
||||||
|
|
||||||
|
## Automation
|
||||||
|
|
||||||
|
Now the script will need to be automated so that you will have current backups incase you need them. This can be automated using *Linux Mint's* built in <div><a href="https://www.fosslinux.com/106902/the-guide-to-mastering-cron-jobs-in-linux-mint.htm" target="blank"><strong>crontab</strong></a></div> system to create a `cron` job. **Crontab** is managed with the terminal and ***does not*** have a GUI.
|
||||||
|
|
||||||
|
I have not found a good GUI option for crontab as of yet however, I have found and use an application called <div><a href="https://wiki.euronvault.com/podfetch" target="blank"><strong>Cronicle</strong></a>.</div> Cronicle is task scheduler that functions like **crontab** but only with a GUI.
|
96
docker_backups/docker_backups.sh
Executable file
96
docker_backups/docker_backups.sh
Executable file
@ -0,0 +1,96 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Make sure to set username to your own.
|
||||||
|
# You will need to change it in (3) places.
|
||||||
|
#
|
||||||
|
# [USERNAME]
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Location of the log file
|
||||||
|
LOGFILE="/home/[USERNAME]/scripts/backups/docker_backups_logs/docker_backups.log"
|
||||||
|
|
||||||
|
# Location of backup files. This can be a mapped NAS location if needed.
|
||||||
|
BACKUPLOCATION="/home/[USERNAME]/server_backups/docker_zips/"
|
||||||
|
|
||||||
|
# Generate a timestamp
|
||||||
|
timestamp=$(date +"%Y-%m-%d")
|
||||||
|
|
||||||
|
# Capture the start time
|
||||||
|
start_time=$(date +%s)
|
||||||
|
|
||||||
|
# Log the start of the backup
|
||||||
|
echo "[$(date +"%Y-%m-%d %H:%M:%S")] Starting backup" | tee -a "$LOGFILE"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Step 0: Delete backups older than two weeks
|
||||||
|
echo "[$(date +"%Y-%m-%d %H:%M:%S")] Deleting backups older than two weeks..." | tee -a "$LOGFILE"
|
||||||
|
sudo find "$BACKUPLOCATION" -name "docker_backups_*.tar.gz" -mtime +14 -exec rm {} \; 2>&1 | tee -a "$LOGFILE"
|
||||||
|
|
||||||
|
# Capture the list of running Docker containers
|
||||||
|
running_containers=$(sudo docker ps --format "{{.Names}}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Check if there are any running containers
|
||||||
|
echo " " | tee -a "$LOGFILE"
|
||||||
|
echo " " | tee -a "$LOGFILE"
|
||||||
|
|
||||||
|
if [ -z "$running_containers" ]; then
|
||||||
|
echo "[$(date +"%Y-%m-%d %H:%M:%S")] No Docker containers are running." | tee -a "$LOGFILE"
|
||||||
|
else
|
||||||
|
echo "[$(date +"%Y-%m-%d %H:%M:%S")] Currently running Docker containers:" | tee -a "$LOGFILE"
|
||||||
|
echo "$running_containers" | tee -a "$LOGFILE"
|
||||||
|
|
||||||
|
# Step 1: Stop all running Docker containers
|
||||||
|
echo " " | tee -a "$LOGFILE"
|
||||||
|
echo " " | tee -a "$LOGFILE"
|
||||||
|
echo "[$(date +"%Y-%m-%d %H:%M:%S")] Stopping all running Docker containers..." | tee -a "$LOGFILE"
|
||||||
|
sudo docker stop $running_containers 2>&1 | tee -a "$LOGFILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Step 2: Create a tarball (zip) of your custom Docker folder with a timestamp
|
||||||
|
echo " " | tee -a "$LOGFILE"
|
||||||
|
echo " " | tee -a "$LOGFILE"
|
||||||
|
echo "[$(date +"%Y-%m-%d %H:%M:%S")] Creating tarball backup of custom Docker directory..." | tee -a "$LOGFILE"
|
||||||
|
|
||||||
|
# Create backup in backup location defined above
|
||||||
|
sudo tar czvf "${BACKUPLOCATION}docker_backups_${timestamp}.tar.gz" /home/[USERNAME]/docker 2>&1 | tee -a "$LOGFILE"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Step 3: Restart all previously running Docker containers if any were running
|
||||||
|
if [ -n "$running_containers" ]; then
|
||||||
|
echo " " | tee -a "$LOGFILE"
|
||||||
|
echo " " | tee -a "$LOGFILE"
|
||||||
|
echo "[$(date +"%Y-%m-%d %H:%M:%S")] Restarting all previously running Docker containers..." | tee -a "$LOGFILE"
|
||||||
|
sudo docker start $running_containers 2>&1 | tee -a "$LOGFILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Capture the end time
|
||||||
|
end_time=$(date +%s)
|
||||||
|
|
||||||
|
# Calculate the duration in minutes and remaining seconds
|
||||||
|
duration=$((end_time - start_time))
|
||||||
|
minutes=$((duration / 60))
|
||||||
|
seconds=$((duration % 60))
|
||||||
|
|
||||||
|
# Log and display the duration
|
||||||
|
echo " " | tee -a "$LOGFILE"
|
||||||
|
echo " " | tee -a "$LOGFILE"
|
||||||
|
echo "[$(date +"%Y-%m-%d %H:%M:%S")] Backup process completed in ${minutes} minutes, ${seconds} seconds." | tee -a "$LOGFILE"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user