diff --git a/Makefile b/Makefile index a8c1379..b032e9a 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,8 @@ ENV ?= prod COMPOSE_FILE = docker-compose.yml ENV_FILE = .env.$(ENV) -PROJECT_NAME = attendancesystem-$(ENV) +CONTAINER_POSTFIX := $(shell grep '^CONTAINER_POSTFIX=' $(ENV_FILE) 2>/dev/null | cut -d'=' -f2-) +PROJECT_NAME = attendancesystem-$(ENV)$(if $(CONTAINER_POSTFIX),-$(CONTAINER_POSTFIX),) NETWORK_NAME = attendancesystem-network .PHONY: app install update reset-network nuke nuke-project diff --git a/attendancesystem b/attendancesystem new file mode 160000 index 0000000..f8238b9 --- /dev/null +++ b/attendancesystem @@ -0,0 +1 @@ +Subproject commit f8238b9ac3dee919ab7a5e5ada54d5f3d8ec6d14 diff --git a/docker-compose.yml b/docker-compose.yml index b3290be..f4be348 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,6 +2,7 @@ services: # ================= BACKEND ================= attendancesystem-api: + container_name: attendancesystem-api${CONTAINER_NAME_SUFFIX} image: ${DOCKER_REPO}/backend-attendance-system-api:${IMAGEM_RELEASE_1_3} profiles: ["app"] ports: @@ -15,6 +16,7 @@ services: # ================= FRONTEND ================= config-generator: + container_name: config-generator${CONTAINER_NAME_SUFFIX} image: alpine:${IMAGEM_LATEST} profiles: ["app"] environment: @@ -39,6 +41,7 @@ services: restart: "no" attendancesystem-app: + container_name: attendancesystem-app${CONTAINER_NAME_SUFFIX} image: ${DOCKER_REPO}/attendancesystem-frontend:${IMAGEM_RELEASE_1_3} profiles: ["app"] volumes: diff --git a/install.sh b/install.sh index 985f2d4..e8cada1 100644 --- a/install.sh +++ b/install.sh @@ -91,6 +91,24 @@ ask() { eval "$varname=\"$value\"" } +ask_optional() { + # ask_optional [default] + local varname="$1" + local prompt="$2" + local default="$3" + local value="" + + if [ -n "$default" ]; then + echo -ne " ${BOLD}${prompt}${NC} ${DIM}[${default}]${NC} ${DIM}(ENTER para nenhum)${NC}: " + else + echo -ne " ${BOLD}${prompt}${NC} ${DIM}(ENTER para nenhum)${NC}: " + fi + + read -r value + value="${value:-$default}" + eval "$varname=\"$value\"" +} + confirm() { echo -ne " ${BOLD}$1${NC} ${CYAN}[s/N]${NC}: " read -r resp @@ -233,6 +251,14 @@ collect_external_ports() { ask FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT "Frontend AttendanceSystem" "${FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT:-$FRONTEND_ATTENDANCESYSTEM_APP_INTERNAL_PORT}" } +collect_container_postfix() { + print_section "5. Identificador de instância (postfix dos containers)" + echo -e " ${DIM}Distingue containers de múltiplas instalações na mesma máquina.${NC}" + echo -e " ${DIM}Exemplo: 'cliente1' → 'attendancesystem-api-cliente1', etc.${NC}" + echo -e " ${DIM}Deixe em branco para manter o comportamento padrão.${NC}\n" + ask_optional CONTAINER_POSTFIX "Postfix" "${CONTAINER_POSTFIX:-}" +} + # ══════════════════════════════════════════════════════════════ # Wizard principal — coleta com navegação # ══════════════════════════════════════════════════════════════ @@ -256,6 +282,8 @@ collect_config() { FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT="$FRONTEND_ATTENDANCESYSTEM_APP_INTERNAL_PORT" print_ok "Portas externas definidas iguais às internas." fi + + collect_container_postfix } # ══════════════════════════════════════════════════════════════ @@ -285,6 +313,13 @@ show_summary() { echo -e " Backend Attendance : ${BOLD}${BACKEND_ATTENDANCESYSTEM_API_EXTERNAL_PORT}${NC}" echo -e " Frontend Attendance : ${BOLD}${FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT}${NC}" echo "" + echo -e " ${BOLD}[5] Identificador de instância${NC}" + if [ -n "$CONTAINER_POSTFIX" ]; then + echo -e " Postfix : ${BOLD}${CONTAINER_POSTFIX}${NC}" + else + echo -e " Postfix : ${DIM}(nenhum — comportamento padrão)${NC}" + fi + echo "" echo -e " ──────────────────────────────────────────────────────────────" echo -e " ${GREEN}${BOLD}[C]${NC} Confirmar e continuar ${RED}${BOLD}[X]${NC} Cancelar instalação" echo -e " ──────────────────────────────────────────────────────────────" @@ -297,6 +332,7 @@ show_summary() { 2) collect_system_base ;; 3) collect_internal_ports ;; 4) collect_external_ports ;; + 5) collect_container_postfix ;; C) break ;; X) echo "" @@ -304,7 +340,7 @@ show_summary() { exit 0 ;; *) - print_warn "Opção inválida. Digite 1-4, C ou X." + print_warn "Opção inválida. Digite 1-5, C ou X." ;; esac done @@ -321,6 +357,8 @@ generate_envs() { local SYSTEM_BASE_CONN="${SYSTEM_BASE_HOST}:${SYSTEM_BASE_PORT}" local KEEPALIVE_BACKEND="${EXTERNAL_HOST}:${BACKEND_ATTENDANCESYSTEM_API_EXTERNAL_PORT}" local KEEPALIVE_FRONTEND="${EXTERNAL_HOST}:${FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT}" + local CONTAINER_NAME_SUFFIX="" + [ -n "$CONTAINER_POSTFIX" ] && CONTAINER_NAME_SUFFIX="-${CONTAINER_POSTFIX}" cat > "$BASE_DIR/.env.prod" <