Eigener Sync-Server für Firefox (Rust): Difference between revisions
(paste working config) |
|||
(11 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
<b>Firefox Sync</b> ist ein Service zum Synchronisieren von Bookmarks, Passwörtern und Browser History |
<b><i>Firefox Sync</i></b> ist ein Service zum Synchronisieren von Bookmarks, Passwörtern und Browser History. |
||
Diese werden zentral auf Mozilla-Servern verschlüsselt gespeichert.[https://hacks.mozilla.org/2018/11/firefox-sync-privacy/] |
|||
Der Dienst ist Open Source (MPLv2) und lässt sich selbst hosten. |
|||
Derzeit läuft in der Informatik ein [[eigener Sync-Server für Firefox]] der Version 1.5. Seitdem gab es eine Neuimplementierung in Rust[https://github.com/mozilla-services/syncstorage-rs/]. |
|||
Bei diesem Artikel handelt es sich um das Aufsetzen und Einrichten der Rust-Neuimplementierung. |
|||
== Aufbau == |
== Aufbau == |
||
Line 6: | Line 10: | ||
* Account Service |
* Account Service |
||
* Sync Storage |
|||
* Sync Storage: Derzeit muss leider zusätzlich zu dem Rust-Storage der legacy python2 syncserver laufen.[3] |
|||
* Podman, Ansible?, Rust sync server, legacy python2 server, |
|||
Beide lassen sich mit der gleichen Datenbank und mit dem gleichen Programm parallel laufen lassen. |
|||
== Schritte == |
|||
Zwischenzeitlich sah es so aus, als müsste zusätzlich zu dem Rust-Storage der legacy python2 syncserver als tokenserver laufen[https://github.com/mozilla-services/syncstorage-rs/tree/fca795e3c09c7feee12b450791a53bb0a2871b48#connecting-to-firefox]. |
|||
Dies stellte sich als veraltete Information heraus. |
|||
Der syncstorage-rs implementiert nun auch den Tokenserver und das Setup kommt ohne den legacy python2 syncserver aus. |
|||
=== Ausblick === |
|||
Der nächste nahe liegende Schritt ist das Setup mit Docker bzw. Podman zu erweitern und möglicherweise mittels Ansible zu verwalten. |
|||
Die Einrichtung mit Podman wird kurz gezeigt. Die Kombination mit Ansible wird nicht betrachtet. |
|||
== Schritte für native Konfiguration (ohne Virtualisierung) == |
|||
Die Installation wird auf [https://archlinux.org Arch Linux] im Oktober 2022 durchgeführt. |
|||
Die Technologien und Konfigurationen verändern sich mit der Zeit, vor allem bei der Konfiguration von dem Syncstorage-Server sollte auf die aktuelle Beispielconfig geschaut werden. |
|||
Die Anleitung auf dieser Seite nimmt [https://github.com/mozilla-services/syncstorage-rs/blob/3a18de01bbf5b5c0bcb87d4176fde14840629ae2/config/local.example.toml] als Basis. |
|||
=== Einrichten von Mysql für Sync-Server === |
=== Einrichten von Mysql für Sync-Server === |
||
Line 21: | Line 38: | ||
[mariadb]$ GRANT ALL PRIVILEGES on syncstorage_rs.* to syncstorage; |
[mariadb]$ GRANT ALL PRIVILEGES on syncstorage_rs.* to syncstorage; |
||
Tabellen für tokenserver erstellen.[https://github.com/mozilla-services/syncstorage-rs/blob/3a21947cf58df29809f406d689c4be3afa97e38e/syncstorage/src/tokenserver/README.md#database] |
|||
Tabellen für tokenserver erstellen.[4] Hier verwende ich die gleiche Datenbank `syncstorage_rs` für den Tokenserver, da sich die Tabellennamen nicht überschneiden und es so auch in der AUR-Diskussion beschrieben wird. |
|||
Hier verwende ich die gleiche Datenbank `syncstorage_rs` für den Tokenserver, da sich die Tabellennamen nicht überschneiden und es so auch in der AUR-Diskussion beschrieben wird. |
|||
Die Konsole befindet sich im Git-Verzeichnis von https://github.com/mozilla-services/syncstorage-rs |
Die Konsole befindet sich im Git-Verzeichnis von https://github.com/mozilla-services/syncstorage-rs |
||
Line 35: | Line 53: | ||
$ make run |
$ make run |
||
=== |
=== Konfiguratoin vom Sync-Server === |
||
In Configdatei: <code>config/local.example.toml</code> ist eine Beispielkonfiguration, die nach `config/local.toml` kopiert und angepasst werden muss. |
|||
In Configdatei: `mysql://syncstorage:**hidden**@localhost/syncstorage` |
|||
$ head -c 20 /dev/urandom | sha1sum # generieren des master_secrets |
$ head -c 20 /dev/urandom | sha1sum # generieren des master_secrets |
||
$ cp config/local.example.toml config/local.toml |
$ cp config/local.example.toml config/local.toml |
||
$ vim config/local.toml |
$ vim config/local.toml |
||
So sieht die Konfiguration nach Anpassung aus. |
|||
<pre> |
<pre> |
||
# Example MySQL DSN: die URI ist nach dem schema: "schema://nutzername:passwort@hostname/datenbankname" aufgebaut |
|||
# Example MySQL DSN: |
|||
database_url = "mysql://syncstorage:ix79unOS0nF9jvTgVsQS9Q01jseiYFBq@localhost/syncstorage_rs" |
database_url = "mysql://syncstorage:ix79unOS0nF9jvTgVsQS9Q01jseiYFBq@localhost/syncstorage_rs" |
||
# Example Spanner DSN: |
|||
# database_url="spanner://projects/SAMPLE_GCP_PROJECT/instances/SAMPLE_SPANNER_INSTANCE/databases/SAMPLE_SPANNER_DB" |
|||
"limits.max_total_records"=1666 # See issues #298/#333 |
"limits.max_total_records"=1666 # See issues #298/#333 |
||
# mittels "head -c 20 /dev/urandom" generiert |
|||
master_secret = "7102dceffaf5ce47e5e16b94be8bd729cf74c3bc" |
master_secret = "7102dceffaf5ce47e5e16b94be8bd729cf74c3bc" |
||
Line 63: | Line 81: | ||
# Example Tokenserver settings: |
# Example Tokenserver settings: |
||
disable_syncstorage = false |
disable_syncstorage = false |
||
# hier kann die gleiche Datenbank wie oben verwendet werden |
|||
tokenserver.database_url = "mysql://syncstorage:ix79unOS0nF9jvTgVsQS9Q01jseiYFBq@localhost/syncstorage_rs" |
|||
tokenserver.database_url = "mysql://syncstorage:**hidden**@localhost/syncstorage_rs" |
|||
tokenserver.enabled = true |
tokenserver.enabled = true |
||
tokenserver.fxa_email_domain = "api.accounts.stage.mozaws.net" |
tokenserver.fxa_email_domain = "api.accounts.stage.mozaws.net" |
||
# das gleiche secret wie oben |
|||
tokenserver.fxa_metrics_hash_secret = "7102dceffaf5ce47e5e16b94be8bd729cf74c3bc" |
tokenserver.fxa_metrics_hash_secret = "7102dceffaf5ce47e5e16b94be8bd729cf74c3bc" |
||
tokenserver.fxa_oauth_server_url = "https://oauth.accounts.firefox.com" |
tokenserver.fxa_oauth_server_url = "https://oauth.accounts.firefox.com" |
||
Line 71: | Line 91: | ||
tokenserver.fxa_browserid_issuer = "https://api-accounts.stage.mozaws.net" |
tokenserver.fxa_browserid_issuer = "https://api-accounts.stage.mozaws.net" |
||
tokenserver.fxa_browserid_server_url = "https://verifier.stage.mozaws.net/v2" |
tokenserver.fxa_browserid_server_url = "https://verifier.stage.mozaws.net/v2" |
||
# die nächsten zwei Konfigurationen können sich in folgenden Versionen ändern, sie waren nicht dokumentiert, aber notwendig, um den service zu starten |
|||
tokenserver.test_mode_enabled = false |
tokenserver.test_mode_enabled = false |
||
tokenserver.additional_blocking_threads_for_fxa_requests = 2 |
tokenserver.additional_blocking_threads_for_fxa_requests = 2 |
||
Line 78: | Line 99: | ||
cors_allowed_origin = "null" |
cors_allowed_origin = "null" |
||
# cors_max_age = 86400 |
# cors_max_age = 86400 |
||
</pre> |
|||
=== Nginx Reverse Proxy === |
|||
$ sudo pacman -S nginx |
|||
Dann die <code>/etc/nginx/nginx.conf</code> anpassen, um einen reverse-proxy zu konfigurieren. |
|||
<pre> |
|||
worker_processes 1; |
|||
events { |
|||
worker_connections 1024; |
|||
} |
|||
http { |
|||
include mime.types; |
|||
default_type application/octet-stream; |
|||
sendfile on; |
|||
keepalive_timeout 65; |
|||
server { |
|||
listen 443 ssl; |
|||
server_name syncserver.example.com; |
|||
ssl_certificate fullchain.pem; |
|||
ssl_certificate_key privkey.pem; |
|||
ssl_session_cache shared:SSL:1m; |
|||
ssl_session_timeout 5m; |
|||
ssl_ciphers HIGH:!aNULL:!MD5; |
|||
ssl_prefer_server_ciphers on; |
|||
location / { |
|||
proxy_pass http://127.0.0.1:8000; |
|||
proxy_set_header Host $host; |
|||
proxy_set_header X-Forwarded-Host $host; |
|||
proxy_set_header X-Forwarded-Server $host; |
|||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
|||
proxy_set_header X-Forwarded-Proto $scheme; |
|||
} |
|||
} |
|||
} |
|||
</pre> |
</pre> |
||
Anschließend muss die config neu geladen werden und unter arch nginx gestartet werden. |
|||
$ sudo systemctl start nginx # oder |
|||
$ sudo systemctl reload nginx # wenn nginx schon läuft |
|||
== Rootless Podman == |
|||
Für rootless-podman müssen dem Nutzer. Siehe [https://docs.podman.io/en/latest/markdown/podman.1.html#rootless-mode Rootless mode] in der man page von podman. |
|||
$ sudo pacman -S podman |
|||
$ echo USERNAME:10000:65536 >> /etc/subuid |
|||
$ echo USERNAME:10000:65536 >> /etc/subgid |
|||
$ su USERNAME # neu anmelden in der aktuellen shell um Änderung Effektiv zu machen. |
|||
Anschließend muss das <code>Dockerfile</code> und die <code>docker-compose.yml</code> noch angepasst werden. Bei den Containernamen muss noch ein docker.io/ geprefixed werden (Dieser Schritt fällt weg, wenn [https://github.com/mozilla-services/syncstorage-rs/pull/1431 mein PR] gemerged wurde). |
|||
Die Konfiguration läuft über die <code>docker-compose.mysql.yaml</code> |
|||
Dann können die container gestartet werden über <code>podman build .</code> und <code>docker-compose -f docker-compose.mysql.yaml up -d</code>. |
|||
Anschließend läuft der container. |
|||
== Ressourcen == |
== Ressourcen == |
||
Line 86: | Line 169: | ||
# [[W2022-ITS#Eigener_Sync-Server_f.C3.BCr_Firefox_.28Rust.29|Projektbeschreibung]] |
# [[W2022-ITS#Eigener_Sync-Server_f.C3.BCr_Firefox_.28Rust.29|Projektbeschreibung]] |
||
# Arch linux AUR-Paket: https://aur.archlinux.org/packages/firefox-syncstorage-git#comment-840519 |
# Arch linux AUR-Paket: https://aur.archlinux.org/packages/firefox-syncstorage-git#comment-840519 |
||
# Möglicherweise hilfreicher issue zum debuggen vom Reverse-Proxy: https://github.com/mozilla-services/syncstorage-rs/issues/1217 |
|||
# [[Media:Ffsync folien.pdf | Folien]] |
|||
== Referenzen == |
|||
* [1]: [https://hacks.mozilla.org/2018/11/firefox-sync-privacy/ Firefox Sync, Private by Design] |
|||
* [2]: [https://github.com/mozilla-services/syncstorage-rs/ Github: syncstorage-rs] |
|||
* [3]: [https://github.com/mozilla-services/syncstorage-rs/tree/fca795e3c09c7feee12b450791a53bb0a2871b48#connecting-to-firefox ] |
|||
* [4]: https://github.com/mozilla-services/syncstorage-rs/blob/3a21947cf58df29809f406d689c4be3afa97e38e/syncstorage/src/tokenserver/README.md#database |
|||
* https://github.com/mozilla-services/syncstorage-rs/issues/1217 |
|||
* |
Latest revision as of 14:10, 8 November 2022
Firefox Sync ist ein Service zum Synchronisieren von Bookmarks, Passwörtern und Browser History. Diese werden zentral auf Mozilla-Servern verschlüsselt gespeichert.[1] Der Dienst ist Open Source (MPLv2) und lässt sich selbst hosten. Derzeit läuft in der Informatik ein eigener Sync-Server für Firefox der Version 1.5. Seitdem gab es eine Neuimplementierung in Rust[2]. Bei diesem Artikel handelt es sich um das Aufsetzen und Einrichten der Rust-Neuimplementierung.
Aufbau
Firefox Sync besteht aus zwei Komponenten:
- Account Service
- Sync Storage
Beide lassen sich mit der gleichen Datenbank und mit dem gleichen Programm parallel laufen lassen. Zwischenzeitlich sah es so aus, als müsste zusätzlich zu dem Rust-Storage der legacy python2 syncserver als tokenserver laufen[3]. Dies stellte sich als veraltete Information heraus. Der syncstorage-rs implementiert nun auch den Tokenserver und das Setup kommt ohne den legacy python2 syncserver aus.
Ausblick
Der nächste nahe liegende Schritt ist das Setup mit Docker bzw. Podman zu erweitern und möglicherweise mittels Ansible zu verwalten. Die Einrichtung mit Podman wird kurz gezeigt. Die Kombination mit Ansible wird nicht betrachtet.
Schritte für native Konfiguration (ohne Virtualisierung)
Die Installation wird auf Arch Linux im Oktober 2022 durchgeführt. Die Technologien und Konfigurationen verändern sich mit der Zeit, vor allem bei der Konfiguration von dem Syncstorage-Server sollte auf die aktuelle Beispielconfig geschaut werden. Die Anleitung auf dieser Seite nimmt [4] als Basis.
Einrichten von Mysql für Sync-Server
$ sudo pacman -S mariadb $ sudo systemctl start mariadb $ sudo mysql_secure_installation $ mysql -u root -p [mariadb]$ CREATE USER syncstorage IDENTIFIED BY '**hidden**'; [mariadb]$ CREATE DATABASE syncstorage_rs; [mariadb]$ GRANT ALL PRIVILEGES on syncstorage_rs.* to syncstorage;
Tabellen für tokenserver erstellen.[5] Hier verwende ich die gleiche Datenbank `syncstorage_rs` für den Tokenserver, da sich die Tabellennamen nicht überschneiden und es so auch in der AUR-Diskussion beschrieben wird. Die Konsole befindet sich im Git-Verzeichnis von https://github.com/mozilla-services/syncstorage-rs
$ cargo install diesel_cli $ diesel --database-url mysql://syncstorage:ix79unOS0nF9jvTgVsQS9Q01jseiYFBq@localhost/syncstorage_rs migration --migration-dir syncstorage/src/tokenserver/migrations/ run $ mysql -u syncstorage -p [mariadb]$ USE syncstorage_rs; [mariadb]$ INSERT INTO `services` (`id`, `service`, `pattern`) VALUES ('1', 'sync-1.5', '{node}/1.5/{uid}'); [mariadb]$ INSERT INTO `nodes` (`id`, `service`, `node`, `available`, `current_load`, `capacity`, `downed`, `backoff`) VALUES ('1', '1', 'http://localhost:8000', '1', '0', '1', '0', '0');
Tokenserver starten. Die Konsole befindet sich weiterhin im Git-Verzeichnis von https://github.com/mozilla-services/syncstorage-rs
$ make run
Konfiguratoin vom Sync-Server
In Configdatei: config/local.example.toml
ist eine Beispielkonfiguration, die nach `config/local.toml` kopiert und angepasst werden muss.
$ head -c 20 /dev/urandom | sha1sum # generieren des master_secrets $ cp config/local.example.toml config/local.toml $ vim config/local.toml
So sieht die Konfiguration nach Anpassung aus.
# Example MySQL DSN: die URI ist nach dem schema: "schema://nutzername:passwort@hostname/datenbankname" aufgebaut database_url = "mysql://syncstorage:ix79unOS0nF9jvTgVsQS9Q01jseiYFBq@localhost/syncstorage_rs" "limits.max_total_records"=1666 # See issues #298/#333 # mittels "head -c 20 /dev/urandom" generiert master_secret = "7102dceffaf5ce47e5e16b94be8bd729cf74c3bc" # removing this line will default to moz_json formatted logs (which is preferred for production envs) human_logs = 1 # enable quota limits enable_quota = 0 # set the quota limit to 2GB. # max_quota_limit = 200000000 # Example Tokenserver settings: disable_syncstorage = false # hier kann die gleiche Datenbank wie oben verwendet werden tokenserver.database_url = "mysql://syncstorage:**hidden**@localhost/syncstorage_rs" tokenserver.enabled = true tokenserver.fxa_email_domain = "api.accounts.stage.mozaws.net" # das gleiche secret wie oben tokenserver.fxa_metrics_hash_secret = "7102dceffaf5ce47e5e16b94be8bd729cf74c3bc" tokenserver.fxa_oauth_server_url = "https://oauth.accounts.firefox.com" tokenserver.fxa_browserid_audience = "https://token.stage.mozaws.net" tokenserver.fxa_browserid_issuer = "https://api-accounts.stage.mozaws.net" tokenserver.fxa_browserid_server_url = "https://verifier.stage.mozaws.net/v2" # die nächsten zwei Konfigurationen können sich in folgenden Versionen ändern, sie waren nicht dokumentiert, aber notwendig, um den service zu starten tokenserver.test_mode_enabled = false tokenserver.additional_blocking_threads_for_fxa_requests = 2 # cors settings # cors_allowed_origin = "localhost" cors_allowed_origin = "null" # cors_max_age = 86400
Nginx Reverse Proxy
$ sudo pacman -S nginx
Dann die /etc/nginx/nginx.conf
anpassen, um einen reverse-proxy zu konfigurieren.
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 443 ssl; server_name syncserver.example.com; ssl_certificate fullchain.pem; ssl_certificate_key privkey.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } }
Anschließend muss die config neu geladen werden und unter arch nginx gestartet werden.
$ sudo systemctl start nginx # oder $ sudo systemctl reload nginx # wenn nginx schon läuft
Rootless Podman
Für rootless-podman müssen dem Nutzer. Siehe Rootless mode in der man page von podman.
$ sudo pacman -S podman $ echo USERNAME:10000:65536 >> /etc/subuid $ echo USERNAME:10000:65536 >> /etc/subgid $ su USERNAME # neu anmelden in der aktuellen shell um Änderung Effektiv zu machen.
Anschließend muss das Dockerfile
und die docker-compose.yml
noch angepasst werden. Bei den Containernamen muss noch ein docker.io/ geprefixed werden (Dieser Schritt fällt weg, wenn mein PR gemerged wurde).
Die Konfiguration läuft über die docker-compose.mysql.yaml
Dann können die container gestartet werden über podman build .
und docker-compose -f docker-compose.mysql.yaml up -d
.
Anschließend läuft der container.
Ressourcen
- Artikel in diesem Wiki: Eigener Sync-Server für Firefox
- Projektbeschreibung
- Arch linux AUR-Paket: https://aur.archlinux.org/packages/firefox-syncstorage-git#comment-840519
- Möglicherweise hilfreicher issue zum debuggen vom Reverse-Proxy: https://github.com/mozilla-services/syncstorage-rs/issues/1217
- Folien