Compare commits

..

12 Commits

Author SHA1 Message Date
Lance Pioch
36e99a5bff Fix Unraid template for bridge networking and mail defaults
Address review feedback: fix Redis default from 127.0.0.1 to empty
(localhost won't work in bridge mode), add empty option for mail
encryption scheme, and note HTTPS WebUI limitation in Requires text.
2026-02-06 10:41:51 -05:00
Lance Pioch
27ce43978e Add initial unraid template 2026-02-06 09:49:14 -05:00
Lance Pioch
6a548c09a0 Clarify OAuth error when provider account has no linked email (#2179) 2026-02-06 07:50:37 -05:00
Lance Pioch
55bda569cc Implement flexible caching for node statuses (#2174) 2026-02-06 07:50:20 -05:00
Lance Pioch
adf1249086 Fix Egg Feature modals not working (#2175) 2026-02-06 07:49:56 -05:00
Lance Pioch
dbf77bf146 Implement single file move to support Unix mv semantics (#1984) (#2176) 2026-02-06 07:49:40 -05:00
Frogperson
a34bf9fd49 Add Daemon Base Directory field (#2151)
Co-authored-by: Boy132 <mail@boy132.de>
2026-02-05 08:00:25 -05:00
Boy132
7a9deba0e1 Fix notifications for DeleteAction on EditEgg page (#2165) 2026-02-04 22:20:22 +01:00
Charles
159bfe2210 exclude node actions (#2164) 2026-02-04 06:48:13 -05:00
stdpi
a821db8aae Improve file browser UI (#2086) 2026-02-04 05:40:45 -05:00
Lance Pioch
1556f8efb8 Allow all permissions to be toggled at once for api tokens (#2154) 2026-02-02 08:41:10 -05:00
Lance Pioch
57c2aa6f21 Fix the tabbing for username to password on login (#2155)
Co-authored-by: notCharles <charles@pelican.dev>
2026-02-02 08:40:55 -05:00
19 changed files with 488 additions and 182 deletions

View File

@@ -22,6 +22,7 @@ use Filament\Forms\Components\ToggleButtons;
use Filament\Resources\Pages\PageRegistration;
use Filament\Resources\Resource;
use Filament\Schemas\Components\Fieldset;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
@@ -113,12 +114,44 @@ class ApiKeyResource extends Resource
*/
public static function defaultForm(Schema $schema): Schema
{
$permissionList = ApiKey::getPermissionList();
return $schema
->components([
Section::make(trans('admin/apikey.permissions.all'))
->description(trans('admin/apikey.permissions.all_description'))
->columnSpanFull()
->schema([
ToggleButtons::make('permissions_all')
->hiddenLabel()
->inline()
->options([
0 => trans('admin/apikey.permissions.none'),
1 => trans('admin/apikey.permissions.read'),
3 => trans('admin/apikey.permissions.read_write'),
])
->icons([
0 => TablerIcon::BookOff,
1 => TablerIcon::Book,
3 => TablerIcon::Writing,
])
->colors([
0 => 'success',
1 => 'warning',
3 => 'danger',
])
->live()
->afterStateUpdated(function ($state, callable $set) use ($permissionList) {
foreach ($permissionList as $resource) {
$set('permissions_' . $resource, $state);
}
})
->default(0),
]),
Fieldset::make('Permissions')
->columnSpanFull()
->schema(
collect(ApiKey::getPermissionList())->map(fn ($resource) => ToggleButtons::make('permissions_' . $resource)
collect($permissionList)->map(fn ($resource) => ToggleButtons::make('permissions_' . $resource)
->label(str($resource)->replace('_', ' ')->title())->inline()
->options([
0 => trans('admin/apikey.permissions.none'),

View File

@@ -450,17 +450,7 @@ class EditEgg extends EditRecord
return [
DeleteAction::make()
->disabled(fn (Egg $egg): bool => $egg->servers()->count() > 0)
->tooltip(fn (Egg $egg): string => $egg->servers()->count() <= 0 ? trans('filament-actions::delete.single.label') : trans('admin/egg.in_use'))
->successNotification(fn (Egg $egg) => Notification::make()
->success()
->title(trans('admin/egg.delete_success'))
->body(trans('admin/egg.deleted', ['egg' => $egg->name]))
)
->failureNotification(fn (Egg $egg) => Notification::make()
->danger()
->title(trans('admin/egg.delete_failed'))
->body(trans('admin/egg.could_not_delete', ['egg' => $egg->name]))
),
->tooltip(fn (Egg $egg): string => $egg->servers()->count() <= 0 ? trans('filament-actions::delete.single.label') : trans('admin/egg.in_use')),
ExportEggAction::make(),
ImportEggAction::make()
->multiple(false),

View File

@@ -278,6 +278,14 @@ class CreateNode extends CreateRecord
->default(256)
->minValue(1)
->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB'),
TextInput::make('daemon_base')
->label(trans('admin/node.daemon_base'))
->placeholder('/var/lib/pelican/volumes')
->hintIcon(TablerIcon::QuestionMark, trans('admin/node.daemon_base_help'))
->columnSpan(1)
->required()
->default('/var/lib/pelican/volumes')
->rule('regex:/^([\/][\d\w.\-\/]+)$/'),
TextInput::make('daemon_sftp')
->columnSpan(1)
->label(trans('admin/node.sftp_port'))
@@ -287,7 +295,7 @@ class CreateNode extends CreateRecord
->required()
->integer(),
TextInput::make('daemon_sftp_alias')
->columnSpan(2)
->columnSpan(1)
->label(trans('admin/node.sftp_alias'))
->helperText(trans('admin/node.sftp_alias_help')),
Grid::make()

View File

@@ -314,7 +314,7 @@ class EditNode extends EditRecord
'default' => 1,
'sm' => 1,
'md' => 2,
'lg' => 2,
'lg' => 3,
]),
TextInput::make('upload_size')
->columnSpan([
@@ -329,12 +329,24 @@ class EditNode extends EditRecord
->required()
->minValue(1)
->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB'),
TextInput::make('daemon_base')
->label(trans('admin/node.daemon_base'))
->placeholder('/var/lib/pelican/volumes')
->hintIcon(TablerIcon::QuestionMark, trans('admin/node.daemon_base_help'))
->columnSpan([
'default' => 1,
'sm' => 1,
'md' => 2,
'lg' => 2,
])
->required()
->rule('regex:/^([\/][\d\w.\-\/]+)$/'),
TextInput::make('daemon_sftp')
->columnSpan([
'default' => 1,
'sm' => 1,
'md' => 1,
'lg' => 3,
'md' => 2,
'lg' => 1,
])
->label(trans('admin/node.sftp_port'))
->minValue(1)
@@ -346,8 +358,8 @@ class EditNode extends EditRecord
->columnSpan([
'default' => 1,
'sm' => 1,
'md' => 1,
'lg' => 3,
'md' => 2,
'lg' => 2,
])
->label(trans('admin/node.sftp_alias'))
->helperText(trans('admin/node.sftp_alias_help')),
@@ -356,7 +368,7 @@ class EditNode extends EditRecord
'default' => 1,
'sm' => 1,
'md' => 1,
'lg' => 3,
'lg' => 2,
])
->label(trans('admin/node.use_for_deploy'))
->inline()
@@ -374,7 +386,7 @@ class EditNode extends EditRecord
'default' => 1,
'sm' => 1,
'md' => 1,
'lg' => 3,
'lg' => 2,
])
->label(trans('admin/node.maintenance_mode'))
->inline()
@@ -572,7 +584,7 @@ class EditNode extends EditRecord
->columnSpanFull()
->schema([
Actions::make([
Action::make('autoDeploy')
Action::make('exclude_autoDeploy')
->label(trans('admin/node.auto_deploy'))
->color('primary')
->modalHeading(trans('admin/node.auto_deploy'))
@@ -610,7 +622,7 @@ class EditNode extends EditRecord
}),
])->fullWidth(),
Actions::make([
Action::make('resetKey')
Action::make('exclude_resetKey')
->label(trans('admin/node.reset_token'))
->color('danger')
->requiresConfirmation()

View File

@@ -66,6 +66,14 @@ class Login extends BaseLogin
->extraInputAttributes(['tabindex' => 1]);
}
protected function getPasswordFormComponent(): Component
{
/** @var TextInput $component */
$component = parent::getPasswordFormComponent();
return $component->extraInputAttributes(['tabindex' => 2]);
}
protected function getOAuthFormComponent(): Component
{
$actions = [];

View File

@@ -78,11 +78,15 @@ class Console extends Page
$feature = data_get($data, 'key');
$feature = $this->featureService->get($feature);
if (!$feature || $this->getMountedAction()) {
if (!$feature) {
return;
}
$this->mountAction($feature->getId());
sleep(2); // TODO find a better way
if ($this->getMountedAction()) {
$this->replaceMountedAction($feature->getId());
} else {
$this->mountAction($feature->getId());
}
}
public function getWidgetData(): array

View File

@@ -209,16 +209,18 @@ class ListFiles extends ListRecords
->required()
->live(),
TextEntry::make('new_location')
->state(fn (Get $get, File $file) => resolve_path(join_paths($this->path, $get('location') ?? '/', $file->name))),
->state(fn (Get $get, File $file) => resolve_path(join_paths($this->path, str_ends_with($get('location') ?? '/', '/') ? join_paths($get('location') ?? '/', $file->name) : $get('location') ?? '/'))),
])
->action(function ($data, File $file) {
$location = $data['location'];
$files = [['to' => join_paths($location, $file->name), 'from' => $file->name]];
$endsWithSlash = str_ends_with($location, '/');
$to = $endsWithSlash ? join_paths($location, $file->name) : $location;
$files = [['to' => $to, 'from' => $file->name]];
$this->getDaemonFileRepository()->renameFiles($this->path, $files);
$oldLocation = join_paths($this->path, $file->name);
$newLocation = resolve_path(join_paths($this->path, $location, $file->name));
$newLocation = resolve_path(join_paths($this->path, $to));
Activity::event('server:file.rename')
->property('directory', $this->path)

View File

@@ -74,7 +74,7 @@ class OAuthController extends Controller
$email = $oauthUser->getEmail();
if (!$email) {
return $this->errorRedirect();
return $this->errorRedirect('No email was linked to your account on the OAuth provider.');
}
$user = User::whereEmail($email)->first();

View File

@@ -358,7 +358,7 @@ class Node extends Model implements Validatable
'disk_used' => 0,
];
return cache()->remember("nodes.$this->id.statistics", now()->addSeconds(360), function () use ($default) {
return cache()->flexible("nodes.$this->id.statistics", [5, 30], function () use ($default) {
try {
$data = Http::daemon($this)

View File

@@ -22,7 +22,6 @@ use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Session\Middleware\AuthenticateSession;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\View\Middleware\ShareErrorsFromSession;
use pxlrbt\FilamentSpotlight\SpotlightPlugin;
abstract class PanelProvider extends BasePanelProvider
{
@@ -72,9 +71,6 @@ abstract class PanelProvider extends BasePanelProvider
->authMiddleware([
Authenticate::class,
RequireTwoFactorAuthentication::class,
])
->plugins([
SpotlightPlugin::make(),
]);
}
}

View File

@@ -27,7 +27,6 @@
"phiki/phiki": "^2.0",
"phpseclib/phpseclib": "~3.0.18",
"predis/predis": "^2.3",
"pxlrbt/filament-spotlight": "^2.0",
"s1lentium/iptools": "~1.2.0",
"secondnetwork/blade-tabler-icons": "^3.26",
"socialiteproviders/authentik": "^5.2",

142
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "b237f8d4615d4112d48a3bb424fd5358",
"content-hash": "15f89930db77693b2d692dbadf22fb9f",
"packages": [
{
"name": "anourvalar/eloquent-serialize",
@@ -6603,72 +6603,6 @@
},
"time": "2026-01-30T17:33:13+00:00"
},
{
"name": "pxlrbt/filament-spotlight",
"version": "v2.0.4",
"source": {
"type": "git",
"url": "https://github.com/pxlrbt/filament-spotlight.git",
"reference": "6f76af3b14304aff00d5ae65d16f5d46916b89f5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pxlrbt/filament-spotlight/zipball/6f76af3b14304aff00d5ae65d16f5d46916b89f5",
"reference": "6f76af3b14304aff00d5ae65d16f5d46916b89f5",
"shasum": ""
},
"require": {
"filament/filament": "^3.0|^4.0",
"php": "^8.0",
"wire-elements/spotlight": "^2.0"
},
"require-dev": {
"laravel/pint": "^1.10"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"pxlrbt\\FilamentSpotlight\\SpotlightServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"pxlrbt\\FilamentSpotlight\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Dennis Koch",
"email": "info@pixelarbeit.de"
}
],
"description": "Spotlight for Filament Admin",
"keywords": [
"alfred",
"filament",
"laravel",
"laravel-filament",
"spotlight",
"wire-elements"
],
"support": {
"issues": "https://github.com/pxlrbt/filament-spotlight/issues",
"source": "https://github.com/pxlrbt/filament-spotlight/tree/v2.0.4"
},
"funding": [
{
"url": "https://github.com/pxlrbt",
"type": "github"
}
],
"time": "2025-11-20T22:43:31+00:00"
},
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
@@ -11688,80 +11622,6 @@
"source": "https://github.com/webmozarts/assert/tree/1.11.0"
},
"time": "2022-06-03T18:03:27+00:00"
},
{
"name": "wire-elements/spotlight",
"version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/wire-elements/spotlight.git",
"reference": "69839f33d082c49306161946dbaedc69e525695e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/wire-elements/spotlight/zipball/69839f33d082c49306161946dbaedc69e525695e",
"reference": "69839f33d082c49306161946dbaedc69e525695e",
"shasum": ""
},
"require": {
"illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0",
"livewire/livewire": "^3.0",
"php": "^8.1",
"spatie/laravel-package-tools": "^1.4.3"
},
"require-dev": {
"brianium/paratest": "^6.2|^7.4",
"nunomaduro/collision": "^5.3|^8.0",
"orchestra/testbench": "^6.15|^7.0|^8.0|^9.0|^10.0",
"phpunit/phpunit": "^9.3|^10.5|^11.5.3",
"vimeo/psalm": "^4.4|^5.22|^6.5"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Spotlight": "LivewireUI\\Spotlight\\SpotlightFacade"
},
"providers": [
"LivewireUI\\Spotlight\\SpotlightServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"LivewireUI\\Spotlight\\": "src",
"LivewireUI\\Spotlight\\Database\\Factories\\": "database/factories"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Philo Hermans",
"email": "support@wire-elements.dev",
"role": "Developer"
}
],
"description": "Livewire component that provides Spotlight/Alfred-like functionality to your Laravel application.",
"homepage": "https://github.com/wire-elements/spotlight",
"keywords": [
"laravel",
"livewire-ui",
"spotlight"
],
"support": {
"issues": "https://github.com/wire-elements/spotlight/issues",
"source": "https://github.com/wire-elements/spotlight/tree/2.0.2"
},
"funding": [
{
"url": "https://github.com/PhiloNL",
"type": "github"
}
],
"time": "2025-02-26T07:06:17+00:00"
}
],
"packages-dev": [

View File

@@ -20,6 +20,8 @@ return [
'never_used' => 'Never Used',
],
'permissions' => [
'all' => 'Set All Permissions',
'all_description' => 'Quickly set all permissions below to the same level.',
'none' => 'None',
'read' => 'Read',
'read_write' => 'Read & Write',

View File

@@ -115,10 +115,6 @@ return [
'no_update_url' => 'The following eggs do not have a working update URL set: :eggs',
'cannot_delete' => 'Cannot delete :count egg(s)',
'eggs_have_servers' => 'The following eggs have servers and cannot be deleted: :eggs',
'delete_success' => 'Egg deleted successfully',
'deleted' => 'Deleted: :egg',
'delete_failed' => 'Failed to delete egg',
'could_not_delete' => 'Could not delete: :egg',
'updated_from' => 'Successfully updated from: :url',
'update_error' => 'Error: :error',
'updated_eggs' => 'Updated: :eggs',

View File

@@ -65,6 +65,8 @@ return [
'sftp_port' => 'SFTP Port',
'sftp_alias' => 'SFTP Alias',
'sftp_alias_help' => 'Display alias for the SFTP address. Leave empty to use the Node FQDN.',
'daemon_base' => 'Daemon Base Directory',
'daemon_base_help' => 'The directory where server data will be stored.',
'use_for_deploy' => 'Use for Deployments?',
'maintenance_mode' => 'Maintenance Mode',
'maintenance_mode_help' => 'If the node is marked \'Under Maintenance\' users won\'t be able to access servers that are on that node',

384
pelican-panel.xml Normal file
View File

@@ -0,0 +1,384 @@
<?xml version="1.0"?>
<Container version="2">
<Name>pelican-panel</Name>
<Repository>ghcr.io/pelican-dev/panel:latest</Repository>
<Registry>https://github.com/pelican-dev/panel/pkgs/container/panel</Registry>
<Branch>
<Tag>latest</Tag>
<TagDescription>Latest stable release</TagDescription>
</Branch>
<Branch>
<Tag>develop</Tag>
<TagDescription>Development build (unstable)</TagDescription>
</Branch>
<Network>bridge</Network>
<Shell>sh</Shell>
<Privileged>false</Privileged>
<Support>https://discord.gg/pelican-panel</Support>
<Project>https://pelican.dev</Project>
<Overview>Pelican Panel is an open-source, free game server management panel built with modern PHP and React. It supports Minecraft, Rust, Terraria, CS2, and many more out of the box. Features include multi-user access, server scheduling, file management, and a powerful API.</Overview>
<Category>GameServers: Tools:</Category>
<WebUI>http://[IP]:[PORT:80]</WebUI>
<Icon>https://raw.githubusercontent.com/pelican-dev/panel/main/public/pelican.svg</Icon>
<Requires>Ensure port 80 and 443 are not in use by another container or Unraid's built-in web server. If using HTTPS (APP_URL starts with https://), the WebUI link below will still show HTTP — navigate manually using your HTTPS URL.</Requires>
<ExtraParams>--restart=unless-stopped</ExtraParams>
<!-- Ports -->
<Config
Name="HTTP Port"
Target="80"
Default="80"
Mode="tcp"
Description="Web interface HTTP port."
Type="Port"
Display="always"
Required="true"
Mask="false"
/>
<Config
Name="HTTPS Port"
Target="443"
Default="443"
Mode="tcp"
Description="Web interface HTTPS port. Used when APP_URL starts with https:// and LE_EMAIL is set."
Type="Port"
Display="always"
Required="false"
Mask="false"
/>
<!-- Volumes -->
<Config
Name="Panel Data"
Target="/pelican-data"
Default="/mnt/user/appdata/pelican-panel/data"
Mode="rw"
Description="Persistent storage for the panel (database, .env, uploads, plugins)."
Type="Path"
Display="always"
Required="true"
Mask="false"
/>
<Config
Name="Panel Logs"
Target="/var/www/html/storage/logs"
Default="/mnt/user/appdata/pelican-panel/logs"
Mode="rw"
Description="Application log files."
Type="Path"
Display="always"
Required="false"
Mask="false"
/>
<!-- Core Application Settings -->
<Config
Name="App URL"
Target="APP_URL"
Default="http://[IP]"
Mode=""
Description="The full URL used to access the panel (e.g. http://192.168.1.50 or https://panel.example.com). Must match how you access it in your browser."
Type="Variable"
Display="always"
Required="true"
Mask="false"
/>
<Config
Name="App Environment"
Target="APP_ENV"
Default="production"
Mode=""
Description="Application environment. Leave as production."
Type="Variable"
Display="advanced"
Required="false"
Mask="false"
/>
<Config
Name="Debug Mode"
Target="APP_DEBUG"
Default="false"
Mode=""
Description="Enable debug mode. Only enable for troubleshooting."
Type="Variable"
Display="advanced"
Required="false"
Mask="false"
/>
<!-- Database Configuration -->
<Config
Name="Database Driver"
Target="DB_CONNECTION"
Default="sqlite|mysql|mariadb|pgsql"
Mode=""
Description="Database engine to use. SQLite requires no extra setup and stores data in the Panel Data volume. MySQL/MariaDB/PostgreSQL require a separate database server."
Type="Variable"
Display="always"
Required="true"
Mask="false"
/>
<Config
Name="Database Host"
Target="DB_HOST"
Default=""
Mode=""
Description="Database server hostname or IP. Not needed for SQLite. Use the Unraid IP or container name if running a database container."
Type="Variable"
Display="always"
Required="false"
Mask="false"
/>
<Config
Name="Database Port"
Target="DB_PORT"
Default="3306"
Mode=""
Description="Database server port. Default: 3306 for MySQL/MariaDB, 5432 for PostgreSQL. Not needed for SQLite."
Type="Variable"
Display="always"
Required="false"
Mask="false"
/>
<Config
Name="Database Name"
Target="DB_DATABASE"
Default="panel"
Mode=""
Description="Name of the database. Not needed for SQLite."
Type="Variable"
Display="always"
Required="false"
Mask="false"
/>
<Config
Name="Database Username"
Target="DB_USERNAME"
Default="pelican"
Mode=""
Description="Database user. Not needed for SQLite."
Type="Variable"
Display="always"
Required="false"
Mask="false"
/>
<Config
Name="Database Password"
Target="DB_PASSWORD"
Default=""
Mode=""
Description="Database password. Not needed for SQLite."
Type="Variable"
Display="always"
Required="false"
Mask="true"
/>
<!-- SSL / Let's Encrypt -->
<Config
Name="Let's Encrypt Email"
Target="LE_EMAIL"
Default=""
Mode=""
Description="Email for automatic Let's Encrypt SSL certificates. Only used when APP_URL starts with https://. Leave empty to use HTTP only."
Type="Variable"
Display="always"
Required="false"
Mask="false"
/>
<!-- Reverse Proxy Settings -->
<Config
Name="Behind Proxy"
Target="BEHIND_PROXY"
Default="false|true"
Mode=""
Description="Set to true if this container is behind a reverse proxy (e.g. Nginx Proxy Manager, Swag, Caddy)."
Type="Variable"
Display="always"
Required="false"
Mask="false"
/>
<Config
Name="Trusted Proxies"
Target="TRUSTED_PROXIES"
Default="172.17.0.0/12"
Mode=""
Description="Comma-separated list of trusted proxy IPs or CIDR ranges. Only used when Behind Proxy is true."
Type="Variable"
Display="advanced"
Required="false"
Mask="false"
/>
<Config
Name="Skip Built-in Caddy"
Target="SKIP_CADDY"
Default="false|true"
Mode=""
Description="Set to true to disable the built-in Caddy web server. Use this when your reverse proxy connects directly to PHP-FPM on port 9000."
Type="Variable"
Display="advanced"
Required="false"
Mask="false"
/>
<!-- Mail Configuration -->
<Config
Name="Mail Driver"
Target="MAIL_MAILER"
Default="log|smtp|sendmail|mailgun|postmark"
Mode=""
Description="Mail transport method. 'log' writes emails to the log file (no actual sending). Use 'smtp' to send real emails."
Type="Variable"
Display="always"
Required="false"
Mask="false"
/>
<Config
Name="SMTP Host"
Target="MAIL_HOST"
Default=""
Mode=""
Description="SMTP server hostname (e.g. smtp.gmail.com, smtp.mailgun.org)."
Type="Variable"
Display="always"
Required="false"
Mask="false"
/>
<Config
Name="SMTP Port"
Target="MAIL_PORT"
Default="587"
Mode=""
Description="SMTP server port. Common values: 587 (TLS), 465 (SSL), 25 (unencrypted)."
Type="Variable"
Display="always"
Required="false"
Mask="false"
/>
<Config
Name="SMTP Username"
Target="MAIL_USERNAME"
Default=""
Mode=""
Description="SMTP authentication username."
Type="Variable"
Display="always"
Required="false"
Mask="false"
/>
<Config
Name="SMTP Password"
Target="MAIL_PASSWORD"
Default=""
Mode=""
Description="SMTP authentication password."
Type="Variable"
Display="always"
Required="false"
Mask="true"
/>
<Config
Name="Mail Encryption"
Target="MAIL_SCHEME"
Default="|tls|ssl"
Mode=""
Description="SMTP encryption scheme. Leave empty for no encryption."
Type="Variable"
Display="advanced"
Required="false"
Mask="false"
/>
<Config
Name="Mail From Address"
Target="MAIL_FROM_ADDRESS"
Default="no-reply@example.com"
Mode=""
Description="The sender email address for outgoing mail."
Type="Variable"
Display="always"
Required="false"
Mask="false"
/>
<Config
Name="Mail From Name"
Target="MAIL_FROM_NAME"
Default="Pelican Panel"
Mode=""
Description="The sender name shown in outgoing emails."
Type="Variable"
Display="advanced"
Required="false"
Mask="false"
/>
<!-- Cache / Session / Queue -->
<Config
Name="Cache Driver"
Target="CACHE_STORE"
Default="file|redis"
Mode=""
Description="Cache backend. 'file' works out of the box. Use 'redis' for better performance with multiple users."
Type="Variable"
Display="advanced"
Required="false"
Mask="false"
/>
<Config
Name="Session Driver"
Target="SESSION_DRIVER"
Default="file|redis"
Mode=""
Description="Session storage backend."
Type="Variable"
Display="advanced"
Required="false"
Mask="false"
/>
<Config
Name="Queue Driver"
Target="QUEUE_CONNECTION"
Default="sync|database|redis"
Mode=""
Description="Queue processing backend. 'sync' processes jobs immediately. 'database' or 'redis' process in the background."
Type="Variable"
Display="advanced"
Required="false"
Mask="false"
/>
<!-- Redis (Advanced) -->
<Config
Name="Redis Host"
Target="REDIS_HOST"
Default=""
Mode=""
Description="Redis server hostname or IP. Only needed if using redis for cache, session, or queue. Use the Unraid IP or Redis container name (e.g. redis)."
Type="Variable"
Display="advanced"
Required="false"
Mask="false"
/>
<Config
Name="Redis Port"
Target="REDIS_PORT"
Default="6379"
Mode=""
Description="Redis server port."
Type="Variable"
Display="advanced"
Required="false"
Mask="false"
/>
<Config
Name="Redis Password"
Target="REDIS_PASSWORD"
Default=""
Mode=""
Description="Redis server password. Leave empty if no authentication is required."
Type="Variable"
Display="advanced"
Required="false"
Mask="true"
/>
</Container>

File diff suppressed because one or more lines are too long

View File

@@ -25,6 +25,5 @@
@import '../../vendor/filament/widgets/resources/css/index.css';
@source '../../vendor/gboquizosanchez/filament-log-viewer/resources/views/**/*.blade.php';
@source '../../vendor/wire-elements/**/*.blade.php';
@variant dark (&:where(.dark, .dark *));

View File

@@ -1,4 +1,16 @@
<x-filament-panels::page>
@once
<style>
.files-selection-merged .fi-ta-header-ctn {
position: sticky;
top: 0;
z-index: 1;
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
}
</style>
@endonce
<div
x-data="
{