워드프레스 자동 백업과 복구 방법 – 홈서버를 안전하게 지키는 법

워드프레스 자동 백업과 복구 방법 – 홈서버를 안전하게 지키는 법

홈서버에서 워드프레스를 운영하면서 가장 두려운 순간은
“내 블로그가 날아갔을 때”다.

애써 쌓아올린 콘텐츠, 애드센스 수익, 방문자 데이터까지
순식간에 사라질 수 있는 상황은 서버 운영자라면 누구나 겪을 수 있다.

이번 글에서는 홈서버 환경에서도 간단하게 구현할 수 있는
워드프레스 자동 백업과 복구 방법을 소개한다.

Docker 컨테이너 구조, 워드프레스 백업 플러그인,
볼륨 백업 스크립트까지 실전 위주로 정리했다.

💥 실제 데이터 손실 사례

홈서버 운영자가 겪는 데이터 손실 원인

원인발생 확률피해 정도예방 방법
정전⭐⭐⭐⭐DB 손상UPS 또는 자동 백업
디스크 고장⭐⭐⭐전체 손실클라우드 백업 필수
플러그인 오류⭐⭐⭐⭐⭐사이트 다운업데이트 전 백업
해킹⭐⭐데이터 변조보안 + 정기 백업
실수 (rm -rf)⭐⭐⭐복구 불가백업만이 답

백업 없이 데이터 손실 시

  • ❌ 모든 글/댓글 영구 삭제
  • ❌ 테마/플러그인 설정 초기화
  • ❌ 애드센스 수익 기록 소멸
  • ❌ SEO 순위 하락 (사이트 다운 시간)
  • ❌ 방문자 신뢰도 하락

결론: 백업은 선택이 아닌 생존 전략

📊 백업 전략 3단계

3-2-1 백업 규칙

3데이터 사본 3개 유지원본 + 백업 2개
22가지 다른 매체로컬 + 클라우드
11개는 오프사이트Google Drive, AWS S3 등

홈서버 백업 전략 예시

  1. 원본: 워드프레스 (실행 중)
  2. 1차 백업: 로컬 Docker 볼륨 스냅샷 (매일)
  3. 2차 백업: Google Drive (주 1회)
  4. 3차 백업: 외장 HDD (월 1회, 물리적 분리)

🧰 방법 1: 플러그인 백업 (UpdraftPlus) ⭐⭐⭐⭐⭐

장단점

장점단점
✅ 클릭만으로 설정 가능❌ 플러그인 의존성
✅ 자동 스케줄링❌ 대용량 사이트 시 느림
✅ 클라우드 연동❌ 무료 버전 제약
✅ 복원 간편

Step 1: 설치

워드프레스 관리자 → 플러그인 → 새로 추가
→ "UpdraftPlus" 검색 → 설치 → 활성화

설정 → UpdraftPlus Backups

Step 2: 자동 백업 스케줄 설정

Settings 탭 → Schedule

파일 백업:
- 빈도: Weekly (주 1회)
- 요일: Sunday (일요일)
- 시간: 03:00 (새벽 3시)
- 보관: 4개 버전

데이터베이스 백업:
- 빈도: Daily (매일)
- 시간: 03:00
- 보관: 14개 버전 (2주)

Step 3: 클라우드 저장소 연동 (Google Drive 권장)

Google Drive 설정

Settings 탭 → Google Drive 선택

1. [Authenticate with Google] 클릭
2. Google 계정 로그인
3. UpdraftPlus 권한 허용
4. 인증 코드 복사 → 붙여넣기
5. [Complete setup] 클릭

Remote storage location:
UpdraftPlus/  (자동 생성 폴더)

✅ Save Changes

다른 저장소 옵션

저장소무료 용량장점
Google Drive15GB무료, 빠름, 신뢰성 높음
Dropbox2GB간편, 동기화 빠름
Amazon S312개월 5GB안정적, 유료 저렴
FTP/SFTP무제한*자체 서버 사용

Step 4: 백업 범위 설정

Settings 탭 → Include in files backup

✅ Plugins (플러그인)
✅ Themes (테마)
✅ Uploads (미디어 파일)
✅ wp-content 내 기타 디렉토리
☐ Any other directories (불필요)

Database backup:
✅ All tables (모든 테이블)

Exclude:
- Cache files
- Session files
- Backup files

Step 5: 이메일 알림 설정

Settings 탭 → Email

✅ Send a report by email
Email: [email protected]

알림 조건:
✅ Backup completed successfully
✅ Backup failed

Step 6: 수동 백업 실행 및 테스트

Backup / Restore 탭

1. [Backup Now] 클릭

선택:
✅ Include database
✅ Include files
☐ Send backup to remote storage (테스트는 로컬만)

2. [Backup Now] 실행

3. 완료 확인 (약 1~5분 소요)

4. Existing Backups 섹션에서 백업 파일 확인

Step 7: 복원 테스트 (중요!)

# 복원 연습 (실제 사이트 영향 없음)

1. Backup / Restore 탭
2. Existing Backups에서 백업 선택
3. [Restore] 클릭

선택 항목:
✅ Database
✅ Plugins
✅ Themes
✅ Uploads
✅ Others

4. [Restore] 실행
5. 완료 후 사이트 확인

⚠️ 주의: 복원하면 현재 데이터가 덮어씌워짐!

⚙️ 방법 2: Docker 볼륨 백업 (고급) ⭐⭐⭐⭐

장단점

장점단점
✅ 시스템 레벨 백업❌ 명령어 지식 필요
✅ 플러그인 독립적❌ 수동 설정
✅ 빠른 복원❌ 복원 시 다운타임
✅ 완벽한 복제

워드프레스 Docker 볼륨 구조

# 볼륨 확인
docker volume ls

# 출력 예시:
wordpress-project_wordpress_data  # 워드프레스 파일
wordpress-project_db_data          # MySQL 데이터

백업 스크립트 작성

# 백업 디렉토리 생성
mkdir -p ~/backups/wordpress

# 백업 스크립트 생성
nano ~/backups/docker-backup.sh

스크립트 내용:

#!/bin/bash

# 설정
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=~/backups/wordpress
WP_VOLUME="wordpress-project_wordpress_data"
DB_VOLUME="wordpress-project_db_data"
RETENTION_DAYS=30  # 30일 이상 된 백업 자동 삭제

# 백업 디렉토리 생성
mkdir -p $BACKUP_DIR

echo "=== WordPress Docker Backup Started: $DATE ==="

# 1. 워드프레스 파일 백업
echo "Backing up WordPress files..."
docker run --rm \
  -v $WP_VOLUME:/source:ro \
  -v $BACKUP_DIR:/backup \
  alpine \
  tar czf /backup/wordpress_files_$DATE.tar.gz -C /source .

if [ $? -eq 0 ]; then
  echo "✅ WordPress files backup completed"
else
  echo "❌ WordPress files backup failed"
  exit 1
fi

# 2. MySQL 데이터베이스 백업
echo "Backing up MySQL database..."
docker run --rm \
  -v $DB_VOLUME:/source:ro \
  -v $BACKUP_DIR:/backup \
  alpine \
  tar czf /backup/mysql_data_$DATE.tar.gz -C /source .

if [ $? -eq 0 ]; then
  echo "✅ MySQL database backup completed"
else
  echo "❌ MySQL database backup failed"
  exit 1
fi

# 3. mysqldump로 SQL 백업 (추가 안전장치)
echo "Backing up MySQL dump..."
docker exec wordpress-db mysqldump \
  -u root -pSecureRootPass2025! \
  --all-databases --single-transaction \
  > $BACKUP_DIR/mysql_dump_$DATE.sql

if [ $? -eq 0 ]; then
  echo "✅ MySQL dump completed"
  gzip $BACKUP_DIR/mysql_dump_$DATE.sql
else
  echo "❌ MySQL dump failed"
fi

# 4. 백업 파일 크기 확인
echo ""
echo "=== Backup Files ==="
ls -lh $BACKUP_DIR/*$DATE*

# 5. 오래된 백업 삭제
echo ""
echo "Cleaning up old backups (older than $RETENTION_DAYS days)..."
find $BACKUP_DIR -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

echo ""
echo "=== Backup Completed: $(date) ==="

실행 권한 부여 및 테스트

# 실행 권한
chmod +x ~/backups/docker-backup.sh

# 수동 실행 테스트
~/backups/docker-backup.sh

# 결과 확인
ls -lh ~/backups/wordpress/

Cron으로 자동화

# Crontab 편집
crontab -e

# 추가 (매일 새벽 3시)
0 3 * * * ~/backups/docker-backup.sh >> ~/backups/backup.log 2>&1

# 확인
crontab -l

# 로그 확인
tail -f ~/backups/backup.log

복원 스크립트

# 복원 스크립트 생성
nano ~/backups/docker-restore.sh

스크립트 내용:

#!/bin/bash

# 설정
BACKUP_DIR=~/backups/wordpress
WP_VOLUME="wordpress-project_wordpress_data"
DB_VOLUME="wordpress-project_db_data"

# 백업 파일 선택
echo "Available backups:"
ls -1 $BACKUP_DIR/wordpress_files_*.tar.gz

read -p "Enter backup date (YYYYMMDD_HHMMSS): " BACKUP_DATE

WP_BACKUP="$BACKUP_DIR/wordpress_files_$BACKUP_DATE.tar.gz"
DB_BACKUP="$BACKUP_DIR/mysql_data_$BACKUP_DATE.tar.gz"

# 파일 존재 확인
if [ ! -f "$WP_BACKUP" ]; then
  echo "❌ WordPress backup not found: $WP_BACKUP"
  exit 1
fi

if [ ! -f "$DB_BACKUP" ]; then
  echo "❌ MySQL backup not found: $DB_BACKUP"
  exit 1
fi

# 경고
read -p "⚠️ This will OVERWRITE current data. Continue? (yes/no): " CONFIRM
if [ "$CONFIRM" != "yes" ]; then
  echo "Restore cancelled."
  exit 0
fi

# 컨테이너 중지
echo "Stopping containers..."
cd ~/wordpress-project
docker compose down

# 볼륨 삭제 (선택)
read -p "Delete existing volumes? (yes/no): " DELETE_VOL
if [ "$DELETE_VOL" == "yes" ]; then
  docker volume rm $WP_VOLUME $DB_VOLUME
  docker volume create $WP_VOLUME
  docker volume create $DB_VOLUME
fi

# 워드프레스 파일 복원
echo "Restoring WordPress files..."
docker run --rm \
  -v $WP_VOLUME:/target \
  -v $BACKUP_DIR:/backup \
  alpine \
  sh -c "rm -rf /target/* && tar xzf /backup/wordpress_files_$BACKUP_DATE.tar.gz -C /target"

echo "✅ WordPress files restored"

# MySQL 데이터 복원
echo "Restoring MySQL data..."
docker run --rm \
  -v $DB_VOLUME:/target \
  -v $BACKUP_DIR:/backup \
  alpine \
  sh -c "rm -rf /target/* && tar xzf /backup/mysql_data_$BACKUP_DATE.tar.gz -C /target"

echo "✅ MySQL data restored"

# 컨테이너 재시작
echo "Starting containers..."
docker compose up -d

echo ""
echo "=== Restore Completed ==="
echo "Please check your website!"
# 실행 권한
chmod +x ~/backups/docker-restore.sh

# 복원 실행
~/backups/docker-restore.sh

☁️ 방법 3: Rclone으로 클라우드 동기화 (최고급) ⭐⭐⭐⭐⭐

Rclone이란?

다양한 클라우드 서비스와 동기화 가능한 명령줄 도구

설치

# Ubuntu
sudo apt install rclone -y

# 설정
rclone config

# Google Drive 추가
n (새 remote)
name: gdrive
Storage: drive (Google Drive)
client_id: (Enter - 기본값)
client_secret: (Enter)
scope: drive (Full access)
root_folder_id: (Enter)
service_account_file: (Enter)
y (고급 설정 안 함)
y (자동 설정 사용)
→ 브라우저 열림 → Google 로그인 → 인증
y (확인)
q (종료)

백업 스크립트에 Rclone 추가

# docker-backup.sh 끝에 추가

# 6. Google Drive에 업로드
echo ""
echo "Uploading to Google Drive..."
rclone copy $BACKUP_DIR gdrive:Backups/WordPress \
  --include "*$DATE*" \
  --progress

if [ $? -eq 0 ]; then
  echo "✅ Uploaded to Google Drive"
else
  echo "❌ Google Drive upload failed"
fi

📋 백업 체크리스트

매일 확인

  • ☐ 자동 백업 실행 확인 (로그 또는 이메일)
  • ☐ 백업 파일 생성 확인

주간 확인

  • ☐ 백업 파일 크기 확인 (이상 없는지)
  • ☐ 클라우드 저장소 용량 확인
  • ☐ 오래된 백업 삭제 여부 확인

월간 확인

  • ☐ 복원 테스트 (테스트 환경에서)
  • ☐ 백업 스크립트 동작 검증
  • ☐ 외장 HDD에 추가 백업

🚨 백업 실패 원인 및 해결

문제 1: 디스크 용량 부족

# 디스크 사용량 확인
df -h

# 해결: 오래된 백업 삭제
find ~/backups -mtime +30 -delete

# Docker 정리
docker system prune -a

문제 2: 권한 오류

# 백업 디렉토리 권한 확인
ls -la ~/backups

# 수정
sudo chown -R $USER:$USER ~/backups
chmod -R 755 ~/backups

문제 3: Cron 실행 안 됨

# Cron 로그 확인
grep CRON /var/log/syslog

# 스크립트 경로 절대 경로로 수정
/home/username/backups/docker-backup.sh

# 환경 변수 추가 (crontab)
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

📝 정리하며

이번 글에서 배운 내용:

핵심 요약

  • 3-2-1 백업 규칙: 3개 사본, 2개 매체, 1개 오프사이트
  • 방법 1 (UpdraftPlus): 초보자 추천, 클릭만으로 자동화
  • 방법 2 (Docker 볼륨): 시스템 레벨, 완벽한 복제
  • 방법 3 (Rclone): 클라우드 동기화, 자동화 최고
  • 복원 테스트: 월 1회 필수!

권장 백업 조합

  1. 일상: UpdraftPlus 자동 백업 (매일 DB, 주 1회 파일)
  2. 안전장치: Docker 볼륨 백업 (매일, 로컬)
  3. 재해 대비: Rclone으로 Google Drive 동기화 (주 1회)
  4. 물리 백업: 외장 HDD (월 1회)

다음 단계

다음 글에서는 홈서버 운영 중 발생할 수 있는
자주 발생하는 문제와 해결 방법을 정리한 실전 Q&A를 제공한다:

  • 포트 충돌 해결
  • 내부 IP 변경 대응
  • 컨테이너 재시작 문제
  • 디스크 용량 관리
  • 성능 저하 진단

서버는 결국 ‘지속 가능한 운영’이 핵심이다.
백업은 그 출발점이다. 💾

댓글 남기기

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.