* fix: Resolve database encryption atomicity issues and enhance debugging (#430)

* fix: Resolve database encryption atomicity issues and enhance debugging

This commit addresses critical data corruption issues caused by non-atomic
file writes during database encryption, and adds comprehensive diagnostic
logging to help debug encryption-related failures.

**Problem:**
Users reported "Unsupported state or unable to authenticate data" errors
when starting the application after system crashes or Docker container
restarts. The root cause was non-atomic writes of encrypted database files:

1. Encrypted data file written (step 1)
2. Metadata file written (step 2)
→ If process crashes between steps 1 and 2, files become inconsistent
→ New IV/tag in data file, old IV/tag in metadata
→ GCM authentication fails on next startup
→ User data permanently inaccessible

**Solution - Atomic Writes:**

1. Write-to-temp + atomic-rename pattern:
   - Write to temporary files (*.tmp-timestamp-pid)
   - Perform atomic rename operations
   - Clean up temp files on failure

2. Data integrity validation:
   - Add dataSize field to metadata
   - Verify file size before decryption
   - Early detection of corrupted writes

3. Enhanced error diagnostics:
   - Key fingerprints (SHA256 prefix) for verification
   - File modification timestamps
   - Detailed GCM auth failure messages
   - Automatic diagnostic info generation

**Changes:**

database-file-encryption.ts:
- Implement atomic write pattern in encryptDatabaseFromBuffer
- Implement atomic write pattern in encryptDatabaseFile
- Add dataSize field to EncryptedFileMetadata interface
- Validate file size before decryption in decryptDatabaseToBuffer
- Enhanced error messages for GCM auth failures
- Add getDiagnosticInfo() function for comprehensive debugging
- Add debug logging for all encryption/decryption operations

system-crypto.ts:
- Add detailed logging for DATABASE_KEY initialization
- Log key source (env var vs .env file)
- Add key fingerprints to all log messages
- Better error messages when key loading fails

db/index.ts:
- Automatically generate diagnostic info on decryption failure
- Log detailed debugging information to help users troubleshoot

**Debugging Info Added:**

- Key initialization: source, fingerprint, length, path
- Encryption: original size, encrypted size, IV/tag prefixes, temp paths
- Decryption: file timestamps, metadata content, key fingerprint matching
- Auth failures: .env file status, key availability, file consistency
- File diagnostics: existence, readability, size validation, mtime comparison

**Backward Compatibility:**
- dataSize field is optional (metadata.dataSize?: number)
- Old encrypted files without dataSize continue to work
- No migration required

**Testing:**
- Compiled successfully
- No breaking changes to existing APIs
- Graceful handling of legacy v1 encrypted files

Fixes data loss issues reported by users experiencing container restarts
and system crashes during database saves.

* fix: Cleanup PR

* Update src/backend/utils/database-file-encryption.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/backend/utils/database-file-encryption.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/backend/utils/database-file-encryption.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/backend/utils/database-file-encryption.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/backend/utils/database-file-encryption.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: Merge metadata and DB into 1 file

* fix: Add initial command palette

* Feature/german language support (#431)

* Update translation.json

Fixed some translation issues for German, made it more user friendly and common.

* Update translation.json

added updated block for serverStats

* Update translation.json

Added translations

* Update translation.json

Removed duplicate of "free":"Free"

* feat: Finalize command palette

* fix: Several bug fixes for terminals, server stats, and general feature improvements

* feat: Enhanced security, UI improvements, and animations (#432)

* fix: Remove empty catch blocks and add error logging

* refactor: Modularize server stats widget collectors

* feat: Add i18n support for terminal customization and login stats

- Add comprehensive terminal customization translations (60+ keys) for appearance, behavior, and advanced settings across all 4 languages
- Add SSH login statistics translations
- Update HostManagerEditor to use i18n for all terminal customization UI elements
- Update LoginStatsWidget to use i18n for all UI text
- Add missing logger imports in backend files for improved debugging

* feat: Add keyboard shortcut enhancements with Kbd component

- Add shadcn kbd component for displaying keyboard shortcuts
- Enhance file manager context menu to display shortcuts with Kbd component
- Add 5 new keyboard shortcuts to file manager:
  - Ctrl+D: Download selected files
  - Ctrl+N: Create new file
  - Ctrl+Shift+N: Create new folder
  - Ctrl+U: Upload files
  - Enter: Open/run selected file
- Add keyboard shortcut hints to command palette footer
- Create helper function to parse and render keyboard shortcuts

* feat: Add i18n support for command palette

- Add commandPalette translation section with 22 keys to all 4 languages
- Update CommandPalette component to use i18n for all UI text
- Translate search placeholder, group headings, menu items, and shortcut hints
- Support multilingual command palette interface

* feat: Add smooth transitions and animations to UI

- Add fade-in/fade-out transition to command palette (200ms)
- Add scale animation to command palette on open/close
- Add smooth popup animation to context menu (150ms)
- Add visual feedback for file selection with ring effect
- Add hover scale effect to file grid items
- Add transition-all to list view items for consistent behavior
- Zero JavaScript overhead, pure CSS transitions
- All animations under 200ms for instant feel

* feat: Add button active state and dashboard card animations

- Add active:scale-95 to all buttons for tactile click feedback
- Add hover border effect to dashboard cards (150ms transition)
- Add pulse animation to dashboard loading states
- Pure CSS transitions with zero JavaScript overhead
- Improves enterprise-level feel of UI

* feat: Add smooth macOS-style page transitions

- Add fullscreen crossfade transition for login/logout (300ms fade-out + 400ms fade-in)
- Add slide-in-from-right animation for all page switches (Dashboard, Terminal, SSH Manager, Admin, Profile)
- Fix TypeScript compilation by adding esModuleInterop to tsconfig.node.json
- Pass handleLogout from DesktopApp to LeftSidebar for consistent transition behavior

All page transitions now use Tailwind animate-in utilities with 300ms duration for smooth, native-feeling UX

* fix: Add key prop to force animation re-trigger on tab switch

Each page container now has key={currentTab} to ensure React unmounts and remounts the element on every tab switch, properly triggering the slide-in animation

* revert: Remove page transition animations

Page switching animations were not noticeable enough and felt unnecessary.
Keep only the login/logout fullscreen crossfade transitions which provide clear visual feedback for authentication state changes

* feat: Add ripple effect to login/logout transitions

Add three-layer expanding ripple animation during fadeOut phase:
- Ripples expand from screen center using primary theme color
- Each layer has staggered delay (0ms, 150ms, 300ms) for wave effect
- Ripples fade out as they expand to create elegant visual feedback
- Uses pure CSS keyframe animation, no external libraries

Total animation: 800ms ripple + 300ms screen fade

* feat: Add smooth TERMIX logo animation to transitions

Changes:
- Extend transition duration from 300ms/400ms to 800ms/600ms for more elegant feel
- Reduce ripple intensity from /20,/15,/10 to /8,/5 for subtlety
- Slow down ripple animation from 0.8s to 2s with cubic-bezier easing
- Add centered TERMIX logo with monospace font and subtitle
- Logo fades in from 80% scale, holds, then fades out at 110% scale
- Total effect: 1.2s logo animation synced with 2s ripple waves

Creates a premium, branded transition experience

* feat: Enhance transition animation with premium details

Timing adjustments:
- Extend fadeOut from 800ms to 1200ms
- Extend fadeIn from 600ms to 800ms
- Slow background fade to 700ms for elegance

Visual enhancements:
- Add 4-layer ripple waves (10%, 7%, 5%, 3% opacity) with staggered delays
- Ripple animation extended to 2.5s with refined opacity curve
- Logo blur effect: starts at 8px, sharpens to 0px, exits at 4px
- Logo glow effect: triple-layer text-shadow using primary theme color
- Increase logo size from text-6xl to text-7xl
- Subtitle delayed fade-in from bottom with smooth slide animation

Creates a cinematic, polished brand experience

* feat: Redesign login page with split-screen cinematic layout

Major redesign of authentication page:

Left Side (40% width):
- Full-height gradient background using primary theme color
- Large TERMIX logo with glow effect
- Subtitle and tagline
- Infinite animated ripple waves (3 layers)
- Hidden on mobile, shows brand identity

Right Side (60% width):
- Centered glassmorphism card with backdrop blur
- Refined tab switcher with pill-style active state
- Enlarged title with gradient text effect
- Added welcome subtitles for better UX
- Card slides in from bottom on load
- All existing functionality preserved

Visual enhancements:
- Tab navigation: segmented control style in muted container
- Active tab: white background with subtle shadow
- Smooth 200ms transitions on all interactions
- Card: rounded-2xl, shadow-xl, semi-transparent border

Creates premium, modern login experience matching transition animations

* feat: Update login page theme colors and add i18n support

- Changed login page gradient from blue to match dark theme colors
- Updated ripple effects to use theme primary color
- Added i18n translation keys for login page (auth.tagline, auth.description, auth.welcomeBack, auth.createAccount, auth.continueExternal)
- Updated all language files (en, zh, de, ru, pt-BR) with new translations
- Fixed TypeScript compilation issues by clearing build cache

* refactor: Use shadcn Tabs component and fix modal styling

- Replace custom tab navigation with shadcn Tabs component
- Restore border-2 border-dark-border for modal consistency
- Remove circular icon from login success message
- Simplify authentication success display

* refactor: Remove ripple effects and gradient from login page

- Remove animated ripple background effects
- Remove gradient background, use solid color (bg-dark-bg-darker)
- Remove text-shadow glow effect from logo
- Simplify brand showcase to clean, minimal design

* feat: Add decorative slash and remove subtitle from login page

- Add decorative slash divider with gradient lines below TERMIX logo
- Remove subtitle text (welcomeBack and createAccount)
- Simplify page title to show only the main heading

* feat: Add diagonal line pattern background to login page

- Replace decorative slash with subtle diagonal line pattern background
- Use repeating-linear-gradient at 45deg angle
- Set very low opacity (0.03) for subtle effect
- Pattern uses theme primary color

* fix: Display diagonal line pattern on login background

- Combine background color and pattern in single style attribute
- Use white semi-transparent lines (rgba 0.03 opacity)
- 45deg angle, 35px spacing, 2px width
- Remove separate overlay div to ensure pattern visibility

* security: Fix user enumeration vulnerability in login

- Unify error messages for invalid username and incorrect password
- Both return 401 status with 'Invalid username or password'
- Prevent attackers from enumerating valid usernames
- Maintain detailed logging for debugging purposes
- Changed from 404 'User not found' to generic auth failure message

* security: Add login rate limiting to prevent brute force attacks

- Implement LoginRateLimiter with IP and username-based tracking
- Block after 5 failed attempts within 15 minutes
- Lock account/IP for 15 minutes after threshold
- Automatic cleanup of expired entries every 5 minutes
- Track remaining attempts in logs for monitoring
- Return 429 status with remaining time on rate limit
- Reset counters on successful login
- Dual protection: both IP-based and username-based limits

* French translation (#434)

* Adding French Language

* Enhancements

* feat: Replace the old ssh tools system with a new dedicated sidebar

* fix: Merge zac/luke

* fix: Finalize new sidebar, improve and loading animations

* Added ability to close non-primary tabs involved in a split view (#435)

* fix: General bug fixes/small feature improvements

* feat: General UI improvements and translation updates

* fix: Command history and file manager styling issues

* feat: General bug fixes, added server stat commands, improved split screen, link accounts, etc

* fix: add Accept header for OIDC callback request (#436)

* Delete DOWNLOADS.md

* fix: add Accept header for OIDC callback request

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix: More bug fixes and QOL fixes

* fix: Server stats not respecting interval and fixed SSH toool type issues

* fix: Remove github links

* fix: Delete account spacing

* fix: Increment version

* fix: Unable to delete hosts and add nginx for terminal

* fix: Unable to delete hosts

* fix: Unable to delete hosts

* fix: Unable to delete hosts

* fix: OIDC/local account linking breaking both logins

* chore: File cleanup

* feat: Max terminal tab size and save current file manager sorting type

* fix: Terminal display issue, migrate host editor to use combobox

* feat: Add snippet folder/customization system

* fix: Fix OIDC linking and prep release

* fix: Increment version

---------

Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Max <herzmaximilian@gmail.com>
Co-authored-by: SlimGary <trash.slim@gmail.com>
Co-authored-by: jarrah31 <jarrah31@gmail.com>
Co-authored-by: Kf637 <mail@kf637.tech>
This commit was merged in pull request #437.
This commit is contained in:
Luke Gustafson
2025-11-17 09:46:05 -06:00
committed by GitHub
parent 38a59f3579
commit 8366c99b0f
104 changed files with 16070 additions and 2821 deletions

View File

@@ -187,11 +187,25 @@
"commandsWillBeSent": "Befehle werden an {{count}} ausgewählte Terminals gesendet.",
"settings": "Einstellungen",
"enableRightClickCopyPaste": "Rechtsklick-Kopieren\/Einfügen aktivieren",
"shareIdeas": "Haben Sie Ideen, was als nächstes für SSH-Tools kommen sollte? Teilen Sie diese mit uns"
"shareIdeas": "Haben Sie Vorschläge welche weiteren SSH-Tools ergänzt werden sollen? Dann teilen Sie diese gerne mit uns auf"
},
"commandHistory": {
"title": "Verlauf",
"searchPlaceholder": "Befehle suchen...",
"noTerminal": "Kein aktives Terminal",
"noTerminalHint": "Öffnen Sie ein Terminal, um dessen Befehlsverlauf anzuzeigen.",
"empty": "Noch kein Befehlsverlauf",
"emptyHint": "Führen Sie Befehle im aktiven Terminal aus, um einen Verlauf zu erstellen.",
"noResults": "Keine Befehle gefunden",
"noResultsHint": "Keine Befehle mit \"{{query}}\" gefunden",
"deleteSuccess": "Befehl aus Verlauf gelöscht",
"deleteFailed": "Befehl konnte nicht gelöscht werden.",
"deleteTooltip": "Befehl löschen",
"tabHint": "Verwenden Sie Tab im Terminal, um aus dem Befehlsverlauf zu vervollständigen"
},
"homepage": {
"loggedInTitle": "Eingeloggt!",
"loggedInMessage": "Sie sind angemeldet! Über die Seitenleiste haben Sie Zugriff auf alle verfügbaren Tools. Erstellen Sie zunächst einen SSH-Host im Tab SSH-Manager. Anschließend können Sie sich über die anderen Apps in der Seitenleiste mit diesem Host verbinden.",
"loggedInMessage": "Sie sind angemeldet! Über die Seitenleiste haben Sie Zugriff auf alle verfügbaren Tools. Erstellen Sie zunächst einen SSH-Host im Tab SSH-Manager. Anschließend können Sie sich über die anderen Apps in der Seitenleiste mit diesem Host verbinden.",
"failedToLoadAlerts": "Warnmeldungen konnten nicht geladen werden",
"failedToDismissAlert": "Benachrichtigung konnte nicht geschlossen werden"
},
@@ -295,6 +309,7 @@
"submit": "Senden",
"change": "Ändern",
"save": "Speichern",
"saving": "Speichern...",
"delete": "Löschen",
"edit": "Bearbeiten",
"add": "Hinzufügen",
@@ -355,7 +370,7 @@
"tabNavigation": "Registerkarte Navigation"
},
"admin": {
"title": "Administratoreinstellungen",
"title": "Admin-Einstellungen",
"oidc": "OIDC",
"users": "Benutzer",
"userManagement": "Benutzerverwaltung",
@@ -390,11 +405,11 @@
"actions": "Aktionen",
"external": "Extern",
"local": "Lokal",
"adminManagement": "Verwaltung von Administratoren",
"adminManagement": "Admin Verwaltung",
"makeUserAdmin": "Benutzer zum Administrator machen",
"adding": "Hinzufügen...",
"currentAdmins": "Aktuelle Administratoren",
"adminBadge": "Administrator",
"adminBadge": "Admin",
"removeAdminButton": "Administrator entfernen",
"general": "Allgemein",
"userRegistration": "Benutzerregistrierung",
@@ -416,6 +431,13 @@
"userDeletedSuccessfully": "Benutzer {{username}} wurde erfolgreich gelöscht",
"failedToDeleteUser": "Benutzer konnte nicht gelöscht werden",
"overrideUserInfoUrl": "URL für Benutzerinformationen überschreiben (nicht erforderlich)",
"failedToFetchSessions": "Fehler beim Abrufen der Sitzungen",
"sessionRevokedSuccessfully": "Sitzung erfolgreich widerrufen",
"failedToRevokeSession": "Sitzung konnte nicht widerrufen werden",
"confirmRevokeSession": "Möchten Sie diese Sitzung wirklich beenden?",
"confirmRevokeAllSessions": "Möchten Sie wirklich alle Sitzungen dieses Benutzers beenden?",
"failedToRevokeSessions": "Sitzungen konnten nicht widerrufen werden",
"sessionsRevokedSuccessfully": "Sitzungen erfolgreich beendet",
"databaseSecurity": "Datenbanksicherheit",
"encryptionStatus": "Verschlüsselungsstatus",
"encryptionEnabled": "Verschlüsselung aktiviert",
@@ -620,7 +642,7 @@
"autoStartContainer": "Automatischer Start beim Container-Start",
"autoStartDesc": "Diesen Tunnel beim Start des Containers automatisch starten",
"addConnection": "Tunnelverbindung hinzufügen",
"sshpassRequired": "Sshpass erforderlich für die Passwort-Authentifizierung",
"sshpassRequired": "sshpass erforderlich für die Passwort-Authentifizierung",
"sshpassRequiredDesc": "Für die Passwortauthentifizierung in Tunneln muss sshpass auf dem System installiert sein.",
"otherInstallMethods": "Andere Installationsmethoden:",
"debianUbuntuEquivalent": "(Debian\/Ubuntu) oder das entsprechende Pendant für Ihr Betriebssystem.",
@@ -699,11 +721,85 @@
"statusMonitoring": "Status",
"metricsMonitoring": "Metriken",
"terminalCustomizationNotice": "Hinweis: Terminal-Anpassungen funktionieren nur in der Desktop-Website-Version. Mobile und Electron-Apps verwenden die Standard-Terminaleinstellungen des Systems.",
"terminalCustomization": "Terminal-Anpassung",
"appearance": "Aussehen",
"behavior": "Verhalten",
"advanced": "Erweitert",
"themePreview": "Themen-Vorschau",
"theme": "Thema",
"selectTheme": "Thema auswählen",
"chooseColorTheme": "Wählen Sie ein Farbthema für das Terminal",
"fontFamily": "Schriftfamilie",
"selectFont": "Schriftart auswählen",
"selectFontDesc": "Wählen Sie die im Terminal zu verwendende Schriftart",
"fontSize": "Schriftgröße",
"fontSizeValue": "Schriftgröße: {{value}}px",
"adjustFontSize": "Terminal-Schriftgröße anpassen",
"letterSpacing": "Zeichenabstand",
"letterSpacingValue": "Zeichenabstand: {{value}}px",
"adjustLetterSpacing": "Abstand zwischen Zeichen anpassen",
"lineHeight": "Zeilenhöhe",
"lineHeightValue": "Zeilenhöhe: {{value}}",
"adjustLineHeight": "Abstand zwischen Zeilen anpassen",
"cursorStyle": "Cursor-Stil",
"selectCursorStyle": "Cursor-Stil auswählen",
"cursorStyleBlock": "Block",
"cursorStyleUnderline": "Unterstrich",
"cursorStyleBar": "Balken",
"chooseCursorAppearance": "Cursor-Erscheinungsbild wählen",
"cursorBlink": "Cursor-Blinken",
"enableCursorBlink": "Cursor-Blinkanimation aktivieren",
"scrollbackBuffer": "Rückwärts-Puffer",
"scrollbackBufferValue": "Rückwärts-Puffer: {{value}} Zeilen",
"scrollbackBufferDesc": "Anzahl der Zeilen im Rückwärtsverlauf",
"bellStyle": "Signalton-Stil",
"selectBellStyle": "Signalton-Stil auswählen",
"bellStyleNone": "Keine",
"bellStyleSound": "Ton",
"bellStyleVisual": "Visuell",
"bellStyleBoth": "Beides",
"bellStyleDesc": "Behandlung des Terminal-Signaltons (BEL-Zeichen, \\x07). Programme lösen dies aus, wenn Aufgaben abgeschlossen werden, Fehler auftreten oder für Benachrichtigungen. \"Ton\" spielt einen akustischen Signalton ab, \"Visuell\" lässt den Bildschirm kurz aufblinken, \"Beides\" macht beides, \"Keine\" deaktiviert Signalton-Benachrichtigungen.",
"rightClickSelectsWord": "Rechtsklick wählt Wort",
"rightClickSelectsWordDesc": "Rechtsklick wählt das Wort unter dem Cursor aus",
"fastScrollModifier": "Schnellscroll-Modifikator",
"selectModifier": "Modifikator auswählen",
"modifierAlt": "Alt",
"modifierCtrl": "Strg",
"modifierShift": "Umschalt",
"fastScrollModifierDesc": "Modifikatortaste für schnelles Scrollen",
"fastScrollSensitivity": "Schnellscroll-Empfindlichkeit",
"fastScrollSensitivityValue": "Schnellscroll-Empfindlichkeit: {{value}}",
"fastScrollSensitivityDesc": "Scroll-Geschwindigkeitsmultiplikator bei gedrücktem Modifikator",
"minimumContrastRatio": "Minimales Kontrastverhältnis",
"minimumContrastRatioValue": "Minimales Kontrastverhältnis: {{value}}",
"minimumContrastRatioDesc": "Farben automatisch für bessere Lesbarkeit anpassen",
"sshAgentForwarding": "SSH-Agent-Weiterleitung",
"sshAgentForwardingDesc": "SSH-Authentifizierungsagent an Remote-Host weiterleiten",
"backspaceMode": "Rücktaste-Modus",
"selectBackspaceMode": "Rücktaste-Modus auswählen",
"backspaceModeNormal": "Normal (DEL)",
"backspaceModeControlH": "Control-H (^H)",
"backspaceModeDesc": "Rücktasten-Verhalten für Kompatibilität",
"startupSnippet": "Start-Snippet",
"selectSnippet": "Snippet auswählen",
"searchSnippets": "Snippets durchsuchen...",
"snippetNone": "Keine",
"noneAuthTitle": "Keyboard-Interactive-Authentifizierung",
"noneAuthDescription": "Diese Authentifizierungsmethode verwendet beim Herstellen der Verbindung zum SSH-Server die Keyboard-Interactive-Authentifizierung.",
"noneAuthDetails": "Keyboard-Interactive-Authentifizierung ermöglicht dem Server, Sie während der Verbindung zur Eingabe von Anmeldeinformationen aufzufordern. Dies ist nützlich für Server, die eine Multi-Faktor-Authentifizierung oder eine dynamische Passworteingabe erfordern.",
"forceKeyboardInteractive": "Tastatur-Interaktiv erzwingen",
"forceKeyboardInteractiveDesc": "Erzwingt die Verwendung der tastatur-interaktiven Authentifizierung. Dies ist oft für Server erforderlich, die eine Zwei-Faktor-Authentifizierung (TOTP/2FA) verwenden."
"forceKeyboardInteractiveDesc": "Erzwingt die Verwendung der tastatur-interaktiven Authentifizierung. Dies ist oft für Server erforderlich, die eine Zwei-Faktor-Authentifizierung (TOTP/2FA) verwenden.",
"overrideCredentialUsername": "Benutzernamen der Anmeldedaten überschreiben",
"overrideCredentialUsernameDesc": "Verwenden Sie einen anderen Benutzernamen als den, der in den Anmeldedaten gespeichert ist. Dadurch können Sie dieselben Anmeldedaten mit unterschiedlichen Benutzernamen verwenden.",
"jumpHosts": "Jump-Hosts",
"jumpHostsDescription": "Jump-Hosts (auch bekannt als Bastion-Hosts) ermöglichen es Ihnen, sich über einen oder mehrere Zwischen-Server mit einem Ziel-Server zu verbinden. Dies ist nützlich für den Zugriff auf Server hinter Firewalls oder in privaten Netzwerken.",
"jumpHostChain": "Jump-Host-Kette",
"addJumpHost": "Jump-Host hinzufügen",
"selectServer": "Server auswählen",
"searchServers": "Server durchsuchen...",
"noServerFound": "Kein Server gefunden",
"jumpHostsOrder": "Verbindungen werden in dieser Reihenfolge hergestellt: Jump-Host 1 → Jump-Host 2 → ... → Ziel-Server",
"advancedAuthSettings": "Erweiterte Authentifizierungseinstellungen"
},
"terminal": {
"title": "Terminal",
@@ -819,6 +915,8 @@
"copy": "Kopieren",
"cut": "Ausschneiden",
"paste": "Einfügen",
"copyPath": "Pfad kopieren",
"copyPaths": "Pfade kopieren",
"delete": "Löschen",
"properties": "Eigenschaften",
"refresh": "Aktualisieren",
@@ -828,6 +926,9 @@
"deleteFiles": "{{count}} Element(e) löschen",
"filesCopiedToClipboard": "{{count}} Element(e) in die Zwischenablage kopiert",
"filesCutToClipboard": "{{count}} Element(e) in die Zwischenablage ausschneiden",
"pathCopiedToClipboard": "Pfad in Zwischenablage kopiert",
"pathsCopiedToClipboard": "{{count}} Pfade in Zwischenablage kopiert",
"failedToCopyPath": "Fehler beim Kopieren des Pfades in die Zwischenablage",
"movedItems": "{{count}} Element(e) verschoben",
"failedToDeleteItem": "Das Löschen des Elements ist fehlgeschlagen.",
"itemRenamedSuccessfully": "{{type}} erfolgreich umbenannt",
@@ -1072,7 +1173,7 @@
"used": "Gebraucht",
"percentage": "Prozentsatz",
"refreshStatusAndMetrics": "Aktualisierungsstatus und Metriken",
"refreshStatus": "Aktualisierungsstatus",
"refreshStatus": "Aktualisieren",
"fileManagerAlreadyOpen": "Der Dateimanager ist für diesen Host bereits geöffnet",
"openFileManager": "Dateimanager öffnen",
"cpuCores_one": "{{count}} CPU",
@@ -1081,9 +1182,10 @@
"loadAverageNA": "Durchschnitt: N\/A",
"cpuUsage": "CPU-Auslastung",
"memoryUsage": "Speicherauslastung",
"diskUsage": "Festplattennutzung",
"rootStorageSpace": "Root-Speicherplatz",
"of": "von",
"feedbackMessage": "Haben Sie Ideen für die nächsten Schritte im Bereich der Serververwaltung? Teilen Sie diese mit uns",
"feedbackMessage": "Haben Sie Ideen, wie es bei der Serververwaltung weitergehen könnte? Dann teilen Sie diese gerne mit uns auf",
"failedToFetchHostConfig": "Abrufen der Hostkonfiguration fehlgeschlagen",
"failedToFetchStatus": "Abrufen des Serverstatus fehlgeschlagen",
"failedToFetchMetrics": "Abrufen der Servermetriken fehlgeschlagen",
@@ -1092,9 +1194,40 @@
"refreshing": "Aktualisieren...",
"serverOffline": "Server offline",
"cannotFetchMetrics": "Metriken können nicht vom Offline-Server abgerufen werden",
"load": "Laden"
"load": "Last",
"available": "Verfügbar",
"editLayout": "Layout anpassen",
"cancelEdit": "Abbrechen",
"addWidget": "Widget hinzufügen",
"saveLayout": "Layout speichern",
"unsavedChanges": "Ungespeicherte Änderungen",
"layoutSaved": "Layout erfolgreich gespeichert",
"failedToSaveLayout": "Speichern des Layout fehlgeschlagen",
"systemInfo": "System Information",
"hostname": "Hostname",
"operatingSystem": "Betriebssystem",
"kernel": "Kernel",
"totalUptime": "Gesamte Betriebszeit",
"seconds": "Sekunden",
"networkInterfaces": "Netzwerkschnittstellen",
"noInterfacesFound": "Keine Netzwerkschnittstellen gefunden",
"totalProcesses": "Gesamtprozesse",
"running": "läuft",
"noProcessesFound": "Keine Prozesse gefunden",
"loginStats": "SSH-Anmeldestatistiken",
"totalLogins": "Gesamtanmeldungen",
"uniqueIPs": "Eindeutige IPs",
"recentSuccessfulLogins": "Letzte erfolgreiche Anmeldungen",
"recentFailedAttempts": "Letzte fehlgeschlagene Versuche",
"noRecentLoginData": "Keine aktuellen Anmeldedaten",
"from": "von"
},
"auth": {
"tagline": "SSH SERVER MANAGER",
"description": "Sichere, leistungsstarke und intuitive SSH-Verbindungsverwaltung",
"welcomeBack": "Willkommen zurück bei TERMIX",
"createAccount": "Erstellen Sie Ihr TERMIX-Konto",
"continueExternal": "Mit externem Anbieter fortfahren",
"loginTitle": "Melden Sie sich bei Termix an",
"registerTitle": "Benutzerkonto erstellen",
"loginButton": "Anmelden",
@@ -1260,6 +1393,10 @@
"local": "Lokal",
"external": "Extern (OIDC)",
"selectPreferredLanguage": "Wählen Sie Ihre bevorzugte Sprache für die Benutzeroberfläche",
"fileColorCoding": "Dateifarb-Codierung",
"fileColorCodingDesc": "Farbcodierung von Dateien nach Typ: Ordner (rot), Dateien (blau), Symlinks (grün)",
"commandAutocomplete": "Befehlsautovervollständigung",
"commandAutocompleteDesc": "Tab-Taste Autovervollständigung für Terminal-Befehle basierend auf Ihrem Befehlsverlauf aktivieren",
"currentPassword": "Aktuelles Passwort",
"passwordChangedSuccess": "Passwort erfolgreich geändert! Bitte melden Sie sich erneut an.",
"failedToChangePassword": "Passwort konnte nicht geändert werden. Bitte überprüfen Sie Ihr aktuelles Passwort und versuchen Sie es erneut."
@@ -1372,7 +1509,7 @@
"disconnected": "Getrennt",
"maxRetriesExhausted": "Maximale Wiederholungsversuche ausgeschöpft",
"endpointHostNotFound": "Endpunkthost nicht gefunden",
"administrator": "Administrator",
"administrator": "Admin",
"user": "Benutzer",
"external": "Extern",
"local": "Lokal",
@@ -1474,5 +1611,28 @@
"cpu": "CPU",
"ram": "RAM",
"notAvailable": "Nicht verfügbar"
},
"commandPalette": {
"searchPlaceholder": "Nach Hosts oder Schnellaktionen suchen...",
"recentActivity": "Kürzliche Aktivität",
"navigation": "Navigation",
"addHost": "Host hinzufügen",
"addCredential": "Anmeldedaten hinzufügen",
"adminSettings": "Admin-Einstellungen",
"userProfile": "Benutzerprofil",
"updateLog": "Aktualisierungsprotokoll",
"hosts": "Hosts",
"openServerDetails": "Serverdetails öffnen",
"openFileManager": "Dateimanager öffnen",
"edit": "Bearbeiten",
"links": "Links",
"github": "GitHub",
"support": "Support",
"discord": "Discord",
"donate": "Spenden",
"press": "Drücken Sie",
"toToggle": "zum Umschalten",
"close": "Schließen",
"hostManager": "Host-Manager"
}
}