88 lines
2.8 KiB
Bash
Executable File
88 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Manual deploy on NODE Cloud (no CI). Run on the server as root.
|
|
set -euo pipefail
|
|
APP_DIR="/srv/nodecloud/apps/biztaghavisite"
|
|
PORT=3009
|
|
COMPOSE_FILE="docker-compose.yml"
|
|
DOCKERFILE_NOTE="online build (Liara npm mirror)"
|
|
|
|
cd "$APP_DIR"
|
|
|
|
echo "==> Pull latest code"
|
|
git pull origin main
|
|
# Accidental commit cleanup — never version the pnpm store
|
|
rm -rf .pnpm-store 2>/dev/null || true
|
|
|
|
echo "==> Ensure Docker network"
|
|
docker network inspect nodecloud-net >/dev/null 2>&1 || docker network create nodecloud-net
|
|
|
|
if [[ ! -f .env ]]; then
|
|
echo "ERROR: $APP_DIR/.env missing. Copy from .env.example and fill values."
|
|
exit 1
|
|
fi
|
|
|
|
# Offline bundle from Mac (recommended for Iran)
|
|
if [[ -f iran-bundle.tar.gz ]]; then
|
|
COMPOSE_FILE="docker-compose.prebuilt.yml"
|
|
DOCKERFILE_NOTE="prebuilt bundle (no npm on server)"
|
|
echo "==> Extract iran-bundle.tar.gz"
|
|
rm -rf iran-bundle
|
|
mkdir -p iran-bundle
|
|
tar -xzf iran-bundle.tar.gz -C .
|
|
if [[ ! -f iran-bundle/standalone/server.js ]]; then
|
|
echo "ERROR: iran-bundle/standalone/server.js missing — re-run bundle-for-iran.sh on Mac"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "WARN: iran-bundle.tar.gz not found — building on server (needs Liara mirror)."
|
|
echo " Recommended: run scripts/bundle-for-iran.sh on Mac and scp iran-bundle.tar.gz here."
|
|
fi
|
|
|
|
echo "==> Build image ($DOCKERFILE_NOTE)"
|
|
docker compose -f "$COMPOSE_FILE" build --no-cache
|
|
|
|
echo "==> Start MariaDB + app"
|
|
docker compose -f "$COMPOSE_FILE" up -d
|
|
|
|
echo "==> Wait for MariaDB"
|
|
for _ in $(seq 1 30); do
|
|
if docker compose -f "$COMPOSE_FILE" exec -T db healthcheck.sh --connect --innodb_initialized >/dev/null 2>&1; then
|
|
echo " MariaDB healthy"
|
|
break
|
|
fi
|
|
sleep 2
|
|
done
|
|
|
|
if [[ -f prisma/migrations/0_init/migration.sql ]] && [[ -s prisma/migrations/0_init/migration.sql ]]; then
|
|
echo "==> Apply database schema"
|
|
set -a
|
|
# shellcheck disable=SC1091
|
|
source .env
|
|
set +a
|
|
docker compose -f "$COMPOSE_FILE" exec -T db mariadb \
|
|
-u "${DB_USER:-biztaghavi}" -p"${DB_PASSWORD}" "${DB_NAME:-biztaghavi}" \
|
|
< prisma/migrations/0_init/migration.sql || true
|
|
else
|
|
echo "WARN: prisma/migrations/0_init/migration.sql missing or empty — skip SQL apply"
|
|
fi
|
|
|
|
echo "==> Health check"
|
|
sleep 3
|
|
if curl -sf "http://127.0.0.1:${PORT}/" -o /dev/null; then
|
|
echo "OK: app responds on :${PORT}"
|
|
else
|
|
echo "FAIL: app not responding"
|
|
docker compose -f "$COMPOSE_FILE" logs --tail=80 next-app
|
|
exit 1
|
|
fi
|
|
|
|
curl -sI -H "Host: biztaghavi.com" "http://127.0.0.1/" | head -5
|
|
if curl -sf -H "Host: biztaghavi.com" "http://127.0.0.1:${PORT}/admin/login" -o /dev/null; then
|
|
echo "OK: /admin/login responds"
|
|
else
|
|
echo "WARN: /admin/login not OK — rebuild after proxy.ts excludes /admin"
|
|
fi
|
|
docker compose -f "$COMPOSE_FILE" ps
|
|
echo ""
|
|
echo "Done. Test https://biztaghavi.com (purge ArvanCloud cache if needed)."
|