Backend: new proxmox mixins and API routes for firewall, pools, access
control, node admin and disks; extend storage and VM endpoints.
Frontend: node managers (firewall, pool, access, disk, node admin), VM
firewall and hardware tabs, PCI/USB device dialogs, related hooks and
locale strings.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Migrate VMs/LXCs between cluster nodes with live progress tracking
- Configure autostart, boot order, startup/shutdown delays, and delete protection from the instance settings tab
- Group OS templates by detected OS (Ubuntu, AlmaLinux, etc.) instead of a single "Cloud Images" bucket
- Expand native Proxmox backup job management (schedule, compression, retention, guest selection, notifications)
- Add ru/en translations for the above
Live WS metrics replace the table data every second, and TanStack
Table's default autoResetPageIndex snapped the list back to page 1.
Disable the auto reset and go back to page 1 only when search or
filters change.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bridge selector now shows the Proxmox interface comment (WAN, Cisco,
subnet, ...) next to the bridge name, like the native Proxmox dialog,
falling back to IPAM/interface CIDR; list sorted by name.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- wait for clone lock release before config.put (cross-node clones kept
lock past wait_for_task, dropping ALL requested settings silently)
- configure_vm applies params in independent groups (compute/network/
cloudinit/disk) with per-group errors and lock retry
- set sockets=1 with cores so total vCPU matches request
- keep template net0 model/MAC/options, replace only bridge
- disk resize: pick boot disk via regex over all buses, report failures
- surface config errors as deploy warnings in UI toast instead of
silent success
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Theme tokens are oklch(); wrapping them in hsl(var(--card)) produced an
invalid, transparent tooltip background so the label blended into the
card. Use the oklch vars directly and force readable text colour.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace the disk I/O area chart with a donut where each slice is a node
sized by its disk usage % (disk_pct). More meaningful than I/O, which is
near-zero most of the time. Use real node names (name|node) in the legend
instead of node-0/node-1, and drop the now-unused RRD fetch.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Translate Start/Stop/Delete/Clear and the selected-count label in the bulk
actions toolbar (add instances.selected_count key). Also includes node label
display in the node filter/table.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Dashboard "ТОП статистика по диску" was stuck on "Загрузка...": the
node name in the dashboard_metrics WS payload is `name`, not `node`, so
the RRD query stayed disabled. Use name fallback and unwrap the
{data:[...]} response shape.
- Instances list + detail page: show the panel-side server name (from the
add-server form) in the "Узел" column/label instead of the Proxmox node
hostname. Real node is still used for all API calls.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a Restart button to the bulk-selection toolbar (backend already supports
bulk_restart) and track bulk operation progress like instance creation:
per-row status overlay on affected instances plus a progress bar driven by
task_update WebSocket events.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
VM config `memory` is in MiB but formatBytes treated it as bytes,
rendering "2 KB RAM" instead of "2 GB RAM". Convert before formatting.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add per-user quotas (max instances, vCPU, RAM, disk) enforced at deploy
time and surfaced to users self-service.
Backend:
- UserQuota model (one-to-one, NULL = unlimited) + migration #28
- quota_service: usage from vm_instances cache, check_quota raises 429
- enforce in VM (templates.py) and LXC (lxc.py) deploy paths
- RBAC quota:view / quota:manage, granted to admin
- admin API GET/PUT /admin/api/users/{id}/quota
- self-service GET /settings/api/quota
- tighten VM list isolation via can_view_all_instances
Frontend:
- admin quota dialog in UsersPage with usage bars
- quota card on Settings page (own limits)
- remaining-quota hint in CreateInstanceWizard config step
- useUserQuota/useSetUserQuota, useMyQuota hooks; RU/EN locales
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Persisted instances-server-filter/instances-node-filter kept an old id
after switching workspace, emptying the list and showing the raw id in
the Select. Drop the filter to 'all' when the server/node is no longer
present in the active workspace.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Make 'Cloud-образы ВМ' and 'LXC-шаблоны' section headers clickable to
collapse/expand. State is saved to localStorage per section so it
survives reloads and navigation.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ForgotPasswordPage and ResetPasswordPage in the split-screen auth layout.
- "Forgot password" link on the login page now routes to /forgot-password.
- Public routes /forgot-password and /reset-password; reset page validates
the token on mount and gates the form, with show/hide password and
confirmation matching.
- i18n keys (reset.*) for ru/en.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Allow overriding the dep-optimizer cache dir via VITE_CACHE_DIR (the
default node_modules/.vite is root-owned when built in Docker) and honor
a PORT injected by the harness. Both default to prior behavior when the
env vars are unset, so Docker builds are unaffected.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Redesign the login page into a two-column layout: a decorative
geometric line pattern on the left (hidden on mobile) and the form on
the right with the PVEmanager logo on top and a footer with a language
switcher + copyright. Add a password show/hide toggle and a "forgot
password" link. Login logic (username/password) is unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- arch filter defaults to amd64 and auto-syncs to the selected node's arch
(useNodeArch), so amd64 nodes no longer show arm64 images by default
- node Select no longer renders raw '__none__'; shows 'Нода' placeholder
and a disabled hint when no nodes are reachable
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Admin-only MirrorsManager on ImagesPage: list/add/edit/delete custom
mirrors with kind/arch/url/template/checksum fields; mirror CRUD hooks.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
qcow2: 'make VM template' toggle (default on) with disk-storage picker,
cores/memory/bridge and cloud-init user/password fields; routes to
image_template task kind.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Settings tab disk-resize UX:
- useResizeDisk/useUpdateConfig now send the required node query param,
fixing the 422 "Field required" error.
- disk device is chosen from the VM's actual disks (defaults to the boot
disk) instead of a hardcoded scsi0.
- show the current disk size, prefill it, and block shrinking before
hitting Proxmox (which rejects it).
- render the growpart output and a grown/not-grown status after resize.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Allows the shared column filter to be attached to typed VMInstance columns
without a FilterFn<unknown> assignability error.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Backend returns the live `lock` field (clone/create/migrate/...) and the
list shows an amber badge next to the status, so an instance that is
still being cloned no longer looks like a ready stopped VM.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Expose target node, target storage, owner (admin-only) and description
in the clone dialog, wired to the existing backend params. Reset the
form on open and fix the cramped label/field spacing.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add ColumnFilter component (Popover-based faceted filter) and a
formatVmConfig helper rendering "N vCPU / X GB RAM / Y GB".
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Move hardcoded English labels (compute resources, disk resize, raw
config, etc.) to i18n keys and replace ad-hoc mt-1 with consistent
space-y-1.5 between labels and inputs.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Filter backup files by VMID, volume, notes or node in real time, with a
distinct empty state for no-match. Tint the job dialog VM-picker
checkboxes with the brand amber accent.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
useCreateSnapshot omitted the required ?node= query param, so creation
failed with a 422. Pass node through, and add a UI hint plus a clear
error message when the VM storage does not support snapshots.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
new Error(error.detail) produced "[object Object]" when detail was an
array (422 validation errors) or object. Add formatApiError() to extract
a readable message and widen ApiError.detail to match real responses.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The webhook_url field was stored in DB but never used to send
notifications — removing it from UI avoids misleading users.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Profile tab: add language selector (per-user), add toast on save/error
for profile info and password change (clears fields only on success)
- Notifications: remove Chat ID field from admin Telegram section —
it was never saved to DB and only served as a test-only input;
testing is now done via "Мои уведомления" → Send test
- Add missing onSuccess/onError toasts to SMTP and Telegram save buttons
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>