#SVTH-575 - Gestão de instalação do consul e serviço de usuários.

This commit is contained in:
2026-07-08 15:49:25 -03:00
parent 1691786a0b
commit 1d209949a1
2 changed files with 73 additions and 20 deletions

View File

@@ -15,6 +15,40 @@ services:
timeout: 5s timeout: 5s
retries: 5 retries: 5
consul:
image: hashicorp/consul:latest
profiles: ["infra"]
ports:
- "${CONSUL_HTTP_PORT}:8500"
- "${CONSUL_DNS_PORT}:8600/udp"
command: "agent -server -bootstrap -ui -client=0.0.0.0"
networks:
- app-network
healthcheck:
test: ["CMD", "consul", "members"]
interval: 10s
timeout: 5s
retries: 5
postgres:
image: postgres:16-alpine
profiles: ["infra"]
ports:
- "${POSTGRES_PORT}:5432"
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
# ================= BACKEND ================= # ================= BACKEND =================
suite-api: suite-api:
@@ -32,6 +66,19 @@ services:
- KEEPALIVE_ATTENDANCE_SYSTEM_FRONTEND_HOST=${KEEPALIVE_ATTENDANCE_SYSTEM_FRONTEND_HOST} - KEEPALIVE_ATTENDANCE_SYSTEM_FRONTEND_HOST=${KEEPALIVE_ATTENDANCE_SYSTEM_FRONTEND_HOST}
- KEEPALIVE_REPORTS_BACKEND_HOST=${KEEPALIVE_REPORTS_BACKEND_HOST} - KEEPALIVE_REPORTS_BACKEND_HOST=${KEEPALIVE_REPORTS_BACKEND_HOST}
- KEEPALIVE_REPORTS_FRONTEND_HOST=${KEEPALIVE_REPORTS_FRONTEND_HOST} - KEEPALIVE_REPORTS_FRONTEND_HOST=${KEEPALIVE_REPORTS_FRONTEND_HOST}
- KEEPALIVE_USERS_BACKEND_HOST=${KEEPALIVE_USERS_BACKEND_HOST}
- KEEPALIVE_USERS_FRONTEND_HOST=${KEEPALIVE_USERS_FRONTEND_HOST}
networks:
- app-network
users-api:
image: ${DOCKER_REPO}/sca-users-api:${IMAGEM_UNSTABLE_LATEST}
profiles: ["app"]
ports:
- "${BACKEND_USERS_API_INTERNAL_PORT}:${BACKEND_USERS_API_INTERNAL_PORT}"
environment:
- ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT}
- SystemBaseConn=${SYSTEM_BASE_CONN}
networks: networks:
- app-network - app-network
@@ -81,7 +128,9 @@ services:
- BACKEND_PEOPLE_API_URL=${EXTERNAL_HOST}:${BACKEND_PEOPLE_API_EXTERNAL_PORT} - BACKEND_PEOPLE_API_URL=${EXTERNAL_HOST}:${BACKEND_PEOPLE_API_EXTERNAL_PORT}
- BACKEND_ACCOUNT_API_URL=${EXTERNAL_HOST}:${BACKEND_ACCOUNT_API_EXTERNAL_PORT} - BACKEND_ACCOUNT_API_URL=${EXTERNAL_HOST}:${BACKEND_ACCOUNT_API_EXTERNAL_PORT}
- BACKEND_REPORTS_API_URL=${EXTERNAL_HOST}:${BACKEND_REPORTS_API_EXTERNAL_PORT} - BACKEND_REPORTS_API_URL=${EXTERNAL_HOST}:${BACKEND_REPORTS_API_EXTERNAL_PORT}
- BACKEND_USERS_API_URL=${EXTERNAL_HOST}:${BACKEND_USERS_API_EXTERNAL_PORT}
- FRONTEND_REPORTS_URL=${EXTERNAL_HOST}:${FRONTEND_REPORTS_APP_EXTERNAL_PORT} - FRONTEND_REPORTS_URL=${EXTERNAL_HOST}:${FRONTEND_REPORTS_APP_EXTERNAL_PORT}
- FRONTEND_USERS_URL=${EXTERNAL_HOST}:${FRONTEND_USERS_APP_EXTERNAL_PORT}
command: > command: >
sh -c "apk add --no-cache gettext && sh -c "apk add --no-cache gettext &&
envsubst < /config.template.json > /output/config.json && envsubst < /config.template.json > /output/config.json &&
@@ -146,4 +195,5 @@ networks:
volumes: volumes:
mongodb_data: mongodb_data:
postgres_data:
config-volume: config-volume:

View File

@@ -4,7 +4,7 @@
# 🚀 Instalador - AttendanceSystem # 🚀 Instalador - AttendanceSystem
# Uso: # Uso:
# bash <(curl -fsSL \ # bash <(curl -fsSL \
# "https://git.seventh.com.br/seventh.p7/attendance-system.install/raw/branch/develop/install.sh") # "https://git.seventh.com.br/seventh.p7/attendance-system.install/raw/branch/feature%2FSVTH-575---install-users/install.sh")
# ============================================================== # ==============================================================
# ── Redireciona stdin para o terminal quando rodado via curl | bash ── # ── Redireciona stdin para o terminal quando rodado via curl | bash ──
@@ -28,7 +28,7 @@ NC='\033[0m'
# ─── Repositório Git ────────────────────────────────────────── # ─── Repositório Git ──────────────────────────────────────────
INSTALL_DIR="attendancesystem" INSTALL_DIR="attendancesystem"
BRANCH="${BRANCH:-develop}" BRANCH="${BRANCH:-feature/SVTH-575---install-users}"
ENV_FILE="" ENV_FILE=""
GIT_REPO="https://git.seventh.com.br/seventh.p7/attendance-system.install.git" GIT_REPO="https://git.seventh.com.br/seventh.p7/attendance-system.install.git"
@@ -226,6 +226,7 @@ collect_internal_ports() {
ask BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT "Backend AttendanceSystem API" "${BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT:-10102}" 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 BACKEND_ACCOUNT_API_INTERNAL_PORT "Backend Account API" "${BACKEND_ACCOUNT_API_INTERNAL_PORT:-10103}"
ask BACKEND_REPORTS_API_INTERNAL_PORT "Backend Reports API" "${BACKEND_REPORTS_API_INTERNAL_PORT:-10105}" ask BACKEND_REPORTS_API_INTERNAL_PORT "Backend Reports API" "${BACKEND_REPORTS_API_INTERNAL_PORT:-10105}"
ask BACKEND_USERS_API_INTERNAL_PORT "Backend Users API" "${BACKEND_USERS_API_INTERNAL_PORT:-10106}"
ask FRONTEND_SUITE_APP_INTERNAL_PORT "Frontend Suite" "${FRONTEND_SUITE_APP_INTERNAL_PORT:-4200}" 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_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_ATTENDANCESYSTEM_APP_INTERNAL_PORT "Frontend AttendanceSystem" "${FRONTEND_ATTENDANCESYSTEM_APP_INTERNAL_PORT:-4202}"
@@ -242,6 +243,7 @@ collect_external_ports() {
ask BACKEND_ATTENDANCESYSTEM_API_EXTERNAL_PORT "Backend AttendanceSystem API" "${BACKEND_ATTENDANCESYSTEM_API_EXTERNAL_PORT:-$BACKEND_ATTENDANCESYSTEM_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 BACKEND_ACCOUNT_API_EXTERNAL_PORT "Backend Account API" "${BACKEND_ACCOUNT_API_EXTERNAL_PORT:-$BACKEND_ACCOUNT_API_INTERNAL_PORT}"
ask BACKEND_REPORTS_API_EXTERNAL_PORT "Backend Reports API" "${BACKEND_REPORTS_API_EXTERNAL_PORT:-$BACKEND_REPORTS_API_INTERNAL_PORT}" ask BACKEND_REPORTS_API_EXTERNAL_PORT "Backend Reports API" "${BACKEND_REPORTS_API_EXTERNAL_PORT:-$BACKEND_REPORTS_API_INTERNAL_PORT}"
ask BACKEND_USERS_API_EXTERNAL_PORT "Backend Users API" "${BACKEND_USERS_API_EXTERNAL_PORT:-$BACKEND_USERS_API_INTERNAL_PORT}"
ask FRONTEND_SUITE_APP_EXTERNAL_PORT "Frontend Suite" "${FRONTEND_SUITE_APP_EXTERNAL_PORT:-$FRONTEND_SUITE_APP_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_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_ATTENDANCESYSTEM_APP_EXTERNAL_PORT "Frontend AttendanceSystem" "${FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT:-$FRONTEND_ATTENDANCESYSTEM_APP_INTERNAL_PORT}"
@@ -249,11 +251,6 @@ collect_external_ports() {
ask FRONTEND_REPORTS_APP_EXTERNAL_PORT "Frontend Reports" "${FRONTEND_REPORTS_APP_EXTERNAL_PORT:-$FRONTEND_REPORTS_APP_INTERNAL_PORT}" ask FRONTEND_REPORTS_APP_EXTERNAL_PORT "Frontend Reports" "${FRONTEND_REPORTS_APP_EXTERNAL_PORT:-$FRONTEND_REPORTS_APP_INTERNAL_PORT}"
} }
collect_database() {
print_section "5. Banco de Dados"
ask MONGO_PORT "MongoDB (porta interna)" "${MONGO_PORT:-27017}"
}
# ══════════════════════════════════════════════════════════════ # ══════════════════════════════════════════════════════════════
# Wizard principal — coleta com navegação # Wizard principal — coleta com navegação
# ══════════════════════════════════════════════════════════════ # ══════════════════════════════════════════════════════════════
@@ -278,15 +275,15 @@ collect_config() {
BACKEND_ATTENDANCESYSTEM_API_EXTERNAL_PORT="$BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT" BACKEND_ATTENDANCESYSTEM_API_EXTERNAL_PORT="$BACKEND_ATTENDANCESYSTEM_API_INTERNAL_PORT"
BACKEND_ACCOUNT_API_EXTERNAL_PORT="$BACKEND_ACCOUNT_API_INTERNAL_PORT" BACKEND_ACCOUNT_API_EXTERNAL_PORT="$BACKEND_ACCOUNT_API_INTERNAL_PORT"
BACKEND_REPORTS_API_EXTERNAL_PORT="$BACKEND_REPORTS_API_INTERNAL_PORT" BACKEND_REPORTS_API_EXTERNAL_PORT="$BACKEND_REPORTS_API_INTERNAL_PORT"
BACKEND_USERS_API_EXTERNAL_PORT="$BACKEND_USERS_API_INTERNAL_PORT"
FRONTEND_SUITE_APP_EXTERNAL_PORT="$FRONTEND_SUITE_APP_INTERNAL_PORT" FRONTEND_SUITE_APP_EXTERNAL_PORT="$FRONTEND_SUITE_APP_INTERNAL_PORT"
FRONTEND_PEOPLE_APP_EXTERNAL_PORT="$FRONTEND_PEOPLE_APP_INTERNAL_PORT" FRONTEND_PEOPLE_APP_EXTERNAL_PORT="$FRONTEND_PEOPLE_APP_INTERNAL_PORT"
FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT="$FRONTEND_ATTENDANCESYSTEM_APP_INTERNAL_PORT" FRONTEND_ATTENDANCESYSTEM_APP_EXTERNAL_PORT="$FRONTEND_ATTENDANCESYSTEM_APP_INTERNAL_PORT"
FRONTEND_ACCOUNT_APP_EXTERNAL_PORT="$FRONTEND_ACCOUNT_APP_INTERNAL_PORT" FRONTEND_ACCOUNT_APP_EXTERNAL_PORT="$FRONTEND_ACCOUNT_APP_INTERNAL_PORT"
FRONTEND_REPORTS_APP_EXTERNAL_PORT="$FRONTEND_REPORTS_APP_INTERNAL_PORT" FRONTEND_REPORTS_APP_EXTERNAL_PORT="$FRONTEND_REPORTS_APP_INTERNAL_PORT"
FRONTEND_USERS_APP_EXTERNAL_PORT="$FRONTEND_USERS_APP_INTERNAL_PORT"
print_ok "Portas externas definidas iguais às internas." print_ok "Portas externas definidas iguais às internas."
fi fi
collect_database
} }
# ══════════════════════════════════════════════════════════════ # ══════════════════════════════════════════════════════════════
@@ -309,15 +306,12 @@ show_summary() {
echo -e " Porta : ${BOLD}${SYSTEM_BASE_PORT}${NC}" echo -e " Porta : ${BOLD}${SYSTEM_BASE_PORT}${NC}"
echo "" echo ""
echo -e " ${BOLD}[3] Portas Internas${NC}" echo -e " ${BOLD}[3] Portas Internas${NC}"
echo -e " Backend Suite/People/Attendance/Account/Reports : ${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} / ${BOLD}${BACKEND_REPORTS_API_INTERNAL_PORT}${NC}" echo -e " Backend Suite/People/Attendance/Account/Reports/Users : ${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} / ${BOLD}${BACKEND_REPORTS_API_INTERNAL_PORT}${NC} / ${BOLD}${BACKEND_USERS_API_INTERNAL_PORT}${NC}"
echo -e " Frontend Suite/People/Attendance/Account/Reports : ${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} / ${BOLD}${FRONTEND_REPORTS_APP_INTERNAL_PORT}${NC}" echo -e " Frontend Suite/People/Attendance/Account/Reports/Users : ${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} / ${BOLD}${FRONTEND_REPORTS_APP_INTERNAL_PORT}${NC} / ${BOLD}${FRONTEND_USERS_APP_INTERNAL_PORT}${NC}"
echo "" echo ""
echo -e " ${BOLD}[4] Portas Externas${NC}" echo -e " ${BOLD}[4] Portas Externas${NC}"
echo -e " Backend Suite/People/Attendance/Account/Reports : ${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} / ${BOLD}${BACKEND_REPORTS_API_EXTERNAL_PORT}${NC}" echo -e " Backend Suite/People/Attendance/Account/Reports/Users : ${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} / ${BOLD}${BACKEND_REPORTS_API_EXTERNAL_PORT}${NC} / ${BOLD}${BACKEND_USERS_API_EXTERNAL_PORT}${NC}"
echo -e " Frontend Suite/People/Attendance/Account/Reports : ${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} / ${BOLD}${FRONTEND_REPORTS_APP_EXTERNAL_PORT}${NC}" echo -e " Frontend Suite/People/Attendance/Account/Reports/Users : ${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} / ${BOLD}${FRONTEND_REPORTS_APP_EXTERNAL_PORT}${NC} / ${BOLD}${FRONTEND_USERS_APP_EXTERNAL_PORT}${NC}"
echo ""
echo -e " ${BOLD}[5] Banco de Dados${NC}"
echo -e " MongoDB : ${BOLD}${MONGO_PORT}${NC}"
echo "" echo ""
echo -e " ──────────────────────────────────────────────────────────────" echo -e " ──────────────────────────────────────────────────────────────"
echo -e " ${GREEN}${BOLD}[C]${NC} Confirmar e continuar ${RED}${BOLD}[X]${NC} Cancelar instalação" echo -e " ${GREEN}${BOLD}[C]${NC} Confirmar e continuar ${RED}${BOLD}[X]${NC} Cancelar instalação"
@@ -331,7 +325,6 @@ show_summary() {
2) collect_system_base ;; 2) collect_system_base ;;
3) collect_internal_ports ;; 3) collect_internal_ports ;;
4) collect_external_ports ;; 4) collect_external_ports ;;
5) collect_database ;;
C) break ;; C) break ;;
X) X)
echo "" echo ""
@@ -339,7 +332,7 @@ show_summary() {
exit 0 exit 0
;; ;;
*) *)
print_warn "Opção inválida. Digite 1-5, C ou X." print_warn "Opção inválida. Digite 1-4, C ou X."
;; ;;
esac esac
done done
@@ -370,10 +363,20 @@ IMAGEM_RELEASE=2.0
NGINX_DEFAULT_PORT=80 NGINX_DEFAULT_PORT=80
# ── MongoDB ─────────────────────────────────────────────── # ── MongoDB ───────────────────────────────────────────────
MONGO_PORT=${MONGO_PORT} MONGO_PORT=27017
MONGODB_CONNECTION_STRING=mongodb://mongodb:27017/suitedb MONGODB_CONNECTION_STRING=mongodb://mongodb:27017/suitedb
MONGODB_DATABASE=suitedb MONGODB_DATABASE=suitedb
# ── PostgreSQL ────────────────────────────────────────────
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=attendancesystem
# ── Consul ────────────────────────────────────────────────
CONSUL_HTTP_PORT=8500
CONSUL_DNS_PORT=8600
# ── Sistema Base ────────────────────────────────────────── # ── Sistema Base ──────────────────────────────────────────
SYSTEM_BASE_CONN=${SYSTEM_BASE_CONN} SYSTEM_BASE_CONN=${SYSTEM_BASE_CONN}
SYSTEM_BASE_HOST=${SYSTEM_BASE_HOST} SYSTEM_BASE_HOST=${SYSTEM_BASE_HOST}
@@ -452,7 +455,7 @@ start_environment() {
echo -e " ${BOLD}make install${NC} → sobe o projeto" echo -e " ${BOLD}make install${NC} → sobe o projeto"
echo -e " ${BOLD}make update${NC} → atualiza o projeto" echo -e " ${BOLD}make update${NC} → atualiza o projeto"
echo -e " ${BOLD}make app${NC} → sobe apenas a aplicação" echo -e " ${BOLD}make app${NC} → sobe apenas a aplicação"
echo -e " ${BOLD}make infra${NC} → sobe apenas a infra (MongoDB)" echo -e " ${BOLD}make infra${NC} → sobe apenas a infra (MongoDB, PostgreSQL, Consul)"
echo -e " ${BOLD}make nuke-project${NC} → limpa o projeto" echo -e " ${BOLD}make nuke-project${NC} → limpa o projeto"
echo -e " ${BOLD}make nuke${NC} → limpa tudo (cuidado!)" echo -e " ${BOLD}make nuke${NC} → limpa tudo (cuidado!)"
echo "" echo ""