From 3740262e8c71b0926a16be9e6a01115f46e31942 Mon Sep 17 00:00:00 2001 From: ttionya Date: Sun, 11 Dec 2022 20:30:47 +0800 Subject: [PATCH] feat: support postgresql database --- scripts/backup.sh | 29 ++++++++++++++++++++++++----- scripts/entrypoint.sh | 8 ++++++++ scripts/includes.sh | 40 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/scripts/backup.sh b/scripts/backup.sh index 51a33c6..2e1ee62 100644 --- a/scripts/backup.sh +++ b/scripts/backup.sh @@ -8,8 +8,10 @@ function clear_dir() { function backup_init() { NOW="$(date +"${BACKUP_FILE_DATE_FORMAT}")" - # backup vaultwarden database file - BACKUP_FILE_DB="${BACKUP_DIR}/db.${NOW}.sqlite3" + # backup vaultwarden database file (sqlite) + BACKUP_FILE_DB_SQLITE="${BACKUP_DIR}/db.${NOW}.sqlite3" + # backup vaultwarden database file (postgresql) + BACKUP_FILE_DB_POSTGRESQL="${BACKUP_DIR}/db.${NOW}.dump" # backup vaultwarden config file BACKUP_FILE_CONFIG="${BACKUP_DIR}/config.${NOW}.json" # backup vaultwarden rsakey files @@ -22,16 +24,29 @@ function backup_init() { BACKUP_FILE_ZIP="${BACKUP_DIR}/backup.${NOW}.${ZIP_TYPE}" } -function backup_db() { +function backup_db_sqlite() { color blue "backup vaultwarden sqlite database" if [[ -f "${DATA_DB}" ]]; then - sqlite3 "${DATA_DB}" ".backup '${BACKUP_FILE_DB}'" + sqlite3 "${DATA_DB}" ".backup '${BACKUP_FILE_DB_SQLITE}'" else color yellow "not found vaultwarden sqlite database, skipping" fi } +function backup_db_postgresql() { + color blue "backup vaultwarden postgresql database" + + pg_dump -Fc -h "${PG_HOST}" -p "${PG_PORT}" -d "${PG_DBNAME}" -U "${PG_USERNAME}" -f "${BACKUP_FILE_DB_POSTGRESQL}" + if [[ $? != 0 ]]; then + color red "backup vaultwarden postgresql database failed" + + send_mail_content "FALSE" "Backup failed at $(date +"%Y-%m-%d %H:%M:%S %Z"). Reason: Backup postgresql database failed." + + exit 1 + fi +} + function backup_config() { color blue "backup vaultwarden config" @@ -90,7 +105,11 @@ function backup_sends() { function backup() { mkdir -p "${BACKUP_DIR}" - backup_db + case "${DB_TYPE}" in + SQLITE) backup_db_sqlite ;; + POSTGRESQL) backup_db_postgresql ;; + esac + backup_config backup_rsakey backup_attachments diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh index 0fccb1b..a79cedf 100644 --- a/scripts/entrypoint.sh +++ b/scripts/entrypoint.sh @@ -36,6 +36,13 @@ if [[ "$1" == "restore" ]]; then exit 0 fi +function configure_postgresql() { + if [[ "${DB_TYPE}" == "POSTGRESQL" ]]; then + echo "${PG_HOST}:${PG_PORT}:${PG_DBNAME}:${PG_USERNAME}:${PG_PASSWORD}" > ~/.pgpass + chmod 0600 ~/.pgpass + fi +} + function configure_timezone() { ln -sf "/usr/share/zoneinfo/${TIMEZONE}" "${LOCALTIME_FILE}" } @@ -49,6 +56,7 @@ function configure_cron() { init_env check_rclone_connection +configure_postgresql configure_timezone configure_cron diff --git a/scripts/includes.sh b/scripts/includes.sh index c2f85ea..671775b 100644 --- a/scripts/includes.sh +++ b/scripts/includes.sh @@ -237,6 +237,7 @@ function init_env() { export_env_file init_env_dir + init_env_db init_env_mail # CRON @@ -305,11 +306,19 @@ function init_env() { color yellow "========================================" color yellow "DATA_DIR: ${DATA_DIR}" - color yellow "DATA_DB: ${DATA_DB}" color yellow "DATA_CONFIG: ${DATA_CONFIG}" color yellow "DATA_RSAKEY: ${DATA_RSAKEY}" color yellow "DATA_ATTACHMENTS: ${DATA_ATTACHMENTS}" color yellow "DATA_SENDS: ${DATA_SENDS}" + color yellow "========================================" + color yellow "DB_TYPE: ${DB_TYPE}" + + if [[ "${DB_TYPE}" == "POSTGRESQL" ]]; then + color yellow "DB_URL: ${PG_HOST}:${PG_PORT}:${PG_DBNAME}:${PG_USERNAME}:***(${#PG_PASSWORD} Chars)" + else + color yellow "DATA_DB: ${DATA_DB}" + fi + color yellow "========================================" color yellow "CRON: ${CRON}" @@ -369,6 +378,35 @@ function init_env_dir() { DATA_SENDS_BASENAME="$(basename "${DATA_SENDS}")" } +function init_env_db() { + # DB_TYPE + get_env DB_TYPE + + if [[ "${DB_TYPE^^}" == "POSTGRESQL" ]]; then # postgresql + DB_TYPE="POSTGRESQL" + + # PG_HOST + get_env PG_HOST + + # PG_PORT + get_env PG_PORT + PG_PORT="${PG_PORT:-"5432"}" + + # PG_DBNAME + get_env PG_DBNAME + PG_DBNAME="${PG_DBNAME:-"vaultwarden"}" + + # PG_USERNAME + get_env PG_USERNAME + PG_USERNAME="${PG_USERNAME:-"vaultwarden"}" + + # PG_PASSWORD + get_env PG_PASSWORD + else # sqlite + DB_TYPE="SQLITE" + fi +} + function init_env_mail() { # MAIL_SMTP_ENABLE # MAIL_TO