> ## 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 同期

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

Dropbox 同期は、各 Ayakaleaf Pro Pod の 3 つの部分を使用します。3 つとも `DROPBOX_ENABLED: "true"` の場合にのみ起動します。

* **web**（`dropbox` モジュール）：リンク、プロジェクトの Dropbox ダイアログ、Dropbox が呼び出す Webhook。
* **third-party-datastore**：Pod 内の独立したサービスで、Dropbox に送信する変更や Dropbox から取得する変更のキューを処理します。
* **document-updater**：Dropbox が有効な場合、全員がプロジェクトを離れてから数分後に、エディターでの変更をバックグラウンドで MongoDB に書き込みます。その時点で初めて変更が Dropbox に送られます。

Dropbox アプリの作成方法と同期の仕組みは [Dropbox 同期](https://ayakaleaf-pro.mintlify.site/ja/on-premises/configuration/overleaf-toolkit/integrations/dropbox-synchronisation.md) を参照してください。このページでは、それを Kubernetes に設定する方法を説明します。

| | |
| - | - |
| サービス | web（`dropbox` モジュール）、third-party-datastore、document-updater、すべての Ayakaleaf Pro Pod 内 |
| Dropbox → Overleaf | インターネットからの `POST ${OVERLEAF_SITE_URL}/dropbox/webhook`（アプリシークレットで署名） |
| Pod → Dropbox | `https://api.dropboxapi.com` と `https://content.dropboxapi.com` |
| ブラウザ → Dropbox | `https://www.dropbox.com/oauth2/authorize`、その後 `${OVERLEAF_SITE_URL}/user/dropbox/oauth/callback` に戻ります |
| 状態 | Redis 内の保留中の変更のキューとそのロック。MongoDB 内の同期状態（`dropboxEntities`、`dropboxProjects`） |
| バックグラウンド処理 | third-party-datastore は 1 秒ごとにキューを確認します。document-updater は 3 分間誰も開いていないプロジェクトを書き込みます |

### 設定

**1. ConfigMap**

```yaml title="30-config.yaml (additions)" theme={null}
  DROPBOX_ENABLED: "true"
  DROPBOX_APP_KEY: <app key>
  DROPBOX_APP_NAME: Overleaf      # the folder name under Apps/ in Dropbox
  # optional: send the requests to Dropbox through an HTTP proxy
  # DROPBOX_SYNC_PROXY_URL: http://proxy.example.com:3128
```

`GIT_BRIDGE_ENABLED: "true"` と、[Git 連携](https://ayakaleaf-pro.mintlify.site/ja/on-premises/configuration/kubernetes/integrations/git-integration.md) の git-bridge StatefulSet が用意されている必要があります。これらがないと、アカウント設定にプロジェクト同期のセクションが表示されません。

**2. Secret**

```bash theme={null}
kubectl -n overleaf patch secret overleaf-secrets --type merge -p '{"stringData":{
  "DROPBOX_APP_SECRET":"<app secret>",
  "DROPBOX_TOKEN_CIPHER_PASSWORD":"'"$(openssl rand -hex 32)"'"}}'
```

`DROPBOX_TOKEN_CIPHER_PASSWORD` は、MongoDB 内のユーザーの Dropbox トークンを暗号化します。すべてのレプリカで同じ値を使用する必要があり、後から変更するとすべてのユーザーが Dropbox を再リンクすることになります。

**3. データベースのインデックスを作成する**

[データベースのインデックスを作成する](https://ayakaleaf-pro.mintlify.site/ja/on-premises/configuration/overleaf-toolkit/integrations/dropbox-synchronisation.md#create-the-database-indexes) のインデックス作成コマンドを、レプリカセットのプライマリで 1 回実行します。

```bash wrap theme={null}
kubectl -n overleaf exec -i mongo-0 -- mongosh --quiet \
  'mongodb://mongo-0.mongo:27017,mongo-1.mongo:27017,mongo-2.mongo:27017/sharelatex?replicaSet=overleaf' <<'EOF'
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 })
EOF
```

**4. 適用して再起動する**

```bash theme={null}
kubectl apply -f 30-config.yaml
kubectl -n overleaf rollout restart deployment/overleaf     # or statefulset/overleaf
kubectl -n overleaf exec deploy/overleaf -- tail -n 5 /var/log/overleaf/third-party-datastore.log
```

`third-party-datastore.log` は、`DROPBOX_ENABLED` が `"true"` の場合にのみ存在します。

**5. Webhook をインターネットに公開する**

Dropbox はインターネットから `${OVERLEAF_SITE_URL}/dropbox/webhook` に到達できる必要があります。Ingress やロードバランサーが外部から一部のパスやネットワークしか許可していない場合は、このパスを許可してください。Dropbox が呼び出すパスはこれだけです。クラスターの外部から確認します。

```bash theme={null}
curl "https://overleaf.example.com/dropbox/webhook?challenge=test"   # prints: test
```

その後、Toolkit のページの説明に従って Dropbox App Console で Webhook を追加します。

### 複数のレプリカ

共有の `DROPBOX_TOKEN_CIPHER_PASSWORD` 以外に追加の作業は不要です。

* Webhook はどのレプリカに届いても構いません。変更を Redis のキューに入れるだけです。
* すべてのレプリカが third-party-datastore を実行し、それぞれが共有キューを処理します。ユーザーのキューは Redis のロックで取得されるため、特定のユーザーの変更を送信または取得するのは一度に 1 つのレプリカだけです。
* すべてのレプリカの document-updater が、アイドル状態のプロジェクトをバックグラウンドで書き込みます。各プロジェクトは Redis の共有リストから取り出されるため、書き込みは 1 回だけです。

### Kubernetes でのテスト結果

Dropbox API のモックに対して、Kubernetes 1.37 上で HAProxy の背後に 3 つのレプリカを配置した構成で、Dropbox 同期のエンドツーエンドテストに合格しました（59 ケース）。対象は、リンクとリンク解除、プロジェクト・編集・バイナリファイル・名前の変更・移動・削除の Dropbox への送信（プロジェクトを閉じた後のバックグラウンド書き込みで届くエディターでの編集を、コンパイルや "sync now" なしで送信することを含む）、Webhook（検証チャレンジと署名チェック）を通じた Dropbox での変更の適用、新しいフォルダーからの新規プロジェクト、削除されたプロジェクトフォルダー、同じ名前のプロジェクト、エディターの Dropbox ダイアログとレート制限付きの "sync now"、Dropbox のリトライ・レート制限・タイムアウト、Dropbox の容量不足・トークンの拒否・アカウント停止時のアカウントのリンク解除、停止された Overleaf アカウント、そして third-party-datastore が停止しているときの Webhook の応答です。


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