LiteFS Cloud와 함께하는 Deno KV (Deno KV with LiteFS Cloud)
Deno Deploy에서 Fly.io로 앱을 포팅할 때 Deno KV를 사용했다면 규모에 맞게 실행하는 방법이 고민될 수 있어요. 이 가이드에서는 LiteFS Cloud를 활용해 SQLite 기반으로 Deno KV를 Fly.io에서 쉽게 실행하는 방법을 알려드려요. 다만 이 문서 섹션은 단종되어 2024년 10월 15일에 종료된 제품을 다룬다는 점을 먼저 유의해 주세요.
출처: 문서
본문
**이 섹션의 문서는 단종되었으며 2024년 10월 15일에 폐지된 제품을 다룹니다.** [LiteFS](https://github.com/superfly/litefs) 자체는 LiteFS Cloud 서비스의 폐지에 영향을 받지 않습니다. LiteFS Cloud에서 연결을 해제하는 방법과 재해 복구를 위한 다른 옵션은 커뮤니티 게시물에서 확인하세요: [Sunsetting LiteFS Cloud](https://community.fly.io/t/sunsetting-litefs-cloud/20829).문제
Deno Deploy에서 Fly.io로 앱을 포팅한다면 문제에 부딪힐 수 있어요. Deno KV로 빌드했다면—Deno Deploy용으로 만들어진 전통적으로 FoundationDB 기반 키/값 저장소죠—Fly.io에서 Deno KV를 쉽게 규모에 맞게 실행할 명확한 방법이 없어요. Fly.io에서 denoland/denokv를 사용할 수도 있지만, 하늘의 별이 맞아떨어져 더 쉬운 방법이 있어요.
Deno KV는 실제로 캐시 폴더의 디스크에 저장된 SQLite DB로 뒷받침될 수 있고, Deno.openKv( <here> )의 매개변수로 이 DB의 경로를 지정할 수 있어요.
즉, 다음과 같은 방법으로 Deno KV가 임의의 SQLite DB를 사용하게 할 수 있어요:
const kv = await Deno.openKv("/any/path/i/want.db");
이제 Fly.io에는 SQLite 사용자를 위한 특별한 기능이 있어요. 바로 LiteFS Cloud인데, 모든 인스턴스에 걸쳐 SQLite 데이터베이스를 투명하게 복제하고 백업하는 분산 파일 시스템이에요. 여기서 핵심은 로컬 디스크의 SQLite 데이터베이스처럼 취급할 수 있지만, 뒤에서 DB를 복제하는 모든 작업을 알아서 처리한다는 거예요.
LiteFS 설정
먼저 프로젝트에 litefs.yml 파일을 추가하고 Dockerfile에 포함되도록 해야 해요.
예시는 다음과 같아요:
fuse:
dir: "/litefs"
data:
dir: "/var/lib/litefs"
exit-on-error: false
proxy:
addr: ":8080"
target: "localhost:8081"
db: "db"
passthrough:
- "*.ico"
- "*.png"
exec:
- cmd: "deno run -A main.ts"
lease:
type: "consul"
advertise-url: "http://${HOSTNAME}.vm.${FLY_APP_NAME}.internal:20202"
candidate: ${FLY_REGION == PRIMARY_REGION}
promote: true
consul:
url: "${FLY_CONSUL_URL}"
key: "litefs/${FLY_APP_NAME}"\
이것은 샘플 설정의 99% 그대로이고, exec 명령만 Deno용으로 바꾼 거예요.
예시 설정만 봐서는 명확하지 않지만, 여러분의 앱은 "target"(:8081)에서 수신 대기해야 하고 fly.toml의 service/http\\_service는 "addr"(:8080)에서 수신 대기해야 해요. LiteFS의 일부가 프록시 역할을 하기 때문에, fly-proxy가 요청을 LiteFS로 보내면 LiteFS가 이를 앱으로 전달하도록 해야 하거든요.앱의 포트를 변경할 수 없다면 target이 올바르게 설정되었는지 확인한 다음 addr과 fly.toml을 :8080이 아닌 다른 값으로 변경하세요.
설정을 추가했다면 앱이 SQLite DB를 올바른 위치에서 찾도록 만들면 돼요. Deno KV의 경우 다음과 같아요:
const kv = await Deno.openKv(Deno.env.get("DB_LOCATION"));
여기서 DB_LOCATION은 fly.toml의 [env]에서 /litefs/my.db로 설정돼요.
이제 Fly.io에 배포한다면 거의 준비된 거예요. Fly.io가 아니라면 어디를 봐야 할지 여기에서 확인하세요.
LiteFS Cloud 클러스터 만들기
더 자세한 내용은 Fly.io에서 LiteFS 시작하기를 확인해 보세요.
대시보드의 LiteFS 섹션으로 이동해서 클러스터를 만들고, 인증 토큰을 기록해 두세요(나중에 필요해요).
Dockerfile
Dockerfile에 LiteFS 의존성을 추가해야 해요:
# for alpine-based images
RUN apk add ca-certificates fuse3 sqlite
# or for debian/ubuntu-based images
RUN apt-get update -y && apt-get install -y ca-certificates fuse3 sqlite3
그리고 LiteFS 바이너리를 복사해 넣어요:
COPY --from=flyio/litefs:0.5 /usr/local/bin/litefs /usr/local/bin/litefs
그리고 ENTRYPOINT/CMD를 업데이트해요:
ENTRYPOINT litefs mount
이제 Fly 앱을 출시할 준비가 됐어요!
# Create a volume
$ fly volumes create litefs --size 10
# Create your app without deploying
$ fly launch --no-deploy
# Attach the Fly.io provided Consul server to your app.
$ fly consul attach
# Set the secret for LiteFS cloud, replace the example value with your token from earlier
$ fly secrets set LITEFS_CLOUD_TOKEN=yoursecrettoken
fly.toml을 업데이트해서 LiteFS 볼륨을 마운트해요:
[mounts]
source = "litefs"
destination = "/var/lib/litefs"
그러면, 배포하세요!
fly deploy
이 모든 명령을 실행한 보상은 LiteFS가 동작하는 실행 중인 앱이에요! Deno KV나 다른 클라이언트와 함께 LiteFS를 사용할 때 문제가 생기면 Fly Community에서 알려주세요.
스케일링
LiteFS로 노드 하나만 배포하는 것은 사실 별 효과가 없으니, 바깥으로 확장해 보세요! 다음과 같이 사용자와 가까운 리전에 Machine 몇 개를 추가할 수 있어요:
fly scale count 3 -r yyz,ewr,waw
이렇게 하면 앱을 확장하기 위해 볼륨과 Machine이 자동으로 추가되어 전 세계로 확장돼요!