서버 운영
마이그레이션 중에 서버에서 DB 파일을 못 열 때
배포 중 DB 마이그레이션을 실행할 때 파일 접근 권한 문제를 해결하는 방법을 정리했다.
배포할 때 마이그레이션 스크립트를 실행하다가 갑자기 "cannot open database file" 에러가 나면 배포가 실패한다. 대부분 권한, 경로, 또는 디스크 공간 문제다.
마이그레이션 전에 미리 확인할 것
# 배포 전에 로컬에서 마이그레이션 테스트
npm run migrate:up # 또는 prisma migrate deploy
# 스키마 변경이 문제를 일으키지 않는지 확인
npm run test:integration
로컬에서 문제가 없으면 대부분 배포 환경의 차이 때문이다.
서버의 디스크 공간 확인
# 서버에 접속
ssh user@server
# 디스크 사용 현황
df -h | grep /
# 특정 경로의 사용량
du -sh /path/to/database
디스크가 거의 찼다면 마이그레이션이 임시 파일을 만들지 못한다. 불필요한 파일을 먼저 정리한다:
# 로그 정리
sudo journalctl --vacuum=10d # 10일 이상 된 로그 삭제
# Docker 정리
docker system prune --all
# 임시 파일 정리
sudo rm -rf /tmp/*
파일 권한 확인
# 데이터베이스 파일의 소유자와 권한
ls -la /path/to/database
# 마이그레이션 스크립트를 실행하는 사용자
whoami
# 또는 systemd 서비스라면
sudo systemctl status app-service
# User= 항목을 확인
만약 파일을 소유한 사용자와 마이그레이션을 실행하는 사용자가 다르다면 권한 문제다:
# 데이터베이스 디렉토리의 권한을 앱 사용자에게 준다
sudo chown -R app-user:app-group /path/to/database
sudo chmod 755 /path/to/database
sudo chmod 644 /path/to/database/*.db
마이그레이션 중에 실패한 경우
# 마이그레이션 상태 확인
npx prisma migrate status
# 실패한 마이그레이션이 있다면
# 1. 문제를 해결한다
# 2. 다시 시도한다
npx prisma migrate resolve --rolled-back <migration-name>
# 또는
npx prisma migrate resolve --applied <migration-name>
마이그레이션이 중간에 실패하면 데이터베이스가 이상한 상태에 남을 수 있다. 백업에서 복구한 후 다시 시도한다:
# 백업에서 복구
cp /backup/database.db /path/to/database.db
# 권한 설정
sudo chown app-user:app-group /path/to/database.db
# 다시 마이그레이션
npx prisma migrate deploy
마이그레이션 로그 확인
# Prisma의 자세한 로그를 본다
export DEBUG="prisma:*"
npx prisma migrate deploy
# 또는 데이터베이스 로그
sudo tail -50 /var/log/postgresql/postgresql.log
로그에서 찾아야 할 것:
- "permission denied": 파일 권한 문제
- "no space left on device": 디스크 부족
- "database is locked": 다른 프로세스가 DB를 사용 중
배포 스크립트에서 미리 조치하기
#!/bin/bash
# deploy.sh
# 파일 권한 설정
sudo chown -R app-user:app-group /path/to/database
sudo chmod 755 /path/to/database
# 디스크 공간 확인
DISK_USED=$(df /path/to/database | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USED -gt 90 ]; then
echo "Disk usage is too high: $DISK_USED%"
exit 1
fi
# 마이그레이션 실행
npx prisma migrate deploy || exit 1
# 앱 시작
npm start
이렇게 미리 조치하면 마이그레이션 실패를 줄일 수 있다.