From 194dfffae1c078b6736af6606bf74c6cb9d1b040 Mon Sep 17 00:00:00 2001 From: chpark Date: Thu, 7 May 2026 15:53:28 +0900 Subject: [PATCH] =?UTF-8?q?fix(deploy):=20=EB=A7=88=EC=9D=B4=EA=B7=B8?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=85=98=20=ED=98=B8=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=8F=B4=EB=B0=B1=20+=20=EB=9D=BC=EC=9D=B8=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=EC=97=90=EB=9F=AC=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 증상: /m/admin/orders 거래명세표에서 [+ 택배/용차 추가] 클릭 시 "라인 저장 중 오류" 500. 원인: 마이그레이션 010 (momo_order_items.kind/extra_label, momo_orders.total_delivery/charter)이 운영 DB에 적용되지 않음. deploy.yml 의 docker compose exec 가 silent fail 했을 가능성. [deploy.yml] - 컨테이너 안 마이그레이션 실패 시 → 호스트에서 docker run node:20 + pg 임시 컨테이너 폴백 - 호스트는 source 디렉토리를 /work 로 마운트해서 db/migrations 와 scripts/migrate-momo.mjs 직접 실행 - 모두 실패하면 ::error:: 로 명확히 표시 (warning 무시 방지) [lines/save] - catch 블록에서 실제 PG 에러 메시지 노출 - 'column does not exist'(42703) 감지 시 마이그레이션 미적용 힌트 추가 Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitea/workflows/deploy.yml | 18 +++++++++++++++--- src/app/api/m/orders/lines/save/route.ts | 7 ++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 64400f0..5e6219b 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -59,9 +59,21 @@ jobs: docker compose -f docker-compose.prod.yml up -d --build - # 마이그레이션 (idempotent) - docker compose -f docker-compose.prod.yml exec -T momo-erp npm run migrate:momo || \ - echo "::warning::migration skipped" + # 마이그레이션 (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 "✔ 배포 완료" diff --git a/src/app/api/m/orders/lines/save/route.ts b/src/app/api/m/orders/lines/save/route.ts index 05ceed5..a40c8aa 100644 --- a/src/app/api/m/orders/lines/save/route.ts +++ b/src/app/api/m/orders/lines/save/route.ts @@ -146,7 +146,12 @@ export async function POST(req: NextRequest) { } catch (err) { await client.query("ROLLBACK"); console.error("[orders/lines/save]", err); - return NextResponse.json({ success: false, message: "라인 저장 중 오류가 발생했습니다." }, { status: 500 }); + const msg = err instanceof Error ? err.message : "라인 저장 중 오류가 발생했습니다."; + // PG 컬럼 없음(undefined column 42703) — 마이그레이션 미적용 케이스 + const hint = /column .* does not exist|undefined column|42703/i.test(msg) + ? " · DB 마이그레이션 010(kind/extra_label/total_delivery/total_charter)이 적용되지 않은 것 같습니다." + : ""; + return NextResponse.json({ success: false, message: msg + hint }, { status: 500 }); } finally { client.release(); }