chitfund/scripts/deploy.sh

148 lines
3.6 KiB
Bash

#!/usr/bin/env bash
#
# LuckyChit deployment — backend (Node/PM2) + frontend (Flutter web + PM2).
#
# Usage:
# ./scripts/deploy.sh # backend + frontend
# ./scripts/deploy.sh backend # API only
# ./scripts/deploy.sh frontend # Flutter web only
# ./scripts/deploy.sh backend --force # e.g. wipe node_modules / flutter clean
#
# Env (optional):
# LUCKYCHIT_ROOT Repo root (default: /home/luckychit/apps/chitfund)
# DEPLOY_BRANCH Git branch to fast-forward to (default: prod_i8n)
set -eo pipefail
PROJECT_DIR="${LUCKYCHIT_ROOT:-/home/luckychit/apps/chitfund}"
BRANCH="${DEPLOY_BRANCH:-prod_i8n}"
FORCE_REBUILD=false
TARGET=""
usage() {
echo "Usage: $0 [backend|frontend] [--force]"
echo " (no args) deploy backend and frontend"
echo " backend deploy Node API only (pm2: luckychit-api)"
echo " frontend build Flutter web + restart static server (pm2: luckychit-web)"
echo " --force aggressive clean (backend: rm node_modules; frontend: flutter clean)"
exit 1
}
for arg in "$@"; do
case "$arg" in
--force)
FORCE_REBUILD=true
;;
backend|frontend)
if [ -n "$TARGET" ] && [ "$TARGET" != "$arg" ]; then
echo "Error: specify only one of backend or frontend."
usage
fi
TARGET="$arg"
;;
-h|--help)
usage
;;
*)
echo "Unknown argument: $arg"
usage
;;
esac
done
run_backend() {
[ "$TARGET" = "" ] || [ "$TARGET" = "backend" ]
}
run_frontend() {
[ "$TARGET" = "" ] || [ "$TARGET" = "frontend" ]
}
cd "$PROJECT_DIR"
echo "LuckyChit deployment"
echo "===================="
echo "Root: $PROJECT_DIR"
echo "Branch: $BRANCH"
echo "Target: ${TARGET:-backend+frontend} force=$FORCE_REBUILD"
echo ""
if [ "$(id -u)" -eq 0 ]; then
echo "Warning: running as root. Prefer a normal user so Flutter/npm caches stay consistent."
echo ""
fi
echo "Pulling latest code..."
git fetch origin "$BRANCH"
if ! git rev-parse --verify "refs/remotes/origin/$BRANCH" >/dev/null 2>&1; then
echo "Error: origin/$BRANCH not found. Fetch failed or branch missing on remote."
exit 1
fi
git checkout "$BRANCH"
git merge --ff-only "origin/$BRANCH"
echo ""
if run_backend; then
echo "Deploying backend..."
cd "$PROJECT_DIR/backend"
if [ "$FORCE_REBUILD" = true ]; then
echo "Force rebuild: removing node_modules and lockfile..."
rm -rf node_modules package-lock.json
fi
if [ -f package-lock.json ]; then
npm ci
else
npm install
fi
if pm2 describe luckychit-api >/dev/null 2>&1; then
pm2 restart luckychit-api --update-env
else
pm2 start ecosystem.config.js --env production
fi
echo "Backend done."
echo ""
fi
if run_frontend; then
echo "Deploying frontend (Flutter web)..."
cd "$PROJECT_DIR/luckychit"
if [ "$FORCE_REBUILD" = true ]; then
echo "Force rebuild: flutter clean..."
flutter clean
rm -rf .dart_tool build
fi
flutter pub get
if [ -f tool/sync_l10n.mjs ]; then
node tool/sync_l10n.mjs
fi
BUILD_NUMBER=$(date +%s)
flutter build web --release --pwa-strategy=none --build-number="$BUILD_NUMBER"
echo "Build number: $BUILD_NUMBER"
# Name must match luckychit/ecosystem.config.js (app name: luckychit-web)
if pm2 describe luckychit-web >/dev/null 2>&1; then
pm2 restart luckychit-web --update-env
else
pm2 start ecosystem.config.js --env production
fi
echo "Frontend done."
echo ""
fi
echo "PM2 status:"
pm2 status
echo ""
echo "Deployment complete."
echo "Smoke tests:"
echo " curl -sf http://localhost:3000/health || curl -sf http://localhost:3000/api/health"
echo " curl -sfI http://localhost:8080/"
echo "Logs: pm2 logs --lines 30"