diff --git a/README_ja.md b/README_ja.md index 47e3f5a7..d07a85b8 100644 --- a/README_ja.md +++ b/README_ja.md @@ -1,86 +1,125 @@ - # Self-hosted LiveSync [英語版ドキュメント](./README.md) - [中国語版ドキュメント](./README_cn.md). -Obsidianで利用可能なすべてのプラットフォームで使える、CouchDBをサーバに使用する、コミュニティ版の同期プラグイン +Self-hosted LiveSync は、Obsidian 対応のすべてのプラットフォームで利用できる、コミュニティ開発の同期プラグインです。CouchDB や MinIO、S3、R2 などのオブジェクトストレージを利用し、信頼性の高いデータ同期を実現します。 + +WebRTC によるピアツーピア(P2P)同期にも対応しており、中央のデータ保存サーバーを介さずにデバイス間でノートを交換できます。ピアの検出にはシグナリングリレーが必要です。詳しくは[ピアツーピア同期の仕組み](./docs/p2p.md)をご覧ください。 + +セットアップガイド、トラブルシューティング、技術資料、設計判断、過去の資料は[ドキュメント一覧](docs/README.md)から確認できます。 ![obsidian_live_sync_demo](https://user-images.githubusercontent.com/45774780/137355323-f57a8b09-abf2-4501-836c-8cb7d2ff24a3.gif) -※公式のSyncと同期することはできません。 - +>[!IMPORTANT] +> このプラグインは公式の「Obsidian Sync」と互換性がなく、同サービスとは同期できません。 ## 機能 -- 高効率・低トラフィックでVault同士を同期 -- 競合解決がいい感じ - - 単純な競合なら自動マージします -- OSSソリューションを同期サーバに使用 - - 互換ソリューションも使用可能です -- End-to-End暗号化実装済み -- 設定・スニペット・テーマ、プラグインの同期が可能 -- [Webクリッパー](https://chrome.google.com/webstore/detail/obsidian-livesync-webclip/jfpaflmpckblieefkegjncjoceapakdf) もあります - -NDAや類似の契約や義務、倫理を守る必要のある、研究者、設計者、開発者のような方に特にオススメです。 +- Vault を効率的に、通信量を抑えて同期します。 +- 競合する変更を適切に処理します。 + - 単純な競合は自動的にマージします。 +- サーバーにはオープンソースのソリューションを使用します。 + - 互換性のあるソリューションにも対応します。 +- エンドツーエンド暗号化に対応します。 +- [カスタマイズ同期(高度な設定)](docs/settings_ja.md#6-customisation-sync-advanced)または[非表示ファイル同期](docs/tips/hidden-file-sync.md)で、設定、スニペット、テーマ、プラグインを同期します。 +- WebRTC によるピアツーピア同期を行います。 +このプラグインは、セキュリティ上の理由からノートを完全に自己管理する必要がある研究者、エンジニア、開発者に特に適しています。ノートが完全にプライベートなままであることに安心感を求める方にも適しています。 >[!IMPORTANT] -> - インストール・アップデート前には必ずVaultをバックアップしてください -> - 複数の同期ソリューションを同時に有効にしないでください(これはiCloudや公式のSyncも含みます) -> - このプラグインは同期プラグインです。バックアップとして使用しないでください - +> - このプラグインをインストールまたはアップグレードする前に、Vault をバックアップしてください。 +> - iCloud や Obsidian Sync など、同じ Vault に書き込む他の同期ソリューションと同時に有効にしないでください。 +> - バックアップには、[Differential ZIP Backup](https://github.com/vrtmrz/diffzip) も利用できます。 ## このプラグインの使い方 -### 3分セットアップ - CouchDB on fly.io +セルフホストでは、信頼できるサーバーを選び、自分で管理できます。サーバーをセットアップして保守し、安全な状態を保ってください。 -**はじめての方におすすめ** + -[![LiveSync Setup onto Fly.io SpeedRun 2024 using Google Colab](https://img.youtube.com/vi/7sa_I1832Xc/0.jpg)](https://www.youtube.com/watch?v=7sa_I1832Xc) +### 必要なもの -1. [Fly.ioにCouchDBをセットアップする](docs/setup_flyio.md) -2. [Quick Setup](docs/quick_setup_ja.md)でプラグインを設定する +| 方法 | 必要なもの | あると便利なもの | +| --- | --- | --- | +| CouchDB | CouchDB 互換サーバー | — | +| オブジェクトストレージ | S3 互換サービスまたはサーバー | — | +| ピアツーピア | 不要 | 独自のシグナリングサーバー | +CouchDB 互換サーバーを使う場合は、環境に合ったセットアップガイドを選んでください。 -### Manually Setup +- [自分のサーバー](docs/setup_own_server_ja.md): Raspberry Pi など、自分で管理するサーバーで CouchDB を実行します。 +- [Docker](docker/README.md): 付属の Docker スタックで CouchDB をデプロイします。 +- [Fly.io](docs/setup_flyio.md): ホスト型インフラ上で自分の CouchDB インスタンスを管理します。 +- [IBM Cloudant(マネージド)](docs/setup_cloudant_ja.md): IBM が管理するデータベースサービスを利用します。 -1. サーバのセットアップ - 1. [Fly.ioにCouchDBをセットアップする](docs/setup_flyio.md) - 2. [CouchDBをセットアップする](docs/setup_own_server_ja.md) -2. [Quick Setup](docs/quick_setup_ja.md)でプラグインを設定する +各ガイドでセットアップ方法とプロバイダー固有の費用を確認してください。 -> [!TIP] -> IBM Cloudantもまだ使用できますが、いくつかの理由で現在はおすすめしていません。[IBM Cloudantのセットアップ](docs/setup_cloudant_ja.md)はまだあります。 + + +Fly.io の動画による手順は、[自動セットアップ](docs/setup_flyio.md#a-very-automated-setup)を参照してください。 + +P2P では中央のデータ保存サーバーは不要ですが、ピアの検出にはシグナリングリレーが必要です。プロジェクトの公開シグナリングリレーを利用できるため、サーバーを用意する必要はありません。別のデバイスが同期している間は、必要なデータを持つデバイスを少なくとも1台オンラインにしてください。[P2P の通信モデル](./docs/p2p.md)を確認してから、[ピアツーピアのセットアップ](./docs/setup_p2p.md)に進んでください。 + +デバイス上で P2P のセットアップと接続がどのように動作するかを確認したい場合は、実験的な [WebPeer ブラウザーユーティリティ](https://vrtmrz.github.io/obsidian-livesync/webpeer/)のガイド付き接続チェックを試してください。空の Vault を使用し、ノートの同期はテストしません。範囲と制限は [WebPeer のドキュメント](src/apps/webpeer/README.md)を参照してください。 + +### 同期を開始する + +1. 最初のデバイスで、CouchDB の[クイックセットアップ](docs/quick_setup_ja.md)、[オブジェクトストレージのセットアップ](docs/setup_object_storage.md)、または[ピアツーピアのセットアップ](docs/setup_p2p.md)を使用して Self-hosted LiveSync をインストールおよび設定します。 +2. 動作中のデバイスからセットアップ URI を生成し、同じガイドに従って他のデバイスを追加します。 +3. テスト用ノートを作成し、双方向に同期されることを確認します。 + + + +### コミュニティが紹介するホスティングサービス + +> [!NOTE] +> 以下のサービスは第三者によって運営されています。Self-hosted LiveSync の公式サービスではなく、本プロジェクトが推奨または保証するものでもありません。表内の掲載は各プロバイダーから提案されたものです。 + +自分でサーバーをセットアップして保守したくない場合は、以下のプロバイダーが、このプラグインから接続できるマネージド CouchDB サーバーを提供しています。 + +| プロバイダー | 提供内容 | +| --- | --- | +| [Zenith Hosting](https://zenith.hosting/host/obsidian-livesync) | マネージド CouchDB ホスティング。 | + +同期データはプロバイダーが運営するサーバーに保存されます。Vault にとって許容できるか検討し、利用前にプロバイダーの最新の利用規約、料金、データ取扱方針を確認してください。 ## ステータスバーの説明 -同期ステータスはステータスバーに、下記のアイコンとともに表示されます +同期ステータスは、デフォルトでステータスバーとエディタ内に表示されます。主な表示は以下のとおりです。 -- アクティビティー - - 📲 ネットワーク接続中 -- 同期ステータス - - ⏹️ 停止中 - - 💤 変更待ち(LiveSync中) - - ⚡️ 同期の進行中 - - ⚠ エラー -- 統計情報 - - ↑ アップロードしたチャンクとメタデータ数 - - ↓ ダウンロードしたチャンクとメタデータ数 -- 進捗情報 - - 📥 転送後、未処理の項目数 - - 📄 稼働中データベース操作数 - - 💾 稼働中のストレージ書き込み数操作数 - - ⏳ 稼働中のストレージ読み込み数操作数 - - 🛫 待機中のストレージ読み込み数操作数 - - ⚙️ 隠しファイルの操作数(待機・稼働中合計) - - 🧩 取得待ちを行っているチャンク数 - - 🔌 設定同期関連の操作数 +| 表示 | 意味 | +| --- | --- | +| ⏹️ | 停止中。 | +| 🌀 | 同期を開始しています。 | +| 💤 | LiveSync モードが変更を待っています。 | +| ⚡️ | 同期中です。 | +| ⏩ | CouchDB の変更履歴を比較しています(ローカルに保持済みの項目も含みます)。 | +| ⚠ | エラーが発生しました。 | +| ↑ / ↓ | アップロード/ダウンロードしたチャンクとメタデータ。 | +| 📲 / 🌐N | 個別のリモート操作を実行中/概算のリモートリクエスト数。 | -データベースやファイルの破損を避けるため、Obsidianの終了は進捗情報が表示されなくなるまで待ってください(プラグインも復帰を試みますが)。特にファイルを削除やリネームした場合は気をつけてください。 + +詳細な進捗カウンターと [CSS のカスタマイズ](docs/tips/status-display.md#customising-status-items-with-css-snippets)については、[ステータス表示ガイド](docs/tips/status-display.md)を参照してください。 -## Tips and Troubleshooting -- 2台目以降のセットアップ時に、初期同期をより迅速かつ簡単に行うには、[ファストセットアップガイド](docs/tips/fast-setup_ja.md)をご参照ください。 -- 何かこまったら、[Tips and Troubleshooting](docs/troubleshooting.md)をご参照ください。 +Obsidian を閉じる前に、保留中のファイル操作が完了するまで待ってください。特にファイルの削除や名前変更の後は注意してください。 -## License +## ヒントとトラブルシューティング +- 後続のデバイスをセットアップする際に、より高速で簡単な初期複製を行う場合は、[Fast Setup ガイド](docs/tips/fast-setup_ja.md)を参照してください。 +- 通常のノート同期が動作することを確認してから、[非表示ファイル同期](docs/tips/hidden-file-sync.md)を設定してください。 +- Obsidian または LiveSync が正常に起動できない場合は、リモートデータベースを変更またはリセットする前に、[復旧とフラグファイル](docs/recovery.md)を確認してください。 +- Self-hosted LiveSync 1.0 には Obsidian 1.7.2 以降が必要です。旧バージョンの Obsidian で 1.0 を使用する必要がある場合は、バージョン、プラットフォーム、およびそのバージョンにとどまる理由を添えて [Issue を作成](https://github.com/vrtmrz/obsidian-livesync/issues/new?template=issue-report.md)してください。サポートの拡張が可能かどうかを検討します。標準のコミュニティプラグインインストーラーでは、互換性のある古いプラグインリリースが選択されます。 +- プラグインが動作しない場合は、[トラブルシューティング](docs/troubleshooting.md)を参照してください。 -Licensed under the MIT License. \ No newline at end of file +## 謝辞 +本プロジェクトの継続的な発展は、以下の方々の支援によって支えられています。 +- 多くの [コントリビューター](https://github.com/vrtmrz/obsidian-livesync/graphs/contributors)の皆様。 +- 多くの [GitHub スポンサー](https://github.com/sponsors/vrtmrz#sponsors)の皆様。 +- JetBrains コミュニティプログラム / オープンソースプロジェクト支援 JetBrains logo + +貢献してくださった方々のご厚意とご支援に、深く感謝します。 + +## 開発ガイド +開発環境のセットアップ、テスト基盤、コード規約などについては、[開発ガイド](devs.md)を参照してください。 + +## ライセンス + +MIT License の下で公開されています。 diff --git a/docs/quick_setup_ja.md b/docs/quick_setup_ja.md index 06c2644c..3ea1ae88 100644 --- a/docs/quick_setup_ja.md +++ b/docs/quick_setup_ja.md @@ -1,93 +1,140 @@ -# Quick setup -このプラグインには、いろいろな状況に対応するための非常に多くの設定オプションがあります。しかし、実際に使用する設定項目はそれほど多くはありません。そこで、初期設定を簡略化するために、「セットアップウィザード」を実装しています。 -※なお、次のデバイスからは、`現在の設定をセットアップURIにコピー`と`セットアップURIで接続`を使ってセットアップしてください。 +# クイックセットアップ +[英語版](./quick_setup.md) - [中国語版](./quick_setup_cn.md) -## Wizardの使い方 -`🧙‍♂️ Setup wizard` から開きます。もしセットアップされていなかったり、同期設定が何も有効になっていない場合はデフォルトで開いています。 +このガイドでは、最初のデバイスで通常のノート同期を開始し、その後、別のデバイスを追加します。オプション機能は、この基本的な同期が動作することを確認してから設定してください。 -![](../images/quick_setup_1.png) +開始前に、次の準備をしてください。 -### Discard the existing configuration and set up -今設定されている内容をいったん全部消してから、ウィザードを始めます。 +- 対象となるすべての Vault をバックアップする。 +- Obsidian Sync、iCloud 同期、および同じ Vault に書き込む他のサービスを無効にする。 +- リモートサービスとセットアップ URI を用意する。 +- セットアップ URI とそのパスフレーズを別々に保管する。 -### Do not discard the existing configuration and set up -今の設定を消さずにウィザードを開始します。 -たとえ設定されていたとしても、ウィザードモードではすべての設定を見ることができません。 +この手順では、推奨されるプロビジョニング済み CouchDB の手順を説明します。サーバーとセットアップ URI の準備方法は[こちら](./setup_own_server_ja.md)を参照してください。 -いずれかのNextを押すと、設定画面がウィザードモードになります。 +## セットアップ URI の内容 -### Wizardモード +セットアップ URI は `obsidian://setuplivesync?settings=` で始まります。認証情報を含む接続設定が暗号化されて格納されていますが、暗号化されていても URI 自体を安全に保管してください。 -![](../images/quick_setup_2.png) +セットアップ URI 用のパスフレーズは URI を復号するためのものです。同期データを保護する Vault 暗号化パスフレーズとは別のものです。両方を安全に保管し、URI とそのパスフレーズを同じ経路で送らないでください。 -順番に設定を行っていきます。 +## 1台目のデバイスをセットアップする -## Remote Database configuration +リモートデータベースが新規の場合、またはサーバー全体を再構築する際にこのデバイスを明示的に正本とする場合に限り、この手順を使ってください。 -### Remote databaseの設定 -セットアップしたデータベースの情報を入力していきます。 +1. 対象の Vault に Self-hosted LiveSync をインストールして有効にします。 +2. `Welcome to Self-hosted LiveSync` 通知を選び、オンボーディングを開きます。 +3. `I am setting this up for the first time` を選び、新しい同期をセットアップすることを確認します。 +4. `Connection Method` で `Use a Setup URI (Recommended)` を選びます。 +5. セットアップ URI を貼り付け、URI 用のパスフレーズを入力して `Test Settings and Continue` を選びます。 -![](../images/quick_setup_3.png) + ![暗号化されたセットアップ URI とマスクされたパスフレーズ](../images/quick-setup/guide-quick-setup-first-setup-uri.png) -これらはデータベースをセットアップした際に決めた情報です。 +6. `Setup Complete: Preparing to Initialise Server` の内容を確認し、`Restart and Initialise Server` を選びます。 -### Test database connectionとCheck database configuration -ここで、データベースへの接続状況と、データベース設定を確認します。 -![](../images/quick_setup_5.png) + ![1台目のサーバー初期化の確認](../images/quick-setup/guide-quick-setup-first-initialise.png) -#### Test Database Connection -データベースに接続できるか自体を確認します。失敗する場合はいくつか理由がありますが、一度Check database configurationを行ってそちらでも失敗するか確認してください。 +7. 最終的な上書き警告をよく読みます。バックアップがあり、リモートデータを置き換える意図があることを確認してから、`I Understand, Overwrite Server` を選びます。 -#### Check database configuration -データベースの設定を確認し、不備がある場合はその場で修正します。 + ![サーバー上書きの最終確認](../images/quick-setup/guide-quick-setup-first-rebuild-confirmation.png) -![](../images/quick_setup_6.png) +8. 新規に用意したデータベースでは、`No Synchronisation Settings Found` と表示される場合があります。新しいデータベースであることが確かな場合は、`Use this device's settings` を選びます。既存の設定があるはずなら、キャンセルして接続先のリモートを確認してください。キャンセルすると、Vault とデータベースへの反映を一時停止した状態で再起動します。リモートを確認するまで LiveSync を無効のままにしてください。`Could Not Read Synchronisation Settings` と表示された場合は再試行するか、このデバイスの設定を使って上書きを続行します。上書きには正常な接続が必要です。 -この項目は接続先によって異なる場合があります。上記の場合、みっつのFixボタンを順にすべて押してください。 -Fixボタンがなくなり、すべてチェックマークになれば完了です。 + ![新規データベースで想定されるリモート設定なしの選択肢](../images/quick-setup/guide-quick-setup-missing-remote-configuration.png) -### 機密性設定 +9. `All optional features are disabled` の確認に進みます。通常の同期経路を確認するまで、オプション機能は無効のままにしてください。 +10. 初期化と、要求された再起動が完了するまで待ちます。LiveSync の進捗表示が消えるまで Obsidian を開いたままにしてください。 -![](../images/quick_setup_4.png) +別のデバイスを追加する前に、通常のテストノートを作成し、アップロードが完了するまで待ちます。 -意図しないデータベースの暴露に備えて、End to End Encryptionを有効にします。この項目を有効にした場合、デバイスを出る瞬間にノートの内容が暗号化されます。`Path Obfuscation`を有効にすると、ファイル名も難読化されます。現在は安定しているため、こちらも推奨されます。 -暗号化には256bitのAES-GCMを採用しています。 -これらの設定は、あなたが閉じたネットワークの内側にいて、かつ第三者からアクセスされない事が明確な場合には無効にできます。 +## 別のデバイス用のセットアップ URI を作成する +動作中の1台目のデバイスで、追加デバイス用のセットアップ URI を作成します。サーバーのプロビジョニング時に作成した URI を使い回すのではなく、1台目で実際に使われている設定を取り込めます。 -![](../images/quick_setup_7.png) +1. 1台目で Obsidian のコマンドパレットを開きます。 +2. `Self-hosted LiveSync: Copy settings as a new Setup URI` を実行します。 +3. URI を保護する新しいパスフレーズを入力し、`OK` を選びます。 -### Next -次へ進みます + ![追加デバイス用 URI のマスクされたパスフレーズ](../images/quick-setup/guide-quick-setup-copy-setup-uri-passphrase.png) -### Discard exist database and proceed -すでにRemote databaseがある場合、Remote databaseの内容を破棄してから次へ進みます +4. 生成されたセットアップ URI をコピーし、`OK` を選びます。 + ![動作中の1台目で生成したセットアップ URI](../images/quick-setup/guide-quick-setup-copy-setup-uri-result.png) -## Sync Settings -最後に同期方法の設定を行います。 +新しい URI とそのパスフレーズは別々に保管してください。URI は暗号化されていますが、認証情報と Vault 設定を含むため、引き続き安全に扱ってください。 -![](../images/quick_setup_9_1.png) +## 別のデバイスを追加する -Presetsから、いずれかの同期方法を選び`Apply`を行うと、必要に応じてローカル・リモートのデータベースを初期化・構築します。 -「All done!」(日本語環境では「完了!」)と表示されれば完了です。自動的に、「現在の設定をセットアップURIにコピー」のダイアログが開き、Setup URIを暗号化するためのパスフレーズを求められます(このパスフレーズはSetup URIを暗号化するためのもので、Vault自体の暗号化キーではありません)。 -パスフレーズを入力すると、クリップボードにSetup URIが保存されますので、これを2台目以降のデバイスに何らかの方法で転送してください。 +新しい Vault、または別途バックアップした Vault を使ってください。未同期のノートがある本番 Vault は、[Fast Setup の選択肢](./tips/fast-setup_ja.md)を確認せずに使用しないでください。 -![](../images/quick_setup_10.png) +1. Self-hosted LiveSync をインストールして有効にします。 +2. `Welcome to Self-hosted LiveSync` 通知からオンボーディングを開きます。 +3. `I am adding a device to an existing synchronisation setup` を選び、デバイスを追加することを確認します。 +4. `Device Setup Method` で `Use a Setup URI (Recommended)` を選びます。 +5. 1台目で作成した新しいセットアップ URI を貼り付け、URI 用のパスフレーズを入力して `Test Settings and Continue` を選びます。 +6. `Setup Complete: Preparing to Fetch Synchronisation Data` の内容を確認し、`Restart and Fetch Data` を選びます。 -お好みのパスフレーズを設定してください。 -クリップボードにSetup URIが保存されますので、これを2台目以降のデバイスに何らかの方法で転送してください。 + ![追加デバイスでのデータ取得確認](../images/quick-setup/guide-quick-setup-second-fetch.png) -# 2台目以降の設定方法 -2台目の端末にSelf-hosted LiveSyncをインストールしたあと、コマンドパレットから`Use the copied setup URI (Formerly Open setup URI)`を選択し、転送したsetup URIを入力します。その後、パスフレーズを入力するとセットアップ用のウィザードが開きます。 -下記のように答えてください。 +7. 新規または空の Vault では `Overwrite all with remote files` を選びます。ローカルの作業がある Vault では操作を止め、[Fast Setup ガイド](./tips/fast-setup_ja.md)から適切な方法を選んでください。 -- `Importing LiveSync's conf, OK?` に `Yes` -- `How would you like to set it up?` に `Set it up as secondary or subsequent device` + ![Fast Setup のデータ取得方法の選択肢](../images/quick-setup/guide-quick-setup-retrieval-method.png) -これで設定が反映され、レプリケーションが開始されます。 +8. 追加のローカルファイルの扱いを尋ねられたら、保守的な選択肢は `Keep local files even if not on remote` です。ローカル Vault を破棄してリモートと完全に同じ状態にする意図がある場合に限り、削除する選択肢を使ってください。 -> [!TIP] -> **ファストセットアップ (Fast Setup)** -> 近年のバージョンでは、セットアップURIの読み込みやデータの全取得(Fetch All)を実行した際、より簡単に同期戦略を選択して即座に初期同期を完了できる **ファストセットアップ (Simple Fetch)** フローが利用できます。詳細は [ファストセットアップガイド](./tips/fast-setup_ja.md) をご参照ください。 \ No newline at end of file + ![追加デバイスでのローカルファイルの扱い](../images/quick-setup/guide-quick-setup-local-file-policy.png) + +9. データ取得、ファイルへの反映、および要求された再起動が完了するまで待ちます。LiveSync の進捗表示が消えるまで Obsidian を開いたままにしてください。 + +1台目で作成したテストノートが変更されずに表示されることを確認します。次に、新しいデバイスで2つ目の通常ノートを作成または編集し、1台目に届くことを確認します。 + +![プロビジョニング済み URI を使って同期された通常ノート](../images/quick-setup/guide-quick-setup-synchronised-note.png) + +## 通常の同期が動作した後 + +オプション機能は、どの機能が管理するかと初期化の方向を明確にするため、1つずつ追加してください。 + +- 選択した非表示ファイルやフォルダーには[非表示ファイル同期](./tips/hidden-file-sync.md)を使用します。 +- Obsidian のカスタマイズ設定には[カスタマイズ同期](./settings_ja.md#6-customisation-sync-advanced)を使用します。 + +同じファイルに両方の機能を有効にしないでください。 + +## 1台目で CouchDB を手動設定する + +この方法は CouchDB の準備ができていて、セットアップ URI を利用できない場合に使います。表示されるオンボーディング画面で1台目を設定する手順であり、CouchDB サーバーのプロビジョニングや修復は行いません。後続のデバイスには、認証情報を再入力するのではなく、この1台目で動作確認後に作成したセットアップ URI を使ってください。 + +1. 対象の Vault に Self-hosted LiveSync をインストールして有効にします。 +2. `Welcome to Self-hosted LiveSync` 通知を選び、`I am setting this up for the first time` を選択して、新しい同期をセットアップすることを確認します。 +3. `Connection Method` で `Configure a remote manually`、続けて `Proceed with manual configuration` を選びます。 + + ![オンボーディングでのリモート手動設定](../images/couchdb-manual/guide-couchdb-manual-connection-method.png) + +4. `End-to-End Encryption` で同期データの保護方法を決めます。 + - 通常の新規 Vault では `End-to-End Encryption` を有効にし、強力な Vault 暗号化パスフレーズを入力します。 + - リモートドキュメントのプロパティも隠す場合は `Obfuscate Properties` を有効にします。 + - Vault 暗号化パスフレーズは安全に保管してください。セットアップ URI を保護するパスフレーズとは別のものです。 + + ![パスフレーズをマスクした CouchDB の Vault 暗号化設定](../images/couchdb-manual/guide-couchdb-manual-encryption.png) + +5. `Choose a synchronisation remote` で `CouchDB` を選び、`Continue to CouchDB setup` を選びます。 + + ![同期リモート一覧の CouchDB](../images/couchdb-manual/guide-couchdb-manual-remote-selection.png) + +6. CouchDB の完全な URL、ユーザー名、パスワード、データベース名を入力します。 + - Obsidian Mobile では HTTPS が必要です。HTTP は、デスクトップから信頼できるローカル接続を行う場合に限り使用できます。 + - 選択したデータベースへの接続が許可された認証情報を使います。1台目を設定する際、データベースが存在しなければ作成できる権限も必要です。 + + ![パスワードをマスクした CouchDB 接続情報](../images/couchdb-manual/guide-couchdb-manual-connection-details.png) + +7. `Check server requirements` は任意です。表示中の認証情報を Obsidian の内部リクエスト API 経由で設定済みサーバーへ送信します。一部の検査には CouchDB 管理者権限が必要です。最初の検査は読み取り専用です。サーバー変更が提案された場合は、個々の変更内容を確認してから別途承認してください。 + + ![CouchDB サーバー要件の検査成功例](../images/couchdb-manual/guide-couchdb-manual-server-requirements.png) + +8. `Create or connect to database and continue` を選びます。オンボーディングを続けるには、この接続テストに成功する必要があります。 +9. `Setup Complete: Preparing to Initialise Server` の内容を確認し、`Restart and Initialise Server` を選びます。 +10. 最終的な上書き警告を読みます。このデバイスを正本とする意図があり、最新のバックアップがある場合に限り、`I Understand, Overwrite Server` を選びます。 +11. 新規作成したデータベースでは `No Synchronisation Settings Found` と表示される場合があります。この新規データベースであることが確かな場合は、`Use this device's settings` を選びます。既存の設定があるはずなら、キャンセルして接続先を確認してください。キャンセル後は Vault とデータベースへの反映を一時停止した状態で再起動するため、リモートを確認するまで LiveSync を無効のままにしてください。`Could Not Read Synchronisation Settings` と表示された場合は再試行するか、このデバイスの設定を使って上書きを続行します。上書きには正常な接続が必要です。 +12. `All optional features are disabled` の確認に進み、初期化の進捗が消えるまで Obsidian を開いたままにしてください。 + +通常のテストノートを作成し、同期されることを確認します。CouchDB に届いたら、[別のデバイス用のセットアップ URI を作成する](#別のデバイス用のセットアップ-uri-を作成する)、続けて[別のデバイスを追加する](#別のデバイスを追加する)に進んでください。これにより、2台目の設定を、1台目で実際に適用されたリモートプロファイルと暗号化設定に合わせられます。 diff --git a/docs/settings_ja.md b/docs/settings_ja.md index 8d75dd7d..19d94b0c 100644 --- a/docs/settings_ja.md +++ b/docs/settings_ja.md @@ -1,507 +1,1629 @@ -注意:少し内容が古くなっています。 +# Self-hosted LiveSync の設定項目 -# このプラグインの設定項目 +Self-hosted LiveSync には数多くの設定項目があります。このドキュメントでは各設定の詳細について説明します(導入手順そのものではありません)。設定は複数のカテゴリに分類され、アイコンで表示されます。アイコンの対応は以下のとおりです。 -## Remote Database Configurations -同期先のデータベース設定(Remote Server)を行います。 +Obsidian 1.13 以降では、ルート設定ページはタスク別に整理されています。未設定の状態では **Quick Setup(クイックセットアップ)** が最初に表示され、続いて **Synchronisation(同期)** と **General Settings(一般設定)** が表示されます。本プラグインの設定が完了すると、**Synchronisation(同期)** と **General Settings(一般設定)** が先頭になり、続いて **Set up other devices(他のデバイスのセットアップ)** と **Quick Setup(クイックセットアップ)** が表示されます。以前のサポート対象 Obsidian バージョンでは、同じ項目を備えたペイン形式が維持されます。未設定時は **Quick Setup** が開き、設定済み時は **General Settings** が開きます。 -現在のバージョンでは、複数のリモート接続設定(接続プロファイル)を登録・管理し、切り替えて使用することが可能です(「Remote Databases」リスト)。 +| アイコン | ルートグループ | 内容または利用条件 | +| :--: | ------------------------ | ------------------------------------------------------------- | +| 🧙‍♂️ | Quick Setup | セットアップ URI、オンボーディング、有効化操作 | +| 🔄 | Synchronisation | リモート設定および同期設定 | +| ⚙️ | General Settings | 外観、ロギング、追加メニュー | +| 📲 | Set up other devices(他のデバイスのセットアップ) | 設定完了後のセットアップ URI のコピーまたは QR コード表示 | +| 🛠️ | Maintenance and recovery(メンテナンスと復旧) | メンテナンスおよび Hatch(ハッチ) | +| 🧩 | Extra features(追加機能) | 高度な機能が有効な場合のセレクターおよびカスタマイズ同期 | +| 🔧 | Advanced settings(高度な設定) | 各モードが有効な場合の高度な設定、パワーユーザー向け設定、パッチ | +| ℹ️ | Help and information(ヘルプと情報) | ヘルプとトラブルシューティング、更新履歴 | -- **➕ 新規接続を追加 (Add new connection)**: 新しい接続設定を作成し、各セットアップダイアログを起動します。 -- **📥 接続をインポート (Import connection)**: 接続文字列(`sls+https://...`、`sls+s3://...`、`sls+p2p://...`など)を貼り付けてインポートします。 +## 1.0 における機能の成熟度 + +以下のステータスは、1.0 系統におけるオプション機能および互換性機能に適用されます。 + +| ステータス | 対象機能 | 1.0 の方針 | +| --- | --- | --- | +| サポート対象(オプトイン) | Peer-to-Peer(P2P)同期、非表示ファイル同期、カスタマイズ同期 | 維持されており、実際のランタイムテストでカバーされています。それぞれのセットアップ手順や運用上の制約を受け入れられる場合にのみ有効化してください。 | +| メンテナンス継続(高度な設定) | データ圧縮 | ストレージと帯域幅のトレードオフを明示的に選ぶ機能として利用できます。複数種類のデータを含むデータセットでは、容量の節約効果より処理負荷とメモリ消費の方が大きくなるため、デフォルトでは無効です。 | +| ベータまたは実験的機能 | JWT 認証、除外ファイル、新しいファイルによる競合の自動解決、CouchDB 向けガベージコレクション V3 | 明示的なテストや特殊な用途のために残されています。デフォルトでは無効であり、サポートされる最小セットアップには含まれません。 | +| 互換性維持のみ | V1 動的反復回数、旧 IndexedDB アダプター、現在非推奨のハッシュアルゴリズム、Eden チャンク、保存された `doNotUseFixedRevisionForChunks` キー | 既存の設定とデータは引き続き読み取り可能です。新規 Vault では現在のデフォルトが使用され、互換性コントロールは移行や復旧パスで必要な場合にのみ表示されます。 | + +### 初期化が必要な変更の適用 + +一部の互換性設定はすぐには保存されません。**Apply(適用)** を選択するまで保留状態となります。適用アクションはルート設定ページおよび該当する子ページに表示され続けます。再起動後にどの既存データを使用するかを確認する以下のダイアログが表示されます。 + +- **Reset Synchronisation on This Device(このデバイスの同期をリセット)**: 設定されたリモートからこのデバイスのローカルデータベースを再構築します。P2P の場合、再起動後にオンラインのソースデバイスを選択します。 +- **Overwrite Server Data with This Device's Files(このデバイスのファイルでサーバーデータを上書き)**: この Vault からローカルおよびリモートのデータベースを再構築します。P2P の場合、現在の Vault ファイルからこのデバイスのみを準備します。 +- **Review another way to apply these settings(これらの設定を適用する別の方法を確認)**: 変更を保留にしたままにするか、初期化なしで適用するかの別の選択肢に戻ります。初期化なしで適用するのは高度な互換性のためのフォールバックであり、既存の同期データと互換性がなくなる可能性があります。 + +LiveSync は保留中の設定を保存する前に、選択された次回起動時の操作を予約します。検証またはその予約に失敗した場合、設定は未適用のままとなり、設定のみを適用する選択肢は提示されません。 + +| アイコン | 説明 | +| :--: | ------------------------------------------------------------------ | +| 💬 | [0. Change Log(更新履歴)](#0-change-log) | +| 🧙‍♂️ | [1. Quick Setup and Extra menus(クイックセットアップと追加メニュー)](#1-quick-setup-and-extra-menus) | +| ⚙️ | [2. General Settings(一般設定)](#2-general-settings) | +| 🛰️ | [3. Remote Configuration(リモート設定)](#3-remote-configuration) | +| 🔄 | [4. Sync Settings(同期設定)](#4-sync-settings) | +| 🚦 | [5. Selector(セレクター:高度な設定)](#5-selector-advanced) | +| 🔌 | [6. Customisation sync (Advanced)(カスタマイズ同期:高度な設定)](#6-customisation-sync-advanced) | +| 🧰 | [7. Hatch(ハッチ)](#7-hatch) | +| 🔧 | [8. Advanced settings(高度な設定)](#8-advanced-settings) | +| 💪 | [9. Power users(パワーユーザー向け設定)](#9-power-users) | +| 🩹 | [10. Patches (Edge Case)(パッチ:エッジケース)](#10-patches-edge-case) | +| 🎛️ | [11. Maintenance(メンテナンス)](#11-maintenance) | + + + +## 0. 変更履歴 + +このペインには常に最新のリリースの履歴が表示されます。特定のプラグインバージョンが読まれたかどうかは追跡せず、通常のアップデート後に自動的に開くことはありません。 + +内部データベースや設定の互換性レビューは、このペインではなく独立した安全確認ダイアログを使います。Obsidian のレイアウト準備が整った後、保留中のレビューがある場合は **「互換性レビューのため同期を一時停止しました(Synchronisation paused for compatibility review)」** として開きます。ダイアログにはリモート同期が一時停止された理由が説明され、アップデート前に設定されていた自動同期の選択は保持されます。ダイアログを閉じるか **「同期の一時停止を維持(Keep synchronisation paused)」** を選択すると、同期は一時停止されたままになります。通知(Notice)内の **「理由を確認(Review why)」** リンクをクリックするか、コマンド `Review why synchronisation is paused` を実行して再度開けます。**Change Log** を開いてもレビューを承認したことにはなりません。 + +新しいデバイスを追加した場合や、新しいプロファイルで複製された Vault を開いた場合など、デバイスローカルの承認記録が存在しないこと自体は、レビューを必須とする理由にはなりません。他に保留中のレビューがない場合、LiveSync は現在の内部データベースバージョンを記録します。未設定の既存 Vault はオンボーディング状態のままとなり、次回設定済み起動時に互換性を評価した上で、マーカーが存在しないことを記録します。既知のバージョン差異、無効なマーカー、設定スキーマの問題、および保存済みのレビューについては引き続き対応が必要です。検出された状態が実行中のバージョンで処理可能な場合、**「同期を再開(Resume synchronisation)」** を選択すると現在の内部データベースバージョンが記録され、設定どおりの動作が復元されます。古いバージョンのプラグインでは、新しいデータベースや設定バージョンによって引き起こされた一時停止を解除できません。 + + + +## 1. クイックセットアップと追加メニュー + +Quick Setup(クイックセットアップ)には、Self-hosted LiveSync を設定するためのアクションが含まれています。Obsidian 1.13 以降では、これらのアクションはルート設定ページに表示されます。ペインベースのインターフェースでは、**Quick Setup** ペインにまとめて表示されます。 + +未設定の環境では、オンボーディングダイアログは自動で開かず、Vault のローカルデータベースへのスキャンも行われません。長時間表示される通知からオンボーディングを開始できます。通知を閉じた場合は、Obsidian 1.13 以降ではルートの **Quick Setup** グループにある **「オンボーディングウィザードを再実行(Rerun Onboarding Wizard)」** を使用してください。以前のサポート対象バージョンでは、**Self-hosted LiveSync settings** → **Quick Setup** → **Rerun Onboarding Wizard** から開きます。 + +このデバイスが同期の初期化元となるファイルを所有している場合は「新しいデバイス(new-device)」のパスを選択してください。すでに確立されたリモートの状態を受信する場合は「既存デバイス(existing-device)」のパスを選択します。ウィザードは設定を有効化して再起動を要求する前に、それぞれ Rebuild(再構築)または Fetch(取得)を予約するため、通常の起動時スキャンが実行される前に選択した初期化処理が実行されます。 + +### 1. セットアップ操作 + +Self-hosted LiveSync を設定する推奨手順です。数回のクリックで設定できます。 + + + +#### セットアップ URI で接続 + +[動作中のデバイスからコピーした](#copy-the-current-settings-to-a-setup-uri)、またはセットアップスクリプトによって生成されたセットアップ URI を使用して Self-hosted LiveSync を設定します。 + +現在のセットアップ URI は、リモートプロファイル、表示名、および個別のメイン/P2P の選択を保持します。フラットな接続設定のみを含む古い形式のセットアップ URI も引き続きサポートされており、適用時にリモートプロファイルへ移行されます。 + +設定するデバイスに応じてアクションを選択してください。 + +| 選択肢 | 動作 | +| --- | --- | +| **⚠️ Initialise or overwrite the remote(リモートを初期化または上書き)** | この Vault からリモートを初期化します。リモート上の既存データは上書きされます。 | +| **🔗 Join this device(このデバイスを参加させる)** | 既存のリモートに参加し、その同期データをこのデバイスに取得(Fetch)します。追加のデバイスにはこれを使用します。 | +| **⚙️ Apply settings only (advanced)(設定のみ適用:高度な設定)** | 再構築や取得を行わずに設定のみを適用します。このデバイスにすでに互換性のある同期データがある場合にのみ使用してください。 | + +#### 手動セットアップ + +Self-hosted LiveSync をステップバイステップで手動設定します。最小限の設定項目で設定できます。 + +手動で CouchDB、オブジェクトストレージ、または P2P のセットアップを完了すると、すでに保存されているプロファイルを置き換えることなく、対応するリモートプロファイルが作成されます。CouchDB およびオブジェクトストレージのセットアップでは、新しいプロファイルがメインリモートとして選択されます。P2P セットアップでは P2P 用として選択され、ウィザードが LiveSync を有効化している場合はメインリモートとしても選択されます。わかりやすい表示名が自動生成され、後から変更可能です。 + +#### LiveSync を有効化 + +セットアップが完了していない場合にのみこのボタンが表示されます。手動セットアップが完了したら、このボタンからこのデバイスで LiveSync を有効化できます。 + +### 2. 他のデバイスをセットアップ + + + +#### 現在の設定をセットアップ URI にコピー + +動作中のデバイスから現在の設定をコピーし、[追加のデバイスでセットアップ URI を開きます](#connect-with-setup-uri)。URI と個別のパスフレーズは厳重に保管してください。 + +パスフレーズを入力した後、**Setup URI availability** で **Time-bound(有効期限付き)** または **Compatible (no time limit)(互換性優先:無期限)** を選択します。 + +- **Time-bound(有効期限付き)**: デフォルトです。ダイアログにはこのデバイスのローカルタイムゾーンでの正確な終了時刻が表示されます。現在の固定7日間の UTC ウィンドウの終了時点を指すため、残り時間は7日未満になる場合があります。受信側デバイスには、有効期限付きセットアップ URI をサポートするバージョンが必要です。 +- **Compatible (no time limit)(互換性優先:無期限)**: 時間制限のない既存の暗号化 URI 形式を使用します。古い受信側デバイスでも、URI に含まれる設定をサポートしている必要があります。 + +時間制限は URI を開く際にチェックされます。すでにインポートされた設定や認証情報は、期限後も引き続き使用可能です。この制限によってリモートアクセス権が取り消されることはなく、デバイスの時計を巻き戻して URI を再利用することも防げません。表示された時刻を過ぎた場合は、動作中のデバイスから新しい URI を生成してください。 + +QR コード共有は既存の形式を使用し、時間制限はありません。QR コード には共有設定と認証情報が含まれているため、厳重に保管してください。 + +### 3. 追加メニュー + +設定ダイアログを簡潔に保つため、一部のメニューや機能はデフォルトで非表示になっています。Obsidian 1.13 以降では、**General Settings** → **Extra menus** から有効化できます。ペインベースのインターフェースでは、General Settings 内に同様のコントロールが表示されます。 + + + +#### 高度な機能を有効化 + +画面表示: **高度な機能を有効にする** + +設定キー: `useAdvancedMode` + +この設定を有効にすると、以下のペインが表示されます。 +| アイコン | 説明 | +| :--: | ------------------------------------------------------------------ | +| 🚦 | [5. Selector (Advanced)](#5-selector-advanced) | +| 🔌 | [6. Customisation sync (Advanced)](#6-customisation-sync-advanced) | +| 🔧 | [8. Advanced settings(高度な設定)](#8-advanced-settings) | + +#### エキスパート機能を有効化 + +画面表示: **エキスパート機能を有効にする** + +設定キー: `usePowerUserMode` + +この設定を有効にすると、以下のペインが表示されます。 +| アイコン | 説明 | +| :--: | ------------------------------------------------------------------ | +| 💪 | [9. Power users(パワーユーザー向け設定)](#9-power-users) | + +#### エッジケース対応機能を有効化 + +画面表示: **エッジケース対応機能を有効にする** + +設定キー: `useEdgeCaseMode` + +この設定を有効にすると、以下のペインが表示されます。 +| アイコン | 説明 | +| :--: | ------------------------------------------------------------------ | +| 🩹 | [10. Patches (Edge Case)](#10-patches-edge-case) | + + + +## 2. 一般設定 + +### 1. 外観 + +アイコンの意味、進行状況カウンター、CSS スニペットについては、[ステータス表示ガイド](tips/status-display.md) を参照してください。 + +#### 表示言語 + +画面表示: **インターフェースの表示言語** + +設定キー: `displayLanguage` + +表示言語を変更できます。システムの言語や Obsidian の言語設定とは独立しています。 +注意: 未翻訳のメッセージも一部含まれます。エラー報告の際は一度「既定(英語)」に戻してください。もちろん、翻訳への貢献は大歓迎です。 + +#### エディタ内にステータスを表示 + +画面表示: **ステータスをエディタ内に表示** + +設定キー: `showStatusOnEditor` + +エディタ内に同期ステータスを表示できます。 +再起動後に反映されます。 + +#### ステータスをアイコンのみで表示 + +画面表示: **ステータス表示をアイコンのみにする** + +設定キー: `showOnlyIconsOnEditor` + +ステータスをアイコンのみで表示します。ステータスバーのスペースを節約したい場合に便利です。 + +#### ステータスバーにステータスを表示 + +画面表示: **ステータスバーに、ステータスを表示** + +設定キー: `showStatusOnStatusbar` + +ステータスバーに同期ステータスを表示できます(デフォルト: オン)。 + +#### ファイル警告バナーの代わりにステータスアイコンを表示 + +画面表示: **ファイル警告バナーの代わりにステータスアイコンを表示** + +設定キー: `hideFileWarningNotice` + +有効にすると、ファイル警告バナーの代わりにステータス内に ⛔ アイコンが表示されます。詳細情報は表示されなくなります。 + +#### ネットワーク警告の表示方法 + +画面表示: **ネットワーク警告の表示方式** + +設定キー: `networkWarningStyle` + +同期サーバーに接続できないときのネットワークエラーの表示方法を設定します。 + +#### 大量の変更受信時にワークスペースを保護(オプトイン) + +画面表示: **SyncGuard を有効化** + +設定キー: `syncGuardEnabled` + +有効にすると、CouchDB LiveSync の起動時または再開時に多数のノート変更を受信したことを検知した後、ワークスペースの操作を一時的にブロックします。保護中も変更の受信と適用は続きます。同期に失敗した場合やリモートを利用できない場合も含め、オーバーレイはいつでも解除できます。この設定はデバイスごとに保存され、同期先の他のデバイスには影響しません。 + +SyncGuard の設定はメインのプラグイン設定とは別に、このデバイス、Vault、および[データベースサフィックス](#database-suffix)ごとにローカル保存されます。セットアップ URI では転送されません。以前のテストビルドで保存された値は、プラグイン起動時にデバイスごとの保存領域へ移行されます。 + +データベースサフィックスを変更した後は、Obsidian を再起動してから、オーバーレイを利用する前に SyncGuard の2つの設定を確認してください。再起動するまでは、設定画面に以前のサフィックスに対する値が表示される場合があります。 + +このしきい値により、通常の少量の転送では操作を妨げません。ただし、受信前に変更数を把握できないため、SyncGuard が有効になる前に一部のノートが更新されることがあります。SyncGuard はユーザーインターフェース上の補助機能であり、Vault のアトミックなスナップショットを保証するものでも、他のプラグインや外部ツールの操作を制限するものでもありません。ほかのリモート種別や、初回のキャッチアップ後に発生した通常のライブ変更には適用されません。 + +**待たずに続行**を選ぶと、同期が続いている間もワークスペースを操作できるため、一部のノートが最新でない場合があります。SyncGuard は主に起動時または再開時の保護機能です。手動で解除した後、内部的に再接続してもオーバーレイが再表示されるとは限りません。後続の変更が反映されたか確認するには、同期状態を確認してください。 + +#### ワークスペース保護に必要な受信ファイル数 + +画面表示: **SyncGuard を適用する最小ファイル数** + +設定キー: `syncGuardMinimumFiles` + +キャッチアップ中に保護を開始するために必要な、異なるノートのメタデータドキュメント数です(デフォルト: 20)。チャンクドキュメントや同じノートの繰り返しのリビジョンは件数に加算されません。保護が始まると、ネットワークからのキャッチアップが正常に完了し、観測されたローカル処理がすべて終わるまで保護が続きます。キャッチアップに失敗した場合は、**待たずに続行**を選んでオフラインで作業してください。 + +### 2. ログ + +#### 通知のみを表示 + +画面表示: **通知のみ表示** + +設定キー: `lessInformationInLog` + +ログ出力を抑制し、通知のみを表示します。不具合のログを報告する際は無効にしてください。 + +#### 詳細ログ + +画面表示: **詳細ログ** + +設定キー: `showVerboseLog` + +詳細なログを出力します。不具合のログを報告する際は有効にしてください。 + + + +## 3. リモート設定 + +### 1. 接続設定 + +Self-hosted LiveSync は、**Connection settings** → **Saved connections** に複数のリモート接続プロファイルを保存します。各プロファイルは CouchDB データベース、オブジェクトストレージ接続、または P2P 設定を表し、1つの Vault 内に複数のプロファイルを保持できます。 + +各プロファイルには一意の内部識別子と表示名があります。表示名は重複しても問題なく、プロファイルの選択には使用されません。メインリモートと P2P リモートは個別に選択されるため、コードや設定のインポートでは `default` のような特別な識別子に依存せず、両方の選択を保持する必要があります。 + +- **➕ 新規接続を追加 (Add new connection)**: セットアップダイアログを開いて新しい接続プロファイルを作成します。 +- **📥 接続をインポート (Import connection)**: 接続文字列(`sls+https://...`、`sls+s3://...`、`sls+p2p://...` など)を貼り付けてリモート設定プロファイルをインポートします。 - **🔧 設定 (Configure)**: セットアップダイアログを開き、選択した接続プロファイルの設定を編集します。 -- **✅ 有効化 (Activate)**: 選択したプロファイルをアクティブな同期先として有効化します。 +- **✅ 有効化 (Activate)**: このプロファイルを選択し、現在アクティブなリモートとして有効化します。 - **🗑️ 削除 (Delete)**: 接続プロファイルを一覧から削除します。 -これらの接続プロファイルを追加・編集する際、選択したデータベースの種類(CouchDB、S3互換オブジェクトストレージ、P2Pなど)に応じたセットアップダイアログが開きます。 +#### リモートの種類 -何らかの同期が有効になっている場合は編集できないため、同期を解除してから行ってください。 +画面表示: **現在の同期方式** -### CouchDB の設定 -CouchDBの各設定項目は、接続プロファイルを追加 (➕) または設定 (🔧) する際に開く **CouchDB セットアップダイアログ** 内で設定します。 +設定キー: `remoteType` -#### URI -設定キー: couchDB_URI +アクティブな接続タイプです。接続プロファイルをアクティブ化すると、自動的に従来の構成へ反映されます。 -CouchDBの接続先URIです。ダイアログ内では **URL** と表記されます。Cloudantの場合は「External Endpoint (preferred)」になります。 -注意: Obsidian Mobileではセキュア接続 (HTTPS) のみが使用可能です。また、末尾にスラッシュ(`/`)を付けてはいけません。 +### 参加済みデバイス -#### Username -設定キー: couchDB_USER +**「参加済みデバイス」** から **「デバイスを確認」** を選択すると、アクティブな CouchDB またはオブジェクトストレージ接続上のデバイスレコードを確認できます。コマンドパレットやバージョン通知からも同じ操作を実行できます。**「更新」** を選択すると、リモートから一覧を再読み込みします。このデバイスのレコードがリモートに存在しない場合も含め、常にこのデバイスが先頭に表示されます。このダイアログを開いたり更新したりしても、欠落している CouchDB データベースが自動作成されることはありません。 -CouchDBのログインユーザー名です。ダイアログ内では **Username** と表記されます。このユーザーには管理者権限があることが望ましいです。 +一覧には各デバイスの ID、記録されたプラットフォーム、プラグインのバージョン、アプリのバージョン、最後に記録された接続日時が表示されます。古いクライアントでは情報が不完全な場合があります。これらの記録から、デバイスが現在オンラインかどうかは分かりません。ロックされたリモートでは、許可リスト外のデバイスは **「接続拒否」** と表示されます。 -#### Password -設定キー: couchDB_PASSWORD +同期が開始される前、およびこのダイアログが更新されたときに、Self-hosted LiveSync は自身より新しいまたは古いプラグインバージョンが記録されていないか確認します。バージョンが異なる場合は、デバイス間でプラグインバージョンを確認して統一するよう推奨通知が表示されます。これは推奨通知であり、同期自体は停止しません。ダイアログでは、明示的に接続がブロックされていない限り異なるバージョン間の同期は概ね安全ですが、効率が低下したりストレージを多く消費したりする可能性があること、また P2P 同期が利用できない可能性があることが説明されます。不明な開発バージョンのラベルは未分類のままとなります。自動確認は同期開始時に最大で1分に1回実行され、接続を持続的にポーリングすることはありません。 -CouchDBのログインパスワードです。ダイアログ内では **Password** と表記されます。 +**「デバイスの記録を削除(Forget device)」** は、確認後に他のデバイスの参加レコードを削除します。リモートのロック状態や他のすべてのデバイスは保持されます。Vault ファイルが削除されたり、認証情報が無効化されたりすることはありません。ロックされていないリモートでは、デバイスは再度登録可能です。ロックされたリモートでは、既存の復旧手順が適用されます。CouchDB に保存後、結果が確認されます。確認できない場合は一覧を更新して再試行してください。CouchDB はこれらのレコードを同時更新を拒否しないローカルドキュメントにまとめて保存するため、他のデバイスからの変更によって上書きされる可能性があります。他のデバイスで同期を一時停止することで競合を回避できます。オブジェクトストレージは条件付き更新を使用します。サーバーが条件付き更新をサポートしていない場合、レコードは保持されます。 -#### Database Name -設定キー: couchDB_DBNAME +### 2. 通知 -同期先のデータベース名です。ダイアログ内では **Database Name** と表記されます。 -注意: データベース名には大文字、スペース、および一部の特殊文字(`_$()+/-` 以外)は使用できません。また、アンダースコア(`_`)から始めることはできません。存在しない場合は、接続テスト時または設定適用時に自動作成されます(作成権限が必要です)。 +#### 起動時にリモートの推定ストレージ容量を通知 -#### CORS回避のためにRequest APIを使用する -設定キー: useRequestAPI +画面表示: **起動時に推定リモートストレージサイズがしきい値を超えたら通知** -この項目はセットアップダイアログ内では **Use Internal API** と表記されます。有効な場合、不可避なCORS問題を回避するためにObsidianの内部Request APIを使用します。これはWeb標準に準拠していない回避策であり、すべての環境での動作を保証するものではありません。安全性が低下する可能性がある点にご注意ください。将来のObsidianのアップデートによって動作しなくなる可能性があります。 +設定キー: `notifyThresholdOfRemoteStorageSize` -#### カスタムヘッダー -設定キー: couchDB_CustomHeaders +MB 単位(0で無効化)。起動時、この値が未設定の場合、または推定リモートストレージサイズがこの値を超えた場合に、クリック可能な長時間表示通知が表示されます。**「選択肢を確認(Review options)」** を選択すると、時間制限のない詳細ダイアログが開きます。明示的にリモートサイズチェックを実行すると、そのダイアログが直接開きます。 -CouchDBサーバーに送信するすべてのリクエストに含めるカスタムHTTPヘッダーを設定します。ダイアログ内では **Custom Headers** と表記されます。`ヘッダー名: 値` の形式で、1行に1つずつ入力してください。 +### 3. プライバシーと暗号化 -#### JWT認証の使用 (実験的機能) -設定キー: useJWT +#### エンドツーエンド暗号化 -CouchDBでのJSON Web Token (JWT) 認証を有効にします。ダイアログ内では **Use JWT Authentication** と表記されます。十分に検証されていない実験的機能であるため、ご注意ください。 +画面表示: **E2E暗号化** -#### JWTアルゴリズム -設定キー: jwtAlgorithm +設定キー: `encrypt` -JWTの署名に使用するアルゴリズムを選択します。ダイアログ内では **JWT Algorithm** と表記されます。対応アルゴリズム: `HS256`, `HS512`, `ES256`, `ES512` - -#### JWT有効期限 (分) -設定キー: jwtExpDuration - -トークンの有効期限を分単位で指定します。ダイアログ内では **JWT Expiration Duration (minutes)** と表記されます。`0` を指定すると有効期限は無効になります。 - -#### JWTキー -設定キー: jwtKey - -JWTの署名に使用する秘密鍵またはプライベートキーを指定します。ダイアログ内では **JWT Key** と表記されます。`HS256/HS512` の場合は共通鍵を、`ES256/ES512` の場合は pkcs8 PEM形式の秘密鍵を入力してください。 - -#### JWTキーID (kid) -設定キー: jwtKid - -JWTヘッダーに含めるキーIDを指定します。ダイアログ内では **JWT Key ID (kid)** と表記されます。 - -#### JWTサブジェクト (sub) -設定キー: jwtSub - -JWTのサブジェクト (CouchDBユーザー名) を指定します。ダイアログ内では **JWT Subject (sub)** と表記されます。 - -### Object Storage (Minio, S3, R2) の設定 -Object Storageの各設定項目は、接続プロファイルを追加 (➕) または設定 (🔧) する際に開く **S3/MinIO/R2 セットアップダイアログ** 内で設定します。 - -#### エンドポイントURL -設定キー: endpoint - -S3互換ストレージのエンドポイントURLです。ダイアログ内では **Endpoint URL** と表記されます。 -注意: Obsidian Mobileではセキュア接続 (HTTPS) のみが使用可能です。 - -#### アクセスキー ID -設定キー: accessKey - -認証に使用するアクセスキーIDです。ダイアログ内では **Access Key ID** と表記されます。 - -#### シークレットアクセスキー -設定キー: secretKey - -認証に使用するシークレットアクセスキーです。ダイアログ内では **Secret Access Key** と表記されます。 - -#### リージョン -設定キー: region - -ストレージのリージョンを指定します(例: `us-east-1`、Cloudflare R2の場合は `auto`)。ダイアログ内では **Region** と表記されます。 - -#### バケット名 -設定キー: bucket - -同期データを保存するバケット名です。ダイアログ内では **Bucket Name** と表記されます。 - -#### カスタムHTTPハンドラーを使用する -設定キー: useCustomRequestHandler - -この項目はセットアップダイアログ内では **Use internal API** と表記されます。オブジェクトストレージがCORSをサポートしていない場合に有効にします。Obsidianの内部APIを使用してS3サーバーと通信することでCORS制約を回避します。Web標準には準拠していないため、将来のObsidianのアップデートによって動作しなくなる可能性があります。 - -#### バケット内のファイルプレフィックス -設定キー: bucketPrefix - -この項目はセットアップダイアログ内では **Folder Prefix** と表記されます。実質的なディレクトリ指定です。末尾は `/` である必要があります(例:`vault-name/`)。バケットのルートに保存する場合は空欄のままにしてください。 - -#### forcePathStyleを有効にする -設定キー: forcePathStyle - -この項目はセットアップダイアログ内では **Use Path-Style Access** と表記されます。有効な場合、バケット操作でforcePathStyleオプションを使用します。 - -#### カスタムヘッダー -設定キー: bucketCustomHeaders - -オブジェクトストレージバケットに送信するすべてのリクエストに含めるカスタムHTTPヘッダーを設定します。ダイアログ内では **Custom Headers** と表記されます。`ヘッダー名: 値` の形式で、1行に1つずつ入力してください。 - - - -### End to End Encryption -データベースを暗号化します。この効果はデータベースに格納されるデータに限られ、ディスク上のファイルは平文のままです。 -暗号化はAES-GCMを使用して行っています。 - -### Passphrase -暗号化を行う際に使用するパスフレーズです。充分に長いものを使用してください。 - -### パスの難読化 -設定キー: usePathObfuscation - -ダイアログ内では **Obfuscate Properties** と表記されます。有効な場合、リモートサーバー上でのファイルパスやフォルダ名を難読化(暗号化)します。これによりプライバシーが向上しますが、パフォーマンスがわずかに低下する可能性があります。 - -### 暗号化アルゴリズム -設定キー: E2EEAlgorithm - -ダイアログ内では **Encryption Algorithm** と表記されます。エンドツーエンド暗号化に使用する暗号化アルゴリズムのバージョンを選択します。 -- `v2` (V2: AES-256-GCM With HKDF): 推奨されるデフォルトのバージョンです。 -- `forceV1` または `""` (V1: Legacy): レガシーな暗号化バージョンです。古いバージョンで暗号化された既存の保管庫(Vault)を同期する場合にのみ使用してください。 - -### Apply -End to End 暗号化を行うに当たって、異なるパスフレーズで暗号化された同一の内容を入手されることは避けるべきです。また、Self-hosted LiveSyncはコンテンツのcrc32を重複回避に使用しているため、その点でも攻撃が有効になってしまいます。 - -そのため、End to End 暗号化を有効にする際には、ローカル、リモートすべてのデータベースをいったん破棄し、新しいパスフレーズで暗号化された内容のみを、改めて同期し直します。 - -有効化するには、一番体力のある端末からApply and sendを行います。 -既に存在するリモートと同期する場合は、設定してJust applyを行ってください。 - -- Apply and send -1. ローカルのデータベースを初期化しパスフレーズを設定(またはクリア)します。その後、すべてのファイルをもう一度データベースに登録します。 -2. リモートのデータベースを初期化します。 -3. リモートのデータベースをロックし、他の端末を締め出します。 -4. すべて再送信します。 - -負荷と時間がかかるため、デスクトップから行う方が好ましいです。 -- Apply and receive -1. ローカルのデータベースを初期化し、パスフレーズを設定(またはクリア)します。 -2. リモートのデータベースにかかっているロックを解除します。 -3. すべて受信して、復号します。 - -どちらのオペレーションも、実行するとすべての同期設定が無効化されます。 - - - - -### Test Database connection -上記の設定でデータベースに接続できるか確認します。 - -### Check database configuration -ここから直接CouchDBの設定を確認・変更できます。 - -### Peer-to-Peer (P2P) 同期の設定 - -#### P2P同期を有効にする -設定キー: P2P_Enabled - -WebRTCを介したデバイス間での直接的なP2P同期を有効にします。ダイアログ内では **Enabled** と表記されます。 - -#### リレーサーバーのURL -設定キー: P2P_relays - -WebRTCによるP2P接続を仲介・調整するためのWebSocketリレーサーバーのURLを指定します。ダイアログ内では **Relay URL** と表記されます。複数のURLを指定する場合はカンマで区切ります。ダイアログ内のボタンをクリックすると、デフォルトのリレーサーバーを設定できます。 - -#### グループID -設定キー: P2P_roomID - -同期するデバイス群を識別するためのルームIDまたはグループIDを指定します。ダイアログ内では **Group ID** と表記されます。同期させたいすべてのデバイスで同じグループIDを指定する必要があります。任意のカスタム文字列を入力するか、ランダム生成ボタンで生成できます。 +エンドツーエンド暗号化を有効にします。有効化を推奨します。パスフレーズを変更した場合は、データベースの再構築が必要になります(案内が表示されます)。 #### パスフレーズ -設定キー: P2P_passphrase -P2P通信の認証および暗号化に使用するパスワード(パスフレーズ)を指定します。ダイアログ内では **Passphrase** と表記されます。同期するすべてのデバイスで同じパスフレーズを指定する必要があります。 +画面表示: **パスフレーズ** -#### デバイス名 -設定キー: P2P_DevicePeerName +設定キー: `passphrase` -P2Pネットワーク上でこのデバイスを識別するための名前を指定します。ダイアログ内では **Device Peer ID** と表記されます。グループ内のデバイス間で重複しない一意の値を設定してください。 +暗号化パスフレーズです。パスフレーズを変更した場合は、データベースの再構築が必要になります(案内が表示されます)。 -#### 起動時のP2P自動接続開始 -設定キー: P2P_AutoStart +#### 独立した ID の導出 -有効な場合、プラグインの起動時に自動的にP2P接続を開始します。ダイアログ内では **Auto Start P2P Connection** と表記されます。 +設定キー: `idDerivationVersion`, `idDerivationKey` -#### 接続済みピアへの変更の自動ブロードキャスト -設定キー: P2P_AutoBroadcast +この設定は、暗号化されたチャンク ID および難読化されたメタデータドキュメント ID 用に独立したキーを保存します。新しい Vault のセットアップでは、E2EE が有効な場合にデフォルトで **「ランダムな ID キーを生成(Generate a random ID key)」** が選択されます。既存の Vault ではデフォルトで **「現在の設定を保持(Keep current configuration)」** が選択されます。ラジオボタンの選択肢には利用可能な構成がまとめて表示されます。**Keep current configuration** の下の小さな説明文には、保存されている構成(既存の ID キー、または E2EE パスフレーズにリンクされたレガシー ID)が表示されます。その選択肢はどちらの状態も維持します。新規 Vault で明示的に選択するとレガシー ID が使用されます。レガシー構成の場合、E2EE パスフレーズを変更すると ID も変更されます。 -有効な場合、ローカルでの変更が接続済みのピアに自動的にブロードキャストされます。ダイアログ内では **Auto Broadcast Changes** と表記されます。通知されたピアは変更の取得を開始します。 +自分でキーを設定するには、**「ID キーを設定(Set an ID key)」** を選択します。その後、**「現在の E2EE パスフレーズから導出(Derive from current E2EE passphrase)」**、**「ID ソースを入力(Enter an ID source)」**、**「ID 復旧コードをインポート(Import an ID recovery code)」** の3つの選択肢が表示されます。後ろの2つではテキスト入力欄が表示されます。ソース入力欄はタグ付きの復旧コードも認識します。空欄のままにすると既存のキーが保持され、最初のキー設定には入力が必要です。通常のソースは設定を適用する際にキーに変換され、後から再表示できません。復旧コードは保存されたキーを直接インポートします。 -#### TURNサーバーのURL (カンマ区切り) -設定キー: P2P_turnServers +このデバイスで保存されたキーを表示・コピーするには、**「現在の復旧コードを表示(Show current recovery code)」** を使用します。コードは `sls-id-v1:` で始まり、別のキーを導出することなく、別のデバイスの手動入力欄に貼り付けられます。セットアップ URI は別のパスフレーズの下で同じ保存済みキーを保持します。すべてのデバイスを紛失した後に構成を復元する必要がある場合は、ランダムなデフォルトに頼る前に、復旧コードを保存するか、再現可能なソースを選択してください。コードは厳重に保管してください。 -ダイアログ内では **TURN Server URLs (comma-separated)** と表記されます。厳しいNATやファイアウォールがある環境で、WebRTCの直接接続が確立できない場合にP2P接続を中継するためのTURN/STUNサーバーのURLをカンマ区切りで指定します。通常は空欄のままで問題ありません。 +E2EE パスフレーズをソースとして使用すると、後からパスフレーズを変更しても ID の安定性が保たれますが、既知の ID に基づく推測から元のパスフレーズを分離できません。その分離が重要な場合は、長く予測困難な別のソースを使用してください。強度の低いソースをハッシュ化しても強度は向上しません。 -#### TURNユーザー名 -設定キー: P2P_turnUsername +後から E2EE パスフレーズを変更しても保存された ID キーは変更されませんが、暗号化されたデータに対しては既存の再暗号化および再構築(Rebuild)手順が引き続き適用されます。E2EE がオフの間、保存された ID キーは保持されますが使用されず、E2EE が再び有効になるまでは既存のレガシー ID 生成が適用されます。パスの難読化がオフの場合、異なる ID キーを持つデバイス間でも同期できますが、同一のコンテンツに対して重複したチャンクが生成される可能性があります。パスの難読化が有効な場合、ID キーを有効化、置換、または無効化するとドキュメント ID が変わる可能性があります。通常の同期を再開する前に、参加デバイスを更新し、信頼できる Vault から Rebuild を実行し、他のデバイスで Fetch を実行してください。QR コード には既存の QR 共有ルールに基づき保存されたキーが含まれるため、QR コード は厳重に保管してください。 -TURNサーバーでの認証に使用するユーザー名を設定します。ダイアログ内では **TURN Username** と表記されます。 +#### パスの難読化 -#### TURNパスワード -設定キー: P2P_turnCredential +画面表示: **パスの難読化** -TURNサーバーでの認証に使用するパスワード(クレデンシャル)を設定します。ダイアログ内では **TURN Credential** と表記されます。 +設定キー: `usePathObfuscation` -## Local Database Configurations -端末内に作成されるデータベースの設定です。 +デフォルトでは、パフォーマンス向上のためファイルパスは難読化されません。これを有効にするとファイルパスが難読化されます。ファイルパスを隠蔽したい場合に便利です。 -### Batch database update -データベースの更新を以下の事象が発生するまで遅延させます。 -- レプリケーションが発生する -- 他のファイルを開く -- ウィンドウの表示状態を変更する -- ファイルの修正以外のファイル関連イベント -このオプションはLiveSyncと同時には使用できません。 +#### ファイルの内部プロパティを暗号化 -### minimum chunk size と LongLine threshold -チャンクの分割についての設定です。※現在これらの項目はUIから直接設定することはできません(デフォルト値で自動処理されます)。 +画面表示: **内部ファイルプロパティを暗号化** -Self-hosted LiveSyncは一つのチャンクのサイズを最低minimum chunk size文字確保した上で、できるだけ効率的に同期できるよう、ノートを分割してチャンクを作成します。 -これは、同期を行う際に、一定の文字数で分割した場合、先頭の方を編集すると、その後の分割位置がすべてずれ、結果としてほぼまるごとのファイルのファイル送受信を行うことになっていた問題を避けるために実装されました。 -具体的には、先頭から順に直近の下記の箇所を検索し、一番長く切れたものを一つのチャンクとします。 +設定キー: `encryptInternalMetadata` -1. 次の改行を探し、それがLongLine Thresholdより先であれば、一つのチャンクとして確定します。 +CouchDB では、非表示ファイル同期およびカスタマイズ同期で使用されるメタデータ内のパス、日時、サイズ、およびチャンク参照を暗号化します。E2EE V2 と **Property Encryption(プロパティ暗号化)** が必要です。新規 Vault ではデフォルトで有効になっていますが、これらの前提条件が有効になるまでは効果がありません。既存の Vault や古いセットアップ URI、QR コードでは、有効化しない限り無効のままとなります。 -2. そうではない場合は、下記を順に探します。 - 1. 改行 - 2. windowsでの空行がある所 - 3. 非Windowsでの空行がある所 -3. この三つのうち一番遠い場所と、 「改行後、#から始まる所」を比べ、短い方をチャンクとします。 +この設定を有効にすると、今後のメタデータ書き込みが保護されます。既存のメタデータや以前のリビジョンはリモートデータベース内で平文のまま残る可能性があります。既存のメタデータも保護したい場合は、完全なデータを準備し、すべてのデバイスを互換バージョンにアップデートした上で、手動でリモートデータベースを再構築(Rebuild)してください。この設定を変更しても、LiveSync が自動的にデータを収集したり再構築を開始したりすることはありません。再構築せずに有効化する操作では、現在 LiveSync を実行中のデバイスも含め、他のすべての同期デバイスを事前にアップデートするよう明示的にリマインドされます。移行期間中は平文と暗号化されたメタデータが混在できます。ドキュメント ID、リビジョン情報、ドキュメント数、および暗号文の長さは引き続き外部から確認可能です。 -このルールは経験則的に作りました。実データが偏っているため。もし思わぬ挙動をしている場合は、是非コマンドから`Dump informations of this doc`を選択し、情報をください。 -改行文字と#を除き、すべて●に置換しても、アルゴリズムは有効に働きます。 -デフォルトは20文字と、250文字です。 +#### 暗号化アルゴリズム -### チャンクスプリッター -設定キー: chunkSplitterVersion +画面表示: **暗号化アルゴリズム** -チャンク分割アルゴリズムを選択します。V3が最も効率的です。問題が発生した場合はDefaultまたはLegacyに設定してください。 +設定キー: `E2EEAlgorithm` -## General Settings -一般的な設定です。 +エンドツーエンド暗号化に使用する暗号化アルゴリズムのバージョンです。 -### Do not show low-priority log -有効にした場合、優先度の低いログを記録しません。通知を伴うログのみ表示されます。 +- `v2`(V2: AES-256-GCM With HKDF): 推奨およびデフォルトのバージョン。 +- `forceV1` または `""`(V1: レガシー): 旧世代の暗号化。レガシー形式で暗号化された既存の Vault がある場合にのみ使用してください。 -### Vervose log -詳細なログをログに出力します。 +#### 反復回数を動的に設定(旧 V1 との互換性) -### ファイル警告バナーの代わりにステータスアイコンを表示 -設定キー: hideFileWarningNotice +設定キー: `useDynamicIterationCount` -有効な場合、ファイル警告バナーの代わりにステータス表示内に ⛔ アイコンが表示されます(詳細情報は非表示になります)。 +この設定はレガシーな V1 暗号化データにのみ適用されます。既存の V1 データベースを開く際は保存された値を維持してください。新規 Vault では E2EE V2 が使用されるため、この設定は使用されません。 -### ネットワーク警告のスタイル -設定キー: networkWarningStyle +### 4. 取得設定 -同期サーバーに接続できない場合のネットワークエラーの表示方法。 +#### リモートサーバーから設定を取得 -## Sync setting -同期に関する設定です。 +すでに設定されているリモートサーバーから必要な設定を取得します。 -### 同期モード (Sync Mode) -設定キー: syncMode +### 5. MinIO・S3・R2 -同期処理を実行するトリガーとなる条件を設定します。 -- **LiveSync** (`LIVESYNC`): リアルタイムかつ継続的な双方向同期を行います。 - 注意: このモードには CouchDB または WebRTC P2P リモートサーバーが必要です。S3互換オブジェクトストレージではサポートされていません。 -- **Periodic Sync** (`PERIODIC`): **Periodic Sync Interval** で指定した一定の間隔ごとに同期処理を実行します。 -- **On Events** (`ONEVENTS`): ファイルの保存、ファイルを開く、起動時など、特定のイベントが発生した際に同期をトリガーします(詳細は下部の設定スイッチで制御します)。 +これらの設定は、オブジェクトストレージの接続プロファイルを追加(`➕`)または編集(`🔧`)する際に開く **S3/MinIO/R2 セットアップダイアログ** 内で設定します。 -### Periodic Sync Interval -定期的に同期を行う場合の間隔(秒単位)です。 +#### エンドポイント URL -### 同期の最小間隔 -設定キー: syncMinimumInterval +画面表示: **エンドポイント URL** -イベント時の自動同期の最小間隔(ミリ秒)。 +設定キー: `endpoint` -### Sync on Save -ファイルが保存されたときに同期を行います。 -**Obsidianは、ノートを編集している間、定期的に保存を行います。添付ファイルを新しく追加した場合も同様に処理されます。** +リモートストレージのエンドポイント URL です。 +注意: Obsidian Mobile ではセキュア接続(HTTPS)のみが使用可能です。 -### Sync on File Open -ファイルを開いた際に同期を行います。 +#### アクセスキー -### Sync on Start -Obsidianの起動時に同期を行います。 +画面表示: **アクセスキー** -備考: -LiveSyncをONにするか、もしくはPeriodic Sync + Sync On File Openがオススメです。 +設定キー: `accessKey` -### Use Trash for deleted files -リモートでファイルが削除された際、デバイスにもその削除が反映されます。 -このオプションが有効になっている場合、実際に削除する代わりに、ゴミ箱に移動します。 +認証に使用するアクセスキー ID です。ダイアログ内では **Access Key ID** と表記されます。 -### Do not delete empty folder -Self-hosted LiveSyncは通常、フォルダ内のファイルがすべて削除された場合、フォルダを削除します。 -備考:Self-hosted LiveSyncの同期対象はファイルです。 +#### シークレットキー -### Use newer file if conflicted (beta) -競合が発生したとき、常に新しいファイルを使用して競合を自動的に解決します。 +画面表示: **シークレットキー** +設定キー: `secretKey` -### Experimental. -### Sync hidden files +認証に使用するシークレットアクセスキーです。ダイアログ内では **Secret Key** と表記されます。 -隠しファイルを同期します +#### リージョン -- Scan hidden files before replication. -このオプション有効にすると、レプリケーションを実行する前に隠しファイルをスキャンします。 +画面表示: **リージョン** -- Scan hidden files periodicaly. -このオプションを有効にすると、n秒おきに隠しファイルをスキャンします。 +設定キー: `region` + +ストレージのリージョンです(例: `us-east-1`、Cloudflare R2 の場合は `auto`)。 + +#### バケット名 + +画面表示: **バケット名** + +設定キー: `bucket` + +同期ファイルを保存するバケットの名前です。 + +#### カスタム HTTP ハンドラーを使用 + +画面表示: **カスタム HTTP ハンドラーの利用** + +設定キー: `useCustomRequestHandler` + +この項目はセットアップダイアログ内では **Use internal API(内部 API を使用)** と表記されます。オブジェクトストレージが CORS をサポートしていない場合に有効化してください。S3 サーバーとの通信に Obsidian の内部 API を使用します。これは Web 標準に準拠していませんが、CORS 制限を回避できます。将来の Obsidian バージョンで動作しなくなる可能性があります。 + +#### バケット内のファイルプレフィックス + +画面表示: **バケット内のファイルプレフィックス** + +設定キー: `bucketPrefix` + +この項目はセットアップダイアログ内では **Folder Prefix(フォルダープレフィックス)** と表記されます。実質的なディレクトリとして機能します。末尾は `/` で終わる必要があります(例: `vault-name/`)。バケットのルートにデータを保存する場合は空欄のままにします。 + +#### forcePathStyle を有効化 + +画面表示: **forcePathStyle を有効化** + +設定キー: `forcePathStyle` + +この項目はセットアップダイアログ内では **Use Path-Style Access(パススタイルアクセスを使用)** と表記されます。有効にすると、バケット操作に forcePathStyle オプションが使用されます。 + +#### カスタムヘッダー + +画面表示: **カスタムヘッダー** + +設定キー: `bucketCustomHeaders` + +オブジェクトストレージバケットに送信されるすべてのリクエストに含めるカスタム HTTP ヘッダーです。`Header-Name: Value` の形式で、各ヘッダーを改行で区切って指定します。 + +#### 接続をテスト + +接続をテストします。 + +#### 設定を適用 + +設定を適用します。 + +### 6. CouchDB + +これらの設定は、CouchDB 接続プロファイルを追加(`➕`)または編集(`🔧`)する際に開く **CouchDB セットアップダイアログ** 内で設定します。 + +#### サーバー URI + +画面表示: **サーバー URI** + +設定キー: `couchDB_URI` + +CouchDB サーバーの URI です。ダイアログ内では **URL** と表記されます。 +Obsidian Mobile ではセキュアな HTTPS 接続のみが使用可能です。セットアップダイアログは完全な HTTP または HTTPS URL を受け付け、設定適用時に正規化します。 + +#### ユーザー名 + +画面表示: **ユーザー名** + +設定キー: `couchDB_USER` + +CouchDB の認証に使用するユーザー名です。ダイアログ内では **Username** と表記されます。 + +#### パスワード + +画面表示: **パスワード** + +設定キー: `couchDB_PASSWORD` + +CouchDB の認証に使用するパスワードです。ダイアログ内では **Password** と表記されます。 + +#### データベース名 + +画面表示: **データベース名** + +設定キー: `couchDB_DBNAME` + +データベースの名前です。空にはできません。CouchDB は接続試行時に名前を検証します。セットアップダイアログ側で独自の狭い命名ルールを適用することはありません。 + +#### Request API を使用して避けられない CORS 問題を回避 + +画面表示: **Request API を使用して避けられない CORS 問題を回避** + +設定キー: `useRequestAPI` + +この項目はセットアップダイアログ内では **Use Internal API(内部 API を使用)** と表記されます。有効にすると、Obsidian の内部リクエスト API を使用して CORS 制限を回避します。Obsidian 管理下の API を通じて設定された認証情報を CouchDB サーバーに送信するため、信頼できるサーバーに対してのみ使用してください。可能な限り CouchDB 側の CORS を適切に設定することを推奨します。この互換性回避策は、将来の Obsidian バージョンで変更される可能性があります。 + +#### カスタムヘッダー + +設定キー: `couchDB_CustomHeaders` + +画面表示: **カスタムヘッダー** + +CouchDB サーバーに送信されるすべてのリクエストに含めるカスタム HTTP ヘッダーです。`Header-Name: Value` の形式で、各ヘッダーを改行で区切って指定します。 + +#### JWT 認証を使用 + +画面表示: **JWT 認証を使用** + +設定キー: `useJWT` + +CouchDB で JSON Web Token(JWT)認証を有効にします。これは実験的機能であり、完全な検証は行われていません。 + +#### JWT アルゴリズム + +画面表示: **JWT アルゴリズム** + +設定キー: `jwtAlgorithm` + +JWT の署名に使用するアルゴリズムです。対応アルゴリズム: `HS256`, `HS512`, `ES256`, `ES512`。 + +#### JWT の有効期間(分) + +画面表示: **JWT 有効期限(分)** + +設定キー: `jwtExpDuration` + +トークンの有効期間(分単位)です。0を指定すると有効期限は無効になります。 + +#### JWT キー + +画面表示: **JWT キー** + +設定キー: `jwtKey` + +JWT の署名に使用するシークレットキー(HS256/HS512 の場合)または PKCS#8 PEM 形式の秘密鍵(ES256/ES512 の場合)です。 + +#### JWT キー ID(kid) + +画面表示: **JWT キー ID (kid)** + +設定キー: `jwtKid` + +JWT に含まれるキー ID(`kid`)ヘッダーパラメータです。 + +#### JWT サブジェクト(sub) + +画面表示: **JWT サブジェクト (sub)** + +設定キー: `jwtSub` + +JWT のサブジェクト(`sub`)クレームであり、CouchDB のユーザー名と一致する必要があります。 + +#### 接続と保存の操作 + +ダイアログが開かれた理由によってアクションが異なります。 + +- 最初のデバイスのオンボーディングでは **「データベースを作成または接続して続行(Create or connect to database and continue)」** を使用します。データベースが存在せず、指定したアカウントに作成権限がある場合は自動作成されることがあります。 +- 追加デバイスのオンボーディングでは **「既存のデータベースに接続して続行(Connect to existing database and continue)」** を使用します。存在しないデータベースを自動作成することはありません。 +- 保存済みリモートプロファイルの追加や編集では **「接続テストして保存(Test connection and save)」** を使用します。存在しないデータベースを自動作成することはありません。 +- 設定モードでは **「接続せずに保存(Save without connecting)」** も選べます。プロファイルは更新されますが、接続が修正されるまで自動同期が失敗する可能性があります。 + +オンボーディングでは接続の成功が必須であり、未検証のまま続行するアクションは提供されません。 + +#### サーバーの要件を確認 + +画面表示: **サーバー要件を確認** + +このオプションチェックは、Obsidian の内部リクエスト API を通じて CouchDB サーバーの設定を読み取り、設定された認証情報をそのサーバーに送信します。管理者権限が必要になる場合があります。初期チェックは読み取り専用です。提示される各修正案には CouchDB の正確な設定項目と推奨値が示され、変更を適用する前に個別の確認が必要です。 + +#### 設定を適用 + +設定を適用します。 + +### 7. ピアツーピア(P2P)同期 + +#### P2P 同期を有効化 + +画面表示: **P2P 同期を有効化** + +設定キー: `P2P_Enabled` + +WebRTC 経由の直接ピアツーピア同期を有効にします。 + +#### シグナリングリレー URL + +設定キー: `P2P_relays` + +ピア検出と WebRTC 接続ネゴシエーションに使用される、Nostr 互換の WebSocket リレー URL です。複数の URL をカンマで区切って指定できます。シグナリングリレーは Vault のコンテンツを保存または転送しません。詳細は [P2P 同期の仕組み](p2p.md) を参照してください。 + +P2P セットアップの接続テストは、アクティブな P2P ルームを中断しません。アクティブなリレーセットが要求された URL をすでにカバーしている場合、テストはそのアクティブなシグナリングトランスポートを監視します。テストによって P2P 実行中にリレーが追加されることになる場合は、アクティブなリレー設定を使用するか、事前に P2P を切断するよう求められます。P2P がアイドル状態の場合、テストは短時間のシグナリング試行を開始して破棄します。このチェックでは、ピアの検出、他デバイスとの認証、または TURN/WebRTC データパスの導通までは確認できません。 + +#### グループ ID + +画面表示: **グループ ID** + +設定キー: `P2P_roomID` + +同期デバイスのグループを識別するためのルーム ID またはグループ ID です。同期するすべてのデバイスで同じグループ ID を使用する必要があります。任意のカスタム文字列を入力するか、ランダムなグループ ID を生成できます。 + +#### パスフレーズ + +設定キー: `P2P_passphrase` + +画面表示: **パスフレーズ** + +P2P 通信の認証および暗号化に使用するパスワードまたはパスフレーズです。すべてのデバイスで同じパスフレーズを使用する必要があります。 + +#### デバイスのピア ID + +画面表示: **デバイスのピア ID** + +設定キー: `P2P_DevicePeerName` + +P2P ネットワーク内でのこのデバイスのピア名または識別子です。デバイスグループ内で一意である必要があります。 + +#### 起動時に P2P 接続を自動開始 + +画面表示: **起動時に P2P 接続を自動開始** + +設定キー: `P2P_AutoStart` + +この項目はセットアップダイアログ内では **Auto Start P2P Connection** と表記されます。有効にすると、プラグイン起動時に P2P 接続が自動的に開始されます。 + +#### 接続と切断 + +P2P 接続を閉じると、LiveSync P2P ルームから退出し、そのレプリケーションサービスを停止し、シグナリングリレーソケットを閉じて自動再接続を一時停止します。アイドル状態の WebRTC 接続は再利用のために一時的にトランスポート管理下に残る場合がありますが、退出したルームのトラフィックは処理できません。再度接続するとリレーの再接続が再開され、新しい LiveSync ルームに参加します。 + +#### 接続後に変更を自動通知 + +画面表示: **接続中のピアに変更を自動ブロードキャスト** + +設定キー: `P2P_AutoBroadcast` + +有効にすると、ローカルでの変更後に接続されたピアに変更を通知します。通知には Vault データは含まれません。受信側ピアは、このデバイスをフォローしている場合にのみ変更を取得(Fetch)します。 + +#### TURN 設定 + +設定キー: `P2P_managedType` + +既存の TURN サーバー設定項目を使用する場合は **Manual(手動)** を、TURN キー ID および TURN キー API トークンを使用する場合は **Managed (Cloudflare)(マネージド:Cloudflare)** を選択します。API トークンはプロファイルとともに保持され、セットアップ URI や QR コード共有に含まれます。発行された一時認証情報はメモリ内にのみ保持されます。レポートではプロバイダー設定は伏字になります。共有、有効期限、再接続の挙動については [TURN 認証情報](p2p.md#turn-credentials) を参照してください。 + +#### TURN キー ID と TURN キー API トークン + +設定キー: `P2P_managedId`, `P2P_managedToken` + +**Managed (Cloudflare)** が選択されている場合に表示されます。TURN キーの ID と専用 API トークンを入力します。トークン欄はマスク表示されます。アカウント ID、カスタムエンドポイント、更新間隔は不要です。 + +#### TURN サーバー URL(カンマ区切り) + +画面表示: **TURN サーバー URL(カンマ区切り)** + +設定キー: `P2P_turnServers` + +カンマ区切りの TURN サーバー URL リストです。TURN は、厳格な NAT やファイアウォール規則によって直接ピア接続が妨げられている場合に、暗号化された WebRTC トラフィックを中継するオプションのフォールバックです。必須のシグナリングリレーとは異なります。ほとんどの環境では空欄のままで問題ありません。 + +#### TURN ユーザー名 + +画面表示: **TURN ユーザー名** + +設定キー: `P2P_turnUsername` + +TURN サーバーの認証ユーザー名です。 + +#### TURN 認証情報 + +画面表示: **TURN 認証情報** + +設定キー: `P2P_turnCredential` + +TURN サーバーの認証パスワードまたは認証情報です。 + +#### P2P メッセージサイズ + +設定キー: `P2P_maxWirePayloadBytes` + +このプロファイル設定は、Trystero が独自のフレーミングを適用する前の、各送信 Commonlib RPC メッセージのサイズを制限します。Vault のチャンクサイズや IP MTU、SCTP フラグメントサイズとは異なります。利用可能なプリセットは **Standard**(15,360バイト)、**Reduced**(2,048バイト)、**Conservative**(1,024バイト)、**Maximum compatibility**(800バイト)です。値を小さくすると、大きな WebRTC メッセージがドロップされる経路でのスループットと引き換えに互換性が向上します。 + +送信側が送信メッセージのサイズを制御します。制約のある経路を経由して送信する可能性のあるすべてのデバイスで、同じ保守的なプリセットを選択してください。このキーのない既存プロファイルでは **Standard** が使用されます。P2P 接続文字列および暗号化されたセットアップ URI は、選択されたプリセットを保持します。 + +#### 接続経路 + +設定キー: `P2P_connectionPath` + +**Automatic(自動)** は、WebRTC に直接接続または TURN リレー経路の選択を任せるデフォルト設定です。**TURN relay only(TURN リレーのみ)** は `iceTransportPolicy: 'relay'` を強制し、プロファイルに有効な手動 TURN URL または設定された TURN 認証情報ソースが含まれている場合に利用可能です。リレー専用モードが選択されている状態で手動 TURN 設定を削除すると、**Automatic** に戻り通知が表示されます。認証情報を提供できないソースが選択されている場合、接続は開始されず、接続経路は変更されません。 + +この選択は P2P プロファイルに属し、P2P 接続文字列および暗号化されたセットアップ URI に保持されます。異なる互換性の選択を持つ複数のプロファイルが同じグループ ID と認証情報を使用できますが、アクティブになるのは選択された P2P プロファイルのみです。 + + + +## 4. 同期設定 + +### 1. 同期プリセット + +#### プリセット + +画面表示: **プリセット** + +設定キー: `preset` +プリセット設定を適用します。 + +### 2. 同期方法 + +#### 同期モード + +画面表示: **同期モード** + +設定キー: `syncMode` + +同期を開始するトリガーです。 + +- **LiveSync** (`LIVESYNC`): リアルタイムで継続的な双方向同期。 + 注意: CouchDB または WebRTC P2P リモートサーバーが必要です。S3 互換オブジェクトストレージではサポートされていません。 +- **Periodic Sync** (`PERIODIC`): **Periodic Sync interval** 設定で指定された一定間隔ごとに同期を実行します。 +- **On Events** (`ONEVENTS`): 下記のトグルで設定された特定のイベント(保存、ファイルオープン、起動時など)をトリガーとして同期を実行します。 + +#### 定期同期の間隔 + +画面表示: **定期同期の間隔** + +設定キー: `periodicReplicationInterval` +同期間隔(秒)。 + +#### 同期間隔の最小値 + +画面表示: **同期間隔の最小値** + +設定キー: `syncMinimumInterval` +イベントによる自動同期の最小間隔。 + +#### 保存時に同期 + +画面表示: **保存時に同期** + +設定キー: `syncOnSave` +ファイル保存時に同期を開始します。 + +#### エディタ保存時に同期 + +画面表示: **エディタでの保存時に、同期されます** + +設定キー: `syncOnEditorSave` +エディタでファイルを保存した際に自動的に同期を開始します。 + +#### ファイルを開いたときに同期 + +画面表示: **ファイルを開いた時に同期** + +設定キー: `syncOnFileOpen` +ファイルを開いた際にそのファイルの同期を強制します。 + +#### 起動時に同期 + +画面表示: **起動時同期** + +設定キー: `syncOnStart` +Obsidian 起動時にすべてのファイルを自動同期します。 + +#### ファイルのマージ後に同期 + +画面表示: **ファイルがマージ(統合)された時に同期** + +設定キー: `syncAfterMerge` +ファイルマージ後に自動的に同期します。 + +#### バックグラウンドで複製を継続 + +画面表示: **バックグラウンドでもレプリケーションを継続する** + +設定キー: `keepReplicationActiveInBackground` +デスクトップ専用。バッテリーとネットワークをより多く消費します。この設定は継続的レプリケーションおよび定期レプリケーションに適用されます。 + +#### 同期中のスリープを許可 + +画面表示: **同期中のスリープを許可** + +設定キー: `allowSleepDuringSynchronisation` + +個別の同期処理の実行中にオペレーティングシステムのスリープを許可します。このオプションは全プラットフォームに適用され、デフォルトでは無効です。無効な場合、個別の処理はベストエフォートで画面スリープ防止を要求します。 + +#### デスクトップで同期中のスリープを許可 + +画面表示: **デスクトップで同期中のスリープを許可** + +設定キー: `allowSleepDuringSynchronisationOnDesktop` + +デスクトップ専用。全般オプションが無効な場合でも、個別の同期処理中にオペレーティングシステムのスリープを許可します。このオプションはデフォルトで有効になっているため、定期同期やイベント駆動同期によってデスクトップの自動スリープが繰り返し妨げられるのを防ぎます。デスクトップでも画面スリープ防止を維持したい場合は無効にしてください。 + +セットアップ URI は両方のスリープ設定を保持します。これらが含まれていない古いセットアップ URI では、上記のデフォルトが使用されます。これらの設定は、ワンショットレプリケーション、P2P ピア検出と選択、再構築、取得、リモートチャンク取得、およびダウンロードされたドキュメントの Vault への適用など、個別のリモート操作を対象とします。Obsidian がバックグラウンドにある間の継続的レプリケーション動作は制御しません。また、スリープを許可しても OS のサスペンドを強制することはありません。 + +### 3. 更新の間引き + +#### データベース更新をバッチ処理 + +画面表示: **データベースのバッチ更新** + +設定キー: `batchSave` + +LiveSync モード以外では、ローカルデータベースに保存する前に繰り返されたローカルファイルの更新をまとめます。これにより中間のデータベースリビジョンを減らし、他のデバイスへの反映を遅らせます。 + +#### LiveSync モードでデータベース更新をバッチ処理 + +画面表示: **LiveSync モードでデータベース更新をバッチ処理** + +設定キー: `batchSaveInLiveSync` + +LiveSync モードでも、同様に上限付きの遅延を適用します。この設定は既存 Vault、新規 Vault のいずれでもデフォルトで無効です。`liveSync: true` と `batchSave: true` を含む古い設定でも有効にはなりません。設定画面には現在のモードに応じた選択肢が表示され、モードを切り替えても両方の設定が保持されます。古いクライアントは引き続き LiveSync モードでのバッチ処理を無視します。 + +両方の選択肢は以下の遅延設定を共有します。手動同期、削除、または名前変更によってバッチを早期に終了できます。バッチ処理は中間の更新頻度を抑えるための機能です。テンプレート展開の完了検知や、他デバイスとの同時編集の防止を目的としたものではありません。 + +#### バッチ更新の最小遅延 + +画面表示: **バッチデータベース更新の最小遅延** + +設定キー: `batchSaveMinimumDelay` + +最新の対象編集が行われた後、ローカルデータベースに保存するまでの待機時間(秒)。下記の最大遅延に従います。 + +#### バッチ更新の最大遅延 + +画面表示: **バッチデータベース更新の最大遅延** + +設定キー: `batchSaveMaximumDelay` + +ファイルに対する最初の保留中更新からの最大意図的遅延(秒)。その後の編集によってこの制限がリセットされることはなく、処理スロットの待機によって別のバッチ遅延が追加されることもありません。この時間が経過すると処理が実行可能になりますが、指定時間内の書き込み完了や他デバイスへの到達を保証するものではありません。 + +### 4. 削除の伝播(高度な設定) + +#### 旧式のゴミ箱設定 + +設定キー: `trashInsteadDelete` +このキーは設定インポート、セットアップ URI、および以前のバージョンとの互換性のために引き続き受け入れられますが、設定画面には表示されなくなりました。リモートファイルの削除は、このレガシーな値に関係なく、`FileManager.trashFile` API を通じてユーザーの Obsidian 削除設定に従います。 + +#### 空のフォルダーを保持 + +画面表示: **空フォルダーの維持** + +設定キー: `doNotDeleteFolder` +ファイルが存在しない空のフォルダーを保持するかどうかを設定します。 + +### 5. 競合解決(高度な設定) + +競合解決は未知のローカルコンテンツを保護し、利用可能なリビジョン履歴が安全な共通ベースを提供する場合にのみ自動マージを行います。リビジョンツリールール、古い解決や同時解決、バイナリファイルの制限、および競合が未解決の間に使用されるデバイスローカルの系統情報については、[競合解決とリビジョン系統の仕様](specs_conflict_resolution.md) を参照してください。 + +#### (ベータ)常に新しいファイルで上書き + +画面表示: **(ベータ機能)常に新しいファイルで上書きする** + +設定キー: `resolveConflictsByNewerFile` +テスト専用。より新しい更新日時を持つコピーを選択してファイル競合を解決します。変更されたファイルが上書きされる可能性があり、どのリビジョンがユーザーの意図を反映しているかは判別できません。 + +#### 非アクティブファイルの競合解決を遅延 + +画面表示: **非アクティブなファイルは、競合解決を先送りする** + +設定キー: `checkConflictOnlyOnOpen` +ファイルが開かれたときにのみ競合を確認するかどうかを設定します。 + +#### 非アクティブファイルのマージ競合の確認を遅延 + +画面表示: **非アクティブなファイルに対する競合解決プロンプトの表示を遅延させる** + +設定キー: `showMergeDialogOnlyOnActive` +ファイルが開かれたときに競合ファイルについて確認を求めるかどうかを設定します。 + +### 6. Markdown による同期設定(高度な設定) + +#### ファイル名 + +画面表示: **ファイル名** + +設定キー: `settingSyncFile` +設定を Markdown ファイルに保存します。新しい設定が届いた際に通知されます。プラットフォームごとに異なるファイルを設定できます。 + +#### ファイルに認証情報を書き込む + +画面表示: **認証情報のファイル内保存** + +設定キー: `writeCredentialsForSettingSync` +(非推奨)有効にすると、認証情報がファイルに保存されます。 + +この設定が無効な場合、オブジェクトストレージキー、認証ヘッダー、その他の認証情報、すべての接続プロファイルおよびそのアクティブ選択はファイルから除外されます。インポート時も受信側デバイスのローカル認証情報とプロファイルが保持されます。有効な場合、ファイルには認証情報と完全な接続プロファイルが含まれます。手動で共有する場合は、設定画面のプレーンテキストエクスポートまたは暗号化されたセットアップ URI を使用してください。 + +#### すべての設定ファイルに通知 + +画面表示: **すべての設定同期ファイルを通知** + +設定キー: `notifyAllSettingSyncFile` +すべての設定同期ファイルの変更を通知します。 + +### 7. 非表示ファイル(高度な設定) + +この機能を有効にする前に、[非表示ファイル同期ガイド](./tips/hidden-file-sync.md) を確認してください。Rebuild(再構築)および Fetch(取得)のセットアップ操作では意図的にオプション機能が無効化されたままになります。まず通常のノート同期を確立してから、各デバイスで個別に非表示ファイル同期を初期化してください。 + +#### 非表示ファイル同期を有効化 + +画面表示: **非表示ファイル同期を有効化** + +設定キー: `syncInternalFiles` +非表示ファイルやフォルダー(`.obsidian` 配下の設定ファイル、テンプレート、スニペット、テーマなど)の同期を有効にします。 + +#### 複製前に非表示ファイルをスキャン + +画面表示: **レプリケーション開始前に非表示ファイルをスキャンする** + +設定キー: `syncInternalFilesBeforeReplication` +レプリケーション前に非表示ファイルをスキャンします。 + +#### 定期的に非表示ファイルをスキャン + +画面表示: **定期的に非表示ファイルをスキャンする** + +設定キー: `syncInternalFilesInterval` +非表示ファイルを定期的にスキャンする間隔(秒)。0で無効化。 #### 非表示ファイルの変更通知を抑制 -設定キー: suppressNotifyHiddenFilesChange -有効な場合、非表示ファイルの変更に関する通知を抑制します。 +画面表示: **非表示ファイルの変更通知を抑制** -隠しファイルは能動的に検出されないため、スキャンが必要です。 -スキャンでは、ファイルと共にファイルの変更時刻を保存します。もしファイルが消された場合は、その事実も保存します。このファイルを記録したエントリーがレプリケーションされた際、ストレージよりも新しい場合はストレージに反映されます。 +設定キー: `suppressNotifyHiddenFilesChange` +有効にすると、非表示ファイルの変更通知が抑制されます。 -そのため、端末のクロックは時刻合わせされている必要があります。ファイルが隠しフォルダに生成された場合でも、もし変更時刻が古いと判断された場合はスキップされるかキャンセル(つまり、削除)されます。 + +## 5. セレクター(高度な設定) -Each scan stores the file with their modification time. And if the file has been disappeared, the fact is also stored. Then, When the entry of the hidden file has been replicated, it will be reflected in the storage if the entry is newer than storage. +### 1. 通常ファイル -Therefore, the clock must be adjusted. If the modification time is old, the changeset will be skipped or cancelled (It means, **deleted**), even if the file spawned in a hidden folder. +#### 同期するファイル +画面表示: **同期するファイル** +設定キー: `syncOnlyRegEx` +(正規表現)通常ファイルを一致するパスのみに制限します。空欄にするとすべての通常ファイルパスが許可されます。非表示ファイル同期は独自のターゲットパターンを使用します。 -### Advanced settings -Self-hosted LiveSyncはPouchDBを使用し、リモートと[このプロトコル](https://docs.couchdb.org/en/stable/replication/protocol.html)で同期しています。 -そのため、全てのノートなどはデータベースが許容するペイロードサイズやドキュメントサイズに併せてチャンクに分割されています。 +#### 同期しないファイル -しかしながら、それだけでは不十分なケースがあり、[Replicate Changes](https://docs.couchdb.org/en/stable/replication/protocol.html#replicate-changes)の[2.4.2.5.2. Upload Batch of Changed Documents](https://docs.couchdb.org/en/stable/replication/protocol.html#upload-batch-of-changed-documents)を参照すると、このリクエストは巨大になる可能性がありました。 +画面表示: **同期しないファイル** -残念ながら、このサイズを呼び出しごとに自動的に調整する方法はありません。 -そのため、設定を変更できるように機能追加いたしました。 +設定キー: `syncIgnoreRegEx` +(正規表現)ローカルおよびリモートで、一致する通常ファイルおよび非表示ファイルの変更をスキップします。 -備考:もし小さな値を設定した場合、リクエスト数は増えます。 -もしサーバから遠い場合、トータルのスループットは遅くなり、転送量は増えます。 +#### 最大ファイルサイズ -### Batch size -一度に処理するChange feedの数です。デフォルトは250です。 +画面表示: **最大ファイル容量** -### Batch limit -一度に処理するBatchの数です。デフォルトは40です。 +設定キー: `syncMaxSizeInMB` +(MB)この値を設定すると、これより大きいサイズのローカルファイルおよびリモートファイルの変更はスキップされます。ファイルが再び小さくなった場合は、新しいものが使用されます。 -### 1回のリクエストで送信するチャンクの最大サイズ -設定キー: sendChunksBulkMaxSize +#### (ベータ)除外ファイルを使用 -メガバイト(MB)単位で指定します。 +画面表示: **(ベータ機能)除外ファイル(ignore)の使用** -## Customisation Sync (カスタマイズ同期) -プラグイン、ホットキー、テーマ、スニペットなどのObsidianのカスタマイズ設定を同期する機能です(以前は **Plugin Sync** と呼ばれていました)。 +設定キー: `useIgnoreFiles` +これを設定すると、除外ファイルに一致するローカルファイルの変更がスキップされます。リモートの変更はローカルの除外ファイルを使用して判定されます。 -### デバイス名 (Device name) -設定キー: deviceAndVaultName +#### 除外ファイル -同期するすべてのデバイス間で一意となるデバイス名です。この設定を編集するには、一度カスタマイズ同期を無効にする必要があります。 +画面表示: **除外ファイル** -### ファイル保存ごとのカスタマイズ同期 (Per-file-saved customisation sync) -設定キー: usePluginSyncV2 +設定キー: `ignoreFiles` +カンマ区切りで指定します(例: `.gitignore, .dockerignore`)。 -有効な場合、ファイルごとの効率的なカスタマイズ同期が使用されます。有効にする際には簡単な移行作業が必要であり、すべてのデバイスを v0.23.18 以降にアップデートする必要があります。この機能を有効にすると、古いバージョンとの互換性が失われます。 +保存された設定によって通常ファイルを反映できるかどうかが変化した場合、LiveSync はローカルデータベースにすでに保持されている通常ファイルのメタデータを再評価します。これにはセレクター式、除外ファイル設定、最大サイズおよび更新日時制限、ファイル名の大文字小文字の処理が含まれます。したがって、除外中に受信されチェックポイントが記録されたリモートリビジョンも、条件が緩和された後はリモートチェックポイントを巻き戻すことなく反映できます。条件を狭めても、すでに反映されたファイルが削除されることはありません。 -### カスタマイズ同期を有効にする (Enable customisation sync) -設定キー: usePluginSync +### 2. 非表示ファイル(高度な設定) -テーマ、スニペット、ホットキー、プラグイン設定などの同期を有効にします。 -注意: 安全上の理由から、この機能を使用するにはエンドツーエンド暗号化(End-to-End Encryption)が有効になっている必要があります。 +#### 除外パターン -### カスタマイズの自動スキャン (Scan customisation automatically) -設定キー: autoSweepPlugins +画面表示: **除外パターン** -レプリケーション(同期処理)を実行する前に、カスタマイズ設定の変更をスキャンします。 +非表示ファイル同期で除外するパターンを設定します。 -### 定期的なカスタマイズのスキャン (Scan customisation periodically) -設定キー: autoSweepPluginsPeriodic +#### 既定のパターンを追加 -1分ごとにカスタマイズ設定の変更を定期的にスキャンします。 +画面表示: **デフォルトパターンを追加** -### カスタマイズ更新の通知 (Notify customised) -設定キー: notifyPluginOrSettingUpdated +デフォルトの除外パターンを追加します。 -他のデバイスで新しくカスタマイズ設定が更新されたときに通知を表示します。 + -## Miscellaneous -その他の設定です -### Show status inside editor -同期の情報をエディター内に表示します。 -モバイルで便利です。 +## 6. カスタマイズ同期(高度な設定) -### Check integrity on saving -保存時にデータが全て保存できたかチェックを行います。 +カスタマイズ同期はサポート対象の高度なオプトイン機能です。現在のファイル単位の実装は、スニペット、設定ファイル、およびプラグインファイルに対する2つの Vault による実際の Obsidian ワークフローでカバーされています。非表示ファイル同期は、セットアップ、選択、競合動作が異なる別の機能です。同じファイルを管理するために両方の機能を使用しないでください。 +**Automatic(自動)** はアイテムのファイルを非表示ファイル同期に委譲します。[対象パターンと除外パターン](./tips/hidden-file-sync.md#review-the-file-selection) を確認した上で、まずこのデバイスの **Sync Settings** で非表示ファイル同期を有効化および初期化してください。非表示ファイル同期が無効な状態で Automatic を選択すると通知が表示され、現在のモードは変更されません。別のデバイスからインポートされたものを含め、既存の Automatic 割り当ては非表示ファイル同期が無効な間も保持されます。 -## Hatch -ここから先は、困ったときに開ける蓋の中身です。注意して使用してください。 +### 1. カスタマイズ同期 -同期の状態に問題がある場合、Hatchの直下に警告が表示されることがあります。 +#### デバイス名 -- パターン1 -![CorruptedData](../images/lock_pattern1.png) -データベースがロックされていて、端末が「解決済み」とマークされていない場合、警告が表示されます。 -他のデバイスで、End to End暗号化を有効にしたか、Drop Historyを行った等、他の端末がそのまま同期を行ってはいない状態に陥った場合表示されます。 -暗号化を有効化した場合は、パスフレーズを設定して「このデバイスの同期状態をリセット」、または「このデバイスのファイルでサーバーデータを上書き」を行うと自動的に解除されます。 -手動でこのロックを解除する場合は「I've made a backup, mark this device 'resolved'」をクリックしてください。 +画面表示: **デバイス名** -- パターン2 -![CorruptedData](../images/lock_pattern2.png) -リモートのデータベースが、過去、パターン1を解除したことがあると表示しています。 -ご使用のすべてのデバイスでロックを解除した場合は、データベースのロックを解除することができます。 -ただし、このまま放置しても問題はありません。 +設定キー: `deviceAndVaultName` +同期されるすべてのデバイス間で一意の名前を指定します。この設定を編集するには、カスタマイズ同期を一度無効にしてください。 -### Verify and repair all files -Vault内のファイルを全て読み込み直し、もし差分があったり、データベースから正常に読み込めなかったものに関して、データベースに反映します。 +#### ファイルごとに保存するカスタマイズ設定を同期 -- このデバイスの同期状態をリセット (Reset Synchronisation on This Device) -ローカルのデータベースを破棄し、リモートのデータから再構築します。 -- このデバイスのファイルでサーバーデータを上書き (Overwrite Server Data with This Device's Files) -ローカルおよびリモートのデータベースをこのデバイス上のファイルで再構築(上書き)します。 +画面表示: **ファイル単位のカスタマイズ同期を有効化** -### Lock remote database -リモートのデータベースをロックし、他の端末で同期を行おうとしてもエラーとともに同期がキャンセルされるように設定します。これは、データベースの再構築を行った場合、自動的に設定されるものと同じものです。 +設定キー: `usePluginSyncV2` +有効にすると、効率的なファイル単位のカスタマイズ同期が使用されます。有効化時に小規模な移行が必要になります。また、すべてのデバイスを v0.23.18 以降にアップデートする必要があります。一度有効にすると、古いバージョンとの互換性は失われます。 -万が一同期に不具合が発生していて、使用しているデバイスのデータ+サーバーのデータを保護する場合などに、緊急避難的に使用してください。 +#### カスタマイズ同期を有効化 -### Scram スイッチ (Scram Switches) -データベースの破損や予期しないデータ喪失を防ぐために、同期処理を緊急停止するためのスイッチです。重大な設定不一致や同期エラーが発生した場合、プラグインは自動的に Scram 状態に移行し、同期動作を一時停止することがあります。 +画面表示: **カスタマイズ同期を有効化** -#### ファイルの更新監視を一時停止 (Suspend file watching) -設定キー: suspendFileWatching +設定キー: `usePluginSync` +カスタマイズ同期を有効にします。 -ローカルファイル変更の監視と検知を停止します。 +#### カスタマイズを自動スキャン -#### データベース反映を一時停止 (Suspend database reflecting) -設定キー: suspendParseReplicationResult +画面表示: **自動的にカスタマイズをスキャン** -データベースでの変更をストレージファイル(Vault内のファイル)へ書き戻す処理を停止します。 +設定キー: `autoSweepPlugins` +レプリケーション前にカスタマイズをスキャンします。 -### 互換性(メタデータ)(Compatibility (Metadata)) +#### カスタマイズを定期スキャン -#### 削除済みファイルのメタデータを保持しない (Do not keep metadata of deleted files.) -設定キー: deleteMetadataOfDeletedFiles +画面表示: **定期的にカスタマイズをスキャン** -ファイルを削除した際に、そのファイルの同期履歴メタデータも即座にデータベースから削除し、保持しないようにします。 +設定キー: `autoSweepPluginsPeriodic` +1分ごとにカスタマイズを定期スキャンします。 -#### 削除済みデータのメタデータをクリーンナップする (Delete old metadata of deleted files on start-up) -設定キー: automaticallyDeleteMetadataOfDeletedFiles +#### カスタマイズの変更を通知 -ファイルを削除した際のメタデータを保持する期間(日数)を設定します。指定した日数を経過した古い削除済みファイルのメタデータは、プラグイン起動時にデータベースから自動的に削除(クリーンナップ)されます。`0` を指定すると自動削除は無効になります。 +画面表示: **カスタマイズが行われたら通知する** -### 破損している可能性があるファイルも処理する -設定キー: processSizeMismatchedFiles +設定キー: `notifyPluginOrSettingUpdated` +別のデバイスによって新しくカスタマイズされたときに通知します。 -サイズ不一致のあるファイルを処理します。特定のAPIや外部連携によって作成されたファイルを同期する際に役立ちます。 +#### 開く -### Remediation +画面表示: **開く** -#### イベント反映時の最大ファイル更新日時 -設定キー: maxMTimeForReflectEvents +ダイアログを開きます。 -この値(Unixエポックからの秒数)より新しい更新日時を持つファイルについては、イベントの反映を無視します。0を指定すると制限が無効になります。 + -### Corrupted data -![CorruptedData](../images/corrupted_data.png) +## 7. ハッチ -データベースからストレージに書き出せなかったファイルがここに表示されます。 -もし、Obsidian内にそのデータが存在する場合は、一度編集を行い、上書きを行うと保存に成功する場合があります。(File Historyプラグインで救っても大丈夫です) -それ以外の場合は、残念ながら復旧手段がないため、データベース上の破損したファイルを削除しない限り、エラーが表示されます。 -その「データベース上の破損したファイルを削除」するボタンです。 +### 1. レポートツール +このパネルには、レポートの収集やデータベース状態の検査を行う5つのアクションがまとめられています。これらのアクションは診断情報の取得専用であり、データベースの修復やリセットは行いません。 + +#### Issue 報告用のレポートを作成 + +**「レポートをクリップボードにコピー(Copy Report to clipboard)」** を選択すると、サポート報告用の診断情報と最近のログが収集されます。機密情報が含まれる可能性があるため、共有する前にレポートの内容を確認してください。 + +#### ファイルのデータベース情報をコピー + +ファイルを選択して、そのローカルデータベース情報をコピーします。コマンド **Copy database information for the active file** を実行すると、エディタで開いているファイルに対して同じ検査が実行されます。 + +レポートには Vault 相対パス、ドキュメントおよびチャンクの識別子、ローカルデータベースのリビジョン、競合、およびローカルチャンクの利用可能性が含まれます。リモートへの問い合わせやファイルコンテンツの収集は行いません。パスや識別子はプライベートなメタデータである可能性があるため、共有前に確認してください。 + +#### レポートの仮名からファイルを検索 + +診断レポートからパスの仮名(pseudonym)を貼り付け、**「ファイルを検索(Find file)」** を選択します。検索は現在の Vault とローカルの通常ファイルメタデータのみを対象とし、リモートデータベースには接続しません。一致するローカル候補がすべて返され、各候補の実際の Vault パスとドキュメント ID はこのローカルダイアログ内でのみ表示されます。1つのパスに対して複数のローカルドキュメント ID が存在する場合は個別の候補として扱われます。Vault のみに存在する候補のフォローアップでは、ローカルドキュメントが選択されなかったため、メタデータは未検査としてマークされます。一致が見つからない場合は、ファイルの名前が変更されたか削除されたか、あるいは該当するメタデータがリモートにのみ存在する可能性があります。 + +選択した候補について、既存の Vault ファイルを開くか、元のレポートの仮名ソルトと選択した正確なドキュメント ID を使用して共有可能なローカルレポートを作成できます。レポートには現在・競合・履歴のステータス、チャンクの利用可能性、マージベース、Vault のサイズ情報が含まれます。ファイルコンテンツや認証情報は含まれません。履歴ステータス一覧は全履歴本文まではスキャンしません。 + +パスの仮名はレポートの公開8文字ソルトを使用します。レポートを持っている人は、推測されたパスを仮名と照合してテストできます。同じソルトを使うことで、特定の対象を絞り込んだ追加調査時にもパスや識別子の仮名を再現できます。古い序数形式の仮名はこのツールでは検索できません。 + +#### データベースの整合性を検査 + +**「検査(Inspect)」** を選択して、元の名前または一時的な仮名を選択し、通常ファイルのメタデータと現在の競合を検査します。デフォルトで **「リモートデータベースを含める(Include remote database)」** が選択されています。チェックを外すとローカルデータベースと Vault のみを検査します。この選択は現在の実行にのみ適用され、除外された場合はレポートでリモートの対象範囲が未チェックとしてマークされます。コマンド **Inspect database integrity** でも同じダイアログが開きます。検査は読み取り専用であり、修復は行いません。また、その結果だけを根拠にデータを削除しないでください。対象範囲、レポート形式、プライバシー、キャンセルについては [レポートの収集](troubleshooting.md#collect-a-report) を、状態とレビューインデックスの解釈については [コンパクト Markdown 整合性レポートの読み方](troubleshooting.md#read-the-compact-markdown-integrity-report) を参照してください。 + +#### データベースの使用状況を分析 + +画面表示: **データベース使用状況を分析** + +**「分析(Analyse)」** を選択して名前ポリシーを選択し、ローカルのリビジョンおよびチャンクの使用状況をレポートします。[高度な機能](#enable-advanced-features) が有効な場合、コマンド **Analyse Database Usage (advanced)** からも同じダイアログを開けます。完了した実行では TSV および JSON が提供され、未完了の実行ではそのステータスと理由が JSON に保持されます。既存のオンデマンドチャンク取得は変更されません。計算の制限とエクスポート手順については [レポートの収集](troubleshooting.md#collect-a-report) を参照してください。 + +### 2. チェックと復旧 + +このパネルには、設定やデータベースコンテンツの変更につながる可能性のあるチェック項目がまとめられています。 + +#### 設定診断ツール + +Setting Doctor(設定診断ツール)を実行して、設定の不一致や最適でない設定がないか確認します。推奨事項を適用すると設定が変更されたりデータベースの再構築が要求されたりする場合があるため、続行する前に推奨内容を確認してください。 + +#### 破損ファイルをスキャン + +データベース内に正しく保存されていないファイルがないかスキャンします。スキャンによってデータベースコンテンツを変更する修復操作が提示される場合があります。確定する前に提案された各アクションを確認してください。 + +### 3. トラブルシューティング + +このパネルでは、リモートストレージ通知チェックおよびファイルロギングコントロールを、レポート収集や復旧チェックから分離して管理します。 + +#### 通知しきい値をリセットしてリモートデータベースの使用量を確認 + +画面表示: **通知しきい値をリセットしてリモートデータベース使用量を確認** + +リモートストレージサイズの閾値をリセットし、リモートストレージのサイズを再確認します。これにより保存された通知閾値が変更されます。 + +#### ログをファイルに書き込む + +画面表示: **ファイルにログを記録** + +設定キー: `writeLogToTheFile` +警告!パフォーマンスに深刻な影響を与えます。また、デフォルト名ではログは同期されません。ログには機密情報が含まれることが多いため、取り扱いには十分注意してください。 + +### 4. Scram スイッチ + +データベースの破損を防ぐために同期プロセスを中断する緊急コントロールです。重大な不一致や同期エラーが発生した場合、プラグインは自動的に Scram 状態に入り、処理を一時停止することがあります。 + +#### ファイル監視を一時停止 + +画面表示: **監視の一時停止** + +設定キー: `suspendFileWatching` +ローカルファイルの変更監視を停止します。 + +#### データベースの反映を一時停止 + +画面表示: **データベース反映の一時停止** + +設定キー: `suspendParseReplicationResult` +データベースの変更をストレージファイルへ反映する処理を停止します。 + +### 5. 復旧と修復 + +#### 現在の Vault ファイルのチャンクを再作成 + +現在 Vault 内に存在するファイルからチャンクを再作成します。それらの現在のコンテンツが正本であることが確認された後、欠落しているチャンクを修復できます。利用できない過去のリビジョンや競合コンテンツは復元できません。 + +#### 競合とファイル/データベース間の差異を確認 + +各 Vault ファイルを、ローカルデータベース内のすべての現行末端リビジョン(leaf)と比較します。代表リビジョン(winner)と競合リビジョンは、正確なリビジョン識別子、ローカルチャンクの利用可能性、および現在の Vault ファイルとの関係とともに個別に表示されます。利用できない共通祖先も個別に報告されます。これらは安全な3方向マージに必要ですが、破棄対象となる現行末端リビジョンではありません。 + +**「検査を開始(Begin inspection)」** を選択して検査を実行します。報告された各ファイルと現在の末端リビジョンにはレンチメニューがあり、読み取り専用の比較、Vault への正確なデータベースリビジョンの適用、正確なバイト一致の記録、Vault ファイルを指定ブランチの子として保存、チャンク取得の再試行、またはブランチの明示的な破棄を行えます。破壊的な操作には確認が必要です。リビジョン履歴を変更する前に、[競合または不一致ファイルの復旧](recovery.md#recover-a-conflicted-or-mismatched-file) に従ってください。 + +同じ検査によって、保存されたドキュメント ID が記録されたパスと一致しないローカルメタデータも報告されます。その論理パスに対応するメタデータを引き続き一貫して特定できる場合、古いエントリがあっても通常の検査は抑制されません。特定できない場合、未解決のパスは通常のファイル修復アクションから除外されます。現在の代表リビジョンに競合する末端リビジョンがなく、修復先が明確な場合は、レンチメニューから対象を個別に確認して修復できます。修復先は、現在のローカルファイル名の大文字小文字とパス難読化の設定から導出され、古い ID を削除する前に書き込みと検証が行われます。対象が曖昧、競合中、削除済み、除外対象、またはその他の理由で安全に修復できない場合は、読み取り専用のままです。この操作で Vault 内のファイル名やフォルダー名が変更されることはありません。バックアップ、修復、伝播、検証の手順については、[メタデータドキュメント ID 不一致の修復](recovery.md#repair-a-metadata-document-id-mismatch) を参照してください。デバイス間で広範な名前の差異がある場合は、そのガイドに従って信頼できる Vault を選び、Obsidian を終了してからストレージ上の名前を修正し、中央のリモートデータベースを再構築して他のデバイスをリセットしてください。 + +#### 競合ファイルをすべて新しい方で解決 + +画面表示: **競合したすべてのファイルを新しい方で解決** + +確認後、更新日時に基づいてすべての競合を解決します。最新のバージョンを除くすべてのバージョンに論理削除が記録されます。これは破壊的なポリシー選択であり、すでに利用できないコンテンツは復旧できません。 + +#### パスが難読化されていないファイルを確認して変換 + +画面表示: **パスが難読化されていないファイルを確認して変換** + +パスが難読化されていないファイルを確認して変換します。 + +### 6. リセット + +#### 未設定の状態に戻す + +画面表示: **未設定状態に戻す** + +未設定状態に戻します。 + +#### カスタマイズ同期データをすべて削除 + +すべてのカスタマイズ同期データを削除します。 + + + +## 8. 高度な設定 + +### 1. メモリーキャッシュ + +#### メモリーキャッシュのサイズ(項目数) + +画面表示: **メモリキャッシュのサイズ(項目数)** + +設定キー: `hashCacheMaxCount` +ハッシュキャッシュの最大保持アイテム数。 + +#### メモリーキャッシュのサイズ(文字数) + +画面表示: **全体でキャッシュする文字数** + +設定キー: `hashCacheMaxAmount` +ハッシュキャッシュの最大保持文字数(メガ文字)。 + +### 2. ローカルデータベースの調整 + +#### チャンクサイズを拡大 + +画面表示: **チャンクサイズを最適化する** + +設定キー: `customChunkSize` + +新規セットアップでは、すべてのリモートタイプで0が使用されます。V3 Rabin–Karp では、バイナリチャンクに対して最大 100 KiB、最小 25 KiB、約 25 KiB の候補ギャップが設定されます。候補ギャップは平均チャンク長を表す値ではありません。4 MiB 未満のテキストは適応型の小さな境界を維持し、大きなテキストは UTF-8 セーフなカットを伴うバイナリ閾値を使用します。 + +値を大きくすると、変更がほとんどないバイナリファイルのドキュメント数を削減できますが、編集後に新しく保存されるコンテンツが増加する可能性があります。既存の明示的な値および合意された値は保持されます。プラグインをアップデートしても Vault の再チャンク化は行われません。編集、強制書き込み、チャンク再作成、または完全な Rebuild によって新しい境界が作成される一方、既存のコンテンツは引き続き読み取り可能です。 + +#### チャンク分割方式 + +画面表示: **チャンクスプリッター** + +設定キー: `chunkSplitterVersion` + +チャンクスプリッターのバージョンを選択します。V3 が最も効率的です。問題が起きたときは、Default または Legacy を選んでください。 + +#### 分割上限付きチャンク分割方式を使用 + +画面表示: **分割制限付きチャンク分割を使用** + +設定キー: `enableChunkSplitterV2` +有効にすると、チャンクは最大100個までに制限されて分割されます。ただし重複排除(dedupe)の効果はわずかに低下します。 + +#### セグメント分割方式を使用 + +画面表示: **セグメント分割を使用** + +設定キー: `useSegmenter` +有効にすると、チャンクは意味のあるセグメント(段落や見出し単位など)に分割されます。一部のプラットフォームではサポートされていません。 + +#### 起動時にコンテンツを厳密に確認 + +画面表示: **起動時にコンテンツを厳密に確認** + +設定キー: `strictContentCheckOnStartup` + +有効にすると、ファイルの正確な更新日時とサイズが一致している場合でも、通常の起動時にファイルコンテンツとローカルデータベースを比較します。無効な場合(デフォルト)、更新日時、サイズ、および記録されたデバイスローカルの系統情報が競合のない現在のリビジョンと一致し、保留中のファイル処理がない場合にのみ、この比較をスキップできます。したがって、通常のファイルイベント経路外で行われ、正確な更新日時とサイズが維持された編集は、通常の起動では検出されない可能性があります。手動スキャンおよび明示的な Fetch や Rebuild 操作では、厳密なコンテンツチェックが維持されます。 + +### 3. 転送の調整 + +#### 必要に応じてチャンクを取得 + +画面表示: **必要に応じてチャンクを取得する** + +設定キー: `readChunksOnline` +有効にすると、通常のプルレプリケーションですべてのチャンクを含める代わりに、必要なときに不足しているチャンクを取得します。新規セットアップでも同様にチャンクサイズ0の推奨値が保持されます。この設定によって、他デバイスで保存済みのコンテンツが再チャンク化されることはありません。 + +#### オンデマンド取得のバッチサイズ + +画面表示: **オンデマンド取得のバッチサイズ** + +設定キー: `concurrencyOfReadChunksOnline` +オンデマンド取得の並行バッチサイズ。 + +#### 連続するオンデマンド取得の間隔 + +画面表示: **連続するオンデマンド取得の間隔** + +設定キー: `minimumIntervalOfReadChunksOnline` +連続するオンデマンド取得の遅延間隔。 + +#### チャンクを手動再送するときの最大リクエストサイズ + +画面表示: **チャンクを手動で再送する際の最大リクエストサイズ** + +設定キー: `sendChunksBulkMaxSize` + +明示的な **「すべてのチャンクを再送信(Resend all chunks)」** メンテナンス操作によって1つのリクエストで送信されるチャンクの最大サイズを制限します(MB 単位)。通常および初期レプリケーションではこの設定は使用されません。 + + + +## 9. パワーユーザー向け設定 + +### 1. リモートデータベースの調整 + +#### ドキュメント内にチャンクを一時格納(終了予定の互換機能) + +設定キー: `useEden` +この設定は新しい構成では提供されなくなりました。既存の保存された値は引き続き受け入れられるため、既存のデータベースの構造を意図せず変更することなく開いて移行できます。 + +#### 一時格納するチャンクの最大数 + +画面表示: **一時保管する最大チャンク数** + +設定キー: `maxChunksInEden` +ドキュメント内に一時格納できるチャンクの最大数です。この数を超えたチャンクは、直ちに独立したチャンクになります。 + +#### 一時格納するチャンクの最大サイズ + +画面表示: **保持するチャンクの最大サイズ** + +設定キー: `maxTotalLengthInEden` +ドキュメント内に一時格納できるチャンクの最大合計サイズです。このサイズを超えたチャンクは、直ちに独立したチャンクになります。 + +#### 一時格納期間の上限 + +画面表示: **最大保持期限** + +設定キー: `maxAgeInEden` +ドキュメント内にチャンクを一時格納できる最大期間です。この期間を超えたチャンクは、独立したチャンクになります。 + +#### データ圧縮(高度なオプトイン機能) + +設定キー: `enableCompression` + +データ圧縮は、E2EE の前に各チャンクに対して fflate レベル8を適用します。圧縮によって小さくならないチャンクは非圧縮のままとなり、読み取り側は両方の表現を引き続き受け入れます。設定を変更しても互換性のための再構築は不要であり、既存の表現と新しい表現が共存できます。 + +測定されたストレージおよび転送の利点に伴い、ワークロードに応じた処理負荷とメモリコストが発生するため、この設定はデフォルトで無効のままとなっています。仕様、証拠、実行モデル、再現コマンドについては [データ圧縮の仕様](specs_data_compression.md) を参照してください。 + +### 2. CouchDB 接続の調整 + +#### バッチサイズ + +画面表示: **バッチサイズ** + +設定キー: `batch_size` +通常の CouchDB レプリケーションバッチ内の変更数。スキーマのデフォルトは25、最小値は2です。この値のみを変更してもレプリケーションチェックポイントは維持されます。数値を大きくすると通信往復回数は減らせますが、リクエストサイズやメモリ使用量は制限されません。 + +#### バッチ上限 + +画面表示: **バッチの上限** + +設定キー: `batches_limit` +PouchDB が先行読み込みできる変更バッチの数。スキーマのデフォルトは25、最小値は2です。これによって並行本文転送が行われることはなく、PouchDB は一度に1つのレプリケーションバッチを順次処理します。P2P やオブジェクトストレージの転送単位は制御しません。 + +#### ハートビートの代わりにタイムアウトを使用 + +画面表示: **ハートビートの代わりにタイムアウトを使用** + +設定キー: `useTimeouts` +このオプションを有効にすると、PouchDB は接続を無期限に開いたままにする代わりに60秒間接続を保持し、その間に変更が届かない場合はソケットを閉じて再度開きます。プロキシがリクエスト時間を制限している場合に役立ちますが、リソース消費が増加する可能性があります。 + +### 3. 設定の暗号化 + +#### 機密設定項目を暗号化 + +画面表示: **機密性の高い設定項目の暗号化** + +設定キー: `configPassphraseStore` + +機密設定項目のパスフレーズの提供方法を選択します。**Default(デフォルト)** は既存のデフォルトキーを使用します。**Use a custom passphrase(カスタムパスフレーズを使用)** は `configPassphrase` の値を使用し、そのキーをこのデバイスに保存します。**Ask an passphrase at every launch(起動のたびにパスフレーズを確認)** は起動時にマスクされたパスフレーズを要求し、正常に入力されたキーをその起動セッションの間メモリにキャッシュします。 + +この設定とパスフレーズは一緒に適用してください。適用すると、保存された機密値が選択したパスフレーズで再暗号化され、LiveSync がそのパスフレーズを取得する方法が一度の操作で変更されます。適用に失敗した場合でも、編集された値は再試行のために保持されます。再暗号化は平文の値を維持します。E2EE パスフレーズ、ID キー、Vault コンテンツを変更することはありません。 + +#### 機密設定項目のパスフレーズ + +画面表示: **機密性の高い設定項目にパスフレーズを使用** + +設定キー: `configPassphrase` +このパスフレーズは別のデバイスにコピーされません。**Use a custom passphrase** の場合、選択したモードは設定に保存されますが、キーはこのデバイスに残ります。保護された設定を復号する必要があり、別のデバイスにキーがない場合、LiveSync は起動時にパスフレーズを要求します。保護された設定によって検証された後、キーはそのデバイスに保存されます。 + +### 4. 開発者向け + +#### 開発者向けデバッグツールを有効化 + +画面表示: **開発者向けデバッグツールを有効化(利用可能な場合)。** + +設定キー: `enableDebugTools` +Obsidian の再起動が必要です。 + + + +## 10. パッチ(エッジケース対応) + +### 1. 互換性(メタデータ) + +#### 削除済みファイルのメタデータを保持しない + +画面表示: **削除済みファイルのメタデータを保持しない** + +設定キー: `deleteMetadataOfDeletedFiles` + +競合のないファイルの場合、この設定を無効にするとメタデータドキュメントに論理削除が記録されます。有効にすると、PouchDB の tombstone(削除済みマーカー)を通じてそのドキュメントが削除されます。どちらの動作もファイルの削除および名前変更を送信元から伝播させます。Vault ファイルを削除する前に、LiveSync は現在の代表リビジョンを再検証します。この最終チェックで同時復元が確認された場合、復元されたファイルが保持されます。この設定は削除の表現方法を変更するものであり、ファイルコンテンツは個別のチャンクに保存されたままとなります。未解決の競合中の削除は、個別の [表示ブランチルール](specs_conflict_resolution.md#operations-while-a-conflict-exists) に従います。 + +#### 起動時に削除済みファイルの古いメタデータを削除 + +画面表示: **起動時に削除済みファイルの古いメタデータを削除する** + +設定キー: `automaticallyDeleteMetadataOfDeletedFiles` +(日数指定。0 の場合は自動削除を無効化) + +### 2. 互換性(競合時の動作) + +#### マージ競合を常に確認 + +画面表示: **競合のマージ時に毎回確認を求める** + +設定キー: `disableMarkdownAutoMerge` +安全に自動マージできる場合でも、すべてのマージについて確認を求めるかどうかを設定します。 + +#### 競合時に最新の変更を適用 + +画面表示: **競合がある場合は最新の変更を適用する** + +設定キー: `writeDocumentsIfConflicted` +競合が発生した場合でも、ドキュメントに最新の変更を自動的に適用します。 + +### 3. 互換性(データベース構造) + +#### (廃止)互換性のために旧アダプターを使用 + +画面表示: **(廃止済み)古いアダプターを互換性のために利用** + +設定キー: `useIndexedDBAdapter` +v0.17.16 より前では、ローカルデータベースに古いアダプターを使用していました。現在は新しいアダプターが推奨されます。ただしローカルデータベースの再構築が必要です。時間のあるときにこのトグルをオフにしてください。オンのままにした場合、リモートデータベースからの取得中にも無効化を求められます。 + +#### コンテンツ由来のチャンクリビジョン(廃止された設定) + +画面表示: **コンテンツ由来のチャンクリビジョン(廃止された設定)** + +設定キー: `doNotUseFixedRevisionForChunks` +チャンクリビジョンは常にコンテンツから派生します。このキーは互換性のために保存設定やセットアップ URI で引き続き受け入れられますが、その値によって動作が変わることはなく、メンテナンスの前提条件でもありません。 + +#### ファイル名の大文字と小文字を区別 + +画面表示: **ファイルの大文字・小文字を区別する** + +設定キー: `handleFilenameCaseSensitive` +有効にすると、すべてのファイルが大文字小文字を区別して処理されます(従来の挙動)。 + +この設定が無効な場合、同じディレクトリ内でのファイル名の大文字小文字のみの変更は名前変更として同期されます。ディレクトリ名の大文字小文字の変更はこの処理ではサポートされていません。 + +新規 Vault ではクロスプラットフォーム互換性のために大文字小文字を区別しない処理が使用されます。明示的な値を持つ既存の設定はその選択を保持します。以前のリリースでもこの値が存在しない場合は大文字小文字を区別しない処理を適用していたため、1.0 では欠落しているレガシー値を互換性レビューやデータベース再構築を必要とせずに `false` として保存します。 + +#### Unicode パスの識別 + +設定キー: `pathNormalizationVersion` + +バージョン `0` はレガシーなファイル同一性を維持し、既存および新規設定のデフォルトです。バージョン `1` はドキュメント ID 導出時に Unicode NFC を使用するため、CLI と Obsidian 間で合成形式と分解形式の等価なパスが同じファイルを識別します。既存の物理ファイル名は保持されます。このモードは現在 CouchDB のみをサポートしています。 + +バージョン `1` は協調的な移行が必要です。Rebuild 前にソースクライアントで設定し、Fetch 前に残りの各クライアントで設定してください。設定を変更しただけでは既存のメタデータは移行されません。完全な手順については [Unicode NFC パス同一性への移行](recovery.md#migrate-to-unicode-nfc-path-identity) に従ってください。移行されたリモートに対してバージョン `0` のクライアントを実行しないでください。 + +選択された値は、通常の設定保存および再読み込みの間保留状態となります。Rebuild または Fetch 操作が正常に予約されたときにのみアクティブになります。キャンセルした場合は保留のままとなります。 + +同じ ID を持つ別ファイルや保持されたメタデータドキュメントが存在する場合、どちらのデータベースもリセットする前に再構築を停止します。ローカルデータベースを置き換える際、Rebuild および Fetch は未解決の競合がない論理削除を除外します。未解決の競合がある削除済みの代表リビジョンは、引き続き検査対象となります。この検査では、ホストがサポートするファイル一覧を使用します。Obsidian は Vault API が公開するパスを検査するため、インデックスに隠れた物理的な別名は検出できません。名前の重複や同期対象の範囲は、事前に解決してください。Self-hosted LiveSync がそれらを自動マージすることはありません。大文字小文字を区別しない処理では、既存の大文字小文字規則も適用されます。 + +### 4. 互換性(内部 API の使用) + +#### カスタマイズ同期時に変更をスキャン + +画面表示: **カスタマイズ同期時に変更をスキャンする** + +設定キー: `watchInternalFileChanges` +内部 API を使用しません。 + +### 5. エッジケース対応(データベース) + + + +#### データベースサフィックス + +画面表示: **データベースの接尾辞(suffix)** + +設定キー: `additionalSuffixOfDatabaseName` +LiveSync は、異なるデータベースサフィックスを付けない限り、同名の複数 Vault を扱えません。この値は自動的に設定されます。 + +この値を変更した後は Obsidian を再起動し、選択したサフィックスに対応する[SyncGuard の設定](#大量の変更受信時にワークスペースを保護オプトイン)を確認してください。 + +#### チャンク ID のハッシュアルゴリズム(互換性) + +画面表示: **チャンク ID のハッシュアルゴリズム** + +設定キー: `hashAlg` + +`xxhash64` がサポートされている現在の値です。古いアルゴリズムは、既存データベースのエッジケース互換性パスとしてのみ選択可能です。アルゴリズムを変更するとデバイス間でのチャンク再利用が減少する可能性があり、通常の設定差異のレビューが必要になります。 + +独立した ID 導出が有効な場合、暗号化されたチャンク ID は `hashAlg` の代わりにバージョン付き HMAC 構造を使用します。選択された `hashAlg` は引き続きレガシー ID に適用されます。 + +### 6. エッジケース対応(動作) + +#### 従来の動作でデータベースを取得 + +画面表示: **以前の動作でデータベースを取得** + +設定キー: `doNotSuspendOnFetching` +従来の挙動でデータベースを取得します。 + +#### 空のフォルダーを保持 + +画面表示: **空フォルダーの維持** + +設定キー: `doNotDeleteFolder` +ファイルが存在しない空のフォルダーを保持するかどうかを設定します。 + +#### 破損しているように見えるファイルも処理 + +画面表示: **破損していると思われるファイルも処理する** + +設定キー: `processSizeMismatchedFiles` + +サイズ不一致のあるファイルを処理するためにこの設定を有効にします。これらは一部の外部 API や統合によって発生することがあります。 + +### 7. エッジケース対応(処理) + +#### バックグラウンドでチャンクを分割しない + +画面表示: **バックグラウンドでチャンクを分割しない** + +設定キー: `disableWorkerForGeneratingChunks` +有効にすると、チャンクは UI スレッドで分割されます(従来の挙動)。 + +#### 小さいファイルをフォアグラウンドで処理 + +画面表示: **小さいファイルを UI スレッドで処理** + +設定キー: `processSmallFilesInUIThread` +有効にすると、1 KB 未満のファイルは UI スレッドで処理されます。 + +#### 互換性のあるチャンク設定を自動調整 + +設定キー: `autoAcceptCompatibleTweak` + +現在のリリースでは、差異が互換性のあるチャンク設定に限定されている場合にデフォルトでこれが有効になります。チャンクハッシュアルゴリズム、チャンクサイズ、またはチャンクスプリッターのバージョンについて、より新しい更新日時が記録されている側の値が使用されます。どちらにも更新日時が記録されていない場合や日時が等しい場合はリモートの値が使用されます。ダイアログの表示やデータベースの再構築は必要ありません。既存のコンテンツは引き続き読み取り可能ですが、これらの値を変更するとチャンクの再利用性が低下する可能性があります。互換性のある差異を手動で確認したい場合はこれをオフにしてください。互換性のない設定に関わる差異は、常に明示的な判断が必要です。 + +### 8. 互換性(対処済みの問題) + +#### 複製前に設定の不一致を確認しない + +画面表示: **レプリケーション前に設定の不一致を確認しない** + +設定キー: `disableCheckingConfigMismatch` +レプリケーション前に設定の不一致をチェックしません。 + +### 9. 是正措置 + +#### 反映対象とするファイルイベントの更新日時上限 + +画面表示: **ファイルイベントを反映する最大ファイル更新日時** + +設定キー: `maxMTimeForReflectEvents` + +この値(UNIX エポックからの秒数)より新しい更新日時を持つファイルは、イベントが反映されません。0に設定するとこの制限は無効になります。 + + + +## 11. メンテナンス + +### 1. Scram! + +#### サーバーをロック + +画面表示: **サーバーをロック** + +リモートサーバーをロックして他のデバイスとの同期を防止します。 + +#### 緊急再起動 + +画面表示: **緊急再起動** + +すべての同期を無効にして再起動します。 + +### 2. 同期 + +#### 再送信 + +画面表示: **再送信** + +ローカルで利用可能なすべてのチャンクをリモートに明示的に再送信します。これは復旧・メンテナンス専用の操作です。通常のレプリケーションで全チャンクを事前に送信するものではありません。 + +#### 受信ジャーナル履歴をリセット + +画面表示: **ジャーナル受信履歴をリセット** + +ジャーナル受信履歴を初期化します。次回の同期時に、このデバイスが送信したもの以外のすべてのアイテムが再度ダウンロードされます。 + +#### 送信ジャーナル履歴をリセット + +画面表示: **ジャーナル送信履歴をリセット** + +ジャーナル送信履歴を初期化します。次回の同期時に、このデバイスが受信したもの以外のすべてのアイテムが再度送信されます。 + +### 3. 再構築操作(ローカル) + +#### このデバイスの同期をリセット + +画面表示: **このデバイスの同期をリセット** + +リモートからローカルデータベースを復元または再構築します。 + +### 4. 全体の再構築 + +#### このデバイスのファイルでサーバーデータを上書き + +画面表示: **このデバイスのファイルでサーバーデータを上書き** + +ローカルファイルを使用してローカルおよびリモートのデータベースを再構築します。 + +### 5. 再構築操作(リモートのみ) + +#### クリーンアップを実行 + +画面表示: **クリーンアップを実行** + +最新以外のすべてのリビジョンを破棄してストレージ容量を削減します。リモートサーバーとローカルクライアントに同等の空き容量が必要です。 + +#### リモートを上書き + +画面表示: **リモートを上書き** + +ローカルデータベースとパスフレーズを使用してリモートを上書きします。 + +#### すべてのジャーナルカウンターをリセット + +画面表示: **すべてのジャーナルカウンターをリセット** + +すべてのジャーナル履歴を初期化します。次回の同期時にすべてのアイテムが送受信されます。 + +#### すべてのジャーナルカウンターを削除 + +画面表示: **すべてのジャーナルカウンターを削除** + +すべてのダウンロード/アップロードキャッシュをパージします。 + +#### 初期化ワイプ(Fresh Start Wipe) + +画面表示: **初期化ワイプ** + +リモートサーバー上のすべてのデータをバッチで削除します。この操作は非トランザクション処理です(途中で中断してもロールバックされません)。開始する前にすべての同期デバイスを停止してください。操作が中断されたり失敗が報告されたりした場合は、停止した状態を維持し、Fresh Start Wipe を再実行した上で、信頼できる Vault から **Overwrite Server Data with This Device's Files** を実行してください。 + +### 6. ガベージコレクション V3(CouchDB のみ) + +ガベージコレクション V3 は、現在のファイルや競合ブランチから到達不可能なチャンクドキュメントを特定し、それらのチャンクに対してローカルで論理削除を作成し、その削除を CouchDB に伝播させてリモートのコンパクション(圧縮)を要求します。 + +Vault、ローカルデータベース、およびリモートが正常であり、関連するすべてのデバイスが同期完了している場合にのみ使用してください。現在の状態でチャンクが不要になった過去のリビジョンは、読み取り不能になる可能性があります。データの破損修復や意図的な再構築の代替手段にはなりません。詳細は [ガベージコレクション V3 の仕様](specs_garbage_collection.md) を参照してください。 + +### 7. リセット + +#### 既存の設定とデータベースを破棄 + +Self-hosted LiveSync の設定とローカルデータベースを破棄してリセットします。危険な操作です。実行前に必ずバックアップを作成してください。 + +#### リセットまたはアンインストールのためにローカルデータベースを削除 + +画面表示: **Self-hosted LiveSync をリセットまたはアンインストールするため、ローカルデータベースを削除** + +ローカルデータベースを削除して、Self-hosted LiveSync をリセットまたはアンインストールします。 diff --git a/docs/setup_cloudant_ja.md b/docs/setup_cloudant_ja.md index 94efc181..3f582de8 100644 --- a/docs/setup_cloudant_ja.md +++ b/docs/setup_cloudant_ja.md @@ -1,7 +1,7 @@ -# IBM Cloudantのセットアップ +# IBM Cloudant のセットアップ ## インスタンスの作成 -下記の手順で、試用のためにIBM Cloudantのインスタンスを作成できます。 +下記の手順で、試用のために IBM Cloudant のインスタンスを作成できます。 1. 「リソースの作成」ボタンをクリックします。 @@ -10,70 +10,71 @@ 1. カタログが開くので、「Cloudant」と検索してください。出てきた選択肢をクリックすると作成画面に進みます。 ![step 2](../instruction_images/cloudant_2.png) -1. Liteプランを選択してください。 +1. 無料の Lite プランを選択してください。 ![step 3](../instruction_images/cloudant_3.png) -1. リージョンと環境を選択します。LiteではMultitenantしか選択できないので、Multitenantを選択してください。デフォルトで選択されています。 +1. リージョンと環境を選択します。Lite では Multitenant しか選択できないので、Multitenant を選択してください。デフォルトで選択されています。 リージョンはお好みの場所で作成してください。 ![step 4](../instruction_images/cloudant_4.png) -3. "Authentication Method"で「IAM and legacy credentials」を選択します。 +1. "Authentication Method"で「IAM and legacy credentials」を選択します。 ![step 5](../instruction_images/cloudant_5.png) -4. Liteプランが選択されていることと、Capacityを確認します。 +1. Lite プランが選択されていることと、Capacity を確認します。 ![step 6](../instruction_images/cloudant_6.png) -5. 確認ができたら、右側のCreateボタンをクリックします。 +1. 確認ができたら、右側の Create ボタンをクリックします。 ![step 7](../instruction_images/cloudant_7.png) -6. 上記の手順が正常に完了したら、左のメニューから「リソース・リスト」をクリックしてください。リソース・リストが表示され、「サービス及びソフトウエア」に作成したCloudantのインスタンスが表示されます。 +1. 上記の手順が正常に完了したら、左のメニューから「リソース・リスト」をクリックしてください。リソース・リストが表示され、「サービスおよびソフトウェア」に作成した Cloudant のインスタンスが表示されます。 インスタンス名をクリックしてください。 ![step 8](../instruction_images/cloudant_8.png) -7. ここで、"External Endpoint (preferred)" と記載されているアドレスを控えてください。後ほど使います。(\*1) +1. ここで、"External Endpoint (preferred)" と記載されているアドレスを控えてください。後ほどデータベース名と組み合わせて使用します。(\*1) ![step 9](../instruction_images/cloudant_9.png) ## データベースの設定 -1. 「Launch Dashboard」ボタンをクリックします。そうすると、今度はデータベースのダッシュボードが表示されます。CouchDBには、Fauxtonというインターフェイスがあるのですが、それそのものです。 +1. 「Launch Dashboard」ボタンをクリックします。すると、データベースのダッシュボードが表示されます。これは CouchDB の Fauxton インターフェースとほぼ同じものです。 ![step 1](../instruction_images/couchdb_1.png) -1. CORSの許可設定を行います。メニューの「Account」をクリックし、「CORS」タブを開きます。 +1. CORS の許可設定を行います。メニューの「Account」をクリックし、「CORS」タブを開きます。 最初は「Restrict to specific domains」が選択されているので、「All domains (\*)」を選択し直します。この反映は即座に行われますが、すぐに戻せるので大丈夫です。 +ただし、Cloudant では `app://obsidian.md` を許可する設定は使用できません。 ![step 2](../instruction_images/couchdb_2.png) 1. データベースが作成できるか確認します。メニューの「Databases」をクリックし、次に「Create Database」ボタンをクリックします。 -右側にパネルが表示されますので、好きな名前を入力し、「Create」ボタンをクリックします。 +右側にパネルが表示されますので、好きな名前を入力し(\*2)、「Create」ボタンをクリックします。 ![step 3](../instruction_images/couchdb_3.png) -1. それっぽいメッセージが表示された後、データベースが表示されていれば、ほとんどセットアップは完了です。今後、ほとんどこの画面は使いません。Self-hosted LiveSyncからデータベースは作成できます。 +1. 完了を示すメッセージが表示された後、データベースが表示されていれば、セットアップはほぼ完了です。データベースを作成できることを確認した後は、通常この画面を開く必要はありません。Self-hosted LiveSync からもデータベースを作成できます。 ![step 4](../instruction_images/couchdb_4.png) -### 資格情報のセットアップ +### 認証情報のセットアップ -1. IBM Cloudに戻って、「サービス資格情報」をクリックしてください。おそらく何も表示されていないので、「新規資格情報」をクリックします。 +1. IBM Cloud に戻って、「サービス資格情報」をクリックしてください。おそらく何も表示されていないので、「新規資格情報」をクリックします。 ![step 1](../instruction_images/credentials_1.png) -1. 資格情報を作成するダイアログが表示されるので、わかりやすい名前を入力します。その後、役割に「管理者」が選択されていることを確認してから、「追加」ボタンをクリックしてください。 +1. 認証情報を作成するダイアログが表示されるので、任意の名前を入力するか既定のままにして、「追加」ボタンをクリックしてください。 ![step 2](../instruction_images/credentials_2.png) - 備考: この「名前」はSelf-hosted LiveSyncで使用するUsernameとはまた別のものです。 + 備考: この「名前」は Self-hosted LiveSync で使用する Username とはまた別のものです。 -1. 「サービス資格情報」に戻ると、新しい資格情報が作成されています。~~わかりにくいことに名前は「鍵名」に変わります~~。左側のボタンを押すと詳細が開きます。 +1. 「サービス資格情報」に戻ると、新しい認証情報が作成されています。~~わかりにくいことに名前は「鍵名」に変わります~~。左側のボタンを押すと詳細が開きます。 ![step 3](../instruction_images/credentials_3.png) - Self-hosted LiveSyncから使用するUsernameとPasswordは、表示されたJSONに記載されているものを使用します。 - 今回の図で言うと、Usernameは"apikey-v2-2unu15184f7o8emr90xlqgkm2ncwhbltml6tgnjl9sd5"(\*3)、パスワードは"c2c11651d75497fa3d3c486e4c8bdf27"(\*4)になります。 + Self-hosted LiveSync から使用する Username と Password は、表示された JSON に記載されているものを使用します。 + 今回の図で言うと、Username は"apikey-v2-2unu15184f7o8emr90xlqgkm2ncwhbltml6tgnjl9sd5"(\*3)、パスワードは"c2c11651d75497fa3d3c486e4c8bdf27"(\*4)になります。 -## Self-hosted LiveSyncに設定 +## Self-hosted LiveSync に設定 ![Setting](../images/remote_db_setting.png) 先ほどの設定例から引用すると、 -| Items | Value | example | -| ------------------- | -------------------------------- | --------------------------------------------------------------------------- | +| 項目 | 値 | 例 | +| --- | --- | --- | | URI | (\*1) | https://xxxxxxxxxxxxxxxxx-bluemix.cloudantnosqldb.appdomain.cloud | -| Username | (\*3) | apikey-v2-2unu15184f7o8emr90xlqgkm2ncwhbltml6tgnjl9sd5 | -| Password | (\*4) | c2c11651d75497fa3d3c486e4c8bdf27 | -| Database name | (\*2) | sync-test | +| Username | (\*3) | apikey-v2-2unu15184f7o8emr90xlqgkm2ncwhbltml6tgnjl9sd5 | +| Password | (\*4) | c2c11651d75497fa3d3c486e4c8bdf27 | +| Database name | (\*2) | sync-test | -となります。 +のとおりです。 diff --git a/docs/setup_own_server_ja.md b/docs/setup_own_server_ja.md index 5211c3ac..bd601a28 100644 --- a/docs/setup_own_server_ja.md +++ b/docs/setup_own_server_ja.md @@ -1,93 +1,434 @@ -# CouchDBのセットアップ方法 +# CouchDB サーバーのセットアップ -## CouchDBのインストールとPCやMacでの使用 -CouchDBを構築するには、[Dockerのイメージ](https://hub.docker.com/_/couchdb)を使用するのが一番簡単です。 -ただし、インストールしたCouchDBをSelf-hosted LiveSyncから使用するためには、少々設定が必要となります。 -具体的には、下記の設定が`local.ini`として必要になります。 +## 目次 + +- [1. CouchDB を準備する](#1-prepare-couchdb) + - [A. Docker を使用する](#a-using-docker) + - [B. Docker Compose を使用する](#b-using-docker-compose) + - [C. CouchDB を直接インストールする](#c-install-couchdb-directly) +- [2. couchdb-init.sh を実行して初期化する](#2-run-couchdb-initsh-for-initialise) +- [3. デバイスから CouchDB に接続できるようにする](#3-expose-couchdb-to-the-internet) +- [4. クライアントのセットアップ](#4-client-setup) +- [手動セットアップ情報](#manual-setup-information) +- [リバースプロキシ](#reverse-proxies) + +--- + + + +## 1. CouchDB を準備する + + + +### A. Docker を使用する + + + +#### 1. 準備 +```bash + +# 環境変数を設定する。 +export hostname=http://localhost:5984 +export username=goojdasjdas # 好きな値に変更してください。 +export password=kpkdasdosakpdsa # 好きな値に変更してください。 + +# 保存データと設定用のディレクトリを作成する。 +mkdir couchdb-data +mkdir couchdb-etc +``` + + + +#### 2. Docker コンテナを実行する +1. 起動確認。 +``` +$ docker run --name couchdb-for-ols --rm -it -e COUCHDB_USER=${username} -e COUCHDB_PASSWORD=${password} -v ${PWD}/couchdb-data:/opt/couchdb/data -v ${PWD}/couchdb-etc:/opt/couchdb/etc/local.d -p 5984:5984 couchdb +``` +> [!WARNING] +> コンテナがエラーで終了した場合は、couchdb-data と couchdb-etc のアクセス権を確認してください。 +> CouchDB の起動後、これらのディレクトリの所有者は uid:`5984` になります。その uid に所有者を変更し直してください。 + +2. バックグラウンドで有効化する +``` +$ docker run --name couchdb-for-ols -d --restart always -e COUCHDB_USER=${username} -e COUCHDB_PASSWORD=${password} -v ${PWD}/couchdb-data:/opt/couchdb/data -v ${PWD}/couchdb-etc:/opt/couchdb/etc/local.d -p 5984:5984 couchdb +``` + +完了したら、[手順 2](#2-run-couchdb-initsh-for-initialise)に進んでください。 + + + +### B. Docker Compose を使用する + + + +#### 1. 準備 ``` -[couchdb] -single_node=true -max_document_size = 50000000 +# 保存データと設定用のディレクトリを作成する。 +mkdir couchdb-data +mkdir couchdb-etc -[chttpd] -require_valid_user = true -max_http_request_size = 4294967296 +# 所有者をユーザー 5984 に変更する。 +chown -R 5984:5984 ./couchdb-data +chown -R 5984:5984 ./couchdb-etc +``` -[chttpd_auth] -require_valid_user = true -authentication_redirect = /_utils/session.html + -[httpd] -WWW-Authenticate = Basic realm="couchdb" -enable_cors = true +#### 2. 次の内容を追加した `docker-compose.yml` ファイルを作成する +``` +services: + couchdb: + image: couchdb:latest + container_name: couchdb-for-ols + user: 5984:5984 + environment: + - COUCHDB_USER= # 好きな値に変更してください。 + - COUCHDB_PASSWORD= # 好きな値に変更してください。 + volumes: + - ./couchdb-data:/opt/couchdb/data + - ./couchdb-etc:/opt/couchdb/etc/local.d + ports: + - 5984:5984 + restart: unless-stopped +``` + + +#### 3. Docker Compose ファイルを実行して起動確認する + +``` +docker compose up +# 古いバージョンを使用している場合 +docker-compose up +``` +> [!WARNING] +> コンテナがエラーで終了した場合は、couchdb-data と couchdb-etc のアクセス権を確認してください。 +> CouchDB の起動後、これらのディレクトリの所有者は uid:`5984` になります。その uid に所有者を変更し直してください。 + + + +#### 4. Docker Compose ファイルをバックグラウンドで実行する +すべて正常に完了し、エラーが発生しなかった場合は、`CTRL+C` で終了してから次のコマンドを実行します。 +``` +docker compose up -d +# 古いバージョンを使用している場合 +docker-compose up -d +``` + +完了したら、[手順 2](#2-run-couchdb-initsh-for-initialise)に進んでください。 + + + +### C. CouchDB を直接インストールする +[公式ドキュメント](https://docs.couchdb.org/en/stable/install/index.html)を参照してください。ただし、完全に設定する必要はありません。管理者を設定するだけで十分です。 + + + +## 2. couchdb-init.sh を実行して初期化する + +Deno 2 が必要です。CouchDB の接続情報とデータベースの詳細をエクスポートし、プロビジョニング用のラッパーを実行します。 + +この手順の `username` と `password` は CouchDB の管理者認証情報です。Docker または Docker Compose の場合は、`COUCHDB_USER` と `COUCHDB_PASSWORD` に指定した同じ値を使用します。直接インストールした場合は、CouchDB のセットアップ時に設定した管理者を使用します。ラッパーは、管理者以外の同期用アカウントを別途作成しません。 + +``` +export hostname=http://localhost:5984 +export username='' +export password='' +export database=obsidiannotes +curl -s https://raw.githubusercontent.com/vrtmrz/obsidian-livesync/main/utils/couchdb/couchdb-init.sh | bash +``` + +> [!TIP] +> fish では `hostname` が読み取り専用で、エクスポートできません。代わりに `env` 経由で値を渡してください: `curl -s https://raw.githubusercontent.com/vrtmrz/obsidian-livesync/main/utils/couchdb/couchdb-init.sh | env hostname='http://localhost:5984' username='' password='' database=obsidiannotes bash` + +次のように表示された場合: +``` +CouchDB provisioning completed. +``` + +ラッパーは、レジストリでバージョンを固定した Commonlib を使用するコードをそのまま実行します。`database` を指定すると、データベースを作成し、Commonlib を通じて LiveSync のデータベースバージョンドキュメントを初期化します。`database` を指定しない場合は、CouchDB サーバーの設定のみを行います。 + +Docker Compose を使用していて上記のコマンドが動作しない場合、または `ERROR: Hostname missing` と表示される場合は、プレースホルダーを自分の値に置き換えて次のコマンドを実行してください: +``` +curl -s https://raw.githubusercontent.com/vrtmrz/obsidian-livesync/main/utils/couchdb/couchdb-init.sh | hostname='http://:5984' username='' password='' database=obsidiannotes bash +``` + + + +## 3. デバイスから CouchDB に接続できるようにする + +- CouchDB を信頼できるローカルネットワーク上のデスクトップデバイスでのみ使用する場合は、この手順を省略できます。 + - モバイルデバイスでは、Obsidian は有効な証明書付きの HTTPS を必要とします。HTTPS を使用するために CouchDB を公開する必要はありません。 + +デバイスから CouchDB サーバーへの接続方法を選択します。自分で運用する[リバースプロキシ](#reverse-proxies)、プライベートネットワーク経由のアクセス、または任意のトンネルサービスを使用できます。[Docker プロファイル](../docker/README.md#profile-details)には例があります。 + +Cloudflare は任意の選択肢の1つです。次の例では、一時的なテスト用に [Quick Tunnel](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/) を使用します。ランダムなホスト名が表示され、トンネルを作成するたびに変わります。また、`cloudflared` プロセスを停止すると URL は動作しなくなります。Quick Tunnel はテストと開発用であり、本番用ではありません。継続して使用する場合は、選択した接続方法を設定してください。Cloudflare を選ぶ場合は、[Cloudflare Tunnel ガイド](https://developers.cloudflare.com/tunnel/get-started/)が参考になります。 + +``` +cloudflared tunnel --url http://localhost:5984 +``` + +次の 2024 年の出力は形式の例です。ホスト名は例示のみを目的としています。実際には、自分のトンネルが出力した URL を使用してください。 + +``` +2024-02-14T10:35:25Z INF Thank you for trying Cloudflare Tunnel. Doing so, without a Cloudflare account, is a quick way to experiment and try it out. However, be aware that these account-less Tunnels have no uptime guarantee. If you intend to use Tunnels in production you should use a pre-created named tunnel by following: https://developers.cloudflare.com/cloudflare-one/connections/connect-apps +2024-02-14T10:35:25Z INF Requesting new quick Tunnel on trycloudflare.com... +2024-02-14T10:35:26Z INF +--------------------------------------------------------------------------------------------+ +2024-02-14T10:35:26Z INF | Your quick Tunnel has been created! Visit it at (it may take some time to be reachable): | +2024-02-14T10:35:26Z INF | https://tiles-photograph-routine-groundwater.trycloudflare.com | +2024-02-14T10:35:26Z INF +--------------------------------------------------------------------------------------------+ + : + : + : +``` +トンネルが出力した URL をサーバーアドレスとして使用します。クライアントの設定とテストが完了するまで、トンネルプロセスを実行したままにしてください。 + + + +## 4. クライアントのセットアップ +> [!TIP] +> 生成されたセットアップ URI は、新しい Vault の現在のデフォルトと、選択したリモートプロファイルを引き継ぐため、推奨される方法です。セットアップ URI を生成できない場合は、[1台目で CouchDB を手動設定する](./quick_setup_ja.md#1台目で-couchdb-を手動設定する)に従い、その後、動作中のデバイスから新しいセットアップ URI を生成して、追加のデバイスごとに使用してください。 + + + +### 1. デスクトップデバイスまたはサーバーでセットアップ URI を生成する + +ここでの `LIVESYNC_USER` と `LIVESYNC_PASS` は、Self-hosted LiveSync がこのデータベースへの通常のアクセス用に保存する認証情報です。手順 2 の管理者認証情報でもかまいません。このデータベースへの必要なアクセス権を持つ CouchDB アカウントを別途設定している場合は、そのアカウントを使用してください。プロビジョニングラッパーもセットアップ URI ジェネレーターも、その別のアカウントを作成しません。 + +デバイスから CouchDB に接続するときに使用するサーバー URL を使用します。上記の一時的な Quick Tunnel の例では、実行中の自分のトンネルが出力した URL を使用してください。 + +```bash +export LIVESYNC_HOST='' +export LIVESYNC_DB=obsidiannotes +export LIVESYNC_USER='' +export LIVESYNC_PASS='' +export LIVESYNC_PASSPHRASE='' +export uri_passphrase='' # 任意 +deno run --minimum-dependency-age=0 --allow-env https://raw.githubusercontent.com/vrtmrz/obsidian-livesync/main/utils/setup/generate_setup_uri.ts +``` + +> [!TIP] +> `LIVESYNC_PASSPHRASE` は、エンドツーエンド暗号化で同期 Vault のデータを保護します。`uri_passphrase` はセットアップ URI のみを保護します。異なる値を使用し、両方を安全に保管し、セットアップ URI とそのパスフレーズを同じ経路で送らないでください。 +> +> `uri_passphrase` を省略した場合、ジェネレーターは暗号学的にランダムな値を作成し、一度だけ表示します。 + +ジェネレーターは、ランダムな ID キーの復旧コードも表示します。同じ Vault のセットアップ URI を再生成する可能性がある場合は、そのコードを保存してください。`id_recovery_code` として渡し直さないと、後で実行したときに異なるキーが作成されます。`id_mode=legacy` は、以前の ID 動作を使用する Vault に接続する場合にのみ設定してください。詳しくは[セットアップユーティリティのリファレンス](../utils/readme.md#setup-uri-generation)を参照してください。 + +ジェネレーターは、プロビジョニングユーティリティが使用するのと同じ、レジストリでバージョンを固定した Commonlib リリースを使用します。設定済みの CouchDB リモートプロファイルを作成し、新しい Vault の現在のデフォルトを適用して、Commonlib のセットアップ URI 契約でエンコードします。 + +デフォルトでは、URI は Ephemeral(一時的)であり、ジェネレーターが表示した正確な UTC 時刻までのみ開けます。これは作成から7日後ではなく、固定された7日間の UTC ウィンドウの終了時点です。URI に時間条件が必要ない場合、または既存の暗号化形式をサポートする古いクライアントで読み取る必要がある場合は、コマンドを実行する前に `uri_mode=persistent` を設定してください。 + +出力は次の形式になります。以下のタイムスタンプと値は例です。 + +```text +Generated couchdb Setup URI. +Ephemeral: usable until 2026-10-01T00:00:00.000Z (UTC). +Your passphrase for the Setup URI is: H7vX...a-random-32-character-value +This passphrase is never shown again, so store it safely. +ID recovery code: sls-id-v1:<64 lowercase hexadecimal characters> +Use id_recovery_code with this value and reuse the same remote settings when generating another Setup URI for the same Vault. +obsidian://setuplivesync?settings=%5B%22tm2DpsOE74nJAryprZO2M93wF%2Fvg.......4b26ed33230729%22%5D +``` + +セットアップ URI とそのパスフレーズは別々に保管してください。 + + + +### 2. Self-hosted LiveSync を Obsidian にセットアップする + +1台目については、[クイックセットアップ](./quick_setup_ja.md#1台目のデバイスをセットアップする)に従ってください。現在のオンボーディング通知、セットアップ URI のインポート、サーバーの初期化、および新しくプロビジョニングされたデータベースで表示される安全確認について説明しています。 + +通常のノート同期が動作した後、その1台目で[新しいセットアップ URI を生成](./quick_setup_ja.md#別のデバイス用のセットアップ-uri-を作成する)し、[別のデバイスを追加する](./quick_setup_ja.md#別のデバイスを追加する)に従ってください。2台目を、プロビジョニング時に作成した初期セットアップ URI の保持に依存させないでください。オプション機能は、通常の経路が確認された後にのみ設定してください。[非表示ファイル同期には専用のガイド](./tips/hidden-file-sync.md)があります。 + +--- + + + +## 手動セットアップ情報 + + + +### ドメインの設定 + +ドメインの A レコードをサーバーに向けて設定し、任意の方法でリバースプロキシをホストします。 +注: CouchDB をトップディレクトリにマウントすることは推奨しません。 +Caddy を使用すると、SSL 付きでサーバーを自動的に提供でき便利です。 + +Caddy と CouchDB を同時に起動する [docker-compose.yml と ini ファイル](https://github.com/vrtmrz/self-hosted-livesync-server)を公開しています。Traefik を使用している場合は、下の[リバースプロキシ](#reverse-proxies)のセクションを確認してください。 + +また、サーバーログを必ず確認し、不正なアクセスに注意してください。 + + + +## リバースプロキシ + + + +### Traefik + +Traefik を使用している場合、この [docker-compose.yml](https://github.com/vrtmrz/obsidian-livesync/blob/main/docker-compose.traefik.yml) ファイル(下にも掲載)には、適切な CORS パラメーターがすべて設定されています。外部ネットワーク `proxy` が存在することを前提としています。 + +```yaml +services: + couchdb: + image: couchdb:latest + container_name: obsidian-livesync + user: 1000:1000 + environment: + - COUCHDB_USER=username + - COUCHDB_PASSWORD=password + volumes: + - ./data:/opt/couchdb/data + - ./local.ini:/opt/couchdb/etc/local.ini + # Traefik に渡している場合はポートは不要 + #ports: + # - 5984:5984 + restart: unless-stopped + networks: + - proxy + labels: + - "traefik.enable=true" + # Traefik ネットワーク + - "traefik.docker.network=proxy" + # 'obsidian-livesync.example.org' を自分のドメインに置き換えるのを忘れないでください + - "traefik.http.routers.obsidian-livesync.rule=Host(`obsidian-livesync.example.org`)" + # 'websecure' エントリーポイントは基本的に HTTPS のエントリーポイントです。問題が発生した場合にのみ次のコードスニペットを確認してください。これがリバースプロキシする最初のコンテナでなければ、おそらく Traefik は正しく設定されています。 + - "traefik.http.routers.obsidian-livesync.entrypoints=websecure" + - "traefik.http.routers.obsidian-livesync.service=obsidian-livesync" + - "traefik.http.services.obsidian-livesync.loadbalancer.server.port=5984" + - "traefik.http.routers.obsidian-livesync.tls=true" + # 'letsencrypt' を自分の証明書リゾルバーに置き換えてください + - "traefik.http.routers.obsidian-livesync.tls.certresolver=letsencrypt" + - "traefik.http.routers.obsidian-livesync.middlewares=obsidiancors" + # Traefik 2.x で CORS を動作させるために必要な部分はここから + - "traefik.http.middlewares.obsidiancors.headers.accesscontrolallowmethods=GET,PUT,POST,HEAD,DELETE" + - "traefik.http.middlewares.obsidiancors.headers.accesscontrolallowheaders=accept,authorization,content-type,origin,referer" + - "traefik.http.middlewares.obsidiancors.headers.accesscontrolalloworiginlist=app://obsidian.md,capacitor://localhost,http://localhost" + - "traefik.http.middlewares.obsidiancors.headers.accesscontrolmaxage=3600" + - "traefik.http.middlewares.obsidiancors.headers.addvaryheader=true" + - "traefik.http.middlewares.obsidiancors.headers.accessControlAllowCredentials=true" + +networks: + proxy: + external: true +``` + +上記で言及した `traefik.yml` 設定ファイルの抜粋: +```yml +... + +entryPoints: + web: + address: ":80" + http: + redirections: + entryPoint: + to: "websecure" + scheme: "https" + websecure: + address: ":443" + +... +``` + + + +### Nginx + +Nginx を CouchDB のリバースプロキシとして設定する際は、よくある間違いに注意してください。 + +1. Fast Fetch の進捗が止まり、無期限にフリーズしたように見える場合は、`proxy_buffering` が無効になっていることを確認してください: + +```nginx +location / { + proxy_pass http://127.0.0.1:5984; + proxy_buffering off; + ... +} +``` + +2. "413 Entity too large" エラーが発生する場合は、`client_max_body_size` を増やしてください: + +```nginx +location / { + proxy_pass http://127.0.0.1:5984; + client_max_body_size 50M; # 必要に応じて値を調整してください + ... +} +``` + +3. "404 Database not found" エラーが発生する場合は、CouchDB をルートロケーションに配置していることを確認してください(推奨): + +```nginx +server { + server_name couchdb.domain.com + + location / { + proxy_pass http://127.0.0.1:5984; + ... + } +} +``` + +CouchDB をサブディレクトリに配置することも可能ですが、設定をそれに合わせて変更する必要があります: + +```nginx + +server { + server_name domain.com + + location /couchdb { + rewrite ^ $request_uri; + rewrite ^/couchdb/(.*) /$1 break; + + proxy_pass http://127.0.0.1:5984$uri; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + ... + } + location /_session { + proxy_pass http://127.0.0.1:5984/_session; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + ... + } +} +``` + +4. データベース接続の詳細設定でカスタム HTTP ヘッダーを追加した場合は、Nginx と CouchDB の両方の設定を更新してください: + +Nginx: +```nginx +location / { + set $pass 1; + + # カスタム HTTP ヘッダーを処理する例 + if ($http_x_custom_header != 'foo'){ + set $pass 0; + } + + # 重要: OPTIONS リクエストにはヘッダーが含まれないため、常に CouchDB にプロキシする必要があります + if ($request_method = 'OPTIONS') { + set $pass 1; + } + + if ($pass = 0) { + return 403; + } + + proxy_pass http://127.0.0.1:5984; + ... +} +``` + +couchdb-etc/docker.ini: +```ini +... [cors] -origins = app://obsidian.md,capacitor://localhost,http://localhost credentials = true -headers = accept, authorization, content-type, origin, referer -methods = GET, PUT, POST, HEAD, DELETE -max_age = 3600 +origins = app://obsidian.md,capacitor://localhost,http://localhost + +;カスタムヘッダーをリストに追加して、CORS が壊れないようにしてください +headers = accept, authorization, content-type, origin, referer, x-custom-header ``` - -このファイルを作成し、 -``` -$ docker run --rm -it -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=password -v .local.ini:/opt/couchdb/etc/local.ini -p 5984:5984 couchdb -``` -とすると簡単にCouchDBを起動することができます。 -備考:このとき、local.iniのオーナーが5984:5984になります。これは、Dockerイメージの制限事項です。編集する場合はいったんオーナーを変更してください。 -正常にSelf-hosted LiveSyncからアクセスすることができたら、お好みでバックグラウンドで起動するように編集して起動してください。 -例) -``` -$ docker run -d --restart always -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=password -v .local.ini:/opt/couchdb/etc/local.ini -p 5984:5984 couchdb -``` - - -## モバイルからのアクセス -MacやPCからアクセスする場合は上記の方法で作ったサーバーで問題ありませんが、モバイル端末からアクセスする場合は有効なSSLの証明書が必要となります。 - -### モバイルからのアクセスのテスト -テストを行う場合は、[localhost.run](http://localhost.run/)などのサービスが便利です。 -``` -$ ssh -R 80:localhost:5984 nokey@localhost.run -Warning: Permanently added the RSA host key for IP address '35.171.254.69' to the list of known hosts. - -=============================================================================== -Welcome to localhost.run! - -Follow your favourite reverse tunnel at [https://twitter.com/localhost_run]. - -**You need a SSH key to access this service.** -If you get a permission denied follow Gitlab's most excellent howto: -https://docs.gitlab.com/ee/ssh/ -*Only rsa and ed25519 keys are supported* - -To set up and manage custom domains go to https://admin.localhost.run/ - -More details on custom domains (and how to enable subdomains of your custom -domain) at https://localhost.run/docs/custom-domains - -To explore using localhost.run visit the documentation site: -https://localhost.run/docs/ - -=============================================================================== - - -** your connection id is xxxxxxxxxxxxxxxxxxxxxxxxxxxx, please mention it if you send me a message about an issue. ** - -xxxxxxxx.localhost.run tunneled with tls termination, https://xxxxxxxx.localhost.run -Connection to localhost.run closed by remote host. -Connection to localhost.run closed. -``` -このように表示された場合、`https://xxxxxxxx.localhost.run`が一時的なサーバアドレスとして使用できます。 - -### ドメインを設定してアクセスする。 - -DNSのAレコードを設定し、お好みの方法でリバースプロキシをホスティングしてください。 -備考:トップディレクトリにCouchDBを露出させるのはおすすめしません。 -Caddy等でLet's Encryptの証明書を自動取得すると運用が楽になります。 - -CaddyとCouchDBを同時に立てられる[docker-composeの設定とiniファイル](https://github.com/vrtmrz/self-hosted-livesync-server)を公開しています。 -ぜひご利用下さい。 - -なお、サーバのログは必ず確認し、不正なアクセスに注意してください。 \ No newline at end of file diff --git a/docs/tech_info_ja.md b/docs/tech_info_ja.md index faee6b6a..de13cc01 100644 --- a/docs/tech_info_ja.md +++ b/docs/tech_info_ja.md @@ -4,13 +4,30 @@ ![Synchronisation](../images/1.png) -1. ノートが更新された際、Obsidianがイベントを発報します。Obsidian-LiveSyncはそれをハンドリングして、ローカルのPouchDBに変更を反映します。 -2. PouchDBは、リモートのCouchDBに差分をレプリケーションします。 -3. 他のデバイスは、リモートのCouchDBを監視しているので、変更が検出された場合はそのまま差分がダウンロードされます。 -4. Self-hosted LiveSyncはPouchDBに転送された変更を、ObsidianのVaultに反映していきます。 +1. ノートが更新されると、Obsidian からイベントが通知されます。Self-hosted LiveSync はイベントを処理し、ローカルの PouchDB に変更を反映します。 +2. PouchDB は差分をリモートの CouchDB に複製します。 +3. 他のデバイスはリモートの CouchDB を監視し、変更を検出すると差分をダウンロードします。 +4. Self-hosted LiveSync は、PouchDB が受信した変更を Obsidian の Vault に反映します。 -図は2端末での単一方向として描きましたが、実際には双方向に、複数の端末間で実行されます。 +図では2台のデバイス間の一方向として示していますが、実際には複数のデバイス間で双方向に同期します。 + +## ファイルイベントとストレージ書き込み + +ファイルイベントは、Vault 内で検出された変更を表します。Commonlib はこれらのイベントをフィルタリングおよび直列化してから、ローカルデータベース内のファイルメタデータを更新します。したがって、キューに入った `DELETE` はデータベースの変更を要求するものであり、それ自体が物理ファイルを削除する命令ではありません。同期対象外へのファイル名の変更も、宛先ファイルがディスク上に残ったままデータベース上は削除扱いとなる場合があります。 + +逆方向の処理はデータベースのメタデータから始まります。レプリケーションされた変更やフルスキャンによってデータベースからストレージへのハンドラが呼び出され、競合およびコンテンツ保護ルールに従って Vault ファイルの書き込みや削除が行われます。古いファイルイベントによるメタデータの削除を防ぐことと、正当なレプリケーションによる削除を適用することは、別の判断基準として扱われます。 + +Commonlib の [Storage events and database-to-storage reflection](https://github.com/vrtmrz/livesync-commonlib/blob/main/docs/storage-events-and-reflection.md) には、イベントの境界、Commonlib 0.1.23 で導入された削除の再検証、およびその制限事項が記載されています。特に、削除保護機能は外部フォルダの大文字小文字の変更やパスの表記揺れの完全な収束を保証するものではありません。 + +## 現在の技術リファレンス + +- [データベースのデータ構造 (Database Data Structures)](datastructure.md): 現在のメタデータおよびチャンクの形式、識別子の取り扱い、削除、リモート上の生の表現について解説しています。 +- [Replicator のアーキテクチャ (Replicator architecture)](design_docs/replicator_architecture.md): プロバイダーの構成、アクティブな Replicator の公開、終了、および P2P の所有権について解説しています。 +- [競合解決とリビジョン履歴 (Conflict resolution and revision provenance)](specs_conflict_resolution.md): 現在のリビジョンツリーおよびファイルの来歴ルールを定義しています。 +- [チャンクの取得と待機 (Chunk Retrieval and Waiting)](design_docs/chunk_retrieval_and_waiting.md): 不足しているチャンクの到着と、処理が落ち着くまでの待機の扱いを定義しています。 +- [パスコンポーネント長の互換性 (Path component length compatibility)](design_docs/path_component_length_compatibility.md): 255 UTF-8 バイトがパスの妥当性を判断する普遍的な規則ではなく、Android や Linux における互換性警告である理由を解説しています。 +- [データ圧縮 (Data Compression)](specs_data_compression.md) および [ガベージコレクション V3 (Garbage Collection V3)](specs_garbage_collection.md): それぞれのストレージとメンテナンスに関する取り決めを説明しています。 ## 帯域幅低減のために -![dedupe](../images/2.png) \ No newline at end of file +![dedupe](../images/2.png) diff --git a/docs/tips/fast-setup_ja.md b/docs/tips/fast-setup_ja.md index 56be7d2c..7f342a81 100644 --- a/docs/tips/fast-setup_ja.md +++ b/docs/tips/fast-setup_ja.md @@ -1,30 +1,29 @@ # ファストセットアップ (Fast Setup / Simple Fetch) -ファストセットアップは、2台目以降のデバイスのセットアップやデータベース再構築時のデータ取得・初期化処理を、直感的かつ迅速に行うための簡略化された同期フローです。 +ファストセットアップ(Simple Fetch)は、新規または空の2台目以降のデバイスに初期複製する際の推奨フローです。復旧にも使えますが、取得時の選択によってローカルファイルが置き換わることがあります。すでに作業がある Vault で処理方法を選ぶ前に、価値のあるローカルデータとリモートデータを保全してください。正本を特定する方法は[復旧とフラグファイル](../recovery.md#first-choose-the-authoritative-copy)を参照してください。 -従来のセットアップウィザードにおける複数の詳細なステップを踏むことなく、同期の基本方針を選択するだけで、データベースのダウンロードとローカルファイルのスキャン・反映を一連のプロセスとして自動的に実行します。 +従来のセットアップウィザードにおける複数の詳細なステップを踏むことなく、同期の基本方針を選択するだけで、データベースのダウンロードとローカルファイルのスキャン・反映を一連のプロセスとして自動的に実行します。取得経路は、選択したリモートによって異なります。 --- ## 仕組み -2台目以降のデバイスで **セットアップURI** をインポートした場合や、手動でデータの再フェッチ(Vaultルートに `redflag3.md` / `flag_fetch.md` を配置する等)が予約された場合、プラグインはリモートデータベースからのデータ取得スケジュールを設定します。 +2台目以降のデバイスで **セットアップ URI** をインポートした場合や、手動でデータの再取得(Vault ルートに `redflag3.md` / `flag_fetch.md` を配置する等)が予約された場合、プラグインはリモートデータベースからのデータ取得スケジュールを設定します。 -その後の起動時、プラグインはデータフェッチ予約モードで立ち上がり、**「Data retrieval scheduled(データ取得のスケジュール)」** という簡略化されたダイアログを表示します。 +その後の起動時、プラグインはデータ取得予約モードで立ち上がり、**「Data retrieval scheduled(データ取得のスケジュール)」** という簡略化されたダイアログを表示します。 --- ## 技術的な特徴 -ファストセットアップは、高速かつ安全でクリーンな処理を実現するために、以下の最適化を行っています。 +ファストセットアップでは、取得と反映に関して次の動作を行います。 -1. **高速なストリーム受信** - - 全データを取得しますが、ストリーム受信によるレプリケーションを使用するため、処理が非常に高速です。 +1. **CouchDB 向けのストリームベースの Fast Fetch** + - ストリームベースの Fast Fetch は CouchDB 専用です。リモートのメタデータを段階的に取得します。オブジェクトストレージと P2P は、それぞれ独自の取得経路を使用します。 2. **ストレージ反映の遅延による不要な警告の抑制** - - データのダウンロード中にローカルファイル(ストレージ)への書き出し(反映)処理をあえて遅延させることで、同期途中で発生しがちな「破損データ同期」や「サイズ不一致」などの一時的なエラー警告を抑え込みます。 - - すべてのデータダウンロードが完了した後に一括してストレージへ書き出すため、不必要な警告画面でユーザーを混乱させません。 -3. **時刻ベース比較の妥当性** - - 初期セットアップやリカバリーの段階(この状態に移行した直後)においては、概ねファイル更新時刻(タイムスタンプ)ベースでの単純比較を行うことで、十分かつ妥当な同期結果を得ることができます。これにより複雑な競合解決の手間を省きます。 + - 取得中にローカルファイルへの反映を遅延させることで、リモートデータの取得中に発生する一時的な同期警告を抑制します。 +3. **更新日時を比較してファイル全体を選択** + - **更新日時を比較して新しい方を採用** は更新日時を比較し、ファイル全体として新しい方のバージョンを選択します。ファイルの内容をマージする処理ではありません。作業中の Vault にこの方法を使う前に、価値のあるローカルおよびリモートの編集内容を保全し、[復旧とフラグファイル](../recovery.md#first-choose-the-authoritative-copy)を確認してください。 --- @@ -33,30 +32,31 @@ ### ステップ 1: データの反映方法の選択 取得したリモートデータを、既存のローカルファイルとどのように統合するかを選択します。 -1. **Compare time and take newer (newer-wins)** - - ファイルの更新日時を比較し、より新しい方を採用します。 - - **推奨されるケース:** すでに Self-hosted LiveSync を使用しており、複数のデバイスで編集した変更内容をタイムスタンプに基づいて統合したい場合。 -2. **Overwrite all with remote files (remote-wins)** +1. **更新日時を比較して新しい方を採用(newer-wins)** + - ファイルの更新日時を比較し、ファイル全体として新しい方のバージョンを採用します。両方のバージョンの編集内容を統合するものではありません。 + - **推奨されるケース:** 両方のバージョンを保全した上で、更新日時に基づいてどちらかを意図的に選択したい場合。 + - 作業中の Vault にこの方法を使う前に、価値のあるローカルおよびリモートの編集内容を保全し、[復旧とフラグファイル](../recovery.md#first-choose-the-authoritative-copy)を確認してください。 +2. **すべてリモートのファイルで上書き(remote-wins)** - リモートデータベースの内容を正(Source of Truth)として扱います。 - - **推奨されるケース:** まったく新しいデバイスをセットアップする場合(空のVaultなど)。 + - **推奨されるケース:** 新しい2台目以降のデバイスを、空の Vault でセットアップする場合。 - *警告: ローカルにあるすべてのファイルがリモートの内容で上書きされます。重要なデータがある場合は、事前にバックアップを取得してください。* -3. **Use the detailed flow (legacy)** +3. **詳細フローを使用(legacy)** - 従来の詳細なセットアップウィザードダイアログに戻ります。 - **推奨されるケース:** データベースの構成オプションをステップバイステップで細かく制御・確認したい場合。 ### ステップ 2: 競合および削除ルールの構成 ステップ 1 での選択内容に応じて、ローカルとリモートの不一致をどう処理するかを設定します。 -#### 「Compare time and take newer」を選択した場合: -- **Delete local files if they were deleted on remote** - - 他のデバイスで削除済みのファイルをローカルからも削除し、Vaultを同期・クリーンな状態に保ちます。 -- **Recreate remote files even if they were deleted on remote** +#### 「更新日時を比較して新しい方を採用」を選択した場合: +- **リモートで削除されている場合はローカルファイルを削除** + - 他のデバイスで削除済みのファイルをローカルからも削除し、ローカル Vault を整理して他のデバイスと揃った状態に保ちます。 +- **リモートで削除されていてもローカルファイルを保持** - 他のデバイスで削除されたファイルであっても、ローカルファイルを維持し、リモートデータベースに再度アップロードします。 -#### 「Overwrite all with remote files」を選択した場合: -- **Delete local files if not on remote** - - リモートに存在しないローカル専用ファイルを削除し、ローカルのVaultをリモートデータベースと完全に一致させます。 -- **Keep local files even if not on remote** +#### 「すべてリモートのファイルで上書き」を選択した場合: +- **リモートに存在しない場合はローカルファイルを削除** + - リモートに存在しないローカル専用ファイルを削除し、ローカルの Vault をリモートデータベースと完全に一致させます。 +- **リモートに存在しなくてもローカルファイルを保持** - リモートに存在しないローカルファイルをそのまま残します。ただし、同期後に重複ファイルが発生する可能性があるため、その場合は手動でクリーンアップを行ってください。 ### ステップ 3: 自動同期の実行 @@ -64,3 +64,28 @@ 1. リモートデータベースの高速ダウンロードを実行します (`fetchLocalDBFast`)。 2. ローカルファイルへの変更反映のため、フォアグラウンドでフルスキャン (`synchroniseAllFilesBetweenDBandStorage`) を自動的に実行します。 3. 処理が完了すると、プラグインは通常の動作状態へ復帰します。 + +### ファストセットアップが中断した場合 + +ファストセットアップは、ドキュメントを保存しながら最後に正常に保存されたリモートの位置を記録します。一時的な接続の中断が発生した場合、その位置から自動的に再試行されます。キャプチャされたリモートの状態が正常にすべて保存された後にのみ、完了が報告されます。 + +データの復号、リモートレスポンスの読み取り、またはローカルデータベースへの書き込み中のエラーによって処理が停止した場合、LiveSync は Vault スキャンを実行せず、再構築されたローカルデータベースの確定も行いません。保存された位置と取得フラグはそのまま保持されます。保存された有効な選択肢は、再起動時に確認ダイアログで再び利用できます。部分的に再構築されたデータベースが Vault に適用されたり、新しいローカル変更と混ざったりしないよう、ファイル監視とデータベースの反映も一時停止されたままになります。 + +**ログを表示** で最初のエラー内容を確認し、原因を修正してから Obsidian を再起動して、保持された状態から再試行してください。処理を続行する意思がある間は、取得フラグを削除したり、手動で Scram スイッチを再開したりしないでください。再起動後も同じエラーが解消しない場合は、LiveSync を一時停止したままデータを保護し、[レポートを収集](../troubleshooting.md#collect-a-report) してください。 + + +## 取得フラグに記憶される選択肢 + +ファストセットアップは、選択肢を `flag_fetch.md`(または取得フラグがそれだけの場合は `redflag3.md`)内の `json` コードブロックに保存します。このファイルは通常の Markdown であり、Obsidian 内で開いて編集できます。選択肢が更新されても、状態ブロックの外側にある説明文は保持されます。フラグファイル全体は一時的なものであり、処理が完了またはキャンセルされたときに削除されます。 + +中断後に再起動すると、現在のリモートと保存された選択肢が表示されます。それらの選択肢で続行するか、選び直すか、あるいは予約された取得をキャンセルできます。前回の取得が完了したもののフラグを削除できなかった場合も含め、保存された選択肢が確認なしに適用されることはありません。 + +新しい参加(Join)を開始するか、別の取得を予約すると、`flag_fetch.md` は空のフラグに置き換えられ、新しい選択肢が求められます。両方のファイル名が存在する場合は、空の場合も含めて `flag_fetch.md` が優先され、完了時に両方のエイリアスが削除されます。 + +生成されるブロックには `type: "livesync-fast-setup"`、`version: 1`、および2つの安定した英語の選択値(`stage1` と `stage2`)が含まれます。接続の認証情報は保存されません。既存の選択肢の認識可能な組み合わせのみが受け入れられます。確認を行うと、P2P 接続設定を変更した後であっても、現在選択されているリモートに選択肢が適用されます。 + +空のフラグがある場合は、通常の選択ダイアログが起動します。空ではないフラグに対応する有効な選択肢が含まれていない場合、プラグインは新しい選択肢を指定して続行するかどうかを確認します。これには不正な形式の JSON、未対応のバージョン、重複した状態ブロック、不完全な Markdown のコードフェンスなどが含まれます。続行を選択した場合、ファイル内容は変更されず、今回の試行にのみ新しい選択肢が使用されます。再起動すると再度確認が行われます。プラグインが Markdown を修復したり、代替ブロックを追加したりすることはありません。取得を完了またはキャンセルすると、説明文を含めフラグファイル全体が削除されます。 + +ストレージの読み取りまたは書き込みに失敗した場合は処理が停止し、空のフラグとしては扱われません。処理の最後にフラグの削除に失敗した場合、その問題が解決するまでファイル監視とデータベースの反映は一時停止されたままになります。フラグが残っている場合、再起動時に再度確認が求められます。 + +以前のバージョンでは、選択肢をデバイスのローカルストレージに個別に保存していました。それらの値は完了した取得の後にも残存している可能性があるため、再利用されなくなりました。中断された処理の実行中に更新した場合は、もう一度選択肢を確認してください。この変更自体によってダウンロード済みのデータや Fast Fetch(ファストフェッチ)のチェックポイントが削除されることはありません。 diff --git a/package.json b/package.json index 20c6efbc..af0a4801 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "check": "npm run tsc-check && npm run tsc-check:apps && npm run lint && npm run lint:community && npm run lint:community:tools && npm run svelte-check && npm run check:compatibility", "i18n:bake": "npm run i18n:yaml2json && npm run i18n:bakejson && npm run i18n:format", "i18n:bakejson": "tsx _tools/bakei18n.ts", - "i18n:format": "prettier --config .prettierrc.mjs --write --log-level error 'src/common/messagesJson/*.json' 'src/common/messages/*.ts'", + "i18n:format": "prettier --config .prettierrc.mjs --write --log-level error \"src/common/messagesJson/*.json\" \"src/common/messages/*.ts\"", "i18n:json2yaml": "tsx _tools/json2yaml.ts", "i18n:yaml2json": "tsx _tools/yaml2json.ts", "test:unit": "vitest run --config vitest.config.unit.ts", diff --git a/src/common/messages/LiveSyncProvisionalMessages.ts b/src/common/messages/LiveSyncProvisionalMessages.ts index 2b14f722..ae63c87c 100644 --- a/src/common/messages/LiveSyncProvisionalMessages.ts +++ b/src/common/messages/LiveSyncProvisionalMessages.ts @@ -3,10 +3,18 @@ * exercised. These keys remain application-owned and must not be added to * Commonlib merely to make them available to the LiveSync translator. * - * Move a message to the YAML catalogue when it is ready for translation, and - * remove it from this map in the same change. + * Japanese overrides may live in liveSyncProvisionalJapaneseMessages while a + * key remains provisional. Move a message to the YAML catalogue when its wording + * is ready for the full translation workflow, and remove it from both maps in + * the same change. */ export const liveSyncProvisionalEnglishMessages = { + "Enable SyncGuard": "Enable SyncGuard", + "Enable device-local SyncGuard protection during synchronisation.": + "Enable device-local SyncGuard protection during synchronisation.", + "SyncGuard minimum files": "SyncGuard minimum files", + "Minimum number of Vault files required for SyncGuard protection to apply.": + "Minimum number of Vault files required for SyncGuard protection to apply.", "Skip stopped Journal and resume": "Skip stopped Journal and resume", "Object Storage only. Confirm to skip the currently stopped Journal and resume replication. The confirmation names the exact Journal key and failure stage. Skipping may leave content or history missing; the next Journal failure still stops replication.": "Object Storage only. Confirm to skip the currently stopped Journal and resume replication. The confirmation names the exact Journal key and failure stage. Skipping may leave content or history missing; the next Journal failure still stops replication.", @@ -430,6 +438,451 @@ export const liveSyncProvisionalEnglishMessages = { "The fetch flag does not contain one supported selection. Choose new options and continue with the current remote?\n\nCurrent remote: ${REMOTE}\n\nThe flag contents will remain unchanged. The new choices apply only to this attempt; another restart will ask again. Completing or cancelling the fetch removes the flag.": "The fetch flag does not contain one supported selection. Choose new options and continue with the current remote?\n\nCurrent remote: ${REMOTE}\n\nThe flag contents will remain unchanged. The new choices apply only to this attempt; another restart will ask again. Completing or cancelling the fetch removes the flag.", "Choose new options and continue": "Choose new options and continue", + "Batch database updates in LiveSync mode": "Batch database updates in LiveSync mode", + "Wait for a bounded local quiet period before processing file updates in LiveSync mode, reducing intermediate database updates while delaying their reflection to remote devices.": + "Wait for a bounded local quiet period before processing file updates in LiveSync mode, reducing intermediate database updates while delaying their reflection to remote devices.", + Apply: "Apply", + Add: "Add", + Revert: "Revert", + "Vault history": "Vault history", + "From:": "From:", + "To:": "To:", + "Info:": "Info:", + "To stop the countdown, tap anywhere on the dialogue": "To stop the countdown, tap anywhere on the dialogue", } as const; export type LiveSyncProvisionalMessageKey = keyof typeof liveSyncProvisionalEnglishMessages; + +/** Japanese translations for provisional LiveSync messages which are already user-facing. */ +export const liveSyncProvisionalJapaneseMessages: Partial> = { + "Enable SyncGuard": "SyncGuard を有効化", + "Enable device-local SyncGuard protection during synchronisation.": + "同期中に、このデバイスで SyncGuard による保護を有効にします。", + "SyncGuard minimum files": "SyncGuard を適用する最小ファイル数", + "Minimum number of Vault files required for SyncGuard protection to apply.": + "SyncGuard による保護を適用するために必要な Vault 内の最小ファイル数です。", + "Synchronisation protection": "同期保護", + "Synchronising your Vault": "Vault を同期しています", + "Receiving changes from the server…": "サーバーから変更を受信しています…", + "Applying received changes to local notes…": "受信した変更をローカルノートに適用しています…", + "Synchronisation was interrupted. You can continue locally, but some notes may be out of date.": + "同期が中断されました。ローカルで作業を続けられますが、一部のノートは最新でない可能性があります。", + "At least ${COUNT} changed files received": "変更されたファイルを少なくとも ${COUNT} 件受信しました", + "Continue without waiting": "待たずに続行", + "Hidden File Sync is disabled on this device. Enable it in Sync Settings before using Automatic or initialising hidden files.": + "このデバイスでは非表示ファイル同期が無効です。Automatic を使用する場合や非表示ファイルを初期化する場合は、同期設定で有効にしてください。", + "Hidden File Sync initialisation was not started.": "非表示ファイル同期は初期化されませんでした。", + "Unknown platform": "不明なプラットフォーム", + "This removes only this device's record from the remote.": + "リモートから削除されるのは、このデバイスの記録のみです。", + "This remote is unlocked. A device that returns can register again.": + "このリモートのロックは解除されています。再接続したデバイスは再登録できます。", + "This remote is locked. Use the existing recovery process for devices that need to join again.": + "このリモートはロックされています。再参加が必要なデバイスには、既存の復旧手順を使用してください。", + "This remote is locked. If the device returns, use the existing recovery process to join it again.": + "このリモートはロックされています。デバイスが再接続した場合は、既存の復旧手順で再参加させてください。", + "This remote does not support conditional updates, so the device record could not be removed.": + "このリモートは条件付き更新に対応していないため、デバイスの記録を削除できませんでした。", + "This remote does not currently have a record of joined devices.": + "このリモートには参加済みデバイスの記録がありません。", + "This list shows device information recorded by the remote. It does not show whether a device is online now.": + "この一覧にはリモートに記録されたデバイス情報が表示されます。デバイスが現在オンラインかどうかは示しません。", + "This device has been locked out. Use the existing recovery process to join again.": + "このデバイスは接続を拒否されています。再参加するには、既存の復旧手順を使用してください。", + "This device": "このデバイス", + "This remote has been cleaned. Use the existing recovery process to join devices again as needed.": + "このリモートはクリーンアップされました。必要に応じて、既存の復旧手順でデバイスを再参加させてください。", + "The device record was forgotten.": "デバイスの記録を削除しました。", + "The device record was already absent.": "デバイスの記録はすでにありません。", + "The device list changed while you were trying to forget this device. Refresh the list before trying again.": + "このデバイスの記録を削除しようとしている間に一覧が更新されました。もう一度試す前に一覧を再読み込みしてください。", + "The device information could not be loaded. Close this dialogue and open Joined devices again if the remote configuration has changed.": + "デバイス情報を読み込めませんでした。リモート設定を変更した場合は、このダイアログを閉じて「参加済みデバイス」を開き直してください。", + "Review device records for the active CouchDB or Object Storage connection.": + "アクティブな CouchDB またはオブジェクトストレージ接続のデバイス記録を確認します。", + Refresh: "更新", + "Plug-in version": "プラグインのバージョン", + Platform: "プラットフォーム", + "Older Self-hosted LiveSync versions detected: ${versions}.": + "古いバージョンの Self-hosted LiveSync が検出されました: ${versions}。", + "Newer Self-hosted LiveSync versions detected: ${versions}.": + "新しいバージョンの Self-hosted LiveSync が検出されました: ${versions}。", + "Reviewing and aligning Self-hosted LiveSync versions across devices is recommended.": + "各デバイスの Self-hosted LiveSync のバージョンを確認し、揃えることをおすすめします。", + Open: "開く", + "Not recorded": "未記録", + "Not accepted": "未承認", + "No joined devices are recorded on this remote.": "このリモートには参加済みデバイスが記録されていません。", + "Locked out": "接続拒否", + "Loading joined devices…": "参加済みデバイスを読み込んでいます…", + "Last recorded": "最終記録日時", + "Joined devices could not be updated. Refresh the list and try again. If the remote configuration has changed, close this dialogue and open Joined devices again.": + "参加済みデバイスを更新できませんでした。一覧を再読み込みしてもう一度お試しください。リモート設定を変更した場合は、このダイアログを閉じて「参加済みデバイス」を開き直してください。", + "Joined devices are available after database startup with an active CouchDB or Object Storage connection.": + "参加済みデバイスは、データベースの起動後に CouchDB またはオブジェクトストレージへの接続が有効になると表示されます。", + "Joined devices": "参加済みデバイス", + "Review devices": "デバイスを確認", + "Synchronisation between different plug-in versions is generally safe unless the connection is explicitly blocked. However, it may be less efficient or use more storage, and P2P synchronisation may be unavailable.": + "プラグインのバージョンが異なるデバイス間でも、接続が明示的にブロックされていなければ、通常は安全に同期できます。ただし、効率が低下したり、使用容量が増えたりする場合があります。また、P2P 同期を利用できないことがあります。", + "Forgetting…": "記録を削除しています…", + "Forgetting the record does not delete Vault files or revoke credentials.": + "記録を削除しても、Vault 内のファイルは削除されず、認証情報も無効になりません。", + "Forget this device record?": "このデバイスの記録を削除しますか?", + "Forget device": "デバイスの記録を削除", + Close: "閉じる", + Cancel: "キャンセル", + "App version": "アプリのバージョン", + Accepted: "承認済み", + "Preparing follow-up report…": "追加調査用レポートを準備しています…", + "Cancelling local search. Checked ${COUNT} entries.": + "ローカル検索をキャンセルしています。${COUNT}件を確認しました。", + "Search current Vault paths and current local Metadata only. Older history and remote-only files are not searched.": + "現在の Vault パスとローカルのメタデータのみを検索します。古い履歴やリモートにのみ存在するファイルは検索しません。", + "The lookup does not read file contents or contact a remote database. Follow-up reports include current conflicts and merge bases.": + "検索でファイルの内容を読み取ったり、リモートデータベースに接続したりすることはありません。追加調査用レポートには、現在の競合とマージベースが含まれます。", + "Local file diagnostic report": "ローカルファイル診断レポート", + "Checked ${COUNT} local entries.": "ローカルの項目を ${COUNT} 件確認しました。", + "Enter a valid report path pseudonym.": "有効なレポート用パス仮名を入力してください。", + "Search cancelled. Matches found so far are shown.": + "検索をキャンセルしました。ここまでに見つかった一致項目を表示します。", + "No matches were found in current Vault paths or current local Metadata. Older history and remote-only files are not searched.": + "現在の Vault パスとローカルのメタデータに一致する項目はありません。古い履歴やリモートにのみ存在するファイルは検索していません。", + "Found ${COUNT} local matches.": "ローカルで ${COUNT} 件見つかりました。", + "The local search could not finish.": "ローカル検索を完了できませんでした。", + "The file could not be opened.": "ファイルを開けませんでした。", + "The follow-up report could not be prepared.": "追加調査用レポートを作成できませんでした。", + "Report path pseudonym": "レポート用パス仮名", + Source: "ソース", + Metadata: "メタデータ", + Vault: "Vault", + "Metadata document ID": "メタデータドキュメント ID", + "No current Metadata document": "現在のメタデータドキュメントなし", + "Current Vault file": "現在の Vault ファイル", + Present: "あり", + Missing: "なし", + "Open file": "ファイルを開く", + "Prepare follow-up report": "追加調査用レポートを作成", + "This report uses pseudonyms. Review its coverage before sharing.": + "このレポートでは仮名を使用します。共有する前に、その対象範囲を確認してください。", + "Back to matches": "検索結果に戻る", + "Reading revisions": "リビジョンを読み込んでいます", + "Calculating database usage": "データベース使用量を計算しています", + "Discovering revisions": "リビジョンを確認しています", + "Find a file from a report pseudonym": "レポート用の仮名からファイルを検索", + "Find matching paths in this Vault and local Metadata, then prepare a follow-up report using the same pseudonyms.": + "この Vault とローカルのメタデータから一致するパスを検索し、同じ仮名を使って追加調査用レポートを作成します。", + "Find file": "ファイルを検索", + "⚠️ Initialise or overwrite the remote": "⚠️ リモートを初期化または上書き", + "🔗 Join this device": "🔗 このデバイスを参加させる", + "⚙️ Apply settings only (advanced)": "⚙️ 設定のみ適用(高度な設定)", + "Configure TURN when a direct connection cannot be established or when you select TURN relay only.": + "直接接続を確立できない場合、または TURN リレーのみを選択する場合は、TURN を設定してください。", + "TURN configuration": "TURN 設定", + Manual: "手動", + "Managed (Cloudflare)": "マネージド(Cloudflare)", + "TURN Key ID": "TURN キー ID", + "TURN Key API Token": "TURN キー API トークン", + "Unsupported TURN configuration": "未対応の TURN 設定", + "The API token is saved with this profile and included in Setup URI and QR code sharing. Temporary TURN credentials are kept in memory only.": + "API トークンはこのプロファイルに保存され、セットアップ URI や QR コードでの共有にも含まれます。一時的な TURN 認証情報はメモリー上にのみ保持されます。", + "TURN relay only requires a TURN server or a configured credential source under Advanced Settings.": + "TURN リレーのみを使うには、TURN サーバーまたは高度な設定で認証情報の取得元を設定してください。", + "Enter a TURN Key ID.": "TURN キー ID を入力してください。", + "TURN Key ID contains unsupported characters.": "TURN キー ID に未対応の文字が含まれています。", + "Enter a TURN Key API Token.": "TURN キー API トークンを入力してください。", + "TURN Key API Token must use Bearer token syntax.": + "TURN キー API トークンは Bearer トークン形式で入力してください。", + "The selected TURN configuration is not supported.": "選択した TURN 設定には対応していません。", + "Setup Complete: Preparing to Fetch from Another Device": "セットアップ完了: 別のデバイスから取得する準備中", + "The P2P connection has been configured successfully. The initial synchronisation data must now be fetched from an online source device.": + "P2P 接続を設定しました。初回の同期を行うため、オンラインのソースデバイスからデータを取得してください。", + "After restarting, select an online source device for the initial Fetch. The local LiveSync database on this device will be rebuilt from that source. Unsynchronised files in this Vault may conflict with the fetched data.": + "再起動後、初回取得のソースとなるオンラインデバイスを選択してください。このデバイスのローカル LiveSync データベースは、そのソースから再構築されます。この Vault で未同期のファイルは、取得したデータと競合する可能性があります。", + "Restart this device, then choose the source device when P2P Rebuild opens.": + "このデバイスを再起動してください。P2P 再構築が開いたら、ソースデバイスを選択します。", + "Restart and Select Source Device": "再起動してソースデバイスを選択", + "P2P Status pane": "P2P ステータスペイン", + "No central data-storage server is required, but a signalling relay is required for peer discovery. Both devices must be online at the same time. Vault data travels through the encrypted P2P connection, not through the signalling relay. Some features may be limited.": + "中央データストレージサーバーは不要ですが、ピアの検出にはシグナリングリレーが必要です。両方のデバイスが同時にオンラインである必要があります。Vault のデータは暗号化された P2P 接続を通り、シグナリングリレーを経由しません。一部の機能は制限される場合があります。", + "P2P requires no central data-storage server, but it still uses a signalling relay for peer discovery.": + "P2P には中央データストレージサーバーは不要ですが、ピアの検出にはシグナリングリレーを使用します。", + "Signalling relay URLs": "シグナリングリレー URL", + "Peer discovery uses Nostr-compatible signalling relays.": + "ピアの検出には Nostr 互換のシグナリングリレーを使用します。", + "Use the project's public signalling relay": "プロジェクトの公開シグナリングリレーを使用", + "The project's public signalling relay is a best-effort convenience operated by the project author. It does not store Vault contents, but signalling metadata may be visible to the relay. Availability and log retention are not guaranteed. You can replace it with your own Nostr-compatible relay.": + "プロジェクトの公開シグナリングリレーは、プロジェクト作者が便宜上、可能な範囲で運用しています。Vault の内容は保存されませんが、シグナリングのメタデータはリレーから見える場合があります。稼働状況やログの保存期間は保証されません。独自の Nostr 互換リレーに変更できます。", + "Learn more about P2P connections": "P2P 接続について詳しく見る", + "Learn more about signalling and TURN": "シグナリングと TURN について詳しく見る", + "WebRTC encrypts data between your devices, including when it passes through TURN. The TURN provider cannot read the transferred data. It can see network addresses and traffic volume.": + "TURN を経由する場合も含め、WebRTC はデバイス間のデータを暗号化します。TURN プロバイダーは転送データを読み取れませんが、ネットワークアドレスと通信量を確認できます。", + "Connection compatibility": "接続互換性", + "P2P message size": "P2P メッセージサイズ", + Standard: "標準", + Reduced: "縮小", + Conservative: "保守的", + "Maximum compatibility": "互換性を最大化", + "Smaller messages can improve compatibility on paths which fragment or drop larger WebRTC messages. This setting limits outgoing P2P messages, so use a compatible profile on each sending device when required.": + "メッセージを小さくすると、大きな WebRTC メッセージが分割または破棄される経路で互換性が向上する場合があります。この設定は送信する P2P メッセージのサイズを制限します。必要に応じて、送信側の各デバイスで互換性のあるプロファイルを選択してください。", + "Connection path": "接続経路", + "TURN relay only": "TURN リレーのみ", + "TURN relay only is available when at least one valid TURN server URL is configured under Advanced Settings.": + "高度な設定で有効な TURN サーバー URL を1つ以上設定すると、TURN リレーのみを選択できます。", + "TURN relay only requires at least one valid TURN server URL. Connection path has been restored to Automatic.": + "TURN リレーのみを使うには、有効な TURN サーバー URL が1つ以上必要です。接続経路を自動に戻しました。", + "Announce changes": "変更を通知", + "Announce changes automatically after connecting": "接続後に変更を自動通知", + "When enabled, this device notifies connected peers after a local change. The notification contains no Vault data; a peer which follows this device then fetches the change through the encrypted P2P connection.": + "有効にすると、ローカルで変更があったときに接続中のピアへ通知します。通知に Vault のデータは含まれません。このデバイスの変更を受け取る設定のピアは、暗号化された P2P 接続を通じて変更を取得します。", + "Stop announcing changes": "変更の通知を停止", + "Start announcing changes": "変更の通知を開始", + "Follow changes": "変更を受け取る", + "Stop following changes from this device": "このデバイスからの変更受信を停止", + "Follow changes from this device": "このデバイスからの変更を受信", + "Synchronise when this device connects": "このデバイスの接続時に同期", + "Follow whenever this device connects": "このデバイスが接続するたびに変更を受信", + "Include in the P2P synchronisation command": "P2P 同期コマンドに含める", + "More actions for ${DEVICE}": "${DEVICE} のその他の操作", + "Use this device's settings": "このデバイスの設定を使用", + Retry: "再試行", + "No Synchronisation Settings Found": "同期設定が見つかりません", + "The selected remote has no saved synchronisation settings. This is normal for a new remote. Use this device's settings, or cancel if you expected existing settings.": + "選択したリモートには保存済みの同期設定がありません。新しいリモートでは通常の状態です。このデバイスの設定を使用してください。既存の設定があるはずの場合はキャンセルしてください。", + "Could Not Read Synchronisation Settings": "同期設定を読み取れませんでした", + "Could not read the remote's synchronisation settings. Check the connection and credentials, then retry.": + "リモートの同期設定を読み取れませんでした。接続と認証情報を確認してから、もう一度お試しください。", + "Could not read the remote's synchronisation settings. Retry, or continue the overwrite with this device's settings. A working connection is still required.": + "リモートの同期設定を読み取れませんでした。再試行するか、このデバイスの設定で上書きを続行してください。続行する場合も、接続が機能している必要があります。", + "Skips checking and applying synchronisation settings from the remote.": + "リモートの同期設定の確認と適用をスキップします。", + "Change CouchDB server setting": "CouchDB サーバー設定を変更", + "Change CouchDB server setting '${SETTING}' to '${VALUE}'?": + "CouchDB サーバー設定「${SETTING}」を「${VALUE}」に変更しますか?", + "TURN relay only requires TURN configuration. Connection path has been restored to Automatic.": + "TURN リレーのみを使うには TURN の設定が必要です。接続経路を自動に戻しました。", + "This file has unresolved conflicts.": "このファイルには未解決の競合があります。", + "This file has ${COUNT} unresolved versions. They will be reviewed one pair at a time.": + "このファイルには未解決の版が ${COUNT} 件あります。1組ずつ確認します。", + "Sync now": "今すぐ同期", + "Apply pending changes now": "保留中の変更を今すぐ適用", + "Copy database information for the active file": "アクティブなファイルのデータベース情報をコピー", + "Copy database information for a file": "ファイルのデータベース情報をコピー", + "Copy revision, conflict, and local chunk availability information, including document and chunk identifiers but not file contents.": + "ファイルの内容を含めずに、ドキュメント ID やチャンク ID などのリビジョン、競合、ローカルのチャンク有無に関する情報をコピーします。", + "Choose file": "ファイルを選択", + "Choose a file to inspect": "確認するファイルを選択", + "Database information for ${FILE}": "${FILE} のデータベース情報", + "All revisions and chunk availability below are a snapshot of this device's local database; the remote is not queried. Review the Vault-relative path, document identifier, content-derived chunk identifiers, and metadata before sharing this report. File contents are omitted.": + "以下のリビジョンとチャンク有無は、このデバイスのローカルデータベースのスナップショットです。リモートには問い合わせません。このレポートを共有する前に、Vault からの相対パス、ドキュメント ID、コンテンツ由来のチャンク ID、メタデータを確認してください。ファイルの内容は含まれません。", + "📁 Vault: ${SIZE} B · ${TIME}": "📁 Vault: ${SIZE} B · ${TIME}", + "📁 Vault: missing": "📁 Vault: ファイルなし", + "🗄️ Local DB: missing": "🗄️ ローカル DB: データなし", + "Vault and database revision": "Vault とデータベースのリビジョン", + "Vault file": "Vault ファイル", + "Database revision": "データベースのリビジョン", + "Vault file is newer": "Vault ファイルの方が新しい", + "Database revision is newer": "データベースのリビジョンの方が新しい", + "Within the two-second comparison window": "2秒以内の誤差範囲内", + "Timestamp comparison unavailable": "タイムスタンプを比較できません", + "${ROLE}: ${REVISION}": "${ROLE}: ${REVISION}", + "Winner revision": "代表リビジョン", + "Conflict revision": "競合リビジョン", + "Unknown revision": "不明なリビジョン", + "🗑️ Logical deletion": "🗑️ 論理削除", + "Readable on this device; recorded size ${RECORDED}, decoded size ${ACTUAL}": + "このデバイスで読み取り可能。記録サイズ ${RECORDED}、デコード後サイズ ${ACTUAL}", + "🧩 Missing chunks: ${COUNT}": "🧩 チャンク不足: ${COUNT} 件", + "📦 DB: recorded ${RECORDED} B · decoded ${DECODED} B · Δsize ${DIFFERENCE} B": + "📦 DB: 記録 ${RECORDED} B · デコード後 ${DECODED} B · サイズ差 ${DIFFERENCE} B", + "📦 DB: recorded ${RECORDED} B · decoded unavailable": "📦 DB: 記録 ${RECORDED} B · デコード後サイズは不明", + "📁 Vault: ${VAULT} B · Δsize vs DB ${DIFFERENCE} B": "📁 Vault: ${VAULT} B · DB とのサイズ差 ${DIFFERENCE} B", + "🕒 DB ${DATABASE_TIME} · Vault ${VAULT_TIME} · Δtime ${DIFFERENCE} ms (${RELATION})": + "🕒 DB ${DATABASE_TIME} · Vault ${VAULT_TIME} · 時刻差 ${DIFFERENCE} ms(${RELATION})", + "✅ Matches Vault": "✅ Vault と一致", + "⚠️ Differs from Vault": "⚠️ Vault と不一致", + "✅ Vault matches winner": "✅ Vault は代表リビジョンと一致", + "⚠️ Conflicts: ${COUNT}": "⚠️ 競合: ${COUNT} 件", + "Compare with Vault": "Vault と比較", + "Apply this revision to Vault": "このリビジョンを Vault に適用", + "Apply database revision ${REVISION} to ${FILE}? The current Vault file will be overwritten.": + "データベースのリビジョン ${REVISION} を ${FILE} に適用しますか?現在の Vault ファイルは上書きされます。", + "Apply database revision to Vault": "データベースのリビジョンを Vault に適用", + "Mark this revision as the Vault version": "このリビジョンを Vault の版として指定", + "Store Vault file as a child of this revision": "Vault ファイルをこのリビジョンの子として保存", + "Apply logical deletion to Vault": "論理削除を Vault に適用", + "Apply logical deletion ${REVISION} to ${FILE}? The current Vault file will be removed.": + "論理削除 ${REVISION} を ${FILE} に適用しますか?現在の Vault ファイルは削除されます。", + "Retry reading revision": "リビジョンの読み込みを再試行", + "Discard this branch": "このブランチを破棄", + "Discard branch": "ブランチを破棄", + "Discard database branch ${REVISION} of ${FILE}? This creates a logical deletion for that exact live branch. The current Vault file will not be changed.": + "${FILE} のデータベースブランチ ${REVISION} を破棄しますか?この操作は該当する現行ブランチに論理削除を記録します。現在の Vault ファイルは変更されません。", + "Discard unreadable revision": "読み取れないリビジョンを破棄", + "Discard database revision ${REVISION} of ${FILE}? This creates a logical deletion for that exact live revision. Missing content cannot be recovered by this action.": + "${FILE} のデータベースリビジョン ${REVISION} を破棄しますか?この操作は該当する現行リビジョンに論理削除を記録します。不足している内容はこの操作では復元できません。", + "Revision metadata is unavailable on this device": "このデバイスではリビジョンのメタデータを利用できません", + "Shared ancestor ${REVISION} is not readable on this device. Automatic three-way merging may be unavailable, but the live revisions remain available for explicit review.": + "共有祖先 ${REVISION} はこのデバイスで読み取れません。自動3方向マージを利用できない場合がありますが、現行リビジョンは引き続き個別に確認できます。", + "No shared ancestor is available for this conflict. The live revisions remain available for explicit review.": + "この競合には共有祖先がありません。現行リビジョンは引き続き個別に確認できます。", + "More actions for revision ${REVISION}": "リビジョン ${REVISION} のその他の操作", + "More actions for ${FILE}": "${FILE} のその他の操作", + "Show revision history": "リビジョン履歴を表示", + "Store Vault file as a new local database document": + "Vault ファイルを新しいローカルデータベースドキュメントとして保存", + "Copy database information": "データベース情報をコピー", + "Recreate chunks for current Vault files": "現在の Vault ファイルのチャンクを再作成", + "Recreate chunks from the files currently present in this Vault. This cannot reconstruct unavailable historical or conflict content.": + "この Vault に現在あるファイルからチャンクを再作成します。利用できない過去の内容や競合内容は復元できません。", + "Recreate current chunks": "現在のチャンクを再作成", + "Resolve every conflict by modification time? This logically deletes every version except the newest one and cannot recover content which is already unavailable.": + "すべての競合を更新日時で解決しますか?最も新しい版以外はすべて論理削除され、すでに利用できない内容は復元できません。", + "Resolve all conflicts by the newest version": "すべての競合を最も新しい版で解決", + "Inspect conflicts and file/database differences": "競合とファイル/データベース間の差異を調査", + "Scan Vault files and local-database Metadata for conflicts, missing chunks, identity mismatches, and differences. Each result provides actions for one exact entry or revision.": + "Vault ファイルとローカルデータベースのメタデータをスキャンし、競合、チャンク不足、識別情報の不一致、差異を確認します。各結果から、該当する項目またはリビジョンに対する操作を選択できます。", + "Begin inspection": "調査を開始", + "Metadata entry requires review and was left unchanged": "確認が必要なメタデータ項目は変更せずに残しました", + "The stored document ID does not match the ID derived from its recorded path.": + "保存されたドキュメント ID が、記録されたパスから導出される ID と一致しません。", + "The stored document ID and recorded path are handled by different synchronisation features.": + "保存されたドキュメント ID と記録されたパスは、それぞれ異なる同期機能によって処理されます。", + "Stored document ID: ${ID}": "保存されたドキュメント ID: ${ID}", + "Expected document ID: ${ID}": "期待されるドキュメント ID: ${ID}", + "Source revision: ${REVISION}": "ソースリビジョン: ${REVISION}", + "One-step repair is unavailable because this entry is ambiguous, no longer current, or unsafe to change.": + "この項目は情報があいまいであるか、最新ではないか、または変更が安全ではないため、ワンステップ修復は利用できません。", + "An exact target is already present; repair can remove the obsolete ID.": + "同一の対象がすでに存在するため、修復時に古い ID を削除できます。", + "Repair is available for this entry.": "この項目は修復できます。", + "Repair this Metadata document ID": "このメタデータドキュメント ID を修復", + "Repair Metadata ID": "メタデータ ID を修復", + "Keep unchanged": "変更せずに保持", + "This moves one local Metadata entry to the ID derived from its recorded path.\n\n**File:** `${FILE}` \n**Source:** `${SOURCE}@${REVISION}` \n**Target:** `${TARGET}`\n\nThe target is verified before the source is removed. Its CouchDB revision ancestry cannot be preserved.\n\n> [!warning] Before repairing\n> - Back up this device.\n> - If file-name case or path obfuscation was intentionally changed for the whole database, use Rebuild instead.\n> - If other devices share this database, pause them, allow this device to upload the repair, then resume them one at a time.": + "ローカルのメタデータ項目を、記録されたパスから導出される ID に移動します。\n\n**ファイル:** `${FILE}` \n**移動元:** `${SOURCE}@${REVISION}` \n**移動先:** `${TARGET}`\n\n移動元を削除する前に、移動先を検証します。CouchDB のリビジョン祖先は保持できません。\n\n> [!warning] 修復する前に\n> - このデバイスをバックアップしてください。\n> - データベース全体のファイル名の大文字・小文字の扱いやパス難読化を意図的に変更した場合は、代わりに再構築してください。\n> - 他のデバイスがこのデータベースを共有している場合は、それらを一時停止し、このデバイスから修復内容がアップロードされた後、1台ずつ再開してください。", + "Metadata document ID repair and the ordinary Vault scan completed. Run this inspection again after synchronisation.": + "メタデータドキュメント ID の修復と通常の Vault スキャンが完了しました。同期後にこの調査を再実行してください。", + "Metadata document ID repair completed, but the ordinary Vault scan did not run. Keep synchronisation paused, resolve the scan condition, then run 'Scan storage and database again'.": + "メタデータドキュメント ID の修復は完了しましたが、通常の Vault スキャンは実行されませんでした。同期を一時停止したままスキャンを妨げている状態を解消し、「ストレージとデータベースを再スキャン」を実行してください。", + "The inspected state changed. No repair was performed; run inspection again.": + "調査対象の状態が変化しました。修復は行われていません。調査を再実行してください。", + "Repair stopped after creating the target. The source was retained. Run inspection again before retrying.": + "移動先を作成した後、修復を停止しました。移動元は保持されています。再試行する前に調査を実行してください。", + "Repair failed before the source was removed. Run inspection again before retrying.": + "移動元を削除する前に修復が失敗しました。再試行する前に調査を実行してください。", + "(RegExp) Limit normal files to matching paths. Leave empty to allow all normal file paths. Hidden File Sync uses its own target patterns.": + "(正規表現)通常ファイルを一致するパスに限定します。空欄にすると、すべての通常ファイルパスが対象になります。非表示ファイル同期には専用の対象パターンを使用します。", + "(RegExp) Skip changes to matching normal and hidden files, locally and remotely.": + "(正規表現)一致する通常ファイルと非表示ファイルの変更を、ローカルとリモートの両方でスキップします。", + "Repair Metadata document ID": "メタデータドキュメント ID を修復", + "Connection settings": "接続設定", + "Saved connections": "保存済みの接続", + "ID generation": "ID の生成", + "Keep current configuration": "現在の設定を維持", + "Set an ID key": "ID キーを設定", + "Current configuration: a saved ID key is used.": "現在の設定: 保存済みの ID キーを使用します。", + "Current configuration: the saved ID key is retained while E2EE is off.": + "現在の設定: E2EE が無効な間も保存済みの ID キーを保持します。", + "Current configuration: no ID key is saved. With E2EE enabled, keeping it uses legacy IDs tied to the E2EE passphrase.": + "現在の設定: ID キーは保存されていません。E2EE が有効な場合、現在の設定を維持すると E2EE パスフレーズに紐づく旧形式の ID を使用します。", + "Changing the E2EE passphrase changes IDs generated by the legacy configuration.": + "旧形式の設定では、E2EE パスフレーズを変更すると生成される ID も変わります。", + "This uses a saved key for new Chunk IDs and obfuscated Metadata document IDs, so changing the E2EE passphrase does not derive a new key automatically.": + "新しいチャンク ID と難読化されたメタデータドキュメント ID に保存済みのキーを使います。そのため、E2EE パスフレーズを変更しても新しいキーは自動導出されません。", + Configured: "設定済み", + "The saved ID key is configured. Its source cannot be shown again.": + "保存済みの ID キーが設定されています。キーの導出元を再表示することはできません。", + "Leave this input empty to keep the saved ID key.": + "保存済みの ID キーを維持するには、この欄を空のままにしてください。", + "Generate a random ID key": "ランダムな ID キーを生成", + "How to set the ID key": "ID キーの設定方法", + "Derive from current E2EE passphrase": "現在の E2EE パスフレーズから導出", + "Enter an ID source": "ID の導出元を入力", + "Import an ID recovery code": "ID 復旧コードをインポート", + "ID source": "ID の導出元", + "ID recovery code": "ID 復旧コード", + "Enter an ID recovery code": "ID 復旧コードを入力", + "Choose a long, unpredictable source. It is used once and cannot be shown again after saving. A recovery code can be displayed on this device later. This input also accepts a tagged recovery code.": + "長く推測されにくい導出元を指定してください。導出元は一度だけ使用され、保存後は再表示できません。復旧コードは後からこのデバイスで表示できます。この入力欄にはタグ付き復旧コードも指定できます。", + "Paste a tagged recovery code from an existing device to restore the same ID key.": + "既存のデバイスからタグ付き復旧コードを貼り付けると、同じ ID キーを復元できます。", + "For recovery after losing every device, save the recovery code after setup or choose an ID source you can reproduce.": + "すべてのデバイスを失った場合に備え、セットアップ後に復旧コードを保存するか、再現可能な ID の導出元を選んでください。", + "Show current recovery code": "現在の復旧コードを表示", + "Hide current recovery code": "現在の復旧コードを隠す", + "Current ID recovery code": "現在の ID 復旧コード", + "Copy recovery code": "復旧コードをコピー", + "Recovery code copied.": "復旧コードをコピーしました。", + "The displayed recovery code belongs to the current key. Reopen this dialogue after saving to copy the replacement key.": + "表示中の復旧コードは現在のキーに対応しています。キーを置き換えた場合は、保存後にこのダイアログを開き直して新しい復旧コードをコピーしてください。", + "The recovery code could not be copied. Select and copy the visible code instead.": + "復旧コードをコピーできませんでした。表示されているコードを選択してコピーしてください。", + "The ID key is derived from the current E2EE passphrase and saved separately. Changing that passphrase later does not change the saved ID key. To reduce the risk of guessing that passphrase from known IDs, use a separate, unpredictable ID source instead.": + "ID キーは現在の E2EE パスフレーズから導出され、別に保存されます。後からパスフレーズを変更しても、保存済みの ID キーは変わりません。既知の ID からパスフレーズを推測されるリスクを下げるには、別の推測されにくい ID の導出元を使用してください。", + "An ID source is required to enable this option.": "このオプションを有効にするには、ID の導出元が必要です。", + "The ID source or recovery code is invalid. Check it and try again.": + "ID の導出元または復旧コードが無効です。確認してもう一度お試しください。", + "Read normal-file Metadata and current conflicts locally and in CouchDB, then compare content for suspect groups. Choose original names or pseudonyms before starting.": + "ローカルと CouchDB の通常ファイルのメタデータおよび現在の競合を読み取り、問題が疑われる項目の内容を比較します。開始前に、元の名前を使うか仮名を使うか選択してください。", + Inspect: "調査", + "Inspect database integrity": "データベースの整合性を調査", + "Inspection completed. Review the findings and coverage before sharing.": + "調査が完了しました。共有する前に結果と調査範囲を確認してください。", + "Inspection partially completed. Some information could not be checked; review the reported reasons.": + "調査は一部のみ完了しました。確認できなかった情報があります。表示された理由を確認してください。", + "Inspection failed. The report records the available evidence and reasons.": + "調査に失敗しました。レポートには、取得できた証拠と失敗理由が記録されています。", + "Inspection cancelled. The report contains only the evidence collected so far.": + "調査をキャンセルしました。レポートには、ここまでに収集した証拠のみが含まれます。", + "Report copied.": "レポートをコピーしました。", + "Copy failed. Select the report text and copy it manually.": + "コピーに失敗しました。レポートのテキストを選択して手動でコピーしてください。", + "Download requested. You can also copy the report if downloads are unavailable on this device.": + "ダウンロードを要求しました。このデバイスでダウンロードできない場合は、レポートをコピーすることもできます。", + "Pseudonyms include a public salt, so guessed paths can be checked. Original names include private filenames. Reports omit file contents and credentials.": + "仮名には公開ソルトが含まれるため、推測したパスと照合できます。元の名前を選ぶと、非公開のファイル名が含まれます。どちらのレポートにもファイルの内容や認証情報は含まれません。", + "Read available local revisions and report their Chunk references. Settings are left unchanged.": + "利用可能なローカルリビジョンを読み取り、参照するチャンクをレポートします。設定は変更されません。", + "Inspect normal-file Metadata, current conflicts, and suspect content against the Vault. Remote inspection supports CouchDB. Older history is excluded; findings do not authorise deletion.": + "通常ファイルのメタデータ、現在の競合、問題が疑われる内容を Vault と照合します。リモートの調査は CouchDB に対応しています。古い履歴は対象外です。調査結果を根拠に削除が実行されることはありません。", + "Include remote database": "リモートデータベースを含める", + "Names in this report": "レポート内の名前", + "Pseudonyms (recommended)": "仮名(推奨)", + "Original names": "元の名前", + "Cancelling inspection…": "調査をキャンセルしています…", + "Items inspected": "調査した項目数", + "Cancel inspection": "調査をキャンセル", + "This report uses temporary pseudonyms. Counts and relationships remain visible.": + "このレポートでは一時的な仮名を使用します。件数や項目間の関係は表示されます。", + "This report contains original paths and identifiers. Review them before sharing.": + "このレポートには元のパスと識別子が含まれます。共有する前に内容を確認してください。", + "Partial Usage results are available as JSON so their coverage and reasons stay with the rows.": + "一部のみ取得できた使用状況の結果は JSON で出力できます。各行に調査範囲と理由が保持されます。", + "Report format": "レポート形式", + "Diagnostic report": "診断レポート", + "Copy report": "レポートをコピー", + "Save report": "レポートを保存", + "The inspection could not finish. Close this dialogue and try again after database startup.": + "調査を完了できませんでした。このダイアログを閉じ、データベースの起動後にもう一度お試しください。", + "Resume scheduled fetch?": "予約済みの取得を再開しますか?", + "Apply these saved choices to the current remote?\n\nCurrent remote: ${REMOTE}\n\n- ${STAGE1}\n- ${STAGE2}\n\nThe fetch flag may remain after an interruption or an incomplete cleanup. Continue only if this fetch is still intended.": + "保存済みの選択肢を現在のリモートに適用しますか?\n\n現在のリモート: ${REMOTE}\n\n- ${STAGE1}\n- ${STAGE2}\n\n中断や不完全なクリーンアップの後に取得フラグが残っている可能性があります。この取得を実行する意図がある場合にのみ続行してください。", + "Continue with these choices": "この選択肢で続行", + "Choose again": "選び直す", + "Saved fetch choices could not be read": "保存済みの取得設定を読み取れませんでした", + "The fetch flag does not contain one supported selection. Choose new options and continue with the current remote?\n\nCurrent remote: ${REMOTE}\n\nThe flag contents will remain unchanged. The new choices apply only to this attempt; another restart will ask again. Completing or cancelling the fetch removes the flag.": + "取得フラグに有効な選択肢が含まれていません。新しい選択肢を指定して、現在のリモートで続行しますか?\n\n現在のリモート: ${REMOTE}\n\nフラグの内容は変更されません。新しい選択肢は今回の試行にのみ適用され、再起動すると再度確認されます。取得を完了またはキャンセルすると、フラグは削除されます。", + "Choose new options and continue": "新しい選択肢を指定して続行", + "Batch database updates in LiveSync mode": "LiveSync モードでデータベース更新をバッチ処理", + "Wait for a bounded local quiet period before processing file updates in LiveSync mode, reducing intermediate database updates while delaying their reflection to remote devices.": + "LiveSync モードでは、ローカルでの更新が一定時間落ち着くまで待ってからファイル更新を処理します。これにより中間のデータベース更新を減らし、リモートデバイスへの反映を遅らせます。", + Apply: "適用", + Add: "追加", + Revert: "元に戻す", + "Vault history": "Vault 履歴", + "From:": "開始:", + "To:": "終了:", + "Info:": "情報:", + "To stop the countdown, tap anywhere on the dialogue": + "カウントダウンを停止するには、ダイアログの任意の場所をタップしてください", +}; diff --git a/src/common/messages/combinedMessages.prod.ts b/src/common/messages/combinedMessages.prod.ts index 79d537ff..dcf9475f 100644 --- a/src/common/messages/combinedMessages.prod.ts +++ b/src/common/messages/combinedMessages.prod.ts @@ -3,6 +3,7 @@ export const allMessages: Readonly Storage": { def: "Database -> Storage", es: "Base de datos -> Almacenamiento", + ja: "データベース → ストレージ", ko: "데이터베이스 -> 스토리지", ru: "База данных -> Файлы", zh: "数据库 → 存储", @@ -1439,6 +1536,7 @@ export const allMessages: Readonly