메인 콘텐츠로 건너뛰기 탐색으로 건너뛰기 푸터로 건너뛰기
기간 한정 디자인 파트너 프로그램. BUSINESS 플랜 평생 무료.

저장소 포크하기

전체 저장소(앱, 데이터베이스, 파일)를 몇 초 만에 복제합니다. 크기 무관. 추가 디스크 없음.

저장소 포크하기

앱, 데이터베이스, 구성 파일을 포함한 전체 프로덕션 환경을 몇 초 만에 복제합니다. 크기 무관. 추가 디스크 없음. 원하는 만큼 포크할 수 있습니다.

핵심 문구: 프로덕션을 복제하되, 아무것도 망가뜨리지 않습니다.

튜토리얼 보기

잃을 것 만들기

먼저, 포크의 격리를 증명하기 위해 실행 중인 앱에 파일을 추가합니다. VS Code에서 저장소를 열고, 저장소 내부에서 마커 파일을 만듭니다:

rdc vscode connect -m my-server -r my-app
echo "Hello from production" > index.html

이제 포크합니다.

포크

rdc repo fork --parent my-app -m <machine-name> --tag experiment --up

단일 명령어로 앱, 데이터베이스, 설정 파일을 포함한 전체 repo를 복제합니다. repo 크기가 1GB, 100GB, 1TB 중 어느 것이든 fork 시간은 일정합니다.

Parent fans out into independent clones

하나의 명령으로 앱, 데이터베이스, 구성 파일 모든 것이 복제되었고, 몇 초 만에 완료되었습니다. 다시 실행하면 또 다른 독립적인 복제본이 생성됩니다.

왜 이렇게 빠른가요?

Sharing a folder link is the same speed regardless of the folder's size

원인은 btrfs reflink입니다. 포크는 부모와 동일한 데이터 블록을 가리키는 새로운 파일 시스템 트리를 생성합니다. 포크 시에 데이터가 복사되지 않습니다. 모두 메타데이터이므로 부모의 크기는 포크가 얼마나 오래 걸리는지에 영향을 주지 않습니다.

1 GB, 100 GB, 1 TB. Same time, every time.

포크도 마찬가지입니다. 1 GB, 100 GB, 1 TB 언제나 같은 시간.

무엇이 공유되고, 무엇이 내 것인가요?

Many mirrors, one sun: shared base, your changes are yours

부모 저장소를 고정된 원본이라고 생각하세요. 포크는 그것의 쓰기 시 복사(copy-on-write) 뷰입니다. 포크에 쓰면 그 내용은 포크에만 남습니다. 아무리 많은 포크가 가리키고 있어도 부모는 변하지 않습니다.

태양을 손에 쥘 수 없지만, 거울에 담을 수 있습니다.

나중에 부모가 변경되면 어떻게 되나요?

A fork is a frozen photograph; the parent keeps flowing like a river

이제 스냅샷을 생각해 보세요. 포크할 때 그 정확한 순간에 부모를 고정합니다. 부모는 계속 변화합니다. 포크는 그렇지 않습니다.

나중에 부모 저장소가 변경되어도 포크는 그 자리에 있습니다.

강을 손에 쥘 수 없지만, 사진에 담을 수 있습니다.

디스크 사용량이 증가하지 않습니다

Five forks of a 100 GB repo, still about 100 GB total

그래서 디스크가 폭발하지 않습니다. 100 GB 저장소의 포크가 다섯 개? 총 여전히 약 100 GB입니다. 각 포크에서 변경한 내용에 대해서만 디스크 비용을 지불합니다.

다섯 번 포크해도 디스크는 알아채지도 못합니다.

포크가 상속하지 않는 것: 시크릿

포크가 의도적으로 따르지 않는 한 가지가 있습니다: 시크릿입니다. 포크는 API 키, 데이터베이스 비밀번호, Stripe 토큰 없이 시작합니다. 그래서 “프로덕션 복제, 아무것도 망가뜨리지 않음”이 실제로 작동합니다. 샌드박스는 여러분인 척 할 수 없으므로 실제 고객에게 청구할 수 없습니다. 시크릿 관리 튜토리얼에서 이것을 제대로 설정합니다.

격리 확인

두 저장소를 나란히 나열합니다:

rdc repo list -m <machine-name>

두 repo는 이제 동일한 머신과 디스크에서 완전히 독립된 두 환경으로 공존합니다.

my-appmy-app:experiment가 동시에 실행되고 있음을 볼 수 있습니다. 원본에서 마커 파일은 정확히 두었던 자리에 있습니다:

rdc term connect -m <machine-name> --repository my-app --command 'ls -la index.html'

원본 repo를 확인하여 격리를 검증하세요. 마커 파일이 그대로 남아 있습니다. fork를 생성해도 부모 repo는 수정되지 않습니다.

이제 포크 내에서만 파괴적인 변경을 합니다:

rdc term connect -m <machine-name> --repository my-app:experiment --command 'rm index.html && echo removed'

fork 내부의 마커 파일만 삭제합니다. 이는 fork 범위 내에서만 적용되는 파괴적 변경입니다.

원본으로 돌아가 확인합니다:

rdc term connect -m <machine-name> --repository my-app --command 'ls -la index.html'

원본 repo로 돌아가면 마커 파일이 그대로 남아 있습니다. 부모와 fork는 동일한 이미지를 공유하지만 별도의 Docker daemon과 별도의 파일시스템에서 실행됩니다.

마커 파일은 여기에 그대로 있습니다. 포크의 변경 사항은 포크에 남아 있었습니다. 동일한 이미지, 별도의 Docker 데몬, 별도의 파일 시스템.

정리

완료되면 포크를 삭제하기만 하면 됩니다:

rdc repo delete --name my-app:experiment -m <machine-name>

작업이 끝나면 fork를 삭제합니다. 원본 repo는 영향을 받지 않아 안전하게 fork, 실험, 폐기하는 워크플로우가 가능합니다.

원본은 그대로 유지됩니다. 포크하고, 실험하고, 망가뜨리고, 삭제하세요. 위험 없음.


다음: 포크 격리 직접 확인하기.