클라우드 없이 내 서버에서 Cloudflare Workers를 돌리는 방법
지금까지 Cloudflare Workers를 쓰려면 반드시 Cloudflare 네트워크에 의존해야 했습니다. 이제 내 컴퓨터나 서버에 celld를 설치하면, 기존 wrangler.json 설정 그대로 Workers와 Durable Objects를 로컬에서 실행할 수 있습니다. celld는 클라우드의 중앙 관리 서버 없이, S3 호환 스토리지만 있으면 분산된 노드들이 서로 상태를 동기화하며 애플리케이션을 유지하는 데몬입니다.
중앙 서버 없는 분산 구조
각 노드는 V8 엔진을 내장하여 Wrangler 번들을 직접 실행합니다. 노드들은 하나의 버킷을 공유하며, 이 버킷에 배포 정보와 셀 상태, 소유권 기록을 저장합니다. 특정 노드가 버킷에 조건부 기록을 쓰면 해당 셀의 소유권을 얻게 되며, 이 방식으로 한 번에 하나의 노드만 셀을 소유하도록 보장합니다. 따라서 멤버십 프로토콜이나 합의 서비스 같은 복잡한 인프라가 필요 없습니다. 노드 간 라우팅과 로그 전송은 서명된 피어 HTTP로 처리됩니다.
데이터 지속성과 복제 방식
셀드는 SQLite의 커밋된 쓰기 작업을 LTX 복제 형식으로 캡처합니다. 단일 노드에서는 버킷에 데이터를 업로드해야 쓰기 완료로 인정되므로 속도가 느립니다. 하지만 두 개 이상의 노드가 있을 경우, 소유 노드가 데이터를 다른 노드 1~2곳에 전송하고 그 노드들이 디스크에 저장하는 순간 쓰기 완료로 처리됩니다. 이후 버킷에 백업이 업로드됩니다. 노드가 교체되어도 버킷에 장기 상태가 남아있고, 이전 소유자의 열린 로그를 복구하므로 데이터 손실 없이 셀을 복원할 수 있습니다.
지원하는 서비스 범위
셀드는 Cloudflare Workers 플랫폼의 프로그래매틱 런타임과 바인딩을 지원합니다. KV 네임스페이스, 큐, D1 데이터베이스, 워크플로우는 모두 셀로 취급되어 동일한 리스, 복제, 페일오버 기능을 갖습니다. R2 바인딩은 플릿 버킷에서 객체를 직접 읽고 씁니다. 정적 자산, 크론 트리거, 동적 워커, 컨테이너(실험적), 샌드박스도 지원합니다. 다만 Cloudflare 네트워크, GPU, 브라우저 팜이 필요한 제품은 지원 대상이 아닙니다.
설치 및 실행 방법
설치 스크립트를 실행하면 celld 바이너리가 다운로드되며, gh attestation verify로 출처를 검증할 수 있습니다. 로컬 개발은 celld dev 명령으로 시작하며, Docker나 클라우드 버킷 없이 로컬 객체 스토리지로 동작합니다. 프로덕션 배포는 celld deploy로 버킷에 업로드한 뒤, celld 데몬을 실행합니다. S3, Google Cloud Storage, Azure Blob Storage를 모두 지원하며, AWS 자격 증명 체인을 표준으로 사용합니다. 컨테이너 이미지도 Linux x86-64와 ARM64용으로 제공됩니다.
운영 시 고려할 점
쓰기 지연이 중요하면 두 개 이상의 노드를 실행해야 합니다. 두 번째 노드는 추가 설정 없이 버킷을 통해 다른 노드를 발견합니다. 메모리 압력이 80%에 도달하면 셀드는 가장 오래된 유휴 셀을 복제하고 방출하여 메모리를 확보합니다. V8 힙 제한은 기본 128MB이며, 이를 초과하면 새로운 히버네이table WebSocket을 거부합니다. 피어 HTTP와 운영자 API는 내부 리스너를 사용하므로, 광고된 주소는 WireGuard나 Tailscale 같은 암호화 오버레이나 신뢰할 수 있는 사설 네트워크에 두어야 합니다. 공개 IP를 사용하려면 --unsafe-public-advertise 플래그가 필요합니다. 버킷 접근 권한은 플릿 관리자 권한과 동일하므로 자격 증명을 철저히 관리해야 합니다.