#!/bin/bash
APP=/home/erpsolution26/public_html/spincraft.erpsolution26.com
GUARD=$APP/spincraft-src.tar.gz
LOCK=$APP/.deploying
# Atomic self-disable: only the first cron tick past the guard file proceeds.
[ -f "$GUARD" ] || exit 0
mv "$GUARD" "$LOCK" 2>/dev/null || exit 0
exec >>$APP/deploy.log 2>&1
echo "================ DEPLOY START $(date) ================"
cd $APP || exit 1
# ---- locate the newest CloudLinux node ----
NODEBIN=""
for v in 22 20 24 18; do
if [ -x /opt/alt/alt-nodejs$v/root/usr/bin/node ]; then
NODEBIN=/opt/alt/alt-nodejs$v/root/usr/bin
break
fi
done
if [ -z "$NODEBIN" ]; then echo "FATAL: no alt-nodejs found"; echo "=== DONE ==="; exit 1; fi
export PATH=$NODEBIN:$PATH
export HOME=/home/erpsolution26
echo "node : $(node -v)"
echo "npm : $(npm -v)"
echo "nodebin: $NODEBIN"
# ---- extract ----
tar xzf "$LOCK" && echo "OK src extracted"
tar xzf spincraft-next.tar.gz && echo "OK next extracted"
# ---- environment ----
cat > .env <<'ENVEOF'
DATABASE_URL="mysql://erpsolution26_spincraft:y61JTjJiBBNqnwRPJTCg6wJl@localhost:3306/erpsolution26_spincraft"
AUTH_SECRET="LWq4tHjtKMiLs6IBjm3m0mKTkgypveVUmZL2jqD4VlGnkoDRMe_7jgMgyPQ3OVco"
NEXT_PUBLIC_APP_NAME="SpinCraft ERP"
NODE_ENV=production
PORT=3100
ENVEOF
chmod 600 .env
echo "OK .env written"
# ---- database import ----
if [ -f spincraft.sql.gz ]; then
gunzip -c spincraft.sql.gz > /tmp/spincraft.$$.sql
if mysql -u erpsolution26_spincraft -p'y61JTjJiBBNqnwRPJTCg6wJl' erpsolution26_spincraft < /tmp/spincraft.$$.sql; then
echo "OK database imported"
mysql -u erpsolution26_spincraft -p'y61JTjJiBBNqnwRPJTCg6wJl' erpsolution26_spincraft -N -e \
"SELECT CONCAT(' tables=', COUNT(*)) FROM information_schema.tables WHERE table_schema='erpsolution26_spincraft';"
mysql -u erpsolution26_spincraft -p'y61JTjJiBBNqnwRPJTCg6wJl' erpsolution26_spincraft -N -e \
"SELECT CONCAT(' users=', COUNT(*)) FROM User;"
else
echo "FAIL database import"
fi
rm -f /tmp/spincraft.$$.sql
fi
# ---- dependencies ----
echo "-- npm install (this takes a while) --"
npm install --no-audit --no-fund --loglevel=error > npm.log 2>&1 \
&& echo "OK npm install" || { echo "FAIL npm install"; tail -25 npm.log; }
echo "-- prisma generate --"
./node_modules/.bin/prisma generate >> npm.log 2>&1 \
&& echo "OK prisma generate" || { echo "FAIL prisma generate"; tail -25 npm.log; }
# ---- apache reverse proxy ----
cat > .htaccess <<'HTEOF'
RewriteEngine On
DirectoryIndex disabled
RewriteRule ^/?$ http://127.0.0.1:3100/ [P,L,QSA]
RewriteRule ^(.+)$ http://127.0.0.1:3100/$1 [P,L,QSA]
PassengerEnabled off
HTEOF
echo "OK .htaccess written"
# ---- keepalive helper ----
cat > keepalive.sh <<'KAEOF'
#!/bin/bash
APP=/home/erpsolution26/public_html/spincraft.erpsolution26.com
cd $APP || exit 0
if [ -f node.pid ] && kill -0 "$(cat node.pid)" 2>/dev/null; then exit 0; fi
export PATH=__NODEBIN__:$PATH
export HOME=/home/erpsolution26
nohup ./node_modules/.bin/next start -p 3100 >> node.log 2>&1 &
echo $! > node.pid
KAEOF
sed -i "s#__NODEBIN__#$NODEBIN#g" keepalive.sh
chmod +x keepalive.sh
echo "OK keepalive.sh written"
# ---- start the app ----
if [ -f node.pid ]; then kill -9 "$(cat node.pid)" 2>/dev/null; fi
pkill -9 -u erpsolution26 -f "next start -p 3100" 2>/dev/null
sleep 1
nohup ./node_modules/.bin/next start -p 3100 > node.log 2>&1 &
echo $! > node.pid
echo "OK node started pid=$(cat node.pid)"
# ---- wait for it to answer ----
for i in $(seq 1 30); do
sleep 2
CODE=$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:3100/login 2>/dev/null)
if [ "$CODE" = "200" ]; then break; fi
done
echo "local /login -> $CODE"
echo "--- node.log tail ---"
tail -15 node.log
# ---- clean up artifacts so this cannot re-run ----
rm -f "$LOCK" spincraft-next.tar.gz spincraft.sql.gz
echo "=== DONE ==="