# Sbackup [![Python](https://img.shields.io/badge/Python-3.10+-3776AB?logo=python&logoColor=white)](https://www.python.org/) [![License](https://img.shields.io/badge/License-GPL--3.0-green)](../../LICENSE) [![PyPI](https://img.shields.io/pypi/v/sbackup-cli?color=blue)](https://pypi.org/project/sbackup-cli/) [![Tests](https://img.shields.io/badge/tests-940%20passed-brightgreen)](../../.github/workflows/ci.yml) [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey)]() > 가볍고 효율적인 폴더 백업 도구로, CLI를 통해 백업 전략을 손쉽게 관리할 수 있습니다. [English](../../README.md) | [Deutsch](README_de.md) | [Espanol](README_es.md) | [Francais](README_fr.md) | [Portugues](README_pt.md) | [Pycckuu](README_ru.md) | [日本語](README_ja.md) | [한국어](README_ko.md) | [中文](README_zh.md) - [소개](#소개) - [주요 기능](#주요-기능) - [빠른 시작](#빠른-시작) - [설치](#설치) - [사용 방법](#사용-방법) - [설정 파일](#설정-파일) - [설정 예시](#설정-예시) - [SFTP 원격 백업](#sftp-원격-백업) - [WebDAV 원격 백업](#webdav-원격-백업) - [구현 원리](#구현-원리) - [개발 가이드](#개발-가이드) - [테스트 실행](#테스트-실행) - [코드 구조](#코드-구조) - [자주 묻는 질문](#자주-묻는-질문) - [기여 가이드](#기여-가이드) - [라이선스](#라이선스) - [저자](#저자) --- ## 소개 Sbackup는 CLI를 통해 백업 전략을 추가, 삭제, 조회할 수 있는 가벼운 폴더 백업 도구입니다. 폴더의 최종 수정 시간을 기준으로 백업이 필요한지 판단하여 데이터를 항상 최신 상태로 유지합니다. ## 주요 기능 - **증분 백업**: 변경된 폴더만 백업하여 시간과 저장 공간을 절약 - **다중 포맷 지원**: ZIP, tar, tar.gz, tar.bz2, tar.xz, tar.zst, 7z 등 7가지 압축 포맷을 전략별 및 전역 수준에서 독립 지정 가능 - **SFTP 원격 백업**: paramiko 기반, 비밀번호/SSH 개인키 인증 및 기본 개인키 자동 감지 지원 - **WebDAV 원격 백업**: 표준 라이브러리 urllib 기반, 추가 의존성 없이 견과云/NextCloud/시놀로지 지원 - **S3 클라우드 저장소**: minio 기반, 모든 S3 호환 저장소(AWS/MinIO/Alibaba Cloud OSS 등) 지원 - **다중 대상 병렬 백업**: 로컬 + 여러 원격 대상에 동시에 백업, 상호 간섭 없음 - **백업 복원**: 백업 파일에서 지정 디렉토리로 압축 해제 및 복원, 선택적 복원 지원 - **백업 정리**: 오래된 백업 자동 삭제, 수량/시간/일별 보존 전략 지원 - **암호화 백업**: 7z 포맷 비밀번호 암호화 + 전체 포맷 PBKDF2 암호화 - **예약 백업**: 간격 기반 자동 실행, 실시간 파일 감시(watchdog) 지원 - **백업 이력**: 각 백업의 시간, 크기, SHA256 체크섬 기록으로 추적 용이 - **감사 로그**: 모든 백업/복원 작업의 감사 이벤트 기록 - **Pre/Post Hook**: 백업 전후 사용자 정의 명령 실행 - **설정 Profile**: 다중 설정 프로필의 저장, 전환, 가져오기/내보내기 지원 - **크로스 아카이브 검색**: 여러 백업 파일에서 일치하는 파일명 검색 - **데이터 무결성**: SHA256 체크섬 생성 및 검증, Reed-Solomon 오류 정정 코드 - **설정 검증**: 설정 매개변수 유효성 자동 검증, 변조 감지 - **작업 큐**: 백업 작업 큐 관리, 추가/실행/취소 지원 - **압축 벤치마크**: 다양한 포맷/레벨의 압축 성능 비교 - **디스크 공간 예측**: 파일 유형별 백업 크기 추정, 대상 공간 확인 - **국제화**: 한국어, 영어, 중국어, 프랑스어, 스페인어, 러시아어, 독일어, 일본어, 포르투갈어 9개 언어 지원 - **Shell 자동 완성**: bash/zsh/fish/powershell 자동 완성 지원 - **가볍고 효율적**: 작은 용량, 빠른 시작 속도, 낮은 리소스 사용량 - **크로스 플랫폼 지원**: Windows, macOS, Linux 지원 ## 빠른 시작 ### 설치 #### pip으로 설치 ```bash pip install sbackup-cli ``` 설치 후 `sbackup` 명령을 사용합니다 (PyPI 패키지명: `sbackup-cli`, CLI 명령: `sbackup`). #### 소스에서 설치 ```bash git clone https://github.com/xiatianxuan/sbackup.git cd sbackup uv sync ``` ### 사용 방법 #### 기본 구문 ```bash uv run python main.py [options] ``` #### 사용 가능한 명령 | 명령 | 설명 | |------|------| | `add` | 백업 전략 추가 | | `rm` / `remove` | 백업 전략 삭제 | | `edit` | 기존 백업 전략 편집 | | `all` | 모든 백업 전략 조회 | | `save` | 백업 실행 | | `watch` | 예약 백업 실행 | | `restore` | 백업 파일에서 복원 | | `info` | 백업 파일 상세 정보 조회 | | `diff` | 원본 디렉토리와 백업 간 차이 비교 | | `verify` | 백업 파일 무결성 검증 | | `search` | 백업 내 파일 검색 | | `xsearch` | 여러 백업 아카이브에서 검색 | | `versions` | 백업 버전 이력 조회 | | `sftp` | SFTP 원격 백업 관리 | | `webdav` | WebDAV 원격 백업 관리 | | `remote` | 원격 파일 관리 (list/rm) | | `task` | 백업 작업 큐 관리 | | `audit` | 감사 로그 조회 | | `hooks` | Pre/Post Hook 수동 실행 | | `profile` | 설정 Profile 관리 | | `rotate` | 백업 로테이션 정리 | | `clean` | 오래된 백업 정리 | | `diskcheck` | 디스크 공간 예측 | | `benchmark` | 압축 포맷 벤치마크 | | `integrity` | 백업 디렉토리 무결성 검증 | | `dry-run` | 백업 파일 선택 미리보기 | | `export` / `import` | 백업 전략 내보내기/가져오기 | | `ignore` | .sbackupignore 파일 생성 | | `schedule` | 예약 스케줄 설정 내보내기 | | `webhook` | Webhook 프리셋 설정 | | `config` | 암호화/검증 설정 | | `report` | 백업 보고서 생성 | | `completion` | Shell 자동 완성 스크립트 생성 | | `wizard` | 대화형 설정 마법사 | | `status` | 백업 상태 대시보드 | | `version` | 버전 정보 조회 | | `help` | 도움말 조회 | #### 전역 매개변수 | 매개변수 | 설명 | |----------|------| | `--lang zh_CN` / `en_US` / `fr_FR` / `es_ES` / `ru_RU` / `de_DE` / `ja_JP` / `pt_BR` / `ko_KR` | 인터페이스 언어 설정 (config.json에 영구 저장) | | `--format zip` / `tar` / `tar.gz` / `tar.bz2` / `tar.xz` / `tar.zst` / `7z` | 압축 포맷 설정 (config.json에 영구 저장) | | `--debug` | 디버그 로그 활성화 | #### 백업 전략 추가 ```bash uv run python main.py add [-i ignore_patterns] ``` 매개변수 설명: - **source**: 백업할 원본 폴더 경로 - **dest**: 백업 파일 저장 대상 경로 - **-i, --ignore**: 무시할 파일 또는 폴더 이름, 쉼표로 구분 (기본값: `.git,__pycache__`) - **--format**: 항목별 압축 포맷 (해당 백업 전략에만 적용, 미지정 시 전역 기본값 사용): `zip` / `tar` / `tar.gz` / `tar.bz2` / `tar.xz` / `tar.zst` / `7z` 예시: ```bash # 전역 기본 포맷으로 전략 추가 uv run python main.py add F:/my_folder F:/backup -i node_modules,.git # 해당 전략에 tar.gz 포맷 지정 (이 폴더 백업 시 항상 tar.gz 사용) uv run python main.py add F:/my_folder F:/backup --format tar.gz # 7z 포맷 지정 (해당 폴더만) uv run python main.py add F:/my_folder F:/backup --format 7z ``` #### 백업 전략 삭제 ```bash uv run python main.py rm ``` 매개변수 설명: - **path**: 백업 전략을 삭제할 원본 폴더 경로 예시: ```bash uv run python main.py rm F:/my_folder ``` #### 모든 백업 전략 조회 ```bash uv run python main.py all ``` 현재 설정된 모든 백업 전략을 표시합니다. #### 백업 실행 ```bash # 기본 포맷(ZIP) 사용 uv run python main.py save # tar.gz 포맷 사용 uv run python main.py --format tar.gz save # 최근 5개 백업 파일 유지, 오래된 파일 자동 정리 uv run python main.py save --keep 5 # 7z 포맷으로 암호화 uv run python main.py --format 7z save --password mysecret # 영어 인터페이스 + tar.xz 포맷 uv run python main.py --lang en_US --format tar.xz save ``` **save 명령 매개변수:** | 매개변수 | 기본값 | 설명 | |----------|--------|------| | `--keep N` | `0` | 최근 N개 백업 파일 유지, 0이면 정리 안 함 | | `--password PASSWORD` | `""` | 암호화 비밀번호 (7z 포맷만 지원) | | `--sftp` | `false` | 백업 완료 후 SFTP 서버에 업로드 | | `--webdav` | `false` | 백업 완료 후 WebDAV 서버에 업로드 | 백업 전략에 따라 변경된 폴더를 자동 백업합니다. #### 예약 백업 ```bash # 60분마다 백업 실행 uv run python main.py watch --interval 60 # 2시간마다 백업, 최근 10개 파일 유지 uv run python main.py watch --interval 120 --keep 10 # 예약 백업 + 7z 암호화 uv run python main.py --format 7z watch --interval 60 --password mysecret ``` **watch 명령 매개변수:** | 매개변수 | 기본값 | 설명 | |----------|--------|------| | `--interval MINUTES` | `60` | 백업 간격 (분) | | `--keep N` | `0` | 최근 N개 백업 파일 유지 | | `--password PASSWORD` | `""` | 암호화 비밀번호 (7z 포맷만 지원) | | `--sftp` | `false` | 매 백업 후 SFTP 서버에 업로드 | | `--webdav` | `false` | 매 백업 후 WebDAV 서버에 업로드 | `Ctrl+C`를 눌러 예약 백업을 중지합니다. #### 백업 복원 ```bash uv run python main.py restore ``` 매개변수 설명: - **backup_file**: 백업 파일 경로 (.zip / .tar / .tar.gz / .tar.bz2 / .tar.xz / .tar.zst / .7z 지원) - **target_dir**: 복원 대상 디렉토리 예시: ```bash uv run python main.py restore F:/backup/my_folder.tar.gz F:/restored uv run python main.py restore F:/backup/my_folder.7z F:/restored uv run python main.py restore F:/backup/my_folder.tar.zst F:/restored ``` #### SFTP 원격 백업 ```bash # ============ 빠른 시작 (권장) ============ # 1. SFTP 설정 (SSH 개인키 자동 감지, 수동 지정 불필요) sbackup sftp config --host 192.168.1.100 --user admin --remote-path /backups # 2. 연결 테스트 sbackup sftp test # 3. 백업 실행 및 업로드 sbackup save --sftp # ============ 인증 방식 ============ # 방식 1: 개인키 자동 감지 (권장) # 시스템이 자동으로 ~/.ssh/id_ed25519 -> id_rsa -> id_ecdsa 순서로 시도 sbackup sftp config --host 192.168.1.100 --user admin # 방식 2: 비밀번호 인증 sbackup sftp config --host 192.168.1.100 --user admin --password secret # 방식 3: 개인키 지정 sbackup sftp config --host 192.168.1.100 --user admin --key-file ~/.ssh/id_rsa # 방식 4: 개인키 + 패스프레이즈 (대화형 입력) sbackup sftp config --host 192.168.1.100 --user admin --key-file ~/.ssh/id_rsa # 방식 5: 개인키 + 패스프레이즈 (명령줄 지정) sbackup sftp config --host 192.168.1.100 --user admin --key-file ~/.ssh/id_rsa --key-passphrase mykeypass # ============ 사용 시나리오 ============ # 시나리오 1: 일회성 백업 및 업로드 sbackup save --sftp # 시나리오 2: 예약 백업 및 자동 업로드 (60분마다) sbackup watch --interval 60 --sftp # 시나리오 3: 특정 포맷 백업 + 업로드 sbackup --format tar.gz save --sftp # 시나리오 4: 암호화 백업 + 업로드 sbackup --format 7z save --password mysecret --sftp # 시나리오 5: 최근 5개 백업 유지 + 업로드 sbackup save --keep 5 --sftp # ============ 고급 사용법 ============ # 대화형 설정 (단계별로 모든 매개변수 입력) sbackup sftp config # 비대화형 설정 (모든 매개변수를 명령줄에서 지정) sbackup sftp config --host 192.168.1.100 --port 22 --user admin --password secret --remote-path /backups # 연결 테스트 및 상세 로그 확인 sbackup --debug sftp test ``` **sftp 하위 명령:** | 하위 명령 | 설명 | 예시 | |-----------|------|------| | `sftp config` | SFTP 연결 매개변수 설정 (host/port/user/password/key_file/key_passphrase/remote_path) | `sbackup sftp config --host 192.168.1.100 --user admin` | | `sftp test` | SFTP 연결 가능 여부 테스트 | `sbackup sftp test` | **인증 방식:** | 방식 | 매개변수 | 설명 | 예시 | |------|----------|------|------| | **자동 감지** | 인증 매개변수 미지정 | `~/.ssh/id_ed25519` -> `id_rsa` -> `id_ecdsa` 순서로 자동 시도 (권장) | `sbackup sftp config --host ... --user ...` | | 비밀번호 인증 | `--password` | 비밀번호로 직접 로그인 | `sbackup sftp config --host ... --user ... --password secret` | | 개인키 인증 | `--key-file` | 지정된 SSH 개인키로 로그인 | `sbackup sftp config --host ... --user ... --key-file ~/.ssh/id_rsa` | | 개인키+패스프레이즈 | `--key-file` + `--key-passphrase` | 개인키에 패스프레이즈가 있는 경우 사용 | `sbackup sftp config --host ... --user ... --key-file ~/.ssh/id_rsa --key-passphrase mypass` | 지원되는 개인키 형식: RSA, Ed25519, ECDSA. **크로스 플랫폼 경로 지원:** | 플랫폼 | 개인키 경로 예시 | 설명 | |--------|-----------------|------| | Linux/macOS | `~/.ssh/id_rsa` | `/home/user/.ssh/id_rsa`로 자동 확장 | | Windows | `~/.ssh/id_rsa` | `C:\Users\username\.ssh\id_rsa`로 자동 확장 | | 전 플랫폼 | 절대 경로 | 전체 경로를 직접 사용 | SFTP 설정은 `config.json`의 `sftp` 필드에 저장되며, 명령줄 매개변수 또는 대화형 입력으로 설정할 수 있습니다. #### 버전 정보 조회 ```bash sbackup version ``` ## 설정 파일 Sbackup는 `config.json` 파일을 통해 사용자 정의 설정을 지원합니다. 설정 파일은 프로젝트 루트 디렉토리에 배치해야 합니다. ### 설정 항목 설명 ```json { "compression_format": "ZIP", "compression": { "algorithm": "ZIP_DEFLATED", "level": 6 }, "skip_patterns": [".git", "__pycache__"], "data_file": "sbackup.json", "lang": "zh_CN", "password": "", "sftp": { "host": "", "port": 22, "user": "", "password": "", "key_file": "", "key_passphrase": "", "remote_path": "/", "enabled": false } } ``` | 설정 항목 | 타입 | 기본값 | 설명 | |-----------|------|--------|------| | `compression_format` | string | `"ZIP"` | 압축 포맷, 가능한 값: `ZIP`, `TAR`, `TAR_GZ`, `TAR_BZ2`, `TAR_XZ`, `TAR_ZST`, `7Z` | | `compression.algorithm` | string | `"ZIP_DEFLATED"` | ZIP 압축 알고리즘, 가능한 값: `ZIP_DEFLATED`, `ZIP_STORED`, `ZIP_BZIP2`, `ZIP_LZMA` | | `compression.level` | int | `6` | 압축 레벨, 범위 0-9 (0: 압축 없음, 9: 최대 압축) | | `skip_patterns` | list | `[".git", "__pycache__"]` | 무시할 파일 또는 폴더 패턴 (fnmatch 와일드카드 및 경로 매칭 지원) | | `data_file` | string | 플랫폼 기본 경로 | 백업 전략 데이터 파일 저장 경로 | | `lang` | string | `"zh_CN"` | 인터페이스 언어, 가능한 값: `zh_CN`, `en_US`, `fr_FR`, `es_ES`, `ru_RU`, `de_DE`, `ja_JP`, `pt_BR`, `ko_KR` | | `password` | string | `""` | 7z 암호화 비밀번호 | | `sftp.host` | string | `""` | SFTP 서버 주소 | | `sftp.port` | int | `22` | SFTP 포트 | | `sftp.user` | string | `""` | SFTP 사용자 이름 | | `sftp.password` | string | `""` | SFTP 비밀번호 (비밀번호 인증 시 사용) | | `sftp.key_file` | string | `""` | SSH 개인키 파일 경로 (개인키 인증 시 사용, 권장) | | `sftp.key_passphrase` | string | `""` | 개인키 패스프레이즈 (있는 경우) | | `sftp.remote_path` | string | `"/"` | 원격 대상 경로 | | `sftp.enabled` | bool | `false` | SFTP 활성화 여부 | ### 설정 예시 tar.bz2 포맷으로 고압축률 백업: ```json { "compression_format": "TAR_BZ2", "compression_level": 9, "skip_patterns": [".git", "__pycache__", "node_modules", "*.log"], "data_file": "backup_strategies.json", "lang": "zh_CN" } ``` ### 압축 포맷 비교 | 포맷 | 확장자 | 압축률 | 속도 | 의존성 | 적합한 시나리오 | |------|--------|--------|------|--------|----------------| | ZIP | .zip | 중간 | 빠름 | 표준 라이브러리 | 범용, Windows 호환성 최고 | | tar | .tar | 없음 | 매우 빠름 | 표준 라이브러리 | 순수 아카이브, 외부 압축과 결합 | | tar.gz | .tar.gz | 중간 | 빠름 | 표준 라이브러리 | Linux/macOS 범용 | | tar.bz2 | .tar.bz2 | 높음 | 중간 | 표준 라이브러리 | 고압축률 아카이브 | | tar.xz | .tar.xz | 최고 | 느림 | 표준 라이브러리 | 장기 아카이브, 공간 민감 | | tar.zst | .tar.zst | 중상 | 매우 빠름 | zstandard | 현대 시나리오, 속도와 압축률 균형 | | 7z | .7z | 매우 높음 | 느림 | py7zr | 최대 압축률, 암호화 지원 | #### WebDAV 원격 백업 WebDAV는 HTTP 기반 파일 프로토콜로, 견과云, NextCloud, 시놀로지 등 주요 클라우드 스토리지를 지원합니다. Python 표준 라이브러리 `urllib`을 사용하여 **추가 의존성이 없습니다**. ```bash # ============ 빠른 시작 ============ # 1. WebDAV 설정 sbackup webdav config --url https://dav.jianguoyun.com/dav/ --user user@example.com --password secret # 2. 연결 테스트 sbackup webdav test # 3. 백업 실행 및 업로드 sbackup save --webdav # ============ 사용 시나리오 ============ # 시나리오 1: 일회성 백업 및 업로드 sbackup save --webdav # 시나리오 2: 예약 백업 및 자동 업로드 (60분마다) sbackup watch --interval 60 --webdav # 시나리오 3: 원격 하위 디렉토리 지정 sbackup webdav config --url https://dav.jianguoyun.com/dav/ --user user@example.com --remote-path /backups/sbackup # 시나리오 4: SFTP와 WebDAV에 동시 업로드 sbackup save --sftp --webdav # ============ 일반 WebDAV 서비스 주소 ============ # 견과云: https://dav.jianguoyun.com/dav/ # NextCloud: https://your-server/remote.php/dav/files/username/ # 시놀로지: https://your-synology:5006/webdav/ ``` **webdav 하위 명령:** | 하위 명령 | 설명 | 예시 | |-----------|------|------| | `webdav config` | WebDAV 연결 매개변수 설정 (url/user/password/remote_path) | `sbackup webdav config --url ... --user ...` | | `webdav test` | WebDAV 연결 가능 여부 테스트 | `sbackup webdav test` | | 매개변수 | 기본값 | 설명 | |----------|--------|------| | `--url URL` | `""` | WebDAV 서버 주소 (예: `https://dav.jianguoyun.com/dav/`) | | `--user USER` | `""` | WebDAV 사용자 이름 (일반적으로 이메일) | | `--password PASS` | `""` | WebDAV 비밀번호 (견과云은 설정에서 앱 비밀번호를 생성해야 함) | | `--remote-path PATH` | `/` | 원격 대상 경로 | ## 구현 원리 Sbackup는 다음과 같은 방식으로 백업 기능을 구현합니다: 1. **백업 전략 저장**: 백업 전략은 JSON 파일에 저장되며, 폴더 경로, 최종 수정 시간, 대상 경로, 무시 패턴, 항목별 압축 포맷을 포함합니다. 2. **증분 백업**: 폴더의 최종 수정 시간을 비교하여 변경된 폴더만 백업합니다. 3. **다중 포맷 압축**: Python 내장 `zipfile` 및 `tarfile` 모듈과 `zstandard`, `py7zr` 서드파티 라이브러리를 사용하여 7가지 압축 포맷을 지원합니다. 4. **항목별 포맷**: 각 백업 전략은 독립적인 압축 포맷을 지정할 수 있습니다 (`add --format`). 전역 `--format` 설정보다 우선하며, 미지정 시 전역 기본값을 사용합니다. 5. **백업 정리**: 백업 성공 후 대상 디렉토리를 자동 스캔하여 수정 시간순으로 정렬하고, 보존 수량을 초과하는 오래된 파일을 삭제합니다. 6. **암호화 백업**: 7z 포맷은 LZMA2 암호화를 지원하며, `--password` 매개변수 또는 `config.json` 설정을 통해 구성합니다. 7. **예약 백업**: `watch` 명령은 지정된 간격으로 루프에서 백업을 실행하며, `Ctrl+C`로 안전하게 종료합니다. 8. **백업 이력**: 매 백업 후 타임스탬프, 파일 크기, 파일 수를 기록하며, 최근 100개 기록을 유지합니다. 9. **SFTP 원격 백업**: paramiko 라이브러리 기반 SFTP 클라이언트를 구현하며, 연결 테스트, 원격 디렉토리 자동 생성, 진행 표시줄이 포함된 파일 업로드를 지원합니다. ### 데이터 파일 형식 ```json { "/path/to/source/folder": [ 1719235200.0, "/path/to/target/folder", [".git", "__pycache__"], "" ], "/path/to/another/folder": [ 1719235200.0, "/path/to/another/target", [".git"], "TAR_GZ" ], "_history": [ { "time": "2026-05-01T12:00:00", "source": "/path/to/source/folder", "size_mb": 12.5, "files_count": 150 } ] } ``` 각 백업 전략 항목은 4요소 리스트입니다: `[mtime, target, skip_patterns, compression_format]` | 필드 | 설명 | |------|------| | `mtime` | 원본 폴더의 최종 수정 시간 (증분 백업 판단에 사용) | | `target` | 백업 파일 저장 대상 경로 | | `skip_patterns` | 무시할 파일/폴더 패턴 목록 | | `compression_format` | 항목별 압축 포맷 (빈 문자열이면 전역 기본값 사용) | ## 개발 가이드 ### 테스트 실행 ```bash uv run coverage run -m unittest discover -s tests -t . && uv run coverage report -m ``` ### 코드 구조 ``` sbackup/ ├── main.py # 프로그램 진입점 ├── sbackup/ │ ├── __init__.py # 핵심 함수 내보내기 │ ├── __main__.py # python -m sbackup 진입점 │ ├── cli.py # CLI 매개변수 파싱 및 명령 분배 (30+ 명령) │ ├── config.py # 설정 로드, 암호화, Webhook/SMTP 설정 │ ├── auto_save.py # BackupManager 핵심 엔진 │ ├── compression.py # 7가지 포맷 압축/해제 엔진 │ ├── i18n.py # 국제화 (9개 언어) │ ├── sftp.py # SFTP 원격 백업 클라이언트 (paramiko) │ ├── webdav.py # WebDAV 원격 백업 클라이언트 (무의존성) │ ├── cloud_storage.py # S3 클라우드 저장소 클라이언트 (minio) │ ├── multi_dest.py # 다중 대상 병렬 백업 │ ├── handlers.py # SFTP/WebDAV/Remote/Schedule 명령 처리 │ ├── hooks.py # Pre/Post Hook 실행 │ ├── audit.py # 감사 로그 시스템 │ ├── profile.py # 설정 Profile 관리 │ ├── selective.py # 선택적 복원 │ ├── cross_search.py # 크로스 아카이브 검색 │ ├── integrity.py # SHA256 체크섬 │ ├── rotation.py # 백업 로테이션 전략 │ ├── dryrun.py # Dry-run 미리보기 │ ├── diskcheck.py # 디스크 공간 예측 │ ├── task_queue.py # 작업 큐 시스템 │ ├── schema.py # 설정 검증기 │ ├── benchmark.py # 압축 벤치마크 │ ├── chunked_backup.py# 블록 단위 증분 백업 │ ├── dedup.py # 파일 단위 SHA256 중복 제거 │ ├── export.py # 메타데이터 내보내기 (CSV/JSON) │ ├── monitor.py # watchdog 파일 시스템 감시 │ ├── lock.py # 크로스 플랫폼 프로세스 잠금 │ ├── retry.py # 지수 백오프 재시도 │ ├── ratelimiter.py # 토큰 버킷 속도 제한기 │ ├── keychain.py # 시스템 키체인 통합 │ ├── parity.py # Reed-Solomon 오류 정정 코드 │ ├── completion.py # Shell 자동 완성 │ ├── wizard.py # 대화형 설정 마법사 │ └── locales/ # 9개 언어 번역 파일 └── tests/ └── sbackup/ └── test_*.py # 30개 테스트 파일, 모든 모듈 커버 ``` ### 새 기능 추가 1. `sbackup/` 디렉토리에 새 모듈 파일을 생성합니다 2. `sbackup/__init__.py`에 새 기능의 함수를 임포트합니다 3. `run()` 함수에 새로운 CLI 명령 처리 로직을 추가합니다 4. `tests/` 디렉토리에 대응하는 테스트 파일을 추가합니다 ## 자주 묻는 질문 ### Q: 백업 전략 파일을 실수로 삭제하면 어떻게 하나요? A: 백업 전략은 데이터 파일에 저장됩니다. 실수로 삭제한 경우 `add` 명령을 다시 실행하여 백업 전략을 다시 추가할 수 있습니다. ### Q: 이미 추가한 백업 전략을 어떻게 수정하나요? A: `sbackup edit` 명령을 사용합니다: `sbackup edit --dest --ignore --format `. ### Q: 원격 백업을 지원하나요? A: 지원합니다! 세 가지 원격 백업 방식을 제공합니다: - **SFTP**: `sbackup sftp config`로 설정, `sbackup save --sftp`로 업로드 - **WebDAV**: `sbackup webdav config`로 설정, `sbackup save --webdav`로 업로드 (견과云/NextCloud/시놀로지 지원) - **S3 클라우드 저장소**: `config.json`에서 `cloud` 필드 설정, `sbackup save --cloud`로 업로드 - 동시에 여러 방식 사용 가능: `sbackup save --sftp --webdav --cloud` ### Q: tar.gz와 ZIP의 차이는 무엇인가요? A: tar.gz는 Linux/macOS에서 더 일반적이며 압축률이 약간 높습니다. ZIP은 Windows에서 더 범용적이며 호환성이 가장 좋습니다. tar.bz2와 tar.xz는 더 높은 압축률을 제공하지만 속도가 느립니다. tar.zst는 현대 알고리즘으로 속도가 매우 빠르면서 압축률도 양호합니다. 7z는 압축률이 가장 높고 암호화를 지원합니다. ### Q: 백업을 어떻게 암호화하나요? A: 7z 포맷을 사용하고 비밀번호를 설정합니다: `uv run python main.py --format 7z save --password yourpassword`. 비밀번호를 `config.json`의 `password` 필드에 작성할 수도 있습니다. ### Q: 오래된 백업을 어떻게 자동 정리하나요? A: `--keep` 매개변수를 사용합니다: `uv run python main.py save --keep 5`로 최근 5개 백업 파일만 유지합니다. 예약 백업 시에도同样 지원합니다: `uv run python main.py watch --interval 60 --keep 10`. ### Q: 예약 백업을 어떻게 설정하나요? A: `watch` 명령을 사용합니다: `uv run python main.py watch --interval 60`으로 60분마다 백업합니다. `Ctrl+C`로 중지합니다. ### Q: 비밀번호 저장이 안전한가요? A: `config.json`에 저장된 SFTP 비밀번호와 7z 암호화 비밀번호는 **평문**으로 저장됩니다. `config.json` 파일의 접근 권한을 신뢰할 수 있는 사용자로만 제한하세요 (예: `chmod 600 config.json`). 비밀번호가 포함된 `config.json`을 버전控制系统에 커밋하지 마세요. ## 기여 가이드 Issue와 Pull Request를 환영합니다! 1. 이 저장소를 Fork합니다 2. 기능 브랜치를 생성합니다 (`git checkout -b feature/AmazingFeature`) 3. 변경사항을 커밋합니다 (`git commit -m 'Add some AmazingFeature'`) 4. 브랜치에 푸시합니다 (`git push origin feature/AmazingFeature`) 5. Pull Request를 제출합니다 ### 코드 스타일 이 프로젝트는 PEP 8 및 Google Python Style Guide를 따릅니다. 다음을 준수하세요: - 타입 어노테이션 사용 - Google 스타일 docstrings 준수 - 모든 단위 테스트 통과 ## 라이선스 이 프로젝트는 GNU GPL v3.0 라이선스를 따릅니다. 자세한 내용은 [LICENSE](../../LICENSE) 파일을 참조하세요. ## 저자 **xiatianxuan** (CodeSeed) - [Gitee](https://gitee.com/xiatianxuan) - [홈페이지](https://xnors-codeseed.pages.dev/) ## 특별 감사 - [Xnors Studio](https://xnors.github.io/) ## 문의 질문이나 제안이 있으시면 이메일로 연락해 주세요: xiatianxuan2025@163.com --- *최종 업데이트: 2026년 6월 19일*