Where Does Self-Hosted Penpot Store Data and Assets?
Self-hosted Penpot persists Postgres plus uploaded assets in Docker named volumes. Volume names, backup routine and restores.
Last updated
Penpot's compose stack keeps all persistent state in Docker named volumes. The default file wires two: one for the Postgres database (every project, user and comment) and one for uploaded assets (images and SVG clips served from /opt/data/assets). Stopping containers never touches them, which is exactly the point.
Back up both on a schedule. Dump Postgres with pg_dump against the container, and tar the assets volume through a helper container since volume contents can't be copied directly. Losing the database volume loses all project data; losing assets loses every uploaded image. Restores reverse the process with the stack down.
Where Penpot stores this, by platform
penpot_postgres_v15
Named Docker volume holding the database at /var/lib/postgresql/data. Assets live in the sibling penpot_assets volume at /opt/data/assets. Inspect both with docker volume inspect.
Frequently asked questions
How do I back up self-hosted Penpot?
Run pg_dump against the Postgres container for the database, and tar the penpot_assets volume via a temporary helper container. Automate both on a schedule. Never copy volume data folders directly from the host.
Where are Penpot uploaded files stored?
In the penpot_assets named volume, served from /opt/data/assets inside backend and frontend containers (or S3 if configured). The database volume only holds references, so back up assets separately.
Notice an outdated path? Let us know.