セルフホストでブックマーク同期:Floccus + WebDAV(bytemark/webdav)

ブックマークを複数ブラウザで同期したい。LAN内のみで良い(一手間加えればWANもいけると思うけど)。

EverSyncを使っていたのだけれど、Braveをアップデートしたら挙動不審になったのをきっかけにセルフホストに移行することにしました。別にブックマークなんて結局リンク集なのでそんな大した秘匿情報ではないので、別にクラウドでもよかったんですが、まぁせっかくなので。

できるだけシンプルなものとして、「Cross-browser bookmarks syncing - Floccus bookmarks sync」をWebDAV構成で使うことにしました。

目次

構成

簡単に構成。

graph TD subgraph WebDAV Server bookmark(bookmarks.xbel) end subgraph Mac browA(Browser A) end subgraph Windows browB(Browser B) end browA <-->|Floccus| bookmark browB <-->|Floccus| bookmark
  • Floccusはブックマーク同期のみをするソフトウェア
    • 通信はいくつかの手段がある。一番楽なのはGoogle Drive。
    • ここではシンプルかつ自立性を重視して安心と伝統のWebDAV
  • 2つめ以降のブラウザで、同じプロファイルを用いるには、手動でプロファイルのインポート、エクスポートをする

NextcloudとかLinkwardenを基盤にすることもできるようなのですが、依存を減らしたかったのでWebDAVにしました。Nextcloud基盤一応あるんですけれど、重量級なのであんまり色々やりたくない感じ。

Floccusのバージョンは5.8.3で、Firefox、Chromeなど対応しています。

インストール

WebDAVサーバの準備

bytemark/webdav - Docker Image」を使わせていただきました。

services:
  webdav:
    image: bytemark/webdav
    container_name: floccus-webdav
    restart: unless-stopped
    ports:
      - "ポート:80"
    environment:
      - USERNAME=ユーザ名
      - PASSWORD=パスワード
    volumes:
      # 相対パスに変更することで、今いるディレクトリの data フォルダに固定されます
      - ./floccus-data:/var/lib/dav

ポート、ユーザ名、パスワード、あとブックマークを保存する場所を指定します。上記はカレントディレクトリのfloccus-dataディレクトリになっていますが、適当に。

同期ファイルとして、最小限のXMLファイルbookmarks.xbelをコンテナ内の/var/lib/dav/data内に置いておきます。

# コンテナ内のファイルに最小限の XML 構造を書き込む
docker exec floccus-webdav sh -c 'echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?><xbel version=\"1.0\"></xbel>" > /var/lib/dav/data/bookmarks.xbel'

# 念のため所有権を再設定
docker exec floccus-webdav chown www-data:www-data /var/lib/dav/data/bookmarks.xbel

最初のブラウザにfloccus導入

Guides and How tos - Floccus bookmarks sync」がドキュメント。ここから使っているブラウザの拡張機能を導入します。

インストールしたら、最初のプロファイルを作成します。

  • WebDAV URL: http://WebDAVサーバのIPアドレス:ポート
    • LAN内なのでhttps接続は不要としました
  • ユーザ、パスワード: docker-compose.ymlと合わせる
  • パスフレーズ: 空欄(暗号化しない場合)

次は同期ファイルのパスとかを指定します。

次の設定は同期の手法で、同期タイミングや方向性の設定ですが、基本的にはデフォルトでいいと思います。

ただ入れ子プロファイルだけOFFにしました。私には必要ない機能だと思ったからです。この機能の意味はGemini曰く以下です。

例えば、以下のような2つの同期設定(プロファイル)を作りたいとします。

  • プロファイルA(全体用): 「ブックマークバー」全体を、自分専用のWebDAVサーバーに同期する。
  • プロファイルB(共有用): 「ブックマークバー」の中にある**「仕事」フォルダだけ**を、チームの共有サーバーに同期する。

このとき、「仕事」フォルダは、プロファイルAの管理下でもあり、プロファイルBの管理下でもあるという重複状態になります。

つまりチームやプロジェクトで一部分だけ共有とかしたい時に使う機能です。私はシングルユーザで、特に複雑なコントロールをする予定はないので、オフにしました。どうしてもこの手の同期系ソフトウェアは運用していると何かとトラブルが発生しがちなので、不要な機能はオフにしたほうがよかろうと思いました。

そういう意味では、もっとも確実なのはアップロードもダウンロードも完全手動にすることでしょうし、実際EverSyncではそうしていたのですが、とりあえず当面は双方向でやっていきたいと思います。

2つめのブラウザ以降

まず出口みたいなアイコンからプロファイルをエクスポートします。

2つ目のブラウザで拡張機能を導入後、エクスポートしたプロファイルをインポートしたらOKです。インポート後、下矢印アイコンでダウンロードしたら同期されます。

一点注意ですが、同期のタイミングが初期設定では定義されていませんでした。なので「設定」から「変更ベースの同期」と「時間ベースの同期」をそれぞれONにします。その後はWebDAV経由で同期されます。

バックアップ

docker-compose.yml自身と、バインドマウントの設定を記述してますが、そのディレクトリを圧縮してコピーしたらOKです。

自分はバックアップスクリプトで定期実行しています。スクリプトはdocker-compose.ymlをAIに見せたらサクッと書いてくれると思います。そういうのは得意なAI。

所感

dockerでWebDAVサーバをたてたのは地味に初めてで、Geminiに聞いてすぐできるかと思いきや、だいぶ間違えたことを言われて転がされました。インフラ絡むと不得意なAI。地味に時間がかかっている。ま、だから記事にも意味があるんですけどね。

性質上、ブックマーク同期はインターネット公開にする必要性は特に感じていません。なのでLAN内限定です。外で使う時にブックマークを激しく変更しないと思いますし、また常に同期用の通信が走るのも邪魔です。もしやるならば、簡単なのは例によってCloudflare Tunnelでしょう。

とりあえずしばらく運用してみようと思います。うまくいくようならEverSyncはいらないですね。

この記事をいいなと思っていただけた方、よければ高評価・チャンネル登録……はないので、コメント・SNSでシェア・ブックマーク、RSSフィード登録を、よろしくお願い致します。

コメント

コメントする

目次