Compare commits
	
		
			2 commits
		
	
	
		
			e483e678b1
			...
			cd8a21a63d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| cd8a21a63d | |||
| 6023f7fe22 | 
					 3 changed files with 80 additions and 70 deletions
				
			
		|  | @ -1,33 +0,0 @@ | ||||||
| #!/bin/bash |  | ||||||
| # Backup script for Calibre-web in a kubernetes cluster |  | ||||||
| 
 |  | ||||||
| BACKUP_DEST='/mnt/PRIVATE_DOCS/BACKUPS/calibre-web' |  | ||||||
| DATABASE_FILE='/config/app.db' |  | ||||||
| 
 |  | ||||||
| # Create filename for database backup |  | ||||||
| database_backupfile="calibre-web-app_$(date +'%Y%m%d').db" |  | ||||||
| 
 |  | ||||||
| # Retrieve container name |  | ||||||
| base_container="$( docker ps --format '{{.Names}}' | grep tkioskje-calibre-web_tkioskje-calibre-web )" |  | ||||||
| 
 |  | ||||||
| # Abort entire script if any command fails |  | ||||||
| set -e |  | ||||||
| 
 |  | ||||||
| # Database backup |  | ||||||
| >&2 echo 'Backing up database' |  | ||||||
| docker cp "${base_container}":"${DATABASE_FILE}" "${BACKUP_DEST}/${database_backupfile}" |  | ||||||
| 
 |  | ||||||
| # Backup cleanup |  | ||||||
| # Only keep 30 most recent backups |  | ||||||
| >&2 echo 'Cleaning up old database backups' |  | ||||||
| pushd "${BACKUP_DEST}" |  | ||||||
| excess="$( ls -x  | head -n -30 )" |  | ||||||
| if [ -n "${excess}" ]; then |  | ||||||
| 	>&2 echo "Removing ${excess}" |  | ||||||
| 	rm "${excess}" |  | ||||||
| else |  | ||||||
| 	>&2 echo 'Skipping: nothing to remove' |  | ||||||
| fi |  | ||||||
| popd |  | ||||||
| 
 |  | ||||||
| >&2 echo 'Done' |  | ||||||
|  | @ -1,37 +0,0 @@ | ||||||
| #!/bin/bash |  | ||||||
| # Backup script for Gitea in a Kubernetes cluster |  | ||||||
| 
 |  | ||||||
| # `gitea dump` is a mess that we should not touch. We write our own backup scripts instead. |  | ||||||
| 
 |  | ||||||
| BACKUP_DEST='/mnt/PRIVATE_DOCS/BACKUPS/gitea' |  | ||||||
| PASSFILE='./gitea_pass.txt' |  | ||||||
| 
 |  | ||||||
| # Retrieve container names |  | ||||||
| base_container="$( docker ps --format '{{.Names}}' | grep 'hugit-gitea_hugit-gitea' )" |  | ||||||
| database_container="$( docker ps --format '{{.Names}}' | grep 'hugit-postgresql_hugit-postgresql' )" |  | ||||||
| 
 |  | ||||||
| # Abort entire script if any command fails |  | ||||||
| set -e |  | ||||||
| 
 |  | ||||||
| # Enable maintenance mode |  | ||||||
| # Flush queues |  | ||||||
| docker exec "${base_container}" gitea manager flush-queues |  | ||||||
| # Pause queues |  | ||||||
| # TODO |  | ||||||
| 
 |  | ||||||
| # Backup the database |  | ||||||
| >&2 echo 'Backing up database' |  | ||||||
| database_backupfile="gitea-sqlbkp_$( date +'%Y%m%d' ).bak" |  | ||||||
| internal_database_backupfile="/tmp/${database_backupfile}" |  | ||||||
| docker exec --env-file "${PASSFILE}" "${database_container}" pg_dump 'gitea' -cwv -h 'localhost' -U 'gitea' -f "${internal_database_backupfile}" |  | ||||||
| docker cp "${database_container}":"${internal_database_backupfile}" "${BACKUP_DEST}" |  | ||||||
| 
 |  | ||||||
| # Backup files |  | ||||||
| tar czvf "${BACKUP_DEST}/gitea-data_$(date +'%Y%m%d').tar.gz" -C "/mnt/APPS/hugit" |  | ||||||
| 
 |  | ||||||
| # Disable maintenance mode |  | ||||||
| # TODO |  | ||||||
| 
 |  | ||||||
| # Double check |  | ||||||
| # gitea doctor --all --log-file /tmp/doctor.log |  | ||||||
| # TODO |  | ||||||
							
								
								
									
										80
									
								
								scripts/gitea/backup-database.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										80
									
								
								scripts/gitea/backup-database.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,80 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | # Backup Gitea database in a Kubernetes environment | ||||||
|  | # Usage: backup-database [OPTIONS] <destination> | ||||||
|  | 
 | ||||||
|  | # `gitea dump` is a mess that we should not touch. We write our own backup scripts instead. | ||||||
|  | # | ||||||
|  | usage() { | ||||||
|  |     >&2 printf "Usage: %s <destination>\n" "${0}" | ||||||
|  |     >&2 printf "Options:\n" | ||||||
|  |     >&2 printf "\t-e \t Specify the environment file to use\n" | ||||||
|  |     exit "${1:-1}" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Get options | ||||||
|  | 
 | ||||||
|  | while getopts ":e:" option; do | ||||||
|  |     case "${option}" in | ||||||
|  |         e) | ||||||
|  |             if ! [ -f "${OPTARG}" ]; then | ||||||
|  |                 >&2 printf "Error: Specified environment file does not exist: '%s'.\n" "${OPTARG}" | ||||||
|  |             elif ! [ -r "${OPTARG}" ]; then | ||||||
|  |                 >&2 printf "Error: Specified environment file is not readable: '%s'.\n" "${OPTARG}" | ||||||
|  |             fi | ||||||
|  |             env_file="${OPTARG}" | ||||||
|  |             ;; | ||||||
|  |         *) | ||||||
|  |             >&2 printf "Error: Invalid option: '%s'.\n" "${option}" | ||||||
|  |             usage | ||||||
|  |             ;; | ||||||
|  |     esac | ||||||
|  | done | ||||||
|  | shift $(( OPTIND - 1 )) | ||||||
|  | 
 | ||||||
|  | # Check arguments. | ||||||
|  | 
 | ||||||
|  | if [ $# -ne 1 ]; then | ||||||
|  |     >&2 printf "Error: You need to specify a destination.\n" | ||||||
|  |     usage | ||||||
|  | elif ! [ -d "${1}" ]; then | ||||||
|  |     >&2 printf "Error: Specified destination does not exist or is not readable : '%s'.\n" "${1}" | ||||||
|  |     usage | ||||||
|  | else | ||||||
|  |     destination="${1}" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Retrieve container names | ||||||
|  | base_container="$( docker ps --format '{{.Names}}' | grep -E 'gitea_gitea-[0-9a-z]{10}-[0-9a-z]{5}' )" | ||||||
|  | database_container="$( docker ps --format '{{.Names}}' | grep 'postgres_gitea-cnpg-main-1' )" | ||||||
|  | 
 | ||||||
|  | if ! [[ -n "${base_container}" && -n "${database_container}" ]]; then | ||||||
|  |     >&2 printf "Error: Not all containers could be found.\n" | ||||||
|  |     exit 2 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Abort entire script if any command fails | ||||||
|  | set -e | ||||||
|  | 
 | ||||||
|  | # Enable maintenance mode | ||||||
|  | # Flush queues | ||||||
|  | docker exec "${base_container}" gitea manager flush-queues | ||||||
|  | # TODO Pause queues | ||||||
|  | 
 | ||||||
|  | # Database backup | ||||||
|  | 
 | ||||||
|  | # Filename for database backup.  | ||||||
|  | database_backupfile="gitea-sqlbkp_$( date +'%Y%m%d' ).bak" | ||||||
|  | host_database_backupfile="${destination}/${database_backupfile}" | ||||||
|  | 
 | ||||||
|  | # Backup the database | ||||||
|  | >&2 echo 'Backing up database' | ||||||
|  | docker exec --env-file "${env_file:=.env}" "${database_container}" pg_dump 'gitea' -cwv -h 'localhost' -U 'gitea' > "${host_database_backupfile}" | ||||||
|  | 
 | ||||||
|  | # Disable maintenance mode | ||||||
|  | # TODO Continue queues | ||||||
|  | 
 | ||||||
|  | # Double check | ||||||
|  | # gitea doctor --all --log-file /tmp/doctor.log | ||||||
|  | # TODO | ||||||
|  | 
 | ||||||
|  | printf "Done.\n" | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue