Skip to main content

Storage and backups

Tarnished stores two different kinds of state:

  • relational application data
  • uploaded files and generated artifacts

Understanding where each kind of state lives is necessary for safe backups and migrations.

SQLite-backed installs

In the default packaged Docker Compose path:

  • SQLite data lives under ./data
  • uploaded files live under ./data/uploads

In practice, this means the local data/ directory is the critical backup target for the default quickstart path.

PostgreSQL-backed Compose installs

In the packaged PostgreSQL Compose path:

  • Tarnished uploads and local app data live under ./data
  • PostgreSQL database files live under ./postgres_data

To preserve the full deployment, you must back up both directories.

Helm and Kubernetes installs

In the Helm chart:

  • uploaded files live on the PVC mounted at /app/data
  • relational application data lives in PostgreSQL when postgresql.enabled=true

In this model, the backup surface is:

  • the PVC used for Tarnished uploads
  • the PostgreSQL database itself

Upload path model

The backend resolves stored upload paths relative to the configured upload root and rejects paths that try to escape it.

That means Tarnished treats the configured upload root as the canonical file boundary.

Durable transfer artifacts

ZIP imports and ZIP exports use durable transfer jobs.

That means:

  • exports may create generated archive artifacts temporarily
  • import and export progress is stored durably in the database
  • transfer job cleanup/retention is separate from your core relational and upload storage

What to back up

Minimum backup guidance

Default SQLite quickstart

Back up:

  • ./data

PostgreSQL Compose install

Back up:

  • ./data
  • ./postgres_data

Helm / Kubernetes install

Back up:

  • the PVC used by Tarnished
  • the PostgreSQL database used by Tarnished

What not to confuse with user data

Do not confuse user data with:

  • build artifacts
  • downloaded install files
  • docs output
  • transient container state

The important storage for Tarnished is the app data and the database, not the repository checkout itself.