> ## 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.

# Sinkronisasi Dropbox

> Izinkan pengguna menyinkronkan proyek mereka dengan folder di Dropbox mereka pada deployment Kubernetes.

Sinkronisasi Dropbox menggunakan tiga bagian dari setiap pod Ayakaleaf Pro, dan ketiganya hanya dimulai dengan `DROPBOX_ENABLED: "true"`:

* **web** (modul `dropbox`): penautan, dialog Dropbox pada proyek, dan webhook yang dipanggil oleh Dropbox.
* **third-party-datastore**: layanan tersendiri di dalam pod yang memproses antrean perubahan untuk dikirim ke atau diambil dari Dropbox.
* **document-updater**: dengan Dropbox aktif, layanan ini menulis perubahan dari editor ke MongoDB di latar belakang, beberapa menit setelah semua orang meninggalkan proyek; baru setelah itu perubahan dikirim ke Dropbox.

Buat aplikasi Dropbox dan baca cara kerja sinkronisasi di [Sinkronisasi Dropbox](https://ayakaleaf-pro.mintlify.site/id/on-premises/configuration/overleaf-toolkit/integrations/dropbox-synchronisation.md); halaman ini menerapkannya ke Kubernetes.

| | |
| - | - |
| Layanan | web (modul `dropbox`), third-party-datastore, dan document-updater, di setiap pod Ayakaleaf Pro |
| Dropbox → Overleaf | `POST ${OVERLEAF_SITE_URL}/dropbox/webhook` dari internet, ditandatangani dengan app secret |
| Pod → Dropbox | `https://api.dropboxapi.com` dan `https://content.dropboxapi.com` |
| Browser → Dropbox | `https://www.dropbox.com/oauth2/authorize`, lalu kembali ke `${OVERLEAF_SITE_URL}/user/dropbox/oauth/callback` |
| Status | antrean perubahan yang tertunda beserta lock-nya di Redis; status sinkronisasi di MongoDB (`dropboxEntities`, `dropboxProjects`) |
| Pekerjaan latar belakang | third-party-datastore memeriksa antreannya setiap detik; document-updater menulis proyek yang tidak dibuka siapa pun selama 3 menit |

### Konfigurasi

**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"` dan StatefulSet git-bridge dari [Integrasi Git](https://ayakaleaf-pro.mintlify.site/id/on-premises/configuration/kubernetes/integrations/git-integration.md) harus sudah tersedia: tanpa keduanya, pengaturan akun menyembunyikan bagian sinkronisasi proyek.

**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` mengenkripsi token Dropbox pengguna di MongoDB. Setiap replika harus menggunakan nilai yang sama, dan mengubahnya nanti membuat setiap pengguna harus menautkan Dropbox lagi.

**3. Buat indeks database**

Jalankan perintah indeks dari [Membuat indeks database](https://ayakaleaf-pro.mintlify.site/id/on-premises/configuration/overleaf-toolkit/integrations/dropbox-synchronisation.md#create-the-database-indexes) satu kali, pada primary dari replica set:

```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. Terapkan dan restart**

```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` hanya ada jika `DROPBOX_ENABLED` bernilai `"true"`.

**5. Buka webhook ke internet**

Dropbox harus dapat menjangkau `${OVERLEAF_SITE_URL}/dropbox/webhook` dari internet. Jika ingress atau load balancer Anda hanya mengizinkan path atau jaringan tertentu dari luar, izinkan path ini; ini adalah satu-satunya path yang dipanggil Dropbox. Periksa dari luar kluster:

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

Lalu tambahkan webhook di Dropbox App Console seperti dijelaskan di halaman Toolkit.

### Beberapa replika

Tidak ada yang perlu ditambahkan selain `DROPBOX_TOKEN_CIPHER_PASSWORD` yang sama:

* Webhook dapat menjangkau replika mana pun. Webhook hanya memasukkan perubahan ke antrean di Redis.
* Setiap replika menjalankan third-party-datastore, dan masing-masing memproses antrean bersama. Antrean seorang pengguna diambil dengan lock di Redis, sehingga hanya satu replika yang mengirim atau mengambil perubahan pengguna tertentu pada satu waktu.
* document-updater di setiap replika menulis proyek yang tidak aktif di latar belakang. Setiap proyek diambil dari daftar bersama di Redis, sehingga hanya ditulis satu kali.

### Diuji di Kubernetes

Terhadap tiruan (mock) Dropbox API, di Kubernetes 1.37 dengan tiga replika di belakang HAProxy, pengujian end-to-end kami untuk Sinkronisasi Dropbox lulus (59 kasus): menautkan dan melepas tautan; mengirim proyek, suntingan, file biner, penggantian nama, pemindahan, dan penghapusan ke Dropbox, termasuk suntingan editor yang tiba melalui penulisan latar belakang setelah proyek ditutup, tanpa kompilasi atau "sync now"; menerapkan perubahan yang dibuat di Dropbox melalui webhook (verification challenge dan pemeriksaan tanda tangan), proyek baru dari folder baru, folder proyek yang dihapus; proyek dengan nama yang sama; dialog Dropbox di editor dan "sync now" beserta batas lajunya; percobaan ulang, batas laju, dan timeout dari Dropbox; akun yang dilepas tautannya saat Dropbox penuh, menolak token, atau ditangguhkan; akun Overleaf yang ditangguhkan; serta jawaban webhook saat third-party-datastore sedang mati.


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