diff --git a/infra/k3s-backup.md b/infra/k3s-backup.md new file mode 100644 index 0000000..14879fd --- /dev/null +++ b/infra/k3s-backup.md @@ -0,0 +1,75 @@ +--- +title: K3s 백업 파이프라인 +updated: 2026-03-16 +tags: [infra, backup, k3s, r2, synology] +--- + +## 아키텍처 + +``` +K3s PVC → NFS → Synology NAS (/volume1/k3s-backup/) → Cloudflare R2 (k3s-backup) +``` + +## K3s → NAS (NFS) + +### NFS PV/PVC + +| 네임스페이스 | PVC 이름 | NFS 경로 | 비고 | +|-------------|----------|----------|------| +| gitea | gitea-backup-nfs | /volume1/k3s-backup/gitea | gitea dump | + +- NFS 서버: 192.168.9.100 (Synology NAS) +- PV reclaim policy: Retain + +### CronJob + +| 네임스페이스 | CronJob | 스케줄 | 내용 | +|-------------|---------|--------|------| +| gitea | gitea-backup | 0 3 * * * (UTC) | gitea dump → NFS | + +## NAS → R2 (Synology systemd timer) + +### Synology 구성 + +- **rclone 설정**: `/volume1/docker/rclone/rclone.conf` +- **rclone 실행**: Docker 컨테이너 (`rclone/rclone:latest`) +- **systemd service**: `r2-backup.service` +- **systemd timer**: `r2-backup.timer` — 매일 05:00 KST (±5분 jitter) + +### R2 버킷 + +- 버킷명: `k3s-backup` +- 엔드포인트: `https://d8e5997eb4040f8b489f09095c0f623c.r2.cloudflarestorage.com` +- 크레덴셜: [[vault]] `secret/cloud/cloudflare/r2` + +### 관리 명령 (Synology SSH) + +```bash +# 수동 sync +sudo systemctl start r2-backup.service + +# 상태 확인 +sudo systemctl status r2-backup.timer +sudo systemctl list-timers r2-backup.timer + +# 로그 +sudo journalctl -u r2-backup.service + +# R2 내용 확인 +sudo /usr/local/bin/docker run --rm \ + -v /volume1/docker/rclone:/config:ro \ + rclone/rclone:latest \ + --config /config/rclone.conf \ + ls r2:k3s-backup/ +``` + +## 보존 정책 + +- NAS: 수동 관리 (디스크 여유에 따라) +- R2: lifecycle rule 설정 필요 (Cloudflare 대시보드에서 30일 만료 설정) + +## TODO + +- [ ] R2 lifecycle rule 설정 (대시보드에서 30일 만료) +- [ ] vault, openmemory, anvil, ironclad 등 추가 서비스 NFS 백업 CronJob 구성 +- [ ] postgres 백업 CronJob NFS 경로 `/volume1/k3s-backup/postgres`로 변경