From 3b3e0f4b47b66f39f5c5ba82067c506d05b34189 Mon Sep 17 00:00:00 2001 From: kappa Date: Tue, 17 Mar 2026 08:12:22 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B0=B1=EC=97=85=20=ED=8C=8C=EC=9D=B4?= =?UTF-8?q?=ED=94=84=EB=9D=BC=EC=9D=B8=20=EB=AC=B8=EC=84=9C=ED=99=94,=20et?= =?UTF-8?q?cd-1/relay4wd=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- infra/backup.md | 64 ++++++++++++++++++++++++++++++++++++++++++++ infra/infra-hosts.md | 2 ++ 2 files changed, 66 insertions(+) create mode 100644 infra/backup.md diff --git a/infra/backup.md b/infra/backup.md new file mode 100644 index 0000000..c91921a --- /dev/null +++ b/infra/backup.md @@ -0,0 +1,64 @@ +--- +title: 백업 파이프라인 +updated: 2026-03-17 +tags: [infra, backup] +--- + +## incus 백업 (inbest 데이터) + +3단계 백업 파이프라인. 소스: incus-kr2 inbest 프로젝트 `inbest-data` 커스텀 볼륨. + +### 1. rsync → NAS + +- **호스트**: incus-kr2 +- **스크립트**: `/usr/local/bin/backup-inbest.sh` +- **systemd**: `backup-inbest.timer` / `backup-inbest.service` +- **스케줄**: 매일 03:00 (±5분) +- **소스**: `/var/lib/incus/storage-pools/default/custom/inbest_inbest-data/` +- **대상**: `kaffa@192.168.205.100:/volume1/incus/inbest/` +- **제외**: `*/data/session/` +- **SSH 키**: `/home/kaffa/.ssh/id_ed25519` +- **옵션**: `rsync -rlz --omit-dir-times --delete` (Synology 퍼미션 호환) + +### 2. btrfs 스냅샷 (NAS) + +- rsync 완료 직후 자동 실행 (같은 스크립트) +- **스냅샷 경로**: `/volume1/incus/.snapshots/incus-YYYYMMDD` +- **타입**: 읽기 전용 (`btrfs subvolume snapshot -r`) +- **보관**: 3일 초과 자동 삭제 +- **용도**: 논리적 복구 (실수 삭제/덮어쓰기), NAS 내부에서만 유효 + +### 3. R2 sync (NAS → Cloudflare R2) + +- **호스트**: Synology NAS (192.168.205.100) +- **systemd**: `r2-incus-backup.timer` / `r2-incus-backup.service` +- **스케줄**: 매일 06:00 (±5분) +- **소스**: `/volume1/incus/` +- **대상**: R2 버킷 `incus-backup` (APAC 리전) +- **제외**: `.snapshots/**`, `@eaDir/**` +- **rclone**: Docker (`rclone/rclone:latest`), 설정 `/volume1/docker/rclone/rclone.conf` +- **성능**: transfers 32, checkers 32, 첫 전체 업로드(7.97GB) 약 12분 +- **TimeoutStartSec**: 3600 (1시간) + +### NAS 설정 메모 + +- Synology sudo PATH 문제: `/etc/sudoers.d/path`에 `secure_path` 추가 (2026-03-17) +- NAS `/volume1/incus/inbest/` 소유자: `kaffa:users` (rsync 쓰기용) +- btrfs subvolume: `/volume1/incus` (ID 741) + +### 복구 시나리오 + +| 상황 | 복구 방법 | +|------|----------| +| 파일 실수 삭제/덮어쓰기 | NAS btrfs 스냅샷에서 복원 | +| NAS 장애 | R2에서 rclone copy로 복원 | +| kr2 장애 | NAS rsync 미러에서 복원 | + +## k3s 백업 (기존) + +- **호스트**: Synology NAS +- **systemd**: `r2-backup.timer` / `r2-backup.service` +- **스케줄**: 매일 05:00 (±5분) +- **소스**: `/volume1/k3s-backup/` +- **대상**: R2 버킷 `k3s-backup` (ENAM 리전) +- **rclone**: Docker, transfers 4, checkers 8 diff --git a/infra/infra-hosts.md b/infra/infra-hosts.md index 487ae15..cc40700 100644 --- a/infra/infra-hosts.md +++ b/infra/infra-hosts.md @@ -31,9 +31,11 @@ tags: [infra, network, kr-zone, openwrt] | Anvil, Ironclad | K8s 클러스터 (kr1) | kubectl | | Prometheus, Grafana | jp1 (monitoring) | incus exec --project monitoring | | DB 서버 | jp1 (db) | incus exec --project db | +| etcd (relay4wd용) | jp1 (db), etcd-1 (10.253.102.11) | etcd 2379 | | [[vault]] | 인프라 내부 | vault CLI / MCP | | [[gitea]] | 자체 호스팅 (gitea.anvil.it.com) | git push → Gitea Act Runner | | BunnyCDN | 외부 SaaS | BunnyCDN MCP 서버 / API | +| [[backup]] | kr2 → NAS → R2 | systemd timer, rclone | ## Incus 프로젝트