diff --git a/.env b/.env index d4d3fb6e5..433f30c63 100644 --- a/.env +++ b/.env @@ -46,4 +46,4 @@ COREROUTER_API_STATE_LIMIT=1000000 # Technitium DNS TECHNITIUM_DNS_URL=https://dns.virtnet.bond -TECHNITIUM_DNS_TOKEN=fab3cb86382687472062c22b37aa5789bebba1dbe556017a7234a295aa5b586d +TECHNITIUM_DNS_TOKEN=915f5ec4c98da4aa2bef05b42952962745806b340828aa3af1fe2777f7cf2b2f diff --git a/.env.bak-1779355051 b/.env.bak-1779355051 new file mode 100644 index 000000000..d4d3fb6e5 --- /dev/null +++ b/.env.bak-1779355051 @@ -0,0 +1,49 @@ +APP_NAME=Virtnet.bond +APP_ENV=production +APP_KEY=base64:+cQPcLVv62SHfVXP2ZARswRh5voT74qiCb36Pgvunqo= +APP_DEBUG=false +APP_TIMEZONE=UTC +APP_URL=https://billing.virtnet.bond +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +APP_MAINTENANCE_STORE=database + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=daily +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=mariadb +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=paymenter +DB_USERNAME=paymenter +DB_PASSWORD=yourPassword + +BROADCAST_CONNECTION=log +CACHE_STORE=redis +FILESYSTEM_DISK=local +SESSION_LIFETIME=120 + +MEMCACHED_HOST=10.0.254.11 + +#REDIS_CLIENT=admin +REDIS_HOST=10.0.254.11 +#REDIS_PASSWORD=null +REDIS_PORT=6379 + +COREROUTER_API_BASE_URL=https://route1-5hg7-c4.virtnet.bond/api/v2 +COREROUTER_API_USERNAME=admin +COREROUTER_API_PASSWORD=a1nqrs3b +COREROUTER_API_VERIFY_SSL=false +COREROUTER_API_TIMEOUT=1000 +COREROUTER_API_STATE_LIMIT=1000000 + +# Technitium DNS +TECHNITIUM_DNS_URL=https://dns.virtnet.bond +TECHNITIUM_DNS_TOKEN=fab3cb86382687472062c22b37aa5789bebba1dbe556017a7234a295aa5b586d diff --git a/app/Classes/FilamentInput.php.bak b/app/Classes/FilamentInput.php.bak new file mode 100644 index 000000000..a40e58f20 --- /dev/null +++ b/app/Classes/FilamentInput.php.bak @@ -0,0 +1,298 @@ +type) { + case 'select': + return Select::make($setting->name) + ->label($setting->label ?? $setting->name) + ->helperText($setting->description ?? '') + ->options(function () use ($setting) { + /* Possiblities: + 1. ['value1', 'value2', 'value3'] + 2. ['value1' => 'label1', 'value2' => 'label2', 'value3' => 'label3'] + 3. [[ + 'value' => 'value1', + 'label' => 'label1', + ], [ + 'value' => 'value2', + 'label' => 'label2', + ]] + */ + if (isset($setting->options)) { + if (is_array($setting->options)) { + $options = []; + // Check if the keys are explicitly set or sequential + $keys = array_keys($setting->options); + $isSequential = $keys === range(0, count($keys) - 1); + + foreach ($setting->options as $key => $value) { + // Explicitly set keys (e.g., ['key1' => 'value1', 'key2' => 'value2']) + if (is_array($value)) { + $options[$value['value']] = $value['label']; + } else { + if ($isSequential) { + // Sequential keys (e.g., [0 => 'value1', 1 => 'value2']) + $options[$value] = $value; + } else { + $options[$key] = $value; + } + } + } + + return $options; + } else { + return (array) $setting->options; + } + } + + return []; + }) + ->preload() + ->multiple($setting->multiple ?? false) + ->required($setting->required ?? false) + ->hint($setting->hint ?? '') + ->hintColor('primary') + ->live(condition: $setting->live ?? false) + ->default($setting->default ?? '') + ->suffix($setting->suffix ?? null) + ->prefix($setting->prefix ?? null) + ->disabled($setting->disabled ?? false) + ->rules($setting->validation ?? []); + break; + + case 'tags': + $input = TagsInput::make($setting->name) + ->label($setting->label ?? $setting->name) + ->placeholder($setting->placeholder ?? '') + ->disabled($setting->disabled ?? false) + ->hint($setting->hint ?? '') + ->hintColor('primary') + ->helperText($setting->description ?? ''); + + // For required TagsInput, validate that array has at least one item + // Standard 'required' rule considers empty arrays as valid + if ($setting->required ?? false) { + $input->required() + ->rule(function () { + return function (string $attribute, $value, \Closure $fail) { + if (!is_array($value) || empty($value)) { + $fail('The :attribute field must have at least 1 items.'); + } + }; + }); + } + + return $input; + break; + + case 'text': + return TextInput::make($setting->name) + ->label($setting->label ?? $setting->name) + ->helperText($setting->description ?? '') + ->placeholder($setting->placeholder ?? $setting->default ?? '') + ->hint($setting->hint ?? '') + ->hintColor('primary') + ->required($setting->required ?? false) + ->live(condition: $setting->live ?? false) + ->default($setting->default ?? '') + ->suffix($setting->suffix ?? null) + ->prefix($setting->prefix ?? null) + ->disabled($setting->disabled ?? false) + ->rules($setting->validation ?? []); + break; + + case 'textarea': + return MarkdownEditor::make($setting->name) + ->label($setting->label ?? $setting->name) + ->helperText($setting->description ?? '') + ->placeholder($setting->placeholder ?? $setting->default ?? '') + ->hint($setting->hint ?? '') + ->hintColor('primary') + ->required($setting->required ?? false) + ->live(condition: $setting->live ?? false) + ->default($setting->default ?? '') + ->disableAllToolbarButtons($setting->disable_toolbar ?? false) + ->rules($setting->validation ?? []) + ->disabled($setting->disabled ?? false); + break; + case 'markdown': + return MarkdownEditor::make($setting->name) + ->label($setting->label ?? $setting->name) + ->helperText($setting->description ?? '') + ->placeholder($setting->placeholder ?? $setting->default ?? '') + ->hint($setting->hint ?? '') + ->hintColor('primary') + ->required($setting->required ?? false) + ->live(condition: $setting->live ?? false) + ->default($setting->default ?? '') + ->disableAllToolbarButtons($setting->disable_toolbar ?? false) + ->rules($setting->validation ?? []) + ->disabled($setting->disabled ?? false); + break; + case 'password': + return TextInput::make($setting->name) + ->label($setting->label ?? $setting->name) + ->helperText($setting->description ?? '') + ->placeholder($setting->placeholder ?? $setting->default ?? '') + ->hint($setting->hint ?? '') + ->hintColor('primary') + ->required($setting->required ?? false) + ->password() + ->revealable() + ->live(condition: $setting->live ?? false) + ->default($setting->default ?? '') + ->suffix($setting->suffix ?? null) + ->prefix($setting->prefix ?? null) + ->disabled($setting->disabled ?? false) + ->rules($setting->validation ?? []); + break; + case 'email': + return TextInput::make($setting->name) + ->label($setting->label ?? $setting->name) + ->helperText($setting->description ?? '') + ->placeholder($setting->placeholder ?? $setting->default ?? '') + ->hint($setting->hint ?? '') + ->hintColor('primary') + ->required($setting->required ?? false) + ->email() + ->live(condition: $setting->live ?? false) + ->default($setting->default ?? '') + ->suffix($setting->suffix ?? null) + ->prefix($setting->prefix ?? null) + ->disabled($setting->disabled ?? false) + ->rules($setting->validation ?? []); + break; + case 'number': + return TextInput::make($setting->name) + ->label($setting->label ?? $setting->name) + ->helperText($setting->description ?? '') + ->placeholder($setting->placeholder ?? $setting->default ?? '') + ->hint($setting->hint ?? '') + ->hintColor('primary') + ->required($setting->required ?? false) + ->numeric() + ->minValue($setting->min_value ?? null) + ->maxValue($setting->max_value ?? null) + ->live(condition: $setting->live ?? false) + ->default($setting->default ?? '') + ->suffix($setting->suffix ?? null) + ->prefix($setting->prefix ?? null) + ->disabled($setting->disabled ?? false) + ->rules($setting->validation ?? []); + + break; + case 'color': + $mode = $setting->color_mode ?? 'hsl'; + $color = ColorPicker::make($setting->name) + ->label($setting->label ?? $setting->name) + ->helperText($setting->description ?? '') + ->placeholder($setting->placeholder ?? $setting->default ?? '') + ->hint($setting->hint ?? '') + ->hintColor('primary') + ->required($setting->required ?? false) + ->live(condition: $setting->live ?? true) + ->default($setting->default ?? '') + ->suffix($setting->suffix ?? null) + ->prefix($setting->prefix ?? null) + ->disabled($setting->disabled ?? false) + ->rules($setting->validation ?? []) + ->rules(function () { + return function ($attribute, $value, $fail) { + try { + ColorFactory::fromString(trim($value)); + } catch (\Exception $e) { + $fail('The :attribute must be a valid color.'); + } + }; + }) + ->afterStateUpdated(function ($state, callable $set) use ($setting, $mode) { + try { + $set($setting->name, preg_replace('/,\s*/', ', ', ColorFactory::fromString(trim($state))->{'to' . ucfirst($mode)}()->__toString())); + } catch (\Exception $e) { + } + }); + $color->$mode(); + + return $color; + break; + case 'file': + $input = FileUpload::make($setting->name) + ->label($setting->label ?? $setting->name) + ->helperText($setting->description ?? '') + ->hint($setting->hint ?? '') + ->hintColor('primary') + ->required($setting->required ?? false) + ->acceptedFileTypes($setting->accept ?? []) + ->live(condition: $setting->live ?? false) + ->default($setting->default ?? '') + ->disk($setting->disk ?? 'public') + ->preserveFilenames($setting->preserve_filenames ?? true) + ->disabled($setting->disabled ?? false) + ->downloadable() + ->rules($setting->validation ?? []); + + if (isset($setting->file_name)) { + $input->getUploadedFileNameForStorageUsing( + fn (): string => (string) $setting->file_name, + ); + } + + return $input; + + break; + + case 'checkbox': + return Checkbox::make($setting->name) + ->label($setting->label ?? $setting->name) + ->helperText($setting->description ?? '') + ->required($setting->required ?? false) + ->hint($setting->hint ?? '') + ->hintColor('primary') + ->live(condition: $setting->live ?? false) + ->default($setting->default ?? '') + ->disabled($setting->disabled ?? false) + ->rules($setting->validation ?? []); + break; + + case 'placeholder': + return Placeholder::make($setting->name) + ->content($setting->label ?? null) + ->helperText($setting->description ?? '') + ->hint($setting->hint ?? '') + ->hintColor('primary'); + break; + + default: + throw new \Exception("Unknown input type: {$setting->type}"); + } + } +} diff --git a/debug-d17155.log b/debug-d17155.log new file mode 100644 index 000000000..da88f8f13 --- /dev/null +++ b/debug-d17155.log @@ -0,0 +1,96 @@ +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713861510,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713861886,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713861887,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713868549,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713868622,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713868623,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713871392,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713871460,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713871460,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713874409,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713874478,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713874479,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713877096,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713877166,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713877167,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713879776,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713879845,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713879845,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713882841,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713882930,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713882930,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713885679,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713885750,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713885751,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713888585,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713888659,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713888660,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713891329,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713891406,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713891407,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713894134,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713894478,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713894479,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713897122,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713897458,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713897459,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713900185,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713900259,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713900260,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713902626,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713902701,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713902702,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713904892,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713904965,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713904966,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713907214,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713907284,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713907284,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713909573,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713909646,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713909647,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713911907,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713911980,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713911981,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713914173,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713914247,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713914248,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713916438,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713916511,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713916512,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713919222,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713919299,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713919300,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713921832,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713921916,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713921917,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713948803,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713949147,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713949148,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713958795,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713958865,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713958866,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713962795,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713962867,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713962868,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774713987310,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713987634,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774713987635,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774714107325,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774714107672,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774714107673,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774714189747,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774714190077,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774714190077,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774714227389,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774714227737,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774714227738,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774714370540,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774714370888,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774714370889,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774714374084,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774714374440,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774714374440,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_render","timestamp":1774714467295,"location":"Statistics.php:render:enter","message":"statistics_render_enter","data":{"serverId":1073}} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774714467650,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:enter","message":"export_getter_enter","data":[]} +{"sessionId":"d17155","runId":"pre-fix","hypothesisId":"H_export","timestamp":1774714467651,"location":"Statistics.php:getHistoricalComparisonExportDataProperty:ok","message":"export_getter_ok","data":{"rowCount":7}} diff --git a/extensions/Others/CreditsPlus/resources/views/components/navigation/index.blade.php b/extensions/Others/CreditsPlus/resources/views/components/navigation/index.blade.php index 2a3157817..472eddfef 100644 --- a/extensions/Others/CreditsPlus/resources/views/components/navigation/index.blade.php +++ b/extensions/Others/CreditsPlus/resources/views/components/navigation/index.blade.php @@ -1,186 +1,192 @@ -{{-- -Credits Plus Enhanced Navigation Component - -Created by: Exp (Discord: exp_yt) -Company: ExpHost - https://www.exphost.net/ - -This code is the intellectual property of Exp and ExpHost. -Unauthorized copying, modification, or distribution is prohibited. ---}} - - +{{-- +Credits Plus Enhanced Navigation Component + +Created by: Exp (Discord: exp_yt) +Company: ExpHost - https://www.exphost.net/ + +This code is the intellectual property of Exp and ExpHost. +Unauthorized copying, modification, or distribution is prohibited. +--}} + + diff --git a/extensions/Others/ForceTheme/ForceTheme.php b/extensions/Others/ForceTheme/ForceTheme.php index a1a399494..4b8d4c8a1 100644 --- a/extensions/Others/ForceTheme/ForceTheme.php +++ b/extensions/Others/ForceTheme/ForceTheme.php @@ -1,50 +1,51 @@ - 'mode', - 'label' => 'Theme Mode', - 'type' => 'select', - 'options' => ['light' => 'Light', 'dark' => 'Dark'], - 'default' => 'light', - 'required' => true, - 'validation' => 'in:light,dark', - ], - [ - 'name' => 'local_storage_key', - 'label' => 'Local Storage Key', - 'type' => 'text', - 'default' => '_x_darkMode', - 'required' => true, - 'validation' => 'string', - ], - ]; - } - - public function boot() - { - View::prependLocation(__DIR__ . '/resources/views/overrides'); - - Event::listen('head', function () { - $mode = $this->config('mode') ?: 'light'; - $key = $this->config('local_storage_key') ?: '_x_darkMode'; - $modeJs = e($mode); - $keyJs = e($key); - $script = ""; - return ['view' => new HtmlString($script)]; - }); - } -} - - + 'mode', + 'label' => 'Theme Mode', + 'type' => 'select', + 'options' => ['light' => 'Light', 'dark' => 'Dark'], + 'default' => 'light', + 'required' => true, + 'validation' => 'in:light,dark', + ], + [ + 'name' => 'local_storage_key', + 'label' => 'Local Storage Key', + 'type' => 'text', + 'default' => '_x_darkMode', + 'required' => true, + 'validation' => 'string', + ], + ]; + } + + public function boot() + { + View::prependLocation(__DIR__ . '/resources/views/overrides'); + + Event::listen('head', function () { + $mode = $this->config('mode') ?: 'light'; + $key = $this->config('local_storage_key') ?: '_x_darkMode'; + $modeJs = e($mode); + $keyJs = e($key); + // Only set the default when the user has not yet made a choice; respect any existing selection so toggles persist. + $script = ""; + return ['view' => new HtmlString($script)]; + }); + } +} + + diff --git a/extensions/Others/UptimeLab/resources/views/index.blade.php b/extensions/Others/UptimeLab/resources/views/index.blade.php index 2a5777e13..05df152cb 100644 --- a/extensions/Others/UptimeLab/resources/views/index.blade.php +++ b/extensions/Others/UptimeLab/resources/views/index.blade.php @@ -1,167 +1,167 @@ -
Contact your administrator to add servers for monitoring.
-Status updates automatically every 30 seconds
-Contact your administrator to add servers for monitoring.
+Status updates automatically every 30 seconds
+{{ $this->service->user->name }}
+{{ $this->service->user->email }}
+{{ $this->service->product->name }}
+No message sent yet
+ @endif +{{ $label }}
+ +
+ โขโขโขโขโขโขโขโข
+ {{ $value }}
+
{{ $value ?: 'N/A' }}
+ @endif +Setup not initialized
+Create the checklist using the product configuration so staff can track progress.
+{{ $process['name'] }}
+ @if($isCompleted && ($process['completed_at'] ?? null)) +Completed {{ \Carbon\Carbon::parse($process['completed_at'])->format('M d, Y \a\t H:i') }}
+ @elseif(!$previousCompleted && !$isCompleted) +Complete the previous step first
+ @endif +{{ $label }}
+ +
+ โขโขโขโขโขโขโขโข
+ {{ $value }}
+
{{ $value ?: 'N/A' }}
+ @endif +Add up to 3 tags to organize and identify your server.
- - -Select color:
-- @php - $message = $statuses[$server->status]['message'] ?? "This server is currently inactive. Please view the Services tab in the Dashboard to see more information about the current state of this server. If more information is required, please contact support via the support portal under Tickets. This message can be displayed after a service is suspended, cancelled, revoked, or potentially in error. If you believe this message has been displayed in error, please contact us via a ticket and be sure to include the following information: VM{$server->vm_id}-ID{$server->id}-{$server->status}."; -@endphp - - {{ $message }} -
-Add up to 3 tags to organize and identify your server.
+ + +Select color:
++ @php + $message = $statuses[$server->status]['message'] ?? "This server is currently inactive. Please view the Services tab in the Dashboard to see more information about the current state of this server. If more information is required, please contact support via the support portal under Tickets. This message can be displayed after a service is suspended, cancelled, revoked, or potentially in error. If you believe this message has been displayed in error, please contact us via a ticket and be sure to include the following information: VM{$server->vm_id}-ID{$server->id}-{$server->status}."; +@endphp + + {{ $message }} +
++ RRD-backed series from your hypervisor: CPU, memory, network (with 95th percentile), and disk I/O. + Adjust range and aggregation per chart; data refreshes every two minutes and when you change filters. +
+rrddata.
+ Utilization (%)
+CPU from RRD as a share of allocated cores (shown as percent). Export includes timestamps and values.
+Throughput + 95th percentile
+Inbound and outbound rates plus a dashed 95th percentile of combined traffic (common for capacity planning).
+Guest RAM (bytes)
+Uses Proxmox RRD mem with axis capped by current VM max memory when available.
Read / write rates
+Disk read and write bytes per second from RRD. Pair with task history when investigating spikes.
++ View and manage backups for this virtual machine. Backups are stored on the KVM server and can be restored or deleted as needed. +
++ Restore: Restores the virtual machine to the state captured in the backup. The VM must be powered off before restoring. +
++ Delete: Permanently removes a backup from the server. This action cannot be undone. +
++ Note: Backups include the entire VM state including disk data, configuration, and metadata. Ensure you have sufficient storage quota for backups. +
+| Backup | +Size | +Created At | +Actions | +
|---|---|---|---|
|
+
+
+
+
+ {{ $backup->notes ?: 'โ' }} + |
+ + {{ Illuminate\Support\Number::fileSize($backup->size, 2) }} + | ++ @php + $fullDate = !empty($backup->ctime) ? date('Y-m-d H:i:s', $backup->ctime) : 'Unknown'; + $relativeTime = !empty($backup->ctime) ? \Carbon\Carbon::createFromTimestamp($backup->ctime)->diffForHumans() : 'Unknown'; + @endphp + {{ $relativeTime }} + {{ $fullDate }} + | +
+
+
+
+
+ |
+
|
+
+
+
+
+ No backups found+Backups capture the full state of your VM including disk data and configuration. Create one to protect against data loss. + |
+ |||
+ Hostname, password, and networking settings are configured automatically via cloud-init. + This applies to standard operating system installations that support cloud-init. However, if you are: +
++ You will need to manually configure networking, security settings, and hostname within the operating system, as cloud-init will not be available in these scenarios. +
++ Determines the sequence in which the virtual machine attempts to boot from available devices. The system will try each device in the specified order until it finds a bootable medium. +
++ Note: If no explicit boot order is configured, QEMU uses the default platform boot sequence. Changes take effect on the next power event (start, reboot, or reset). The boot order is populated directly from the QEMU configuration via the QEMU API. +
++ Control the sequence used when attempting to boot this virtual machine. The list below is + populated directly from the QEMU configuration via the API. +
++ Currently applied: + @if (count($currentOrder)) + {{ implode(' โ ', array_map(fn ($device) => $availableDevices[$device]['label'] ?? strtoupper($device), $currentOrder)) }} + @else + Default platform order (no explicit devices configured) + @endif +
++ Adds a virtual optical drive to your VM using the next available IDE or SATA slot. The system automatically selects an unused slot (IDE0-IDE4 or SATA0-SATA5). +
++ Limitations: Cloud-init media devices are automatically ignored. Maximum of 2 CD/DVD-ROM drives per virtual machine. +
++ Once created, the drive will appear in the boot order and can be used to mount ISO images for operating system installation or other purposes. +
++ Use the next available IDE or SATA slot to add a virtual optical drive. Cloud-init media is ignored. Maximum of 2 drives allowed. +
++ Attach or detach ISO files from cephfs storage to the virtual CD/DVD-ROM drive. Select an ISO from the dropdown to mount it, or choose "None" to leave the drive empty. +
++ Apply: Commits your selection and immediately mounts the ISO to the drive. +
++ Eject: Quickly removes the currently mounted ISO, setting the drive to empty. +
++ ISO images are stored in cephfs storage and can be used for operating system installation, recovery, or running live environments. The storage prefix is hidden in the dropdown for clarity. +
++ Attach or detach an ISO from cephfs storage for the drive on {{ strtoupper($drive) }}. +
++ Select "None" to leave the drive empty. Storage prefix is hidden for clarity. +
+ + @if(isset($currentIsos[$drive]) && $currentIsos[$drive] !== 'none') ++ Opens a support ticket form where you can request that a specific ISO image be added to the cephfs storage. +
++ When submitting a request, include: +
++ Submit your request under the "ISO Request" department for faster processing. Once added, the ISO will appear in the ISO selection dropdown for all users. +
++ Submit a support ticket to request an ISO image be added to cephfs storage. +
++ When requesting an ISO, please ensure your ticket includes: +
++ Please submit your request under the "ISO Request" department. +
++ Shows the current boot sequence for your virtual machine. Devices are listed in order from highest to lowest priority. The VM will attempt to boot from each device in sequence until it finds a bootable medium. +
++ Move up/down: Reorder devices to adjust boot priority. +
++ Remove: Exclude a device from the boot sequence. +
++ The "Synced" indicator shows when your changes match the saved configuration; "Unsaved changes" indicates modifications that need to be saved. Changes take effect on the next power event. +
+Move devices up or down to adjust the order.
++ {{ $index + 1 }}. {{ $availableDevices[$device]['label'] ?? strtoupper($device) }} +
+ @if ($availableDevices[$device]['details'] ?? false) ++ {{ $availableDevices[$device]['details'] }} +
+ @endif ++ Lists all bootable devices detected in your VM configuration that are not currently part of the boot sequence. +
++ Device Types: Disk drives (VirtIO, SCSI, SATA, IDE, NVMe), network adapters, and CD/DVD-ROM drives. Each device shows its type, identifier, and configuration details. +
++ Click Add to include a device in the boot priority list. Devices are automatically detected from the QEMU configuration via the QEMU API. +
+These devices can be part of the boot sequence.
+{{ $availableDevices[$device]['label'] ?? strtoupper($device) }}
+ @if ($availableDevices[$device]['details'] ?? false) +{{ $availableDevices[$device]['details'] }}
+ @endif ++ Discards any unsaved changes to the boot order and restores it to match the last saved configuration. +
++ This button is only enabled when there are unsaved changes. Use this if you want to undo modifications without refreshing the entire configuration from the server. +
++ Commits your boot order changes to the QEMU server configuration. The new boot sequence will be applied to the virtual machine and will take effect on the next power event (start, reboot, or reset). +
++ If the boot order is empty, the system will reset to the default platform boot sequence. +
++ This button is only enabled when there are unsaved changes. +
++ Cloud-init controls the metadata injected into your VM on first boot and whenever you regenerate the cloud-init drive. + Use Apply to save and regenerate the ISO, Refresh to pull fresh values, and Reset to discard local edits. + Manual installs (ISO workflows, Windows, or images without cloud-init) still require in-guest configuration. +
++ Configure cloud-init metadata that is injected into your virtual machine. These settings control user accounts, SSH keys, hostname, networking, and other first-boot configuration. +
++ Apply: Saves your changes and regenerates the cloud-init ISO drive. Changes take effect on the next boot. +
++ Refresh: Reloads the current cloud-init configuration from the server, discarding any unsaved local changes. +
++ Note: These values map directly to QEMU configuration parameters (`ciuser`, `nameserver`, `ipconfigX`, etc.). Cloud-init only works with supported operating systems and images. +
++ These values map directly to the QEMU configuration (`ciuser`, `nameserver`, `ipconfigX`, etc.). Changes take effect on the next cloud-init run or boot. +
++ Configure the default user account and SSH access for your virtual machine. These settings are used by cloud-init to create accounts and configure SSH keys on first boot. +
++ Username: The default user account created by cloud-init. This user typically has sudo privileges. +
++ Password: The password for the default user. Leave empty to disable password authentication (SSH keys only). +
++ SSH Keys: Public SSH keys that will be authorized for the default user. One key per line. +
+Defaults used by cloud-init to create accounts and authorize SSH.
+Use distro-friendly names. Leave blank to keep the template default.
+ +Leave blank to retain the template default user.
+Matches the Overview tab control. Use Save for database only, Save & Apply to push via cloud-init.
+ + @if(isset($server->password) && $server->password) +{{ $server->password }}
+ + Save writes the password to the database. Save & Apply also pushes it to the hypervisor; reboot for cloud-init to configure the guest OS. +
+{{ $key }}
+ No user-provided keys. The default management key remains in place.
+ @endforelse +Add as many keys as needed. The platform management key is always kept but never shown.
+ +
+ Runs apt/yum update && upgrade when cloud-init executes. Enable only if your template supports unattended upgrades.
+
+ Configure network interfaces for your virtual machine. Each network card corresponds to an ipconfigX parameter in the QEMU configuration, allowing you to set IPv4 and IPv6 addresses independently.
+
+ IP Configuration: Each network interface can have separate IPv4 and IPv6 configurations. Use CIDR notation (e.g., 192.168.1.100/24) for IP addresses. +
++ Gateway: The default gateway for each IP version. Leave empty to use the default gateway from the network configuration. +
++ Note: Changes take effect on the next cloud-init run or VM boot. Multiple network interfaces can be configured, each with its own IP configuration. +
+Each card corresponds to an ipconfigX. Configure IPv4 and IPv6 independently.
+ Network Device: NET{{ str_replace('ipconfig', '', $network['key']) }} +
++ Leave fields blank to remove static addressing. If both IPv4 fields are empty, cloud-init omits the IPv4 stanza. +
++ Leave fields blank to remove static addressing. If both IPv4 fields are empty, cloud-init omits the IPv4 stanza. +
++ Configure DNS (Domain Name System) settings for your virtual machine. These settings control how the guest OS resolves domain names to IP addresses. +
++ Search Domain: The default domain suffix appended to hostnames that don't contain a domain. For example, with "example.com" as search domain, "server" resolves to "server.example.com". +
++ Name Servers: DNS servers used for name resolution. Multiple servers can be specified, and they will be tried in order. Common options include Google DNS (8.8.8.8, 8.8.4.4) or Cloudflare DNS (1.1.1.1, 1.0.0.1). +
+
+ Note: These values map to the searchdomain and nameserver parameters in the QEMU cloud-init configuration. Changes take effect on the next cloud-init run.
+
Configures searchdomain and nameserver values.
Appended to short hostnames for resolution.
+ +Leave blank to use system default. Appended to short hostnames for resolution.
+No resolvers configured. System defaults will apply.
+ @endforelse +Entries are applied in order. Add one IPv4/IPv6 resolver per line.
+ ++ Specifies the operating system type for cloud-init metadata generation. This setting helps cloud-init apply the correct configuration format and optimizations for your guest OS. +
++ Linux: Standard Linux distributions (Ubuntu, Debian, CentOS, etc.). Uses standard cloud-init configuration format. +
++ Windows: Windows operating systems. Note that Windows does not natively support cloud-init, so this setting may have limited effect. +
+
+ Note: This value maps to the ostype parameter in the QEMU configuration. It primarily affects how cloud-init metadata is formatted and which optimizations are applied.
+
Controls the ostype option used when generating cloud-init media.
+ Determines whether the guest receives nocloud or config-drive metadata. Choose the entry that matches your template. +
+{{ $description }}
+ @endif + + @if($slot->isNotEmpty()) +Are you sure you want to delete this item?
+Add up to 3 tags to organize and identify your server.
+ + +Select color:
++ @php + $message = $statuses[$server->status]['message'] ?? "This server is currently inactive. Please view the Services tab in the Dashboard to see more information about the current state of this server. If more information is required, please contact support via the support portal under Tickets. This message can be displayed after a service is suspended, cancelled, revoked, or potentially in error. If you believe this message has been displayed in error, please contact us via a ticket and be sure to include the following information: VM{$server->vm_id}-ID{$server->id}-{$server->status}."; +@endphp + + {{ $message }} +
++ @php + $message = $statuses[$server->status]['message'] ?? "This server is currently inactive. Please view the Services tab in the Dashboard to see more information about the current state of this server. If more information is required, please contact support via the support portal under Tickets. This message can be displayed after a service is suspended, cancelled, revoked, or potentially in error. If you believe this message has been displayed in error, please contact us via a ticket and be sure to include the following information: VM{$server->vm_id}-ID{$server->id}-{$server->status}."; +@endphp + +
+ {!! $message !!} +
+ +{{ $subtitle }}
+ @endif +{{ $subtitle }}
+ @endif +{{ $label }}
+ + {{-- Value --}} +Loading data...
+|
+
+
+
+
+ {{ $emptyMessage }} + |
+
{{ $label }}
+{{ $usageSummary }}
+{{ $entitlementLabel }}
+{{ $description }}
+ @endif +{{ $message }}
+ + ++ {{ $description }} +
+ @endif + + @if($slot->isNotEmpty()) +Status: Shows the current power state...
++ {{ $description }} +
+ @endif + + @if(isset($details)) +No icons found matching your search.
+Your notice content here...
+Item: Detailed explanation...
+{{ $subtitle }}
+ @endif +CIDR: {{ $ip }}{{ $cidr }}
+ @endif ++ {{ $fromGuestAgent && !$gateway ? 'Not configured in database' : 'Default route' }} +
++ {{ $fromGuestAgent && !$netmask ? 'Not configured' : 'Network range' }} +
+Your notice content here...
+{{ $label }}
++ @if($prefix){{ $prefix }}@endif{{ is_numeric($value) ? number_format($value, 1) : $value }}@if($suffix){{ $suffix }}@endif +
+ @if($sublabel) +{{ $sublabel }}
+ @endif ++ {{ $helpText }} +
+{{ $subtitle }}
+ @endif +{{ $error }}
+ @elseif($hint) +{{ $hint }}
+ @endif +{{ $label }}
++ Configure the virtual graphics adapter and video memory for your virtual machine. These settings affect how the VM displays output and can impact performance in graphical environments. +
++ Display Adapter: Choose between different VGA adapter types. VirtIO-GPU offers the best performance for modern Linux guests, while standard VGA provides maximum compatibility. +
++ Video Memory: The amount of RAM allocated to the graphics adapter. Higher values can improve performance but reduce available system memory. +
++ Tablet Input: Enables absolute pointer tracking for smoother mouse capture in VNC. Recommended for graphical environments. +
+Choose which VGA adapter the VPS exposes and, when supported, how much video memory it can use.
++ Select the virtual graphics adapter type for your VM. Different adapters offer varying levels of performance and compatibility. +
++ VirtIO-GPU: Modern, high-performance adapter for Linux guests. Supports hardware acceleration and up to 256MB video memory. +
++ Standard VGA: Maximum compatibility option. Works with all operating systems but offers lower performance. +
++ Changes require a VM restart to take effect. +
+Choose which VGA adapter the VPS exposes and, when supported, how much video memory it can use.
+VirtIO-GPU supports up to 256 MB. Pick the lowest value your workload requires.
+Changes are applied to the VM configuration immediately but require a restart to take effect.
+{{ $meta['description'] ?? 'Configurable display option.' }}
+ @if($meta['supports_memory']) +Supports configurable video memory (max 256 MB).
+ @endif +Configure firewall rules, policies, aliases, and IPSets for your virtual machine
+{{ $error }}
++ @if($firewallEnabled) + โ Active - Your VM is protected by firewall rules + @else + โ Disabled - Your VM has no firewall protection + @endif +
+Control default traffic behavior
+Default action for incoming traffic not matching any rule
+Default action for outgoing traffic not matching any rule
+Per-device firewall control
+No network adapters found
+How default policies control your network traffic
+Controls what happens to traffic coming INTO your VM when it doesn't match any explicit firewall rule.
+Controls what happens to traffic going OUT of your VM when it doesn't match any explicit firewall rule.
+To create a strict whitelist (only allow specific traffic):
+IP Filter: Validates that source/destination IP addresses in packets match the VM's assigned IPs. Helps prevent IP spoofing.
+MAC Filter: Validates that MAC addresses match the VM's network adapters. Provides additional layer of security.
+| Order | +Pos | +Action | +Direction | +Source | +Destination | +Protocol | +Ports | +Status | +Actions | +
|---|---|---|---|---|---|---|---|---|---|
|
+
+ @if($index > 0)
+
+ @else
+
+ @endif
+ @if($index < count($rules) - 1)
+
+ @else
+
+ @endif
+
+ |
+ {{ $rule['pos'] ?? '-' }} | ++ @php + $actionClass = match($rule['action'] ?? '') { + 'ACCEPT' => 'bg-success/20 text-success', + 'REJECT' => 'bg-warning/20 text-warning', + 'DROP' => 'bg-error/20 text-error', + default => 'bg-base/20 text-base/60' + }; + @endphp + + {{ $rule['action'] ?? '-' }} + + | ++ + {{ strtoupper($rule['type'] ?? 'IN') }} + + | +
+
+ {{ $rule['source'] ?? '-' }}
+ @php $ruleSourceIP = $rule['source'] ?? ''; @endphp
+ @if($ruleSourceIP && $ruleSourceIP !== '-' && $this->checkIsPublicIP($ruleSourceIP))
+
+
+
+
+ {{-- IP Location Modal (same as logs) --}}
+
+ @endif
+
+
+
+
+
+
+
+
+
+ IP Address: {{ $ruleSourceIP }}+
+
+
+ Loading location data... +
+
+
+
+
+
+
+
+
+
+
+ Country:
+ Region:
+ City:
+ ZIP:
+ Timezone:
+
+
+ ISP:
+ Organization:
+ AS:
+ Coordinates:
+
+
+ Location Map: +
+
+
+
+
+
+
+ |
+
+
+ {{ $rule['dest'] ?? '-' }}
+ @php $ruleDestIP = $rule['dest'] ?? ''; @endphp
+ @if($ruleDestIP && $ruleDestIP !== '-' && $this->checkIsPublicIP($ruleDestIP))
+
+
+
+
+ {{-- IP Location Modal (same structure) --}}
+
+ @endif
+
+
+
+
+
+
+
+
+
+ IP Address: {{ $ruleDestIP }}+
+
+
+ Loading location data... +
+
+
+
+
+
+
+
+
+
+
+ Country:
+ Region:
+ City:
+ ZIP:
+ Timezone:
+
+
+ ISP:
+ Organization:
+ AS:
+ Coordinates:
+
+
+ Location Map: +
+
+
+
+
+
+
+ |
+ {{ strtoupper($rule['proto'] ?? ($rule['macro'] ?? 'ANY')) }} | +{{ $rule['dport'] ?? $rule['sport'] ?? '-' }} | ++ @if(isset($rule['enable']) && $rule['enable'] == 0) + Disabled + @else + Enabled + @endif + | +
+
+
+
+
+
+ |
+
Create your first rule to control network traffic
+ +Create named references to IP addresses or CIDR ranges
+Create aliases to simplify rule management
+ +Group multiple IPs/CIDRs for easier rule management
+No IP Sets created yet
+No members in this IPSet
+ +Select an IP Set to view its members
+Showing the latest logs first (most recent at top)
+ @if($lastLogRefresh) + โข Last updated: {{ $lastLogRefresh }} + @endif + โข Auto-refreshes every 30s +{{ $logError }}
+Loading firewall logs...
+| Time | +Action | +Source | +Destination | +Protocol | +Src Port | +Dest Port | +Analysis | +
|---|---|---|---|---|---|---|---|
| + @if(isset($log['timestamp_iso']) && $log['timestamp_iso'] !== '-') + + @else + {{ $log['timestamp_display'] ?? $log['timestamp'] ?? '-' }} + @endif + | ++ + {{ $log['action'] ?? '-' }} + + | +
+
+ {{ $log['source'] ?? '-' }}
+ @php $sourceIP = $log['source'] ?? ''; @endphp
+ @if($sourceIP && $sourceIP !== '-' && $this->checkIsPublicIP($sourceIP))
+
+
+
+
+ {{-- IP Location Modal --}}
+
+ @endif
+
+
+
+
+
+
+
+
+
+ IP Address: {{ $sourceIP }}+
+
+
+ Loading location data... +
+
+
+
+
+
+
+
+
+
+
+ Country:
+ Region:
+ City:
+ ZIP:
+ Timezone:
+
+
+ ISP:
+ Organization:
+ AS:
+ Coordinates:
+
+
+ Location Map: +
+
+
+
+
+
+
+ |
+
+
+ {{ $log['destination'] ?? '-' }}
+ @php $destIP = $log['destination'] ?? ''; @endphp
+ @if($destIP && $destIP !== '-' && $this->checkIsPublicIP($destIP))
+
+
+
+
+ {{-- IP Location Modal --}}
+
+ @endif
+
+
+
+
+
+
+
+
+
+ IP Address: {{ $destIP }}+
+
+
+ Loading location data... +
+
+
+
+
+
+
+
+
+
+
+ Country:
+ Region:
+ City:
+ ZIP:
+ Timezone:
+
+
+ ISP:
+ Organization:
+ AS:
+ Coordinates:
+
+
+ Location Map: +
+
+
+
+
+
+
+ |
+ {{ $log['protocol'] ?? '-' }} | +{{ $log['source_port'] ?? '-' }} | +{{ $log['destination_port'] ?? '-' }} | +
+ @php
+ $sourceIP = $log['source'] ?? '';
+ $destIP = $log['destination'] ?? '';
+ $sourcePort = $log['source_port'] ?? '';
+ $destPort = $log['destination_port'] ?? '';
+ $protocol = $log['protocol'] ?? '';
+ @endphp
+ @if($coreRouterConfigured && $sourceIP && $sourceIP !== '-')
+
+
+
+ {{-- Network Analysis Modal --}}
+
+ @endif
+
+
+
+
+
+
+
+
+
+ {{-- Modal Header --}}
+
+
+
+ {{-- Modal Content --}}
+
+
+
+
+
+
+ Network Connection Analysis+Detailed connection information from firewall state +
+ {{-- Loading State --}}
+
+
+ {{-- Modal Footer --}}
+
+
+
+ {{-- Error State --}}
+
+
+
+ Fetching connection data... +
+
+
+ {{-- Connection Data Display --}}
+
+
+
+
+
+
+
+
+
+
+
+ {{-- No Connections Found --}}
+
+
+ {{-- Connection Header --}}
+
+
+
+
+
+ {{-- Connection Details Grid --}}
+
+
+
+
+
+
+
+
+ {{-- Source Information --}}
+
+
+ {{-- Connection Statistics --}}
+
+
+
+ {{-- Destination Information --}}
+
+
+ |
+
Logs will appear here when the firewall blocks or allows traffic
+Save and reuse firewall configurations across your VPS instances
+| Configuration Name | +Rules | +Policies | +Created | +Actions | +
|---|---|---|---|---|
|
+
+
+
+
+ {{ $config['configuration_name'] }}
+ |
+ + + {{ is_array($config['firewall_rules']) ? count($config['firewall_rules']) : 0 }} rules + + | +
+
+
+ IN: {{ $config['incoming_policy'] }}
+
+
+ OUT: {{ $config['outgoing_policy'] }}
+
+
+ |
+ + {{ \Carbon\Carbon::parse($config['created_at'])->format('M d, Y H:i') }} + | +
+
+
+
+
+
+
+ |
+
Save your current firewall configuration to reuse it later or apply it to other VPS instances
+Your virtual machine is currently unprotected. Enable the firewall above to secure your network traffic with customizable rules.
+Define rules to allow or block specific connections
+Track and log all firewall events in real-time
+Configure default behavior for incoming and outgoing traffic
+
+
Can use alias names or leave empty for any source
+Are you sure you want to delete this rule? This action cannot be undone.
+Delete alias "{{ $deletingAliasName }}"?
+This may affect firewall rules using this alias.
+After creating the IPSet, you can add IP addresses and CIDR ranges to it.
+Delete IPSet "{{ $deletingIPSetName }}"?
+All members will be removed and rules using this IPSet may be affected.
+Remove "{{ $deletingMemberCidr }}" from {{ $selectedIPSetName }}?
+Save your current firewall rules and policies as a reusable configuration
+{{ $message }}
+ @enderror +Created on {{ $viewingConfiguration->created_at->format('M d, Y H:i') }}
+The following rules may not be compatible with this VPS:
+| # | +Action | +Direction | +Source | +Destination | +Protocol | +Port | +Status | +
|---|---|---|---|---|---|---|---|
| {{ $index + 1 }} | ++ + {{ $rule['action'] ?? 'ACCEPT' }} + + | +{{ strtoupper($rule['type'] ?? '-') }} | +{{ $rule['source'] ?? 'any' }} | +{{ $rule['dest'] ?? 'any' }} | +{{ $rule['proto'] ?? '-' }} | +{{ $rule['dport'] ?? '-' }} | ++ @if($hasIssue) + Incompatible + @elseif(isset($rule['enable']) && $rule['enable'] == 0) + Disabled + @else + Enabled + @endif + | +
No rules in this configuration
+ @endif +Apply "{{ $applyingConfiguration->configuration_name }}" to this VPS
+Warning
+This will replace all existing firewall rules with the rules from this configuration. This action cannot be undone.
+Compatibility Notice
+{{ count($applyCompatibilityWarnings) }} rule(s) in this configuration are not fully compatible with this VPS and will be disabled.
+Rules
+{{ count($applyingConfiguration->firewall_rules) }}
+IN Policy
+ +OUT Policy
+ +Are you sure you want to delete this saved configuration? This action cannot be undone.
+Apply the current firewall configuration to all your other VPS instances.
+This will replace the firewall configuration on all your other servers. Existing rules will be deleted and replaced with the current configuration.
+No other servers found to apply the configuration to.
+Enter a new name for this configuration
+{{ $message }}
+ @enderror +Could not retrieve status from hypervisor:
++ The Firewall Management interface provides comprehensive control over your virtual machine's network security, including rule-based filtering, IP aliases, and security policies. +
+Firewall Rules: Create granular rules to allow or block specific traffic patterns.
+IP Aliases: Define named groups of IP addresses for easier rule management.
+IP Sets: Manage collections of IP addresses for advanced filtering.
+Security Logs: Monitor firewall activity and blocked attempts.
+{{ $error }}
+
+ @if($firewallEnabled)
+
+
+
+
+
+ Active - Your VM is protected
+
+ @else
+
+
| Order | +Pos | +Action | +Direction | +Source | +Destination | +Protocol | +Ports | +Status | +Actions | +
|---|---|---|---|---|---|---|---|---|---|
|
+
+ @if($index > 0)
+
+ @else
+
+ @endif
+ @if($index < count($rules) - 1)
+
+ @else
+
+ @endif
+
+ |
+ {{ $rule['pos'] }} | ++ + {{ $rule['action'] }} + + | +{{ $rule['direction'] ?? 'IN' }} | +{{ $rule['source'] ?? '-' }} | +{{ $rule['dest'] ?? '-' }} | +{{ $rule['proto'] ?? '-' }} | +{{ $rule['dport'] ?? $rule['sport'] ?? '-' }} | ++ + @if($rule['enable']) + + Enabled + @else + Disabled + @endif + + | +
+
+
+
+
+
+ |
+
{{ $alias['comment'] ?? 'No description' }}
+{{ trim($cidr) }}
+ {{ $ipset['comment'] ?? 'No description' }}
+{{ $cidr }}
+ @endforeach
+ @if(count($ipset['cidr']) > 5)
+ ... and {{ count($ipset['cidr']) - 5 }} more
+ @endif +{{ $config['description'] ?? 'No description' }}
+{{ $config['created_at'] }}
+How default policies control your network traffic
+Controls what happens to traffic coming INTO your VM when it doesn't match any explicit firewall rule.
+Controls what happens to traffic going OUT of your VM when it doesn't match any explicit firewall rule.
+To create a strict whitelist (only allow specific traffic):
+IP Filter: Validates that source/destination IP addresses in packets match the VM's assigned IPs. Helps prevent IP spoofing.
+MAC Filter: Validates that MAC addresses match the VM's network adapters. Provides additional layer of security.
+
+
Can use alias names or leave empty for any source
+Are you sure you want to delete this rule? This action cannot be undone.
+Delete alias "{{ $deletingAliasName }}"?
+This may affect firewall rules using this alias.
+After creating the IPSet, you can add IP addresses and CIDR ranges to it.
+Delete IPSet "{{ $deletingIPSetName }}"?
+All members will be removed and rules using this IPSet may be affected.
+Remove "{{ $deletingMemberCidr }}" from {{ $selectedIPSetName }}?
+Save your current firewall rules and policies as a reusable configuration
+{{ $message }}
+ @enderror +{{ $error }}
+
+ @if($firewallEnabled)
+
+
+
+
+
+ Active - Your VM is protected
+
+ @else
+
+
Control default traffic behavior
+Per-device firewall control
+How default policies control your network traffic
+Controls what happens to traffic coming INTO your VM when it doesn't match any explicit firewall rule.
+Controls what happens to traffic going OUT of your VM when it doesn't match any explicit firewall rule.
+To create a strict whitelist (only allow specific traffic):
+IP Filter: Validates that source/destination IP addresses in packets match the VM's assigned IPs. Helps prevent IP spoofing.
+MAC Filter: Validates that MAC addresses match the VM's network adapters. Provides additional layer of security.
+| Order | +Pos | +Action | +Direction | +Source | +Destination | +Protocol | +Ports | +Status | +Actions | +
|---|---|---|---|---|---|---|---|---|---|
|
+
+ @if($index > 0)
+
+ @else
+
+ @endif
+ @if($index < count($rules) - 1)
+
+ @else
+
+ @endif
+
+ |
+ {{ $rule['pos'] ?? '-' }} | ++ @php + $actionClass = match($rule['action'] ?? '') { + 'ACCEPT' => 'bg-success/20 text-success', + 'REJECT' => 'bg-warning/20 text-warning', + 'DROP' => 'bg-error/20 text-error', + default => 'bg-base/20 text-base/60' + }; + @endphp + + {{ $rule['action'] ?? '-' }} + + | ++ + {{ strtoupper($rule['type'] ?? 'IN') }} + + | +
+
+ {{ $rule['source'] ?? '-' }}
+ @php $ruleSourceIP = $rule['source'] ?? ''; @endphp
+ @if($ruleSourceIP && $ruleSourceIP !== '-' && $this->checkIsPublicIP($ruleSourceIP))
+
+
+
+
+ {{-- IP Location Modal (same as logs) --}}
+
+
+ @endif
+ |
+
+
+ {{ $rule['dest'] ?? '-' }}
+ @php $ruleDestIP = $rule['dest'] ?? ''; @endphp
+ @if($ruleDestIP && $ruleDestIP !== '-' && $this->checkIsPublicIP($ruleDestIP))
+
+
+
+
+ {{-- IP Location Modal (same structure) --}}
+
+
+ @endif
+ |
+ {{ strtoupper($rule['proto'] ?? ($rule['macro'] ?? 'ANY')) }} | +{{ $rule['dport'] ?? $rule['sport'] ?? '-' }} | ++ @if(isset($rule['enable']) && $rule['enable'] == 0) + Disabled + @else + Enabled + @endif + | +
+
+
+
+
+
+ |
+
Create your first rule to control network traffic
+ +Create named references to IP addresses or CIDR ranges
+Create aliases to simplify rule management
+ +Group multiple IPs/CIDRs for easier rule management
+No IP Sets created yet
+No members in this IPSet
+ +Select an IP Set to view its members
+Showing the latest logs first (most recent at top)
+ @if($lastLogRefresh) + โข Last updated: {{ $lastLogRefresh }} + @endif + โข Auto-refreshes every 30s +{{ $logError }}
+Loading firewall logs...
+| Time | +Action | +Source | +Destination | +Protocol | +Src Port | +Dest Port | +Analysis | +
|---|---|---|---|---|---|---|---|
| + @if(isset($log['timestamp_iso']) && $log['timestamp_iso'] !== '-') + + @else + {{ $log['timestamp_display'] ?? $log['timestamp'] ?? '-' }} + @endif + | ++ + {{ $log['action'] ?? '-' }} + + | +
+
+ {{ $log['source'] ?? '-' }}
+ @php $sourceIP = $log['source'] ?? ''; @endphp
+ @if($sourceIP && $sourceIP !== '-' && $this->checkIsPublicIP($sourceIP))
+
+
+
+
+ {{-- IP Location Modal --}}
+
+
+ @endif
+ |
+
+
+ {{ $log['destination'] ?? '-' }}
+ @php $destIP = $log['destination'] ?? ''; @endphp
+ @if($destIP && $destIP !== '-' && $this->checkIsPublicIP($destIP))
+
+
+
+
+ {{-- IP Location Modal --}}
+
+
+ @endif
+ |
+ {{ $log['protocol'] ?? '-' }} | +{{ $log['source_port'] ?? '-' }} | +{{ $log['destination_port'] ?? '-' }} | +
+ @php
+ $sourceIP = $log['source'] ?? '';
+ $destIP = $log['destination'] ?? '';
+ $sourcePort = $log['source_port'] ?? '';
+ $destPort = $log['destination_port'] ?? '';
+ $protocol = $log['protocol'] ?? '';
+ @endphp
+ @if($coreRouterConfigured && $sourceIP && $sourceIP !== '-')
+
+
+
+ {{-- Network Analysis Modal --}}
+
+
+ @endif
+ |
+
Logs will appear here when the firewall blocks or allows traffic
+Save and reuse firewall configurations across your VPS instances
+| Configuration Name | +Rules | +Policies | +Created | +Actions | +
|---|---|---|---|---|
|
+
+
+
+
+ {{ $config['configuration_name'] }}
+ |
+ + + {{ is_array($config['firewall_rules']) ? count($config['firewall_rules']) : 0 }} rules + + | +
+
+
+ IN: {{ $config['incoming_policy'] }}
+
+
+ OUT: {{ $config['outgoing_policy'] }}
+
+
+ |
+ + {{ \Carbon\Carbon::parse($config['created_at'])->format('M d, Y H:i') }} + | +
+
+
+
+
+
+
+ |
+
Save your current firewall configuration to reuse it later or apply it to other VPS instances
+Your virtual machine is currently unprotected. Enable the firewall above to secure your network traffic with customizable rules.
+Define rules to allow or block specific connections
+Track and log all firewall events in real-time
+Configure default behavior for incoming and outgoing traffic
+
+
Can use alias names or leave empty for any source
+Are you sure you want to delete this rule? This action cannot be undone.
+Delete alias "{{ $deletingAliasName }}"?
+This may affect firewall rules using this alias.
+After creating the IPSet, you can add IP addresses and CIDR ranges to it.
+Delete IPSet "{{ $deletingIPSetName }}"?
+All members will be removed and rules using this IPSet may be affected.
+Remove "{{ $deletingMemberCidr }}" from {{ $selectedIPSetName }}?
+Save your current firewall rules and policies as a reusable configuration
+{{ $message }}
+ @enderror +Created on {{ $viewingConfiguration->created_at->format('M d, Y H:i') }}
+The following rules may not be compatible with this VPS:
+| # | +Action | +Direction | +Source | +Destination | +Protocol | +Port | +Status | +
|---|---|---|---|---|---|---|---|
| {{ $index + 1 }} | ++ + {{ $rule['action'] ?? 'ACCEPT' }} + + | +{{ strtoupper($rule['type'] ?? '-') }} | +{{ $rule['source'] ?? 'any' }} | +{{ $rule['dest'] ?? 'any' }} | +{{ $rule['proto'] ?? '-' }} | +{{ $rule['dport'] ?? '-' }} | ++ @if($hasIssue) + Incompatible + @elseif(isset($rule['enable']) && $rule['enable'] == 0) + Disabled + @else + Enabled + @endif + | +
No rules in this configuration
+ @endif +Apply "{{ $applyingConfiguration->configuration_name }}" to this VPS
+Warning
+This will replace all existing firewall rules with the rules from this configuration. This action cannot be undone.
+Compatibility Notice
+{{ count($applyCompatibilityWarnings) }} rule(s) in this configuration are not fully compatible with this VPS and will be disabled.
+Rules
+{{ count($applyingConfiguration->firewall_rules) }}
+IN Policy
+ +OUT Policy
+ +Are you sure you want to delete this saved configuration? This action cannot be undone.
+Apply the current firewall configuration to all your other VPS instances.
+This will replace the firewall configuration on all your other servers. Existing rules will be deleted and replaced with the current configuration.
+No other servers found to apply the configuration to.
+Enter a new name for this configuration
+{{ $message }}
+ @enderror ++ Get your virtual machine up and running quickly with this step-by-step guide. +
+ +apt update && apt upgrade (Debian/Ubuntu)+ Learn how to reinstall your virtual machine with a fresh operating system. Reinstalling will completely wipe your current installation and install a new OS from scratch. +
+ +Important: Data Loss Warning
++ The reinstall dialog displays available operating system templates organized by category: +
++ Tip: Look for "Recommended" badges on certain OS versions for best compatibility and support. +
++ The reinstall process typically takes 5-15 minutes and involves: +
+apt update && apt upgrade (Debian/Ubuntu) or equivalentWill my IP addresses change?
+No, your assigned IP addresses (both IPv4 and IPv6) will remain the same after reinstallation.
+Can I cancel a reinstall once it starts?
+No, once the reinstall process begins, it cannot be cancelled. The old VM is deleted immediately.
+What if my server shows "Protected" status?
+Protected servers have reinstall disabled for safety. Contact support to enable reinstall if needed.
+Will my backups be deleted?
+No, existing backups are preserved. However, you'll need to manually restore data from backups after reinstall.
+How long does reinstallation take?
+Typically 5-15 minutes depending on the OS template size and server resources. You'll receive a notification when complete.
++ The Overview tab provides a comprehensive dashboard for monitoring and managing your virtual machine. It displays real-time statistics, system information, and provides quick access to essential management functions. +
+ ++ The hostname is the network name assigned to your virtual machine. It's used for identification on the network and should follow RFC 1035 standards. +
+ +RFC 1035 Compliance Requirements:
+| Requirement | +Specification | +
|---|---|
| Length | +1-253 characters total | +
| Characters | +Lowercase letters (a-z), numbers (0-9), hyphens (-), dots (.) | +
| Start/End | +Cannot start or end with hyphen or dot | +
| Consecutive Dots | +Cannot contain consecutive dots (..) | +
| Label Length | +Each label (between dots) must be 1-63 characters | +
+
+
web-server-01
+ db-primary.example
+ Web_Server (uppercase, underscore)
+ -server- (starts/ends with hyphen)
+ + Manage the root or default user password for your virtual machine. Passwords are securely stored and can be applied via cloud-init. +
+ +| Requirement | +Specification | +
|---|---|
| Minimum Length | +8 characters | +
| Confirmation | +Must be entered twice for verification | +
| Storage | +Securely stored in encrypted database | +
| Application | +Applied via cloud-init on next boot | +
Important: Password Application
+The server must be rebooted for password changes to take effect. Cloud-init applies the password during the boot process.
++ Domain Name System (DNS) settings determine how your virtual machine resolves domain names to IP addresses. These settings follow RFC 1034 and RFC 1035 standards. +
+ +Common DNS Servers:
+| Provider | +IPv4 Primary | +IPv4 Secondary | +IPv6 | +
|---|---|---|---|
8.8.8.8 |
+ 8.8.4.4 |
+ 2001:4860:4860::8888 |
+ |
| Cloudflare | +1.1.1.1 |
+ 1.0.0.1 |
+ 2606:4700:4700::1111 |
+
| Quad9 | +9.9.9.9 |
+ 149.112.112.112 |
+ 2620:fe::fe |
+
+ For software developers integrating with the QEMU/KVM API, hostname updates are performed via the QEMU configuration endpoint. +
+
+
+ Note: The VM name is used by cloud-init as the hostname. Changes require a VM restart to take effect via cloud-init. The management platform uses a ticket-based authentication system with CSRF protection. +
+
+
+ The platform supports multiple storage backends, each optimized for different use cases: +
+| Storage Type | +Backend | +Use Case | +Features | +
|---|---|---|---|
| local | +Directory | +ISO images, templates | +Simple file storage | +
| local-lvm | +LVM thin provisioning | +VM disks, snapshots | +Thin provisioning, snapshots | +
| cephpool | +Ceph RBD | +Shared storage, HA | +Distributed, replicated | +
| nfs | +NFS mount | +Shared storage | +Network-attached | +
+
Cloud-init reads the VM name from QEMU config and applies it as hostname:
+# /etc/cloud/cloud.cfg.d/99_hostname.cfg
+hostname: web-server-01
+fqdn: web-server-01.example.com
+preserve_hostname: false
+
+ The hostname is set during first boot or when cloud-init clean is run followed by a reboot.
+
+ Real-time performance graphs display CPU usage, memory consumption, network traffic, and disk I/O over various time ranges. +
+
+
Performance data is collected using Round Robin Database (RRD) format:
++ Data Retention: Hour (1 year), Day (5 years), Week (10 years), Month (50 years), Year (indefinite) +
+| Metric | +Description | +Unit | +
|---|---|---|
| CPU | +Percentage of CPU time used by the virtual machine | +Percentage (%) | +
| Memory | +RAM usage including cached and buffered memory | +Bytes (B, KB, MB, GB) | +
| Network | +Inbound and outbound network traffic | +Bytes per second (B/s) | +
| Disk | +Read and write operations on virtual disks | +Bytes per second (B/s) | +
+
+
+ The Resource Allocation vs Entitlement section provides real-time visibility into how your virtual machine's actual resource consumption compares to its allocated entitlements. This helps you monitor resource usage, identify potential bottlenecks, and ensure optimal performance. +
+ ++ Displays live CPU usage as a percentage of your vCPU entitlement. Values are sampled directly from the Proxmox hypervisor and update automatically with each status poll (every 30 seconds by default, or every 2 seconds during fast polling). +
++ Shows current RAM usage compared to your provisioned memory entitlement. Calculated from the VM's allocated memory and updates in real-time as memory consumption changes. +
++ Displays the live uptime reported by the Proxmox hypervisor, plus power event statistics from the task history. This provides insight into VM stability and availability. +
++ Color-coded badges provide quick visual feedback about resource health status. +
+| Badge | +Condition | +Color | +
|---|---|---|
| Healthy | +Usage below 85% of entitlement | +Green | +
| Watchlist | +Usage between 85% and 100% | +Yellow | +
| Over entitlement | +Usage exceeds 100% of entitlement | +Red | +
+ The Live Network Traffic section provides real-time bandwidth monitoring for each network interface on your virtual machine. It displays current transfer rates, peak values, historical traffic graphs, and cumulative statistics. +
+ ++ Shows the instantaneous download and upload speeds in bytes per second, updated every 30 seconds from Proxmox RRD (Round Robin Database) data. The update interval matches Proxmox's RRD sampling rate to ensure accurate data representation. +
+/rrddata API endpoint+ Tracks the highest observed transfer rates for each direction since the page was loaded. Peak values help identify maximum bandwidth usage and can be useful for capacity planning. +
++ Click the "Graph" button in the top-right corner of each interface card to view a line chart showing network traffic trends over the last 10 minutes. +
++ Displays cumulative data transfer totals from the VM's start, providing a long-term view of network usage. +
+/status/current endpoint+ If your virtual machine has multiple network interfaces configured, each interface will be displayed in its own card with separate statistics and graphs. +
+Data Refresh Rate
+The Live Network Traffic section updates every 30 seconds to match Proxmox's RRD data sampling rate. This ensures that the displayed data accurately reflects the actual network activity without unnecessary API calls.
++ The Boot Settings tab allows you to configure the boot order for your virtual machine. This determines the sequence in which the system attempts to boot from available devices. +
+ ++ Boot order specifies the priority sequence for boot devices. The system will attempt to boot from each device in order until it finds a bootable medium. This is essential for controlling how your virtual machine starts. +
+ +Power On / Reset
+VM receives power signal and firmware initializes
+Firmware Initialization
+BIOS or UEFI firmware loads and initializes hardware
+Boot Device Check
+Firmware checks devices in configured boot order
+Bootable Media Detection
+If device contains bootable media, system boots from it
+OS Load
+Operating system bootloader executes and OS starts
+| Device Type | +Description | +Common Use Case | +
|---|---|---|
| Hard Disk | +Primary storage device containing the operating system | +Normal operation (highest priority) | +
| CD/DVD | +Optical media drive for installation or recovery | +OS installation, system recovery | +
| Network (PXE) | +Network boot via Preboot Execution Environment | +Automated deployment, diskless systems | +
| USB | +External storage devices | +Portable installations, recovery media | +
+ QEMU uses a default platform boot sequence if no explicit boot order is configured. The boot order is populated directly from the QEMU configuration via the QEMU API. +
+ +Default Boot Behavior
+If no boot order is set, QEMU follows the standard platform boot sequence:
+
+
The control panel translates your boot order selections into the same parameters Proxmox expects (for example, scsi0 for the primary disk, ide2 for a virtual CD/DVD, and net0 for PXE). When you save, the backend updates the VM configuration on the node so the hypervisor knows which device to start from first.
Legacy BIOS-style flags such as order=dc are mapped automatically, and storage mappings are inferred from the datastore you choseโlocal-LVM disks become SCSI devices, ISO images are attached as virtual IDE drives, and network boot entries map to the network adapters listed in the UI.
UEFI Boot Manager Configuration:
+# EFI Boot Manager entries (stored in EFI disk)
+# Boot0000: Hard Disk
+# Boot0001: CD-ROM
+# Boot0002: Network
+
+# UEFI boot order is managed via EFI variables
+# Accessible through QEMU Guest Agent or UEFI shell:
+# efibootmgr -o 0000,0001,0002
+
+# QEMU UEFI boot configuration
+{
+ "bios": "ovmf",
+ "efidisk0": "local-lvm:vm-100-disk-1,size=4M",
+ "boot": "order=scsi0"
+}
+ PXE Boot Process:
+# DHCP option 66 (Boot Server Host Name)
+# DHCP option 67 (Bootfile Name)
+
+# QEMU PXE configuration
+-netdev user,id=net0 \\
+-device virtio-net-pci,netdev=net0 \\
+-boot n
+ Debugging Techniques:
+Use the โConsoleโ tab or the nodeโs shell tools to inspect QEMU devices. Commands like qm monitor <vmid> info block or qm config <vmid> show which disks are attached and the current boot priorities.
For UEFI guests, enabling OVMF debugging or attaching a serial console can capture early boot logs. The platform exposes toggles for these options so you donโt have to edit config files manually.
+Whenever you open the web console, the panel requests a one-time VNC/WebSocket tunnel from the hypervisor. This lets you troubleshoot boot issues immediately without handling node credentials yourself.
+
+
+
+ The Firewall tab provides comprehensive firewall management for your virtual machine. You can enable or disable the firewall, create allow and block rules for network traffic, manage aliases for IP addresses and networks, and configure IP sets for advanced rule management. +
+ ++ The firewall can be enabled or disabled using the toggle switch at the top of the Firewall tab. When enabled, all configured firewall rules will be active and enforced. When disabled, all traffic will be allowed by default. +
++ Firewall rules control which network traffic is allowed or blocked. Rules are processed in order from top to bottom, and the first matching rule determines the action taken. +
+ +| Action | +Description | +
|---|---|
| ACCEPT | +Allows the matching traffic to pass through | +
| REJECT | +Blocks the traffic and sends a rejection response to the sender | +
| DROP | +Silently blocks the traffic without sending a response | +
192.168.1.0/24)80, 443, or 1000:2000)net0) to apply the rule to+ Rules are processed in order from top to bottom. The first matching rule determines the action. It's important to place more specific rules before general ones. For example: +
++ Aliases allow you to create named references to IP addresses or networks. This makes firewall rules more readable and easier to maintain. Instead of typing IP addresses repeatedly, you can use an alias name. +
+
+ Example: Create an alias named trusted-network for 192.168.1.0/24, then use trusted-network in your firewall rules instead of the full CIDR notation.
+
192.168.1.0/24)+ IP sets are collections of IP addresses or networks that can be referenced in firewall rules. They are useful for managing large lists of IP addresses, such as blocked IPs or allowed IPs for specific services. +
++ Use Cases: +
++ Note: After creating an IP set, you can add individual IP addresses or networks to it through the API. IP sets can then be referenced in firewall rules using the set name. +
+Action: ACCEPT
+Source: 192.168.1.100
+Protocol: TCP
+Destination Port: 22
+Comment: Allow SSH from office
+
+ Action: DROP
+Source: 10.0.0.0/8
+Comment: Block private network range
+
+ Action: ACCEPT
+Protocol: TCP
+Destination Port: 80,443
+Comment: Allow HTTP and HTTPS
+ + The Network tab provides comprehensive network configuration and monitoring capabilities. It displays assigned IP addresses, network interfaces, and allows configuration of network devices and addresses. +
+ +| Protocol | +Scope | +RFC Standard(s) | +Address Format / Examples | +
|---|---|---|---|
| IPv4 | +Public | +
+ RFC 791 + Internet Protocol (IPv4) + |
+
+ 32-bit dotted decimal addresses routable on the public Internet. + 203.0.113.10, 198.51.100.25
+ |
+
| Private | +
+ RFC 1918 + Address Allocation for Private Internets + |
+
+ Non-routable private ranges used inside LANs and VPNs only: + 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
+ |
+ |
| IPv6 | +Global Unicast (Public) | +
+ RFC 2460 / RFC 8200 + Internet Protocol Version 6 (IPv6) + |
+
+ 128-bit hexadecimal addresses routable on the public Internet. + 2001:db8::100, 2a00:1450::1
+ |
+
| Unique Local & Link-Local (Private) | +
+ RFC 4193 โ Unique Local IPv6 Addresses (ULA) + RFC 4291 โ IPv6 Addressing Architecture + |
+
+ Private / non-routable IPv6 ranges: + โข ULA (local-only): fd00::/8+ โข Link-local (perโlink only): fe80::/10
+ |
+
| Device Type | +Performance | +Compatibility | +Best For | +
|---|---|---|---|
| VirtIO | +
+
+
+ |
+ Linux (excellent), Windows (good) | +Production Linux systems | +
| E1000 | +
+
+
+ |
+ All operating systems | +Maximum compatibility | +
| rtl8139 | +
+
+
+ |
+ Legacy systems | +Old operating systems | +
| VMXNET3 | +
+
+
+ |
+ Best on VMwareโoptimised guest OS images (Windows, some enterprise Linux) | +Migrated workloads from VMware or environments requiring VMXNET3 semantics | +
+
Physical Host (Management Node)
+ โโโ Linux Bridge (vmbr0) - Managed by platform
+ โโโ Host Interface (eth0) - Physical NIC
+ โโโ VLAN Interfaces (vmbr0.100, vmbr0.200)
+ โโโ TAP Device (vnetX) - Created per VM
+ โโโ QEMU VM
+ โโโ VirtIO/E1000 Network Adapter
+ โโโ Guest OS Network Stack
+
+# Bridge Configuration (managed by platform)
+# /etc/network/interfaces or netplan
+auto vmbr0
+iface vmbr0 inet static
+ address 192.168.1.10/24
+ gateway 192.168.1.1
+ bridge_ports eth0
+ bridge_stp off
+ bridge_fd 0
+ bridge_vlan_aware yes
+ + TAP devices operate at Layer 2 (Ethernet) and are bridged to the physical network interface. The management platform automatically creates and manages TAP devices for each VM network interface. +
+
+
The Network tab mirrors the bridge definitions on each Proxmox node (for example, vmbr0 for the public network). When you attach a NIC in the UI, the backend writes the same net0=... syntax that Proxmox uses, including MAC address, bridge, firewall flag, VLAN tag, and rate limits.
This means any change you makeโadding a VirtIO adapter, toggling the firewall, or tagging a VLANโis propagated down to the node in the exact format it expects, ensuring the guest receives the configuration you see on screen.
+
+
# QEMU command-line equivalent
+-netdev type=tap,id=net0,ifname=vnet0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown \\
+-device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:56,bus=pcie.0,addr=0x2
+
+# Configuration parameters:
+# -netdev type: tap|user|bridge|socket
+# -device: virtio-net-pci|e1000|rtl8139
+# mac: MAC address (auto-generated if not specified)
+# bus: PCIe bus location
+# addr: PCIe device address
+ | Feature | +Implementation | +Security Level | +
|---|---|---|
| MAC Address Filtering | +Linux bridge ebtables rules | +Layer 2 protection | +
| VLAN Isolation | +802.1Q VLAN tagging | +Network segmentation | +
| Firewall Rules | +iptables/nftables on host | +Layer 3/4 filtering | +
| Private Networks | +RFC 1918 address space | +NAT isolation | +
VirtIO Performance Optimization:
+mq=on,vectors=4 for multi-core VMs# Optimized VirtIO configuration
+-device virtio-net-pci,netdev=net0,mq=on,vectors=4
+
+# Enable vhost-net in QEMU
+-netdev type=tap,id=net0,vhost=on
+ Troubleshooting Tips:
+Use standard Linux networking tools on the node, such as ip link show type tap to inspect TAP interfaces, tcpdump -i vmbr0 to watch bridge traffic, and bridge fdb show to view MAC tables.
Inside the hypervisor shell, qm config <vmid> lists the virtual NICs (net0, net1, etc.) exactly as the platform created them. You can also open a QEMU monitor session (qm monitor <vmid>) and run info network for deeper diagnostics.
If you suspect bridge or firewall issues, brctl show vmbr0, bridge vlan show, and filtering iptables -L output by bridge name are quick ways to confirm whether packets are being forwarded.
+ The management platform includes an integrated firewall system that can apply rules at the VM level, bridge level, or cluster level. +
+Toggling the firewall slider on a NIC tells the backend to recreate that interface definition with the firewall flag enabled. Any rules you define in the UI (direction, action, CIDRs, ports, comments) are stored centrally and rendered to iptables on the node, so you don't have to craft rule syntax yourself.
+The platform automatically maps rules to the correct chainsโINPUT for traffic hitting the node, FORWARD for VM-to-VM flows, and OUTPUT for traffic originating from the VMโkeeping your policy consistent across the cluster.
++ IPv4 and IPv6 are separate and independent network protocols that operate at the same layer (Layer 3) but use completely different addressing schemes and have distinct characteristics. Understanding their differences is crucial for proper network configuration. +
+ +| Characteristic | +IPv4 | +IPv6 | +
|---|---|---|
| Address Length | +32 bits (4 bytes) | +128 bits (16 bytes) | +
| Address Format | +192.168.1.1 (dotted decimal) |
+ 2001:db8::1 (hexadecimal) |
+
| Address Space | +~4.3 billion addresses | +~340 undecillion addresses | +
| NAT Requirement | +Commonly required due to address exhaustion | +Not required (sufficient addresses) | +
| Header Size | +20 bytes (minimum) | +40 bytes (fixed) | +
| Fragmentation | +Performed by routers | +Performed by source only | +
| Security | +Optional (IPsec) | +Built-in (IPsec mandatory) | +
| Configuration | +Manual or DHCP | +SLAAC (Stateless) or DHCPv6 | +
+ IPv4 and IPv6 are completely separate protocols: +
+Why Some Services Remain IPv4-Only
++ Many critical internet services, particularly email and legacy systems, are typically deployed only on IPv4 for compatibility reasons: +
++ Best Practice: Deploy services on both IPv4 and IPv6 (dual-stack) when possible, but always ensure IPv4 connectivity for maximum compatibility, especially for email and critical business applications. +
++ The following chart from APNIC Labs shows the current IPv6 adoption rate for the world. IPv6 adoption varies significantly by region, with some countries having over 50% adoption while others remain primarily on IPv4. +
+ ++ Source: APNIC IPv6 Statistics - World (XA) - Asia-Pacific Network Information Centre +
++ Dual-stack refers to running both IPv4 and IPv6 simultaneously on the same network interface. This is the recommended approach for maximum compatibility: +
+# Example dual-stack configuration (Linux)
+# IPv4 configuration
+ifconfig eth0 203.0.113.10 netmask 255.255.255.0
+route add default gw 203.0.113.1
+
+# IPv6 configuration (SLAAC or static)
+ip -6 addr add 2001:db8::100/64 dev eth0
+ip -6 route add default via 2001:db8::1
+
+# Both protocols operate independently on the same interface
+ + NAT64 (Network Address Translation 64) and DNS64 (DNS 64) are transition technologies defined in RFC 6146 and RFC 6147 that enable IPv6-only clients to communicate with IPv4-only servers. Together, they bridge the protocol gap during the IPv6 transition period. +
+ ++ Step-by-step process: +
+example.com)64:ff9b::/96 or a NAT64 prefix)# Example: DNS64 address synthesis
+# IPv4 address: 203.0.113.10
+# NAT64 prefix: 64:ff9b::/96
+#
+# DNS64 synthesizes: 64:ff9b::203.0.113.10
+# (Embedded IPv4: 203.0.113.10 = 0xCB00710A in hex)
+# Result: 64:ff9b::CB00:710A
+
+# Client connects to: 64:ff9b::CB00:710A
+# NAT64 extracts: 203.0.113.10
+# NAT64 forwards to IPv4 server: 203.0.113.10
+ Important Limitations:
+| Prefix | +Type | +Description | +
|---|---|---|
64:ff9b::/96 |
+ Well-Known | +RFC 6052 well-known prefix for NAT64 (most common) | +
2001:db8::/96 |
+ Documentation | +Example/documentation prefix (RFC 3849) | +
Custom /96 |
+ Provider | +ISP or organization-specific prefix | +
โ Good Use Cases:
+โ Not Recommended For:
+
+
+ Dual-stack is preferred over NAT64/DNS64 when possible, as it provides native connectivity without translation overhead. Use NAT64/DNS64 primarily for IPv6-only networks that need occasional IPv4 access, or as a transition mechanism during IPv6 deployment phases. +
++ This section provides a comprehensive reference to all RFC (Request for Comments) standards that apply to virtual machine configuration and networking. +
+ +| RFC Number | +Title | +Category | +Applies To | +
|---|---|---|---|
| RFC 791 | +Internet Protocol (IPv4) | +Network | +IPv4 packet format, addressing, and routing behaviour used by all IPv4 networking features. | +
| RFC 1034 | +Domain Names โ Concepts and Facilities | +DNS | +High-level DNS model and resolution process referenced by DNS and subdomain configuration. | +
| RFC 1035 | +Domain Names โ Implementation and Specification | +DNS | +Hostname syntax and record formats; hostname/subdomain validation rules in the UI are based on this RFC. | +
| RFC 1918 | +Address Allocation for Private Internets | +Network | +Defines private IPv4 ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) used to distinguish public vs. private addresses in UI explanations. | +
| RFC 2460 / RFC 8200 | +Internet Protocol Version 6 (IPv6) | +Network | +IPv6 header format and addressing used by IPv6 network configuration and Network Analysis. | +
| RFC 3330 / RFC 6890 | +Special-Use IPv4 Addresses | +Network | +Special-purpose IPv4 ranges (loopback, link-local, multicast) referenced when explaining address types. | +
| RFC 3596 | +DNS Extensions to Support IPv6 | +DNS | +AAAA record format used for IPv6 DNS entries in network examples. | +
| RFC 4253 | +SSH Transport Layer Protocol | +Security | +SSH key formats and transport, referenced in SSH key management and Cloud-init examples. | +
| RFC 5656 | +Elliptic Curve Algorithm Integration in SSH | +Security | +ECDSA SSH keys used in recommended key types for secure access. | +
| RFC 6143 | +The Remote Framebuffer Protocol | +Remote Access | +VNC/NoVNC protocol used for graphical console access. | +
| RFC 7230โ7235 | +HTTP/1.1 Message Syntax and Routing | +API | +HTTP semantics for all API requests between the control panel and Proxmox/Core Router services. | +
| RFC 8709 | +Ed25519 for SSH | +Security | +Defines ED25519 SSH keys, which are recommended as a modern, secure key type. | +
+ Common issues and their solutions for virtual machine management. +
+ +| Symptom | +Possible Cause | +Solution | +
|---|---|---|
| Black screen, no boot | +No bootable media in boot order | +Check boot order, ensure OS is installed | +
| Boot loop | +Corrupted boot sector or OS | +Restore from backup or reinstall OS | +
| Firmware error | +Incompatible firmware type | +Change firmware type in System tab | +
+ The Subdomain tab allows you to create and manage DNS subdomains for your virtual machine. Each subdomain points to one of your assigned public IP addresses. +
+ +| Record Type | +RFC Standard | +Purpose | +Example | +
|---|---|---|---|
| A Record | +RFC 1035 | +Maps domain to IPv4 address | +web.dns.virtnet.host โ 192.168.1.1 |
+
| AAAA Record | +RFC 3596 | +Maps domain to IPv6 address | +web.dns.virtnet.host โ 2001:db8::1 |
+
| Wildcard (*) | +RFC 1035 | +Matches all subdomains | +*.web.dns.virtnet.host |
+
Subdomain Limitations
+
+
# DNS Resource Record Format (RFC 1035 Section 3.2.1)
+NAME TYPE CLASS TTL RDLENGTH RDATA
+web.example.com A IN 3600 4 192.168.1.1
+
+# DNS Message Format
+Header (12 bytes)
+ - ID (16 bits): Transaction identifier
+ - Flags (16 bits): QR, Opcode, AA, TC, RD, RA, Z, RCODE
+ - QDCOUNT (16 bits): Number of questions
+ - ANCOUNT (16 bits): Number of answers
+ - NSCOUNT (16 bits): Number of authority records
+ - ARCOUNT (16 bits): Number of additional records
+
+Question Section
+ - QNAME: Domain name (variable length)
+ - QTYPE: Record type (A=1, AAAA=28)
+ - QCLASS: Class (IN=1)
+
+Answer Section
+ - Resource Records (variable)
+ | TTL Value | +Cache Duration | +Use Case | +
|---|---|---|
60 |
+ 1 minute | +Frequent changes, testing | +
300 |
+ 5 minutes | +Development environments | +
3600 |
+ 1 hour | +Standard production (default) | +
86400 |
+ 24 hours | +Stable services | +
+ While DNSSEC is not currently implemented in the subdomain system, understanding DNS security is important: +
++ Cloud-init is a standard method for customizing cloud instances during boot. It allows you to configure users, SSH keys, network settings, and more automatically when the VM first starts. +
+ +| Section | +Configuration | +Applied On | +
|---|---|---|
| Access & Credentials | +Users, passwords, SSH keys | +First boot | +
| Network Configuration | +Static IPs, gateways, DNS | +First boot | +
| DNS Settings | +Nameservers | +First boot | +
| OS Type | +Operating system selection | +Configuration format | +
+
# /var/lib/cloud/seed/nocloud/user-data
+#cloud-config
+users:
+ - name: admin
+ groups: sudo
+ shell: /bin/bash
+ sudo: ALL=(ALL) NOPASSWD:ALL
+ ssh_authorized_keys:
+ - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
+ lock_passwd: false
+ passwd: $6$rounds=4096$salt$hashedpassword
+
+# Network configuration (version 2)
+network:
+ version: 2
+ ethernets:
+ eth0:
+ addresses:
+ - 192.168.1.100/24
+ gateway4: 192.168.1.1
+ nameservers:
+ addresses:
+ - 8.8.8.8
+ - 8.8.4.4
+
+# DNS configuration
+manage_resolv_conf: true
+resolv_conf:
+ nameservers: ['8.8.8.8', '1.1.1.1']
+ searchdomains: ['example.com']
+ # QEMU cloud-init configuration
+{
+ "cicustom": "user=local:snippets/user-data",
+ "cipassword": "$5$rounds=5000$salt$hash",
+ "ciuser": "admin",
+ "ipconfig0": "ip=192.168.1.100/24,gw=192.168.1.1",
+ "nameserver": "8.8.8.8 8.8.4.4",
+ "searchdomain": "example.com",
+ "ostype": "l26" # Linux 2.6+ kernel
+}
+
+# Cloud-init data source (NoCloud)
+-drive file=user-data.img,format=raw,if=virtio
+-drive file=meta-data.img,format=raw,if=virtio
+ SSH Public Key Format:
+# RSA key (RFC 4253 Section 6.6)
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ... user@host
+
+# ED25519 key (RFC 8709)
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... user@host
+
+# ECDSA key (RFC 5656)
+ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBB... user@host
+
+# Key fingerprint (SHA256)
+ssh-keygen -lf ~/.ssh/id_rsa.pub
+# SHA256:AbCdEf1234567890... user@host (RSA)
+ + Security Best Practice: Use ED25519 keys (stronger, faster) or RSA 4096-bit minimum. +
+Static IP Configuration (RFC 791/2460):
+# IPv4 Static Configuration
+network:
+ version: 2
+ ethernets:
+ eth0:
+ addresses:
+ - 192.168.1.100/24 # CIDR notation
+ gateway4: 192.168.1.1 # Default gateway
+ routes:
+ - to: 10.0.0.0/8
+ via: 192.168.1.254
+ nameservers:
+ addresses: [8.8.8.8, 1.1.1.1]
+ search: [example.com]
+
+# IPv6 Static Configuration (RFC 2460)
+network:
+ version: 2
+ ethernets:
+ eth0:
+ addresses:
+ - 2001:db8::100/64
+ gateway6: 2001:db8::1
+ nameservers:
+ addresses: [2001:4860:4860::8888]
+ + The Display tab allows you to configure the virtual graphics adapter and video memory for your virtual machine. These settings affect how the VM displays output and can impact performance in graphical environments. +
+ +| Type | +Paravirtualized GPU (VirtIO specification) | +
| Performance | +Excellent - Hardware acceleration support | +
| Max VRAM | +256 MB (configurable in 16 MB increments) | +
| Resolution Support | +Up to 4K (3840x2160) and higher | +
| OS Support | +Linux (excellent), Windows 10+ (good with drivers) | +
| Features | +Hardware acceleration, 3D acceleration (experimental), multiple displays | +
| QEMU Device | +virtio-gpu-pci |
+
Technical Details:
+Configuration Example:
+# Platform configuration
+{
+ "vga": "virtio",
+ "memory": 4096,
+ "balloon": 0
+}
+
+# QEMU command-line equivalent
+-device virtio-gpu-pci,id=gp0,max_outputs=1 \\
+-global virtio-gpu-pci.virgl=on \\
+-global virtio-gpu-pci.edid=on
+
+# With 3D acceleration (requires host GPU)
+-device virtio-gpu-pci,virgl=on
+ | Type | +Emulated VGA adapter (Cirrus Logic CLGD 5446) | +
| Performance | +Good - Software emulation | +
| VRAM | +16 MB (fixed, not configurable) | +
| Resolution Support | +Up to 1920x1200 (depends on guest drivers) | +
| OS Support | +All operating systems (universal compatibility) | +
| Features | +VGA text mode, basic 2D graphics, VBE (VESA BIOS Extensions) | +
| QEMU Device | +VGA or cirrus-vga |
+
Technical Details:
+Configuration Example:
+# Platform configuration
+{
+ "vga": "std"
+}
+
+# QEMU command-line equivalent
+-vga std
+# or explicitly
+-device VGA
+ | Type | +Emulated VMware SVGA II adapter | +
| Performance | +Good - Optimized for VMware compatibility | +
| VRAM | +Up to 256 MB (configurable) | +
| Resolution Support | +Up to 2560x1600 (with VMware drivers) | +
| OS Support | +All OS (best with VMware Tools/drivers installed) | +
| Features | +VMware SVGA II protocol, 2D acceleration, seamless mouse integration | +
| QEMU Device | +vmware-svga |
+
Technical Details:
+Configuration Example:
+# Platform configuration
+{
+ "vga": "vmware"
+}
+
+# QEMU command-line equivalent
+-device vmware-svga,id=video0,vram=256
+ | Type | +Paravirtualized 2D graphics adapter | +
| Performance | +Very Good - 2D acceleration support | +
| VRAM | +Up to 64 MB (configurable, default 16 MB) | +
| Resolution Support | +Up to 2560x1600 (with QXL drivers) | +
| OS Support | +Linux (excellent), Windows (good with SPICE drivers) | +
| Features | +2D acceleration, multiple displays, SPICE protocol support | +
| QEMU Device | +qxl-vga or qxl |
+
Technical Details:
+Configuration Example:
+# Platform configuration
+{
+ "vga": "qxl"
+}
+
+# QEMU command-line equivalent
+-device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864
+
+# With SPICE
+-device qxl-vga,id=video0 \\
+-spice port=5900,disable-ticketing
+ | Type | +No graphics adapter (VGA disabled) | +
| Performance | +N/A - No graphics overhead | +
| VRAM | +0 MB (no graphics memory allocated) | +
| Console Access | +Serial console only (no VNC/graphical console) | +
| OS Support | +All OS (requires serial console support) | +
| Use Case | +Headless servers, minimal resource usage, cloud instances | +
Technical Details:
+Configuration Example:
+# Platform configuration
+{
+ "vga": "none"
+}
+
+# QEMU command-line equivalent
+-nodefaults -nographic
+# or
+-vga none -serial stdio
+ | Type | +Text-only console via serial port | +
| Performance | +N/A - Text output only | +
| VRAM | +0 MB (no graphics) | +
| Console Access | +Serial port (ttyS0, COM1, etc.) | +
| OS Support | +All OS (requires serial console kernel parameter) | +
| Use Case | +Server management, remote administration, automation | +
Technical Details:
+console=ttyS0Configuration Example:
+# Platform configuration
+{
+ "vga": "serial0",
+ "serial0": "socket"
+}
+
+# QEMU command-line equivalent
+-vga serial0 -serial stdio
+# or network socket
+-serial telnet:localhost:4444,server,nowait
+ | Adapter | +Performance | +Max VRAM | +Linux | +Windows | +3D Accel | +Multi-Display | +
|---|---|---|---|---|---|---|
| VirtIO-GPU | +
+
+
+ |
+ 256 MB | +||||
| Standard VGA | +
+
+
+ |
+ 16 MB | +||||
| VMware SVGA | +
+
+
+ |
+ 256 MB | +||||
| QXL | +
+
+
+ |
+ 64 MB | +||||
| No Display | +N/A | +0 MB | +N/A | +N/A | +
VRAM Allocation Guidelines:
+| Use Case | +Recommended VRAM | +Resolution | +
|---|---|---|
| Text console only | +16 MB | +N/A | +
| Basic desktop (1024x768) | +32-64 MB | +1024x768 | +
| Standard desktop (1920x1080) | +64-128 MB | +1920x1080 | +
| High-res desktop (2560x1440) | +128-192 MB | +2560x1440 | +
| 4K display (3840x2160) | +256 MB | +3840x2160 | +
+ Note: VRAM is allocated from VM's main memory. Higher VRAM reduces available RAM for the guest OS. Use the minimum required for your use case. +
+Changing the display adapter in the UI instructs the backend to update the VMโs vga parameter to VirtIO, Standard VGA, VMware SVGA, QXL, or โnoneโ for headless guests. Selecting โSerial consoleโ rewires the console tab to a text-only TTY.
When you adjust video memory, the platform recalculates the amount of VRAM allocated from system RAM (16โ256 MB for VirtIO-GPU) and pushes that value to the node. Disabling the memory balloon when large VRAM is requested prevents the guest from losing addressable space.
++ The Statistics tab provides comprehensive performance monitoring and historical data tracking for your virtual machine. It automatically collects metrics hourly and allows you to create manual snapshots for detailed analysis. +
+ ++ The system automatically collects statistics once every hour for all VPS, regardless of their power state or status. This ensures you have a continuous record of your server's performance over time. +
+| Collection Frequency | +Once every hour (24 times per day) | +
| Maximum Entries | +24 automatic statistics per server | +
| Retention Policy | +Oldest entries are automatically removed when limit is reached | +
| Power State | +Statistics collected regardless of VM power state (running, stopped, etc.) | +
| Background Process | +Runs automatically via Laravel task scheduler | +
+ In addition to automatic collection, you can create up to 5 manual statistics snapshots at any time. These are useful for capturing performance data at specific moments. +
+| Maximum Manual Entries | +5 per server | +
| Use Cases | +Before/after configuration changes, troubleshooting, performance analysis | +
| Deletion | +Manual statistics can be deleted individually to free up space | +
| Data Captured | +Same metrics as automatic statistics (CPU, memory, disk, network, etc.) | +
| Metric | +Description | +Display Format | +
|---|---|---|
| CPU Usage | +Current CPU utilization as a percentage of allocated CPU resources | +Percentage (0-100%) | +
| Memory Usage | +Current RAM utilization compared to maximum allocated memory | +Percentage (0-100%) | +
| Disk Usage | +Disk space used compared to total allocated disk space | +Percentage (0-100%) | +
| Network In | +Total bytes received since VM start (difference shown between statistics) | +Bytes with rate (bytes/s) | +
| Network Out | +Total bytes transmitted since VM start (difference shown between statistics) | +Bytes with rate (bytes/s) | +
| Disk I/O | +Disk read and write operations (difference shown between statistics) | +Bytes (read/write) | +
| Uptime | +Total time the VM has been running since last boot | +Formatted (days, hours, minutes, seconds) | +
| VM Status | +Current power state of the virtual machine | +Running, Stopped, etc. | +
+ The Task History section displays all tasks executed on your virtual machine through the Proxmox API. This includes operations like VM management, configuration changes, backups, and other administrative tasks. +
+| Auto-Refresh | +Task list refreshes every 10 seconds automatically | +
| Task Details | +Click the expand arrow to view detailed task information and logs | +
| Status Indicators | +Tasks show completion status (Success/Failure) with timestamps | +
| Task Types | +VM operations, configuration changes, backups, migrations, etc. | +
+ Network In/Out and Disk I/O values displayed in the statistics table represent the difference between the current statistic and the previous one. This shows the amount of data transferred or disk operations performed during the time period between statistics. The rate (bytes/s) is calculated based on the time difference between statistics. +
++ Automatic statistics are maintained at a maximum of 24 entries per server. When this limit is reached, the oldest automatic statistic is automatically removed when a new one is created. Manual statistics are separate and can be individually deleted. This ensures you always have the most recent 24 hours of automatic performance data while allowing flexibility for manual snapshots. +
++ Statistics are collected for all virtual machines regardless of their power state (running, stopped, suspended) or service status. This ensures you have a complete historical record of your server's state and can track performance even when the VM is not actively running. Some metrics (like CPU usage) will be zero or minimal when the VM is stopped, but the data point is still valuable for historical tracking. +
+
+
# Statistics collection runs via Laravel scheduler
+# Scheduled command: proxmox:poll-statistics
+# Frequency: Hourly (every hour on the hour)
+
+# Command implementation:
+php artisan schedule:run
+
+# The scheduler executes:
+Schedule::command(PollServerStatistics::class)
+ ->description('Poll Proxmox server statistics hourly')
+ ->hourly();
+
+# Statistics are stored in database table:
+# ext_proxmox_servers_statistics
+
+# Fields tracked:
+# - server_id: Foreign key to server
+# - netin, netout: Network traffic counters
+# - diskread, diskwrite: Disk I/O counters
+# - diskused, diskmax: Disk space usage
+# - memoryused, memorymax: Memory usage
+# - cpuused, cpumax: CPU usage
+# - uptime: VM uptime in seconds
+# - vmstatus: Current VM power state
+# - DateTime: Timestamp of statistic
+# - is_automatic: Boolean flag (true for automatic, false for manual)
+
+
# Automatic statistics cleanup logic:
+# When creating a new automatic statistic:
+
+1. Create new statistic with is_automatic = true
+2. Count total automatic statistics for server
+3. If count > 24:
+ - Find oldest automatic statistics (order by DateTime ASC)
+ - Delete excess entries (count - 24)
+ - Keep exactly 24 automatic statistics
+
+# Manual statistics management:
+# - Users can create up to 5 manual statistics
+# - Manual statistics are marked with is_automatic = false
+# - Manual statistics can be deleted individually
+# - Manual statistics are NOT automatically cleaned up
+
+# Query examples:
+# Get all statistics for a server:
+SELECT * FROM ext_proxmox_servers_statistics
+WHERE server_id = ?
+ORDER BY DateTime DESC;
+
+# Get only automatic statistics:
+SELECT * FROM ext_proxmox_servers_statistics
+WHERE server_id = ? AND is_automatic = true
+ORDER BY DateTime DESC
+LIMIT 24;
+
+# Get manual statistics:
+SELECT * FROM ext_proxmox_servers_statistics
+WHERE server_id = ? AND is_automatic = false
+ORDER BY DateTime DESC;
+ + The Live Telemetry section at the top of the Statistics tab shows real-time performance graphs sourced directly from the Proxmox RRD API. These graphs are optimized to load quickly and to avoid overloading either the browser or the API. +
+| Graphs | +Processor Utilization, Network Traffic, Memory Utilization, Storage I/O | +
| Update Source | +Proxmox RRD API (/nodes/{node}/qemu/{vmid}/rrddata) |
+
| Auto-Refresh | +Graphs request fresh data every 2 minutes while the Statistics tab is open. | +
| Data Sampling | +Each graph is sampled down to a maximum of 40 data points to keep rendering smooth and payloads small. | +
| Aggregation | +Average uses RRD's AVERAGE consolidation function, and Maximum uses the MAX function. | +
+
+ The Network Analysis section is powered by an external Core Router API and provides deep visibility into active firewall sessions, top peers, ports, and security events related to your server's IP addresses. +
+| Data Source | +Core Router API firewall state table (list of active sessions). | +
| IP Filtering | +Only connections where the source or destination matches an IP assigned to your server are included. | +
| Sections | +Active Connections, Top Peers, Top Ports, and Security (threat detections). | +
| Loading Behaviour | +Network Analysis is loaded when the Statistics tab opens. If the Core Router API is not configured or the server has no IPs, a clear warning message is shown instead of an endless loading state. | +
| Error Handling | +HTTP 502 errors from the Core Router API trigger automatic, limited retries with exponential backoff before a final error is presented. | +
+
+
| Type | +Features | +Use Case | +
|---|---|---|
| Q35 | +PCIe, UEFI-friendly, modern | +Recommended for modern OS | +
| i440fx | +Legacy chipset, maximum compatibility | +Legacy systems, compatibility | +
| Firmware | +Type | +Features | +
|---|---|---|
| SeaBIOS | +Legacy BIOS | +Maximum compatibility, all OS | +
| OVMF | +UEFI | +Secure Boot, modern Windows, GPT disks | +
Overview
++ EFI (Extensible Firmware Interface) disks and TPM (Trusted Platform Module) devices are security and compatibility features required for modern operating systems and security-hardened configurations. Understanding when and why to implement these is crucial for proper VM configuration. +
++ EFI disks are small storage devices (typically 4MB) that store UEFI firmware variables, boot configuration, and Secure Boot keys. They are essential for UEFI-based virtual machines. +
+ +| Requirement | +Explanation | +Mandatory | +
|---|---|---|
| UEFI Firmware (OVMF) | +EFI disks are required when using OVMF/UEFI firmware instead of SeaBIOS | +|
| Secure Boot | +Secure Boot requires EFI disk to store keys and boot configuration | +|
| Modern Windows (10/11) | +Windows 10/11 installations typically require UEFI, which needs EFI disk | +|
| GPT Disk Partitions | +Disks larger than 2TB or using GPT require UEFI, which needs EFI disk | +|
| Linux with Secure Boot | +Security-hardened Linux distributions requiring Secure Boot | +|
| Legacy BIOS (SeaBIOS) | +EFI disks are not needed and not supported with legacy BIOS | +
+
# EFI disk configuration via platform API
+PUT /api2/json/nodes/{node}/qemu/{vmid}/config
+{
+ "bios": "ovmf", # Required: Use UEFI firmware
+ "efidisk0": "local-lvm:vm-100-disk-1,size=4M,format=raw",
+ "machine": "q35" # Required: Q35 chipset for UEFI
+}
+
+# EFI disk storage format:
+# efidisk0: storage:disk-name,size=4M,format=raw
+# - storage: Storage backend (local-lvm, cephpool, etc.)
+# - size: Fixed at 4MB (platform standard)
+# - format: Always raw format
+
+# Multiple EFI disks (advanced):
+# efidisk0: local-lvm:vm-100-efi-0,size=4M
+# efidisk1: local-lvm:vm-100-efi-1,size=4M # Additional EFI disk slot
+ + When creating an EFI disk, you can enable "Preenroll keys" to automatically configure Secure Boot keys during EFI disk creation. +
+| Option | +Effect | +Use Case | +
|---|---|---|
| Preenroll Keys: Enabled | +Secure Boot keys pre-enrolled, Secure Boot enabled by default | +Security-hardened systems, Windows 11, Secure Boot required | +
| Preenroll Keys: Disabled | +EFI disk created without Secure Boot keys, Secure Boot disabled | +UEFI without Secure Boot, development, custom key management | +
# Create EFI disk with preenrolled keys
+POST /api2/json/nodes/{node}/qemu/{vmid}/config
+{
+ "efidisk0": "local-lvm:vm-100-disk-1,size=4M,format=raw",
+ "efidisk0_pre_enrolled_keys": 1 # Enable preenroll keys
+}
+
+# Secure Boot keys included:
+# - Microsoft Windows Production CA (for Windows)
+# - Microsoft Corporation UEFI CA (for Windows)
+# - Canonical Ltd. Master CA (for Ubuntu)
+# - Other common distribution keys
+ + TPM (Trusted Platform Module) devices provide hardware-based security features for virtual machines. They enable secure boot, disk encryption, and other security features that require TPM functionality. +
+ +| Requirement | +Explanation | +Mandatory | +
|---|---|---|
| Windows 11 | +Windows 11 requires TPM 2.0 for installation and operation | +|
| BitLocker Encryption | +Windows BitLocker requires TPM for key storage and system integrity | +|
| Windows Device Guard | +Windows security feature requiring TPM for attestation | +|
| Linux Secure Boot (Advanced) | +Some security-hardened Linux configurations use TPM for measured boot | +|
| Disk Encryption (LUKS with TPM) | +Linux LUKS encryption can use TPM for key storage | +|
| General Use Cases | +TPM not required for standard VM operations or older OS versions | +
| Version | +Specification | +Features | +Recommended For | +
|---|---|---|---|
| TPM v2.0 | +TPM 2.0 Specification (ISO/IEC 11889) | +Enhanced security, better algorithms, Windows 11 support | +Windows 11, modern security requirements, recommended | +
| TPM v1.2 | +TPM 1.2 Specification | +Legacy support, basic TPM functionality | +Legacy systems, older Windows versions, compatibility | +
+
# TPM device configuration via platform API
+PUT /api2/json/nodes/{node}/qemu/{vmid}/config
+{
+ "tpmstate0": "local-lvm:vm-100-tpm-0,size=4M,version=v2.0",
+ "machine": "q35" # TPM requires Q35 chipset
+}
+
+# TPM storage format:
+# tpmstate0: storage:disk-name,size=4M,version=v2.0
+# - storage: Storage backend (local-lvm, cephpool, etc.)
+# - size: Fixed at 4MB (platform standard)
+# - version: v2.0 (recommended) or v1.2 (legacy)
+
+# Multiple TPM devices (advanced):
+# tpmstate0: local-lvm:vm-100-tpm-0,size=4M,version=v2.0
+# tpmstate1: local-lvm:vm-100-tpm-1,size=4M,version=v2.0
+ Critical: TPM State Backup
++ If a VM uses TPM with BitLocker or disk encryption, losing the TPM state file will result in permanent data loss. Always ensure TPM state files are included in backups and stored securely. +
++ 1 + Configure Firmware and Machine Type +
+PUT /api2/json/nodes/{node}/qemu/{vmid}/config
+{
+ "bios": "ovmf", # Required for EFI/TPM
+ "machine": "q35" # Required for UEFI/TPM support
+}
+ + 2 + Add EFI Disk (if using UEFI) +
+PUT /api2/json/nodes/{node}/qemu/{vmid}/config
+{
+ "efidisk0": "local-lvm:vm-100-efi-0,size=4M,format=raw",
+ "efidisk0_pre_enrolled_keys": 1 # Enable if Secure Boot needed
+}
+ + 3 + Add TPM Device (if required) +
+PUT /api2/json/nodes/{node}/qemu/{vmid}/config
+{
+ "tpmstate0": "local-lvm:vm-100-tpm-0,size=4M,version=v2.0"
+}
+ + 4 + Verify Configuration +
+GET /api2/json/nodes/{node}/qemu/{vmid}/config
+# Verify efidisk0 and tpmstate0 entries exist
+ | EFI Disk | +|
| TPM Device | +|
| Preenroll Keys | +|
| Machine Type | +Q35 (required for UEFI/TPM) | +
+ Windows 11 has strict hardware requirements including TPM 2.0 and UEFI firmware with Secure Boot capability. Both EFI disk and TPM device are mandatory. +
+| EFI Disk | +|
| TPM Device | +|
| TPM Version | +v2.0 (recommended for BitLocker) | +
+ BitLocker uses TPM to store encryption keys securely. Without TPM, BitLocker requires a recovery key or password on every boot, which is less secure and less convenient. +
+| EFI Disk | +|
| TPM Device | +|
| Preenroll Keys | +Enable for Secure Boot with signed kernels | +
+ Linux distributions with Secure Boot support (Ubuntu, RHEL, etc.) require EFI disk. TPM is optional but recommended for measured boot and disk encryption with TPM integration. +
+| EFI Disk | +|
| TPM Device | +
+ Standard Linux servers without security requirements can use legacy BIOS (SeaBIOS) and don't need EFI or TPM devices. This reduces complexity and resource usage. +
+| Issue | +Cause | +Solution | +
|---|---|---|
| VM won't boot with UEFI | +EFI disk missing or incorrectly configured | +Add efidisk0 with correct storage backend | +
| Windows 11 installation fails | +TPM 2.0 not detected | +Add tpmstate0 with version=v2.0 | +
| Secure Boot not working | +Keys not pre-enrolled in EFI disk | +Recreate EFI disk with preenroll keys enabled | +
| BitLocker recovery required | +TPM state lost or corrupted | +Restore TPM state from backup or use recovery key | +
| EFI/TPM not available | +Using i440fx machine type | +Change machine type to Q35 | +
+
# Platform disk configuration format
+# scsi0: storage:disk-name,size=32G,format=raw,cache=writeback,iothread=1
+
+# Storage types:
+# - local-lvm: LVM thin pool (local-lvm:vm-100-disk-0)
+# - cephpool: Ceph RBD (cephpool:vm-100-disk-0)
+# - local: Directory storage (local:100/vm-100-disk-0.raw)
+# - nfs: NFS mount (nfs:vm-100-disk-0)
+
+# Disk options:
+# - size: Disk size (e.g., 32G, 100G)
+# - format: raw|qcow2|vmdk
+# - cache: none|writeback|writethrough|unsafe|directsync
+# - iothread: Enable I/O thread (1|0)
+# - discard: Enable TRIM/discard (on|ignore)
+# - ssd: Emulate SSD (1|0)
+# - replicate: Enable replication (1|0) - for Ceph
+
+# Example configurations:
+{
+ "scsi0": "local-lvm:vm-100-disk-0,size=32G,format=raw,cache=writeback",
+ "scsi1": "cephpool:vm-100-disk-1,size=100G,format=raw,replicate=1",
+ "ide2": "local:iso/debian-12.iso,media=cdrom"
+}
+
+# Add disk via API
+POST /api2/json/nodes/{node}/qemu/{vmid}/config
+{
+ "scsi1": "local-lvm:vm-100-disk-1,size=50G"
+}
+ Platform Resource Management:
+# Resource pools allow grouping VMs for management
+POST /api2/json/pools
+{
+ "poolid": "production",
+ "comment": "Production VMs"
+}
+
+# Add VM to pool
+PUT /api2/json/pools/{poolid}
+{
+ "vms": "100,101,102"
+}
+
+# Resource limits per VM
+PUT /api2/json/nodes/{node}/qemu/{vmid}/config
+{
+ "memory": 4096, # RAM in MB
+ "cores": 4, # CPU cores
+ "cpu": "host", # CPU type
+ "balloon": 1024, # Balloon device memory (MB)
+ "shares": 1000, # CPU shares (relative priority)
+ "cpulimit": 2, # CPU limit (cores)
+ "cpuunits": 1024, # CPU weight (relative to 1024)
+ "net0": "virtio=...,rate=100" # Network rate limit (MB/s)
+}
+
+# Platform automatically enforces limits via:
+# - cgroups (CPU, memory)
+# - tc (traffic control for network)
+# - iotune (disk I/O limits)
+ + The platform supports high availability for VMs across cluster nodes using Corosync and Pacemaker. +
+# Enable HA for VM
+POST /api2/json/cluster/ha/groups
+{
+ "group": "production",
+ "nodes": "pve-node-01,pve-node-02,pve-node-03",
+ "restart": 1,
+ "max_restart": 3,
+ "max_relocate": 3
+}
+
+POST /api2/json/cluster/ha/resources
+{
+ "sid": "vm:100",
+ "group": "production",
+ "max_restart": 3,
+ "max_relocate": 3
+}
+
+# HA behavior:
+# - Automatic VM restart on node failure
+# - VM migration to healthy node
+# - Fencing of failed nodes
+# - Requires shared storage (Ceph, NFS)
+
+# HA requirements:
+# - Minimum 3 nodes for quorum
+# - Shared storage for VM disks
+# - Network connectivity between nodes
+# - Corosync cluster configuration
+ Restoration Warning
+Restoring a backup will replace the current VM state. All changes made after the backup was created will be permanently lost.
+
+
+ The management platform uses a proprietary backup format (VMA - Virtual Machine Archive) that stores complete VM state including disks, configuration, and snapshots. +
+# Backup file format
+vzdump-qemu-{vmid}-{timestamp}.vma.zst
+
+# Backup contents:
+# - VM configuration (QEMU config)
+# - Disk images (raw or qcow2)
+# - Metadata (VM name, description, tags)
+# - Compression: zstd (default) or gzip
+
+# Backup storage locations
+# - local storage: /var/lib/vz/dump/
+# - NFS storage: mounted NFS share
+# - S3-compatible: object storage
+# - PBS (Platform Backup Server): dedicated backup server
+
+# Create backup via API
+POST /api2/json/nodes/{node}/qemu/{vmid}/vzdump
+{
+ "storage": "local",
+ "compress": "zstd",
+ "mode": "snapshot",
+ "remove": 0
+}
+
+# Backup modes:
+# - snapshot: Live backup (VM continues running)
+# - stop: Stop VM before backup
+# - suspend: Suspend VM during backup
+
+# Restore backup via API
+POST /api2/json/nodes/{node}/storage/{storage}/content
+{
+ "filename": "vzdump-qemu-100-20240101_120000.vma.zst",
+ "vmid": 200,
+ "storage": "local-lvm"
+}
+ Platform Backup Jobs:
+# Create backup job
+POST /api2/json/config/backup
+{
+ "vmid": "100",
+ "storage": "local",
+ "compress": "zstd",
+ "mode": "snapshot",
+ "schedule": "0 2 * * *", # Cron format: daily at 2 AM
+ "prune-backups": "keep-last=7,keep-daily=30,keep-weekly=12,keep-monthly=12"
+}
+
+# Retention policy:
+# - keep-last: Keep last N backups
+# - keep-daily: Keep daily backups for N days
+# - keep-weekly: Keep weekly backups for N weeks
+# - keep-monthly: Keep monthly backups for N months
+
+# List backup jobs
+GET /api2/json/config/backup
+
+# Backup job execution
+# Platform runs backup jobs via cron or systemd timers
+# Logs available at: /var/log/pve/tasks/active
+ | Console Type | +Interface | +Best For | +Protocol | +
|---|---|---|---|
| NoVNC | +Graphical (web-based) | +Desktop environments, installation | +VNC (RFC 6143) | +
| Xterm.js | +Text-based (web-based) | +Command-line administration | +Serial console | +
+
# Platform VNC proxy API
+GET /api2/json/nodes/{node}/qemu/{vmid}/vncproxy
+{
+ "port": "5900",
+ "user": "root@pam",
+ "ticket": "PVE:root@pam:65A8B123::..."
+}
+
+# VNC WebSocket URL format
+wss://{host}:8006/api2/json/nodes/{node}/qemu/{vmid}/vncwebsocket?port={port}&vncticket={ticket}
+
+# Platform automatically:
+# - Creates VNC server on VM startup
+# - Manages VNC port allocation
+# - Provides WebSocket proxy for browser access
+# - Handles authentication via tickets
+
+# VNC configuration in VM
+{
+ "vga": "std", # Standard VGA (includes VNC)
+ "vnc": 1, # Enable VNC
+ "vncdisplay": 0, # VNC display number
+ "keyboard": "en-us" # Keyboard layout
+}
+
+# Serial console access
+{
+ "serial0": "socket",
+ "vga": "serial0"
+}
+
+# Platform serial console
+GET /api2/json/nodes/{node}/qemu/{vmid}/termproxy
+# Returns WebSocket URL for serial console
+ + The platform implements ticket-based authentication for console access, providing secure temporary access tokens. +
+# Ticket format
+PVE:username@realm:timestamp:signature
+
+# Ticket components:
+# - PVE: Platform identifier
+# - username@realm: User and authentication realm (pam, pve, etc.)
+# - timestamp: Unix timestamp
+# - signature: HMAC-SHA256 signature
+
+# Ticket validation:
+# - Tickets expire after 2 hours (configurable)
+# - Signature verified against shared secret
+# - Realm determines authentication method:
+# - pam: Linux PAM authentication
+# - pve: Platform-specific authentication
+# - ldap: LDAP authentication
+# - openid: OpenID Connect
+
+# Console access permissions:
+# - VM.Audit: Read-only console access
+# - VM.Console: Full console access
+# - VM.PowerMgmt: Power management (required for some operations)
+ + Border Gateway Protocol (BGP) is the routing protocol that makes the internet work. This guide explains how BGP works and how to get started with BIRD2, a popular open-source BGP implementation. +
+ ++ BGP (Border Gateway Protocol) is an exterior gateway routing protocol (RFC 4271) used to exchange routing information between autonomous systems (AS) on the internet. Unlike interior gateway protocols like OSPF or RIP, BGP is designed for routing between different organizations and networks. +
+
+
+ BGP operates through sessions between routers (BGP speakers). The process involves: +
+# BGP Message Types (RFC 4271)
+# 1. OPEN - Initial session negotiation
+# 2. UPDATE - Route advertisements/withdrawals
+# 3. NOTIFICATION - Error messages
+# 4. KEEPALIVE - Session maintenance
+
+# BGP Finite State Machine:
+# Idle โ Connect โ Active โ OpenSent โ OpenConfirm โ Established
+
+# Session States:
+# - Idle: Initial state, no connection
+# - Connect: TCP connection attempt
+# - Active: TCP connection failed, retrying
+# - OpenSent: OPEN message sent, waiting for response
+# - OpenConfirm: OPEN message received, waiting for KEEPALIVE
+# - Established: Session active, exchanging routes
+
+
+ When multiple paths exist to a destination, BGP uses a decision process to select the best route: +
+# BGP Attributes (Path Attributes):
+# - AS_PATH: List of AS numbers traversed
+# - NEXT_HOP: IP address of next router
+# - ORIGIN: Route origin (IGP, EGP, Incomplete)
+# - LOCAL_PREF: Local preference (iBGP only)
+# - MED: Multi-Exit Discriminator
+# - COMMUNITY: Route tagging for policy
+# - ORIGINATOR_ID: Route reflector originator
+# - CLUSTER_LIST: Route reflector cluster IDs
+
+
| Type | +Description | +Use Case | +
|---|---|---|
| eBGP | +External BGP between different ASes | +ISP peering, internet routing | +
| iBGP | +Internal BGP within same AS | +Large enterprise networks, data centers | +
| Route Reflector | +iBGP scaling mechanism | +Avoid full mesh iBGP requirement | +
+ BIRD (BIRD Internet Routing Daemon) is a full-featured routing daemon that supports BGP, OSPF, RIP, and other routing protocols. BIRD2 is the current version, with improved IPv6 support and better performance. +
+
+
# Debian/Ubuntu
+sudo apt update
+sudo apt install bird2
+
+# CentOS/RHEL/Fedora
+sudo dnf install bird2
+# or
+sudo yum install bird2
+
+# Arch Linux
+sudo pacman -S bird2
+
+# Verify installation
+birdc -v
+# Should show: BIRD 2.x.x
+
+
+ BIRD2 uses a single configuration file: /etc/bird/bird.conf
+
# /etc/bird/bird.conf
+# Basic BIRD2 configuration
+
+# Router ID (unique identifier, typically an IP address)
+router id 192.168.1.1;
+
+# Protocol kernel - sync routes with Linux kernel
+protocol kernel {
+ ipv4 {
+ import all;
+ export all;
+ };
+ learn; # Learn routes from kernel
+ scan time 10; # Scan kernel routing table every 10 seconds
+}
+
+# Protocol device - scan network interfaces
+protocol device {
+ scan time 10; # Scan interfaces every 10 seconds
+}
+
+# Static routes (optional)
+protocol static {
+ ipv4;
+ route 10.0.0.0/8 via 192.168.1.254;
+}
+
+# BGP protocol definition
+protocol bgp peer1 {
+ description "BGP peer to AS 65001";
+ local as 65000; # Your AS number
+ neighbor 192.168.1.100 as 65001; # Peer IP and AS
+
+ # IPv4 configuration
+ ipv4 {
+ import filter {
+ # Accept all routes by default
+ accept;
+ };
+ export filter {
+ # Export all routes
+ accept;
+ };
+ };
+
+ # Connection settings
+ connect retry time 30; # Retry connection every 30 seconds
+ hold time 90; # Hold timer (seconds)
+ keepalive time 30; # Keepalive interval (seconds)
+
+ # Authentication (optional)
+ password "your-secure-password";
+
+ # Graceful restart (optional)
+ graceful restart;
+}
+ + Note: Replace AS numbers, IP addresses, and passwords with your actual values. AS numbers must be obtained from your Regional Internet Registry (RIR). +
+
+
# Start BIRD2
+sudo systemctl start bird
+sudo systemctl enable bird # Enable on boot
+
+# Check status
+sudo systemctl status bird
+
+# View BIRD2 status
+sudo birdc show status
+
+# View BGP protocols
+sudo birdc show protocols
+
+# View BGP neighbors
+sudo birdc show protocols all bgp1
+
+# View routes
+sudo birdc show route
+sudo birdc show route for 192.168.1.0/24
+sudo birdc show route protocol bgp1
+
+# View route details
+sudo birdc show route all
+
+# Reload configuration
+sudo birdc configure
+# or restart service
+sudo systemctl restart bird
+
+# View BIRD2 logs
+sudo journalctl -u bird -f
+
+
+ BIRD2 allows sophisticated route filtering using filter functions: +
+# Define filter functions
+filter bgp_import {
+ # Reject default route
+ if (net = 0.0.0.0/0) then reject;
+
+ # Accept only /24 or smaller prefixes
+ if (net.len > 24) then reject;
+
+ # Reject RFC 1918 private addresses
+ if (net ~ [10.0.0.0/8+, 172.16.0.0/12+, 192.168.0.0/16+]) then reject;
+
+ # Set local preference for specific routes
+ if (net ~ [203.0.113.0/24+]) then {
+ bgp_local_pref = 200;
+ accept;
+ }
+
+ # Accept all others
+ accept;
+}
+
+filter bgp_export {
+ # Only export our own prefixes
+ if (source = RTS_STATIC) then accept;
+ if (source = RTS_DEVICE) then accept;
+ reject;
+}
+
+# Apply filters to BGP protocol
+protocol bgp peer1 {
+ local as 65000;
+ neighbor 192.168.1.100 as 65001;
+
+ ipv4 {
+ import filter bgp_import;
+ export filter bgp_export;
+ };
+}
+
+
+ Communities allow tagging routes for policy control: +
+# Set communities on export
+filter bgp_export_with_communities {
+ if (source = RTS_STATIC) then {
+ bgp_community.add((65000, 100)); # Add community (AS, value)
+ accept;
+ }
+ reject;
+}
+
+# Filter based on communities on import
+filter bgp_import_communities {
+ # Reject routes with NO_EXPORT community
+ if (bgp_community ~ [(65001, 65535)]) then reject;
+
+ # Prefer routes with HIGH_PREF community
+ if (bgp_community ~ [(65001, 200)]) then {
+ bgp_local_pref = 150;
+ }
+
+ accept;
+}
+
+# Well-known communities:
+# (0, 0) - Internet (no special meaning)
+# (65535, 0) - NO_EXPORT - Don't export to eBGP peers
+# (65535, 1) - NO_ADVERTISE - Don't advertise to any peer
+# (65535, 2) - NO_EXPORT_SUBCONFED - Don't export outside confederation
+
+
+ For large iBGP networks, use route reflectors to avoid full mesh: +
+# Route Reflector Server
+protocol bgp rr_client1 {
+ local as 65000;
+ neighbor 192.168.1.10 as 65000;
+
+ ipv4 {
+ import all;
+ export all;
+ };
+
+ # Enable route reflection
+ rr client; # This is a route reflector client
+}
+
+# Route Reflector Client
+protocol bgp rr_server {
+ local as 65000;
+ neighbor 192.168.1.1 as 65000; # Route reflector server
+
+ ipv4 {
+ import all;
+ export all;
+ };
+
+ # No special configuration needed on client
+}
+
+
+ BIRD2 supports IPv6 through Multiprotocol BGP (MP-BGP): +
+protocol bgp peer1 {
+ local as 65000;
+ neighbor 2001:db8::1 as 65001;
+
+ # IPv6 configuration
+ ipv6 {
+ import all;
+ export all;
+ };
+
+ # Can also configure both IPv4 and IPv6
+ ipv4 {
+ import all;
+ export all;
+ };
+ ipv6 {
+ import all;
+ export all;
+ };
+}
+ | Issue | +Solution | +
|---|---|
| Session not establishing | +Check TCP connectivity (telnet peer-ip 179), verify AS numbers match, check firewall rules | +
| Routes not received | +Check import filters, verify routes exist on peer, check BGP table: birdc show route protocol bgp1 |
+
| Routes not exported | +Check export filters, verify routes in BIRD table, check source protocol | +
| Session flapping | +Check network stability, verify hold timers match, check for authentication mismatches | +
| Wrong route selected | +Review BGP decision process, check local preference, verify AS path length | +
# Useful debugging commands
+sudo birdc show protocols all # Detailed protocol status
+sudo birdc show route all # All routes with attributes
+sudo birdc show route filtered # Filtered routes
+sudo birdc show route rejected # Rejected routes
+sudo birdc show route count # Route count statistics
+sudo birdc show route protocol bgp1 all # Routes from specific peer
+
+# Enable debug logging
+# Edit /etc/bird/bird.conf and add:
+# log syslog { debug, trace, info, remote, warning, error, auth, fatal, bug };
+
+# View detailed logs
+sudo journalctl -u bird -f -n 100
+ # Example secure BGP configuration
+protocol bgp secure_peer {
+ local as 65000;
+ neighbor 192.168.1.100 as 65001;
+
+ password "strong-random-password-here";
+
+ # Prefix limits
+ ipv4 {
+ import limit 1000 action block; # Max 1000 routes
+ import filter strict_import;
+ export filter strict_export;
+ };
+
+ # Connection security
+ connect retry time 30;
+ hold time 90;
+ keepalive time 30;
+
+ # Graceful restart
+ graceful restart;
+}
+
+# Strict import filter
+filter strict_import {
+ # Reject default route
+ if (net = 0.0.0.0/0) then reject;
+
+ # Reject private addresses
+ if (net ~ [10.0.0.0/8+, 172.16.0.0/12+, 192.168.0.0/16+]) then reject;
+
+ # Reject too-specific prefixes
+ if (net.len > 24) then reject;
+
+ # Accept valid routes
+ accept;
+}
+ Additional Resources
++ Comprehensive definitions of terms and concepts used throughout the virtual machine management interface. +
+ ++ You cannot use any IP addresses not allocated directly to you. Violation of this policy will result in immediate termination of accounts and services. +
+ +The following protocols are prohibited and must not be transmitted:
++ Displays all IP addresses (both IPv4 and IPv6) that have been assigned to this virtual machine. These addresses are configured through the QEMU API and are part of your service allocation. +
++ Note: These addresses are managed by the hosting provider and cannot be modified directly. Contact support if you need additional IP addresses or changes to your network configuration. +
++ Shows all network interface cards (NICs) configured for this virtual machine. You can add, remove, or modify network devices to change how your VM connects to the network. +
++ Add Device: Creates a new network interface with configurable model, bridge, and VLAN settings. +
++ Remove Device: Removes a network interface from the VM configuration. Changes take effect after the VM is restarted. +
++ Multiqueue: Enables the network adapter to distribute packet processing across multiple CPU cores. Set this value equal to your vCPU count for optimal performance in multi-core VMs. This improves network throughput significantly. +
++ The "Synced" indicator shows when your local changes match the server configuration; "Unsynced" indicates modifications that need to be saved. +
+| Device | +Adapter | +MAC Address | +MTU | +Multiqueue | +Actions | +
|---|---|---|---|---|---|
| {{ strtoupper($name) }} | ++ + | +{{ strtoupper($interfaces[$name]['mac'] ?? 'N/A') }} | +{{ $interfaces[$name]['mtu'] ?? 'Default' }} | +
+
+
+
+ |
+
+
+
+
+
+ |
+
VirtIO provides the best performance; legacy adapters (E1000, Realtek, PCnet, VMware) improve compatibility.
++ Multiqueue: Allows the network adapter to use multiple CPU cores for packet processing. Set to the number of vCPU cores (max {{ $this->getCpuCores() }}) for best performance. Higher values improve throughput for multi-core VMs. +
+CIDR: {{ $network->ip }}{{ $cidr }}
+ @endif +Default route for this network
+Network address range mask
+Hardware address for this interface
+Network interface identifier within the guest OS
+Network traffic statistics from guest OS
++ Displays network addresses detected by the QEMU Guest Agent running inside your virtual machine. These addresses are reported by the guest operating system and may differ from the assigned addresses. +
++ Note: This information requires the QEMU Guest Agent to be installed and running in the guest OS. If no addresses are shown, ensure the guest agent is properly configured and the VM is running. +
++ The following addresses were detected by the QEMU guest agent but are not configured in the system database. +
+ @else ++ The QEMU Guest Agent is a service that runs inside the virtual machine and provides additional information about the guest operating system to the hypervisor. When the guest agent is installed and activated, this section will display any additional network addresses detected within the guest OS that are not configured in the system database. +
++ If the guest agent is installed and running, additional addresses will appear here automatically with detailed technical information including MAC addresses, interface names, and network statistics. +
+CIDR: {{ $address['ip'] }}/{{ $address['prefix'] }}
+ @endif +Not configured in database
+Not configured in database
+Hardware address for this interface
+Network interface identifier within the guest OS
+Network traffic statistics from guest OS
+Live bandwidth โข Updates every 5 seconds
+Combined
+0 B/s
+Total In
+0 MB
+Total Out
+0 MB
+No network data available
++ Hostname, password, and networking settings are configured automatically via cloud-init. + This applies to standard operating system installations that support cloud-init. However, if you are: +
++ You will need to manually configure networking, security settings, and hostname within the operating system, as cloud-init will not be available in these scenarios. +
++ Displays comprehensive information about your virtual machine including status, resource usage, network configuration, and system details. +
++ Status: Shows the current power state of the VPS (running, stopped, etc.) with real-time updates. +
++ Resources: Displays CPU, memory, disk, and network usage statistics. Data is automatically refreshed at regular intervals. +
++ Network: Shows assigned IP addresses and network interface information configured for this virtual machine. +
++ Compares your virtual machine's actual resource consumption against its allocated entitlements, providing real-time visibility into CPU, memory, and uptime metrics. +
++ CPU Allocation: Shows live CPU usage as a percentage of your vCPU entitlement. Values are sampled directly from the Proxmox hypervisor and update with each status poll. The progress bar can exceed 100% to indicate over-allocation. +
++ Memory Allocation: Displays current RAM usage compared to your provisioned memory entitlement. Calculated from the VM's allocated memory and updates in real-time as memory consumption changes. +
++ Hypervisor Uptime: Shows the live uptime reported by the Proxmox hypervisor, plus power event statistics (starts, shutdowns, reboots) from the task history. This provides insight into VM stability and availability. +
++ Status Badges: Color-coded badges indicate resource health: "Healthy" (green) for normal usage, "Watchlist" (yellow) when approaching limits (85%+), and "Over entitlement" (red) when exceeding allocated resources. +
+Instantly compare what this service is entitled to with how much it is consuming right now.
+Values refresh alongside the live status poll.
+{{ $resource['label'] }}
+{{ $resource['usage_summary'] }}
+{{ $resource['entitlement_label'] }}
+{{ $resource['description'] }}
+Configuration and access information
+
+ Save: Updates the hostname in the database and order properties.
+ Save & Apply: Saves to database and applies the hostname. (Will be configured on next boot via cloud-init)
+
{{ $server->password }}
+
+ Save: Updates the password in the database.
+ Save & Apply: Saves to database and applies the password to the VPS via cloud-init. The server must be rebooted for the password change to take effect.
+
+ Displays real-time network bandwidth statistics for each network interface on your virtual machine, including current transfer rates, peak values, and historical traffic graphs. +
++ Current Rates: Shows the instantaneous download and upload speeds in bytes per second, updated every 30 seconds from Proxmox RRD data. +
++ Peak Values: Tracks the highest observed transfer rates for each direction since the page was loaded, helping identify maximum bandwidth usage. +
++ Historical Graph: Click the "Graph" button to view a line chart showing network traffic trends over the last 10 minutes, with separate lines for download (green) and upload (blue) traffic. +
++ Total Statistics: Displays cumulative data transfer totals (total bytes in and out) from the VM's start, providing a long-term view of network usage. +
+Real-time bandwidth monitoring โข Updates every 30 seconds
+Loading live network statisticsโฆ
+IPv6 DNS records for your server
++ DNS information for your virtual machine. This section displays the hostname and DNS configuration that will be used by the guest operating system. +
++ Note: DNS settings are typically configured via cloud-init for supported operating systems. For Windows or manual installations, DNS must be configured within the guest OS. +
+IPv6-based DNS records for {{ $server->primaryIpv6->ip }}
+ +
+ @ points the root domain directly to the server IP ({{ $server->primaryIpv6->ip }})
+ *.@ points all subdomains (wildcard) to the same IP ({{ $server->primaryIpv6->ip }})
+
+ @ โ Represents the root domain (also called the apex domain).
+ This means the base domain name (e.g. example.com) will point directly to the server IP.
+
+ *.@ โ Represents a wildcard record.
+ This ensures that any subdomain also points to the same server IP.
+
+
+ Together, using both @ and *.@ ensures that your server will respond to requests for the root domain and all possible subdomains.
+
+ rDNS PTR Records: Please make note that at no time will PTR records be generated for any IP address via the RIR systems. No exceptions will be made other than for direct contract business customers due to the security risks involved with allowing arbitrary PTR records to be set and the potential for abuse.
+
+
+ Store custom notes and documentation about this virtual machine. Notes support Markdown formatting for rich text editing. +
++ Markdown Support: Use Markdown syntax for formatting including headers, lists, links, and code blocks. +
++ Persistence: Notes are stored in the database and persist across sessions. However, notes are deleted when the server is reinstalled. +
++ Use Cases: Document server configuration, installation steps, important IP addresses, credentials (stored securely), or any other information relevant to this VPS. +
+Store notes about this server, Markdown is supported. (These do not persist reinstalls)
++ No notes available to export. +
+No notes stored. Click Edit to add notes.
+ @endif +Installation and configuration notes
++ Special instructions and information for Windows Server installations. Windows does not support cloud-init, so additional configuration steps are required. +
++ Manual Configuration Required: Unlike Linux distributions, Windows does not support cloud-init. You must manually configure networking, hostname, and user accounts during or after installation. +
++ Network Setup: Windows will need to be configured with static IP addresses or DHCP settings through the Windows Network Configuration interface. +
++ Remote Access: Enable Remote Desktop (RDP) within Windows to access the server remotely after installation. +
++ Windows Server Networking (IPv4/IPv6 Setup): +
++ Cloud-init does not automatically configure IPv4 or IPv6 networking on Windows Server installations. Please configure the addresses manually as assigned in the control panel of your installation. +
++ Windows Server Activation (Licensing): +
++ No Windows Server license key is provided by Virtnet.bond. It is the responsibility of the account holder + to provide and maintain active and compliant licensing with all Windows Server products. +
++ Periodic Licensing Audits and User Compliance: +
++ Virtnet.bond reserves the right to perform periodic audits of Windows Server installations to ensure compliance with Microsoft's licensing terms. Non-compliant installations may be subject to suspension or termination. If you have any questions regarding licensing compliance, please contact our support team. +
+
+
Choose a new operating system. The selected template will be installed from scratch.
++ No operating system templates are configured for this server type. + Please contact support to have templates added. +
+Real-time performance graphs and historical data analysis.
+CPU
+{{ number_format($cpuPct, 1) }}%
+Memory
+{{ number_format($memoryPct, 1) }}%
+Disk
+{{ number_format($diskPct, 1) }}%
+Uptime
+{{ $this->formatUptime($uptime) }}
+| Date | +CPU | +RAM | +
|---|---|---|
| {{ $stat->DateTime?->format('M d H:i') }} | +{{ round(($stat->cpumax ?? 0) > 0 ? (($stat->cpuused ?? 0) / $stat->cpumax * 100) : 0, 1) }}% | +{{ round(($stat->memorymax ?? 0) > 0 ? (($stat->memoryused ?? 0) / $stat->memorymax * 100) : 0, 1) }}% | +
| No snapshots | ||
| Type | +Status | +Time | +
|---|---|---|
| {{ $task['type'] ?? 'N/A' }} | ++ + {{ ucfirst($task['status'] ?? 'unknown') }} + + | +{{ $startTime?->format('M d H:i') ?? '-' }} | +
| No tasks | ||
| Event | +Status | +Time | +
|---|---|---|
| {{ $event['label'] ?? 'N/A' }} | ++ + {{ ucfirst($event['status'] ?? 'unknown') }} + + | +{{ $startTime?->format('M d H:i') ?? '-' }} | +
| No events | ||
| Date | +CPU | +Memory | +Disk | +Uptime | +Status | +
|---|---|---|---|---|---|
| {{ $stat->DateTime?->format('M d, Y H:i:s') }} | +{{ round(($stat->cpumax ?? 0) > 0 ? (($stat->cpuused ?? 0) / $stat->cpumax * 100) : 0, 2) }}% | +{{ round(($stat->memorymax ?? 0) > 0 ? (($stat->memoryused ?? 0) / $stat->memorymax * 100) : 0, 2) }}% | +{{ round(($stat->diskmax ?? 0) > 0 ? (($stat->diskused ?? 0) / $stat->diskmax * 100) : 0, 2) }}% | +{{ $this->formatUptime((int)($stat->uptime ?? 0)) }} | ++ + {{ ucfirst($stat->vmstatus ?? 'unknown') }} + + | +
| No statistics snapshots found. Click "Create Snapshot" to save current state. | |||||
| Type | +Status | +Start | +End | +
|---|---|---|---|
| {{ $task['type'] ?? 'N/A' }} | ++ + {{ ucfirst($task['status'] ?? 'unknown') }} + + | +{{ $startTime ? $startTime->format('M d, Y H:i:s') : '-' }} | +{{ $endTime ? $endTime->format('M d, Y H:i:s') : '-' }} | +
| No task history found. | |||
| Event | +Status | +Start | +Duration | +
|---|---|---|---|
| {{ $event['label'] ?? 'N/A' }} | ++ + {{ ucfirst($event['status'] ?? 'unknown') }} + + | +{{ $startTime ? $startTime->format('M d, Y H:i:s') : '-' }} | +{{ $duration !== null ? $this->formatUptime($duration) : '-' }} | +
| No lifecycle events found. | |||
Installation and configuration notes
+Windows Server Networking:
+Cloud-init does not configure networking on Windows. Configure IPs manually.
+Windows Server Licensing:
+No license key is provided. Users must supply valid licensing.
+Real-time performance graphs and historical data analysis.
+CPU
+{{ number_format($cpuPct, 1) }}%
+Memory
+{{ number_format($memoryPct, 1) }}%
+Disk
+{{ number_format($diskPct, 1) }}%
+Uptime
+{{ $this->formatUptime($uptime) }}
+| Date | +CPU | +RAM | +
|---|---|---|
| {{ $stat->DateTime?->format('M d H:i') }} | +{{ round(($stat->cpumax ?? 0) > 0 ? (($stat->cpuused ?? 0) / $stat->cpumax * 100) : 0, 1) }}% | +{{ round(($stat->memorymax ?? 0) > 0 ? (($stat->memoryused ?? 0) / $stat->memorymax * 100) : 0, 1) }}% | +
| No snapshots | ||
| Type | +Status | +Time | +
|---|---|---|
| {{ $task['type'] ?? 'N/A' }} | ++ + {{ ucfirst($task['status'] ?? 'unknown') }} + + | +{{ $startTime?->format('M d H:i') ?? '-' }} | +
| No tasks | ||
| Event | +Status | +Time | +
|---|---|---|
| {{ $event['label'] ?? 'N/A' }} | ++ + {{ ucfirst($event['status'] ?? 'unknown') }} + + | +{{ $startTime?->format('M d H:i') ?? '-' }} | +
| No events | ||
| Date | +CPU | +Memory | +Disk | +Uptime | +Status | +
|---|---|---|---|---|---|
| {{ $stat->DateTime?->format('M d, Y H:i:s') }} | +{{ round(($stat->cpumax ?? 0) > 0 ? (($stat->cpuused ?? 0) / $stat->cpumax * 100) : 0, 2) }}% | +{{ round(($stat->memorymax ?? 0) > 0 ? (($stat->memoryused ?? 0) / $stat->memorymax * 100) : 0, 2) }}% | +{{ round(($stat->diskmax ?? 0) > 0 ? (($stat->diskused ?? 0) / $stat->diskmax * 100) : 0, 2) }}% | +{{ $this->formatUptime((int)($stat->uptime ?? 0)) }} | ++ + {{ ucfirst($stat->vmstatus ?? 'unknown') }} + + | +
| No statistics snapshots found. Click "Create Snapshot" to save current state. | |||||
| Type | +Status | +Start | +End | +
|---|---|---|---|
| {{ $task['type'] ?? 'N/A' }} | ++ + {{ ucfirst($task['status'] ?? 'unknown') }} + + | +{{ $startTime ? $startTime->format('M d, Y H:i:s') : '-' }} | +{{ $endTime ? $endTime->format('M d, Y H:i:s') : '-' }} | +
| No task history found. | |||
| Event | +Status | +Start | +Duration | +
|---|---|---|---|
| {{ $event['label'] ?? 'N/A' }} | ++ + {{ ucfirst($event['status'] ?? 'unknown') }} + + | +{{ $startTime ? $startTime->format('M d, Y H:i:s') : '-' }} | +{{ $duration !== null ? $this->formatUptime($duration) : '-' }} | +
| No lifecycle events found. | |||
Installation and configuration notes
+Windows Server Networking:
+Cloud-init does not configure networking on Windows. Configure IPs manually.
+Windows Server Licensing:
+No license key is provided. Users must supply valid licensing.
++ Manage the storage drives attached to your VPS. You can add, remove, and configure drives with different bus types, cache modes, and performance options. +
++ Bus Types: SCSI (VirtIO SCSI) offers the best performance with IO thread support. VirtIO Block is also high-performance. IDE and SATA are available for compatibility. +
++ Important: The VM must be stopped to add, remove, or move drives. Total storage cannot exceed your plan allocation. +
+Manage virtual hard disks attached to your VPS. Add, configure, or remove storage drives.
+Storage changes can only be made when the server is in a powered off state. Please shut down your server before making any storage modifications.
++ Your server has {{ number_format($totalAllocatedStorage, 1) }} GB of storage configured, but your plan only allows {{ number_format($maxAllowedStorage, 1) }} GB. + The server cannot be started until storage is reduced to within your plan limits. Please delete drives or upgrade your service to allow this configuration. +
++ {{ number_format($totalAllocatedStorage, 1) }} GB used of {{ number_format($maxAllowedStorage, 1) }} GB allocated + @if(count($unusedDrives) > 0) + (includes detached drives) + @endif +
+VirtIO SCSI / VirtIO SCSI Single: Best performance with paravirtualized drivers. Recommended for Linux and modern Windows.
+LSI 53C895A / LSI 53C810: Emulated LSI controllers with wide compatibility.
+MegaRAID SAS 8708EM2: Emulated MegaRAID controller.
+VMware PVSCSI: VMware paravirtualized controller, useful for VMs migrated from VMware.
+Select the SCSI controller type for SCSI drives.
+Manage the virtual hard disks connected to your VPS.
+Virtual hard disks store your operating system, applications, and data. Add a drive to get started.
+ @if($this->remainingStorage > 0 && !$vmRunning) + + @elseif($this->remainingStorage > 0 && $vmRunning) +Power off server to add drives
+ @endif +{{ number_format($drivePercent, 1) }}% of quota
+These drives have been detached but their data is preserved. You can reattach them or delete them permanently.
+
+
+
+ @if($newDriveBus === 'scsi') + SCSI provides best performance with IO thread support. Recommended for most use cases. + @elseif($newDriveBus === 'virtio') + VirtIO Block offers high performance but does not support SSD emulation. + @elseif($newDriveBus === 'sata') + SATA provides good compatibility with most operating systems. + @else + IDE is primarily for legacy compatibility. + @endif +
+Maximum available: {{ number_format($this->remainingStorage, 1) }} GB
+Note: SSD emulation is not available for {{ $busTypes[$editDrive['bus']]['label'] ?? ucfirst($editDrive['bus']) }} drives.
+ @endif + + @if(!$this->editDriveIothreadSupported) +Note: IO Thread is not available for {{ $busTypes[$editDrive['bus']]['label'] ?? ucfirst($editDrive['bus']) }} drives.
+ @endif +Current Device: {{ $movingDriveKey }} ({{ $busTypes[$moveDrive['bus']]['label'] ?? ucfirst($moveDrive['bus']) }})
+Size: {{ number_format($moveDrive['size'], 1) }} GB
+Drive: {{ $detachDrive['label'] }} ({{ $detachingDriveKey }})
+Size: {{ number_format($detachDrive['size'], 1) }} GB
+Are you sure you want to detach this drive?
+The data will be preserved but the drive will no longer be accessible to the VM until reattached.
+Drive: {{ $deleteDrive['label'] }} ({{ $deletingDriveKey }})
+Size: {{ number_format($deleteDrive['size'], 1) }} GB
+Are you sure you want to DELETE this drive?
+This action cannot be undone. All data on this drive will be permanently lost!
+{{ $reattachingDriveKey }}
++ {{ $unusedDrives[$reattachingDriveKey]['size_formatted'] ?? 'Unknown size' }} +
+The drive will be reattached to the lowest available slot on the selected bus.
+Subdomain management is unavailable. The administrator needs to set the TECHNITIUM_DNS_URL and TECHNITIUM_DNS_TOKEN environment variables.
+ Create and manage DNS subdomains for your virtual machine. Each subdomain points to one of your assigned public IP addresses and is automatically configured with A and AAAA records. +
++ Limitations: Only A and AAAA records are created. One subdomain per public IP address. Wildcard subdomains (*) are automatically created for each subdomain. +
++ DNS Propagation: Changes may take a few minutes to propagate across DNS servers worldwide. +
+Create and manage subdomains for dns.virtnet.host
++ Only A and AAAA records are created. For any subdomain created, its child wildcard (*) subdomain is also automatically created. One subdomain per public IP address can be created. Under no circumstances will PTR, MX, NS, or other record types be added. These restrictions are in place to minimize abuse of the subdomain system. +
++ Create a new subdomain that points to one of your assigned public IP addresses. The subdomain will be created under the dns.virtnet.host domain. +
++ Subdomain Name: Choose a unique name for your subdomain. Only alphanumeric characters and hyphens are allowed. +
++ IP Address: Select which public IP address this subdomain should point to. Each IP can only have one subdomain. +
++ A wildcard subdomain (*.yourname.dns.virtnet.host) will be automatically created along with your subdomain. +
+All available public IP addresses already have subdomains assigned.
+ @else +You can create {{ count($this->availableIpsForSubdomain) }} more subdomain(s).
+ @endif ++ Lists all subdomains you have created for this virtual machine. Each subdomain shows its full domain name, associated IP address, and automatically created wildcard record. +
++ Delete: Removes the subdomain and all associated DNS records. This action cannot be undone. +
++ Wildcard Records: Each subdomain automatically includes a wildcard (*) record that matches all subdomains under your chosen name. +
+No subdomains created yet.
+ @else +IP: {{ $zone['ipAddress'] }}
+ @php + $hasWildcard = false; + $wildcardType = null; + if (isset($zone['records']) && is_array($zone['records'])) { + foreach ($zone['records'] as $record) { + if (($record['name'] ?? '') === '*') { + $hasWildcard = true; + $wildcardType = $record['type'] ?? 'A'; + break; + } + } + } + @endphp + @if($hasWildcard) +Wildcard: *.{{ $zone['subdomain'] }}.dns.virtnet.host ({{ $wildcardType }})
+ @endif +Will create: {{ $newSubdomain ? $newSubdomain . '.dns.virtnet.host' : 'subdomain.dns.virtnet.host' }}
+ @error('newSubdomain') +{{ $message }}
+ @enderror +{{ $message }}
+ @enderror +{{ $message }}
+ @enderror +{{ $message }}
+ @enderror +{{ $message }}
+ @enderror +No DNS records found.
+ @else +| Name | +Type | +IP Address | +TTL | +Actions | +
|---|---|---|---|---|
| {{ $record['name'] ?? '@' }} | +{{ $record['type'] ?? 'A' }} | +{{ $record['rdata'] ?? $record['ipAddress'] ?? '' }} | +{{ $record['ttl'] ?? 3600 }} | +
+ |
+
Are you sure you want to delete the following subdomain?
+{{ $subdomainToDeleteFull }}
+This action cannot be undone. All DNS records associated with this subdomain will be deleted.
++ Configure low-level system settings including firmware type, CPU model, machine type, and virtualization features. These settings affect how the virtual machine hardware is presented to the guest operating system. +
++ Firmware & Machine: Select the chipset architecture (Q35 or i440fx) and firmware type (SeaBIOS or OVMF/UEFI). +
++ CPU & Virtualization: Configure the CPU model and enable/disable hardware virtualization features like KVM. +
++ Changes to these settings typically require a VM restart to take effect. +
+Manage firmware, CPU, SMBIOS, and trusted module devices exposed to this VPS.
++ Configure the virtual machine's chipset architecture and firmware type. These settings determine the hardware interface presented to the guest operating system. +
++ Machine Type: Q35 offers PCIe and UEFI-friendly layout, while i440fx mirrors legacy Intel chipsets for maximum compatibility. +
++ BIOS/Firmware: SeaBIOS for legacy installs, OVMF for UEFI-capable operating systems. UEFI is required for secure boot and modern Windows installations. +
++ ACPI: Required for power management and graceful shutdown in most modern operating systems. +
+Select the chipset, firmware, and power-management features available to the guest.
+Q35 offers PCIe and UEFI-friendly layout, while i440fx mirrors legacy Intel chipsets.
+Choose SeaBIOS for legacy installs or OVMF for UEFI-capable operating systems.
+Provide SMBIOS key/value pairs (comma separated) to expose to the guest.
++ Configure the virtual CPU model and hardware-assisted virtualization features. These settings affect CPU performance and compatibility with the guest operating system. +
++ CPU Type: Select a specific CPU model or use "host" to expose all host CPU features. "host" offers best performance but may reduce portability. +
++ KVM: Hardware-assisted virtualization using the host CPU. Disable only if you need software emulation compatibility. +
++ CPU Flags: Additional CPU feature flags can be enabled or disabled to fine-tune compatibility and performance. +
+Tune the virtual CPU model and host feature flags exposed to the guest OS.
+KVM64 is the default for most guests.
+Toggle one or more flags to enable those CPU capabilities for this VPS.
+Warning: These flags may not be supported by all CPUs.
++ EFI (Extensible Firmware Interface) disks provide non-volatile storage for UEFI firmware variables. These are required for UEFI-based virtual machines to store boot configuration and Secure Boot keys. +
++ Purpose: UEFI guests require an EFI storage chip to store firmware variables, boot entries, and Secure Boot configuration. +
++ Storage: EFI disks are automatically provisioned on cephpool storage with a fixed 4MB size in raw format. Each entry maps to an efidisk slot in the QEMU configuration. +
++ Preenroll Keys: When enabled, Secure Boot keys are pre-enrolled during EFI disk creation, enabling Secure Boot by default for UEFI guests. +
+UEFI guests require an EFI storage chip. Each entry maps to an efidisk slot.
+{{ strtoupper($slot) }}
+ +{{ $definition }}
+EFI disks store UEFI firmware variables and Secure Boot keys. Add one if your guest requires UEFI boot.
+EFI disks are provisioned automatically on cephpool with a fixed 4M size in raw format.
+Pre-enroll Secure Boot keys during EFI disk creation. Enables Secure Boot by default. Useful for UEFI guests requiring Secure Boot support.
++ TPM (Trusted Platform Module) devices provide hardware-based security features for virtual machines. They enable secure boot, BitLocker encryption, and other security features that require TPM functionality. +
++ Purpose: Virtual TPM devices expose TPM functionality to the guest OS, enabling features like Secure Boot, BitLocker disk encryption, and Windows Device Guard. +
++ Storage: TPM devices are provisioned on cephpool storage with a fixed 4MB state file that stores the TPM's persistent state and keys. +
++ Versions: TPM v2.0 is recommended for modern operating systems and provides better security features. TPM v1.2 is available for legacy compatibility. +
+Expose virtual TPM state chips for secure boot or BitLocker workloads.
+{{ strtoupper($slot) }}
+ +{{ $definition }}
+TPM provides hardware-based security for Secure Boot, BitLocker, and other features requiring trusted platform modules.
+TPM devices are provisioned on cephpool with a fixed 4M state file.
+