> ## Documentation Index
> Fetch the complete documentation index at: https://ayakaleaf-pro.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Dropbox 同期

> ユーザーが自分のプロジェクトを Dropbox 内のフォルダーと同期できるようにします。

> [!NOTE]
>
> この機能は [ayaka-notes/ayakaleaf-pro](https://github.com/ayaka-notes/ayakaleaf-pro) によって開発されたものです。v6.3.1 でアーリープレビューとして導入され、v6.4.0 で正式リリースされる予定です。そのため、設定や動作が今後変更される可能性があります。問題があればぜひフィードバックをお寄せください。

Dropbox 同期は、Overleaf Cloud と同様に、ユーザーのプロジェクトをその Dropbox と同期した状態に保ちます。ユーザーが Dropbox アカウントを連携すると、各プロジェクトが `Apps/<your Dropbox app>/` 内のフォルダーとして表示され、Overleaf での変更は Dropbox に送信され、Dropbox で行った変更は Overleaf に反映されます。

### Dropbox 同期のセットアップ

> [!WARNING]
>
> まず [git-bridge](https://ayakaleaf-pro.mintlify.site/ja/on-premises/configuration/overleaf-toolkit/integrations/git-integration.md) を有効にする必要があります。有効にしないと、アカウント設定にプロジェクト同期のセクションが表示されません。
>
> ```dotenv title="config/overleaf.rc" theme={null}
> GIT_BRIDGE_ENABLED=true
> ```

アプリを所有する Dropbox アカウントでサインインし、[Dropbox App Console](https://www.dropbox.com/developers/apps) でアプリを作成します。

1. **Create app** をクリックし、ページに入力します。
   * **1. Choose an API**: **Scoped access** を選択します。
   * **2. Choose the type of access you need**: **Full Dropbox** ではなく **App folder** を選択します。Overleaf はアプリのフォルダー内でのみ同期を行います。
   * **3. Name your app**: 名前（例: `Overleaf`）を入力します。名前は Dropbox 上で一意である必要があります。各ユーザーのプロジェクトはその Dropbox 内の `Apps/<name of your app>/` に表示され、この名前が後述の `DROPBOX_APP_NAME` になります。
   * **Create app** をクリックします。アプリが **Settings** タブで開きます。
2. **Permissions** タブの **Files and folders** で、`files.metadata.write`、`files.content.write`、`files.content.read` にチェックを入れます。`account_info.read` と `files.metadata.read` は同時にチェックされ、チェックを外すことはできません。その他の権限にはチェックを入れないでください。
3. **Permissions** タブ下部のバーにある **Submit** をクリックします。**Submit をクリックしないと権限は保存されず**、アカウントを連携したユーザーのファイル同期を Dropbox が拒否します。

![](https://mintcdn.com/ayakaleaf-pro/34P8O6kHo91beEvQ/images/on-premises/dropbox-app-permissions.png?fit=max\&auto=format\&n=34P8O6kHo91beEvQ\&q=85\&s=8e99711b1fcf03d3d1655f65fea3a6b8)

Dropbox App Console: チェックする権限と Submit による保存

4. **Settings** タブの **OAuth 2** で、**Redirect URIs** に `${OVERLEAF_SITE_URL}/user/dropbox/oauth/callback` を入力し、**Add をクリックします**。URI を入力するだけでは不十分で、入力欄の上のリストに表示されて初めて保存されます。

![](https://mintcdn.com/ayakaleaf-pro/34P8O6kHo91beEvQ/images/on-premises/dropbox-app-redirect-uri.png?fit=max\&auto=format\&n=34P8O6kHo91beEvQ\&q=85\&s=d980dc4dec22a90b5bf1f7e147cfc7c0)

Dropbox App Console: リダイレクト URI を入力して Add をクリック

5. **Settings** タブの **Webhooks** で、**Webhook URIs** に `${OVERLEAF_SITE_URL}/dropbox/webhook` を入力し、同様に **Add をクリックします**。Dropbox はすぐにこの URI を呼び出して確認するため、Overleaf が以下の設定で起動済みで、インターネットから到達可能である必要があります（[Webhook](#webhook) を参照）。確認に成功すると、ステータスが **Enabled** と表示されます。

**Settings** タブから **App key** と **App secret**（**Show** をクリック）をコピーし、Overleaf の環境変数ファイルに以下の設定を追加します。Webhook（手順 5）は、これらの設定で Overleaf を起動した後に追加できます。

```dotenv title="config/variables.env" wrap theme={null}
# used to encrypt the user's Dropbox refresh token.
# How to generate: `openssl rand -hex 32`
DROPBOX_TOKEN_CIPHER_PASSWORD=0123456789ABCDEFG # changed to yours

# Dropbox Sync Settings
DROPBOX_ENABLED=true
DROPBOX_APP_KEY=
DROPBOX_APP_SECRET=
# the name of your Dropbox app (step 1), which is the folder name in Apps/
DROPBOX_APP_NAME=Overleaf

# OAuth callback is: ${OVERLEAF_SITE_URL}/user/dropbox/oauth/callback
# Webhook is: ${OVERLEAF_SITE_URL}/dropbox/webhook
# (Optional) DROPBOX_SYNC_PROXY_URL=http://10.0.0.1:10808
```

> [!WARNING]
>
> * リダイレクト URI と Webhook を設定する前に、`OVERLEAF_SITE_URL` が正しく設定されていることを確認してください。
> * Dropbox は、ユーザーがアカウントを連携した時点でトークンの権限を確定します。権限を Submit しても既存のトークンは変わりません。権限を Submit する前、または権限を変更する前に連携したユーザーは、Dropbox アカウントの連携を解除してから再度連携する必要があります。
> * 新しいアプリは **Development** ステータスです。**Settings** タブの **Development users** に **Only you** と表示されている場合、連携できるのはあなたの Dropbox アカウントのみです。他のユーザーが連携できるようにするには、**Enable additional users** をクリックしてください。その後、連携したユーザー数が `1 / 500` のように表示されます。**Development ステータスのアプリは最大 500 ユーザーまでです**。それ以上のユーザーに対応するには、**Apply for production** をクリックすると、Dropbox がアプリを審査します。

ネットワークアクセスが制限されている地域にいる場合は、Dropbox にアクセスするためにプロキシの設定が必要になることがあります。次の環境変数を設定してください: `DROPBOX_SYNC_PROXY_URL=http://10.0.0.1:10808`。プロキシは標準的な HTTP/HTTPS フォワードプロキシである必要があり、`127.0.0.1` を使用してはいけません。

#### データベースインデックスの作成

ユーザーが Dropbox アカウントを連携する前に、これを一度実行してください。Dropbox 同期が使用するインデックスは自動的には作成されないため、インデックスがないと同期のたびにコレクション全体がスキャンされます。

Toolkit を使用している場合は `bin/mongo` を実行します。Docker Compose を使用している場合は `docker compose exec mongo mongosh sharelatex` を実行します。その後、次の内容を貼り付けてください:

```js theme={null}
db.dropboxEntities.createIndex(
  { 'overleaf.userId': 1, 'dropbox.id': 1 },
  { name: 'overleaf.userId_1_dropbox.id_1', unique: true,
    partialFilterExpression: { 'dropbox.id': { $exists: true } } })
db.dropboxEntities.createIndex(
  { 'overleaf.userId': 1, 'overleaf.id': 1 },
  { name: 'overleaf.userId_1_overleaf.id_1', unique: true,
    partialFilterExpression: { 'overleaf.id': { $exists: true } } })
db.dropboxEntities.createIndex({ 'overleaf.userId': 1, 'dropbox.pathLower': 'hashed' })
db.dropboxProjects.createIndex({ userId: 1, projectId: 1 }, { name: 'projectId_userId_1', unique: true })
db.dropboxProjects.createIndex({ userId: 1, dropboxId: 1 }, { name: 'userId_dropboxId_1', unique: true })
```

再度実行しても問題ありません。MongoDB は既存のインデックスをスキップします。

> [!CAUTION]
>
> 代わりに `tools/migrations` の `dropboxEntities` マイグレーションを実行しないでください。`20220825160708_recreate_dropboxEntities` はコレクションを削除するため、すべてのユーザーの同期状態が失われます。

### Webhook

Dropbox は Webhook を使って Dropbox での変更を Overleaf に通知するため、変更は数秒以内に Overleaf に反映されます。Webhook はサイトのアドレス `${OVERLEAF_SITE_URL}/dropbox/webhook` に送られるので追加のポートは不要ですが、**Dropbox がインターネットからこのアドレスに到達できる必要があります**。App Console で Webhook を追加すると、Dropbox はすぐにそれを確認します。

Webhook がない場合（たとえば Dropbox から到達できないサーバーの場合）でも、Overleaf での変更は Dropbox に送信されます。ただし、Dropbox での変更が Overleaf に反映されるのは、ユーザーがエディターの Dropbox ダイアログで *sync this project now* をクリックしたときのみです。

### 同期の仕組み

* **連携**: ユーザーが Dropbox アカウントを連携すると、そのユーザーが所有するプロジェクトが Dropbox に送信されます。そのユーザーと共有されているプロジェクトは、次に変更があったときに Dropbox に表示されます。
* **Overleaf から Dropbox へ**: 新しいファイル、名前の変更、移動、削除、プロジェクト名の変更はすぐに送信されます。エディターでの編集は、全員がプロジェクトを離れてから数分後に Overleaf がストレージに保存した時点で送信されます。より早く送信するには、エディターの Dropbox ダイアログで *sync this project now* をクリックしてください（1 分に 1 回まで）。
* **Dropbox から Overleaf へ**: プロジェクトフォルダー内の新規ファイルや変更されたファイル、新しいフォルダー、削除はプロジェクトに反映されます。アプリフォルダーの最上位に作成した新しいフォルダーは、新しいプロジェクトになります。Dropbox でプロジェクトフォルダーを削除すると、Overleaf でそのプロジェクトは削除済みとしてマークされます。
* **コンフリクト**: 同じファイルが両方の場所で同時に変更された場合は、最後の変更が優先されます。Dropbox がもう一方のバージョンを *conflicted copy* として保持する場合があります。
* **共同編集者**: Dropbox を連携した共同編集者は、自分と共有されているプロジェクトを受け取ります。閲覧のみの共同編集者とレビュアーもプロジェクトを受け取りますが、Dropbox での変更は Overleaf に同期されません。
* **無視されるファイル**: ビルド出力（`.aux`、`.log` など）、`.DS_Store`、Python の仮想環境など、Overleaf が同期しないファイルは Dropbox にのみ残ります。

### Q\&A

> [accordion] ユーザーが Dropbox アカウントを連携できないのはなぜですか？
>
> **回答：**
>
> * Overleaf がまだ認識していない Dropbox フォルダーは名前でプロジェクトと対応付けられるため、同じ名前のプロジェクトを持っているユーザーは、まずそれらの名前を変更するよう求められます。名前は大文字と小文字を区別せずに比較され、アーカイブ済みのプロジェクトやゴミ箱内のプロジェクトも対象になります。
> * 1 つの Dropbox アカウントは、1 つの Overleaf アカウントにしか連携できません。

> [accordion] Dropbox アカウントの連携が解除されたのはなぜですか？
>
> **回答：** Overleaf は、Dropbox がトークンを拒否した場合（ユーザーが Dropbox でアプリを削除した後など）、Dropbox の容量がいっぱいになった場合、または Dropbox がアカウントを停止した場合に、Dropbox アカウントの連携を解除します。ユーザーがアカウントを再度連携するまで、プロジェクト一覧の通知で、これらのうちどれが起きたかが表示されます。問題が解決すれば、ユーザーは再度連携できます。

> [accordion] Dropbox でプロジェクトフォルダーの名前を変更できますか？
>
> **回答：** 代わりに Overleaf でプロジェクト名を変更してください。Dropbox 内のフォルダー名も変更されます。Overleaf にとって、Dropbox でフォルダー名を変更することは、プロジェクトフォルダーを削除して新しいフォルダーを作成することと同じです。そのため、元のプロジェクトは削除済みとしてマークされ、ファイルから新しいプロジェクトが作成されます。

> [accordion] 「Thesis (1)」のように番号が付いたプロジェクトフォルダーがあるのはなぜですか？
>
> **回答：** 2 つのプロジェクトが同じ名前を持つ場合でも、各プロジェクトには専用のフォルダーがあります。Dropbox は同じ名前のフォルダーを 2 つ保持できないため、後から作成されたフォルダーに番号を付けます。番号は、どちらのプロジェクトが古いかではなく、その時点で Dropbox 内でどの名前が空いていたかによって決まります。Overleaf は各プロジェクトのフォルダーを把握しているため、同じ名前を持つ別のプロジェクトのフォルダーに変更が送られることはありません。
>
> 名前がすでに使われているプロジェクトをアップロードした場合は、Overleaf でも「Thesis (1)」のように番号付きの名前になります。

> [accordion] Dropbox でプロジェクトフォルダーを削除するとどうなりますか？
>
> **回答：**
>
> * そのフォルダーの名前を持つプロジェクトがほかにない場合、そのプロジェクトは Overleaf で削除済みとしてマークされます。ファイルと履歴は保持されます。
> * その名前を持つプロジェクトが複数ある場合、Overleaf はフォルダーがどのプロジェクトのものかを判別できません。Dropbox アカウントの連携を解除し、プロジェクト名の変更を求める通知を表示します。Dropbox でフォルダーを削除する前に、プロジェクトに異なる名前を付けてください。
> * 「Thesis (1)」のような番号付きフォルダーはどのプロジェクト名とも一致しないため、削除しても Overleaf のプロジェクトは変わりません。プロジェクトを再度 Dropbox に送信するには、エディターの Dropbox ダイアログで *sync this project now* をクリックしてください。

> [accordion] Overleaf でプロジェクトを削除すると、Dropbox ではどうなりますか？
>
> **回答：** 何も起こりません。フォルダーは Dropbox に残ります。不要になった場合は Dropbox でフォルダーを削除してください。

> [accordion] プロジェクトがアーカイブ済みまたはゴミ箱内にある間に Dropbox で行った変更はどうなりますか？
>
> **回答：** 変更はプロジェクトに反映されず、プロジェクトを復元しても取り込まれません。復元後、Overleaf はその間に Dropbox で変更されたファイルについて、自身の変更を送信しなくなるため、両者の内容が異なる状態になります。
>
> そのようなファイルを再び同期させるには、Dropbox でもう一度保存してください。すると Overleaf は Dropbox のバージョンを採用します。復元後に Overleaf でそのファイルに加えた変更は置き換えられますが、プロジェクト履歴には残ります。Dropbox で変更する前にプロジェクトを復元してください。

> [accordion] エディターの Dropbox リンクを開くと Dropbox のホームページが表示されるのはなぜですか？
>
> **回答：** このリンクは、Overleaf Cloud と同様に dropbox.com 上の `Apps/<app folder>/<project>` を指しています。Dropbox が `Apps` フォルダーを翻訳された名前（たとえば中国語の `应用`）で表示している場合、リンクはフォルダーを見つけられず、代わりに Dropbox のホームページが開きます。Dropbox で翻訳された `Apps` フォルダーからプロジェクトフォルダーを開いてください。

> [accordion] プロジェクトの一部のファイルが Dropbox にないのはなぜですか？
>
> **回答：** 同期サービスが動作していなかった間（たとえば再起動中）に行われた変更は、後から Dropbox に送信されません。エディターの Dropbox ダイアログで *sync this project now* をクリックすると、プロジェクト全体が再送信されます。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.