← 전체 글로 돌아가기

서버 운영

SQLite 파일을 서버에서만 못 읽을 때

서버 환경에서 SQLite 데이터베이스에 접근할 수 없을 때 디버깅하는 방법을 정리했다.

개발 환경에서는 SQLite가 잘 작동하는데, 서버에 배포하면 갑자기 파일을 못 열거나 쓸 수 없다는 에러가 나타날 수 있다. 대부분 권한과 파일 경로 문제다.

먼저 확인할 것: 파일이 존재하는가

서버에서 직접 확인한다:

ssh user@server

# SQLite 파일이 있는지 확인
ls -la /path/to/data.db

# 파일이 없다면 해당 디렉토리가 있는지 확인
ls -la /path/to/

파일이 없다면 배포 스크립트에서 데이터베이스를 생성하는 부분이 실행되지 않은 것이다. 또는 컨테이너가 재시작될 때 파일이 사라지는 임시 볼륨을 쓰고 있을 수도 있다.

파일이 있다면 권한 확인

# 파일의 소유자와 권한을 본다
ls -l /path/to/data.db
# 출력: -rw-r--r-- 1 root root 4096 Jun 28 10:30 /path/to/data.db

# 디렉토리의 권한도 확인
ls -ld /path/to/
# 출력: drwxr-xr-x 2 root root 4096 Jun 28 10:30 /path/to/

만약 root가 소유하고 있고, 앱을 실행하는 사용자가 root가 아니라면 읽고 쓸 수 없다. 권한을 바꿔야 한다:

# 앱이 실행되는 사용자 확인 (예: www-data)
sudo ps aux | grep app

# 파일의 소유자를 바꿈
sudo chown www-data:www-data /path/to/data.db

# 읽고 쓸 수 있도록 권한 설정
sudo chmod 644 /path/to/data.db

# 디렉토리도 권한을 줘야 새 파일을 만들 수 있음
sudo chmod 755 /path/to/

로그를 보면 알 수 있는 것들

# 앱 실행 로그를 본다
sudo journalctl -u app-service -n 100 -f
# 또는 Docker라면
docker logs app-container -f

SQLite 에러 메시지:

  • "database is locked": 다른 프로세스가 파일을 쓰고 있는 중
  • "Permission denied": 파일 권한이 없음
  • "unable to open database file": 경로가 잘못됐거나 파일이 없음

볼륨이 제대로 마운트되었는지 확인

Docker나 Kubernetes를 쓴다면, SQLite 파일이 영속적인 볼륨에 저장되는지 확인한다:

# Docker
docker inspect app-container | grep -A 10 Mounts

# Kubernetes
kubectl describe pod app-pod-name | grep -A 10 Mounts

만약 임시 볼륨(tmpfs)에 저장되고 있다면, 컨테이너 재시작 때마다 파일이 사라진다. Docker Compose라면 volumes 섹션을 확인한다:

services:
  app:
    volumes:
      - ./data:/app/data  # 호스트의 data 디렉토리가 /app/data에 마운트됨

WAL 모드 관련 문제

SQLite가 Write-Ahead Logging (WAL) 모드를 쓰면 여러 파일(-wal, -shm)이 생긴다. 이들이 모두 같은 디렉토리에서 같은 권한을 가져야 한다:

# WAL 관련 파일들이 모두 있는지 확인
ls -la /path/to/data.db*

# 모두 같은 소유자 권한으로 설정
sudo chown www-data:www-data /path/to/data.db*

수정 후 확인

권한을 고쳤거나 환경 변수를 바꾼 후:

# 앱을 재시작
sudo systemctl restart app-service
# 또는
docker restart app-container

# 로그를 보면서 에러가 나는지 확인
grep -i error /var/log/app/app.log

에러가 없으면 데이터베이스가 정상 작동하는 것이다. 이렇게 한 번 정리하면, 다음 배포 때는 같은 실수를 반복하지 않을 수 있다.