feat: Phase 0 – Gerüst (FastAPI+SQLite, Multi-User-Login, React-App-Shell, Deploy)

Grundgerüst für Certain Finance:
- Backend: FastAPI + SQLAlchemy + SQLite, Alembic-Migrationen (Batch-Mode),
  argon2-Passwort-Hashing, server-seitige Sitzungen im Cookie, Erst-Admin,
  Benutzerverwaltung mit Temporär-Passwort, Einstellungen je Benutzer.
- Ein Prozess, ein Port: uvicorn liefert API (/api) und gebautes SPA aus,
  inkl. SPA-Deeplink-Fallback.
- Frontend: React 18 + Vite + JSX, Design-Tokens (Light/Dark), i18n DE/EN,
  Inline-SVG-Icons (keine Emojis), Login, Passwort-ändern, Dashboard-Platzhalter,
  Benutzer- und Einstellungsseiten.
- Deploy: nativer LXC-Installer + Update-Skript (systemd), env-Vorlage, Doku.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-19 18:27:42 +02:00
co-authored by Claude Opus 4.8
commit 2c795a57c8
59 changed files with 6419 additions and 0 deletions
+85
View File
@@ -0,0 +1,85 @@
{
"common": {
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"create": "Create",
"edit": "Edit",
"loading": "Loading…",
"logout": "Log out",
"admin": "Administrator",
"user": "User",
"close": "Close",
"retry": "Try again",
"actions": "Actions"
},
"nav": {
"overview": "Overview",
"accounts": "Accounts",
"categories": "Categories",
"transactions": "Transactions",
"budget": "Budget",
"import": "Import",
"system": "System",
"users": "Users",
"settings": "Settings"
},
"login": {
"subtitle": "Please sign in",
"username": "Username",
"password": "Password",
"submit": "Sign in",
"error": "Wrong username or password",
"expired": "Your session has expired. Please sign in again."
},
"changepw": {
"title": "Change password",
"forcedHint": "Please set your own password before continuing.",
"current": "Current password",
"new": "New password",
"repeat": "Repeat new password",
"submit": "Save password",
"mismatch": "The new passwords do not match.",
"saved": "Password changed."
},
"users": {
"title": "Users",
"new": "New user",
"username": "Username",
"displayName": "Display name",
"password": "Temporary password",
"passwordHint": "The user will be asked to change it on first login.",
"role": "Role",
"status": "Status",
"active": "Active",
"inactive": "Disabled",
"resetPassword": "Reset password",
"deleteConfirm": "Really delete this user?",
"created": "User created.",
"you": "(you)"
},
"settings": {
"title": "Settings",
"baseCurrency": "Base currency",
"baseCurrencyHint": "Currency for budget totals and dashboard aggregates.",
"locale": "Language",
"theme": "Appearance",
"themeSystem": "Automatic (system)",
"themeLight": "Light",
"themeDark": "Dark",
"budgetStartDay": "Budget month starts on",
"budgetStartDayHint": "Day your budget month starts (e.g. the 25th).",
"dateFormat": "Date format",
"saved": "Saved.",
"languageDe": "German",
"languageEn": "English"
},
"dashboard": {
"title": "Overview",
"empty": "No cards yet. The dashboard will be built out in a later phase."
},
"server": {
"unreachable": "Server unreachable.",
"sessionKept": "Your session is still valid – once the server responds again, it will continue."
}
}