#!/bin/bash
# Tip: Use an alias pointing to this script.
# --- Colors ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
show_help() {
printf "${BLUE}============================================================${NC}\n"
printf "${YELLOW} HomeServer Management Script ${NC}\n"
printf "${BLUE}============================================================${NC}\n\n"
printf "${GREEN}Usage:${NC}\n"
printf " ${YELLOW}./homeserver help${NC} → Show available commands\n"
printf " ${YELLOW}./homeserver update${NC} → Update only docker stacks with currently running services\n"
printf " ${YELLOW}./homeserver update all${NC} → Update and start all docker stacks regardless of running state\n"
printf " ${YELLOW}./homeserver stop${NC} → Stop all cdocker stacks\n"
printf " ${YELLOW}./homeserver stop
${NC} → Stop a single stack\n"
printf " ${YELLOW}./homeserver start ${NC} → Start a single stack\n"
}
find_compose_dirs() {
find . -mindepth 2 -maxdepth 2 -name "docker-compose.yml" -exec dirname {} \; | sort -u
}
is_stack_running() {
local compose_file="$1/docker-compose.yml"
docker compose -f "$compose_file" ps --services --filter "status=running" | grep -q .
}
update_stack() {
local dir="$1"
local compose_file="$dir/docker-compose.yml"
echo -e "${YELLOW}Updating stack in $dir...${NC}"
docker compose -f "$compose_file" up -d --pull always --force-recreate
}
stop_stack() {
local dir="$1"
local compose_file="$dir/docker-compose.yml"
echo -e "${RED}Stopping stack in $dir...${NC}"
docker compose -f "$compose_file" down
}
start_stack() {
local dir="$1"
local compose_file="$dir/docker-compose.yml"
echo -e "${GREEN}Starting stack in $dir...${NC}"
docker compose -f "$compose_file" up -d
}
create_traefik_proxy_network() {
if ! docker network inspect traefik_proxy >/dev/null 2>&1; then
echo -e "${BLUE}Network 'traefik_proxy' does not exist. Creating it...${NC}"
docker network create traefik_proxy
fi
}
# --- Main Script ---
COMMAND="$1"
OPTION="$2"
case "$COMMAND" in
help)
show_help
;;
update)
UPDATE_ALL=false
[[ "$OPTION" == "all" ]] && UPDATE_ALL=true
create_traefik_proxy_network
for dir in $(find_compose_dirs); do
if ! $UPDATE_ALL; then
if is_stack_running "$dir"; then
update_stack "$dir"
else
echo -e "${BLUE}Skipping $dir (no running services)${NC}"
fi
else
update_stack "$dir"
fi
done
echo -e "${GREEN}Selected docker-compose stacks updated.${NC}"
;;
stop)
if [[ -n "$OPTION" ]]; then
stop_stack "$OPTION"
else
for dir in $(find_compose_dirs); do
stop_stack "$dir"
done
echo -e "${RED}All stacks stopped.${NC}"
fi
;;
start)
if [[ -n "$OPTION" ]]; then
start_stack "$OPTION"
else
echo -e "${RED}Please specify a service directory to start.${NC}"
fi
;;
*)
echo -e "${RED}Unknown command: $COMMAND${NC}"
echo -e "${RED}Run './homeserver help' for usage.${NC}"
;;
esac