Files
sam-docs/deploys/ops-manual/10-backup-recovery.md

9.4 KiB

10. 백업, 복구, 재부팅

목차로 돌아가기


[운영] DB 백업

수동 백업

# sam DB
mysqldump -u hskwon --single-transaction --routines --triggers sam | gzip > /tmp/sam_$(date +%Y%m%d_%H%M%S).sql.gz

# sam_stat DB
mysqldump -u hskwon --single-transaction --routines --triggers sam_stat | gzip > /tmp/sam_stat_$(date +%Y%m%d_%H%M%S).sql.gz

# codebridge DB (Sales)
mysqldump -u hskwon --single-transaction --routines --triggers codebridge | gzip > /tmp/codebridge_$(date +%Y%m%d_%H%M%S).sql.gz

# 전체 DB
mysqldump -u hskwon --single-transaction --routines --triggers --all-databases | gzip > /tmp/all_db_$(date +%Y%m%d_%H%M%S).sql.gz

파일 백업 (업로드, Storage)

# API storage
tar czf /tmp/api_storage_$(date +%Y%m%d).tar.gz -C /home/webservice/api/shared storage

# MNG storage
tar czf /tmp/mng_storage_$(date +%Y%m%d).tar.gz -C /home/webservice/mng/shared storage

# Sales uploads
tar czf /tmp/sales_uploads_$(date +%Y%m%d).tar.gz -C /home/webservice/sales uploads

# 외부 전송
scp /tmp/*_$(date +%Y%m%d).tar.gz sam-cicd:/home/hskwon/backups/files/

.env 백업

mkdir -p /tmp/env_backup
cp /home/webservice/api/shared/.env /tmp/env_backup/api.env
cp /home/webservice/mng/shared/.env /tmp/env_backup/mng.env
cp /home/webservice/sales/.env /tmp/env_backup/sales.env

tar czf /tmp/env_backup_$(date +%Y%m%d).tar.gz -C /tmp env_backup
scp /tmp/env_backup_$(date +%Y%m%d).tar.gz sam-cicd:/home/hskwon/backups/env/
rm -rf /tmp/env_backup /tmp/env_backup_*.tar.gz

DB 복구

# 전체 DB 복구
gunzip -c /path/to/sam_백업파일.sql.gz | sudo mysql sam

# 특정 테이블
sudo mysql sam < /path/to/sam_테이블명_백업파일.sql

[CI/CD] Gitea 백업/복구

백업

# 전체 백업 (저장소 + DB + 설정)
sudo mkdir -p /home/hskwon/backups/gitea
sudo -u git /usr/local/bin/gitea dump \
  --config /etc/gitea/app.ini \
  --tempdir /tmp \
  --file /home/hskwon/backups/gitea/gitea-dump-$(date +%Y%m%d).zip

# 저장소만
sudo tar czf /home/hskwon/backups/gitea/repos-$(date +%Y%m%d).tar.gz \
  /var/lib/gitea/data/repositories/

# DB만
mysqldump --single-transaction gitea | gzip > /home/hskwon/backups/gitea/gitea-db-$(date +%Y%m%d).sql.gz

복구

sudo systemctl stop gitea

cd /tmp
unzip /home/hskwon/backups/gitea/gitea-dump-YYYYMMDD.zip

mysql -u root gitea < gitea-db.sql
sudo rsync -av gitea-repo/ /var/lib/gitea/data/repositories/
sudo chown -R git:git /var/lib/gitea/data/repositories/
sudo cp app.ini /etc/gitea/app.ini
sudo chown git:git /etc/gitea/app.ini

sudo systemctl start gitea

[CI/CD] Jenkins 백업/복구

백업

sudo mkdir -p /home/hskwon/backups/jenkins

# Jobs 설정
sudo tar czf /home/hskwon/backups/jenkins/jobs-$(date +%Y%m%d).tar.gz \
  -C /var/lib/jenkins jobs/

# Credentials
sudo tar czf /home/hskwon/backups/jenkins/secrets-$(date +%Y%m%d).tar.gz \
  -C /var/lib/jenkins secrets/ credentials.xml

# 플러그인 목록
sudo ls /var/lib/jenkins/plugins/*.jpi 2>/dev/null | xargs -I{} basename {} .jpi \
  > /home/hskwon/backups/jenkins/plugins-$(date +%Y%m%d).txt

# 환경변수 파일
sudo tar czf /home/hskwon/backups/jenkins/env-files-$(date +%Y%m%d).tar.gz \
  -C /var/lib/jenkins env-files/

# SSH 키
sudo tar czf /home/hskwon/backups/jenkins/ssh-$(date +%Y%m%d).tar.gz \
  -C /var/lib/jenkins .ssh/

복구

sudo systemctl stop jenkins
sudo tar xzf /home/hskwon/backups/jenkins/jobs-YYYYMMDD.tar.gz -C /var/lib/jenkins/
sudo tar xzf /home/hskwon/backups/jenkins/secrets-YYYYMMDD.tar.gz -C /var/lib/jenkins/
sudo tar xzf /home/hskwon/backups/jenkins/env-files-YYYYMMDD.tar.gz -C /var/lib/jenkins/
sudo tar xzf /home/hskwon/backups/jenkins/ssh-YYYYMMDD.tar.gz -C /var/lib/jenkins/
sudo chown -R jenkins:jenkins /var/lib/jenkins/
sudo systemctl start jenkins

[CI/CD] Prometheus / Grafana 백업

# Prometheus 설정 (필수)
sudo cp /etc/prometheus/prometheus.yml /home/hskwon/backups/prometheus-config-$(date +%Y%m%d).yml

# Prometheus 데이터 (선택, 보존 기간 30일)
sudo systemctl stop prometheus
sudo tar czf /home/hskwon/backups/prometheus-data-$(date +%Y%m%d).tar.gz /var/lib/prometheus/
sudo systemctl start prometheus

# Grafana 설정 + 대시보드
sudo mkdir -p /home/hskwon/backups/grafana
sudo cp /etc/grafana/grafana.ini /home/hskwon/backups/grafana/grafana.ini-$(date +%Y%m%d)
sudo tar czf /home/hskwon/backups/grafana/grafana-data-$(date +%Y%m%d).tar.gz /var/lib/grafana/

[CI/CD] MySQL 자동 백업 (운영 DB)

자동 백업: crontab 매일 03:00 실행

  • 스크립트: /home/hskwon/scripts/backup-db.sh
  • 인증 정보: /home/hskwon/.sam_backup.cnf (chmod 600)
  • 저장소: /home/hskwon/backups/mysql/
  • 보존: 14일

백업 대상:

DB 서버 사용자 비고
gitea localhost root (auth_socket) Gitea DB
sam 211.117.60.189 (운영) sam_backup 운영 메인 DB
sam_stat 211.117.60.189 (운영) sam_backup 통계 DB

수동 백업 실행:

# 전체 백업 (Gitea + 운영 DB)
/home/hskwon/scripts/backup-db.sh

전체 서버 복구 절차

[운영] 복구 순서

  1. OS 설치: Ubuntu 24.04 + 기본 패키지
  2. 보안 설정: SSH 키, UFW, fail2ban
  3. MySQL 복구: MySQL 8.4 설치 -> 백업 파일 복원 -> 사용자 재생성
  4. Redis 설치: Redis 7.x + 설정
  5. PHP-FPM 설치: PHP 8.4 + 확장 + Pool 설정 복원
  6. Nginx 설치: Nginx + 사이트 설정 복원 + SSL 재발급
  7. Node.js + PM2 설치: Node.js 22 + PM2
  8. 애플리케이션 배포: 각 서비스 코드 + .env 복원 + storage 복원
  9. Supervisor 설치: Queue Worker 설정
  10. 모니터링: node_exporter 설치

상세: 서버 설치 가이드

[CI/CD] 복구 순서

  1. OS 기본 셋팅 (UFW, 스왑, 타임존)
  2. MySQL 설치 + Gitea DB 복원
  3. Java 설치
  4. Gitea 설치 + 설정/저장소 복원
  5. Jenkins 설치 + jobs/credentials/env-files/SSH 키 복원
  6. Nginx 설치 + 사이트 설정 + SSL 인증서 발급
  7. Prometheus + node_exporter 설치 + 설정 복원
  8. Grafana 설치 + 대시보드 임포트
  9. fail2ban 설치
  10. Webhook 연결 확인
  11. 전체 서비스 동작 검증

상세: 서버 설치 가이드


서버 재부팅 절차

[운영] 재부팅

재부팅 전 점검:

# 서비스 상태 기록
sudo systemctl status nginx php8.4-fpm mysql redis-server supervisor node_exporter
pm2 status

# 대기 중인 Queue 작업 확인
cd /home/webservice/api/current && php artisan queue:monitor redis:default

# 진행 중인 MySQL 쿼리 확인
sudo mysql -e "SHOW PROCESSLIST;" | grep -v Sleep

# PM2 상태 저장
pm2 save

# 리소스 상태 기록
free -h
df -h

재부팅 실행: sudo reboot

재부팅 후 확인 (1~2분 후):

# 시스템 상태
uptime && free -h && df -h

# 서비스 확인
sudo systemctl status nginx php8.4-fpm mysql redis-server supervisor node_exporter certbot.timer fail2ban
pm2 status

# 포트 확인
sudo ss -tlnp

# 웹 서비스 응답
curl -sI https://sam.it.kr
curl -sI https://api.sam.it.kr
curl -sI https://admin.codebridge-x.com
curl -sI https://sales.codebridge-x.com
curl -sI https://stage.sam.it.kr
curl -sI https://stage-api.sam.it.kr

# Redis / MySQL 연결
redis-cli ping
sudo mysql -e "SELECT 1;"

# Queue Worker
sudo supervisorctl status

# 방화벽
sudo ufw status

서비스 자동 시작 실패 시:

sudo systemctl start nginx
sudo systemctl start php8.4-fpm
sudo systemctl start mysql
sudo systemctl start redis-server
sudo systemctl start supervisor
sudo systemctl start node_exporter
sudo systemctl start fail2ban
pm2 resurrect                # 저장된 프로세스 복구
# PM2 복구 실패 시
cd /home/webservice && pm2 start ecosystem.config.js && pm2 save

자동 시작 등록 확인:

sudo systemctl is-enabled nginx php8.4-fpm mysql redis-server supervisor node_exporter fail2ban
# 등록 안 된 서비스: sudo systemctl enable 서비스명
# PM2는 pm2 startup + pm2 save로 관리

[CI/CD] 재부팅

재부팅 전 점검:

# Jenkins 실행 중인 빌드 확인 (웹 UI: https://ci.sam.it.kr)

# Gitea 진행 중인 push 확인
sudo tail -5 /var/lib/gitea/log/gitea.log

# 서비스 상태 기록
sudo systemctl status nginx jenkins gitea mysql prometheus grafana-server node_exporter > /tmp/pre-reboot-status.txt

재부팅 실행: sudo reboot

재부팅 후 검증:

# 서비스 상태
sudo systemctl status nginx jenkins gitea mysql prometheus grafana-server node_exporter

# 포트 확인
sudo ss -tlnp | grep -E '(80|443|3000|3100|8080|9090|9100|3306)'

# 웹 서비스 응답
curl -sI https://ci.sam.it.kr | head -3
curl -sI https://git.sam.it.kr | head -3
curl -sI https://monitor.sam.it.kr | head -3

# 리소스 확인
free -h && df -h

# 모니터링 연결
curl -s http://localhost:9090/api/v1/targets | python3 -c "
import json, sys
data = json.load(sys.stdin)
for t in data['data']['activeTargets']:
    print(f\"{t['labels'].get('job','?'):15} {t['health']:6} {t['scrapeUrl']}\")
"

# MySQL 상태
mysql -e "SHOW GLOBAL STATUS LIKE 'Uptime';"

자동 시작 확인:

for svc in nginx jenkins gitea mysql prometheus grafana-server node_exporter fail2ban; do
  echo -n "$svc: "
  systemctl is-enabled $svc 2>/dev/null || echo "NOT FOUND"
done
# 비활성 서비스: sudo systemctl enable 서비스명