← 전체 글로 돌아가기

서버 운영

운영 서버에서 디스크 용량으로 배포가 실패할 때

로컬에서는 괜찮다가 운영 서버에서만 디스크 부족으로 실패하는 상황을 빠르게 진단하는 방법.

로컬에서는 완벽하게 배포됐는데, 운영 서버에만 가면 "No space left on device" 에러가 난다. 흔한 문제이지만 그 원인이 여러 가지일 수 있다.

먼저 실제로 디스크가 부족한지 확인한다

df -h

Mounted on 컬럼을 보면서 각 파티션의 사용률을 확인한다. 대부분의 경우 /(루트 파티션)가 거의 찼다.

더 자세히 보려면:

du -sh /*

각 디렉토리의 크기를 보면 어디가 디스크를 많이 쓰는지 알 수 있다.

로그 파일을 확인한다

로그가 쌓여서 디스크를 다 쓰는 경우가 많다.

du -sh /var/log

로그 디렉토리 크기를 본다. 몇 GB라면 문제가 있는 것이다.

특정 로그 파일이 거대한지 확인:

ls -lh /var/log/*.log | sort -k5 -h

Docker 이미지와 컨테이너 정리

배포할 때마다 새로운 이미지가 저장되면서 디스크를 낭비할 수 있다.

docker system df

사용하지 않는 이미지를 제거:

docker image prune -a --force

중단된 컨테이너 정리:

docker container prune -f

주의: 실행 중인 컨테이너는 안 지워진다.

npm 캐시를 확인한다

배포 프로세스에서 npm install을 계속 하면 캐시가 커질 수 있다.

du -sh ~/.npm

캐시 정리:

npm cache clean --force

이전 배포 버전을 정리한다

/opt 같은 곳에 여러 버전의 앱이 남아있지 않은지 확인한다.

ls -lh /opt/app-*

안 쓰는 버전 디렉토리를 제거할 수 있다.

임시 파일을 정리한다

du -sh /tmp
du -sh /var/tmp

임시 파일이 쌓여있다면 정리:

sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*

swap 파티션을 확인한다

swap이 설정되어 있으면 메모리 부족 시에 디스크를 대신 쓸 수 있다. 이는 배포 속도를 느리게 한다.

free -h

swap이 있고 사용 중이라면, 시스템이 메모리 부족 상태라는 뜻이다.

배포 스크립트에서 불필요한 파일을 제외한다

.dockerignore나 배포 설정에서 불필요한 파일을 빌드 이미지에 포함하지 않는다:

node_modules
.git
.next
dist

정기적으로 공간을 확보하는 자동화를 만든다

Cron job으로 주기적으로 정리하도록 설정할 수 있다:

crontab -e

이 라인을 추가:

0 2 * * * docker image prune -a --force && npm cache clean --force

매일 밤 2시에 자동으로 정리한다.

결론

운영 서버의 디스크 부족 문제는 보통 로그 파일, Docker 이미지, npm 캐시 중 하나다. df -hdu -sh 두 명령만으로도 대부분 원인을 찾을 수 있다.