Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
postgresql_barman_configuration [2025/03/20 19:10] – andonovj | postgresql_barman_configuration [2025/05/11 18:12] (current) – [Backup to OCI] andonovj | ||
---|---|---|---|
Line 554: | Line 554: | ||
</ | </ | ||
+ | |||
+ | =====Backup to OCI===== | ||
+ | I had a task to backup using barman, encrypt, upload and house keep the backups. | ||
+ | So I implemented a crontab, that do just that: | ||
+ | |||
+ | |||
+ | < | ||
+ | #!/bin/bash | ||
+ | |||
+ | switch_logfiles(){ | ||
+ | v_leader=$1 | ||
+ | |||
+ | while : | ||
+ | do | ||
+ | echo " | ||
+ | psql -Ubarman -h ${v_leader} -c " | ||
+ | sleep 10 | ||
+ | done | ||
+ | } | ||
+ | |||
+ | backup() { | ||
+ | |||
+ | environment=$1 | ||
+ | echo " | ||
+ | |||
+ | echo " | ||
+ | case ${environment} in | ||
+ | " | ||
+ | | ||
+ | ;; | ||
+ | " | ||
+ | | ||
+ | ;; | ||
+ | " | ||
+ | | ||
+ | ;; | ||
+ | *) | ||
+ | echo " | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | v_first_replica=$(curl -sk https:// | ||
+ | v_leader=$(curl -sk https:// | ||
+ | |||
+ | echo " | ||
+ | sed -i " | ||
+ | |||
+ | echo " | ||
+ | barman -c / | ||
+ | |||
+ | echo " | ||
+ | barman -c / | ||
+ | |||
+ | echo " | ||
+ | |||
+ | switch_logfiles ${v_leader} & | ||
+ | |||
+ | barman -c / | ||
+ | |||
+ | kill $! | ||
+ | |||
+ | echo " | ||
+ | echo " | ||
+ | sed -i " | ||
+ | } | ||
+ | |||
+ | encrypt_backup(){ | ||
+ | echo " | ||
+ | date ' | ||
+ | environment=$1 | ||
+ | backup_dir=$(ls -rtd / | ||
+ | cd $(dirname ${backup_dir}) | ||
+ | backup_file=$(echo ${backup_dir} | cut -d '/' | ||
+ | enc_key=$(cat / | ||
+ | tar cvf - data/ | openssl enc -e -pbkdf2 -aes-256-ctr -k ${enc_key} -out ${backup_file}.tar.enc | ||
+ | echo " | ||
+ | date ' | ||
+ | } | ||
+ | |||
+ | cleanup() { | ||
+ | environment=$1 | ||
+ | BUCKET_NAME=postgres-${environment}-backup | ||
+ | OCI_CONFIG_FILE=/ | ||
+ | |||
+ | DATE_90_DAYS_AGO=$(date -d "90 days ago" +" | ||
+ | for object_name in $(oci os object list --bucket-name ${BUCKET_NAME} | jq -r --arg DATE_90_DAYS_AGO " | ||
+ | do | ||
+ | oci os object delete --bucket-name ${BUCKET_NAME} --object-name ${object_name} --force | ||
+ | done | ||
+ | |||
+ | DATE_35_DAYS_AGO=$(date -d "35 days ago" +" | ||
+ | for object_name in $(oci os object list --bucket-name ${BUCKET_NAME} | jq -r --arg DATE_35_DAYS_AGO " | ||
+ | do | ||
+ | oci os object delete --bucket-name ${BUCKET_NAME} --object-name ${object_name} --force | ||
+ | done | ||
+ | } | ||
+ | |||
+ | copy_files_to_os(){ | ||
+ | echo "Copy to Bucket starts" | ||
+ | date ' | ||
+ | environment=$1 | ||
+ | echo "Set BUCKET_NAME and OCI config file variable" | ||
+ | case ${environment} in | ||
+ | " | ||
+ | BUCKET_NAME=postgres-dev-backup | ||
+ | OCI_CONFIG_FILE=/ | ||
+ | ;; | ||
+ | " | ||
+ | BUCKET_NAME=postgres-stg-backup | ||
+ | OCI_CONFIG_FILE=/ | ||
+ | ;; | ||
+ | " | ||
+ | BUCKET_NAME=postgres-prod-backup | ||
+ | OCI_CONFIG_FILE=/ | ||
+ | ;; | ||
+ | *) | ||
+ | esac | ||
+ | |||
+ | export BUCKET_NAME | ||
+ | export OCI_CONFIG_FILE | ||
+ | |||
+ | encrypted_file=$(ls -rtd / | ||
+ | oci os object put --bucket-name ${BUCKET_NAME} --file ${encrypted_file} | ||
+ | rm -f ${encrypted_file} | ||
+ | echo "Copy to Bucket ends" | ||
+ | date ' | ||
+ | } | ||
+ | |||
+ | backup $1 | ||
+ | encrypt_backup $1 | ||
+ | copy_files_to_os $1 | ||
+ | cleanup $1 | ||
+ | </ | ||
+ | |||
+ | The script is used very simple: | ||
+ | |||
+ | bash script.sh " | ||