248 lines
8.6 KiB
Bash
Executable File
248 lines
8.6 KiB
Bash
Executable File
#!/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 ""
|