@@ -10,6 +10,8 @@ CYAN='\033[0;36m'
1010NC=' \033[0m'
1111
1212MEDIA_DIR=" $HOME /Media"
13+ STACK_DIR=" $MEDIA_DIR "
14+ STACK_DIR_SET=false
1315KEEP_DAYS=14
1416
1517usage () {
@@ -18,8 +20,9 @@ usage() {
1820 echo " Back up your *arr Docker stack configs, databases, and compose files."
1921 echo " "
2022 echo " Options:"
21- echo " --path DIR Media directory (default: ~/Media)"
22- echo " --keep DAYS Days of backups to keep (default: 14)"
23+ echo " --path DIR Media directory (default: ~/Media)"
24+ echo " --stack-dir DIR Stack directory with docker-compose/.env (default: --path)"
25+ echo " --keep DAYS Days of backups to keep (default: 14)"
2326 echo " --help Show this help"
2427 exit " ${1:- 0} "
2528}
@@ -34,6 +37,15 @@ while [[ $# -gt 0 ]]; do
3437 MEDIA_DIR=" $2 "
3538 shift 2
3639 ;;
40+ --stack-dir)
41+ if [[ $# -lt 2 ]]; then
42+ echo -e " ${RED} ERR${NC} Missing value for --stack-dir"
43+ usage 1
44+ fi
45+ STACK_DIR=" $2 "
46+ STACK_DIR_SET=true
47+ shift 2
48+ ;;
3749 --keep)
3850 if [[ $# -lt 2 ]]; then
3951 echo -e " ${RED} ERR${NC} Missing value for --keep"
@@ -48,6 +60,10 @@ while [[ $# -gt 0 ]]; do
4860done
4961
5062MEDIA_DIR=" ${MEDIA_DIR/# \~ / $HOME } "
63+ if [[ " $STACK_DIR_SET " != true ]]; then
64+ STACK_DIR=" $MEDIA_DIR "
65+ fi
66+ STACK_DIR=" ${STACK_DIR/# \~ / $HOME } "
5167BACKUP_DIR=" $MEDIA_DIR /backups"
5268LOG_DIR=" $MEDIA_DIR /logs"
5369TIMESTAMP=$( date +" %Y%m%d-%H%M%S" )
@@ -66,6 +82,7 @@ echo -e "${CYAN} Mac Media Stack Backup${NC}"
6682echo -e " ${CYAN} ==============================${NC} "
6783echo " "
6884echo -e " ${CYAN} INF${NC} Media directory: $MEDIA_DIR "
85+ echo -e " ${CYAN} INF${NC} Stack directory: $STACK_DIR "
6986echo -e " ${CYAN} INF${NC} Timestamp: $TIMESTAMP "
7087echo " "
7188
@@ -75,6 +92,11 @@ if [[ ! -d "$MEDIA_DIR" ]]; then
7592 exit 1
7693fi
7794
95+ if [[ ! -d " $STACK_DIR " ]]; then
96+ echo -e " ${RED} ERR${NC} Stack directory not found: $STACK_DIR "
97+ exit 1
98+ fi
99+
78100if ! [[ " $KEEP_DAYS " =~ ^[0-9]+$ ]]; then
79101 echo -e " ${RED} ERR${NC} --keep must be a whole number"
80102 exit 1
@@ -145,14 +167,14 @@ echo ""
145167# ==============================
146168echo -e " ${CYAN} --- Compose File ---${NC} "
147169
148- if [[ -f " $MEDIA_DIR /docker-compose.yml" ]]; then
149- cp " $MEDIA_DIR /docker-compose.yml" " $BACKUP_STAGING /"
170+ if [[ -f " $STACK_DIR /docker-compose.yml" ]]; then
171+ cp " $STACK_DIR /docker-compose.yml" " $BACKUP_STAGING /"
150172 echo -e " ${GREEN} OK${NC} Copied docker-compose.yml"
151- elif [[ -f " $MEDIA_DIR /docker-compose.yaml" ]]; then
152- cp " $MEDIA_DIR /docker-compose.yaml" " $BACKUP_STAGING /"
173+ elif [[ -f " $STACK_DIR /docker-compose.yaml" ]]; then
174+ cp " $STACK_DIR /docker-compose.yaml" " $BACKUP_STAGING /"
153175 echo -e " ${GREEN} OK${NC} Copied docker-compose.yaml"
154176else
155- echo -e " ${YELLOW} WRN${NC} No docker-compose file found in $MEDIA_DIR "
177+ echo -e " ${YELLOW} WRN${NC} No docker-compose file found in $STACK_DIR "
156178fi
157179echo " "
158180
@@ -161,12 +183,12 @@ echo ""
161183# ==============================
162184echo -e " ${CYAN} --- Environment File ---${NC} "
163185
164- if [[ -f " $MEDIA_DIR /.env" ]]; then
165- grep -ivE ' (password|key|secret|token)' " $MEDIA_DIR /.env" > " $BACKUP_STAGING /.env.redacted" 2> /dev/null || true
166- REDACTED=$( grep -ciE ' (password|key|secret|token)' " $MEDIA_DIR /.env" 2> /dev/null || echo " 0" )
186+ if [[ -f " $STACK_DIR /.env" ]]; then
187+ grep -ivE ' (password|key|secret|token)' " $STACK_DIR /.env" > " $BACKUP_STAGING /.env.redacted" 2> /dev/null || true
188+ REDACTED=$( grep -ciE ' (password|key|secret|token)' " $STACK_DIR /.env" 2> /dev/null || echo " 0" )
167189 echo -e " ${GREEN} OK${NC} Copied .env ($REDACTED sensitive line(s) redacted)"
168190else
169- echo -e " ${YELLOW} WRN${NC} No .env file found"
191+ echo -e " ${YELLOW} WRN${NC} No .env file found in $STACK_DIR "
170192fi
171193echo " "
172194
@@ -176,11 +198,21 @@ echo ""
176198echo -e " ${CYAN} --- Container State ---${NC} "
177199
178200if command -v docker & > /dev/null; then
179- if docker compose ls & > /dev/null 2>&1 ; then
180- (cd " $MEDIA_DIR " && docker compose ps 2> /dev/null) > " $BACKUP_STAGING /container-state.txt" || true
181- echo -e " ${GREEN} OK${NC} Captured container state"
201+ COMPOSE_STATE_FILE=" "
202+ if [[ -f " $STACK_DIR /docker-compose.yml" ]]; then
203+ COMPOSE_STATE_FILE=" $STACK_DIR /docker-compose.yml"
204+ elif [[ -f " $STACK_DIR /docker-compose.yaml" ]]; then
205+ COMPOSE_STATE_FILE=" $STACK_DIR /docker-compose.yaml"
206+ fi
207+
208+ if [[ -n " $COMPOSE_STATE_FILE " ]] && docker compose ls & > /dev/null 2>&1 ; then
209+ if (cd " $STACK_DIR " && docker compose ps 2> /dev/null) > " $BACKUP_STAGING /container-state.txt" ; then
210+ echo -e " ${GREEN} OK${NC} Captured container state"
211+ else
212+ echo -e " ${YELLOW} WRN${NC} Could not capture container state from $STACK_DIR "
213+ fi
182214 else
183- echo -e " ${YELLOW} WRN${NC} Docker Compose not available, skipping container state"
215+ echo -e " ${YELLOW} WRN${NC} Compose file not found or Docker Compose unavailable; skipping container state"
184216 fi
185217else
186218 echo -e " ${YELLOW} WRN${NC} Docker not found, skipping container state"
0 commit comments