서버 운영
운영 서버에서 디스크 용량으로 배포가 실패할 때
로컬에서는 괜찮다가 운영 서버에서만 디스크 부족으로 실패하는 상황을 빠르게 진단하는 방법.
로컬에서는 완벽하게 배포됐는데, 운영 서버에만 가면 "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 -h와 du -sh 두 명령만으로도 대부분 원인을 찾을 수 있다.