Profile picture

[Linux] 민감한 데이터 시놀로지 나스(Synology Nas)로 백업하기!

JaehyoJJAng2024년 11월 11일

개요

데이터베이스를 운용 중이라면 백업은 정말 필수적이라고 할 수 있는데요.

오늘은 많은 분들이 사내 혹은 가정내에서 사용하고 계실 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 같은 기능 활용!)
    Tag -

Loading script...