개요
데이터베이스를 운용 중이라면 백업은 정말 필수적이라고 할 수 있는데요.
오늘은 많은 분들이 사내 혹은 가정내에서 사용하고 계실 Synology NAS를 활용하여
도커 컨테이너의 DB 데이터를 안정적으로 백업하는 방법에 대해 기록해보려고 합니다!
백업 프로세스
백업은 크게 두 단계로 이루어질 예정이에요.
- 1. DB 데이터 덤프: 도커 컨테이너 내부의 DB 데이터를 파일 형태로 추출 (덤프)
- 2. NAS로 전송: 생성된 덤프 파일을 리눅스 서버에서 NAS로 안전하게 전송
1. DB 데이터 덤프 파일 생성하기
이 단계는 NAS 전송 방법과 관계없이 동일하게 필요해요.
docker exec
명령어를 사용하여 실행 중인 DB 컨테이너에 접속하고, 각 DB의 네이티브 덤프 도구를 사용하면 됩니다.
(만약 도커 환경이 아닌 DB 서버에서 진행하는 경우 도커 관련 명령어는 건너뛰고 덤프 부분만 참고하시면 됩니다.)
# PostgreSQL 예시 (서비스 이름: db, 사용자: user, DB 이름: myappdb)
docker compose exec -T db pg_dump -U user myappdb > /path/on/host/db_backup_$(date +%Y%m%d_%H%M%S).sql
# MySQL/MariaDB 예시 (서비스 이름: db, 사용자: user, 비밀번호: password, DB 이름: myappdb)
# 주의: -p 뒤에 비밀번호 바로 붙이는 것은 보안상 좋지 않을 수 있습니다. .my.cnf 파일 등을 고려하세요.
docker compose exec -T db mysqldump -u user -ppassword myappdb > /path/on/host/db_backup_$(date +%Y%m%d_%H%M%S).sql
위 명령어를 실행하면 리눅스 호스트 서버의 /path/on/host/
경로에 .sql
덤프 파일이 생성됩니다.
이제 이 파일을 NAS로 옮기면 되겠죠?
2. NAS로 백업 파일 전송하기 (3가지 방법)
2-1. SMB/CIFS 공유 폴더 활용하기
윈도우 파일 공유처럼 NAS 폴더를 리눅스 서버에 연결(마운트)해서 사용하는 방식입니다.
설정이 비교적 간편해요!
1. NAS 설정 (DSM)
- DSM 접속 ->
제어판
->파일 서비스
->SMB
활성화 확인하기 제어판
->공유 폴더
->생성
버튼 클릭 (예:db_backups
폴더 생성하기)- 생성한 폴더 선택 ->
편집
->권한
탭 -> 백업 전용 사용자 생성 및읽기/쓰기
권한 부여!
2. 리눅스 서버 설정
2-1. CIFS 유틸리티 설치:
# Debian/Ubuntu
sudo apt update && sudo apt install cifs-utils
# CentOS/RHEL
sudo yum install cifs-utils
2-2. 마운트 포인트 생성
sudo mkdir /mnt/nas_backup
2-3. NAS 공유 폴더 마운트 (테스트)
sudo mount -t cifs //<NAS_IP>/django_backups /mnt/nas_backup -o username=<NAS_USER>,password=<NAS_PASS>,uid=$(id -u),gid=$(id -g)
2-4. 매번 마운트는 번거로우니 /etc/fstab
에 등록하여 자동 마운트하고, 보안을 위해 자격 증명 파일을 사용해보는걸 추천드려요!
3. 파일 전송
이제 /mnt/nas_backup
디렉토리는 NAS 폴더와 같아요.
cp
명령어로 백업 파일을 복사하면 끝!
cp /path/on/host/db_backup_*.sql /mnt/nas_backup/
2-2. NFS 공유 폴더 활용하기
리눅스/유닉스 환경에서 전통적으로 사용되는 파일 공유 방식이죠?
1. NAS 설정 (DSM)
- DSM 접속 >
제어판
>파일 서비스
>NFS
>NFS 서비스 활성화
체크 제어판
>공유 폴더
> 백업 폴더 선택 (django_backups
) >편집
>NFS 권한
탭생성
클릭 > 리눅스 서버 IP 주소 입력,읽기/쓰기
권한 부여, Squash 옵션 등 설정 (보안을 위해 IP를 정확히 지정하세요!)
2. 리눅스 서버 설정
2-1. NFS 클라이언트 설치
sudo apt install nfs-common # Debian
sudo yum install nfs-utils # rhel
2-2. 마운트 포인트 생성
sudo mkdir /mnt/nas_backup_nfs
2-3. NFS 공유 마운트 (테스트)
sudo mount -t nfs <NAS_IP>:/volume1/django_backups /mnt/nas_backup_nfs
:/volume1/django_backups
부분은 NAS의 NFS 권한 설정 화면 하단에 표시되는 '파일 경로'를 정확히 입력해야 해요!
3. 파일 전송
SMB와 동일하게 cp
명령어로 /mnt/nas_backup_nfs
경로에 복사하면 끝!
2-3. rsync + SSH 활용하기
파일 동기화에 특화된 rsync와 보안 채널 SSH를 이용하는 강력한 방법입니다. 마운트 없이 직접 파일을 전송하며, 변경된 부분만 효율적으로 전송합니다. 자동화 스크립트에 찰떡궁합!
1. NAS 설정 (DSM)
- DSM 접속 > 제어판 > 터미널 및 SNMP > 터미널 탭 > SSH 서비스 활성화 체크
- 백업용 NAS 사용자가 SSH 접속 및 대상 폴더 쓰기 권한이 있는지 확인합니다.
2. 리눅스 서버 설정
rsync는 보통 기본 설치되어 있습니다.
강력 추천: SSH 키를 생성하고 NAS에 공개 키를 등록하여 비밀번호 입력 없이 접속 가능하게 설정하세요!
(ssh-keygen
-> ssh-copy-id <NAS_USER>@<NAS_IP>
) 자동화의 핵심입니다!
3. 파일 전송: rsync 명령어로 샤샥!
rsync -avz --delete /path/on/host/db_backup_*.sql <NAS_USER>@<NAS_IP>:/volume1/django_backups/
-a
: 아카이브 모드 (권한 등 유지)-v
: 진행 상황 보기-z
: 압축 전송--delete
: 원본에 없는 파일은 NAS에서도 삭제 (백업 폴더를 깔끔하게 유지!)
(번외) SCP/SFTP: rsync가 부담스럽다면, SSH 기반의 간단한 파일 복사 도구인 scp나 sftp를 사용할 수도 있습니다.
3. 모든 것을 자동화! (Cron 작업)
수동 백업은 ... 음 .. 잊어버리기 쉽겠죠?
리눅스의 cron
을 사용하여 이 모든 과정을 자동화해봅시다!
1. 백업 스크립트 작성 (.sh
파일)
- 1단계의 DB 덤프 명령어
- 2단계에서 선택한 방법의 파일 전송 명령어 (마운트 방식이면 마운트 확인 로직 추가)
2. crontab -e
명령어로 크론 작업 등록
# 매일 새벽 2시에 백업 스크립트 실행
0 2 * * * /path/to/your/backup_script.sh > /var/log/db_backup.log 2>&1
로그 파일 경로 지정 및 오류 리다이렉션 (> ... 2>&1
)을 통해 실행 결과를 기록하는 것이 좋습니다.
추가 팁!
- NAS 백업 전용 사용자: 보안을 위해 NAS에 백업 용도로만 사용하는 계정을 만들고 최소 권한만 부여하세요.
- 권한 확인: 파일 전송 시 권한 문제가 발생하지 않도록 리눅스 서버와 NAS 양쪽의 폴더/파일 권한을 잘 확인하세요.
- SSH 키 사용: rsync나 scp를 쓴다면 꼭 SSH 키 기반 인증을 사용하세요. 훨씬 안전하고 편리합니다.
- 복구 테스트는 필수! 백업만 쌓아두면 무용지물! 정기적으로 백업 파일로 실제 복구를 시도해보며 백업 시스템이 잘 작동하는지 검증해야 합니다.
- 3-2-1 백업 전략: NAS 백업은 훌륭하지만, 랜섬웨어나 물리적 재해에 대비해 NAS의 데이터를 클라우드 스토리지 등 다른 곳에 한 번 더 백업(오프사이트 백업)하는 것을 고려해보세요. (Synology Hyper Backup 같은 기능 활용!)