Name no vendor in the export settings
tests / pest (push) Failing after 7m36s Details
tests / assets (push) Successful in 21s Details
tests / release (push) Has been skipped Details

A destination is a kind of connection, not a product. The wording said "Hetzner
Storage Box" and the host field suggested one particular provider's hostname
format, which reads as a requirement rather than an example — and the whole
point of the directory kind is that whatever is behind it is nobody's business
here.

Both kinds stay. A directory is how an NFS 4.1 mount is used: the mount is made
on the server, and the application writes into the path it produces. SFTP is for
a destination that is not mounted.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat/granted-plans
nexxo 2026-07-29 02:49:33 +02:00
parent f0ec2fe03f
commit 0528b56a32
4 changed files with 9 additions and 9 deletions

View File

@ -20,8 +20,8 @@ use RuntimeException;
* target can change without a line of code changing with it, and the whole
* thing stays testable against a temporary directory.
*
* 'sftp' is for something reachable over the network with credentials a
* Hetzner Storage Box being the obvious one. The password is encrypted on the
* 'sftp' is for something reachable over the network with credentials that is not
* mounted. The password is encrypted on the
* row with the same cipher the credential vault uses: a credential in a
* settings table in the clear is a credential in every database dump.
*

View File

@ -66,9 +66,9 @@ return [
'target' => [
'name' => 'Bezeichnung',
'driver' => 'Art',
'driver_local' => 'Verzeichnis auf diesem Server (Mount)',
'driver_sftp' => 'SFTP (z. B. Hetzner Storage Box)',
'driver_hint' => 'Ein Verzeichnis ist alles, was dieser Server schon beschreiben kann — eine NAS über NFS, ein Bind-Mount, eine Platte. Welches Protokoll dahinter steckt, geht die Anwendung nichts an.',
'driver_local' => 'Verzeichnis auf diesem Server (NFS, SMB, Platte)',
'driver_sftp' => 'SFTP (Speicher bei einem Anbieter)',
'driver_hint' => 'Ein Verzeichnis ist alles, was dieser Server schon beschreiben kann — eine NAS über NFS 4.1, ein Bind-Mount, eine Platte. Der Mount wird auf dem Server eingerichtet; welches Protokoll dahintersteckt, geht die Anwendung nichts an. SFTP ist für Gegenstellen, die nicht gemountet sind.',
'path' => 'Pfad',
'path_local_hint' => 'Absoluter Pfad. Der Einhängepunkt selbst wird nie angelegt — fehlt er, gilt der Mount als weg und es wird nichts geschrieben.',
'path_sftp_hint' => 'Verzeichnis auf der Gegenstelle.',

View File

@ -66,9 +66,9 @@ return [
'target' => [
'name' => 'Name',
'driver' => 'Kind',
'driver_local' => 'Directory on this server (mount)',
'driver_sftp' => 'SFTP (a Hetzner Storage Box, for instance)',
'driver_hint' => 'A directory is anything this server can already write to — a NAS over NFS, a bind mount, a disk. Which protocol is behind it is no business of the application.',
'driver_local' => 'Directory on this server (NFS, SMB, disk)',
'driver_sftp' => 'SFTP (storage at a provider)',
'driver_hint' => 'A directory is anything this server can already write to — a NAS over NFS 4.1, a bind mount, a disk. The mount is set up on the server, and which protocol is behind it is no business of the application. SFTP is for a destination that is not mounted.',
'path' => 'Path',
'path_local_hint' => 'Absolute path. The mount point itself is never created — if it is missing, the mount counts as gone and nothing is written.',
'path_sftp_hint' => 'Directory on the far side.',

View File

@ -20,7 +20,7 @@
@if ($driver === 'sftp')
<div class="grid gap-4 sm:grid-cols-3">
<div class="sm:col-span-2"><x-ui.input name="host" wire:model="host" :label="__('finance.target.host')" placeholder="uXXXXXX.your-storagebox.de" /></div>
<div class="sm:col-span-2"><x-ui.input name="host" wire:model="host" :label="__('finance.target.host')" placeholder="backup.example.com" /></div>
<x-ui.input name="port" wire:model="port" type="number" :label="__('finance.target.port')" />
</div>
<x-ui.input name="username" wire:model="username" :label="__('finance.target.username')" />