Initial commit
This commit is contained in:
commit
9b3e1af9d6
|
@ -0,0 +1,32 @@
|
||||||
|
# Description: Sample .env file for docker-compose
|
||||||
|
# Copy this file to .env and edit it to your needs
|
||||||
|
|
||||||
|
# ssh://host:port/path/to/repo
|
||||||
|
BORG_REPO=
|
||||||
|
|
||||||
|
# remote url
|
||||||
|
SERVER=
|
||||||
|
|
||||||
|
# borg passphrase
|
||||||
|
BORG_PASSPHRASE=
|
||||||
|
|
||||||
|
# prune settings
|
||||||
|
MINUTELY=60
|
||||||
|
HOURLY=24
|
||||||
|
DAILY=7
|
||||||
|
WEEKLY=4
|
||||||
|
|
||||||
|
# cron format: minute hour day month day_of_week
|
||||||
|
# cron example: every 5 minutes: SCHEDULE='*/5 * * * *'
|
||||||
|
# cron at 3am and 12am: SCHEDULE='0 3,12 * *
|
||||||
|
SCHEDULE='* * * * *'
|
||||||
|
|
||||||
|
# folder to backup
|
||||||
|
SRC=
|
||||||
|
# path to ssh key
|
||||||
|
SSH_KEY=
|
||||||
|
# backup name
|
||||||
|
HOSTNAME=
|
||||||
|
|
||||||
|
# don't change this
|
||||||
|
COMMAND='/backup.sh backup'
|
|
@ -0,0 +1,2 @@
|
||||||
|
.env
|
||||||
|
restore
|
|
@ -0,0 +1,21 @@
|
||||||
|
FROM debian:latest
|
||||||
|
|
||||||
|
ENV COMMAND="/usr/bin/backup backup"
|
||||||
|
|
||||||
|
COPY --from=docker:dind /usr/local/bin/docker /usr/local/bin/
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -yq python3 python3-pip trickle wget cron openssh-client info redis-tools mariadb-client postgresql-client iputils-ping borgbackup
|
||||||
|
|
||||||
|
RUN wget https://github.com/borgbackup/borg/releases/download/1.2.3/borg-linuxnew64 -O /usr/local/bin/borg &&\
|
||||||
|
chown root:root /usr/local/bin/borg && \
|
||||||
|
chmod 755 /usr/local/bin/borg
|
||||||
|
|
||||||
|
RUN mkdir /root/.ssh && ln -s /run/secrets/ssh_key /root/.ssh/id_rsa
|
||||||
|
|
||||||
|
COPY entry.sh /entry.sh
|
||||||
|
|
||||||
|
COPY backup.sh /usr/bin/backup
|
||||||
|
|
||||||
|
VOLUME [ "/src", "/dest" ]
|
||||||
|
|
||||||
|
ENTRYPOINT [ "/entry.sh" ]
|
|
@ -0,0 +1,32 @@
|
||||||
|
# Backup
|
||||||
|
Borg based backups
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```cp .env.sample .env```
|
||||||
|
|
||||||
|
### Init Repo
|
||||||
|
|
||||||
|
```docker-compose run --rm backup init```
|
||||||
|
|
||||||
|
### Run on Schedule
|
||||||
|
|
||||||
|
```docker-compose up -d```
|
||||||
|
|
||||||
|
### Create a Backup
|
||||||
|
|
||||||
|
```docker-compose run --rm backup backup```
|
||||||
|
|
||||||
|
### List Backups
|
||||||
|
|
||||||
|
```docker-compose run --rm backup list```
|
||||||
|
|
||||||
|
### Delete Backup
|
||||||
|
|
||||||
|
```docker-compose run --rm backup delete [backup]```
|
||||||
|
|
||||||
|
### Restore Backup
|
||||||
|
|
||||||
|
```docker-compose run --rm restore [backup]```
|
||||||
|
|
||||||
|
The restored backup can be found at ./restore
|
|
@ -0,0 +1,105 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Create a backup, prune old backups, compact the repository, and list the contents
|
||||||
|
backup() {
|
||||||
|
#check PRE_COMMAND exists
|
||||||
|
if [[ -n $PRE_COMMAND ]]; then
|
||||||
|
echo "Running pre-command"
|
||||||
|
eval $PRE_COMMAND
|
||||||
|
fi
|
||||||
|
create
|
||||||
|
prune
|
||||||
|
compact
|
||||||
|
list
|
||||||
|
#check POST_COMMAND exists
|
||||||
|
if [[ -n $POST_COMMAND ]]; then
|
||||||
|
echo "Running post-command"
|
||||||
|
eval $POST_COMMAND
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Initialize the repository
|
||||||
|
init() {
|
||||||
|
echo "Initializing repository"
|
||||||
|
/usr/local/bin/borg init --encryption=repokey $BORG_REPO
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a backup
|
||||||
|
create() {
|
||||||
|
echo "Creating backup"
|
||||||
|
/usr/local/bin/borg create --compression zstd,1 $BORG_REPO::'{hostname}-{now}' /src
|
||||||
|
}
|
||||||
|
|
||||||
|
# List the contents of the repository
|
||||||
|
list() {
|
||||||
|
echo "Listing repository"
|
||||||
|
/usr/local/bin/borg list $BORG_REPO
|
||||||
|
}
|
||||||
|
|
||||||
|
PRUNE=""
|
||||||
|
|
||||||
|
# Clean up old backups
|
||||||
|
prune() {
|
||||||
|
echo "Pruning repository"
|
||||||
|
if [[ -n $MINUTELY ]]; then
|
||||||
|
PRUNE="--keep-minutely ${MINUTELY}"
|
||||||
|
fi
|
||||||
|
if [[ -n $HOURLY ]]; then
|
||||||
|
PRUNE="${PRUNE} --keep-hourly ${HOURLY}"
|
||||||
|
fi
|
||||||
|
if [[ -n $DAILY ]]; then
|
||||||
|
PRUNE="${PRUNE} --keep-daily ${DAILY}"
|
||||||
|
fi
|
||||||
|
if [[ -n $WEEKLY ]]; then
|
||||||
|
PRUNE="${PRUNE} --keep-weekly ${WEEKLY}"
|
||||||
|
fi
|
||||||
|
if [[ -n $MONTHLY ]]; then
|
||||||
|
PRUNE="${PRUNE} --keep-monthly ${MONTHLY}"
|
||||||
|
fi
|
||||||
|
/usr/local/bin/borg prune $PRUNE $BORG_REPO
|
||||||
|
}
|
||||||
|
|
||||||
|
# Compact the repository
|
||||||
|
compact() {
|
||||||
|
echo "Compacting repository"
|
||||||
|
/usr/local/bin/borg compact $BORG_REPO
|
||||||
|
}
|
||||||
|
|
||||||
|
delete() {
|
||||||
|
echo "Deleting repository"
|
||||||
|
/usr/local/bin/borg delete $BORG_REPO $2
|
||||||
|
}
|
||||||
|
|
||||||
|
restore() {
|
||||||
|
echo "Restoring backup"
|
||||||
|
echo $2
|
||||||
|
#Restore dir
|
||||||
|
cd $RESTORE_PATH
|
||||||
|
/usr/local/bin/borg -v extract ${BORG_REPO}::$BACKUP
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ $1 == "backup" ]]; then
|
||||||
|
backup
|
||||||
|
elif [[ $1 == "init" ]]; then
|
||||||
|
init
|
||||||
|
elif [[ $1 == "create" ]]; then
|
||||||
|
create
|
||||||
|
elif [[ $1 == "list" ]]; then
|
||||||
|
list
|
||||||
|
elif [[ $1 == "prune" ]]; then
|
||||||
|
prune
|
||||||
|
elif [[ $1 == "compact" ]]; then
|
||||||
|
compact
|
||||||
|
elif [[ $1 == "delete" ]]; then
|
||||||
|
delete
|
||||||
|
elif [[ $1 == "restore" ]]; then
|
||||||
|
BACKUP=$2
|
||||||
|
RESTORE_PATH=$3
|
||||||
|
restore
|
||||||
|
elif [[ $1 == "bash" ]]; then
|
||||||
|
bash
|
||||||
|
elif [[ $1 == "server" ]]; then
|
||||||
|
/usr/local/bin/borg serve --restrict-to-path /data
|
||||||
|
else
|
||||||
|
echo "Invalid command"
|
||||||
|
fi
|
|
@ -0,0 +1,21 @@
|
||||||
|
version: '3.9'
|
||||||
|
|
||||||
|
services:
|
||||||
|
backup:
|
||||||
|
image: backup
|
||||||
|
hostname: ${HOSTNAME}
|
||||||
|
build: ./
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
ports:
|
||||||
|
- 24:22
|
||||||
|
volumes:
|
||||||
|
- ${SRC}
|
||||||
|
- ./restore:/restore
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
secrets:
|
||||||
|
- ssh_key
|
||||||
|
|
||||||
|
secrets:
|
||||||
|
ssh_key:
|
||||||
|
file: ${SSH_KEY}
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo $@
|
||||||
|
|
||||||
|
echo "Host ${SERVER}\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config
|
||||||
|
|
||||||
|
if [[ -z $@ ]]; then
|
||||||
|
crontab -l ; echo "${SCHEDULE} ${COMMAND} > /proc/1/fd/1 2> /proc/1/fd/2" | crontab
|
||||||
|
printenv | grep -v "no_proxy" >> /etc/environment
|
||||||
|
echo Starting Cron
|
||||||
|
cron -f
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
/usr/bin/backup $@
|
Loading…
Reference in New Issue