원문 캡처 · github.com
원문 캡처 · github.com

Shadow Sentinel 저장소는 리눅스에서 디렉터리의 파일 변경을 실시간으로 감시하고, 수정 전 파일의 백업과 변경분을 남기는 도구다. 제작자는 파일을 한 명령으로 복원할 수 있고, 복원으로 덮어쓴 버전도 다시 백업하는 ‘루프 결합’ 기능을 제공한다고 설명한다.

파일 변경 감시와 복원

Shadow Sentinel은 리눅스 커널의 inotify를 이용해 디렉터리 트리를 감시한다. 파일이 수정될 때마다 원자적으로 저장한 .bak 버전과 통합 diff 형식의 .diff 파일을 만든다. 에이전트나 자동화 스크립트가 파일에 write()를 호출하면, 데몬은 파일이 닫히기 전에 변경을 감지하고 이전 버전을 타임스탬프가 붙은 백업으로 보관한다. 변경되거나 삭제된 내용은 사람이 읽을 수 있는 diff로 확인할 수 있다.

파일을 잘못 수정했을 때는 백업 ID를 지정해 복원한다. 복원 작업으로 대상 파일이 덮어써지면 실행 중인 데몬이 그 변경도 감지해 현재 버전을 새 백업으로 남긴다. 따라서 복원을 잘못했을 때도 다시 되돌릴 수 있다는 것이 제작자의 설명이다.

프로젝트는 AI 코딩 에이전트와 자동화 스크립트가 코드나 설정 파일을 잘못 덮어쓸 위험을 도구의 배경으로 든다. 예로 핵심 로직을 주석 한 줄로 대체하거나, 큰 설정 파일을 불완전한 요약으로 덮어쓰는 경우, 토큰 한도·파서 오류·API 시간 초과로 파일이 잘리거나 0바이트 파일이 만들어지는 경우, 여러 스크립트의 매개변수를 잘못 바꾸는 경우를 제시한다. 변경을 곧바로 알아차리더라도 편집기 실행 취소 기록이나 스태시를 뒤져 복구해야 할 수 있고, 몇 시간이나 며칠 뒤 발견하면 에이전트가 계속 실행되고 커밋도 되지 않은 상태에서 원본 코드가 사라질 수 있다고 설명한다. 하루나 일주일 단위의 정기 백업은 그 사이의 수정 내용을 보존하지 못할 수 있다는 점도 지적한다.

감시할 디렉터리와 보관 정책

감시할 디렉터리는 중앙 설정 파일을 편집하는 대신 sentinel init [MB] 명령을 실행하거나 sentinel_marker 파일을 두어 지정한다. 데몬은 시작할 때 표시된 디렉터리를 찾아 하위 디렉터리까지 재귀적으로 감시한다. sentinel_marker 안의 값은 보호할 파일 크기 한도를 MB 단위로 정한다. 예를 들어 한도가 5MB라면 이를 넘는 파일은 백업 보관소에서 자동으로 제외된다. 제작자는 이를 통해 커지는 로그 파일은 보관 대상에서 빼고 작은 스크립트·설정 파일·소스 코드는 보호한다고 설명한다.

서비스가 시작될 때는 드라이브에 이미 존재하는 .bak 파일도 찾아 목록에 등록한다. 기존 백업도 sentinel restore <ID>로 복원할 수 있다. 백업 저장 디렉터리는 감시 대상에서 분리해 자기 자신을 반복해서 감시하는 상황을 막는다.

빠른 연속 쓰기는 3초 동안 변경이 없는지 기다린 뒤 처리해 중복 기록을 줄인다. 정리 정책은 파일별 최신 백업·diff 최대 10개만 남기고, 14일이 지난 버전과 30일이 지난 일일 감사 diff 로그(diff-YYYYMMDD.log)를 삭제한다. 전체 백업 디렉터리가 500MB를 넘으면 오래된 백업부터 정리해 사용량을 400MB까지 낮춘다. 파일이 sentinel_marker의 크기 한도를 넘으면 해당 파일의 백업을 보관소에서 즉시 제거한다. 정리 작업은 서비스 시작 시와 이후 6시간마다 실행된다.

설치와 사용

Shadow Sentinel은 파이썬 표준 라이브러리와 libc.so.6에 대한 ctypes 바인딩만 사용하며, 제작자에 따르면 inotifywait 같은 외부 도구나 별도의 Git 데몬이 필요하지 않다. 패키지를 설치하고 systemd 백그라운드 서비스를 등록하는 명령은 다음과 같다.

text
pip install shadow-sentinel
text
sudo sentinel service install

디렉터리에서 다음 명령을 실행하면 5MB 파일 크기 한도를 가진 sentinel_marker를 만든다.

text
sentinel init 5

터미널에서 sentinel을 실행하면 현재 위치에서 위쪽으로 가장 가까운 마커를 찾아 보호된 버전 목록을 표시한다. 검색 필터도 지정할 수 있다.

text
sentinel
text
sentinel .py

백업 ID가 3인 파일을 복원하거나 해당 백업의 통합 diff를 보려면 다음 명령을 사용한다.

text
sentinel restore 3
text
sentinel diff 3

시스템의 활성 마커를 확인하고 대화형 도움말을 여는 명령은 다음과 같다.

text
sentinel markers
text
sentinel help

저장 위치와 설정

기본 저장 위치는 root 데몬의 경우 /var/lib/shadow-sentinel/, 사용자 데몬의 경우 ~/.local/share/shadow-sentinel/다. 백업·보관소·인덱스를 다른 디렉터리에 저장하려면 root 사용자는 /etc/shadow-sentinel/config.json, 일반 사용자는 ~/.config/shadow-sentinel/config.json을 만든 뒤 다음 설정을 넣는다.

json
{
 "storage_dir": "/custom/path/to/backups"
}

환경 변수로 저장 위치를 지정할 수도 있다.

text
export SENTINEL_STORAGE_DIR=/custom/path/to/backups