Self-hosting do servidor Firefox Sync
(blog.diego.dev)- Depois de migrar do Firefox para o LibreWolf, surgiu a intenção de operar diretamente os dados de sincronização do navegador; após analisar vários repositórios e configurações de Docker, foi montado um servidor funcional
- O antigo syncserver da Mozilla é uma configuração tudo-em-um, mas há um aviso de descontinuação de manutenção, então o syncstorage-rs, baseado em Rust, acabou sendo a opção mais realista
- O procedimento oficial em Docker era difícil de seguir por causa da complexidade de copiar
grpcio,protobufemozilla-rust-sdk, e a configuração comunitária syncstorage-rs-docker acabou servindo como base para a implantação real - A configuração final usa
docker-compose.yamlpara subir o MariaDB 10.6.13 e ofirefox_syncserver, enquanto o Caddy faz proxy reverso parafirefox_syncserver:8000 - Os principais obstáculos foram dados persistentes do banco, falta de espaço de armazenamento e experimentação com o fluxo em Docker; se você não tem familiaridade com Docker ou operação de banco de dados, o nível de dificuldade de configuração é alto
Motivos para migrar de syncserver para syncstorage-rs
- Depois de trocar o Firefox pelo LibreWolf, começou o trabalho de hospedar por conta própria um servidor Firefox Sync
- O primeiro projeto encontrado foi o Mozilla syncserver, um pacote tudo-em-um para self-hosting
- Inclui juntos o tokenserver para autenticação e o syncstorage para armazenamento
- Havia uma tag “failed” no histórico de builds
- O repositório exibia um aviso dizendo que ele não é mais mantido e recomendando migrar para um novo projeto baseado em Rust
- Depois disso, a escolha foi o syncstorage-rs
- É uma versão moderna baseada em Rust do projeto anterior
- Não havia uma imagem Docker pronta para uso imediato
- A documentação mostrava como executar com Docker, mas o fluxo de configuração era complexo
- Houve vários pontos de bloqueio na documentação oficial de Docker
- Havia orientação para alinhar as versões de
grpcioeprotobufcom as usadas porgoogle-cloud-rust-raw - Era preciso copiar manualmente o conteúdo de
mozilla-rust-sdkpara o diretório raiz de nível superior - Mesmo verificando o repositório, o Dockerfile, o Makefile e o workflow do CircleCI, o procedimento seguinte não ficava claro
- Havia orientação para alinhar as versões de
- O syncstorage-rs-docker oferece uma configuração Docker mais simples
- A explicação dizia que, após enfrentar problemas com a documentação original, foi criado um contêiner Docker para a própria infraestrutura
- A configuração real do servidor foi feita com base nessa estrutura
Implantação final com Docker Compose e Caddy
- No
docker-compose.yaml, foram adicionados o MariaDB e o serviço do servidor Firefox Syncfirefox_mariadbusa a imagemlinuxserver/mariadb:10.6.13- O volume de dados do banco foi configurado como
/data/ffsync/dbdata:/config firefox_syncserverfaz build do Dockerfile em/root/ffsynce expõe a porta8000:8000- As principais variáveis de ambiente incluem
SYNC_URL,SYNC_CAPACITY,SYNC_MASTER_SECRET,METRICS_HASH_SECRET,SYNC_SYNCSTORAGE_DATABASE_URLeSYNC_TOKENSERVER_DATABASE_URL
- É melhor evitar caracteres especiais como
"/|%"na senha do banco- Eles podem causar problemas durante a configuração
- Para reduzir o tempo de build durante os testes, foi adicionado o argumento
BUILDKIT_INLINE_CACHEao Docker Compose - A inicialização do banco foi feita clonando o repositório, copiando o Dockerfile e o
initdb.shpara o servidor e fazendo alguns ajustes- Executar o contêiner do MariaDB:
docker-compose up -d firefox_mariadb - Executar o script de inicialização:
chmod +x initdb.sh ./initdb.sh - Subir toda a stack:
docker-compose up -d
- Executar o contêiner do MariaDB:
- O proxy reverso do Caddy foi configurado para apontar para o novo servidor Sync
- O exemplo de configuração conecta
mydomain:443areverse_proxy firefox_syncserver:8000 - Depois de atualizar a entrada DNS, o Caddy foi reiniciado e o servidor Sync passou a funcionar
- O exemplo de configuração conecta
Problemas encontrados na configuração e tempo gasto
- O maior problema foram os dados persistentes do MariaDB, e às vezes era necessário apagar dados antigos ao reiniciar o contêiner
- Com o crescimento das imagens Docker e dos arquivos intermediários, o servidor ficou sem espaço de armazenamento
- Foi preciso experimentar várias vezes a configuração em Docker até encontrar o procedimento correto
- Um servidor Firefox Sync próprio não é algo que se resolve facilmente sem familiaridade com Docker ou administração de banco de dados, mas trabalhos da comunidade como o
syncstorage-rs-dockertornam a configuração viável - A configuração completa levou cerca de 2 horas
1 comentários
Opiniões no Hacker News
Esta configuração ainda depende da infraestrutura da Mozilla para alguns serviços periféricos, como autenticação, e-mail e metadados de conta
https://github.com/dan-r/syncstorage-rs-docker/blob/main/app...
Ainda assim, é um bom ponto de partida e, se você estiver disposto a lidar com a migração de contas, pode adicionar essas partes depois. Também é possível fazer self-hosting completo de todos os componentes, mas dá um pouco mais de trabalho. Em comparação com a última vez que configurei isso, parece que a documentação e a experiência para desenvolvedores melhoraram
https://github.com/mozilla/fxa
https://mozilla.github.io/ecosystem-platform/tutorials/devel...
https://mozilla-services.readthedocs.io/en/latest/howtos/run...
No Firefox for iOS 9.0 ou superior, as instruções diziam para ir às configurações, tocar 5 vezes no número da versão, inserir a URL do content-server em “Advance Account Settings” e ativar “Use Custom Account Service”
https://mozilla-services.readthedocs.io/en/latest/howtos/run...
O Garuda Linux mantém seu próprio servidor Firefox Sync para o navegador FireDragon há bastante tempo
defaultPref("identity.sync.tokenserver.uri", "https://ffsync.garudalinux.org/token/1.0/sync/1.5"); // --> FIREDRAGON CONFIGMas parece que eles rodam o servidor de sincronização antigo, não a versão em Rust
[1] https://firedragon.garudalinux.org/
[2] https://gitlab.com/garuda-linux/infra-nix/-/blob/main/docker...
Também deixei registrado aqui minha experiência com self-hosting
https://kyzer.me.uk/syncserver/
É possível, mas é um trabalho realmente tedioso e pesado. A versão anterior foi abandonada e, escrita em Python 2, estava completamente obsoleta, mas era muito melhor
Não precisa de Docker nem de Python, mas atualmente exige MySQL. Um voluntário está trabalhando para oferecer suporte padrão a SQLite, como na versão antiga, mas os principais contribuidores parecem mais interessados em imitar uma empresa, coletar métricas e escrever textos justificando a adoção de novos frameworks de métricas do que em facilitar o self-hosting
Vale a pena também dar uma olhada ou acompanhar https://github.com/canvas-ai/canvas-browser-extensions
É uma ferramenta que tenta sincronizar abas dos navegadores Chrome/Firefox para uma árvore de diretórios virtual self-hosted, baseada em LMDB e índices de bitmap Roaring. Em retrospectiva, eu deveria ter usado rxdb ou pouchdb desde o início e apenas mantido os bitmaps, mas é para onde vou acabar indo
A ideia é criar um novo caminho de contexto como
universe://travel/2024/03/barcelonaconforme o trabalho em andamento; dependendo da configuração, ao salvar e fechar as abas atuais, novas abas de tarefas, como buscas no Airbnb, são adicionadas a esse contexto. Seu cônjuge também pode abrir o mesmo contexto e colaborar; se a sincronização automática estiver ativada, pode até funcionar fechando as abas um do outroO componente do servidor está sendo reescrito no momento, e é aí que meu amadorismo aparece. Numa base de 2 usuários, dá para fazer a besteira de começar ao mesmo tempo uma reescrita completa da API, do backend e dos módulos, quebrando as funcionalidades existentes de forma irrecuperável. Com as ferramentas atuais, como Cursor e Claude 3.7, a maior limitação para as ideias acaba sendo o tempo
Usei isso por um tempo hospedando até a autenticação por conta própria, mas acabei concluindo que a Mozilla é uma das poucas empresas às quais eu confiaria meus dados. Talvez essa confiança esteja errada. A configuração do servidor de sincronização é relativamente simples, enquanto o servidor de autenticação é muito mais complexo; comparado a usar um serviço hospedado publicamente, não acho que valha tanto a pena
Obrigado. Essa era a única coisa que estava me impedindo de migrar para o LibreWolf
Por enquanto, parece que os únicos mecanismos de banco de dados compatíveis são MySQL e Spanner, mas o suporte a SQLite e Postgres também está em andamento[1]. Se isso for mesclado logo, acho que vai ficar muito mais fácil fazer backup de todo o armazenamento de sincronização em um único arquivo SQLite. Dito isso, se for uma instância multiusuário, talvez seja melhor armazenar no Postgres, que tem melhor suporte a atualizações paralelas
Adição depois de testar: como exatamente posso forçar o Firefox (LibreWolf) a usar a URL auto-hospedada? Existe alguma configuração em
about:config?1: https://github.com/mozilla-services/syncstorage-rs/issues/49...
about:configEla diz para ir em
about:configno Firefox e mudaridentity.sync.tokenserver.uripara http://localhost:5000/1.0/sync/1.5. Claro, é preciso ajustar a URL ao seu ambienteSe o Firefox Sync tem criptografia de ponta a ponta, fico curioso sobre qual é o benefício em termos de privacidade
https://support.mozilla.org/en-US/kb/sync
Algo parecido com o Firefox Sync é o Floccus. Se você só precisa sincronizar favoritos e abas, a configuração parece simples
https://floccus.org/
Seria bom deixar claro que LibreWolf e Waterfox mudaram o fluxo e estão usando o Mozilla Sync Server, e tornar isso opcional, como abaixo
Para sincronizar, escolha uma das opções abaixo:
[x] Custom Sync Server: ___________[ ] Mozilla SyncEstá abandonado há muito tempo e o código é apenas uma prova de conceito horrível, mas ainda assim isso significa que posso fazer um julgamento um pouco embasado sobre o assunto
Para usuários técnicos, acho que o melhor seria os forks do Firefox trocarem o Sync por algo mais padrão, como S3 ou WebDAV. Se minha memória não falha, não há nada no Sync que esses protocolos não consigam lidar da mesma forma, ou até melhor. Isso porque eles são padrões realmente interoperáveis até certo ponto
Eu gostaria que a Mozilla fizesse isso também, mas parece haver uma preferência forte demais por desenvolver tudo internamente, então é difícil ter esperança. Fico muito feliz que essa tendência tenha dado origem ao Rust, mas o Sync é quase um lixo que nunca deveria ter sido criado
https://blog.mozilla.org/services/2011/03/22/get-syncing-wit...
Uma das primeiras perguntas era se você queria usar um Custom Sync Server, e esse “Custom Sync Server” podia ser algo tão simples quanto um servidor WebDAV. Se você tivesse um servidor HTTP público, quase certamente ele já tinha suporte ou só exigia adicionar pouquíssimas dependências. E ele também perguntava por uma chave de criptografia de ponta a ponta separada da chave de login
Parabéns por conseguir auto-hospedar. Dito isso, a solução parece mais complexa do que o necessário. Não deveria ser preciso subir um servidor de banco de dados e Docker para sincronizar uma quantidade muito pequena de dados. Idealmente, seria bom usar SQLite e ter uma implementação de servidor de sincronização que rodasse como um executável independente
Alguém poderia fazer um fork de https://github.com/mozilla-services/syncstorage-rs, remover os acessórios e reimplementá-lo sem o banco de dados auxiliar e sem a arquitetura baseada no Google Cloud. Mas, como em muitas coisas, primeiro seria preciso reunir pessoas com interesse e tempo livre suficientes para desenvolver isso
https://github.com/mozilla-services/syncstorage-rs/issues/49...