From b9e5ab9983b7fe7c7c47767800e037ce089e83e9 Mon Sep 17 00:00:00 2001 From: ttionya Date: Fri, 5 Jun 2020 19:17:26 +0800 Subject: [PATCH] feat: add features --- Dockerfile | 12 ++++++ scripts/backup.sh | 77 ++++++++++++++++++++++++++++++++++++ scripts/entrypoint.sh | 14 +++++++ scripts/includes.sh | 91 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 194 insertions(+) create mode 100644 Dockerfile create mode 100644 scripts/backup.sh create mode 100644 scripts/entrypoint.sh create mode 100644 scripts/includes.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5f8d77a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM rclone/rclone:1.52.0 + +LABEL "repository"="https://github.com/ttionya/BitwardenRS-Backup" \ + "homepage"="https://github.com/ttionya/BitwardenRS-Backup" \ + "maintainer"="ttionya " + +COPY scripts/*.sh /app/ + +RUN chmod +x /app/*.sh \ + && apk add --no-cache sqlite zip + +ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/scripts/backup.sh b/scripts/backup.sh new file mode 100644 index 0000000..9c712b4 --- /dev/null +++ b/scripts/backup.sh @@ -0,0 +1,77 @@ +#!/bin/sh + +. /app/includes.sh + +BACKUP_DIR="/bitwarden/backup/" +BACKUP_FILE="${BACKUP_DIR}/backup.$(date +%Y%m%d).sqlite3" +BACKUP_FILE_ZIP="${BACKUP_FILE}.zip" + +function backup_clear_dir() { + rm -rf ${BACKUP_DIR} +} + +function backup() { + color blue "backup bitwarden_rs sqlite database" + + mkdir -p ${BACKUP_DIR} + + sqlite3 /bitwarden/data/db.sqlite3 ".backup ${BACKUP_FILE}" + + ls -lah ${BACKUP_DIR} +} + +function backup_package() { + if [[ "${ZIP_ENABLE}" == "TRUE" ]]; then + color blue "package backup file" + UPLOAD_FILE="${BACKUP_FILE_ZIP}" + + zip -jP ${ZIP_PASSWORD} ${BACKUP_FILE_ZIP} ${BACKUP_FILE} + + ls -lah ${BACKUP_DIR} + else + color yellow "skip package backup file" + UPLOAD_FILE="${BACKUP_FILE}" + fi +} + +function backup_upload() { + color blue "upload backup file to storage system" + + rclone copy ${UPLOAD_FILE} ${RCLONE_REMOTE} + if [[ $? != 0 ]]; then + color red "upload failed" + exit 1 + fi +} + +function backup_clear_history() { + if [[ "${BACKUP_KEEP_DAYS}" -gt 0 ]]; then + color blue "delete ${BACKUP_KEEP_DAYS} days ago backup files" + + RCLONE_DELETE_LIST=$(rclone lsf ${RCLONE_REMOTE} | head -n -${BACKUP_KEEP_DAYS}) + + for RCLONE_DELETE_FILE in ${RCLONE_DELETE_LIST} + do + color yellow "deleting ${RCLONE_DELETE_FILE}" + + rclone delete ${RCLONE_REMOTE}/${RCLONE_DELETE_FILE} + if [[ $? != 0 ]]; then + color red "delete ${RCLONE_DELETE_FILE} failed" + fi + done + fi +} + +color blue "running backup program..." + +init_env +check_rclone_connection + +backup_clear_dir +backup +backup_package +backup_upload +backup_clear_dir +backup_clear_history + +color none "" diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh new file mode 100644 index 0000000..835f35d --- /dev/null +++ b/scripts/entrypoint.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +. /app/includes.sh + +function configure_cron() { + echo "${CRON} sh /app/backup.sh > /dev/stdout" >> /etc/crontabs/root +} + +init_env +check_rclone_connection +configure_cron + +# foreground run crond +crond -l 2 -f diff --git a/scripts/includes.sh b/scripts/includes.sh new file mode 100644 index 0000000..be9450c --- /dev/null +++ b/scripts/includes.sh @@ -0,0 +1,91 @@ +#!/bin/sh + +#################### Function #################### +######################################## +# Print colorful message. +# Arguments: +# color +# message +# Outputs: +# colorful message +######################################## +function color() { + case $1 in + red) echo -e "\033[31m$2\033[0m" ;; + green) echo -e "\033[32m$2\033[0m" ;; + yellow) echo -e "\033[33m$2\033[0m" ;; + blue) echo -e "\033[34m$2\033[0m" ;; + none) echo $2 ;; + esac +} + +######################################## +# Check storage system connection success. +# Arguments: +# None +######################################## +function check_rclone_connection() { + rclone mkdir ${RCLONE_REMOTE} + if [[ $? != 0 ]]; then + color red "storage system connection failure" + exit 1 + fi +} + +######################################## +# Initialization environment variables. +# Arguments: +# None +# Outputs: +# environment variables +######################################## +function init_env() { + # CRON + local CRON_DEFAULT="0 1 * * *" + if [[ -z "${CRON}" ]]; then + CRON="${CRON_DEFAULT}" + fi + + # RCLONE_REMOTE_NAME + local RCLONE_REMOTE_NAME_DEFAULT="BitwardenBackup" + if [[ -z "${RCLONE_REMOTE_NAME}" ]]; then + RCLONE_REMOTE_NAME="${RCLONE_REMOTE_NAME_DEFAULT}" + fi + + # RCLONE_REMOTE_DIR + local RCLONE_REMOTE_DIR_DEFAULT="/BitwardenBackup/" + if [[ -z "${RCLONE_REMOTE_DIR}" ]]; then + RCLONE_REMOTE_DIR="${RCLONE_REMOTE_DIR_DEFAULT}" + fi + + # RCLONE_REMOTE + RCLONE_REMOTE="${RCLONE_REMOTE_NAME}:${RCLONE_REMOTE_DIR}" + + # ZIP_ENABLE + if [[ $(echo "${ZIP_ENABLE}" | tr '[a-z]' '[A-Z]') == "FALSE" ]]; then + ZIP_ENABLE="FALSE" + else + ZIP_ENABLE="TRUE" + fi + + # ZIP_PASSWORD + if [[ -z "${ZIP_PASSWORD}" ]]; then + ZIP_PASSWORD="WHEREISMYPASSWORD?" + fi + + # BACKUP_KEEP_DAYS + local BACKUP_KEEP_DAYS_DEFAULT="0" + if [[ -z "${BACKUP_KEEP_DAYS}" ]]; then + BACKUP_KEEP_DAYS="${BACKUP_KEEP_DAYS_DEFAULT}" + fi + + color yellow "========================================" + color yellow "CRON: ${CRON}" + color yellow "RCLONE_REMOTE_NAME: ${RCLONE_REMOTE_NAME}" + color yellow "RCLONE_REMOTE_DIR: ${RCLONE_REMOTE_DIR}" + color yellow "RCLONE_REMOTE: ${RCLONE_REMOTE}" + color yellow "ZIP_ENABLE: ${ZIP_ENABLE}" + color yellow "ZIP_PASSWORD: ${#ZIP_PASSWORD} Chars" + color yellow "BACKUP_KEEP_DAYS: ${BACKUP_KEEP_DAYS}" + color yellow "========================================" +}