diff --git a/.gitignore b/.gitignore index fedf540..0b9b777 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,5 @@ Thumbs.db *.avi *.flv *.mov -*.wmv \ No newline at end of file +*.wmv +attendancesystem/ diff --git a/Makefile b/Makefile index 2afe786..b032e9a 100644 --- a/Makefile +++ b/Makefile @@ -2,10 +2,11 @@ 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: infra app install update reset-network nuke nuke-project +.PHONY: app install update reset-network nuke nuke-project # =============================== # 🧹 Reset Network @@ -14,25 +15,6 @@ reset-network: @echo "🧹 Removendo rede antiga (se existir)..." -docker network rm $(NETWORK_NAME) 2>/dev/null || true -# =============================== -# πŸ— Subir apenas INFRA -# =============================== -infra: reset-network - @echo "πŸ“₯ Baixando imagens de INFRA ($(PROJECT_NAME))..." - docker compose \ - --project-name $(PROJECT_NAME) \ - --env-file $(ENV_FILE) \ - --profile infra \ - -f $(COMPOSE_FILE) \ - pull - @echo "πŸš€ Subindo apenas INFRA ($(PROJECT_NAME))..." - docker compose \ - --project-name $(PROJECT_NAME) \ - --env-file $(ENV_FILE) \ - --profile infra \ - -f $(COMPOSE_FILE) \ - up -d --pull never - # =============================== # 🧩 Subir apenas APP # =============================== @@ -60,7 +42,6 @@ install: docker compose \ --project-name $(PROJECT_NAME) \ --env-file $(ENV_FILE) \ - --profile infra \ --profile app \ -f $(COMPOSE_FILE) \ pull @@ -68,7 +49,6 @@ install: docker compose \ --project-name $(PROJECT_NAME) \ --env-file $(ENV_FILE) \ - --profile infra \ --profile app \ -f $(COMPOSE_FILE) \ up -d --pull never @@ -111,7 +91,6 @@ nuke-project: docker compose \ --project-name $(PROJECT_NAME) \ --env-file $(ENV_FILE) \ - --profile infra \ --profile app \ -f $(COMPOSE_FILE) \ down --volumes --remove-orphans @@ -120,4 +99,3 @@ nuke-project: - docker images --format '{{.Repository}}:{{.Tag}}' | grep '^seventhltda/' | xargs -r docker rmi -f 2>/dev/null || true @echo "βœ… Projeto $(PROJECT_NAME) limpo (containers, volumes, rede e imagens)." - @echo " Imagens de infraestrutura preservadas." diff --git a/config.template.json b/config.template.json index 7667c31..36b4132 100644 --- a/config.template.json +++ b/config.template.json @@ -7,15 +7,15 @@ }, "urlLgpd": "https://lgpd.seventh.com.br/feedback?product=situator", "modules": { - "suite": "${FRONTEND_SUITE_URL}", + "suite": "", "attendance": "${FRONTEND_ATTENDANCE_URL}", - "account": "${FRONTEND_ACCOUNT_URL}", - "people": "${FRONTEND_PEOPLE_URL}" + "account": "", + "people": "" }, "api": { - "suite": "${BACKEND_SUITE_API_URL}", - "people": "${BACKEND_PEOPLE_API_URL}", - "account": "${BACKEND_ACCOUNT_API_URL}", + "suite": "", + "people": "", + "account": "", "attendance": "${BACKEND_ATTENDANCE_API_URL}" } } \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 8d4cc5d..c5346ea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,44 +1,15 @@ services: - # ================= INFRA ================= - mongodb: - image: mongo:${IMAGEM_LATEST} - profiles: ["infra"] - ports: - - "${MONGO_PORT}:27017" - volumes: - - mongodb_data:/data/db - networks: - - app-network - healthcheck: - test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet - interval: 10s - timeout: 5s - retries: 5 - # ================= BACKEND ================= - suite-api: - image: ${DOCKER_REPO}/suite-api:${IMAGEM_UNSTABLE_LATEST} - profiles: ["app"] - ports: - - "${BACKEND_SUITE_API_INTERNAL_PORT}:${BACKEND_SUITE_API_INTERNAL_PORT}" - environment: - - ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT} - - MONGODB_CONNECTION_STRING=${MONGODB_CONNECTION_STRING} - - MONGODB_DATABASE=${MONGODB_DATABASE} - - SYSTEM_BASE_CONN=${SYSTEM_BASE_CONN} - - FRONTEND_CONN=${INTERNAL_HOST}:${FRONTEND_SUITE_APP_INTERNAL_PORT} - - KEEPALIVE_ATTENDANCE_SYSTEM_BACKEND_HOST=${KEEPALIVE_ATTENDANCE_SYSTEM_BACKEND_HOST} - - KEEPALIVE_ATTENDANCE_SYSTEM_FRONTEND_HOST=${KEEPALIVE_ATTENDANCE_SYSTEM_FRONTEND_HOST} - networks: - - app-network - attendancesystem-api: - image: ${DOCKER_REPO}/backend-attendance-system-api:${IMAGEM_RELEASE_1_1} + container_name: attendancesystem-api${CONTAINER_NAME_SUFFIX} + image: ${DOCKER_REPO}/backend-attendance-system-api:${IMAGEM_RELEASE_1_3} profiles: ["app"] ports: - "${BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT}:${BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT}" environment: + - ASPNETCORE_URLS=http://*:${BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT} + - Kestrel__Endpoints__Http__Url=http://*:${BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT} - SYSBASE_URL=${SYSTEM_BASE_CONN} - SystemBaseConn=${SYSTEM_BASE_CONN} - FrotendConn=${EXTERNAL_HOST}:${FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT} @@ -47,6 +18,7 @@ services: # ================= FRONTEND ================= config-generator: + container_name: config-generator${CONTAINER_NAME_SUFFIX} image: alpine:${IMAGEM_LATEST} profiles: ["app"] environment: @@ -71,7 +43,8 @@ services: restart: "no" attendancesystem-app: - image: ${DOCKER_REPO}/attendancesystem-frontend:${IMAGEM_RELEASE_1_1} + container_name: attendancesystem-app${CONTAINER_NAME_SUFFIX} + image: ${DOCKER_REPO}/attendancesystem-frontend:${IMAGEM_RELEASE_1_3} profiles: ["app"] volumes: - config-volume:/config-inject:ro @@ -91,5 +64,4 @@ networks: name: attendancesystem-network volumes: - mongodb_data: config-volume: \ No newline at end of file diff --git a/install.sh b/install.sh old mode 100644 new mode 100755 index 06658fc..db66062 --- a/install.sh +++ b/install.sh @@ -28,7 +28,7 @@ NC='\033[0m' # ─── RepositΓ³rio Git ────────────────────────────────────────── INSTALL_DIR="attendancesystem" -BRANCH="${BRANCH:-main}" +BRANCH="${BRANCH:-feature/SDA-304}" ENV_FILE="" GIT_REPO="https://git.seventh.com.br/seventh.p7/attendance-system.install.git" @@ -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 @@ -221,33 +239,24 @@ collect_system_base() { collect_internal_ports() { print_section "3. Portas Internas (rede local)" - ask BACKEND_SUITE_API_INTERNAL_PORT "Backend Suite API" "${BACKEND_SUITE_API_INTERNAL_PORT:-10101}" - ask BACKEND_PEOPLE_API_INTERNAL_PORT "Backend People API" "${BACKEND_PEOPLE_API_INTERNAL_PORT:-10100}" ask BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT "Backend AttendanceSystem API" "${BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT:-10102}" - ask BACKEND_ACCOUNT_API_INTERNAL_PORT "Backend Account API" "${BACKEND_ACCOUNT_API_INTERNAL_PORT:-10103}" - ask FRONTEND_SUITE_APP_INTERNAL_PORT "Frontend Suite" "${FRONTEND_SUITE_APP_INTERNAL_PORT:-4200}" - ask FRONTEND_PEOPLE_APP_INTERNAL_PORT "Frontend People" "${FRONTEND_PEOPLE_APP_INTERNAL_PORT:-4201}" ask FRONTEND_ATTENDANCESYSTEM_APP_INTERNAL_PORT "Frontend AttendanceSystem" "${FRONTEND_ATTENDANCESYSTEM_APP_INTERNAL_PORT:-4202}" - ask FRONTEND_ACCOUNT_APP_INTERNAL_PORT "Frontend Account" "${FRONTEND_ACCOUNT_APP_INTERNAL_PORT:-4203}" } collect_external_ports() { print_section "4. Portas Externas (NAT/acesso remoto)" echo -e " ${DIM}Pressione ENTER para usar a mesma porta interna.${NC}\n" - ask BACKEND_SUITE_API_EXTERNAL_PORT "Backend Suite API" "${BACKEND_SUITE_API_EXTERNAL_PORT:-$BACKEND_SUITE_API_INTERNAL_PORT}" - ask BACKEND_PEOPLE_API_EXTERNAL_PORT "Backend People API" "${BACKEND_PEOPLE_API_EXTERNAL_PORT:-$BACKEND_PEOPLE_API_INTERNAL_PORT}" ask BACKEND_ATTENDANCESYSTEM_API_EXTERNAL_PORT "Backend AttendanceSystem API" "${BACKEND_ATTENDANCESYSTEM_API_EXTERNAL_PORT:-$BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT}" - ask BACKEND_ACCOUNT_API_EXTERNAL_PORT "Backend Account API" "${BACKEND_ACCOUNT_API_EXTERNAL_PORT:-$BACKEND_ACCOUNT_API_INTERNAL_PORT}" - ask FRONTEND_SUITE_APP_EXTERNAL_PORT "Frontend Suite" "${FRONTEND_SUITE_APP_EXTERNAL_PORT:-$FRONTEND_SUITE_APP_INTERNAL_PORT}" - ask FRONTEND_PEOPLE_APP_EXTERNAL_PORT "Frontend People" "${FRONTEND_PEOPLE_APP_EXTERNAL_PORT:-$FRONTEND_PEOPLE_APP_INTERNAL_PORT}" ask FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT "Frontend AttendanceSystem" "${FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT:-$FRONTEND_ATTENDANCESYSTEM_APP_INTERNAL_PORT}" - ask FRONTEND_ACCOUNT_APP_EXTERNAL_PORT "Frontend Account" "${FRONTEND_ACCOUNT_APP_EXTERNAL_PORT:-$FRONTEND_ACCOUNT_APP_INTERNAL_PORT}" } -collect_database() { - print_section "5. Banco de Dados" - ask MONGO_PORT "MongoDB (porta interna)" "${MONGO_PORT:-27017}" +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:-}" } # ══════════════════════════════════════════════════════════════ @@ -269,18 +278,12 @@ collect_config() { else collect_internal_ports # Copia internas β†’ externas automaticamente - BACKEND_SUITE_API_EXTERNAL_PORT="$BACKEND_SUITE_API_INTERNAL_PORT" - BACKEND_PEOPLE_API_EXTERNAL_PORT="$BACKEND_PEOPLE_API_INTERNAL_PORT" BACKEND_ATTENDANCESYSTEM_API_EXTERNAL_PORT="$BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT" - BACKEND_ACCOUNT_API_EXTERNAL_PORT="$BACKEND_ACCOUNT_API_INTERNAL_PORT" - FRONTEND_SUITE_APP_EXTERNAL_PORT="$FRONTEND_SUITE_APP_INTERNAL_PORT" - FRONTEND_PEOPLE_APP_EXTERNAL_PORT="$FRONTEND_PEOPLE_APP_INTERNAL_PORT" FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT="$FRONTEND_ATTENDANCESYSTEM_APP_INTERNAL_PORT" - FRONTEND_ACCOUNT_APP_EXTERNAL_PORT="$FRONTEND_ACCOUNT_APP_INTERNAL_PORT" print_ok "Portas externas definidas iguais Γ s internas." fi - collect_database + collect_container_postfix } # ══════════════════════════════════════════════════════════════ @@ -303,15 +306,19 @@ show_summary() { echo -e " Porta : ${BOLD}${SYSTEM_BASE_PORT}${NC}" echo "" echo -e " ${BOLD}[3] Portas Internas${NC}" - echo -e " Backend Suite/People/Attendance/Account : ${BOLD}${BACKEND_SUITE_API_INTERNAL_PORT}${NC} / ${BOLD}${BACKEND_PEOPLE_API_INTERNAL_PORT}${NC} / ${BOLD}${BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT}${NC} / ${BOLD}${BACKEND_ACCOUNT_API_INTERNAL_PORT}${NC}" - echo -e " Frontend Suite/People/Attendance/Account : ${BOLD}${FRONTEND_SUITE_APP_INTERNAL_PORT}${NC} / ${BOLD}${FRONTEND_PEOPLE_APP_INTERNAL_PORT}${NC} / ${BOLD}${FRONTEND_ATTENDANCESYSTEM_APP_INTERNAL_PORT}${NC} / ${BOLD}${FRONTEND_ACCOUNT_APP_INTERNAL_PORT}${NC}" + echo -e " Backend Attendance : ${BOLD}${BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT}${NC}" + echo -e " Frontend Attendance : ${BOLD}${FRONTEND_ATTENDANCESYSTEM_APP_INTERNAL_PORT}${NC}" echo "" echo -e " ${BOLD}[4] Portas Externas${NC}" - echo -e " Backend Suite/People/Attendance/Account : ${BOLD}${BACKEND_SUITE_API_EXTERNAL_PORT}${NC} / ${BOLD}${BACKEND_PEOPLE_API_EXTERNAL_PORT}${NC} / ${BOLD}${BACKEND_ATTENDANCESYSTEM_API_EXTERNAL_PORT}${NC} / ${BOLD}${BACKEND_ACCOUNT_API_EXTERNAL_PORT}${NC}" - echo -e " Frontend Suite/People/Attendance/Account : ${BOLD}${FRONTEND_SUITE_APP_EXTERNAL_PORT}${NC} / ${BOLD}${FRONTEND_PEOPLE_APP_EXTERNAL_PORT}${NC} / ${BOLD}${FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT}${NC} / ${BOLD}${FRONTEND_ACCOUNT_APP_EXTERNAL_PORT}${NC}" + 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] Banco de Dados${NC}" - echo -e " MongoDB : ${BOLD}${MONGO_PORT}${NC}" + 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" @@ -325,7 +332,7 @@ show_summary() { 2) collect_system_base ;; 3) collect_internal_ports ;; 4) collect_external_ports ;; - 5) collect_database ;; + 5) collect_container_postfix ;; C) break ;; X) echo "" @@ -350,26 +357,17 @@ 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" <