☁️Infra

package.json 이 사라져서 배포가 깨진 날 — Next.js sibling 빌드 복구기

GitHub Actions 빌드가 'Cannot find module browserslist' 로 죽었다. 원인은 working tree 에서 package.json 이 사라진 것. PM2 는 살아있는데 새 빌드만 깨지는 유령 상태를 git checkout 으로 복구한 기록.

📅 2026년 5월 29일·📖 4분 읽기·👁 10

증상

GitHub Actions 배포가 두 번 연속 실패했다. 에러 메시지가 매번 달랐다:

Error: Cannot find module 'next/dist/compiled/browserslist'
...
Error: Cannot find module 'styled-jsx/package.json'

이상한 점: 사이트는 멀쩡히 돌아가고 있었다. 메인, 블로그, 채팅 다 200. 새로 빌드만 하면 깨졌다. 런타임은 살아있는데 빌드만 죽는 유령 같은 상태.

1차 오진 — node_modules 문제로 착각

"browserslist 모듈이 없다" 니까 의존성이 깨진 줄 알고 npm ci 를 돌렸다. 그런데:

npm error code ENOENT
npm error syscall open
npm error path /home/user/app/package.json
npm error errno -2
npm error enoent Could not read package.json

package.json 자체가 없었다. node_modules 가 아니라 매니페스트 파일이 사라진 것.

진짜 원인 — working tree 에서 파일이 삭제됨

git 상태를 보니:

$ git status
On branch main
Changes not staged for commit:
  deleted:    riel_agent/package.json

git 추적은 살아있는데 working tree 의 실제 파일만 삭제된 상태였다. (아마 이전에 빌드 산출물을 손으로 정리하다 실수로 지운 것.)

왜 사이트는 살아있었나? PM2 가 이미 빌드된 .next/ 산출물로 돌고 있었기 때문. 런타임은 package.json 없이도 작동한다. 하지만 새 배포(cp -al sibling 복사 → npm)는 package.json 이 없으니 의존성 트리를 못 만들어 stale node_modules 로 빌드 → 모듈 누락.

복구 — git 한 줄

# 추적되는 파일이므로 HEAD 에서 복원
git checkout HEAD -- riel_agent/package.json

깨진 sibling 빌드 디렉토리 정리

rm -rf /tmp/riel_agent_build

깨끗한 재설치로 무결성 보장

npm ci --prefer-offline --no-audit --no-fund

복원 후 확인:

$ ls node_modules/styled-jsx/package.json
node_modules/styled-jsx/package.json   ✓
$ ls node_modules/next/dist/compiled/browserslist/
LICENSE  index.js  package.json   ✓

교훈

  1. "모듈 없음" 에러는 의존성이 아니라 매니페스트 문제일 수 있다. npm 이 browserslist 를 못 찾은 진짜 이유는 package.json 이 없어서 의존성 트리 자체를 못 만든 것. 에러 메시지의 표면(browserslist)이 아니라 한 단계 위(package.json)를 봐야 했다.
  2. 런타임 정상 ≠ 빌드 정상. PM2/standalone 산출물은 소스가 일부 망가져도 돈다. "사이트 살아있으니 괜찮겠지" 가 함정. 배포 파이프라인은 소스 무결성에 의존한다.
  3. git checkout 은 최고의 복구 도구. 추적되는 파일이 사라졌으면 git checkout HEAD -- <file> 한 줄. 백업 찾을 필요 없다.
  4. 빌드 디렉토리를 손으로 정리하지 말 것. 이번 사고의 근본 원인. 정리는 스크립트/retention 정책으로 자동화하고, 소스 디렉토리는 절대 손대지 않는다.

태그

#Next.js#배포#package.json#npm ci#git#트러블슈팅

📨 박주니에게 한마디

스팸·악성 메시지 방지를 위해 구글 로그인 후 메시지를 보낼 수 있어요. 비공개로 전달되며, 운영자 외에는 볼 수 없습니다.

Google 로그인 후 메시지 남기기