- OpenRun은 내부 도구용 웹 앱 배포 플랫폼으로, 정적 파일·앱 코드·설정 파일을 파일 시스템 대신 SQLite에 저장해 배포 상태를 데이터베이스 중심으로 관리함
- 여러 파일이 함께 바뀌는 앱 업데이트를 하나의 트랜잭션으로 처리해, 버전 전환 중 깨진 웹 페이지가 제공되는 상황을 막는 것이 핵심 목적임
- 압축 전 SHA256 해시를 기본 키로 쓰면서 앱 버전 간, staging·preview·production 앱 간 중복 파일 저장을 줄임
- SQLite 저장 방식은 롤백, 백업, ETag용 해시 저장, Brotli 압축 저장을 단순하게 만들며, 필요하면 GZip·비압축 데이터도 컬럼 추가로 함께 다룰 수 있음
- 현재는 단일 노드에서 동작하고, 멀티 노드 지원 시 공유 Postgres와 로컬 SQLite 파일 캐시를 함께 써 지연을 줄이는 방향을 계획 중임
OpenRun의 파일 저장 방식
- OpenRun은 코드 우선(code-first) 내부 도구를 위한 오픈소스 배포 플랫폼이며, 단일 노드 또는 Kubernetes 클러스터에 GitOps 방식으로 웹 앱을 배포함
- 일반적인 웹 서버처럼 파일 시스템에 정적 콘텐츠를 두는 대신, OpenRun은 정적 파일·앱 코드·설정 파일 같은 앱 데이터를 SQLite에 저장함
- 앱 메타데이터가 동적으로 생성되기 때문에 데이터베이스 저장이 자연스럽고, 파일까지 같은 저장 계층에서 다루면 배포 상태를 함께 관리하기 쉬움
- 앱 생성과 업데이트 시 파일은 GitHub 또는 로컬 디스크에서 SQLite 데이터베이스로 업로드됨
- 개발 모드에서만 로컬 파일 시스템을 사용함
SQLite를 선택한 이유
- 트랜잭션 업데이트가 가장 큰 장점임
- 여러 파일 변경을 하나의 트랜잭션으로 묶어 처리할 수 있음
- 격리성 덕분에 업데이트 도중 깨진 웹 앱이 제공되지 않음
- 배포 오류가 나면 데이터베이스 트랜잭션 단위로 롤백할 수 있음
- 여러 앱이 동시에 업데이트되는 경우에도 한 번에 되돌릴 수 있음
- 파일 시스템에서 변경된 파일을 찾아 정리하는 방식보다 단순함
- OpenRun은 모든 업데이트를 자동으로 버전 관리하며, 파일 데이터는 다음 스키마의 테이블에 저장됨
CREATE TABLE files (sha text, compression_type text, content blob, create_time datetime, PRIMARY KEY(sha));
- 압축 전 콘텐츠의 SHA256 해시를 기본 키로 사용하므로 같은 파일 내용은 여러 버전에서 한 번만 저장됨
- production 앱마다 staging app이 있고, 여러 preview apps를 가질 수 있어 파일 중복이 생길 수 있음
- SQLite 기반 저장은 앱 간에도 같은 콘텐츠의 파일을 중복 저장하지 않게 해줌
백업, 캐싱, 압축 처리
- 전체 시스템 상태, 메타데이터, 파일을 SQLite 백업 도구인 Litestream 등으로 백업할 수 있음
- 브라우저 캐싱용 ETag 헤더에 필요한 콘텐츠 SHA를 파일 업로드 시 한 번 저장해두면 나중에 다시 계산할 필요가 없음
- 파일 내용은 SQLite 테이블에 Brotli 압축 형태로 저장됨
- 데이터베이스 방식에서는
files 테이블에 컬럼을 추가해 GZip 압축 데이터나 비압축 데이터도 저장할 수 있음
성능과 멀티 노드 계획
- OpenRun에서 SQLite 데이터베이스 방식은 좋은 성능을 제공함
- 파일 시스템 기반의 동등한 구현이 없어 직접 비교 벤치마크는 수행하지 않음
- SQLite 팀의 벤치마크에 따르면 일부 워크로드에서는 SQLite가 직접 파일 시스템 사용보다 더 나은 성능을 낼 수 있음
- OpenRun은 현재 단일 노드에서 실행됨
- 향후 멀티 노드 지원이 추가되면 메타데이터와 파일 데이터 저장에 로컬 SQLite 대신 공유 Postgres 데이터베이스를 사용할 계획임
- 이 방식은 지연 문제가 생길 수 있음
- Postgres 접근 지연을 피하기 위해 로컬 SQLite 데이터베이스를 파일 캐시로 사용할 계획임
파일 시스템 방식이 더 흔한 이유
- 대부분의 웹 서버가 파일 시스템을 사용하는 이유 중 하나는 편의성임
- rsync, tar 같은 기존 파일 시스템 도구로 파일을 복사하고 업데이트할 수 있음
- 또 다른 이유는 역사적인 배경임
- 좋은 인프로세스 관계형 데이터베이스가 있기 전부터 파일 시스템이 사용되어 왔음
- 데이터베이스를 파일 저장소로 쓰려면 파일 업로드용 API 인터페이스가 필요하며, 항상 실현 가능한 방식은 아님