#!/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 ==="