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

# Synchronizace s Dropboxem

> Umožněte uživatelům v nasazení na Kubernetes synchronizovat projekty se složkou v jejich Dropboxu.

Synchronizace s Dropboxem využívá tři části každého podu Ayakaleaf Pro a všechny tři se spouštějí pouze s `DROPBOX_ENABLED: "true"`:

* **web** (modul `dropbox`): propojení, dialog Dropboxu v projektu a webhook, který Dropbox volá.
* **third-party-datastore**: samostatná služba uvnitř podu, která zpracovává frontu změn k odeslání do Dropboxu nebo ke stažení z něj.
* **document-updater**: se zapnutým Dropboxem zapisuje změny z editoru na pozadí do MongoDB, několik minut poté, co všichni projekt opustili; teprve pak jdou do Dropboxu.

Aplikaci Dropbox vytvořte a jak synchronizace funguje, si přečtěte na stránce [Synchronizace s Dropboxem](https://ayakaleaf-pro.mintlify.site/cs/on-premises/configuration/overleaf-toolkit/integrations/dropbox-synchronisation.md); tato stránka popisuje, jak to vložit do Kubernetes.

| | |
| - | - |
| Služby | web (modul `dropbox`), third-party-datastore a document-updater, v každém podu Ayakaleaf Pro |
| Dropbox → Overleaf | `POST ${OVERLEAF_SITE_URL}/dropbox/webhook` z internetu, podepsaný tajným klíčem aplikace |
| Pod → Dropbox | `https://api.dropboxapi.com` a `https://content.dropboxapi.com` |
| Prohlížeč → Dropbox | `https://www.dropbox.com/oauth2/authorize`, poté zpět na `${OVERLEAF_SITE_URL}/user/dropbox/oauth/callback` |
| Stav | fronta čekajících změn a její zámky v Redisu; stav synchronizace v MongoDB (`dropboxEntities`, `dropboxProjects`) |
| Práce na pozadí | third-party-datastore kontroluje svou frontu každou sekundu; document-updater zapisuje projekty, které nikdo neměl otevřené 3 minuty |

### Konfigurace

**1. ConfigMapa**

```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
```

Musí být nastaveno `GIT_BRIDGE_ENABLED: "true"` a StatefulSet git-bridge ze stránky [Integrace s Gitem](https://ayakaleaf-pro.mintlify.site/cs/on-premises/configuration/kubernetes/integrations/git-integration.md): bez nich nastavení účtu sekci synchronizace projektů skryje.

**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` šifruje tokeny Dropboxu uživatelů v MongoDB. Všechny repliky musí používat stejnou hodnotu a její pozdější změna přiměje všechny uživatele propojit Dropbox znovu.

**3. Vytvořte databázové indexy**

Spusťte jednou příkazy pro indexy z části [Vytvoření databázových indexů](https://ayakaleaf-pro.mintlify.site/cs/on-premises/configuration/overleaf-toolkit/integrations/dropbox-synchronisation.md#create-the-database-indexes), a to na primárním uzlu replica setu:

```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. Aplikujte a restartujte**

```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` existuje pouze tehdy, když je `DROPBOX_ENABLED` nastaveno na `"true"`.

**5. Zpřístupněte webhook z internetu**

Dropbox musí dosáhnout na `${OVERLEAF_SITE_URL}/dropbox/webhook` z internetu. Pokud váš ingress nebo load balancer povoluje zvenčí pouze některé cesty nebo sítě, povolte tuto; je to jediná cesta, kterou Dropbox volá. Ověřte to zvenčí clusteru:

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

Poté přidejte webhook v Dropbox App Console, jak je popsáno na stránce o Toolkitu.

### Více replik

Kromě sdíleného `DROPBOX_TOKEN_CIPHER_PASSWORD` není potřeba nic dalšího:

* Webhook může dorazit na kteroukoli repliku. Pouze zařadí změnu do fronty v Redisu.
* Každá replika spouští third-party-datastore a každá zpracovává sdílenou frontu. Fronta uživatele se převezme se zámkem v Redisu, takže změny daného uživatele odesílá nebo stahuje v jednu chvíli pouze jedna replika.
* Document-updater každé repliky zapisuje nečinné projekty na pozadí. Každý projekt se převezme ze sdíleného seznamu v Redisu, takže se zapíše jednou.

### Otestováno na Kubernetes

Proti simulaci Dropbox API, na Kubernetes 1.37 se třemi replikami za HAProxy, procházejí naše end-to-end testy pro synchronizaci s Dropboxem (59 případů): propojení a odpojení; odesílání projektů, úprav, binárních souborů, přejmenování, přesunů a mazání do Dropboxu, včetně úpravy v editoru, která dorazí prostřednictvím zápisu na pozadí po zavření projektu, bez kompilace nebo „sync now“; aplikace změn provedených v Dropboxu přes webhook (ověřovací challenge a kontrola podpisu), nové projekty z nových složek, smazané složky projektů; projekty se stejným názvem; dialog Dropboxu v editoru a „sync now“ s jeho limitem požadavků; opakované pokusy, limity požadavků a timeouty Dropboxu; odpojení účtů, když je Dropbox plný, odmítne token nebo je pozastaven; pozastavené účty Overleafu; a odpověď webhooku, když third-party-datastore neběží.


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