워드프레스 자동 백업과 복구 방법 – 홈서버를 안전하게 지키는 법
홈서버에서 워드프레스를 운영하면서 가장 두려운 순간은
“내 블로그가 날아갔을 때”다.
애써 쌓아올린 콘텐츠, 애드센스 수익, 방문자 데이터까지
순식간에 사라질 수 있는 상황은 서버 운영자라면 누구나 겪을 수 있다.
이번 글에서는 홈서버 환경에서도 간단하게 구현할 수 있는
워드프레스 자동 백업과 복구 방법을 소개한다.
Docker 컨테이너 구조, 워드프레스 백업 플러그인,
볼륨 백업 스크립트까지 실전 위주로 정리했다.
💥 실제 데이터 손실 사례
홈서버 운영자가 겪는 데이터 손실 원인
| 원인 | 발생 확률 | 피해 정도 | 예방 방법 |
|---|---|---|---|
| 정전 | ⭐⭐⭐⭐ | DB 손상 | UPS 또는 자동 백업 |
| 디스크 고장 | ⭐⭐⭐ | 전체 손실 | 클라우드 백업 필수 |
| 플러그인 오류 | ⭐⭐⭐⭐⭐ | 사이트 다운 | 업데이트 전 백업 |
| 해킹 | ⭐⭐ | 데이터 변조 | 보안 + 정기 백업 |
| 실수 (rm -rf) | ⭐⭐⭐ | 복구 불가 | 백업만이 답 |
백업 없이 데이터 손실 시
- ❌ 모든 글/댓글 영구 삭제
- ❌ 테마/플러그인 설정 초기화
- ❌ 애드센스 수익 기록 소멸
- ❌ SEO 순위 하락 (사이트 다운 시간)
- ❌ 방문자 신뢰도 하락
결론: 백업은 선택이 아닌 생존 전략
📊 백업 전략 3단계
3-2-1 백업 규칙
| 3 | 데이터 사본 3개 유지 | 원본 + 백업 2개 |
| 2 | 2가지 다른 매체 | 로컬 + 클라우드 |
| 1 | 1개는 오프사이트 | Google Drive, AWS S3 등 |
홈서버 백업 전략 예시
- 원본: 워드프레스 (실행 중)
- 1차 백업: 로컬 Docker 볼륨 스냅샷 (매일)
- 2차 백업: Google Drive (주 1회)
- 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 Drive | 15GB | 무료, 빠름, 신뢰성 높음 |
| Dropbox | 2GB | 간편, 동기화 빠름 |
| Amazon S3 | 12개월 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회 필수!
권장 백업 조합
- 일상: UpdraftPlus 자동 백업 (매일 DB, 주 1회 파일)
- 안전장치: Docker 볼륨 백업 (매일, 로컬)
- 재해 대비: Rclone으로 Google Drive 동기화 (주 1회)
- 물리 백업: 외장 HDD (월 1회)
다음 단계
다음 글에서는 홈서버 운영 중 발생할 수 있는
자주 발생하는 문제와 해결 방법을 정리한 실전 Q&A를 제공한다:
- 포트 충돌 해결
- 내부 IP 변경 대응
- 컨테이너 재시작 문제
- 디스크 용량 관리
- 성능 저하 진단
서버는 결국 ‘지속 가능한 운영’이 핵심이다.
백업은 그 출발점이다. 💾
댓글 남기기