first commit
This commit is contained in:
111
deploy.sh
Normal file
111
deploy.sh
Normal file
@@ -0,0 +1,111 @@
|
||||
#!/bin/bash
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
# deploy.sh — Skrip deploy produksi (Ubuntu)
|
||||
# Sistem Pemantauan Kemampanan Pusat Data MBIP
|
||||
#
|
||||
# Penggunaan:
|
||||
# ./deploy.sh # deploy / kemas kini (pull, build, up, migrate)
|
||||
# ./deploy.sh --build # paksa bina semula imej Docker
|
||||
# ./deploy.sh --fresh # migrate:fresh --seed (AMARAN: kosongkan data)
|
||||
# ./deploy.sh --logs # ikut log container
|
||||
# ./deploy.sh --down # hentikan container
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
set -euo pipefail
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
# Guna `docker compose` (v2) atau `docker-compose` (v1) — auto kesan.
|
||||
if docker compose version >/dev/null 2>&1; then
|
||||
DC="docker compose"
|
||||
else
|
||||
DC="docker-compose"
|
||||
fi
|
||||
|
||||
# Hanya fail produksi (abaikan docker-compose.override.yml untuk dev).
|
||||
COMPOSE_FILES="-f docker-compose.yml"
|
||||
|
||||
log() { echo -e "\033[0;32m==>\033[0m $*"; }
|
||||
warn() { echo -e "\033[0;33m[!]\033[0m $*"; }
|
||||
die() { echo -e "\033[0;31m[x]\033[0m $*" >&2; exit 1; }
|
||||
|
||||
# ── Semakan prasyarat ────────────────────────────────────────
|
||||
command -v docker >/dev/null 2>&1 || die "Docker tidak dipasang."
|
||||
|
||||
if [ ! -f .env ]; then
|
||||
warn ".env tidak dijumpai — menyalin daripada .env.docker"
|
||||
cp .env.docker .env
|
||||
die "Sila edit .env (APP_KEY, DB_USERNAME, DB_PASSWORD, APP_URL) kemudian jalankan semula ./deploy.sh"
|
||||
fi
|
||||
|
||||
# ── Kendalikan flag ──────────────────────────────────────────
|
||||
case "${1:-}" in
|
||||
--logs) exec $DC $COMPOSE_FILES logs -f --tail=100 ;;
|
||||
--down) log "Menghentikan container..."; $DC $COMPOSE_FILES down; exit 0 ;;
|
||||
esac
|
||||
|
||||
FORCE_BUILD=false
|
||||
FRESH=false
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
--build) FORCE_BUILD=true ;;
|
||||
--fresh) FRESH=true ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# ── 1. Tarik kod terkini (jika repo git) ─────────────────────
|
||||
if [ -d .git ]; then
|
||||
log "Menarik kod terkini (git pull)..."
|
||||
git pull --ff-only || warn "git pull gagal / dilangkau."
|
||||
fi
|
||||
|
||||
# ── 2. Bina aset frontend pada host (Vite) ───────────────────
|
||||
# Nota: nginx melekap ./public (read-only) terus daripada host,
|
||||
# jadi aset dibina di sini, bukan dalam imej.
|
||||
if command -v npm >/dev/null 2>&1; then
|
||||
log "Membina aset frontend (npm ci && npm run build)..."
|
||||
npm ci --silent || npm install --silent
|
||||
npm run build
|
||||
else
|
||||
warn "npm tidak dijumpai pada host — pastikan public/build sudah dibina."
|
||||
fi
|
||||
|
||||
# ── 3. Bina / mulakan container ──────────────────────────────
|
||||
if [ "$FORCE_BUILD" = true ]; then
|
||||
log "Membina semula imej Docker..."
|
||||
$DC $COMPOSE_FILES build --pull
|
||||
fi
|
||||
|
||||
log "Memulakan container..."
|
||||
$DC $COMPOSE_FILES up -d --remove-orphans
|
||||
|
||||
# ── 4. Tunggu container app sihat ────────────────────────────
|
||||
log "Menunggu container app sihat..."
|
||||
for i in $(seq 1 30); do
|
||||
if $DC $COMPOSE_FILES exec -T app php-fpm -t >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
# ── 5. Migrasi & optimisasi Laravel ──────────────────────────
|
||||
if [ "$FRESH" = true ]; then
|
||||
warn "Menjalankan migrate:fresh --seed (semua data akan dikosongkan)..."
|
||||
$DC $COMPOSE_FILES exec -T --user www-data app php artisan migrate:fresh --seed --force --no-interaction
|
||||
else
|
||||
log "Menjalankan migrasi..."
|
||||
$DC $COMPOSE_FILES exec -T --user www-data app php artisan migrate --force --no-interaction
|
||||
fi
|
||||
|
||||
log "Memastikan storage symlink..."
|
||||
$DC $COMPOSE_FILES exec -T --user www-data app php artisan storage:link --force || true
|
||||
|
||||
log "Membina semula cache Laravel..."
|
||||
$DC $COMPOSE_FILES exec -T --user www-data app php artisan optimize:clear
|
||||
$DC $COMPOSE_FILES exec -T --user www-data app php artisan optimize
|
||||
|
||||
# ── 6. Status ────────────────────────────────────────────────
|
||||
log "Selesai!"
|
||||
$DC $COMPOSE_FILES ps
|
||||
|
||||
PORT=$(grep -E '^NGINX_HTTP_PORT=' .env | cut -d= -f2 || echo 8010)
|
||||
log "Aplikasi tersedia pada port ${PORT:-8010} (cth: http://<server-ip>:${PORT:-8010})"
|
||||
Reference in New Issue
Block a user