aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docker/auto-backup/Dockerfile10
-rw-r--r--docker/auto-backup/daemon.bash58
-rw-r--r--template/docker-compose.yaml.template17
-rw-r--r--template/rclone.conf.template7
-rwxr-xr-xtool/aio.py15
5 files changed, 104 insertions, 3 deletions
diff --git a/docker/auto-backup/Dockerfile b/docker/auto-backup/Dockerfile
new file mode 100644
index 0000000..a180740
--- /dev/null
+++ b/docker/auto-backup/Dockerfile
@@ -0,0 +1,10 @@
+FROM rsync/rsync:latest
+ARG CRUPEST_AUTO_BACKUP_BUCKET_NAME
+ARG CRUPEST_AUTO_BACKUP_INIT_DELAY=0
+ARG CRUPEST_AUTO_BACKUP_INTERVAL=1d
+ENV CRUPEST_AUTO_BACKUP_INIT_DELAY=${CRUPEST_AUTO_BACKUP_INIT_DELAY}
+ENV CRUPEST_AUTO_BACKUP_INTERVAL=${CRUPEST_AUTO_BACKUP_INTERVAL}
+ENV CRUPEST_AUTO_BACKUP_BUCKET_NAME=${CRUPEST_AUTO_BACKUP_BUCKET_NAME}
+COPY daemon.bash /daemon.bash
+VOLUME [ "/data", "/config/rclone/rclone.conf" ]
+ENTRYPOINT [ "/daemon.bash" ]
diff --git a/docker/auto-backup/daemon.bash b/docker/auto-backup/daemon.bash
new file mode 100644
index 0000000..db49e9b
--- /dev/null
+++ b/docker/auto-backup/daemon.bash
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash
+
+set -e
+
+# Check I'm root.
+if [[ $EUID -ne 0 ]]; then
+ echo "This script must be run as root" 1>&2
+ exit 1
+fi
+
+# Check if CRUPEST_AUTO_BACKUP_BUCKET_NAME is defined.
+if [[ -z "$CRUPEST_AUTO_BACKUP_BUCKET_NAME" ]]; then
+ echo "CRUPEST_AUTO_BACKUP_BUCKET_NAME is not defined or empty"
+ exit 1
+fi
+
+rclone --version
+
+# Check xz and tar
+xz --version
+tar --version
+
+function backup {
+ # Output "Begin backup..." in yellow and restore default
+ echo -e "\e[0;103m\e[K\e[1mBegin backup..." "\e[0m"
+
+ # Get current time and convert it to YYYY-MM-DDTHH.MM.SS
+ current_time=$(date +%Y-%m-%dT%H.%M.%S)
+ echo "Current time: $current_time"
+ echo "Create tar.xz for data..."
+
+ # tar and xz /data to tmp
+ tar -cJf /tmp/data.tar.xz -C / data
+
+ echo "Use rclone to upload data..."
+ # upload to remote
+ rclone copyto /tmp/data.tar.xz "mycos:$CRUPEST_AUTO_BACKUP_BUCKET_NAME/$current_time.tar.xz"
+
+ echo "Remove tmp file..."
+ # remove tmp
+ rm /tmp/data.tar.xz
+
+ # echo "Backup finished!" in green and restore default
+ echo -e "\e[0;102m\e[K\e[1mFinish backup!" "\e[0m"
+}
+
+echo "Initial delay: $CRUPEST_AUTO_BACKUP_INIT_DELAY"
+sleep "$CRUPEST_AUTO_BACKUP_INIT_DELAY"
+
+# forever loop
+while true; do
+ backup
+
+ # sleep for CRUPEST_AUTO_BACKUP_INTERVAL
+ echo "Sleep for $CRUPEST_AUTO_BACKUP_INTERVAL for next backup..."
+ sleep "$CRUPEST_AUTO_BACKUP_INTERVAL"
+done
+
diff --git a/template/docker-compose.yaml.template b/template/docker-compose.yaml.template
index 83e383b..5982e62 100644
--- a/template/docker-compose.yaml.template
+++ b/template/docker-compose.yaml.template
@@ -100,6 +100,23 @@ services:
networks:
- internal
+ auto-backup:
+ pull_policy: build
+ build:
+ context: ./docker/auto-backup
+ dockerfile: Dockerfile
+ pull: true
+ args: CRUPEST_AUTO_BACKUP_BUCKET_NAME=${CRUPEST_AUTO_BACKUP_BUCKET_NAME}
+ tags:
+ - "crupest/auto-backup:latest"
+ container_name: auto-backup
+ volumes:
+ - "./data:/data:ro"
+ - "./rclone.conf:/config/rclone/rclone.conf:ro"
+ restart: on-failure:3
+ networks:
+ - internal
+
mailserver:
image: docker.io/mailserver/docker-mailserver:latest
pull_policy: always
diff --git a/template/rclone.conf.template b/template/rclone.conf.template
new file mode 100644
index 0000000..38ef2dd
--- /dev/null
+++ b/template/rclone.conf.template
@@ -0,0 +1,7 @@
+[mycos]
+type = s3
+provider = TencentCOS
+access_key_id = ${CRUPEST_AUTO_BACKUP_COS_ACCESS_KEY_ID}
+secret_access_key = ${CRUPEST_AUTO_BACKUP_COS_SECRET_ACCESS_KEY}
+endpoint = cos.${CRUPEST_AUTO_BACKUP_COS_REGION}.myqcloud.com
+acl = default
diff --git a/tool/aio.py b/tool/aio.py
index cdb616c..703b4f2 100755
--- a/tool/aio.py
+++ b/tool/aio.py
@@ -240,7 +240,7 @@ for filename in template_name_list:
class ConfigVar:
- def __init__(self, name: str, description: str, default_value_generator):
+ def __init__(self, name: str, description: str, default_value_generator, /, default_value_for_ask=None):
"""Create a config var.
Args:
@@ -251,10 +251,11 @@ class ConfigVar:
self.name = name
self.description = description
self.default_value_generator = default_value_generator
+ self.default_value_for_ask = default_value_for_ask
def get_default_value(self):
if isinstance(self.default_value_generator, str):
- return Prompt.ask(self.default_value_generator, console=console)
+ return Prompt.ask(self.default_value_generator, console=console, default=self.default_value_for_ask)
else:
return self.default_value_generator()
@@ -275,7 +276,15 @@ config_var_list: list = [
ConfigVar("CRUPEST_HALO_DB_PASSWORD",
"password for halo h2 database, once used never change it", lambda: os.urandom(8).hex()),
ConfigVar("CRUPEST_IN_CHINA",
- "set to true if you are in China, some network optimization will be applied", lambda: "false")
+ "set to true if you are in China, some network optimization will be applied", lambda: "false"),
+ ConfigVar("CRUPEST_AUTO_BACKUP_COS_ACCESS_KEY_ID",
+ "access key id for Tencent COS, used for auto backup", "Please input your Tencent COS access key id for backup:"),
+ ConfigVar("CRUPEST_AUTO_BACKUP_COS_SECRET_ACCESS_KEY",
+ "access key secret for Tencent COS, used for auto backup", "Please input your Tencent COS access key for backup:"),
+ ConfigVar("CRUPEST_AUTO_BACKUP_COS_REGION",
+ "region for Tencent COS, used for auto backup", "Please input your Tencent COS region for backup:", "ap-hongkong"),
+ ConfigVar("CRUPEST_AUTO_BACKUP_BUCKET_NAME",
+ "bucket name for Tencent COS, used for auto backup", "Please input your Tencent COS bucket name for backup:")
]
config_var_name_set = set([config_var.name for config_var in config_var_list])