GN⁺: TeaTime - SQLite, IPFS 및 GitHub로 구동되는 분산형 도서관 시스템
(github.com/bjesus)- IPFS, SQLite, GitHub을 기반으로 하는 완전한 정적 분산 라이브러리 시스템
- Netlify와 GitHub Pages에서 자동 업데이트되는 인스턴스 호스팅 가능
분산 라이브러리
- TeaTime 웹 애플리케이션은 데이터베이스와 가져오는 파일로부터 완전히 분리되어 있음.
- 사용되는 데이터베이스는 GitHub Pages에 게시된 teatime-database 주제가 태그된 GitHub 저장소임.
- 각 저장소는 SQLite 데이터베이스를 가리키는 config.json 파일을 포함함.
- 사용자가 검색을 수행하기 전에 사용할 데이터베이스를 선택하고, TeaTime은 sql.js-httpvfs를 사용하여 SQLite 데이터베이스를 쿼리함.
- SQLite 데이터베이스의 각 행은 라이브러리의 항목이며, 파일 해시 열은 IPFS에서 항목을 가져오는 데 사용됨.
- 웹 애플리케이션이 정적 사이트이고 데이터베이스가 정적 파일로 구성되어 있어 쉽게 포크, 복제, 배포 가능함.
- 프론트엔드 인스턴스는 teatime-instance 주제가 태그된 GitHub 저장소임.
- IPFS에서 파일이 제공되므로 이 분산 아키텍처는 TeaTime의 회복력을 높임.
기능
- 제목, 저자, 연도 또는 형식으로 검색 가능
- 읽기 기록 유지 및 파일 재열기 시 페이지로 돌아가기
- 파일을 로컬로 다운로드
- IndexedDB에 파일 캐시하여 빠른 로딩
- TeaTime에 파일 드롭하여 렌더링
- 다크 모드 및 전체 화면 모드
- 쿠키 없음, 로그인 없음
- 완전히 분산됨
프론트엔드 개발
- TeaTime은 Nuxt.js 애플리케이션임.
- 로컬에서 쉽게 실행 가능: 저장소를 클론하고 다음 단계 수행
- 종속성 설치:
npm install
- 서버 실행:
npm run dev
-
http://localhost:3000
으로 이동
- 종속성 설치:
- Nuxt 문서를 참조하여 추가 정보 확인 가능
데이터베이스 생성
- JSON 기반 데이터베이스 저장소를 포크하고 JSON 파일을 필요에 맞게 조정하여 데이터베이스 생성 가능.
- GitHub Actions가 SQLite 파일을 생성하고 GitHub Pages에 업로드함.
- TeaTime과 함께 작동할 수 있는 SQLite 데이터베이스를 수동으로 생성하려면 데이터베이스 저장소의 예제를 따름.
- 각 SQLite 데이터베이스는 아래 스키마를 가진 테이블을 포함함. 열 이름은
config.json
파일에서 조정 가능.CREATE TABLE "books" ( "id" INTEGER, "title" TEXT, "author" TEXT, "year" INTEGER, "lang" TEXT, "size" INTEGER, "ext" TEXT, "ipfs_cid" TEXT, PRIMARY KEY("id" AUTOINCREMENT) );
- SQLite 파일이 너무 크면 분할 가능. 데이터베이스 최적화 정보 참고 필요. FTS 사용 권장.
- 저장소를 GitHub Pages에 게시하고
teatime-database
주제를 저장소에 할당
기여
- 코딩을 못하더라도 이 저장소와 좋아하는 데이터베이스 저장소를 포크하여 기여 가능.
- 저장소를 포크할 때 직접적으로 연결되지 않도록 수동으로 포크하는 것이 좋음 (
git clone
&&git remote add your-origin ...
&&git push your-origin main
). - 유용한 데이터베이스 저장소에 별표를 추가하는 것도 좋은 방법임. 이는 TeaTime 사용자 인터페이스에서 데이터베이스의 순서를 결정하여 다른 사용자가 최고의 데이터베이스를 쉽게 찾을 수 있도록 함.
Hacker News 의견
-
IPFS 기여자는 IPFS에서 여러 게이트웨이로부터 다운로드를 처리하는 방법을 개선할 수 있는 방법을 제안함
- @helia/verified-fetch를 사용하면 Fetch와 유사한 API를 통해 CIDs를 수락하고 콘텐츠 라우팅과 P2P 검색을 처리할 수 있음
- 게이트웨이에 직접 연결할 수 있는 경우 게이트웨이를 전달할 수도 있음
-
Pear P2P 프레임워크는 GitHub에서 벗어나 진정한 분산 시스템으로 전환하는 데 도움이 될 수 있음
- 인덱스가 GitHub에 있어야 한다면 IPFS에 파일을 저장하는 것이 무슨 의미가 있는지 의문을 제기함
-
Helia를 사용하여 사용자가 네트워크의 노드로 기여할 수 있도록 하는 것을 고려 중임
- Helia에 대한 정보를 검색하면서 OrbitDB를 떠올리게 되었음
-
특정 리소스에 접근할 때 CORS 정책으로 인해 차단되는 문제가 발생함
- 요청의 모드를 'no-cors'로 설정하여 CORS를 비활성화한 상태로 리소스를 가져올 수 있음
-
브라우저에서 모든 작업이 이루어지며, 사용자, 쿠키, 추적이 없음
- LocalStorage와 IndexedDB를 사용하여 마지막 읽은 위치와 파일 내 위치를 저장함
- 이 기능을 매우 좋아하며 감사의 뜻을 전함
-
TeaTime에서 사용되는 데이터베이스는 GitHub Pages에 게시된 GitHub 저장소임
- 악의적인 사용자가 이 태그를 사용할 수 있어 보안 문제가 될 수 있음
-
데이터베이스에 무엇이 있는지 모르기 때문에 검색할 내용을 알 수 없음
- 탐색 기능을 제안함
-
예제 인스턴스를 사용할 수 있는지에 대한 질문이 있음
-
Pocket 북마크를 통합할 수 있는지 궁금해함
- 읽고 싶은 모든 것을 오프라인으로 캐시하고 링크 부식을 방지하며 쿼리할 수 있기를 희망함