Przeglądaj źródła

Add option to fully backup and restore a service

Things that get backed up (or restored): All volumes (will be compressed), nginx configuration if service is accessible via web, other user-specific configuration files, environment file(s), ssl certificate
dennisro 7 lat temu
rodzic
commit
43551b65ef
43 zmienionych plików z 290 dodań i 101 usunięć
  1. 1 0
      .gitignore
  2. 219 28
      data/include/functions/menu_functions.sh
  3. 1 1
      data/services/bitbucket/bitbucket.sh
  4. 2 2
      data/services/bitbucket/containers.sh
  5. 2 2
      data/services/cryptpad/containers.sh
  6. 1 1
      data/services/cryptpad/cryptpad.sh
  7. 1 1
      data/services/cs50ide/containers.sh
  8. 1 1
      data/services/cs50ide/cs50ide.sh
  9. 1 1
      data/services/dillinger/containers.sh
  10. 1 1
      data/services/dillinger/dillinger.sh
  11. 1 1
      data/services/ghost/containers.sh
  12. 1 1
      data/services/ghost/ghost.sh
  13. 2 2
      data/services/gitea/containers.sh
  14. 1 1
      data/services/gitea/gitea.sh
  15. 3 3
      data/services/gitlabce/containers.sh
  16. 1 1
      data/services/gitlabce/gitlabce.sh
  17. 2 2
      data/services/gogs/containers.sh
  18. 1 1
      data/services/gogs/gogs.sh
  19. 1 1
      data/services/hastebin/containers.sh
  20. 1 1
      data/services/hastebin/hastebin.sh
  21. 1 1
      data/services/ipsecvpnserver/containers.sh
  22. 1 1
      data/services/ipsecvpnserver/ipsecvpnserver.sh
  23. 2 2
      data/services/kanboard/containers.sh
  24. 1 1
      data/services/kanboard/kanboard.sh
  25. 1 1
      data/services/mailcowdockerized/mailcowdockerized.sh
  26. 1 1
      data/services/mailpile/containers.sh
  27. 1 1
      data/services/mailpile/mailpile.sh
  28. 13 14
      data/services/mastodon/containers.sh
  29. 1 1
      data/services/mastodon/mastodon.sh
  30. 4 5
      data/services/nextcloud/containers.sh
  31. 1 1
      data/services/nextcloud/nextcloud.sh
  32. 3 3
      data/services/openproject/containers.sh
  33. 1 1
      data/services/openproject/openproject.sh
  34. 3 3
      data/services/piwik/containers.sh
  35. 1 1
      data/services/piwik/piwik.sh
  36. 3 3
      data/services/seafilepro/containers.sh
  37. 1 1
      data/services/seafilepro/seafilepro.sh
  38. 0 1
      data/services/searx/searx.sh
  39. 1 1
      data/services/send/containers.sh
  40. 1 1
      data/services/send/send.sh
  41. 1 1
      data/services/sftpserver/sftpserver.sh
  42. 2 2
      data/services/wordpress/containers.sh
  43. 2 2
      data/services/wordpress/wordpress.sh

+ 1 - 0
.gitignore

@@ -2,6 +2,7 @@
 data/web/*
 data/env/*
 data/conf/*
+data/backup/*
 data/Dockerfiles/*
 data/docker-compose/*
 

+ 219 - 28
data/include/functions/menu_functions.sh

@@ -23,7 +23,7 @@ options_menu() {
 		done
 	fi
 	if [[ $RUNNING ]];then
-		menu=( "Reconfigure service" "Reinstall service" "Upgrade Image(s)" "Destroy \"${PROPER_NAME}\"" "$exitmenu" )
+		menu=( "Reconfigure service" "Reinstall service" "Backup Service" "Upgrade Image(s)" "Destroy \"${PROPER_NAME}\"" "$exitmenu" )
 		add_ssl_menuentry menu 2
 		if elementInArray "${PROPER_NAME}" "${STOPPED_SERVICES}";then
 			insert menu "Start container(s)" 3
@@ -31,9 +31,13 @@ options_menu() {
 			insert menu "Restart container(s)" 3
 			insert menu "Stop container(s)" 4
 		fi
+		[[ $(ls -A "${BASE_DIR}/data/backup/${SERVICE_NAME}") ]] \
+			&& insert menu "Restore Service" 6
 	elif [[ $RUNNING == "false" ]];then
-		menu=( "Reconfigure service" "Reinstall service" "Start container(s)" "Destroy \"${PROPER_NAME}\"" "$exitmenu" )
+		menu=( "Reconfigure service" "Reinstall service" "Backup Service" "Start container(s)" "Destroy \"${PROPER_NAME}\"" "$exitmenu" )
 		add_ssl_menuentry menu 2
+		[[ $(ls -A "${BASE_DIR}/data/backup/${SERVICE_NAME}") ]] \
+			&& insert menu "Restore Service" 3
 	else
 		if ! elementInArray "${PROPER_NAME}" "${CONFIGURED_SERVICES[@]}" \
 		&& ! elementInArray "${PROPER_NAME}" "${INSTALLED_SERVICES[@]}" \
@@ -41,18 +45,24 @@ options_menu() {
 			[[ ${STATIC} \
 				&& $(ls -A "${ENV_DIR}"/static) ]] \
 				&& menu=( "Configure Site" "Manage Sites" "$exitmenu" ) \
-				|| menu=( "Configure Site" "$exitmenu" )
+				|| menu=( "Configure Service" "$exitmenu" )
 		elif ! elementInArray "${PROPER_NAME}" "${CONFIGURED_SERVICES[@]}" \
 		&& ! elementInArray "${PROPER_NAME}" "${INSTALLED_SERVICES[@]}";then
 			menu=( "Destroy \"${PROPER_NAME}\"" "$exitmenu" )
+			[[ $(ls -A "${BASE_DIR}/data/backup/${SERVICE_NAME}") ]] \
+				&& insert menu "Restore Service" 1
 			error="Environment file found but ${PROPER_NAME} is not marked as configured or installed. Please destroy first!"
 		elif elementInArray "${PROPER_NAME}" "${CONFIGURED_SERVICES[@]}" \
 		&& [[ ! -f "${ENV_DIR}/${SERVICE_NAME}.env" ]];then
 				error="Service marked as configured, but configuration file is missing. Please destroy first."
 				menu=( "Destroy \"${PROPER_NAME}\"" "$exitmenu" )
+				[[ $(ls -A "${BASE_DIR}/data/backup/${SERVICE_NAME}") ]] \
+					&& insert menu "Restore Service" 1
 		elif elementInArray "${PROPER_NAME}" "${CONFIGURED_SERVICES[@]}" \
 		&& [[ -f "${ENV_DIR}/${SERVICE_NAME}.env" ]];then
 			menu=( "Reconfigure service" "Setup service" "Destroy \"${PROPER_NAME}\"" "$exitmenu" )
+			[[ $(ls -A "${BASE_DIR}/data/backup/${SERVICE_NAME}") ]] \
+				&& insert menu "Restore Service" 2
 		fi
 	fi
 
@@ -63,27 +73,27 @@ options_menu() {
 	fi
 	select choice in "${menu[@]}"
 	do
-	    case $choice in
-	        "Configure Site")
+		case $choice in
+			"Configure Site")
 				echo -e "\n\e[3m\xe2\x86\x92 Configure ${PROPER_NAME}\e[0m\n"
 				${SERVICES_DIR}/${SERVICE_NAME}/${SERVICE_NAME}.sh configure
 				say_done
 				sleep 0.2
 				break
 				;;
-	        "Configure service")
+			"Configure Service")
 				echo -e "\n\e[3m\xe2\x86\x92 Configure ${PROPER_NAME}\e[0m\n"
 				${SERVICES_DIR}/${SERVICE_NAME}/${SERVICE_NAME}.sh configure
 				sleep 0.2
 				break
 				;;
-	        "Manage Sites")
+			"Manage Sites")
 				echo -e "\n\e[3m\xe2\x86\x92 Manage sites\e[0m"
 				static_menu
 				sleep 0.2
 				break
 				;;
-	        "Reconfigure service")
+			"Reconfigure service")
 				echo -e "\n\e[3m\xe2\x86\x92 Reconfigure ${PROPER_NAME}\e[0m"
 				${SERVICES_DIR}/${SERVICE_NAME}/${SERVICE_NAME}.sh reconfigure
 				break
@@ -96,7 +106,7 @@ options_menu() {
 				sleep 0.2
 				break
 			;;
-	        "Reinstall service")
+			"Reinstall service")
 				echo -e "\n\e[3m\xe2\x86\x92 Reinstall ${PROPER_NAME}\e[0m"
 				${SERVICES_DIR}/${SERVICE_NAME}/${SERVICE_NAME}.sh reinstall
 				say_done
@@ -110,6 +120,20 @@ options_menu() {
 				sleep 0.2
 				break
 			;;
+			"Backup Service")
+				echo -e "\n\e[3m\xe2\x86\x92 Backup Service\e[0m"
+				${SERVICES_DIR}/${SERVICE_NAME}/${SERVICE_NAME}.sh backup
+				say_done
+				sleep 0.2
+				break
+			;;
+			"Restore Service")
+				echo -e "\n\e[3m\xe2\x86\x92 Restore Service\e[0m"
+				${SERVICES_DIR}/${SERVICE_NAME}/${SERVICE_NAME}.sh restore
+				say_done
+				sleep 0.2
+				break
+			;;
 			"Generate self-signed certificate")
 				generate_certificate
 				restart_nginx
@@ -129,7 +153,7 @@ options_menu() {
 				sleep 0.2
 				exit
 			;;
-	        "Restart container(s)")
+			"Restart container(s)")
 				echo -e "\n\e[3m\xe2\x86\x92 Restart ${PROPER_NAME} Containers\e[0m"
 				${SERVICES_DIR}/${SERVICE_NAME}/${SERVICE_NAME}.sh restart_containers
 				say_done
@@ -137,7 +161,7 @@ options_menu() {
 				${SERVICES_DIR}/${SERVICE_NAME}/${SERVICE_NAME}.sh
 				break
 			;;
-	        "Start container(s)")
+			"Start container(s)")
 				echo -e "\n\e[3m\xe2\x86\x92 Start ${PROPER_NAME} Containers\e[0m"
 			${SERVICES_DIR}/${SERVICE_NAME}/${SERVICE_NAME}.sh start_containers
 				say_done
@@ -145,7 +169,7 @@ options_menu() {
 				${SERVICES_DIR}/${SERVICE_NAME}/${SERVICE_NAME}.sh
 				break
 			;;
-	        "Stop container(s)")
+			"Stop container(s)")
 				echo -e "\n\e[3m\xe2\x86\x92 Stop ${PROPER_NAME} Containers\e[0m"
 				${SERVICES_DIR}/${SERVICE_NAME}/${SERVICE_NAME}.sh stop_containers
 				say_done
@@ -153,7 +177,7 @@ options_menu() {
 				${SERVICES_DIR}/${SERVICE_NAME}/${SERVICE_NAME}.sh
 				break
 			;;
-	        "Destroy \"${PROPER_NAME}\"")
+			"Destroy \"${PROPER_NAME}\"")
 				echo -e "\n\e[3m\xe2\x86\x92 Destroy ${PROPER_NAME}\e[0m"
 				echo ""
 				echo "The following will be removed:"
@@ -185,7 +209,7 @@ options_menu() {
 				sleep 0.2
 				${BASE_DIR}/dockerbunker.sh
 			;;
-	        "$exitmenu")
+			"$exitmenu")
 				exit 0
 			;;
 			*)
@@ -364,14 +388,14 @@ remove_containers() {
 }
 
 remove_volumes() {
-	if [[ ${volumes[0]} && $remove_volumes ]] || [[ $destroy_all ]];then
+	if [[ ${volumes[@]} && -z $keep_volumes ]] || [[ $destroy_all ]];then
 		echo -e "\n\e[1mRemoving volumes\e[0m"
-		for volume in "${volumes[@]}";do
+		for volume in "${!volumes[@]}";do
 			[[ $(docker volume ls -q --filter name=^${volume}$) ]] \
-				&& echo -en "- $volume" \
-				&& docker volume rm $volume >/dev/null \
+				&& echo -en "- ${volume}" \
+				&& docker volume rm ${volume} >/dev/null \
 				&& exit_response \
-				|| echo "- $volume (not found)"
+				|| echo "- ${volume} (not found)"
 		done
 	fi
 }
@@ -418,7 +442,7 @@ remove_images() {
 
 remove_service_conf() {
 	[[ -d "${CONF_DIR}/${SERVICE_NAME}" ]] \
-		&& rm -r "${CONF_DIR}/${SERVICE_NAME}/*" \
+		&& rm -r "${CONF_DIR}/${SERVICE_NAME}" \
 
 }
 
@@ -446,7 +470,6 @@ remove_ssl_certificate() {
 }
 
 destroy_service() {
-	export remove_volumes=1
 	if [[ -z ${STATIC} ]];then
 		disconnect_from_dockerbunker_network
 		stop_containers
@@ -517,7 +540,7 @@ upgrade() {
 
 reinstall() {
 	echo ""
-	prompt_confirm "Keep volumes?" && export keep_volumes=1 || export remove_volumes=1
+	prompt_confirm "Keep volumes?" && export keep_volumes=1
 
 	disconnect_from_dockerbunker_network
 
@@ -533,8 +556,7 @@ reinstall() {
 remove_nginx_conf() {
 	if [[ ${SERVICE_DOMAIN[0]} ]];then
 		if [[ -f "${CONF_DIR}"/nginx/conf.d/${SERVICE_DOMAIN[0]}.conf || -f "${CONF_DIR}"/nginx/conf.inactive.d/${SERVICE_DOMAIN[0]}.conf ]];then
-			echo -e "\n\e[1mRemoving nginx configuration\e[0m"
-			echo -n "- ${SERVICE_DOMAIN[0]}.conf"
+			echo -en "\n\e[1mRemoving nginx configuration\e[0m"
 			[[ -d "${CONF_DIR}"/nginx/conf.inactive.d/${SERVICE_DOMAIN[0]} ]] \
 				&& rm -r "${CONF_DIR}"/nginx/conf.inactive.d/${SERVICE_DOMAIN[0]} \
 				|| true
@@ -563,10 +585,10 @@ reconfigure() {
 	reconfigure=1
 	if [[ $safe_to_keep_volumes_when_reconfiguring ]];then
 		echo ""
-		prompt_confirm "Keep volumes?" || remove_volumes=1
+		prompt_confirm "Keep volumes?" && keep_volumes=1
 	else
 		echo ""
-		prompt_confirm "All volumes will be removed. Continue?" && remove_volumes=1 || exit 0
+		prompt_confirm "All volumes will be removed. Continue?" || exit 0
 	fi
 
 	disconnect_from_dockerbunker_network
@@ -682,8 +704,8 @@ add_ssl_menuentry() {
 
 static_menu() {
 	[[ -z ${STATIC_SITES[0]} ]] \
-		&& echo -e "\n\e[1mNo existing sites found\e[0m\n" \
-		&& return
+		&& echo -e "\n\e[1mNo existing sites found\e[0m" \
+		&& exec "${SERVICES_DIR}"/${SERVICE_NAME}/${SERVICE_NAME}.sh
 
 	# Display all static sites in a menu
 	
@@ -772,3 +794,172 @@ static_menu() {
 	done
 }
 
+backup() {
+	! [[ -d ${BASE_DIR}/data/backup/${SERVICE_NAME} ]] && mkdir -p ${BASE_DIR}/data/backup/${SERVICE_NAME}
+	NOW=$(date -d "today" +"%Y%m%d_%H%M")
+	for volume in ${!volumes[@]};do
+		docker run --rm -i -v ${volume}:/${volumes[$volume]##*/} -v ${BASE_DIR}/data/backup/${SERVICE_NAME}/${NOW}:/backup debian:jessie tar cvfz /backup/${volume}.tar.gz /${volumes[$volume]##*/} 2>/dev/null | cut -b1-$(tput cols) | sed -u 'i\\o033[2K' | stdbuf -o0 tr '\n' '\r';echo -e "\033[2K\c"
+		echo -en "\n\e[1mCompressing $volume\e[0m"
+		exit_response
+	done
+
+	if [ -d "${CONF_DIR}"/${SERVICE_NAME} ];then
+		! [ -d "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/conf ] \
+			&& mkdir "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/conf
+		echo -en "\n\e[1mBacking up configuration files\e[0m"
+		sleep 0.2
+		cp -r "${CONF_DIR}"/${SERVICE_NAME}/* "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/conf
+		exit_response
+	fi
+
+	if [[ ${SERVICE_DOMAIN[0]} ]] && [ -d "${CONF_DIR}"/nginx/ssl/${SERVICE_DOMAIN[0]} ];then
+		! [ -d "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/ssl ] \
+			&& mkdir "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/ssl
+		echo -en "\n\e[1mBacking up SSL certificate\e[0m"
+		sleep 0.2
+		[[ -d "${CONF_DIR}"/nginx/ssl/letsencrypt/live/${SERVICE_DOMAIN[0]} ]] \
+			&& mkdir -p \
+				"${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/ssl/letsencrypt/live \
+				"${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/ssl/letsencrypt/archive \
+				"${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/ssl/letsencrypt/renewal \
+			&& cp -r "${CONF_DIR}"/nginx/ssl/letsencrypt/archive/${SERVICE_DOMAIN[0]} "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/ssl/letsencrypt/archive \
+			&& cp -r "${CONF_DIR}"/nginx/ssl/letsencrypt/live/${SERVICE_DOMAIN[0]} "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/ssl/letsencrypt/live \
+			&& cp -r "${CONF_DIR}"/nginx/ssl/letsencrypt/renewal/${SERVICE_DOMAIN[0]}.conf "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/ssl/letsencrypt/renewal
+		cp -r "${CONF_DIR}"/nginx/ssl/${SERVICE_DOMAIN[0]} "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/ssl
+		exit_response
+	fi
+
+	if [ -f "${CONF_DIR}"/nginx/conf.d/${SERVICE_DOMAIN[0]}.conf ];then
+		! [ -d "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/nginx ] \
+			&& mkdir -p "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/nginx
+		echo -en "\n\e[1mBacking up nginx configuration\e[0m"
+		sleep 0.2
+		cp -r "${CONF_DIR}"/nginx/conf.d/${SERVICE_DOMAIN[0]}* "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}/nginx
+		exit_response
+	fi
+
+	if [ -f "${ENV_DIR}"/${SERVICE_NAME}.env ];then
+		echo -en "\n\e[1mBacking up environemt file(s)\e[0m"
+		sleep 0.2
+		[[ -f "{ENV_DIR}"/${SERVICE_NAME}_mx.env ]] && cp "${ENV_DIR}"/${SERVICE_NAME}_mx.env "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}
+		cp "${ENV_DIR}"/${SERVICE_NAME}.env "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${NOW}
+		exit_response
+	else
+		echo -e "\n\e[3mCould not find environment file(s) for ${PROPER_NAME}.\e[0m"
+	fi
+}
+
+restore() {
+	## Collect the backups in the array $backups
+	backups=( "${BASE_DIR}"/data/backup/${SERVICE_NAME}/* )
+	# strip path from directory names
+	backups=( "${backups[@]##*/}" )
+	## Enable extended globbing. This lets us use @(foo|bar) to
+	## match either 'foo' or 'bar'.
+	shopt -s extglob
+	
+	## Start building the string to match against.
+	string="@(${backups[0]}"
+	## Add the rest of the backups to the string
+	for((i=1;i<${#backups[@]};i++))
+	do
+	    string+="|${backups[$i]}"
+	done
+	## Close the parenthesis. $string is now @(backup1|backup2|...|backupN)
+	string+=")"
+	# only continue if backup directory is not empty
+	if [[ $(ls -A "${BASE_DIR}/data/backup/${SERVICE_NAME}") ]];then
+		echo ""
+		echo -e "\e[4mPlease choose a backup\e[0m"
+		
+		## Show the menu. This will list all backups and the string "back to previous menu"
+		select backup in "${backups[@]}" "Back to previous menu"
+		do
+		    case $backup in
+		    ## If the choice is one of the backups (if it matches $string)
+		    $string)
+				! [[ -f "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/${SERVICE_NAME}.env ]] \
+					&& echo -e "\n\e[3mCould not find ${SERVICE_NAME}.env in ${backup}\e[0m" \
+					&& return
+				# destroy current service if found
+				if [[ $(docker ps -q -a --filter name=^/"${SERVICE_NAME}-service-dockerbunker"$) ]];then
+					echo -e "\n\e[3m\xe2\x86\x92 Destroying ${PROPER_NAME}\e[0m"
+					destroy_service
+				fi
+
+				source "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/${SERVICE_NAME}.env
+
+				echo -e "\n\e[3m\xe2\x86\x92 Restoring ${PROPER_NAME}\e[0m"
+				for volume in ${!volumes[@]};do
+					[[ $(docker volume ls --filter name=^${volume}$) ]] \
+						&& docker volume create $volume >/dev/null
+					docker run --rm -i -v ${volume}:/${volumes[$volume]##*/} -v ${BASE_DIR}/data/backup/${SERVICE_NAME}/${backup}:/backup debian:jessie tar xvfz /backup/${volume}.tar.gz 2>/dev/null | cut -b1-$(tput cols) | sed -u 'i\\o033[2K' | stdbuf -o0 tr '\n' '\r';echo -e "\033[2K\c"
+					echo -en "\n\e[1mDecompressing $volume\e[0m"
+					exit_response
+				done
+				sleep 0.2
+
+				if [ -d "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/conf ];then
+					! [ -d "${CONF_DIR}"/${SERVICE_NAME} ] \
+						&& mkdir "${CONF_DIR}"/${SERVICE_NAME}
+					echo -en "\n\e[1mRestoring configuration files\e[0m"
+					sleep 0.2
+					cp -r "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/conf/* "${CONF_DIR}"/${SERVICE_NAME}
+					exit_response
+				fi
+
+				if [ -f "${BASE_DIR}"/data/backup/${SERVICE_NAME}/$backup/nginx/${SERVICE_DOMAIN}.conf ];then
+					! [[ -d "${CONF_DIR}"/nginx/conf.inactive.d ]] \
+						&& mkdir "${CONF_DIR}"/nginx/conf.inactive.d
+					echo -en "\n\e[1mRestoring nginx configuration\e[0m"
+					cp -r "${BASE_DIR}"/data/backup/${SERVICE_NAME}/$backup/nginx/${SERVICE_DOMAIN}* "${CONF_DIR}"/nginx/conf.inactive.d
+					exit_response
+				fi
+				sleep 0.2
+
+
+				if [[ ${SERVICE_DOMAIN[0]} ]] && [ -d "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/ssl ];then
+					! [ -d "${CONF_DIR}"/nginx/ssl/${SERVICE_DOMAIN[0]} ] \
+						&& mkdir -p "${CONF_DIR}"/nginx/ssl/${SERVICE_DOMAIN[0]}
+					echo -en "\n\e[1mRestoring SSL certificate\e[0m"
+					sleep 0.2
+					[[ -d "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/ssl/letsencrypt/live/${SERVICE_DOMAIN[0]} ]] \
+						&& mkdir -p \
+							"${CONF_DIR}"/nginx/ssl/letsencrypt/live \
+							"${CONF_DIR}"/nginx/ssl/letsencrypt/archive \
+							"${CONF_DIR}"/nginx/ssl/letsencrypt/renewal \
+						&& cp -r "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/ssl/letsencrypt/archive/${SERVICE_DOMAIN[0]} "${CONF_DIR}"/nginx/ssl/letsencrypt/archive \
+						&& cp -r "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/ssl/letsencrypt/live/${SERVICE_DOMAIN[0]} "${CONF_DIR}"/nginx/ssl/letsencrypt/live \
+						&& cp -r "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/ssl/letsencrypt/renewal/${SERVICE_DOMAIN[0]}.conf "${CONF_DIR}"/nginx/ssl/letsencrypt/renewal
+					cp -r "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/ssl/${SERVICE_DOMAIN[0]} "${CONF_DIR}"/nginx/ssl
+					exit_response
+				fi
+
+				if [ -f "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/${SERVICE_NAME}.env ];then
+					echo -en "\n\e[1mBacking up environemt file(s)\e[0m"
+					sleep 0.2
+					[[ -f "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/${SERVICE_NAME}_mx.env ]] && cp "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/${SERVICE_NAME}_mx.env "${ENV_DIR}"
+					cp "${BASE_DIR}"/data/backup/${SERVICE_NAME}/${backup}/${SERVICE_NAME}.env "${ENV_DIR}"
+					exit_response
+				fi
+				create_networks
+				docker_run_all
+				activate_nginx_conf
+				post_setup_routine
+				exit 0
+		        ;;
+		
+		    "Back to previous menu")
+				"${SERVICES_DIR}"/${SERVICE_NAME}/${SERVICE_NAME}.sh
+				;;
+		    *)
+		        backup=""
+		        echo "Please choose a number from 1 to $((${#backups[@]}+1))";;
+		    esac
+		done
+	else
+		echo -e "\n\e[1mNo ${PROPER_NAME} backup found\e[0m"
+		echo -e "\n\e[3m\xe2\x86\x92 Checking service status"
+		exec "${SERVICES_DIR}"/${SERVICE_NAME}/${SERVICE_NAME}.sh
+	fi
+}

+ 1 - 1
data/services/bitbucket/bitbucket.sh

@@ -17,7 +17,7 @@ declare -a containers=( "bitbucket-postgres-dockerbunker" "${SERVICE_NAME}-servi
 declare -a add_to_network=( "bitbucket-service-dockerbunker"  )
 declare -a networks=( )
 declare -A IMAGES=( [service]="dockerbunker/${SERVICE_NAME}" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1" "${SERVICE_NAME}-db-vol-1" )
+declare -A volumes=( [${SERVICE_NAME}-db-vol-1]="/var/lib/postgresql/data" [${SERVICE_NAME}-data-vol-1]="/var/atlassian/application-data/bitbucket" )
 declare -a networks=( "dockerbunker-bitbucket" )
 declare -A IMAGES=( [postgres]="postgres" [service]="atlassian/bitbucket-server:5" )
 

+ 2 - 2
data/services/bitbucket/containers.sh

@@ -3,7 +3,7 @@ bitbucket_postgres_dockerbunker() {
 		--name=${FUNCNAME[0]//_/-} \
 		--restart=always \
 		--network=dockerbunker-${SERVICE_NAME} --net-alias=db \
-		-v ${SERVICE_NAME}-db-vol-1:/var/lib/postgresql/data \
+		-v ${SERVICE_NAME}-db-vol-1:${volumes[${SERVICE_NAME}-db-vol-1]} \
 		--env-file=${SERVICE_ENV} \
 		-e POSTGRES_PASSWORD=${DBPASS} \
 		-e POSTGRES_USER=${DBUSER} \
@@ -16,7 +16,7 @@ bitbucket_service_dockerbunker() {
 		--restart=always \
 		--network=${NETWORK} \
 		--network=dockerbunker-${SERVICE_NAME} \
-		-v ${SERVICE_NAME}-data-vol-1:/var/atlassian/application-data/bitbucket \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 		--env-file=${SERVICE_ENV} \
 	${IMAGES[service]}
 }

+ 2 - 2
data/services/cryptpad/containers.sh

@@ -4,7 +4,7 @@ cryptpad_service_dockerbunker() {
 		--restart=always \
 		--network ${NETWORK} \
 		--env-file ${SERVICE_ENV} \
-		-v ${SERVICE_NAME}-data-vol-2:/cryptpad/datastore \
-		-v ${SERVICE_NAME}-data-vol-1:/cryptpad/customize \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
+		-v ${SERVICE_NAME}-data-vol-2:${volumes[${SERVICE_NAME}-data-vol-2]} \
 	${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/cryptpad/cryptpad.sh

@@ -17,7 +17,7 @@ declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
 declare -A IMAGES=( [service]="dockerbunker/${SERVICE_NAME}" )
 declare -A BUILD_IMAGES=( [dockerbunker/${SERVICE_NAME}]="${DOCKERFILES}/${SERVICE_NAME}" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1" "${SERVICE_NAME}-data-vol-2" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/cryptpad/customize" [${SERVICE_NAME}-data-vol-2]="/cryptpad/datastore" )
 declare -a networks=( )
 
 [[ -z $1 ]] && options_menu

+ 1 - 1
data/services/cs50ide/containers.sh

@@ -8,6 +8,6 @@ cs50ide_service_dockerbunker() {
 		-p 5050:5050 \
 		-e "OFFLINE_PORT=5050" \
 		-e "OFFLINE_IP=127.0.0.1" \
-		-v ${SERVICE_NAME}-data-vol-1:/home/ubuntu/workspace \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 	${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/cs50ide/cs50ide.sh

@@ -15,7 +15,7 @@ done
 
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1")
+declare -a volumes=( [${SERVICE_NAME}-data-vol-1]="/home/ubuntu/workspace" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
 declare -a networks=( )
 declare -A IMAGES=( [service]="cs50/ide50-offline" )

+ 1 - 1
data/services/dillinger/containers.sh

@@ -4,6 +4,6 @@ dillinger_service_dockerbunker() {
 		--restart=always \
 		--network ${NETWORK} \
 		--env-file "${SERVICE_ENV}" \
-		-v ${SERVICE_NAME}-data-vol-1:/dillinger/data \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 	${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/dillinger/dillinger.sh

@@ -15,7 +15,7 @@ done
 
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1")
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/dillinger/data" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
 declare -a networks=( )
 declare -A IMAGES=( [service]="dockerbunker/dillinger" )

+ 1 - 1
data/services/ghost/containers.sh

@@ -5,6 +5,6 @@ ghost_service_dockerbunker() {
 		--env-file ${SERVICE_ENV} \
 		--env NODE_ENV=production \
 		--env url=https://${SERVICE_DOMAIN[0]} \
-		-v ${SERVICE_NAME}-data-vol-1:/var/lib/ghost/content \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 		${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/ghost/ghost.sh

@@ -15,8 +15,8 @@ done
 
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/var/lib/ghost/content" )
 declare -a networks=( )
 declare -A IMAGES=( [service]="ghost:1-alpine" )
 

+ 2 - 2
data/services/gitea/containers.sh

@@ -8,7 +8,7 @@ gitea_db_dockerbunker() {
 		--env MYSQL_DATABASE=${GITEA_DBNAME} \
 		--env MYSQL_USER=${GITEA_DBUSER} \
 		--env MYSQL_PASSWORD=${GITEA_DBPASS} \
-		-v gitea-db-vol-1:/var/lib/mysql \
+		-v ${SERVICE_NAME}-db-vol-1:${volumes[${SERVICE_NAME}-db-vol-1]} \
 		-v "${SERVICES_DIR}"/${SERVICE_NAME}/mysql/:/etc/mysql/conf.d/:ro \
 		--health-cmd="mysqladmin ping --host localhost --silent" --health-interval=10s --health-retries=5 --health-timeout=30s \
 	${IMAGES[db]} >/dev/null
@@ -22,6 +22,6 @@ gitea_service_dockerbunker() {
 		--env-file "${SERVICE_ENV}" \
 		--env-file "${ENV_DIR}"/${SERVICE_SPECIFIC_MX}mx.env \
 		--env RUN_CROND=true \
-		-v gitea-data-vol-1:/data \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 	${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/gitea/gitea.sh

@@ -15,8 +15,8 @@ done
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-db-dockerbunker" "${SERVICE_NAME}-service-dockerbunker" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-db-vol-1" "${SERVICE_NAME}-data-vol-1" )
 declare -a networks=( "dockerbunker-gitea" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/data" [${SERVICE_NAME}-db-vol-1]="/var/lib/mysql" )
 declare -A IMAGES=( [db]="mariadb:10.2" [service]="gitea/gitea:1.4" )
 declare -A BUILD_IMAGES=( [dockerbunker/${SERVICE_NAME}]="${DOCKERFILES}/${SERVICE_NAME}" )
 

+ 3 - 3
data/services/gitlabce/containers.sh

@@ -11,9 +11,9 @@ gitlabce_service_dockerbunker() {
 		--restart=always \
 		--network ${NETWORK} \
 		--env-file ${SERVICE_ENV} \
-		-v ${SERVICE_NAME}-conf-vol-1:/etc/gitlab \
-		-v ${SERVICE_NAME}-data-vol-1:/etc/opt/gitlab \
-		-v ${SERVICE_NAME}-log-vol-1:/var/log/gitlab \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
+		-v ${SERVICE_NAME}-conf-vol-1:${volumes[${SERVICE_NAME}-conf-vol-1]} \
+		-v ${SERVICE_NAME}-log-vol-1:${volumes[${SERVICE_NAME}-log-vol-1]} \
 	${IMAGES[service]} >/dev/null
 	exit_response
 }

+ 1 - 1
data/services/gitlabce/gitlabce.sh

@@ -14,8 +14,8 @@ done
 
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1" "${SERVICE_NAME}-conf-vol-1" "${SERVICE_NAME}-log-vol-1" "${SERVICE_NAME}-log-vol-2" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/etc/opt/gitlab" [${SERVICE_NAME}-conf-vol-1]="/etc/gitlab" [${SERVICE_NAME}-log-vol-1]="/var/log/gitlab" )
 declare -a networks=( )
 declare -A IMAGES=( [service]="gitlab/gitlab-ce:latest" )
 

+ 2 - 2
data/services/gogs/containers.sh

@@ -8,7 +8,7 @@ gogs_db_dockerbunker() {
 		--env MYSQL_DATABASE=${GOGS_DBNAME} \
 		--env MYSQL_USER=${GOGS_DBUSER} \
 		--env MYSQL_PASSWORD=${GOGS_DBPASS} \
-		-v gogs-db-vol-1:/var/lib/mysql \
+		-v ${SERVICE_NAME}-db-vol-1:${volumes[${SERVICE_NAME}-db-vol-1]} \
 		-v "${SERVICES_DIR}"/${SERVICE_NAME}/mysql/:/etc/mysql/conf.d/:ro \
 		--health-cmd="mysqladmin ping --host localhost --silent" --health-interval=10s --health-retries=5 --health-timeout=30s \
 	${IMAGES[db]} >/dev/null
@@ -22,6 +22,6 @@ gogs_service_dockerbunker() {
 		--env-file "${SERVICE_ENV}" \
 		--env-file "${ENV_DIR}"/${SERVICE_SPECIFIC_MX}mx.env \
 		--env RUN_CROND=true \
-		-v gogs-data-vol-1:/data \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 	${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/gogs/gogs.sh

@@ -15,7 +15,7 @@ done
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-db-dockerbunker" "${SERVICE_NAME}-service-dockerbunker" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-db-vol-1" "${SERVICE_NAME}-data-vol-1" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/data" [${SERVICE_NAME}-db-vol-1]="/var/lib/mysql" )
 declare -a networks=( "dockerbunker-gogs" )
 declare -A IMAGES=( [db]="mariadb:10.2" [service]="gogs/gogs" )
 declare -A BUILD_IMAGES=( [dockerbunker/${SERVICE_NAME}]="${DOCKERFILES}/${SERVICE_NAME}" )

+ 1 - 1
data/services/hastebin/containers.sh

@@ -4,6 +4,6 @@ hastebin_service_dockerbunker() {
 		--restart=always \
 		--network ${NETWORK} \
 		--env-file "${SERVICE_ENV}" \
-		-v ${SERVICE_NAME}-data-vol-1:/hastebin/data \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 	${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/hastebin/hastebin.sh

@@ -17,7 +17,7 @@ declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
 declare -A IMAGES=( [service]="dockerbunker/${SERVICE_NAME}" )
 declare -A BUILD_IMAGES=( [dockerbunker/${SERVICE_NAME}]="${DOCKERFILES}/${SERVICE_NAME}" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1" "${SERVICE_NAME}-data-vol-2" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/hastebin/data" )
 declare -a networks=( )
 
 [[ -z $1 ]] && options_menu

+ 1 - 1
data/services/ipsecvpnserver/containers.sh

@@ -5,6 +5,6 @@ ipsecvpnserver_service_dockerbunker() {
 		-p 500:500/udp \
 		-p 4500:4500/udp \
 		--env-file ${SERVICE_ENV} \
-		-v ${SERVICE_NAME}-data-vol-1:/lib/modules:ro \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]}:ro \
 	${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/ipsecvpnserver/ipsecvpnserver.sh

@@ -12,8 +12,8 @@ for env in "${environment[@]}";do
 done
 
 declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1" )
 declare -A IMAGES=( [service]="dockerbunker/${SERVICE_NAME}" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/lib/modules" )
 declare -A BUILD_IMAGES=( [dockerbunker/${SERVICE_NAME}]="${DOCKERFILES}/${SERVICE_NAME}" )
 
 [[ -z $1 ]] && options_menu

+ 2 - 2
data/services/kanboard/containers.sh

@@ -3,7 +3,7 @@ kanboard_service_dockerbunker() {
 		--name=${FUNCNAME[0]//_/-} \
 		--restart=always \
 		--network ${NETWORK} \
-		-v ${SERVICE_NAME}-db-vol-1:/var/www/app/data \
-		-v ${SERVICE_NAME}-data-vol-1:/var/www/app/plugins \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
+		-v ${SERVICE_NAME}-db-vol-1:${volumes[${SERVICE_NAME}-db-vol-1]} \
 	${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/kanboard/kanboard.sh

@@ -15,8 +15,8 @@ done
 
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/var/www/app/data" [${SERVICE_NAME}-data-vol-2]="/var/www/app/plugins" )
 declare -a networks=( )
 declare -A IMAGES=( [service]="kanboard/kanboard:v1.2.1" )
 

+ 1 - 1
data/services/mailcowdockerized/mailcowdockerized.sh

@@ -15,7 +15,7 @@ done
 
 declare -A WEB_SERVICES
 declare -a containers=( "mailcowdockerized_acme-mailcow_1" "mailcowdockerized_rspamd-mailcow_1" "mailcowdockerized_nginx-mailcow_1" "mailcowdockerized_netfilter-mailcow_1" "mailcowdockerized_php-fpm-mailcow_1" "mailcowdockerized_redis-mailcow_1" "mailcowdockerized_unbound-mailcow_1" "mailcowdockerized_ipv6nat_1" "mailcowdockerized_postfix-mailcow_1" "mailcowdockerized_memcached-mailcow_1" "mailcowdockerized_sogo-mailcow_1" "mailcowdockerized_watchdog-mailcow_1" "mailcowdockerized_dockerapi-mailcow_1" "mailcowdockerized_clamd-mailcow_1" "mailcowdockerized_dovecot-mailcow_1" "mailcowdockerized_mysql-mailcow_1" )
-declare -a volumes=( "mailcowdockerized_crypt-vol-1" "mailcowdockerized_dkim-vol-1" "mailcowdockerized_mysql-vol-1" "mailcowdockerized_postfix-vol-1" "mailcowdockerized_redis-vol-1" "mailcowdockerized_rspamd-sock" "mailcowdockerized_rspamd-vol-1" "mailcowdockerized_vmail-vol-1" )
+declare -A volumes=( [mailcowdockerized_crypt-vol-1]="/var/lib/zeyple" [mailcowdockerized_mysql-vol-1]="/var/lib/mysql/" [mailcowdockerized_postfix-vol-1]="/var/spool/postfix" [mailcowdockerized_redis-vol-1]="/data" [mailcowdockerized_rspamd-sock]="/rspamd-sock" [mailcowdockerized_rspamd-vol-1]="/var/lib/rspamd" [mailcowdockerized_vmail-vol-1]="/var/vmail" )
 declare -a networks=( )
 declare -a add_to_network=( "mailcowdockerized_nginx-mailcow_1" )
 

+ 1 - 1
data/services/mailpile/containers.sh

@@ -3,7 +3,7 @@ mailpile_service_dockerbunker() {
 		--name=${FUNCNAME[0]//_/-} \
 		--restart=always \
 		--network ${NETWORK} \
-		-v mailpile-data-vol-1:/mailpile-data \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 		-p ${PORT}:${PORT} \
 	${IMAGES[service]} ${COMMAND} >/dev/null
 }

+ 1 - 1
data/services/mailpile/mailpile.sh

@@ -14,7 +14,7 @@ done
 
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1")
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/mailpile-data" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
 declare -a networks=( )
 declare -A IMAGES=( [service]="dockerbunker/dillinger" )

+ 13 - 14
data/services/mastodon/containers.sh

@@ -6,9 +6,9 @@ mastodon_service_dockerbunker() {
 		--network dockerbunker-${SERVICE_NAME} \
 		--env RUN_DB_MIGRATIONS=true --env UID=991 --env GID=991 --env WEB_CONCURRENCY=16 --env MAX_THREADS=20 --env SIDEKIQ_WORKERS=25 \
 		--env-file "${SERVICE_ENV}" \
-		-v mastodon-data-vol-1:/mastodon/public/system \
-		-v mastodon-data-vol-2:/mastodon/public/assets \
-		-v mastodon-data-vol-3:/mastodon/public/packs \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
+		-v ${SERVICE_NAME}-data-vol-2:${volumes[${SERVICE_NAME}-data-vol-2]} \
+		-v ${SERVICE_NAME}-data-vol-3:${volumes[${SERVICE_NAME}-data-vol-3]} \
 	${IMAGES[service]}${GLITCH} bundle exec rails s -p 3000 -b '0.0.0.0' >/dev/null
 }
 
@@ -30,9 +30,8 @@ mastodon_sidekiq_dockerbunker() {
 		--network dockerbunker-${SERVICE_NAME} --net-alias=sidekiq \
 		--env RUN_DB_MIGRATIONS=true --env UID=991 --env GID=991 --env WEB_CONCURRENCY=16 --env MAX_THREADS=20 --env SIDEKIQ_WORKERS=25 \
 		--env-file "${SERVICE_ENV}" \
-		-v mastodon-data-vol-1:/mastodon/public/system \
-		-v mastodon-data-vol-2:/mastodon/public/assets \
-		-v mastodon-data-vol-3:/mastodon/public/packs \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
+		-v ${SERVICE_NAME}-data-vol-2:${volumes[${SERVICE_NAME}-data-vol-2]} \
 	${IMAGES[service]}${GLITCH} bundle exec sidekiq -q default -q mailers -q pull -q push >/dev/null
 }
 
@@ -40,7 +39,7 @@ mastodon_redis_dockerbunker() {
 	docker run -d --user redis \
 		--name ${FUNCNAME[0]//_/-} \
 		--network dockerbunker-${SERVICE_NAME} --net-alias redis \
-		-v mastodon-redis-vol-1:/data \
+		-v ${SERVICE_NAME}-redis-vol-1:${volumes[${SERVICE_NAME}-redis-vol-1]} \
 	${IMAGES[redis]} >/dev/null
 }
 
@@ -50,7 +49,7 @@ mastodon_elasticsearch_dockerbunker() {
 		--restart=unless-stopped \
 		--network dockerbunker-${SERVICE_NAME} --net-alias=es \
 		--env ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-		-v mastodon-elasticsearch-vol-1:/usr/share/elasticsearch/data \
+		-v ${SERVICE_NAME}-elasticsearch-vol-1:${volumes[${SERVICE_NAME}-elasticsearch-vol-1]} \
 	${IMAGES[elasticsearch]} >/dev/null
 }
 
@@ -78,9 +77,9 @@ mastodon_dbmigrateandprecompileassets_dockerbunker() {
 		--name=${SERVICE_NAME}-dbsetup-dockerbunker \
 		--network dockerbunker-${SERVICE_NAME} \
 		--env-file "${SERVICE_ENV}" \
-		-v mastodon-data-vol-1:/mastodon/public/system \
-		-v mastodon-data-vol-2:/mastodon/public/assets \
-		-v mastodon-data-vol-3:/mastodon/public/packs \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
+		-v ${SERVICE_NAME}-data-vol-2:${volumes[${SERVICE_NAME}-data-vol-2]} \
+		-v ${SERVICE_NAME}-data-vol-3:${volumes[${SERVICE_NAME}-data-vol-3]} \
 	${IMAGES[service]}${GLITCH} bash -c "rake db:migrate && rake assets:precompile" >/dev/null
 	exit_response
 }
@@ -91,9 +90,9 @@ mastodon_makeadmin_dockerbunker() {
 		--name=${FUNCNAME[0]//_/-} \
 		--network dockerbunker-${SERVICE_NAME} \
 		--env-file "${SERVICE_ENV}" \
-		-v mastodonglitch-data-vol-1:/mastodon/public/system \
-		-v mastodonglitch-data-vol-2:/mastodon/public/assets \
-		-v mastodonglitch-data-vol-3:/mastodon/public/packs \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
+		-v ${SERVICE_NAME}-data-vol-2:${volumes[${SERVICE_NAME}-data-vol-2]} \
+		-v ${SERVICE_NAME}-data-vol-3:${volumes[${SERVICE_NAME}-data-vol-3]} \
 	${IMAGES[service]} bash -c "RAILS_ENV=production bundle exec rails mastodon:make_admin USERNAME=${1}" >/dev/null
 	exit_response
 }

+ 1 - 1
data/services/mastodon/mastodon.sh

@@ -14,7 +14,7 @@ done
 
 declare -a containers=( "${SERVICE_NAME}-postgres-dockerbunker" "${SERVICE_NAME}-redis-dockerbunker" "${SERVICE_NAME}-service-dockerbunker" "${SERVICE_NAME}-streaming-dockerbunker" "${SERVICE_NAME}-sidekiq-dockerbunker" "${SERVICE_NAME}-elasticsearch-dockerbunker" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" "${SERVICE_NAME}-streaming-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1" "${SERVICE_NAME}-data-vol-2" "${SERVICE_NAME}-data-vol-3" "${SERVICE_NAME}-redis-data-vol-1" "${SERVICE_NAME}-elasticsearch-vol-1" "${SERVICE_NAME}-postgres-vol-1" "${SERVICE_NAME}-sidekiq-vol-1" "${SERVICE_NAME}-sidekiq-vol-2" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/mastodon/public/system" [${SERVICE_NAME}-data-vol-2]="/mastodon/public/assets" [${SERVICE_NAME}-data-vol-3]="/mastodon/public/packs" [${SERVICE_NAME}-postgres-vol-1]="/var/lib/postgresql/data" [${SERVICE_NAME}-elasticsearch-vol-1]="/usr/share/elasticsearch/data" [${SERVICE_NAME}-redis-vol-1]="/data" )
 declare -a networks=( "dockerbunker-${SERVICE_NAME}" )
 declare -A IMAGES=( [service]="dockerbunker/${SERVICE_NAME}" [redis]="redis:4.0-alpine" [postgres]="postgres" [elasticsearch]="docker.elastic.co/elasticsearch/elasticsearch-oss:6.1.3" )
 declare -A BUILD_IMAGES=( [dockerbunker/${SERVICE_NAME}${GLITCH}]="${DOCKERFILES}/${SERVICE_NAME}${GLITCH}" )

+ 4 - 5
data/services/nextcloud/containers.sh

@@ -4,7 +4,7 @@ nextcloud_db_dockerbunker() {
 		--restart=always \
 		--network dockerbunker-${SERVICE_NAME} --net-alias=db \
 		--env-file="${SERVICE_ENV}" \
-		-v nextcloud-db-vol-1:/var/lib/mysql \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 		-v "${SERVICES_DIR}"/${SERVICE_NAME}/mysql/:/etc/mysql/conf.d/:ro \
 		--health-cmd="mysqladmin ping --host localhost --silent" --health-interval=10s --health-retries=5 --health-timeout=30s \
 	${IMAGES[db]} >/dev/null
@@ -18,10 +18,9 @@ nextcloud_service_dockerbunker() {
 		--restart=always \
 		--network dockerbunker-${SERVICE_NAME} \
 		--env-file="${SERVICE_ENV}" \
-		-v nextcloud-data-vol-1:/var/www/html \
-		-v nextcloud-data-vol-2:/var/www/html/custom_apps \
-		-v nextcloud-data-vol-3:/var/www/html/config \
-		-v nextcloud-data-vol-4:/var/www/html/data \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
+		-v ${SERVICE_NAME}-data-vol-2:${volumes[${SERVICE_NAME}-data-vol-2]} \
+		-v ${SERVICE_NAME}-data-vol-3:${volumes[${SERVICE_NAME}-data-vol-3]} \
 	${IMAGES[service]} >/dev/null
 }
 

+ 1 - 1
data/services/nextcloud/nextcloud.sh

@@ -16,7 +16,7 @@ declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" "${SERVICE_NAME}-db-dockerbunker" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
 declare -A IMAGES=( [service]="nextcloud:stable" [db]="mariadb:10.2" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1" "${SERVICE_NAME}-data-vol-2" "${SERVICE_NAME}-data-vol-3" "${SERVICE_NAME}-data-vol-4" "${SERVICE_NAME}-db-vol-1" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/var/www/html/custom_apps" [${SERVICE_NAME}-data-vol-2]="/var/www/html/config" [${SERVICE_NAME}-data-vol-3]="/var/www/html/data" [${SERVICE_NAME}-db-vol-1]="/var/lib/mysql" )
 declare -a networks=( "dockerbunker-${SERVICE_NAME}" )
 
 [[ -z $1 ]] && options_menu

+ 3 - 3
data/services/openproject/containers.sh

@@ -4,8 +4,8 @@ openproject_service_dockerbunker() {
 		--restart=always \
 		--env-file "${ENV_DIR}"/${SERVICE_SPECIFIC_MX}mx.env \
 		--env-file "${SERVICE_ENV}" \
-		-v openproject-pgdata-vol-1:/var/lib/postgresql/9.4/main \
-		-v openproject-logs-vol-1:/var/log/supervisor \
-		-v openproject-data-vol-1:/var/db/openproject \
+		-v ${SERVICE_NAME}-pgdata-vol-1:${volumes[${SERVICE_NAME}-pgdata-vol-1]} \
+		-v ${SERVICE_NAME}-logs-vol-1:${volumes[${SERVICE_NAME}-logs-vol-1]} \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 	${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/openproject/openproject.sh

@@ -15,7 +15,7 @@ done
 
 declare -A WEB_SERVICES
 declare -a containers=( "openproject-service-dockerbunker" )
-declare -a volumes=( "openproject-data-vol-1" "openproject-pgdata-vol-1" "openproject-logs-vol-1" )
+declare -A volumes=( [${SERVICE_NAME}-pgdata-vol-1]="/hastebin/data" [${SERVICE_NAME}-data-vol-1]="/var/db/openproject" [${SERVICE_NAME}-logs-vol-1]="/var/log/supervisor" )
 declare -a add_to_network=( "openproject-service-dockerbunker" )
 declare -a networks=( )
 declare -A IMAGES=( [service]="openproject/community" )

+ 3 - 3
data/services/piwik/containers.sh

@@ -4,7 +4,7 @@ piwik_db_dockerbunker() {
 		--restart=always \
 		--network dockerbunker-${SERVICE_NAME} --net-alias=db \
 		--env-file="${SERVICE_ENV}"\
-		-v ${SERVICE_NAME}-db-vol-1:/var/lib/mysql \
+		-v ${SERVICE_NAME}-db-vol-1:${volumes[${SERVICE_NAME}-db-vol-1]} \
 		-v "${SERVICES_DIR}"/${SERVICE_NAME}/mysql/:/etc/mysql/conf.d/:ro \
 		--health-cmd="mysqladmin ping --host localhost --silent" --health-interval=10s --health-retries=5 --health-timeout=30s \
 	${IMAGES[db]} >/dev/null
@@ -17,7 +17,7 @@ piwik_service_dockerbunker() {
 		--name=${SERVICE_NAME}-service-dockerbunker \
 		--restart=always \
 		--network dockerbunker-piwik \
-		-v ${SERVICE_NAME}-data-vol-1:/var/www/app/data \
-		-v ${SERVICE_NAME}-data-vol-2:/var/www/app/plugins \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
+		-v ${SERVICE_NAME}-data-vol-2:${volumes[${SERVICE_NAME}-data-vol-2]} \
 	${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/piwik/piwik.sh

@@ -14,7 +14,7 @@ done
 
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" "${SERVICE_NAME}-db-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1" "${SERVICE_NAME}-data-vol-2" "${SERVICE_NAME}-db-vol-1" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/var/www/app/data" [${SERVICE_NAME}-data-vol-2]="/var/www/app/plugins" [${SERVICE_NAME}-db-vol-1]="/var/lib/mysql" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
 declare -a networks=( "dockerbunker-${SERVICE_NAME}" )
 declare -A IMAGES=( [service]="piwik" [db]="mariadb:10.2" )

+ 3 - 3
data/services/seafilepro/containers.sh

@@ -4,7 +4,7 @@ seafilepro_db_dockerbunker() {
 		--restart=always \
 		--network dockerbunker-${SERVICE_NAME} \
 		--net-alias=db \
-		-v seafilepro-db-vol-1:/var/lib/mysql \
+		-v ${SERVICE_NAME}-db-vol-1:${volumes[${SERVICE_NAME}-db-vol-1]} \
 		--env MYSQL_ROOT_PASSWORD=${DBROOT} \
 		--env MYSQL_USER=${DBUSER} \
 		--env MYSQL_PASSWORD=${DBPASS} \
@@ -29,7 +29,7 @@ seafilepro_setup_dockerbunker() {
 	docker run -it --rm \
 		--name=${FUNCNAME[0]//_/-} \
 		--network=dockerbunker-${SERVICE_NAME} \
-		-v seafilepro-data-vol-1:/seafile \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 		-v "${BASE_DIR}"/data/services/seafilepro/seafile-license.txt \
 	${IMAGES[service]} $1
 }
@@ -40,7 +40,7 @@ seafilepro_service_dockerbunker() {
 		--restart=always \
 		--network ${NETWORK} \
 		--network dockerbunker-seafilepro \
-		-v seafilepro-data-vol-1:/seafile \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 		-v "${BASE_DIR}"/data/services/seafilepro/seafile-license.txt \
 	${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/seafilepro/seafilepro.sh

@@ -16,7 +16,7 @@ done
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-db-dockerbunker" "${SERVICE_NAME}-service-dockerbunker" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-db-vol-1" "${SERVICE_NAME}-data-vol-1" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/seafile" [${SERVICE_NAME}-db-vol-1]="/var/lib/mysql" )
 declare -a networks=( "dockerbunker-${SERVICE_NAME}" )
 declare -A IMAGES=( [db]="mariadb:10.2" [service]="dockerbunker/${SERVICE_NAME}" )
 declare -A BUILD_IMAGES=( [dockerbunker/${SERVICE_NAME}]="${DOCKERFILES}/${SERVICE_NAME}" )

+ 0 - 1
data/services/searx/searx.sh

@@ -14,7 +14,6 @@ done
 
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
 declare -a networks=( )
 declare -A IMAGES=( [service]="dockerbunker/${SERVICE_NAME}" )

+ 1 - 1
data/services/send/containers.sh

@@ -4,6 +4,6 @@ send_service_dockerbunker() {
 		--restart=always \
 		--network ${NETWORK} \
 		--env-file "${SERVICE_ENV}" \
-		-v ${SERVICE_NAME}-data-vol-1:/send/data \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 	${IMAGES[service]} >/dev/null
 }

+ 1 - 1
data/services/send/send.sh

@@ -14,7 +14,7 @@ done
 
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-data-vol-1" )
+declare -A volumes=( [${SERVICE_NAME}-data-vol-1]="/send/data" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
 declare -a networks=( )
 declare -A IMAGES=( [service]="dockerbunker/${SERVICE_NAME}" )

+ 1 - 1
data/services/sftpserver/sftpserver.sh

@@ -15,7 +15,7 @@ done
 
 declare -A WEB_SERVICES
 declare -a containers=( "sftpserver-service-dockerbunker" )
-declare -a volumes=( "sftpserver-data-vol-1" )
+declare -a volumes=( )
 declare -a networks=( )
 declare -A IMAGES=( [service]="atmoz/sftp:alpine-3.7" )
 declare -a add_to_network=( "sftpserver-service-dockerbunker" )

+ 2 - 2
data/services/wordpress/containers.sh

@@ -4,7 +4,7 @@ wordpress_db_dockerbunker() {
 		--restart=always \
 		--network dockerbunker-${SERVICE_NAME} --net-alias=db \
 		--env-file="${SERVICE_ENV}" \
-		-v wordpress-db-vol-1:/var/lib/mysql \
+		-v ${SERVICE_NAME}-db-vol-1:${volumes[${SERVICE_NAME}-db-vol-1]} \
 		-v "${BASE_DIR}/data/services/${SERVICE_NAME}/mysql/":/etc/mysql/conf.d/:ro \
 		--health-cmd="mysqladmin ping --host localhost --silent" --health-interval=10s --health-retries=5 --health-timeout=30s \
 	${IMAGES[db]} >/dev/null
@@ -22,7 +22,7 @@ wordpress_service_dockerbunker() {
 		--env WORDPRESS_DB_USER=${MYSQL_USER} \
 		--env WORDPRESS_DB_PASSWORD=${MYSQL_PASSWORD} \
 		-v "${BASE_DIR}/data/services/${SERVICE_NAME}/php/uploads.ini":/usr/local/etc/php/conf.d/uploads.ini \
-		-v wordpress-data-vol-1:/var/www/html/wp-content \
+		-v ${SERVICE_NAME}-data-vol-1:${volumes[${SERVICE_NAME}-data-vol-1]} \
 	${IMAGES[service]} >/dev/null
 }
 

+ 2 - 2
data/services/wordpress/wordpress.sh

@@ -15,9 +15,9 @@ done
 declare -A WEB_SERVICES
 declare -a containers=( "${SERVICE_NAME}-db-dockerbunker" "${SERVICE_NAME}-service-dockerbunker" )
 declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
-declare -a volumes=( "${SERVICE_NAME}-db-vol-1" "${SERVICE_NAME}-data-vol-1" )
+declare -A volumes=( [${SERVICE_NAME}-db-vol-1]="/var/lib/mysql" [${SERVICE_NAME}-data-vol-1]="/var/www/html/wp-content" )
 declare -a networks=( "dockerbunker-${SERVICE_NAME}" )
-declare -A IMAGES=( [db]="mariadb:10.1" [service]="dockerbunker/${SERVICE_NAME}" )
+declare -A IMAGES=( [db]="mariadb:10.2" [service]="dockerbunker/${SERVICE_NAME}" )
 declare -A BUILD_IMAGES=( [dockerbunker/${SERVICE_NAME}]="${DOCKERFILES}/${SERVICE_NAME}" )
 
 [[ -z $1 ]] && options_menu