# Backups

> Datenbank und Medien sichern, wiederherstellen und die statischen Websites neu erzeugen.

Sichere **zwei Dinge**: die **Datenbank** (alle Inhalte, Verlauf, Benutzer, Einstellungen) und den **Speicherordner**
mit Medien und Screenshots. Die generierten Websites müssen nicht gesichert werden – sie lassen sich jederzeit neu
erzeugen.

Bewahre außerdem die `.env` (vor allem `APP_SECRET`) zusammen mit den Backups auf.

## Datenbank

```bash
docker compose exec -T postgres pg_dump -U docsello -Fc docsello > docsello-$(date +%F).dump
```

Als nächtlicher Cron-Job, der 14 Tage aufbewahrt (Pfade wie in der nginx-Variante):

```bash
cat > /etc/cron.d/docsello-backup <<'EOF'
45 3 * * * root cd /mnt/storage/docsello/app && docker compose exec -T postgres pg_dump -U docsello -Fc docsello > /mnt/storage/docsello/backups/docsello-$(date +\%F).dump && find /mnt/storage/docsello/backups -name 'docsello-*.dump' -mtime +14 -delete
EOF
```

## Speicherordner

Wichtig sind die Medien (`storage/media`). In der Caddy-Variante liegt der Speicher im Docker-Volume
`docsello_storage`:

```bash
docker run --rm -v docsello_storage:/data:ro -v "$PWD":/backup alpine tar czf /backup/storage-$(date +%F).tar.gz -C /data .
```

In der nginx-Variante liegt er direkt auf dem Server, z. B. unter `/mnt/storage/docsello/data/storage`.

:::tip
Kopiere die Backups regelmäßig auf einen anderen Rechner oder Speicher – ein Backup auf demselben Server hilft nicht,
wenn der Server ausfällt.
:::

## Wiederherstellen

```bash
docker compose stop web worker
docker compose exec -T postgres pg_restore -U docsello -d docsello --clean --if-exists < docsello-JJJJ-MM-TT.dump
# Speicher zurückspielen (Caddy-Variante):
docker run --rm -v docsello_storage:/data -v "$PWD":/backup alpine sh -c 'tar xzf /backup/storage-JJJJ-MM-TT.tar.gz -C /data && chown -R 1000:1000 /data'
docker compose up -d
docker compose run --rm worker build-site   # alle Websites neu erzeugen
```

## Websites neu erzeugen

Nach einer Wiederherstellung oder wenn etwas seltsam aussieht:

```bash
docker compose run --rm worker build-site
```

Das erzeugt alle statischen Websites aus der Datenbank neu. Eine einzelne Website erzeugst du auch per API neu:
`POST /api/v1/sites/{site}/publish` bzw. `docsello publish --site <website>`.
