components([ Section::make(__('FTP-Verbindung')) ->description(__('Globale Parameter für den vsftpd-Container.')) ->schema([ TextInput::make('ftp_port') ->numeric() ->required() ->minValue(1) ->maxValue(65535) ->helperText(__('Standard: Port 2121 innerhalb des internen Netzwerks.')), TextInput::make('rate_limit_per_minute') ->label(__('Uploads pro Minute')) ->numeric() ->required() ->minValue(1) ->maxValue(200) ->helperText(__('Harte Rate-Limits für Photobooth-Clients.')), TextInput::make('expiry_grace_days') ->label(__('Ablauf (Tage nach Eventende)')) ->numeric() ->required() ->minValue(0) ->maxValue(14), ])->columns(3), Section::make(__('Sicherheit & Steuerung')) ->schema([ Toggle::make('require_ftps') ->label(__('FTPS erzwingen')) ->helperText(__('Aktivieren, wenn nur verschlüsselte FTP-Verbindungen erlaubt sein sollen.')), TagsInput::make('allowed_ip_ranges') ->label(__('Erlaubte IP-Ranges (optional)')) ->placeholder('10.0.0.0/24') ->helperText(__('Liste optionaler CIDR-Ranges für Control-Service Allowlisting.')), TextInput::make('control_service_base_url') ->label(__('Control-Service URL')) ->url() ->maxLength(191) ->helperText(__('REST-Endpunkt des Provisioning-Sidecars (z. B. http://control:8080).')), TextInput::make('control_service_token_identifier') ->label(__('Token Referenz')) ->maxLength(191) ->helperText(__('Bezeichner des Secrets im Secrets-Store (keine Klartext-Tokens speichern).')), ])->columns(2), ]); } }