feat: Projektgerüst, Datenmodell und initiale Migration
Schritt 1: src-Layout mit FastAPI-Stack, SQLAlchemy-2.x-Modell inkl. Buchführung für Kopiermodus und Quarantäne, Alembic-Migration 0001, strukturierte Logs, CLI (migrate/version), Changelog und Devlog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
# Devlog
|
||||
|
||||
Arbeitsprotokoll mit Zeiterfassung. Ein Eintrag pro Arbeitsblock, neueste oben.
|
||||
Zeiten in Ortszeit (Europe/Berlin).
|
||||
|
||||
## Zeitübersicht
|
||||
|
||||
| Datum | Von | Bis | Dauer | Schritt | Thema |
|
||||
|------------|-------|-------|-------|---------|----------------------------------------|
|
||||
| 2026-10-10 | 17:21 | 17:27 | 0:06 | 1 | Gerüst, Datenmodell, Migrationen |
|
||||
| **Summe** | | | **0:06** | | |
|
||||
|
||||
---
|
||||
|
||||
## 2026-10-10 · 17:21–17:27 · Schritt 1: Gerüst, Datenmodell, Migrationen
|
||||
|
||||
**Erledigt**
|
||||
- Repo angelegt, venv (lokal Python 3.14; Code zielt auf ≥ 3.12, Debian 13 liefert 3.13).
|
||||
`python3-venv` fehlt auf der Entwicklungsmaschine → venv mit `--without-pip` + `get-pip`.
|
||||
- `pyproject.toml` (hatchling, src-Layout), ruff + mypy strict.
|
||||
- Datenmodell nach Spezifikation plus Ergänzungen (siehe Docstring `models.py`):
|
||||
`credentials.domain`, `mounts.state_since/write_ok/root_squash/last_test_*`,
|
||||
`rules.op_timeout_seconds/quarantine_after`, `runs.status/trigger/dry_run`,
|
||||
Tabelle `file_failures`, `copied_files.mtime_ns` statt Float-`mtime`.
|
||||
- Alembic-Migration 0001; Migrationen liegen im Paket, damit sie mit installiert werden.
|
||||
- 10 Tests: Schema = Modell (kein Drift), Down-/Upgrade, Defaults, UTC-Roundtrip,
|
||||
RESTRICT bei benutzten Mounts/Zugangsdaten, CASCADE bei Regeln, Eindeutigkeit
|
||||
in `copied_files`, CHECK-Constraints der Enums.
|
||||
|
||||
**Entscheidungen**
|
||||
- Enums als `VARCHAR` + `CHECK` (kein natives Enum; SQLite kann das ohnehin nicht).
|
||||
- `UTCDateTime` lehnt naive `datetime` ab, statt sie still als UTC zu interpretieren.
|
||||
- SQLite mit WAL, `foreign_keys=ON`, `busy_timeout=5000` (Scheduler + Web + Worker-Threads).
|
||||
|
||||
**Stolpersteine**
|
||||
- Alembic-Autogenerate erzeugt CHECK-Constraints bei `Enum(create_constraint=True)`
|
||||
dreifach → explizite `CheckConstraint`-Zeilen aus der Migration entfernt.
|
||||
- Test deckte auf: ORM setzt ohne `passive_deletes` `mounts.cred_id` auf NULL,
|
||||
statt das `RESTRICT` greifen zu lassen. Behoben.
|
||||
|
||||
**Offen / nächster Schritt**
|
||||
- Schritt 2: Mount-Schicht, Validierung, `FakeMountBackend`, Fernet-Verschlüsselung.
|
||||
Reference in New Issue
Block a user