Skip to main content
Zotero import runs in the web service (the tpr-webmodule module) of every Ayakaleaf Pro pod. Register the Zotero OAuth client as in Zotero Integration, with the callback URL ${OVERLEAF_SITE_URL}/user/zotero/oauth/callback, then configure Kubernetes as below.

Configuration

1

ConfigMap

30-config.yaml (changes)
ENABLED_LINKED_FILE_TYPES replaces the value from the installation; keep the types you already have and add zotero (and mendeley, if you use both).
2

Secret

ZOTERO_CIPHER_PASSWORD encrypts the users’ Zotero keys in MongoDB. Without it, each pod generates a key file in its own /var/lib/overleaf/data. With several replicas every node then has a different key, and a user served by another replica cannot use their linked Zotero account. Set it before the first user links Zotero: changing it later makes every user link Zotero again.
3

Apply and restart

Several replicas

Set ZOTERO_CIPHER_PASSWORD in the Secret, see above. Without it, a file imported on one replica cannot be refreshed on another: the refresh fails with “The remote service produced an error”, because that replica’s key file cannot decrypt the user’s Zotero key. With the password in the Secret it works on every replica; we tested both cases by importing on overleaf-0 and refreshing on overleaf-1. The OAuth handshake keeps its state in the session in Redis, so the callback may reach any replica.

Tested on Kubernetes

Against a mock of www.zotero.org and api.zotero.org (trusted through NODE_EXTRA_CA_CERTS from overleaf-certs), on Kubernetes 1.37 with three replicas behind HAProxy, our end-to-end tests for Zotero pass (18 cases): linking through OAuth 1.0a and unlinking, importing the library and groups into a .bib file, refreshing it, revoking the key on Zotero, asking to link again, references searchable for the collaborators, only the importer may refresh, API errors, and slow connections to Zotero.
Last modified on November 2, 2026