* 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>
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 thesofficesetting 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/timesliderto browse the history and find the revision number you want. - Export a specific revision directly with the
?revs=Nquery 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.