1 điểm bởi GN⁺ 2025-03-03 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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-sdk phứ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.13firefox_syncserver, còn Caddy reverse proxy tới firefox_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 grpcioprotobuf với phiên bản mà google-cloud-rust-raw sử dụng
    • Phải sao chép thủ công nội dung mozilla-rust-sdk và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
  • 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 Sync
    • firefox_mariadb dùng image linuxserver/mariadb:10.6.13
    • Volume dữ liệu DB được đặt là /data/ffsync/dbdata:/config
    • firefox_syncserver build Dockerfile trong /root/ffsync và expose cổng 8000: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_CACHE và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.sh lê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
  • 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:443 tới reverse_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

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

 
GN⁺ 2025-03-03
Ý 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ước đây có vẻ Firefox iOS cho phép cấu hình để dùng máy chủ FxA/Sync khác, nhưng tìm lại thì có vẻ tùy chọn đó đã biến mất
      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...
    • Biết đâu một ngày nào đó toàn bộ stack có thể được gói vào một container Docker duy nhất kèm script shell để cấu hình
    • Tôi thắc mắc vì sao email lại phụ thuộc vào hạ tầng Mozilla
    • Bỏ qua bước trung gian và dùng thẳng Google là được
  • 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 CONFIG
    Tuy 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/barcelona cho 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 nhau
    Thà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

    • Mozilla gần như đã đốt sạch thiện cảm còn sót lại bằng vụ lùm xùm “terms of use”. Dù vậy vẫn còn LibreWolf như một bản fork tôn trọng quyền riêng tư
    • Nếu Mozilla đang tự tái định vị thành một công ty quảng cáo, và nhận phần lớn nguồn tiền, có lẽ cả định hướng nữa, từ Google thì ít nhất niềm tin đó cũng nên bị đặt dấu hỏi
    • Nhận định đó đã nhanh chóng trở thành một câu nói lỗi thời
  • 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:config nào không?
    1: https://github.com/mozilla-services/syncstorage-rs/issues/49...

    • Xem tài liệu(https://github.com/mozilla-services/syncstorage-rs?tab=readm...) thì có vẻ chỉ cần thay đổi biến trong about:config là đủ.
      Trong Firefox, vào about:config và đổi identity.sync.tokenserver.uri thà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.
    • LibreWolf cũng có thể dùng máy chủ đồng bộ của Mozilla. Không nhất thiết phải self-host chỉ để dùng đồng bộ.
  • 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

    • Theo những gì tôi biết thì trang đăng nhập và mã JavaScript vẫn được phân phối qua Internet, và khóa mã hóa chỉ được dẫn xuất từ mật khẩu. Đây không phải là thiết kế tốt cho thứ nhạy cảm như toàn bộ dữ liệu trình duyệt.
  • 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 Sync

    • LibreWolf vốn đã là dạng tùy chọn rồi; nếu ai đó tích vào ô “Firefox Sync” mà lại nghĩ đó là một kiểu đồng bộ khác không phải Firefox Sync, thì thật khó để bất kỳ thay đổi UI nào có thể giúp được.
    • Thực ra Sync chỉ là một blob store bị thiết kế quá mức một cách kinh khủng. Tôi từng triển khai một máy chủ Accounts+Sync thay thế khi 1.5 ra mắt: https://gitlab.com/drdaeman/firesync/
      Nó đã 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.
    • Nói để lưu lại hồ sơ thì Firefox Sync trong một thời gian khá dài đã từng hoạt động đúng theo kiể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.

    • Về lý thuyết thì có thể tạo một máy chủ đồng bộ đơn giản chỉ triển khai các endpoint cần thiết. Hướng dẫn kiểu này là để chạy máy chủ đồng bộ do Mozilla chính thức duy trì, mà đương nhiên được xây dựng theo tiêu chuẩn phục vụ hàng triệu người dùng chứ không phải một triển khai tối thiểu cho homelab.
      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ó.
    • Đúng, nhưng dù vậy thì chỉ riêng việc có thể self-host cũng đã có ý nghĩa rồi. Nhiều trình duyệt thậm chí còn không làm được điều đó.
    • Có một yêu cầu gộp đang mở.
      https://github.com/mozilla-services/syncstorage-rs/issues/49...