0

[Open Source] #141 - myDrive: Hệ thống Cloud Storage cá nhân với kiến trúc Node.js/TypeScript, mã hóa luồng AES-256 và cơ chế Byte-range Streaming tối ưu

Việc lưu trữ dữ liệu cá nhân trên các nền tảng đám mây công cộng luôn đi kèm với rủi ro về quyền riêng tư. myDrive xuất hiện như một giải pháp thay thế Google Drive/Dropbox hoàn hảo, cho phép bạn tự vận hành máy chủ lưu trữ riêng. Điểm tạo nên sự khác biệt của myDrive không chỉ nằm ở giao diện hiện đại mà còn ở kiến trúc bảo mật "Encryption at Rest" — nơi dữ liệu được mã hóa ngay khi chạm tới máy chủ và chỉ có thể giải mã bởi chủ sở hữu.

Dưới góc độ kỹ thuật, myDrive là một minh chứng xuất sắc về việc xử lý Streaming Data hiệu năng cao và kỹ thuật Mã hóa theo luồng sử dụng TypeScript và Node.js.

Github: https://github.com/subnub/myDrive


🛠️ 1. Nền tảng công nghệ: Fullstack TypeScript và Hybrid Storage

myDrive tận dụng sự nhất quán của TypeScript để xây dựng một hệ thống an toàn và dễ mở rộng:

  • Backend Core (Node.js & Express): Sử dụng kiến trúc phân lớp (Layered Architecture) để tách biệt rõ ràng giữa Controller, Service và Data Access Layer.
  • Database (MongoDB & Mongoose): Lưu trữ toàn bộ Metadata (cấu trúc thư mục, thông tin file, quyền truy cập). NoSQL giúp hệ thống linh hoạt khi xử lý các thuộc tính file đa dạng.
  • Hybrid Storage Support: Hệ thống cho phép người dùng lựa chọn giữa lưu trữ trên ổ đĩa cục bộ (Local Filesystem) hoặc các dịch vụ đám mây tương thích Amazon S3, mang lại khả năng mở rộng không giới hạn.
  • Modern Frontend (React & Vite): Giao diện được tối ưu tốc độ tải trang, sử dụng React Query để quản lý trạng thái server và Redux Toolkit để điều phối quy trình upload phức tạp.

🏗️ 2. Trụ cột kiến trúc: Bảo mật Zero-Knowledge và Xử lý Luồng (Streaming)

Kiến trúc của myDrive được thiết kế để đặt quyền riêng tư của người dùng lên hàng đầu:

  • Per-User Encryption Key: Mỗi người dùng khi đăng ký sẽ được hệ thống khởi tạo một khóa mã hóa duy nhất. Khóa này được lưu trữ an toàn và chỉ được sử dụng để giải mã các tệp tin của chính người dùng đó.
  • On-the-fly AES-256-CBC Encryption: Đây là kỹ thuật then chốt. Thay vì tải toàn bộ file lên rồi mới mã hóa, myDrive sử dụng Busboy để nhận luồng dữ liệu (Multipart Stream) và đưa qua bộ lọc mã hóa AES-256 ngay lập tức trước khi ghi xuống đĩa. Kỹ thuật này giúp tiết kiệm tài nguyên RAM và đảm bảo file lưu trữ luôn ở trạng thái mã hóa.
  • Byte-range Streaming for Video: Một kỹ thuật cực khó trong môi trường mã hóa. myDrive hỗ trợ người dùng tua (seek) video trực tiếp. Hệ thống sẽ tính toán phân đoạn dữ liệu (Chunk) và Vector khởi tạo (IV) tương ứng để giải mã đúng phân đoạn yêu cầu, thay vì phải giải mã toàn bộ file video.

🔄 3. Workflow: Quy trình từ Tải lên đến Lưu trữ mã hóa (Sequence Diagram)

Sơ đồ mô tả cách dữ liệu được bảo vệ xuyên suốt hành trình từ trình duyệt đến ổ cứng: image.png


⚡ 4. Các kỹ thuật "Pro-level" trong mã nguồn

  1. Dual-Token Authentication System: Sử dụng cặp Access Token (ngắn hạn, trong HttpOnly Cookie) và Refresh Token để đảm bảo an toàn tối đa cho phiên làm việc, ngăn chặn các cuộc tấn công XSS chiếm quyền điều khiển tài khoản.
  2. Advanced Media Processing: Tích hợp Sharp cho hình ảnh và FFmpeg cho video để tự động trích xuất Thumbnail ngay trong quá trình xử lý ngầm, giúp giao diện duyệt file mượt mà hơn.
  3. Folder Structure Persistence: Hỗ trợ upload toàn bộ thư mục phức tạp. Frontend sẽ đệ quy cây thư mục và Backend đảm bảo ánh xạ đúng cấu trúc này vào database thông qua quan hệ parentId.
  4. Progressive Web App (PWA): Tích hợp Service Worker để cache tài nguyên tĩnh và thumbnails, mang lại trải nghiệm ứng dụng bản địa (Native-like) trên các thiết bị di động.

⚖️ 5. So sánh chiến lược

Tiêu chí myDrive Nextcloud Google Drive (SaaS)
Bảo mật dữ liệu Mã hóa E2E (Tùy chọn) Mã hóa Server-side Google giữ Key
Hiệu năng Streaming Rất cao (Node.js Stream) Trung bình (PHP-based) Rất cao
Tính gọn nhẹ Rất nhẹ (Single purpose) Cồng kềnh (Nhiều app) N/A
Kiến trúc TypeScript/Node.js PHP Proprietary
Triển khai Docker (Rất nhanh) Phức tạp hơn Không cần

✅ Kết luận: Tại sao myDrive là bài học giá trị cho Fullstack Engineer?

myDrive không chỉ là một công cụ; nó là một bài thực hành đỉnh cao về quản lý vòng đời dữ liệu nhị phân. Việc làm chủ kỹ thuật mã hóa theo luồng và xử lý Byte-range request trên dữ liệu đã mã hóa cho thấy tư duy kỹ thuật cực kỳ sâu sắc của đội ngũ phát triển.

Đối với các lập trình viên Backend, nghiên cứu myDrive giúp bạn hiểu sâu về:

  • Cách vận hành Node.js Streams hiệu quả.
  • Kỹ thuật Mã hóa đối xứng (AES) trong môi trường thực tế.
  • Tư duy thiết kế Kiến trúc phân lớp với TypeScript để xây dựng hệ thống bền bỉ.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí