Yggstore: Lưu trữ phi tập trung, mã hóa và chia nhỏ giữa bạn bè qua mạng Yggdrasil
Yggstore là dự án mã nguồn mở cho phép một nhóm người dùng chia sẻ dung lượng ổ cứng cho nhau. Mỗi tệp được mã hóa AES-256-GCM, chia thành các mảnh nhỏ và phân tán trên máy của mọi thành viên, giúp dữ liệu tồn tại ngay cả khi một máy gặp sự cố. Dự án hoạt động trên mạng lớp phủ Yggdrasil, không cần VPN hay máy chủ trung tâm.

Yggstore: Lưu trữ phi tập trung, mã hóa và chia nhỏ giữa bạn bè qua mạng Yggdrasil
Yggstore là một dự án mã nguồn mở đang ở giai đoạn thử nghiệm, cho phép một nhóm người dùng cùng chia sẻ dung lượng ổ cứng cho nhau. Mỗi tệp được mã hóa, cắt thành nhiều mảnh và phân tán trên máy của tất cả thành viên, nhờ đó dữ liệu vẫn tồn tại ngay cả khi một máy gặp sự cố.
Điểm đặc biệt của dự án là toàn bộ quá trình diễn ra trên mạng lớp phủ Yggdrasil — không cần VPN, không cần máy chủ điều phối trung tâm. Đây là ý tưởng hấp dẫn với những ai quan tâm đến lưu trữ phi tập trung và tự chủ dữ liệu cá nhân.
Ý tưởng cốt lõi
Mô hình hoạt động khá đơn giản: những người trong cùng một nhóm cho nhau mượn dung lượng ổ cứng. Mỗi tệp được mã hóa, cắt nhỏ rồi trải đều trên máy của mọi người, nên dữ liệu vẫn sống sót dù bất kỳ máy nào hỏng.
Một stub nhỏ được giữ lại chứa khóa giải mã. Gửi stub này cho người khác (đã niêm phong riêng cho họ, qua email hay bất kỳ cách nào) chính là cách gửi tệp — hoàn toàn không cần dịch vụ đám mây nào ở giữa.
Trạng thái: thử nghiệm. Phần mật mã chưa được bất kỳ ai độc lập kiểm định. Đừng dùng nó làm bản sao duy nhất của những gì bạn không thể mất.
Cách hoạt động kỹ thuật
Lệnh put chia tệp thành các khối 4 MiB, mã hóa từng khối bằng AES-256-GCM (một khóa ngẫu nhiên cho mỗi tệp, nonce mới cho mỗi khối), rồi mã hóa xóa (erasure code) mỗi khối thành 4 mảnh dữ liệu + 2 mảnh chẵn lẻ.
- Các mảnh được định địa chỉ theo nội dung (tên tệp = SHA-256) và phân tán trên các máy ngang hàng đang trực tuyến.
- Mỗi máy nhận tối đa một mảnh của mỗi khối khi có từ 6 máy trở lên.
- Tệp
FILE.ystubgiữ manifest, bao gồm cả khóa giải mã.
Lệnh get tải các mảnh song song, loại bỏ mảnh có hash không khớp, và phục hồi mỗi khối từ bất kỳ 4 trong 6 mảnh.
Lúc tải lên, máy gửi tính trước 20 thử thách dùng một lần cho mỗi mảnh vào FILE.ystub.challenges.json (cần giữ riêng tư). Lệnh verify gửi mỗi mảnh một thử thách dạng "băm vùng byte này với nonce này" và kiểm tra kết quả trả về.
Danh tính và kiểm soát truy cập
Địa chỉ Yggdrasil (dải 200::/7) được dẫn xuất từ khóa công khai của nút, nên địa chỉ nguồn của kết nối qua mạng lớp phủ chính là danh tính người gọi. Địa chỉ đó đóng vai trò ID nút.
Mỗi máy chủ chỉ trả lời những người gọi có địa chỉ nằm trong peers.json (mặc định từ chối), chỉ lắng nghe trên địa chỉ lớp phủ của chính nó, và chỉ cho phép người ghi gốc xóa mảnh.
Cài đặt và sử dụng
Tải yggstore cho hệ điều hành của bạn từ trang releases (Linux trên PC, Raspberry Pi và bo mạch arm64, Windows, macOS), rồi đối chiếu với SHA256SUMS. Hoặc tự biên dịch bằng Go 1.24 trở lên:
go build -o bin/yggstore ./cmd/yggstore
bin/yggstore id # in ra ID nút và mục peers.json của bạn
bin/yggstore serve -peers peers.json # chạy trên mọi máy (mặc định cổng 7400)
bin/yggstore put photo.jpg -peers peers.json # -> photo.jpg.ystub
bin/yggstore verify photo.jpg.ystub
bin/yggstore get -o copy.jpg photo.jpg.ystub
bin/yggstore rm photo.jpg.ystub # xóa các mảnh
Mỗi khối gồm 6 mảnh và không nút nào nhận quá 2 mảnh, nên mất bất kỳ một nút nào cũng không mất dữ liệu. Nút được đánh dấu "slow": true chỉ nhận một mảnh mỗi khối để không kéo chậm quá trình tải lên.
Tham gia nhóm
Trên bảng điều khiển quản trị, mở mục Invite someone, nhập tên và bấm Make invite. Bạn sẽ nhận được một lời mời dùng một lần (yggjoin1:…, hiệu lực 7 ngày). Người được mời chạy Yggdrasil đã kết nối và chương trình yggstore, sau đó:
yggstore join -service yggjoin1:…
Lệnh join yêu cầu nút quản trị thêm máy này vào nhóm (qua Yggdrasil, xuất trình lời mời), lưu danh sách thành viên và thêm người mời vào danh bạ. Mỗi lời mời chỉ dùng được một lần; nút quản trị chỉ giữ hash của nó.
Chia sẻ tệp giữa các thành viên
Mỗi người chạy nút và bảng điều khiển riêng. Bảng điều khiển chỉ lắng nghe trên localhost và giữ stub — tức chìa khóa tới tệp của bạn — nên không bao giờ được chia sẻ. Thứ mọi người chia sẻ là mạng lưới các nút.
Để gửi ai đó một mục, thêm họ vào Sharing → Contacts bằng mã chia sẻ (ys1…, hiển thị trên bảng điều khiển của họ), rồi bấm Share. Bạn nhận được tệp .ysend để gửi qua email hay cách khác. Chỉ người đó mở được; tên mục, ghi chú của bạn và khóa đều được niêm phong bên trong.
Thư mục Outbox
Yggstore có cơ chế theo dõi thư mục tự động:
outfiles/— thả tệp vào, mỗi tệp được chia mảnh rồi thay bằngNAME.ystuboutfiles/received/— các mục người khác gửi bạnoutfiles/whole/— tệp hoặc thư mục được lưu nguyên khối (thư mục thành một archive)outfiles/restore/— thả.ystubvào để phục hồioutfiles/delete/— thả.ystubvào để xóa khỏi mọi nút
Một mục chỉ được xử lý khi trông giống nhau qua hai lần quét cách nhau 5 giây, tránh nhầm với tệp đang sao chép dở. Ít nhất 3 máy phải trực tuyến để không máy nào giữ quá 2 trong 6 mảnh của một khối.
Lịch sử phiên bản
Mọi phiên bản đều được lưu lại: bạn có thể phục hồi phiên bản cũ của tệp, hoặc cả thư mục như nó vốn có vào một ngày nhất định. Phiên bản mới chỉ lưu những phần thay đổi, giúp tiết kiệm dung lượng đáng kể.
Các tính năng mở rộng
Ngoài lưu trữ, Yggstore còn cung cấp một số khả năng khác:
- Gateway: cho phép người ngoài trả phí hàng tháng để dùng dung lượng nhóm qua bất kỳ chương trình S3 nào (rclone, Cyberduck, Duplicati). Thành viên tự chọn có nhận dữ liệu khách hàng hay không và được cộng tín dụng.
- Nhắn tin giữa các nút: tin nhắn trực tiếp và các chủ đề ai cũng có thể đăng theo dõi, kể cả gửi đến nút đang tắt lúc đó. Chương trình cũng dùng được qua API cục bộ.
- Không cần cài Yggdrasil: nút có thể chạy tích hợp sẵn, không cần daemon, thiết bị TUN hay quyền root.
- Website trên nhóm: công bố một thư mục, nhiều máy cùng phục vụ nên site vẫn hoạt động khi một máy hỏng.
- Email tới tên miền của bạn: mỗi thư đến được mã hóa riêng cho bạn và đọc trên bảng điều khiển.
Bảng điều khiển
bin/yggstore dashboard -peers peers.json -stubs stubs # http://127.0.0.1:7480
Cứ 3 giây, bảng điều khiển hỏi mỗi máy ngang hàng qua /v1/info (trạng thái, thời gian khứ hồi, số mảnh, dung lượng dùng) và kiểm tra xem các mảnh của mỗi .ystub còn tồn tại không. Một tệp được coi là:
- khỏe mạnh khi mọi khối có đủ 6/6 mảnh
- suy giảm khi còn từ 4 mảnh trở lên
- mất khi dưới 4 mảnh
Nút Verify tiêu tốn một thử thách đã lưu cho mỗi mảnh, còn nhật ký hoạt động ghi lại mọi thay đổi trạng thái.
Kiểm thử và giới hạn
Dự án cung cấp sẵn script thử nghiệm cục bộ (scripts/local-demo.sh) chạy 6 nút trên các cổng khác nhau, và một cụm Docker (scripts/testnet.sh) với 5 nút t1..t5.
Tuy nhiên, cần lưu ý đây vẫn là bằng chứng khái niệm, còn nhiều giới hạn:
- Không máy nào giữ quá 2 trong 6 mảnh, nên chịu được một máy hỏng. Muốn chịu hai hỏng cùng lúc cần từ 6 máy trở lên.
- Stub chỉ nằm ở nơi tạo ra nó. Nếu ổ đĩa máy đó hỏng, các mảnh vẫn còn trong nhóm nhưng không ai giải mã được — hãy sao lưu stub và
sharing.key. - Chưa có cơ chế sửa chữa: nếu một máy biến mất, không có gì tạo lại các mảnh của nó.
- Thử thách phải chạy thủ công, không có chữ ký và không tạo biên nhận.
- Dùng HTTP thuần; tính bảo mật trên đường truyền đến từ mã hóa đầu-cuối của Yggdrasil.
- Các khối được đệm trong bộ nhớ (4 MiB cộng mảnh), không truyền theo luồng.
Kết luận
Yggstore là một thử nghiệm thú vị cho những ai muốn tự chủ dữ liệu và không phụ thuộc vào các dịch vụ đám mây tập trung. Cách tiếp cận kết hợp mã hóa đầu-cuối, mã hóa xóa và mạng lớp phủ Yggdrasil giải quyết khéo léo bài toán tin cậy giữa các bên — như chính tác giả nhấn mạnh, đừng dùng nó làm bản sao duy nhất của bất cứ thứ gì quan trọng.


