디스코드 봇을 디스호스트 같은 리눅스 기반 호스팅에 올릴 때 발생하는 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.json의main/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.json을index.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, 서버 내 의존성 설치 여부를 우선 점검하면 대부분의 크래시를 바로 해결할 수 있다.