Direkt zum Hauptinhalt

Brave Sync Server

Beschreibung:

Mann kann den Brave Sync Server.
Auch selbst betreiben, gibt ein Projekt auf Github im docker-container dafür.

https://github.com/brave/go-sync

Was Brave Sync aktuell synchronisiert (Stand 2025):

Kategorie Synchronisiert? Beschreibung
🔖 Lesezeichen ✅ Ja Alle Lesezeichen inkl. Ordnerstruktur
📂 Lesezeichen-Favoritenleiste ✅ Ja Auch diese wird übernommen
📄 Chronik (Verlauf) ✅ Ja Browser-Historie
🧠 Formulardaten (Autofill) ✅ Ja Namen, Adressen, Telefonnummern, etc.
🔐 Passwörter ✅ Ja Gespeicherte Anmeldedaten
🎨 Designs/Themes ✅ Ja Farbthema des Browsers
🧩 Erweiterungen/Add-ons ✅ Ja Installierte Chrome-Extensions
⚙️ Einstellungen ✅ Ja Viele (nicht alle) Einstellungen werden übernommen
📱 Offene Tabs ✅ Ja Geräteübergreifender Tab-Verlauf
🧭 Suchmaschinen-Einstellungen ✅ Ja Eigene oder angepasste Suchanbieter
🔒 Zahlungsmethoden ✅ Ja Kreditkartendaten etc. (wenn aktiviert)

💾 Und wie viel Speicherplatz verbraucht das?

Datentyp Typische Größe
Lesezeichen ein paar KB
Passwörter 10–100 KB
Formulardaten 50–200 KB
Verlauf einige 100 KB
Alles zusammen < 2 MB pro Nutzer

Vorrausetzung:

Public IP

Installation:

apt install docker.io docker-compose curl

Verzeichnis erstellen

mkdir /root/bravesync

Nun in das Verzeichnis gehen und Repo clonen

cd /root/bravesync/
git clone https://github.com/brave/go-sync

nun die .env Datei erstellen

nano /root/bravesync/go-sync/.env

Inhalt

PUBLIC_URL ="http://localhost:5000"   
# ändere auf https://sync.example.com bei Proxy: "http://localhost:5000"   # ändere auf https://sync.example.com bei Proxy

Nun die Docker-compose Dateiersetzen

rm /root/bravesync/go-sync/docker-compose.yml
nano /root/bravesync/go-sync/docker-compose.yml

Inhalt

networks:
  sync:
    driver: bridge

services:
  dev:
    build:
      context: .
      target: builder
      args:
        VERSION: "${VERSION}"
        COMMIT: "${COMMIT}"
        BUILD_TIME: "${BUILD_TIME}"
    depends_on:
      - dynamo-local
      - redis
    networks:
      - sync
    environment:
      - PPROF_ENABLED=true
      - SENTRY_DSN
      - ENV=local
      - DEBUG=1
      - AWS_ACCESS_KEY_ID=GOSYNC
      - AWS_SECRET_ACCESS_KEY=GOSYNC
      - AWS_REGION=us-west-2
      - AWS_ENDPOINT=http://dynamo-local:8000
      - REDIS_URL=redis:6379
  web:
    build:
      context: .
      target: artifact
      args:
        VERSION: "${VERSION}"
        COMMIT: "${COMMIT}"
        BUILD_TIME: "${BUILD_TIME}"
    ports:
      - "8295:8295"
    depends_on:
      - dynamo-local
      - redis
    networks:
      - sync
    environment:
      - PPROF_ENABLED=true
      - SENTRY_DSN
      - ENV=local
      - DEBUG=1
      - AWS_ACCESS_KEY_ID=GOSYNC
      - AWS_SECRET_ACCESS_KEY=GOSYNC
      - AWS_REGION=us-west-2
      - AWS_ENDPOINT=http://dynamo-local:8000
      - TABLE_NAME=client-entity-dev
      - REDIS_URL=redis:6379
  dynamo-local:
    build:
      context: .
      dockerfile: dynamo.Dockerfile
    ports:
      - "8000:8000"
    volumes:
      - ./data/dynamodb:/home/dynamodblocal/data
    networks:
      - sync
  redis:
    image: public.ecr.aws/docker/library/redis:6.2
    ports:
      - "6379:6379"
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - ./data/redis:/data
    networks:
      - sync

  caddy:
    image: caddy:latest
    restart: always
    ports:
      - "80:80"
      - "443:443"
    command: caddy reverse-proxy --from ${PUBLIC_URL} --to web:8295
    volumes:
      - ./data/caddy/data:/data
      - ./data/caddy/config:/config
    networks:
      - sync



Die Makefile anpassen

nano /root/bravesync/go-sync/Makefile

Inhalt

...
docker:
        COMMIT=$(GIT_COMMIT) VERSION=$(GIT_VERSION) BUILD_TIME=$(BUILD_TIME) docker compose build

docker-up:
        COMMIT=$(GIT_COMMIT) VERSION=$(GIT_VERSION) BUILD_TIME=$(BUILD_TIME) docker compose up

docker-test:
        COMMIT=$(GIT_COMMIT) VERSION=$(GIT_VERSION) BUILD_TIME=$(BUILD_TIME) docker compose -f docker-compose.yml run --rm dev ma>

...



alle docker compose in docker-compose abändern


...
docker:
        COMMIT=$(GIT_COMMIT) VERSION=$(GIT_VERSION) BUILD_TIME=$(BUILD_TIME) docker-compose build

docker-up:
        COMMIT=$(GIT_COMMIT) VERSION=$(GIT_VERSION) BUILD_TIME=$(BUILD_TIME) docker-compose up

docker-test:
        COMMIT=$(GIT_COMMIT) VERSION=$(GIT_VERSION) BUILD_TIME=$(BUILD_TIME) docker-compose -f docker-compose.yml run --rm dev ma>

...

Nun die container starten

docker-compose up -d

Nun noch die ufw Firewall regeln anpassen.

Da hier der Docker container sowieso von außen erreichbar sein soll, brauchen wir hier keine Anspassung für docker.
Aber ssh soll nur auf der lokalen Netzwerkkarte zur Verfügung stehen

ufw installieren

apt install ufw

Nun die Regeln setzten

ufw allow in on enp6s18 to any port 22
ufw enable

Brave konfigurieren:

🧪 Browser starten mit eigenem Sync-Server

Auf dem Gerät, das Brave nutzt, musst du Brave mit dem Custom-Sync-Server starten:

Du musst Brave mit dem Startparameter ausführen:

brave --sync-url=https://dein.sync.server

Unter Windows z. B. in der Verknüpfung hinter "C:\Program Files\BraveSoftware\Brave-Browser\Application\brave.exe"

🛠️ Dauerhaft unter Linux:

Bearbeite z. B. den Desktop-Starter:

nano ~/.local/share/applications/brave-browser.desktop

Finde die Zeile:

Exec=/usr/bin/brave-browser-stable %U

Und ergänze:

Exec=/usr/bin/brave-browser-stable --sync-url=https://dein.sync.server %U

Schritt-für-Schritt: Brave Flatpak & Startparameter

1. Standard-Flatpak-Pfad prüfen

Der Brave-Flatpak wird in der Regel als:

org.brave.Browser

ausgeführt. Um zu prüfen, ob das bei dir stimmt:

flatpak list | grep Brave
2. .desktop-Datei anpassen (nur für dich)

Die Desktop-Startverknüpfung liegt für Benutzerinstallationen meistens hier:

~/.local/share/flatpak/exports/share/applications/org.brave.Browser.desktop

Wenn sie dort nicht liegt, dann:

find ~/.local/share -name "org.brave.Browser.desktop"
3. Datei editieren

Öffne sie z. B. mit Nano oder einem Editor:

nano ~/.local/share/flatpak/exports/share/applications/org.brave.Browser.desktop

Suche die Zeile:

Exec=flatpak run org.brave.Browser

Und ergänze sie:

Exec=flatpak run org.brave.Browser --sync-url=https://dein.sync.server
4. Desktop neu einlesen (optional)

Manchmal musst du die Desktop-Datenbank neu laden:

update-desktop-database ~/.local/share/applications/

Oder einfach ab- und wieder anmelden.


Dashboard

Im go-sync Verzeichnis solch eine Struktur erstellen

dashboard/
│   ├── server.js
│   └── public/
│       └── index.html
mkdir -p /root/bravesync/go-sync/dashboard/public

Die docker-compose Datei ums Dashboard erweitern

 

nano /root/bravesync/go-sync/docker-compose.yml

Inhat / ergänzung

...
  dashboard:
    build: ./dashboard
    container_name: brave-dashboard
    volumes:
      - ./brave-sync-dashboard-logs:/var/log
    ports:
      - "3000:3000"
    networks:
      - sync
    restart: unless-stopped
    

Die Dockerfile erstellen

 

nano /root/bravesync/go-sync/dashboard/Dockerfile

Inhalt

FROM node:20

WORKDIR /app

COPY server.js .
COPY public ./public

RUN npm install express tail

EXPOSE 3000

CMD ["node", "server.js"]

Die Server.js

nano /root/bravesync/go-sync/dashboard/server.js

Inhalt

const express = require('express');
const Tail = require('tail').Tail;
const app = express();
const http = require('http').createServer(app);
const io = require('socket.io')(http);
const LOG_FILE = '/var/log/brave-sync.log';

app.use(express.static('public'));

io.on('connection', (socket) => {
  const tail = new Tail(LOG_FILE);

  tail.on('line', (line) => {
    socket.emit('log', line);
  });

  tail.on('error', (err) => {
    console.error("Tail error:", err);
  });

  socket.on('disconnect', () => {
    tail.unwatch();
  });
});

http.listen(3000, () => {
  console.log('Dashboard läuft auf http://localhost:3000');
});

Die Public index html

nano /root/bravesync/go-sync/dashboard/public/index.html

Inhalt

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8" />
  <title>Brave Sync Dashboard</title>
  <style>
    body { font-family: sans-serif; background: #111; color: #0f0; padding: 1em; }
    pre { white-space: pre-wrap; word-wrap: break-word; }
  </style>
</head>
<body>
  <h1>📡 Brave Sync Live Logs</h1>
  <pre id="log"></pre>

  <script src="https://cdn.socket.io/4.7.2/socket.io.min.js"></script>
  <script>
    const socket = io();
    const logElem = document.getElementById("log");

    socket.on("log", line => {
      logElem.textContent += line + "\n";
      logElem.scrollTop = logElem.scrollHeight;
    });
  </script>
</body>
</html>