https://github.com/chris2k20/volumes-backup
Migrate/Backup Docker-Volumes or Folders locally or to other Hosts (easy but safe)! This universal container will encrypt the backup-file and upload it to transfer.sh (see Environment- customize). Enables Migration to another platform (eg. from Docker to Kubernetes).
https://github.com/chris2k20/volumes-backup
backup container docker docker-compose kubernetes restore volume
Last synced: about 1 year ago
JSON representation
Migrate/Backup Docker-Volumes or Folders locally or to other Hosts (easy but safe)! This universal container will encrypt the backup-file and upload it to transfer.sh (see Environment- customize). Enables Migration to another platform (eg. from Docker to Kubernetes).
- Host: GitHub
- URL: https://github.com/chris2k20/volumes-backup
- Owner: chris2k20
- Created: 2021-04-30T11:04:33.000Z (about 5 years ago)
- Default Branch: main
- Last Pushed: 2021-05-13T13:30:51.000Z (about 5 years ago)
- Last Synced: 2025-04-01T15:13:10.127Z (about 1 year ago)
- Topics: backup, container, docker, docker-compose, kubernetes, restore, volume
- Language: Shell
- Homepage:
- Size: 17.6 KB
- Stars: 18
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Docker-Image: Universal volumes-backup
Purpose: **Migrate/Backup Container-Volumes or Folders locally or to other Hosts (easy but safe)!**
This universal container will encrypt the backup-file and upload it to [transfer.sh](https://transfer.sh/) (see Environment-customize). Enables Migration to another platform (eg. from Docker to Kubernetes).
No magic, very simple: This Image creates a tar-Archive from a folder (your volumes), saves it encrypted and uploads it, so that only you (and you alone) can access it everywhere.
Then the other way around (`MODE=restore`): download file (eg. `DOWNLOAD_URL=https://transfer.sh/U6TIL/backup-volumes.tar.gz.enc`), decrypt it and unzip it.
## General Usage
- Set your personal `KEY`, so that the backup-file can be safely AES-encrypted
- Different Folders for backup- and restore-mode to make sure the program does not overwrite the backup-data:
- backup-mode: Mount your source folders into the container (ReadOnly): under `/volumes-backup/` (or customize `BACKUP_FOLDER=/volumes-backup/`)
- restore-mode: Mount your destination folders into the container: under `/volumes-restore/` (or customize `RESTORE_FOLDER=/volumes-restore/`)
Important: **Mount the right folders in the right container-path in backup- and restore-mode!** (any name, here `volume1-myfiles` and `volume2-otherfolder`)
## Example:
### Backup-Mode
Part 1: The backup-mode to get a encrypted backup-file from the local folders `/home/user/myfolder/` and `/opt/otherfolder/`:
```bash
docker run -it --rm \
-e "MODE=backup" \
-e "KEY=MY_S3CReT_KeY" \
-v "/home/user/myfolder/:/volumes-backup/volume1-myfiles:ro" \
-v "/opt/otherfolder/:/volumes-backup/volume2-otherfolder:ro" \
--mount type=tmpfs,destination=/data \
user2k20/volumes-backup
```
The container **returns the unique url to the file**
### Restore-Mode
Part 2: Restore backup-file to the local folders `/home/user/myfolder/` and `/opt/otherfolder/`:
```bash
docker run -it --rm \
-e "MODE=restore" \
-e "KEY=MY_S3CReT_KeY" \
-e "DOWNLOAD_URL=https://transfer.sh/YOURURL/backup-volumes.tar.gz.enc" \
-v "/home/user/myfolder/:/volumes-restore/volume1-myfiles" \
-v "/opt/otherfolder/:/volumes-restore/volume2-otherfolder" \
--mount type=tmpfs,destination=/data \
user2k20/volumes-backup
```
To backup **whole docker volumes**: replace the absolute path from the example above `/home/user/myfolder/` with the name of the volume `myvolume1` (Docker Like):
```bash
-v "myvolume1:/volumes-restore/volume1-myfiles" \
```
## Offline Usage
NO ONLINE UPLOAD: The encrypted backup file will be saved to `/data/`, so create a volume under this path. If you set `UPLOAD_URL=` to zero, nothing gets uploaded.
```bash
# backup
docker run -it --rm \
-e "MODE=backup" \
-e "UPLOAD_URL=" \
-e "KEY=MY_S3CReT_KeY" \
-v "myvolume1:/volumes-backup/volume1-myvolume1:ro" \
-v "secondvolume:/volumes-backup/volume2-secondvolume:ro" \
-v "data:/data/" \
user2k20/volumes-backup
# restore
docker run -it --rm \
-e "MODE=restore" \
-e "DOWNLOAD_URL=" \
-e "KEY=MY_S3CReT_KeY" \
-v "myvolume1:/volumes-restore/volume1-myvolume1" \
-v "secondvolume:/volumes-restore/volume2-secondvolume" \
-v "data:/data/" \
user2k20/volumes-backup
```
## Kubernetes Job
An example manifest, which will run once as Job. It will restore the backup to the volume claims (here mysql and wordpress volumes). Replace all environment variables and the volume parts:
```yaml
apiVersion: batch/v1
kind: Job
metadata:
name: volumes-backup
spec:
template:
spec:
containers:
- name: volumes-backup
image: user2k20/volumes-backup
env:
- name: MODE
value: restore
- name: KEY
value: MY_S3CReT_KeY
- name: DOWNLOAD_URL
value: https://transfer.sh/YOURURL/backup-volumes.tar.gz.enc
volumeMounts:
- mountPath: /volumes-restore/volume1-wordpress
name: wordpress-claim0
- mountPath: /volumes-restore/volume2-mysql
name: mysql-claim0
- mountPath: /data
name: data-volume
restartPolicy: Never
volumes:
- name: wordpress-claim0
persistentVolumeClaim:
claimName: wordpress-claim0
- name: mysql-claim0
persistentVolumeClaim:
claimName: mysql-claim0
- name: data-volume
emptyDir: {}
backoffLimit: 0
```
## Environment Variables
**`MODE`**
This variable is mandatory and specifies the modus `backup` or `restore`
**`BACKUP_FOLDER`**
Sets the folder that will be backuped. Default: mount all your volumes under `/volumes-backup/`
**`BACKUP_FILE_NAME`**
The default backup name: `backup-volumes.tar.gz.enc`
**`BACKUP_FILE`**
Full path and filename. Default is `/data/${BACKUP_FILE_NAME}`
**`RESTORE_FOLDER`**
Where will the Backup be restored. Default is `/volumes-restore/`
**`KEY`**
This variable is mandatory and specifies the encryption key.
**`OPENSSL_PARAM`**
Parameters that are used to decrypt/encrypt the backup file. Default: `-aes-256-cbc`
**`UPLOAD_URL`**
For the backup-mode: Sets the URL where the encrypted backups will be sent to. Default here is: `https://transfer.sh/${BACKUP_FILE_NAME}` (host your [own transfer.sh container](https://github.com/dutchcoders/transfer.sh) – *great work by these guys!*).
**`DOWNLOAD_URL`**
For the restore-mode. Sets the download url, where is the backup file is saved. NO default. You need to set this variable to the output-URL of the backup-mode.
## Contributions
Contributions are always welcome.
## No guarantee and no support
If you find any mistakes or have an improvement, please leave a comment. 😋