etherpad-lite/doc/faq.md
John McLear 01d0b08a4e
docs: migrate useful wiki content into the manual (#7990) (#7994)
* docs: migrate useful wiki content into the VitePress manual (#7990)

The GitHub wiki is being retired; documentation should ship with the
software. This migrates the still-accurate, non-duplicate wiki pages into
the published VitePress site (doc/**/*.md + the sidebar in
doc/.vitepress/config.mts) so they are versioned, searchable and portable:

- deployment.md: reverse-proxy configs (Nginx/Apache/Caddy/Traefik/
  HAProxy) with the WebSocket-upgrade rules, subdirectory hosting via
  X-Proxy-Path, native HTTPS via the ssl block, a systemd unit, and the
  Istio manifest (with the Redis-adapter multi-replica caveat).
- accessibility.md: editor keyboard shortcuts (verified against
  ace2_inner.ts / broadcast_slider.ts / pad_editbar.ts), toolbar
  navigation, NVDA notes.
- faq.md: install methods, URL-path reference, listing/deleting pads
  (API-first), backup/restore, and history pruning.
- development.md: source-tree tour, the pad<->format conversion pipeline,
  the internal DB API, and the Fontello toolbar-icon workflow.
- database.md: the key/value schema plus connecting MySQL/PostgreSQL/Redis
  backends and a pgloader MySQL->PostgreSQL migration (database docs were
  previously absent from the VitePress site).

Every page was checked against the current source before inclusion:
corrected the apt instructions to the live signed repo (stable/main,
signed-by key), dropped the unpublished snap, fixed the Redis dbSettings
(flat host/port/password or url, not the obsolete client_options),
dropped charset from the PostgreSQL example, and removed a phantom
getEtherpad API reference. The VitePress site builds cleanly
(pnpm run docs:build) with the dead-link checker enabled.

Closes #7990

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: add verified hands-on changeset/atext walkthrough (#7990)

Migrate the practical Changeset-library tutorial from the wiki into
changeset_library.md, rewritten against the current API: unpack(),
deserializeOps() (replacing the deprecated opIterator) and
new AttributePool() (replacing the removed AttributePoolFactory). Every
example output was produced by running the code against the current
Changeset.ts / AttributePool.ts, not copied from the wiki. Also fixes a
stale ether/etherpad-lite source link.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 09:52:33 +01:00

6.9 KiB

FAQ

This page answers common operational questions about running and maintaining an Etherpad instance. It collects material previously kept on the project wiki.

How do I install Etherpad?

There are several supported ways to install Etherpad. Pick whichever suits your environment.

Docker

The official image is published to Docker Hub (etherpad/etherpad) and to the GitHub Container Registry (ghcr.io/ether/etherpad) with identical tags.

docker pull etherpad/etherpad
docker run -p 9001:9001 etherpad/etherpad

See the Docker chapter for building personalized images, enabling plugins, and configuring office-format import/export.

One-line installer (macOS / Linux / WSL)

curl -fsSL https://raw.githubusercontent.com/ether/etherpad/master/bin/installer.sh | sh

On Windows (PowerShell):

irm https://raw.githubusercontent.com/ether/etherpad/master/bin/installer.ps1 | iex

The installer clones Etherpad, installs dependencies and builds the frontend. Set ETHERPAD_RUN=1 to also start it once the install finishes.

apt repository (Debian / Ubuntu)

Etherpad publishes a signed APT repository (stable channel). Import the signing key, add the repository and install:

curl -fsSL https://etherpad.org/key.asc \
  | sudo gpg --dearmor -o /usr/share/keyrings/etherpad.gpg

echo "deb [signed-by=/usr/share/keyrings/etherpad.gpg] https://etherpad.org/apt stable main" \
  | sudo tee /etc/apt/sources.list.d/etherpad.list

sudo apt-get update
sudo apt-get install etherpad

The repository provides amd64 and arm64 builds. Etherpad depends on Node.js >= 24, so on older distributions you may also need NodeSource's apt repository to satisfy that dependency.

From source

Etherpad requires Node.js >= 24 and pnpm.

git clone -b master https://github.com/ether/etherpad
cd etherpad
pnpm i
pnpm run build:etherpad
pnpm run prod

Then open http://localhost:9001.

What URL paths does Etherpad serve?

Path Description
/admin Administration dashboard (requires admin login).
/admin/plugins Install, update and remove plugins from the web UI.
/admin/settings Edit settings.json from the web UI.
/p/:padID Open (or create) the pad with the given padID, e.g. /p/foo.
/p/:padID/timeslider Open the pad's history/timeslider view. Append #N to jump to a specific revision, e.g. /p/foo/timeslider#5.
/p/:padID/export/:type Export the pad in the given format, e.g. /p/foo/export/html. Append ?revs=N to export a specific revision.

Supported export types:

  • Native (no extra dependencies): txt, html, etherpad, docx, pdf.
  • Via LibreOffice: odt, doc, rtf — these require the soffice setting to point at a LibreOffice executable. See the office-format notes in the Docker chapter.

How do I list all pads?

The recommended way is the HTTP API method listAllPads, combined with jq:

ETHERPAD_HOST='https://pad.example.com'
ETHERPAD_API_KEY='...'      # the APIKEY.txt file in the Etherpad root
ETHERPAD_API_VERSION='...'  # see https://pad.example.com/api

curl -s "${ETHERPAD_HOST}/api/${ETHERPAD_API_VERSION}/listAllPads?apikey=${ETHERPAD_API_KEY}" \
  | jq -r '.data.padIDs[]'

For an interactive list with management actions, install the ep_adminpads2 plugin and browse to /admin/pads.

As a last resort you can query the database directly. The exact query depends on your configured backend; pad records use keys of the form pad:<padID> and pad:<padID>:revs:<n>. For example, with SQLite:

sqlite3 ./var/sqlite.db "select key from store where key like 'pad:%'" \
  | grep -Eo '^pad:[^:]+' \
  | sed -e 's/pad://' \
  | sort -u

Prefer the API or admin plugin over direct SQL: the schema is an implementation detail and may change.

How do I delete or manage pads?

Use the HTTP API deletePad method:

curl -s "${ETHERPAD_HOST}/api/${ETHERPAD_API_VERSION}/deletePad?apikey=${ETHERPAD_API_KEY}&padID=foo"

The API also offers copyPad, movePad, getRevisionsCount and more — see the HTTP API chapter.

For a web UI, install the ep_adminpads2 plugin and manage pads from /admin/pads, where you can search, view and delete pads.

The deletePad CLI tool is also available for operators:

pnpm run --filter bin deletePad <padID>

How do I back up and restore pads?

Back up the whole instance

All pad data lives in the configured database. Back it up using the tool appropriate to your backend (for example mysqldump for MySQL/MariaDB, pg_dump for PostgreSQL, or a file copy of var/*.db for the file-based dirty/rusty engines while Etherpad is stopped). A regular, automated dump of the database is the canonical backup for a production instance.

Back up a single pad

Export the pad over HTTP by appending /export/<type> to its URL. Plain text, HTML and the round-trippable etherpad format are most useful for backups:

curl -o mypad.txt   https://pad.example.com/p/foo/export/txt
curl -o mypad.html  https://pad.example.com/p/foo/export/html
curl -o mypad.etherpad https://pad.example.com/p/foo/export/etherpad

The etherpad export preserves the pad's full history and can be re-imported, making it the best choice for migrating or archiving an individual pad.

Restore or inspect an old revision

Every state the pad has been in is stored in the database, so you can retrieve an earlier revision without a separate backup:

  • Open /p/:padID/timeslider to browse the history and find the revision number you want.
  • Export a specific revision directly with the ?revs=N query parameter, e.g. https://pad.example.com/p/foo/export/html?revs=1000.

Repairing a damaged pad

If a pad is corrupt, use the CLI repair tools (checkPad, repairPad, rebuildPad) documented in the CLI chapter. Always back up the database before running write operations.

How do I limit history or prune revisions?

Etherpad keeps the full revision history of every pad, so the database grows over time. To reclaim space, use the pad-compaction CLI tools, which collapse or trim revision history for one pad, every pad, or only stale pads:

# Collapse all history of one pad
pnpm run --filter bin compactPad <padID>

# Keep only the last 50 revisions of one pad
pnpm run --filter bin compactPad <padID> --keep 50

# Compact every pad on the instance
pnpm run --filter bin compactAllPads

# Compact only pads not edited in the last 90 days, keeping the last 50 revisions
pnpm run --filter bin compactStalePads --older-than 90 --keep 50

These tools require cleanup.enabled = true in settings.json and are destructive — history is collapsed or trimmed. Export anything you can't afford to lose via the pad's /export/etherpad route first. The same primitive is available over the wire as the compactPad HTTP API method. See the CLI chapter for full details.