41 lines
1.6 KiB
Markdown
41 lines
1.6 KiB
Markdown
# data/ – persistente Nutzdaten
|
||
|
||
Alles in diesem Verzeichnis ist **Nutzdatenbestand**, nicht Code. Es überlebt
|
||
Updates, `git pull`, `git clean` und Container-Neubauten und gehört in die
|
||
Datensicherung. Der Inhalt ist per `.gitignore` (`data/*`) vom Repo ausgenommen –
|
||
nur diese README ist eingecheckt.
|
||
|
||
| Verzeichnis | Inhalt | Gemountet in |
|
||
|---|---|---|
|
||
| `data/mariadb/` | Datenbank (MariaDB-Datendateien) | nur `db`-Container: `/var/lib/mysql` |
|
||
| `data/belege/` | Hochgeladene Belegdateien, nach Jahr/Belegnummer | `web`: `/var/www/html/data/belege` |
|
||
| `data/logo/` | Firmenlogo (`logo.png` oder `logo.jpg`) | `web`: `/var/www/html/data/logo` |
|
||
|
||
## Warum außerhalb des Web-Roots
|
||
|
||
`data/belege` und `data/logo` liegen bewusst **nicht** unter `public/`. Beide
|
||
werden ausschließlich über die Anwendung ausgeliefert, die vorher Anmeldung und
|
||
Dateityp prüft:
|
||
|
||
- Belege über `/belege/{id}/file` (`BelegController::serveFile`)
|
||
- Logo über `/settings/logo/file` (`SettingsController::serveLogo`)
|
||
|
||
Ein direkter Abruf per URL ist damit nicht möglich. In der Datenbank steht jeweils
|
||
nur der Pfad **relativ** zum zugehörigen Verzeichnis (`belege.storage_path`,
|
||
`company_settings.logo_path`) – kein Web-Pfad und kein absoluter Serverpfad.
|
||
|
||
Der `web`-Container sieht `data/mariadb` nicht; die Datenbankdateien sind
|
||
ausschließlich in den `db`-Container gemountet.
|
||
|
||
## Datensicherung
|
||
|
||
```bash
|
||
# Datenbank
|
||
docker compose exec -T db mariadb-dump -usteuerkram -psteuerkram steuerkram > backup.sql
|
||
|
||
# Dateien
|
||
tar czf backup-dateien.tar.gz data/belege data/logo
|
||
```
|
||
|
||
Ein Backup ist nur zusammen vollständig: Ohne `data/belege` verweisen die
|
||
Beleg-Datensätze der Datenbank ins Leere.
|