저가 초보라 그냥 ai로 만들어 본건데...

2026년 5월 17일·20개 메시지

디스코드 봇을 디스호스트 같은 리눅스 기반 호스팅에 올릴 때 발생하는 npm 관련 크래시 증상과 이를 해결하는 실전 가이드를 정리한다. 오류 메시지 분석, 파일명·대소문자 문제, 의존성 설치 방식까지 점검하는 방법을 단계별로 설명한다.

증상

  • 서버 시작 시 npm ERR! JSON.parse Note: package.json must be actual JSON, not just JavaScript. 같은 package.json 관련 파싱 오류 로그가 출력된다.
  • Pterodactyl(terodactyl Daemon) 로그에 Detected server process in a crashed state! / Exit code: 1 / Aborting automatic restart, last crash occurred less than 60 seconds ago. 등이 출력되어 자동 재시작이 중단된다.
  • 로컬에서는 정상 동작하지만 호스팅(리눅스) 환경에서는 바로 크래시가 발생한다.

원인

  • 파일명 대소문자 불일치: 로컬(Windows)은 대소문자 구분을 하지 않아 동작하지만, 호스팅의 리눅스 파일시스템은 대소문자를 구분한다. 예: 실제 파일명이 Index.js인데 package.json과 start 스크립트가 index.js로 지정되어 있으면 시작 실패.
  • 유효하지 않은 package.json: 파일에 주석, 후행 쉼표, BOM(UTF-8 with BOM) 등으로 JSON 파싱 실패 발생 가능.
  • 의존성 미설치: node_modules가 없거나 설치되지 않음. 호스팅 환경에서 npm install이 실행되지 않으면 런타임에서 모듈을 찾지 못해 크래시.
  • Pterodactyl의 크래시 보호: 짧은 시간 내 반복 크래시 시 자동 재시작을 중단하여 수동 조치 필요.

해결 방법

1단계: package.json 검증 및 파일명 확인

  • package.json이 실제로 유효한 JSON인지 확인:
# Node 사용
node -e "JSON.parse(require('fs').readFileSync('package.json','utf8')) && console.log('OK')"

# 또는 Python
python3 -m json.tool package.json > /dev/null && echo "OK"
  • 파일명·대소문자 확인:
ls -la
# 예: 파일명이 Index.js 인지 index.js 인지 확인
  • package.jsonmain / scripts.start 항목이 실제 파일명과 일치하도록 수정:
{
  "name": "levelbot",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "discord.js": "^14.26.4",
    "dotenv": "^16.0.0",
    "better-sqlite3": "^9.0.0"
  }
}
  • 만약 실제 엔트리 파일명이 Index.js라면 package.jsonindex.js로 바꾸거나 start 스크립트를 node Index.js로 변경한다.

2단계: 의존성 설치 (권장: 서버에서 설치)

  • 호스팅 서버의 컨테이너 내에서 의존성 설치:
cd /home/container
npm install --production
  • 설치가 어려운 경우(메모리·권한 문제)는 로컬에서 설치 후 node_modules를 업로드하거나, 빌드 후 npm prune --production으로 배포용으로 정리한 뒤 업로드한다. 다만 보안과 용량을 고려하여 가능하면 서버에서 npm install 실행을 권장한다.

  • 설치 실패 시 로그 파일 확인:

/home/container/.npm/_logs/<날짜>-debug-0.log

3단계: 재시작 및 로그 확인

  • 서버를 재시작하고 콘솔 로그를 확인하여 동일한 오류가 재발하는지 점검한다.
  • Pterodactyl에서 자동 재시작이 중단된 경우에는 수동으로 시작하거나, 크래시 원인을 해결한 뒤 재시작한다.

메모리 관련 대안

  • 의존성 설치 중 메모리 부족으로 실패하면 npm ci --production --no-optional로 메모리 부담을 줄여 설치 시도.
  • 호스팅 요금제 업그레이드 또는 빌드 아티팩트(사전 설치된 node_modules) 업로드를 고려.

마무리

디스코드 봇을 디스호스트 같은 리눅스 기반 호스팅에 올릴 때는 파일명 대소문자 일치, 유효한 package.json, 서버 내 의존성 설치 여부를 우선 점검하면 대부분의 크래시를 바로 해결할 수 있다.