Tự host máy chủ Firefox Sync
(blog.diego.dev)- Sau khi chuyển từ Firefox sang LibreWolf, tác giả muốn tự vận hành dữ liệu đồng bộ trình duyệt và, sau khi xem xét nhiều kho lưu trữ cùng cấu hình Docker, đã dựng được một máy chủ hoạt động
- syncserver cũ của Mozilla là cấu hình tất cả trong một, nhưng do có cảnh báo ngừng bảo trì, syncstorage-rs dựa trên Rust trở thành lựa chọn thực tế hơn
- Quy trình Docker chính thức khó làm theo vì các bước sao chép
grpcio,protobuf,mozilla-rust-sdkphức tạp; cấu hình syncstorage-rs-docker của cộng đồng trở thành nền tảng triển khai thực tế - Cấu hình cuối cùng dùng
docker-compose.yamlđể chạy MariaDB 10.6.13 vàfirefox_syncserver, còn Caddy reverse proxy tớifirefox_syncserver:8000 - Dữ liệu bền vững của DB, thiếu dung lượng lưu trữ và việc thử nghiệm quy trình Docker là các trở ngại chính; nếu không quen vận hành Docker hoặc DB thì độ khó cấu hình khá cao
Lý do chuyển từ syncserver sang syncstorage-rs
- Sau khi chuyển từ Firefox sang LibreWolf, tác giả bắt đầu tự host máy chủ Firefox Sync
- Mozilla syncserver tìm thấy ban đầu là một gói tất cả trong một dành cho tự host
- Bao gồm cả tokenserver để xác thực và syncstorage để lưu trữ
- Lịch sử build có tag “failed”
- Kho lưu trữ hiển thị cảnh báo rằng dự án không còn được bảo trì và nên chuyển sang dự án mới dựa trên Rust
- Sau đó tác giả chọn syncstorage-rs
- Đây là phiên bản dựa trên Rust hiện đại của dự án cũ
- Không có image Docker sẵn dùng ngay
- Tài liệu có cách chạy bằng Docker, nhưng luồng cấu hình phức tạp
- Có nhiều điểm bị vướng trong tài liệu Docker chính thức
- Hướng dẫn yêu cầu khớp phiên bản
grpciovàprotobufvới phiên bản màgoogle-cloud-rust-rawsử dụng - Phải sao chép thủ công nội dung
mozilla-rust-sdkvào thư mục gốc cấp cao nhất - Dù đã kiểm tra kho lưu trữ, Dockerfile, Makefile và workflow CircleCI, các bước tiếp theo vẫn không rõ ràng
- Hướng dẫn yêu cầu khớp phiên bản
- syncstorage-rs-docker cung cấp cấu hình Docker đơn giản hơn
- Phần mô tả cho biết tác giả đã gặp vấn đề với tài liệu gốc rồi tự tạo container Docker cho hạ tầng của mình
- Dựa trên cấu hình này, tác giả tiến hành thiết lập máy chủ thực tế
Cấu hình triển khai hoàn chỉnh bằng Docker Compose và Caddy
- Trong
docker-compose.yaml, tác giả thêm các service MariaDB và máy chủ Firefox Syncfirefox_mariadbdùng imagelinuxserver/mariadb:10.6.13- Volume dữ liệu DB được đặt là
/data/ffsync/dbdata:/config firefox_syncserverbuild Dockerfile trong/root/ffsyncvà expose cổng8000:8000- Các biến môi trường chính gồm
SYNC_URL,SYNC_CAPACITY,SYNC_MASTER_SECRET,METRICS_HASH_SECRET,SYNC_SYNCSTORAGE_DATABASE_URL,SYNC_TOKENSERVER_DATABASE_URL
- Nên tránh ký tự đặc biệt như
"/|%"trong mật khẩu DB- Chúng có thể gây vấn đề trong quá trình cấu hình
- Trong lúc kiểm thử, tác giả thêm tham số
BUILDKIT_INLINE_CACHEvào Docker Compose để giảm thời gian build - Việc khởi tạo DB được thực hiện bằng cách clone kho lưu trữ, rồi sao chép Dockerfile và
initdb.shlên máy chủ, chỉnh sửa một phần- Chạy container MariaDB:
docker-compose up -d firefox_mariadb - Chạy script khởi tạo:
chmod +x initdb.sh ./initdb.sh - Chạy toàn bộ stack:
docker-compose up -d
- Chạy container MariaDB:
- Reverse proxy Caddy được cấu hình để trỏ tới máy chủ Sync mới
- Ví dụ cấu hình là kết nối từ
mydomain:443tớireverse_proxy firefox_syncserver:8000 - Sau khi cập nhật bản ghi DNS, tác giả khởi động lại Caddy và máy chủ Sync hoạt động
- Ví dụ cấu hình là kết nối từ
Các trở ngại gặp phải trong quá trình cấu hình và thời gian thực hiện
- Vấn đề lớn nhất là dữ liệu bền vững của MariaDB; khi khởi động lại container, cần xóa dữ liệu cũ nếu cần
- Image Docker và các tệp trung gian phình to khiến máy chủ thiếu dung lượng lưu trữ
- Phải thử nghiệm cấu hình Docker nhiều lần trước khi tìm được quy trình đúng
- Tự vận hành máy chủ Firefox Sync không phải việc dễ hoàn tất nếu không quen quản lý Docker hoặc DB, nhưng có thể cấu hình được nhờ các dự án cộng đồng như
syncstorage-rs-docker - Toàn bộ quá trình thiết lập mất khoảng 2 giờ
1 bình luận
Ý kiến trên Hacker News
Cấu hình này vẫn phụ thuộc vào hạ tầng Mozilla cho một số dịch vụ phụ trợ như xác thực, email và metadata tài khoản
https://github.com/dan-r/syncstorage-rs-docker/blob/main/app...
Dù vậy đây vẫn là một điểm khởi đầu tốt, và nếu chấp nhận migrate tài khoản thì sau này có thể ghép thêm các phần đó. Cũng có thể tự host hoàn toàn mọi thành phần, nhưng sẽ tốn công hơn một chút. So với lần cuối tôi thiết lập trước đây thì có vẻ tài liệu và trải nghiệm cho developer đã được cải thiện
https://github.com/mozilla/fxa
https://mozilla.github.io/ecosystem-platform/tutorials/devel...
https://mozilla-services.readthedocs.io/en/latest/howtos/run...
Trên Firefox for iOS 9.0 trở lên, hướng dẫn từng ghi là vào phần cài đặt, chạm vào số phiên bản 5 lần, nhập content-server URL trong “Advance Account Settings”, rồi bật “Use Custom Account Service”
https://mozilla-services.readthedocs.io/en/latest/howtos/run...
Garuda Linux đã vận hành máy chủ Firefox Sync riêng cho trình duyệt FireDragon của họ từ khá lâu rồi
defaultPref("identity.sync.tokenserver.uri", "https://ffsync.garudalinux.org/token/1.0/sync/1.5"); // --> FIREDRAGON CONFIGTuy vậy có vẻ họ đang chạy máy chủ đồng bộ cũ chứ không phải bản Rust
[1] https://firedragon.garudalinux.org/
[2] https://gitlab.com/garuda-linux/infra-nix/-/blob/main/docker...
Tôi cũng đã ghi lại trải nghiệm tự host của mình ở đây
https://kyzer.me.uk/syncserver/
Làm được, nhưng thật sự là một công việc rất tẻ nhạt và vất vả. Bản trước đã bị bỏ rơi và viết bằng Python 2 nên lỗi thời hoàn toàn, nhưng lại tốt hơn nhiều
Không cần Docker hay Python, nhưng hiện giờ lại cần MySQL. Có một tình nguyện viên đang làm để hỗ trợ SQLite mặc định như bản cũ, nhưng các contributor chính dường như quan tâm đến việc giả làm công ty, viết bài để biện minh cho việc thu thập số liệu và đưa vào framework đo lường mới hơn là làm cho self-hosting trở nên dễ dàng
Cũng nên xem hoặc theo dõi https://github.com/canvas-ai/canvas-browser-extensions
Đây là một công cụ muốn đồng bộ các tab Chrome/Firefox vào một cây thư mục ảo tự host, chạy trên LMDB và chỉ mục bitmap Roaring. Nghĩ lại thì ngay từ đầu đáng lẽ nên dùng rxdb hoặc pouchdb và chỉ giữ lại bitmap, và cuối cùng cũng sẽ đi theo hướng đó
Theo quy trình này, bạn tạo một đường dẫn ngữ cảnh mới như
universe://travel/2024/03/barcelonacho việc đang làm, lưu rồi đóng tab hiện tại theo cấu hình, sau đó thêm các tab tác vụ mới như tìm kiếm Airbnb vào ngữ cảnh đó. Vợ/chồng bạn cũng có thể mở cùng ngữ cảnh để cùng làm việc, và nếu bật tự động đồng bộ thì thậm chí có thể hoạt động theo kiểu đóng tab của nhauThành phần máy chủ hiện đang được viết lại, và đó là chỗ thể hiện rõ tính nghiệp dư của tôi. Với một nền tảng chỉ có 2 người dùng, bạn hoàn toàn có thể làm điều ngớ ngẩn như đồng thời bắt đầu viết lại toàn bộ API, backend và module rồi phá hỏng các tính năng hiện có đến mức không thể khôi phục. Với các công cụ ngày nay như Cursor và Claude 3.7, giới hạn lớn nhất của ý tưởng rốt cuộc vẫn là thời gian
Tôi từng tự host cả phần xác thực và dùng như vậy một thời gian, nhưng cuối cùng lại thấy Mozilla là một trong số rất ít công ty mà tôi gần như có thể giao dữ liệu cho. Có thể niềm tin đó là sai. Máy chủ đồng bộ tương đối đơn giản để thiết lập, còn máy chủ xác thực thì phức tạp hơn nhiều, nên so với việc dùng dịch vụ host công khai thì tôi không thấy nó đáng công đến vậy
Cảm ơn. Đây là phần duy nhất khiến tôi chưa chuyển sang LibreWolf.
Có vẻ hiện tại chỉ hỗ trợ các engine cơ sở dữ liệu là MySQL và Spanner, nhưng cũng đang triển khai hỗ trợ SQLite và Postgres[1]. Nếu được gộp sớm thì việc sao lưu toàn bộ kho lưu trữ đồng bộ vào một file SQLite duy nhất sẽ dễ hơn nhiều. Tuy vậy, nếu là instance nhiều người dùng thì có lẽ vẫn nên lưu vào Postgres, vì nó hỗ trợ cập nhật song song tốt hơn.
Bổ sung sau khi tự thử: chính xác thì làm sao để buộc Firefox (LibreWolf) dùng URL self-hosted? Có thiết lập
about:confignào không?1: https://github.com/mozilla-services/syncstorage-rs/issues/49...
about:configlà đủ.Trong Firefox, vào
about:configvà đổiidentity.sync.tokenserver.urithành http://localhost:5000/1.0/sync/1.5. Tất nhiên, URL cần được thay theo môi trường của bạn.Nếu Firefox Sync được mã hóa đầu cuối, tôi thắc mắc lợi ích về quyền riêng tư ở đây là gì.
https://support.mozilla.org/en-US/kb/sync
Có thứ tương tự Firefox Sync là Floccus. Nếu bạn chỉ cần đồng bộ bookmark và tab thì có vẻ cấu hình khá đơn giản.
https://floccus.org/
Sẽ tốt hơn nếu làm rõ rằng LibreWolf và Waterfox đã đổi hướng để dùng Mozilla Sync Server, rồi biến nó thành tùy chọn như bên dưới:
Để đồng bộ, hãy chọn một trong các tùy chọn sau:
[x] Custom Sync Server: ___________[ ] Mozilla SyncNó đã bị bỏ bê từ lâu và mã nguồn chỉ là một bản chứng minh khái niệm khá tệ, nhưng ít nhất điều đó có nghĩa là tôi có chút cơ sở để đưa ra nhận định về chủ đề này.
Với người dùng kỹ thuật, tôi nghĩ tốt nhất là các bản fork của Firefox nên thay Sync bằng thứ tiêu chuẩn hơn như S3 hoặc WebDAV. Nếu tôi nhớ không nhầm thì Sync hoàn toàn không có tính năng nào mà các giao thức đó không xử lý được tương đương, thậm chí còn tốt hơn. Đó là vì chúng thực sự là các tiêu chuẩn có mức độ tương thích nhất định.
Tôi cũng mong Mozilla làm vậy, nhưng có vẻ họ quá thiên về tự phát triển nên khó mà kỳ vọng. Tôi rất mừng vì xu hướng đó đã sinh ra Rust, nhưng bản thân Sync thì gần như là một đống rác lẽ ra không nên được tạo ra ngay từ đầu.
https://blog.mozilla.org/services/2011/03/22/get-syncing-wit...
Một trong những câu hỏi đầu tiên là có dùng Custom Sync Server hay không, và “Custom Sync Server” này thậm chí có thể đơn giản như một máy chủ WebDAV. Nếu bạn có một máy chủ HTTP công khai thì gần như đã được hỗ trợ sẵn, hoặc chỉ cần thêm rất ít phụ thuộc. Ngoài ra, nó còn hỏi cả khóa mã hóa đầu cuối tách biệt với khóa đăng nhập.
Việc self-host thành công là điều đáng chúc mừng. Tuy nhiên, giải pháp này có vẻ phức tạp hơn mức cần thiết. Không nên phải dựng cả máy chủ cơ sở dữ liệu lẫn Docker chỉ để đồng bộ một lượng dữ liệu rất nhỏ. Lý tưởng nhất là dùng SQLite và có một triển khai máy chủ đồng bộ dạng tệp thực thi độc lập.
Ai đó hoàn toàn có thể fork https://github.com/mozilla-services/syncstorage-rs rồi lược bỏ phần rườm rà và triển khai lại mà không cần cơ sở dữ liệu phụ trợ hay kiến trúc dựa trên Google Cloud. Nhưng cũng như nhiều việc khác, trước hết cần có những người đủ quan tâm và có thời gian rảnh để phát triển nó.
https://github.com/mozilla-services/syncstorage-rs/issues/49...