Files
distribution_erp/.gitea/workflows/deploy.yml
T
chpark faf8315260
Deploy momo-erp / deploy (push) Failing after 43s
fix(admin-panel): useSearchParams 제거 + deploy 강건성 개선
- useSearchParams 가 Next.js 15 prerender 단계에서 Suspense 경계를 강제해
  /admin-panel 빌드 자체가 실패 → docker image 재빌드 안 됨 →
  컨테이너 swap 누락(2시간째 옛 이미지). window.location.search 직접 읽기로 대체
- deploy.yml: set +e 제거 (빌드 실패가 워크플로우 success 로 묻히는 문제 차단)
- docker compose 에 --force-recreate 추가 (이미지가 같아도 컨테이너 강제 재생성)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 13:33:40 +09:00

103 lines
4.5 KiB
YAML

name: Deploy momo-erp
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Install sshpass
run: |
apt-get update -qq && apt-get install -y -qq sshpass openssh-client || \
sudo apt-get update -qq && sudo apt-get install -y -qq sshpass openssh-client
- name: Deploy via SSH (password auth)
run: |
set -e # 배포 단계 실패하면 즉시 워크플로우 fail (헬스체크에 의존하지 않음)
export SSHPASS='qlalfqjsgh11'
mkdir -p ~/.ssh
ssh-keyscan -H 183.99.177.40 >> ~/.ssh/known_hosts 2>/dev/null || true
sshpass -e ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
chpark@183.99.177.40 'bash -s' <<'REMOTE_SCRIPT'
set -e # 원격 명령도 fail 즉시 중단
DEPLOY_DIR="$HOME/momo-erp/source"
mkdir -p "$HOME/momo-erp"
if [ -d "$DEPLOY_DIR/.git" ]; then
cd "$DEPLOY_DIR"
git fetch origin
git reset --hard origin/main
else
git clone https://git.junggomoa.com/chpark/distribution_erp.git "$DEPLOY_DIR"
cd "$DEPLOY_DIR"
fi
# 빌드 SHA 마커 박기 — 헬스체크가 이 값으로 신버전 반영 여부 판단
DEPLOY_SHA=$(git rev-parse HEAD)
echo "$DEPLOY_SHA" > public/build-sha.txt
echo "▶ 배포 대상 SHA: $DEPLOY_SHA"
# .env.production 갱신 (SMTP/MOMO 포함)
cat > .env.production <<'ENVEOF'
DATABASE_URL=postgresql://momo_app:qlalfqjsgh11@183.99.177.40:5432/distribution
NEXTAUTH_URL=https://momotogether.com
NEXTAUTH_SECRET=2b1f94cca798f49ff62822b01617503b019d118df9d249ee61f835a7dca1946e
NEXT_PUBLIC_APP_NAME=유통관리 ERP
NEXT_PUBLIC_COMPANY_NAME=모모유통
MASTER_PWD=qlalfqjsgh11
AES_KEY=ILJIAESSECRETKEY
FILE_STORAGE_PATH=/data_storage
LOG_LEVEL=info
SMTP_HOST=mail.coa-soft.com
SMTP_PORT=465
SMTP_USER=chpark@coa-soft.com
SMTP_PASS=1321Qkrckd!!!!!!
SMTP_FROM=모모유통 <chpark@coa-soft.com>
MOMO_BANK_ACCOUNT=기업은행 434-115361-01-016
MOMO_PHONE=010-6624-5315
DEPLOY_WEBHOOK_TOKEN=momo-deploy-2026-secure
ENVEOF
# --force-recreate: docker compose 가 변화 감지 못해 컨테이너 swap 안 하는 케이스 방지
docker compose -f docker-compose.prod.yml up -d --build --force-recreate momo-erp
# 마이그레이션 (idempotent) — 컨테이너 안에 db/migrations + scripts/migrate-momo.mjs 가
# standalone 번들에 포함되어 있어야 동작 (next.config.ts outputFileTracingIncludes).
# 컨테이너 시도 후 실패하면 호스트 측 docker run 으로 폴백 (소스 마운트 사용).
if docker compose -f docker-compose.prod.yml exec -T momo-erp node scripts/migrate-momo.mjs 2>&1; then
echo "✔ 마이그레이션 컨테이너 실행 성공"
else
echo "::warning::컨테이너 마이그레이션 실패 — 호스트에서 임시 컨테이너로 재시도"
docker run --rm \
--network host \
-v "$DEPLOY_DIR":/work \
-w /work \
--env-file "$DEPLOY_DIR/.env.production" \
node:20-alpine sh -c "npm i pg --no-save --silent && node scripts/migrate-momo.mjs" \
|| echo "::error::마이그레이션 모두 실패 — 수동 실행 필요"
fi
docker compose -f docker-compose.prod.yml ps
echo "✔ 배포 완료"
REMOTE_SCRIPT
- name: Healthcheck (build-sha.txt 일치 검증)
run: |
EXPECTED="${GITHUB_SHA}"
echo "▶ 기대 SHA: $EXPECTED"
for i in 1 2 3 4 5 6 7 8 9 10 11 12; do
sleep 10
REMOTE=$(curl -sS -m 5 -L "https://momotogether.com/build-sha.txt?_=$(date +%s)" 2>/dev/null | tr -d '[:space:]' || true)
echo " ${i}/12: 운영 SHA=${REMOTE:-(없음)}"
if [ -n "$REMOTE" ] && [ "$REMOTE" = "$EXPECTED" ]; then
echo "::notice::✔ 운영에 신버전(${REMOTE:0:8}) 반영 확인"
exit 0
fi
done
echo "::error::헬스체크 실패: 운영의 build-sha (${REMOTE:-없음})가 기대 SHA(${EXPECTED:0:8})와 다름 — 빌드/재시작 실패 가능"
exit 1