Files
2026FIFAWorldCup/ops/deploy-production.sh

63 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
HOST="${1:-192.168.0.188}"
PROJECT_ROOT="${2:-/opt/fifa2026}"
PUBLIC_ORIGIN="${3:-https://2026fifa.wooo.work}"
DEPLOY_USER="${DEPLOY_USER:-${USER}}"
LOCAL_DIR="$(cd "$(dirname "$0")/.." && pwd)"
ENV_FILE="${LOCAL_DIR}/.env"
if [[ ! -f "${ENV_FILE}" ]]; then
echo "[deploy] ERROR: .env not found at ${ENV_FILE}"
exit 1
fi
echo "[deploy] target=${HOST} path=${PROJECT_ROOT}"
echo "[deploy] rsync source=${LOCAL_DIR}"
ssh -o StrictHostKeyChecking=accept-new "${DEPLOY_USER}@${HOST}" "mkdir -p ${PROJECT_ROOT}/shared ${PROJECT_ROOT}/logs"
rsync -avz --delete \
--exclude node_modules \
--exclude .git \
--exclude .env \
"${LOCAL_DIR}/" "${DEPLOY_USER}@${HOST}:${PROJECT_ROOT}/current/"
scp "${ENV_FILE}" "${DEPLOY_USER}@${HOST}:${PROJECT_ROOT}/.env"
ssh "${DEPLOY_USER}@${HOST}" "PROJECT_ROOT='${PROJECT_ROOT}'; \
mkdir -p ${PROJECT_ROOT}/current; \
cd ${PROJECT_ROOT}/current; \
if [[ -f .env ]]; then :; else cp ${PROJECT_ROOT}/.env .env; fi; \
if ! grep -q '^APP_PUBLIC_ORIGIN=' ${PROJECT_ROOT}/.env; then \
echo \"APP_PUBLIC_ORIGIN=${PUBLIC_ORIGIN}\" >> ${PROJECT_ROOT}/.env; \
fi; \
if ! grep -q '^APP_TIME_ZONE=' ${PROJECT_ROOT}/.env; then \
echo 'APP_TIME_ZONE=Asia/Taipei' >> ${PROJECT_ROOT}/.env; \
fi; \
if ! grep -q '^TZ=' ${PROJECT_ROOT}/.env; then \
echo 'TZ=Asia/Taipei' >> ${PROJECT_ROOT}/.env; \
fi; \
if ! grep -q '^KELLY_SCALE=' ${PROJECT_ROOT}/.env; then \
echo 'KELLY_SCALE=0.6' >> ${PROJECT_ROOT}/.env; \
fi; \
node -v >/tmp/node-version.txt 2>/dev/null || true; \
if ! command -v npm >/dev/null; then \
echo '[deploy] ERROR: npm not found'; exit 1; \
fi; \
npm install --omit=dev; \
if ! command -v pm2 >/dev/null; then \
npm install pm2 >/tmp/pm2-install.log 2>&1; \
fi; \
PM2_BIN=\"\$(command -v pm2 || true)\"; \
if [ -z \"\${PM2_BIN}\" ]; then \
PM2_BIN=\"\${PROJECT_ROOT}/current/node_modules/.bin/pm2\"; \
fi; \
[ -x \"\${PM2_BIN}\" ] || PM2_BIN=\"\${PROJECT_ROOT}/current/node_modules/.bin/pm2\"; \
[ -x \"\${PM2_BIN}\" ] || (echo '[deploy] ERROR: pm2 not found' && exit 1); \
TZ=Asia/Taipei APP_TIME_ZONE=Asia/Taipei NODE_ENV=production \"\${PM2_BIN}\" startOrReload \"\${PROJECT_ROOT}/current/ops/pm2.config.js\" --env production 2>&1 | cat; \
\"\${PM2_BIN}\" save"
echo "[deploy] deploy done"