#!/bin/bash # --- Color Definitions for Premium Terminal Styling --- GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' RED='\033[0;31m' CYAN='\033[0;36m' MAGENTA='\033[0;35m' BOLD='\033[1m' NC='\033[0m' # No Color # Helper Functions for Clean Output log_info() { echo -e " ${BLUE}[INFO]${NC} $1" } log_success() { echo -e " ${GREEN}[SUCCESS]${NC} ✔ $1" } log_warning() { echo -e " ${YELLOW}[WARNING]${NC} ⚠ $1" } log_error() { echo -e " ${RED}[ERROR]${NC} ✘ $1" } clear_screen() { clear 2>/dev/null || printf "\033c" } clear_screen # Premium Welcome Header echo -e "${BLUE}======================================================================${NC}" echo -e "${BOLD}${GREEN} 🐳 BIIPROJECT KIT V2 - CONTAINERIZED RUNNER & MONITOR 🐳 ${NC}" echo -e "${BLUE}======================================================================${NC}" echo -e " Skrip ini akan memvalidasi port, menyalakan container Docker," echo -e " dan mengaktifkan server pengembangan frontend otomatis." echo -e "${BLUE}======================================================================${NC}" echo "" # 1. VERIFY INSTALLATION STATE echo -e "${BOLD}${BLUE}[1/5] Memverifikasi Status Instalasi Aplikasi...${NC}" # Check for .env file if [ ! -f .env ]; then log_warning "File konfigurasi '.env' tidak ditemukan." log_info "Menjalankan skrip instalasi terlebih dahulu..." sleep 1.5 if [ -f install.sh ]; then chmod +x install.sh ./install.sh exit $? else log_error "Skrip install.sh tidak ditemukan!" exit 1 fi fi # Check for Composer dependencies if [ ! -d vendor ] || [ ! -d node_modules ]; then log_warning "Dependensi aplikasi belum lengkap (vendor atau node_modules hilang)." log_info "Mengalihkan ke skrip instalasi untuk setup awal..." sleep 2 if [ -f install.sh ]; then chmod +x install.sh ./install.sh exit $? else log_error "Skrip install.sh tidak ditemukan!" exit 1 fi fi # Check Docker Installation if ! command -v docker &> /dev/null; then log_error "Docker tidak ditemukan pada sistem. Harap instal Docker terlebih dahulu." exit 1 fi # Check Docker Daemon if ! docker info &> /dev/null; then log_error "Docker daemon tidak aktif. Harap jalankan layanan Docker Anda." exit 1 fi # Resolve Docker Compose Command if docker compose version &> /dev/null; then DOCKER_COMPOSE_CMD="docker compose" else DOCKER_COMPOSE_CMD="docker-compose" fi log_success "Sistem siap dijalankan." echo "" # 2. RESOLVE PORTS & PREVENT CONFLICTS echo -e "${BOLD}${BLUE}[2/5] Memeriksa Port Bebas & Konflik Container...${NC}" # Parse ports from .env APP_PORT=$(grep "^APP_PORT=" .env | cut -d'=' -f2- | tr -d '"'\''') APP_PORT=${APP_PORT:-8000} DB_PORT=$(grep -E "^(FORWARD_DB_PORT|DB_PORT)=" .env | head -n1 | cut -d'=' -f2- | tr -d '"'\''') DB_PORT=${DB_PORT:-5432} REDIS_PORT=$(grep -E "^(FORWARD_REDIS_PORT|REDIS_PORT)=" .env | head -n1 | cut -d'=' -f2- | tr -d '"'\''') REDIS_PORT=${REDIS_PORT:-6379} # Function to stop conflicting containers on a specific port stop_conflict_on_port() { local port=$1 local service_name=$2 local conflicting_container=$(docker ps --filter "publish=$port" --format "{{.Names}}" 2>/dev/null) if [ ! -z "$conflicting_container" ]; then # Exclude our own kit containers if [[ "$conflicting_container" != "bii-web" && "$conflicting_container" != "bii-pgsql" && "$conflicting_container" != "bii-redis" ]]; then log_warning "Port $port ($service_name) digunakan oleh container '$conflicting_container'." log_info "Menghentikan container '$conflicting_container' untuk menghindari konflik..." docker stop "$conflicting_container" &>/dev/null sleep 1 fi fi } # Stop local processes using fuser/lsof if available if command -v lsof &>/dev/null && command -v fuser &>/dev/null; then for port in "$APP_PORT" "$DB_PORT" "$REDIS_PORT"; do if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null ; then log_warning "Port $port digunakan oleh proses lokal. Menghentikan proses..." fuser -k $port/tcp 2>/dev/null sleep 1 fi done fi stop_conflict_on_port "$APP_PORT" "Web Aplikasi" stop_conflict_on_port "$DB_PORT" "Database PostgreSQL" stop_conflict_on_port "$REDIS_PORT" "Redis Cache" log_success "Port $APP_PORT (Web), $DB_PORT (DB), dan $REDIS_PORT (Redis) siap digunakan." echo "" # 3. START DOCKER CONTAINER STACK echo -e "${BOLD}${BLUE}[3/5] Mengaktifkan Container Docker (Sail)...${NC}" $DOCKER_COMPOSE_CMD up -d if [ $? -ne 0 ]; then log_error "Gagal menyalakan Docker containers." exit 1 fi log_success "Docker containers berhasil dinyalakan." echo "" # 4. HEALTH CHECK & PERMISSIONS echo -e "${BOLD}${BLUE}[4/5] Memvalidasi Kesehatan Layanan & Hak Akses...${NC}" DB_CONTAINER="bii-kit-pgsql" REDIS_CONTAINER="bii-kit-redis" # Postgres Check echo -ne " ${YELLOW}Memeriksa PostgreSQL Database ($DB_CONTAINER)...${NC}" RETRIES=0 MAX_RETRIES=30 while [ $RETRIES -lt $MAX_RETRIES ]; do STATUS=$(docker inspect --format='{{.State.Health.Status}}' "$DB_CONTAINER" 2>/dev/null) if [ "$STATUS" = "healthy" ]; then echo -e "\r ${GREEN}[SELESAI]${NC} ✔ PostgreSQL sehat dan siap! " break elif [ -z "$STATUS" ]; then RUNNING=$(docker inspect --format='{{.State.Running}}' "$DB_CONTAINER" 2>/dev/null) if [ "$RUNNING" = "true" ]; then echo -e "\r ${GREEN}[SELESAI]${NC} ✔ PostgreSQL container aktif. " break fi fi echo -n "." sleep 1.2 RETRIES=$((RETRIES + 1)) done # Redis Check echo -ne " ${YELLOW}Memeriksa Redis Cache ($REDIS_CONTAINER)...${NC}" RETRIES=0 while [ $RETRIES -lt $MAX_RETRIES ]; do STATUS=$(docker inspect --format='{{.State.Health.Status}}' "$REDIS_CONTAINER" 2>/dev/null) if [ "$STATUS" = "healthy" ]; then echo -e "\r ${GREEN}[SELESAI]${NC} ✔ Redis sehat dan siap! " break elif [ -z "$STATUS" ]; then RUNNING=$(docker inspect --format='{{.State.Running}}' "$REDIS_CONTAINER" 2>/dev/null) if [ "$RUNNING" = "true" ]; then echo -e "\r ${GREEN}[SELESAI]${NC} ✔ Redis container aktif. " break fi fi echo -n "." sleep 1.2 RETRIES=$((RETRIES + 1)) done # Secure storage and cache permissions inside container $DOCKER_COMPOSE_CMD exec -u root laravel.test chown -R sail:sail /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null $DOCKER_COMPOSE_CMD exec -u root laravel.test chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null log_success "Hak akses file storage & cache berhasil diselaraskan." echo "" # 5. START VITE FRONTEND LIVE SERVER echo -e "${BOLD}${BLUE}[5/5] Memulai Server Frontend (Vite Live-Reload)...${NC}" # Start npm dev in background inside container $DOCKER_COMPOSE_CMD exec -d -u sail laravel.test npm run dev log_success "Server pengembangan Vite aktif di latar belakang." echo "" sleep 1 clear_screen # Premium Dashboard Information Board echo -e "${GREEN}======================================================================${NC}" echo -e "${BOLD}${GREEN} 🚀 BIIPROJECT KIT V2 BERHASIL DIJALANKAN! 🚀 ${NC}" echo -e "${GREEN}======================================================================${NC}" echo -e " Aplikasi Anda berjalan lancar di dalam Docker container." echo -e "" echo -e " 👉 ${BOLD}Web Application:${NC} ${CYAN}http://localhost:${APP_PORT}${NC}" echo -e " 👉 ${BOLD}Monitoring Panel:${NC} ${CYAN}http://localhost:${APP_PORT}/system-monitoring${NC}" echo -e " 👉 ${BOLD}Dokumentasi API:${NC} ${CYAN}http://localhost:${APP_PORT}/documentation${NC}" echo -e " 👉 ${BOLD}Database Port:${NC} ${YELLOW}${DB_PORT}${NC} (PostgreSQL)" echo -e " 👉 ${BOLD}Redis Port:${NC} ${YELLOW}${REDIS_PORT}${NC} (Redis)" echo -e "" echo -e " ========================================================" echo -e " ${BOLD}PERINTAH BERMANFAAT LAINNYA:${NC}" echo -e " ========================================================" echo -e " Untuk melihat logs realtime dari container:" echo -e " ${CYAN}docker compose logs -f${NC}" echo -e "" echo -e " Untuk masuk ke terminal container aplikasi:" echo -e " ${CYAN}./sail shell${NC}" echo -e "" echo -e " Untuk menghentikan dan menonaktifkan container:" echo -e " ${CYAN}docker compose down${NC}" echo -e "${GREEN}======================================================================${NC}" echo ""