Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions docs/install/containers/recipes/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,3 +118,43 @@ RUN <<EOT

After making these changes, build the project container as usual.
It will no longer output the access log, but will continue to output the event log.


## Pack the ZODB
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@erral @davisagli would this section be more appropriate under the existing Advanced usage in plone/plone-backend?


A common maintenance task of a Plone instance is to [pack the ZODB](https://zodb.org/en/stable/reference/zodb.html#ZODB.DB.pack).
Packing removes old revisions of objects.
It is similar to [routine vacuuming in PostgreSQL](https://www.postgresql.org/docs/8.3/routine-vacuuming.html).

The official {doc}`/install/containers/images/backend` container and project containers based on them have a `pack` command to pack the ZODB.
Copy link
Member

@davisagli davisagli Mar 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should have a versionadded note. I just merged the PR which adds this command today, and it won't actually be available in the images until the next Plone releases are made. The backport PR for Plone 6.0 is still pending.

The command will work in standalone mode, ZEO mode, and RelStorage mode but only with PostgreSQL.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sentence is confusing. "but only with PostgreSQL" is meant to be a qualifier only when using it with Relstorage, but it sounds like it applies to all the options, which makes no sense (it's only possible to use postgres if you're doing via Relstorage).


Invoke the command in a running container by passing in the appropriate command for the mode.

In standalone mode, ZODB is in a mounted volume, so the command would be similar to the following.

```shell
docker run -v /path/to/your/volume:/data plone/plone-backend pack
```

In ZEO mode, run the command next to your ZEO instance.

```shell
docker run -e ZEO_ADDRESS=zeo:8100 --link zeo plone/plone-backend pack
```

In RelStorage mode, pass the connection DSN.

```shell
docker run -e RELSTORAGE_DSN="dbname='plone' user='plone' host='db' password='password' port='5432'" pack
```
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In Docker Swarm, it's also necessary to specify the network if the database is only available on an internal network. It might be easier to use docker exec to run the pack command in an existing plone-backend container.


In running containers that use Docker Compose, the command is less complicated.

```shell
docker compose run backend pack
```

The above command assumes that the service that runs the Plone instance is named `backend`.
Otherwise replace `backend` with your container's name.