@@ -30,14 +30,21 @@ usage() {
3030 echo " bash restore.sh --latest"
3131 echo " bash restore.sh 20260222-020000"
3232 echo " bash restore.sh backup-20260222-020000.tar.gz"
33- exit 0
33+ exit " ${1 :- 0} "
3434}
3535
3636while [[ $# -gt 0 ]]; do
3737 case " $1 " in
3838 --list) LIST_MODE=true; shift ;;
3939 --latest) LATEST_MODE=true; shift ;;
40- --path) MEDIA_DIR=" $2 " ; shift 2 ;;
40+ --path)
41+ if [[ $# -lt 2 ]]; then
42+ echo -e " ${RED} ERR${NC} Missing value for --path"
43+ usage 1
44+ fi
45+ MEDIA_DIR=" $2 "
46+ shift 2
47+ ;;
4148 --help) usage ;;
4249 -* ) echo -e " ${RED} ERR${NC} Unknown option: $1 " ; exit 1 ;;
4350 * ) BACKUP_TARGET=" $1 " ; shift ;;
@@ -63,15 +70,15 @@ if $LIST_MODE; then
6370 echo " "
6471
6572 FOUND=0
66- for f in $( ls -t " $BACKUP_DIR " /backup- * .tar.gz 2> /dev/null ) ; do
73+ while IFS= read -r f ; do
6774 name=$( basename " $f " )
6875 size=$( du -sh " $f " | cut -f1)
6976 date_part=$( echo " $name " | sed ' s/backup-\([0-9]*\)-\([0-9]*\).*/\1/' )
7077 time_part=$( echo " $name " | sed ' s/backup-[0-9]*-\([0-9]*\).*/\1/' )
7178 formatted_date=" ${date_part: 0: 4} -${date_part: 4: 2} -${date_part: 6: 2} ${time_part: 0: 2} :${time_part: 2: 2} :${time_part: 4: 2} "
7279 echo -e " ${GREEN} $name ${NC} ($size ) $formatted_date "
7380 FOUND=$(( FOUND + 1 ))
74- done
81+ done < <( ls -1t " $BACKUP_DIR " /backup- * .tar.gz 2> /dev/null )
7582
7683 if [[ $FOUND -eq 0 ]]; then
7784 echo -e " ${YELLOW} No backups found${NC} "
@@ -142,8 +149,12 @@ trap cleanup EXIT
142149# ==============================
143150echo -e " ${CYAN} --- Extracting ---${NC} "
144151tar -xzf " $BACKUP_FILE " -C " $TEMP_DIR "
145- BACKUP_ROOT=$( ls " $TEMP_DIR " )
146- EXTRACTED=" $TEMP_DIR /$BACKUP_ROOT "
152+ BACKUP_ROOT=$( find " $TEMP_DIR " -mindepth 1 -maxdepth 1 -type d | head -1)
153+ if [[ -z " $BACKUP_ROOT " || ! -d " $BACKUP_ROOT " ]]; then
154+ echo -e " ${RED} ERR${NC} Backup archive did not contain a valid root directory"
155+ exit 1
156+ fi
157+ EXTRACTED=" $BACKUP_ROOT "
147158echo -e " ${GREEN} OK${NC} Extracted to temp directory"
148159echo " "
149160
@@ -152,9 +163,19 @@ echo ""
152163# ==============================
153164echo -e " ${CYAN} --- Stopping Containers ---${NC} "
154165
155- if command -v docker & > /dev/null && [[ -f " $MEDIA_DIR /docker-compose.yml" || -f " $MEDIA_DIR /docker-compose.yaml" ]]; then
156- (cd " $MEDIA_DIR " && docker compose stop 2> /dev/null) || true
157- echo -e " ${GREEN} OK${NC} Containers stopped"
166+ STOP_COMPOSE_FILE=" "
167+ if [[ -f " $MEDIA_DIR /docker-compose.yml" ]]; then
168+ STOP_COMPOSE_FILE=" $MEDIA_DIR /docker-compose.yml"
169+ elif [[ -f " $MEDIA_DIR /docker-compose.yaml" ]]; then
170+ STOP_COMPOSE_FILE=" $MEDIA_DIR /docker-compose.yaml"
171+ fi
172+
173+ if command -v docker & > /dev/null && [[ -n " $STOP_COMPOSE_FILE " ]]; then
174+ if (cd " $MEDIA_DIR " && docker compose stop > /dev/null 2>&1 ); then
175+ echo -e " ${GREEN} OK${NC} Containers stopped"
176+ else
177+ echo -e " ${YELLOW} WRN${NC} Failed to stop containers cleanly, continuing restore"
178+ fi
158179else
159180 echo -e " ${YELLOW} WRN${NC} No compose file or Docker not found, skipping container stop"
160181fi
@@ -239,15 +260,27 @@ echo ""
239260# ==============================
240261echo -e " ${CYAN} --- Restarting Containers ---${NC} "
241262
242- if command -v docker & > /dev/null && [[ -f " $MEDIA_DIR /docker-compose.yml" || -f " $MEDIA_DIR /docker-compose.yaml" ]]; then
243- (cd " $MEDIA_DIR " && docker compose up -d 2> /dev/null) || true
244- echo -e " ${GREEN} OK${NC} Containers started"
245- echo " "
263+ START_COMPOSE_FILE=" "
264+ if [[ -f " $MEDIA_DIR /docker-compose.yml" ]]; then
265+ START_COMPOSE_FILE=" $MEDIA_DIR /docker-compose.yml"
266+ elif [[ -f " $MEDIA_DIR /docker-compose.yaml" ]]; then
267+ START_COMPOSE_FILE=" $MEDIA_DIR /docker-compose.yaml"
268+ fi
269+
270+ if command -v docker & > /dev/null && [[ -n " $START_COMPOSE_FILE " ]]; then
271+ if (cd " $MEDIA_DIR " && docker compose up -d > /dev/null 2>&1 ); then
272+ echo -e " ${GREEN} OK${NC} Containers started"
273+ echo " "
246274
247- # Health check
248- echo -e " ${CYAN} --- Health Check ---${NC} "
249- sleep 3
250- (cd " $MEDIA_DIR " && docker compose ps 2> /dev/null) || true
275+ # Health check
276+ echo -e " ${CYAN} --- Health Check ---${NC} "
277+ sleep 3
278+ (cd " $MEDIA_DIR " && docker compose ps 2> /dev/null) || true
279+ else
280+ echo -e " ${RED} ERR${NC} Restore completed, but container restart failed."
281+ echo -e " ${RED} ERR${NC} Check compose syntax/secrets and run: (cd \" $MEDIA_DIR \" && docker compose up -d)"
282+ exit 1
283+ fi
251284else
252285 echo -e " ${YELLOW} WRN${NC} No compose file or Docker not found, skipping restart"
253286fi
0 commit comments