Firefox Sync sunucusunu self-host etmek
(blog.diego.dev)- Firefox'tan LibreWolf'a geçtikten sonra tarayıcı senkronizasyon verilerini doğrudan kendim işletmek istedim; çeşitli depoları ve Docker yapılandırmalarını inceledikten sonra çalışan bir sunucu kurdum
- Mozilla'nın mevcut syncserver çözümü hepsi bir arada bir yapı sunsa da bakımının durdurulduğuna dair uyarı vardı; bu yüzden Rust tabanlı syncstorage-rs daha gerçekçi bir seçenek oldu
- Resmî Docker süreci
grpcio,protobuf,mozilla-rust-sdkkopyalama adımları nedeniyle karmaşıktı ve takip etmesi zordu; topluluğun hazırladığı syncstorage-rs-docker yapılandırması fiilî dağıtım temeli oldu - Nihai kurulumda
docker-compose.yamlile MariaDB 10.6.13 vefirefox_syncserverayağa kaldırılıyor, Caddy isefirefox_syncserver:8000adresine reverse proxy yapıyor - DB kalıcı verisi, yetersiz depolama alanı ve Docker sürecini deneme-yanılma ile çözmek başlıca engellerdi; Docker veya DB işletimine alışık değilseniz kurulum zorluk seviyesi yüksek
syncserver'dan syncstorage-rs'ye geçme nedeni
- Firefox'tan LibreWolf'a geçtikten sonra Firefox Sync sunucusunu kendim self-host etmeye başladım
- İlk bulduğum Mozilla syncserver, self-hosting için hepsi bir arada bir paketti
- Kimlik doğrulama için tokenserver ve depolama için syncstorage bileşenlerini birlikte içeriyordu
- Derleme geçmişinde “failed” etiketi vardı
- Depoda artık bakım yapılmadığı ve Rust tabanlı yeni projeye geçilmesi gerektiği uyarısı yer alıyordu
- Sonrasında syncstorage-rs tercih edildi
- Mevcut projenin modern bir Rust tabanlı sürümü
- Hazır kullanılabilecek bir Docker imajı yoktu
- Belgelerde Docker ile çalıştırma yöntemi vardı ama yapılandırma akışı karmaşıktı
- Resmî Docker belgelerinde takıldığım birkaç nokta oldu
grpcioveprotobufsürümlerinin,google-cloud-rust-rawtarafından kullanılan sürümlerle eşleştirilmesi isteniyordumozilla-rust-sdkiçeriğinin en üst kök dizine elle kopyalanması gerekiyordu- Depoyu, Dockerfile'ı, Makefile'ı ve CircleCI workflow'unu kontrol etmeme rağmen sonraki adımlar net değildi
- syncstorage-rs-docker daha basit bir Docker yapılandırması sunuyor
- Açıklamasında, özgün belgelerde sorun yaşadıktan sonra kendi altyapıları için Docker konteyneri oluşturdukları belirtiliyordu
- Gerçek sunucu kurulumunu bu yapılandırmayı temel alarak yaptım
Docker Compose ve Caddy ile tamamlanan dağıtım yapısı
docker-compose.yamliçine MariaDB ve Firefox Sync sunucusu servisleri eklendifirefox_mariadb,linuxserver/mariadb:10.6.13imajını kullanıyor- DB veri volume'ü
/data/ffsync/dbdata:/configolarak ayarlanıyor firefox_syncserver,/root/ffsynciçindeki Dockerfile'dan build ediliyor ve8000:8000portunu açıyor- Başlıca ortam değişkenleri arasında
SYNC_URL,SYNC_CAPACITY,SYNC_MASTER_SECRET,METRICS_HASH_SECRET,SYNC_SYNCSTORAGE_DATABASE_URL,SYNC_TOKENSERVER_DATABASE_URLyer alıyor
- DB parolasında
"/|%"gibi özel karakterlerden kaçınmak iyi olabilir- Kurulum sırasında sorun çıkarabiliyordu
- Testler sırasında build süresini kısaltmak için Docker Compose'a
BUILDKIT_INLINE_CACHEargümanı eklendi - DB başlatma işlemi, depo klonlandıktan sonra Dockerfile ve
initdb.shdosyasının sunucuya kopyalanıp kısmen düzenlenmesiyle yapıldı- MariaDB konteynerini çalıştırma:
docker-compose up -d firefox_mariadb - Başlatma betiğini çalıştırma:
chmod +x initdb.sh ./initdb.sh - Tüm stack'i çalıştırma:
docker-compose up -d
- MariaDB konteynerini çalıştırma:
- Caddy reverse proxy, yeni Sync sunucusuna işaret edecek şekilde yapılandırıldı
- Örnek yapılandırmada
mydomain:443adresindenreverse_proxy firefox_syncserver:8000hedefine bağlanıyor - DNS girdileri güncellendikten sonra Caddy yeniden başlatıldı ve Sync sunucusu çalıştı
- Örnek yapılandırmada
Kurulum sırasında karşılaşılan sorunlar ve harcanan süre
- En büyük sorun MariaDB kalıcı verisi oldu; konteyner yeniden başlatıldığında gerekirse eski verilerin silinmesi gerekiyordu
- Docker imajları ve ara dosyalar büyüdükçe sunucudaki depolama alanı yetersiz kaldı
- Doğru süreci bulmak için Docker yapılandırması üzerinde birkaç kez deneme yapmak gerekti
- Kendi Firefox Sync sunucusunu kurmak, Docker veya DB yönetimine aşina değilseniz kolayca biten bir iş değil; ancak
syncstorage-rs-dockergibi topluluk çalışmaları sayesinde mümkün oldu - Tüm kurulum yaklaşık 2 saat sürdü
1 yorum
Hacker News yorumları
Bu kurulum da kimlik doğrulama, e-posta, hesap meta verileri gibi birkaç çevresel hizmet için hâlâ Mozilla altyapısına bağımlı
https://github.com/dan-r/syncstorage-rs-docker/blob/main/app...
Yine de iyi bir başlangıç noktası; hesap migrasyonunu göze alabiliyorsanız bu parçaları sonradan ekleyebilirsiniz. Tüm bileşenleri tamamen self-host etmek de mümkün, ama biraz daha fazla uğraş istiyor. En son kurduğum zamana kıyasla dokümantasyon ve geliştirici deneyimi iyileşmiş görünüyor
https://github.com/mozilla/fxa
https://mozilla.github.io/ecosystem-platform/tutorials/devel...
https://mozilla-services.readthedocs.io/en/latest/howtos/run...
Firefox for iOS 9.0 ve üzeri için ayarlara gidip sürüm numarasına 5 kez dokunmak, “Advance Account Settings” bölümünde content-server URL'sini girmek ve “Use Custom Account Service” seçeneğini açmak gerektiği yazıyordu
https://mozilla-services.readthedocs.io/en/latest/howtos/run...
Garuda Linux, FireDragon tarayıcısı için kendi Firefox Sync sunucusunu epey uzun süredir işletiyor
defaultPref("identity.sync.tokenserver.uri", "https://ffsync.garudalinux.org/token/1.0/sync/1.5"); // --> FIREDRAGON CONFIGAncak Rust sürümü değil, eski senkronizasyon sunucusunu çalıştırıyor gibi görünüyor
[1] https://firedragon.garudalinux.org/
[2] https://gitlab.com/garuda-linux/infra-nix/-/blob/main/docker...
Kendi self-hosting deneyimimi de burada derledim
https://kyzer.me.uk/syncserver/
Mümkün ama gerçekten sıkıcı ve zahmetli bir iş. Önceki sürüm terk edilmişti ve Python 2 ile yazıldığı için tamamen eskimişti, ama çok daha iyiydi
Docker da Python da gerekmiyor, fakat şu anda MySQL gerekiyor. Bir gönüllü, eski sürümde olduğu gibi varsayılan olarak SQLite desteği sunması için çalışıyor; ancak ana katkı verenler, self-hosting'i kolaylaştırmaktan çok, şirket gibi davranıp metrik toplamayı ve yeni metrik framework'leri devreye almayı meşrulaştıran yazılar yazmaya daha yakın görünüyor
https://github.com/canvas-ai/canvas-browser-extensions projesine de bakmak ya da takip etmek iyi olabilir
Chrome/Firefox tarayıcı sekmelerini, LMDB ve Roaring bitmap indeksleriyle çalışan self-hosted sanal bir dizin ağacına senkronize etmeye yarayan bir araç. Geriye dönüp bakınca en baştan rxdb veya pouchdb kullanıp yalnızca bitmap'i korumalıydım; ama sonunda o yöne gideceğim
Yaptığınız işe göre
universe://travel/2024/03/barcelonagibi yeni bir bağlam yolu oluşturup, ayara bağlı olarak mevcut sekmeyi kaydedip kapatıyor; ardından Airbnb araması gibi yeni iş sekmelerini o bağlama ekleyen bir akış. Eşiniz de aynı bağlamı açıp birlikte çalışabilir; otomatik senkronizasyon açıksa birbirinizin sekmelerini kapatır gibi de işleyebilirSunucu bileşeni şu anda yeniden yazılıyor; amatörlüğümün ortaya çıktığı yer de burası. 2 kullanıcılı bir temelde, tüm API'yi, backend'i ve modülleri aynı anda yeniden yazmaya başlayıp mevcut işlevleri geri döndürülemez biçimde bozmak gibi aptalca bir şey bile mümkün. Günümüz araçlarıyla, örneğin Cursor ve Claude 3.7 ile, fikirlerin en büyük sınırı nihayetinde zaman oluyor
Kimlik doğrulamayı da kendim host ederek bir süre böyle kullandım; ama sonunda Mozilla'nın verilerimi emanet edebileceğim çok az şirketten biri olduğunu düşünmeye başladım. Bu güven yanlış da olabilir. Senkronizasyon sunucusunu kurmak nispeten basitken kimlik doğrulama sunucusu çok daha karmaşık; herkese açık bir hosting hizmeti kullanmakla kıyaslayınca buna pek değmediğini düşünüyorum
Teşekkürler. LibreWolf’a geçmemi engelleyen tek şey buydu.
Şu anda desteklenen veritabanı motorları yalnızca MySQL ve Spanner gibi görünüyor, ancak SQLite ve Postgres desteği üzerinde de çalışılıyor[1]. Hızla birleştirilirse, tüm sync depolamasını tek bir SQLite dosyası olarak yedeklemek çok daha kolay olacak gibi. Ancak çok kullanıcılı bir instance söz konusuysa, paralel güncelleme desteği daha iyi olan Postgres’te tutmak daha mantıklı olabilir.
Denedikten sonra ekleme: Firefox’un (LibreWolf) self-hosted URL kullanmasını tam olarak nasıl zorlayabiliriz? Bir
about:configayarı var mı?1: https://github.com/mozilla-services/syncstorage-rs/issues/49...
about:configdeğişkenini değiştirmek yeterli görünüyor.Firefox’ta
about:config’e gidipidentity.sync.tokenserver.urideğerini http://localhost:5000/1.0/sync/1.5 olarak değiştirmek gerektiği yazıyor. Elbette URL’yi kendi ortamınıza göre değiştirmeniz gerekir.Firefox Sync uçtan uca şifreliyse, gizlilik açısından avantajının ne olduğunu merak ediyorum.
https://support.mozilla.org/en-US/kb/sync
Firefox Sync’e benzer olarak Floccus var. Yalnızca yer imleri ve sekme senkronizasyonu gerekiyorsa kurulumu basit görünüyor.
https://floccus.org/
LibreWolf ve Waterfox’un akışı değiştirip Mozilla Sync Server kullandığını netleştirseler ve aşağıdaki gibi isteğe bağlı hâle getirseler iyi olurdu:
Senkronizasyon için aşağıdaki seçeneklerden birini seçin:
[x] Custom Sync Server: ___________[ ] Mozilla SyncUzun süredir bakımsız ve kod berbat bir kavram kanıtından ibaret, ama yine de bu konuda az da olsa dayanaklı bir değerlendirme yapabileceğim anlamına geliyor.
Teknik kullanıcılar için Firefox fork’larının Sync yerine S3 veya WebDAV gibi daha standart bir şeye geçmesinin en iyisi olduğunu düşünüyorum. Yanlış hatırlamıyorsam Sync’te bu protokollerin aynı şekilde, hatta daha iyi yapamayacağı hiçbir özellik yok. Çünkü onlar gerçekten bir ölçüde birlikte çalışabilir standartlar.
Mozilla da bunu yapsa iyi olurdu, ama kurum içi geliştirme eğilimi fazla güçlü göründüğünden bunu beklemek zor. Bu eğilim sayesinde Rust’ın ortaya çıkmış olmasına çok seviniyorum, ama Sync en başta yapılmaması gereken çöpe yakın bir şey.
https://blog.mozilla.org/services/2011/03/22/get-syncing-wit...
İlk sorulardan biri Custom Sync Server kullanıp kullanmayacağınızdı ve bu “Custom Sync Server” WebDAV sunucusu kadar basit bir şey bile olabiliyordu. Herkese açık bir HTTP sunucunuz varsa, büyük ihtimalle zaten destekliyordu ya da çok az bağımlılık eklemek yeterliydi. Ayrıca oturum açma anahtarından ayrı olarak uçtan uca şifreleme anahtarı da soruluyordu.
Self-hosting’i başarmış olmanız tebrik edilecek bir şey. Yine de çözüm gereğinden fazla karmaşık görünüyor. Çok az miktarda veriyi senkronize etmek için bir veritabanı sunucusu ve Docker kurmak gerekmemeli. İdeal olarak SQLite kullanan, tek başına çalıştırılabilir bir sync sunucusu uygulaması olsa iyi olurdu.
Birileri https://github.com/mozilla-services/syncstorage-rs reposunu fork’layıp ek bileşenleri ayıklayarak, yardımcı veritabanları ve Google Cloud tabanlı mimari olmadan yeniden uygulayabilir. Ancak birçok işte olduğu gibi, önce yeterli ilgiye ve boş zamana sahip insanları bir araya getirip geliştirmek gerekir.
https://github.com/mozilla-services/syncstorage-rs/issues/49...