Commit Graph

399 Commits

Author SHA1 Message Date
7d60afb9fa fix(console): stop leaking termproxy sessions and orphaned terminals
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m22s
Deploy to Production / Trigger production update (push) Failing after 11s
SonarCloud / SonarCloud Analysis (push) Failing after 2m39s
Opening an LXC console left a failed task on the Proxmox node:

  failed waiting for client: timed out
  TASK ERROR: command '/usr/bin/termproxy 5900 ... vzctlconsole101' failed

connectTerminal() called GET /api/{sid}/container/{vid}/terminal first,
which creates a termproxy session on the node, but only the `node` field
of the response was used - port and ticket were discarded. The ws
endpoint then created a second termproxy session and connected to that
one. Nobody ever attached to the first, so Proxmox waited ~10s for a
client and failed the task.

The console also rendered a black screen in dev: React StrictMode mounts
the effect twice, connect* are async, and the effect cleanup ran before
they had assigned wsRef/termRef, so it had nothing to clean up. Two
xterm instances ended up in the same container - the first one filled
the viewport while the live one was pushed out of the overflow-hidden
area, which is why the badge read "connected" over an empty screen.

- drop the redundant REST call; the ws endpoint owns the termproxy
- remove the now unused GET /api/{server_id}/container/{vmid}/terminal
- add a per-session cancellation guard: a stale connect closes its own
  socket and disposes its own terminal without touching refs that may
  already point at the live session
- route mount and the reconnect button through a single startSession()
  that cancels and tears down the previous session first
- apply the same guard to the node shell page
2026-08-21 21:06:44 +05:00
30e92da8b5 fix(rbac): make network and IPAM access admin-only by default
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m26s
Deploy to Production / Trigger production update (push) Failing after 10s
SonarCloud / SonarCloud Analysis (push) Failing after 2m46s
network:view is no longer implied by server:view, and neither network:view
nor ipam:view is granted to the non-admin default roles (operator, user,
demo). The network topology, node/SDN interface configuration and IPAM are
administrative surfaces, not part of the baseline "can see servers"
umbrella, so they should be granted explicitly rather than inherited.
2026-08-21 20:26:38 +05:00
markmorado
4f290b92fb feat: make topology guest cards link to the instance detail page
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 9s
SonarCloud / SonarCloud Analysis (push) Failing after 2m25s
Clicking a guest card now navigates to /instances/:serverId/:vmid, the
same route used from the Instances list, with a hover highlight to
signal it's clickable.
2026-08-20 14:32:42 +05:00
markmorado
295d3fc06e docs: add changelog and API reference entries for NFS export scan
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
SonarCloud / SonarCloud Analysis (push) Failing after 2m21s
Document the new GET /api/backups/scan-nfs/{server_id} endpoint and
the storage-add dialog's export scan button in CHANGELOG(.ru).md and
WIKI(.ru).md.
2026-08-20 10:25:17 +05:00
markmorado
31d17fca61 feat: scan NFS server for available exports in storage-add dialog
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m20s
Deploy to Production / Trigger production update (push) Failing after 10s
SonarCloud / SonarCloud Analysis (push) Has been cancelled
Add a "scan exports" button next to the server field for NFS storages
that calls Proxmox's /nodes/{node}/scan/nfs and turns the export path
input into a select populated with the real exports found on the
target server, instead of requiring the path to be typed by hand.
2026-08-20 10:23:04 +05:00
markmorado
c768da93ee docs: release notes and version bump for v1.17.0
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
SonarCloud / SonarCloud Analysis (push) Failing after 2m27s
v1.17.0
2026-08-20 05:46:47 +05:00
markmorado
f0ae1770f7 fix: drop net in/out cards from instance overview I/O rates
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
SonarCloud / SonarCloud Analysis (push) Failing after 2m29s
Network throughput is already shown in the collapsible instance list
metrics panel; keep the overview tab's I/O rates section to disk only.
2026-08-20 05:43:23 +05:00
markmorado
5a4dfcdaea docs: add changelog entries for LXC disk move and metrics panel collapse 2026-08-20 05:43:08 +05:00
markmorado
851e5854b2 feat: add confirmation dialog for LXC disk move with stop/start flow
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m23s
Deploy to Production / Trigger production update (push) Failing after 9s
SonarCloud / SonarCloud Analysis (push) Has been cancelled
Proxmox rejects lxc move_volume on a running container. Instead of
just disabling the button, show a modal that explains the container
will be stopped, walks through stop -> move -> start with progress,
and always restarts the container even if the move itself fails.
For VMs (and already-stopped containers) it's a plain confirm modal.
2026-08-20 05:37:10 +05:00
markmorado
06bb127387 fix: block LXC disk move on running containers
Proxmox rejects lxc move_volume on a running container
("cannot move volumes of a running container"), unlike qemu
move_disk which works live. Surface this as a disabled button
and hint instead of a raw 500 error.
2026-08-20 05:32:22 +05:00
markmorado
943207b6b7 fix: support moving LXC container disks to other storage
Disk move was hardcoded to the QEMU move_disk Proxmox API and was
never reachable in the UI for LXC (no Hardware tab for containers,
and the disk list regex only matched VM device names).

- add move_container_disk() using lxc/{vmid}/move_volume
- add POST /api/{server_id}/container/{vmid}/disk/move endpoint
- route useMoveDisk by instance type (vm vs container prefix)
- recognize rootfs/mp\d+ as LXC disk devices
- add a Move disk card on the Settings tab for LXC instances
- filter target storage list by supported content type
  (rootdir for LXC, images for VM) instead of showing all storages
2026-08-20 05:29:28 +05:00
markmorado
619d08b674 style: widen and enlarge vCPU/RAM bars in instance metrics panel
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 9s
SonarCloud / SonarCloud Analysis (push) Failing after 2m23s
Increase the progress bar width and label/detail font size for the
vCPU/RAM rows so they're easier to read at a glance, matching feedback
on the collapsed metrics panel added earlier.
2026-08-20 05:28:24 +05:00
markmorado
3aa37991f7 feat: collapse instance list metrics into expandable panel
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 9s
SonarCloud / SonarCloud Analysis (push) Failing after 2m23s
Move CPU/RAM/Disk/Net/Disk I/O/Uptime out of the always-visible table
columns into a per-row expandable panel (opened by clicking the
instance name), matching VMmanager's disclosure UX. Adds a Parameters
link into the panel pointing to the instance settings tab, and
clearer stat cards for network/disk throughput.
2026-08-20 05:17:23 +05:00
markmorado
917cc0a5bb fix: correct topology export bounds, edge rendering, and switch to top-down layout
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
SonarCloud / SonarCloud Analysis (push) Failing after 2m22s
- Export: use useReactFlow().getNodesBounds() (measured dimensions) instead
  of the standalone helper, which treated every node's size as zero and
  clipped the last row/column of the exported image
- Export: give edge paths an explicit inline stroke before capture -
  html-to-image clones <svg> natively and skips computed-style inlining for
  it, so edges came out with no stroke at all
- Enable the edge flow animation (was hardcoded off)
- Switch the graph from left-to-right to top-to-bottom, including flipping
  every node's handle positions, and recolor edges from the barely-visible
  border tone to the primary accent
2026-08-20 04:50:41 +05:00
markmorado
da8bbce62a fix: console viewport sizing and add VNC control toolbar
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m22s
Deploy to Production / Trigger production update (push) Failing after 10s
SonarCloud / SonarCloud Analysis (push) Failing after 2m30s
Fix nested h-screen flexbox layout bug that let the noVNC canvas overflow
below the viewport until the browser zoom level was changed (missing
min-h-0 on flex children). Also add a fuller console control bar: power
menu (reboot/shutdown/hard reset/hard stop), extra-keys menu (Ctrl+Alt+Del,
Ctrl+Alt+Backspace, Tab, Esc, Ctrl+Alt+F1-F12), scale toggle, clipboard
paste to guest, and console screenshot. Adds a VM hard-reset backend
action (qemu status/reset) alongside the existing start/stop/restart/shutdown.
2026-08-20 02:04:15 +05:00
markmorado
e7291bf23a fix: pass export padding as a px string, not a bare number
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 12s
SonarCloud / SonarCloud Analysis (push) Failing after 2m43s
getViewportForBounds treats a numeric padding as a fraction of the
canvas size (not pixels) unless given a "Npx" string, so the padding=40
passed in the previous fix was read as 4000% padding and still
collapsed the zoom to its floor - the graph rendered small on a mostly
empty canvas exactly as before. Verified in-browser: PNG/SVG exports
now fill ~98% of the canvas instead of ~20%.
2026-08-20 01:55:12 +05:00
markmorado
932fcce768 fix: size topology export canvas to the graph, not a fixed minimum
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
SonarCloud / SonarCloud Analysis (push) Failing after 2m31s
Forcing a 1200x800 minimum canvas made getViewportForBounds compute a
zoom above the 2x cap for small graphs, leaving the exported PNG/SVG
mostly empty with the graph rendered tiny in the corner.
2026-08-20 01:41:32 +05:00
markmorado
d99e67a60e feat: add network topology page
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m22s
Deploy to Production / Trigger production update (push) Failing after 10s
SonarCloud / SonarCloud Analysis (push) Failing after 2m22s
Interactive infrastructure map (panel -> cluster -> node -> guest) rendered
with React Flow, backed by a single aggregated /api/network/topology endpoint
instead of fanning out over servers/nodes/SDN/VMs. Adds a netN NIC parser for
QEMU/LXC guest configs, status/threshold filters, canvas tools, and PNG/SVG
export.
2026-08-20 01:31:37 +05:00
f6d9932849 fix: show only friendly template name in CT template dropdown
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
SonarCloud / SonarCloud Analysis (push) Failing after 7m59s
The CT template select listed both the raw archive file name and the
headline on one line, which was long and hard to scan. Render the
headline alone and keep the file name in the title tooltip, matching
the convention already used on the images page. Falls back to the file
name when the repository provides no headline.
2026-08-19 18:23:05 +05:00
0db2f340f6 fix: cap dialog grid column so fields cannot overflow the modal
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
SonarCloud / SonarCloud Analysis (push) Failing after 2m20s
The dialog body is a grid whose implicit column is auto-sized, i.e.
max-content. Long unbreakable option labels (e.g. CT template file
names) widened that column and pushed the select fields and footer
buttons past the dialog edge.

Use grid-cols-[minmax(0,1fr)] on DialogContent to cap the track at the
dialog width, and apply the same guard to the Alert grid template.
Verified: dialog scrollWidth now equals clientWidth at both 1280px and
375px viewports, with no horizontal page overflow.
2026-08-19 17:36:20 +05:00
5bb349564f fix: prevent select fields from overflowing dialog width
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
SonarCloud / SonarCloud Analysis (push) Failing after 2m21s
Add min-w-0 and overflow-hidden to SelectTrigger and min-w-0 to
SelectValue so long option labels (e.g. CT template names) and grid
columns no longer push select fields past the modal boundary. Fixes
overflow across all dialogs sharing the Select component.
2026-08-19 17:23:24 +05:00
67fe01e9b1 fix: show friendly OS name for LXC deployed from CT template
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m26s
Deploy to Production / Trigger production update (push) Failing after 12s
SonarCloud / SonarCloud Analysis (push) Failing after 12m14s
Derive a human-readable OS name (e.g. Debian 13, Ubuntu 24.04) from the
vztmpl volid instead of showing the raw template path like
local:vztmpl/debian-13-standard_13.1-2_amd64.tar.zst in the instances list.
Applied at the display layer, so existing instances are fixed too.
2026-08-19 15:30:34 +05:00
Dilshod Rasulov
3225214e43 Add files via upload 2026-08-18 23:59:21 +05:00
Dilshod Rasulov
e4c921022b Add files via upload 2026-08-18 23:59:05 +05:00
markmorado
73493d7ef2 Add active tasks indicator, propagate LXC create errors, fix Fedora logo
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m24s
Deploy to Production / Trigger production update (push) Failing after 10s
- Surface a topbar indicator with a live count of active tasks
- Propagate exceptions from Proxmox LXC container creation instead of
  swallowing them, and validate minimum password length
- Replace the Fedora catalog icon with the official logo artwork
2026-08-18 23:34:32 +05:00
markmorado
9d57e388cd feat: add 5 new cloud images to built-in catalog
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m28s
Deploy to Production / Trigger production update (push) Failing after 1m37s
Add AlmaLinux 10, CentOS Stream 9, Debian 13 (Trixie), Fedora 41, and
Ubuntu 26.04 LTS (Resolute) with pre-installed qemu-guest-agent. Images
patched via virt-customize and hosted on GitHub release 2026-08-18.
2026-08-18 23:11:13 +05:00
markmorado
5f0a38e03d fix: improve templates page responsiveness for long names and small screens
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
Prevent edit/delete action buttons from overlapping with long template
names by using shrink-0 on icon and button containers with flex-1
min-w-0 on the text area. Make header and filter selects responsive
with flex-wrap and full-width on mobile breakpoints.
2026-08-18 20:28:08 +05:00
8cbba05dac fix: validate instance name as DNS label and improve wizard UX
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m23s
Deploy to Production / Trigger production update (push) Failing after 10s
Add DNS name validation (RFC 952/1123) for VM, LXC and ISO instance
names on both backend and frontend. Proxmox rejects names with
underscores or special characters but the error was only surfaced as
a raw 400 from the API.

Also require Cloud-Init user and password fields for VM deploys
(highlighted when empty, Next button blocked), and fix numeric input
fields that showed "0" on clear and concatenated values like "04096".
2026-08-17 16:24:55 +05:00
0220f338db docs: add CONTRIBUTING and SECURITY links to Russian README
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 11s
v1.16.1
2026-08-17 02:00:57 +05:00
985f04c7ad docs: add CONTRIBUTING and SECURITY links to README
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 9s
2026-08-17 01:59:39 +05:00
8b3cde79cf docs: replace template SECURITY.md with project-specific policy
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
2026-08-17 01:56:57 +05:00
72d933228c docs: add contributing guide for new contributors
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 9s
2026-08-17 01:52:18 +05:00
5999183c8e fix: activate docker group in current session via sg re-exec
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
After install_docker adds the user to the docker group, the change only
takes effect in a new login session.  The script continued running in
the old session, docker info failed, and deploy exited with "Cannot
connect to Docker daemon" even though the daemon was running fine.

Now check_requirements detects this situation (sudo docker works but
docker doesn't, and the user IS in the docker group per /etc/group)
and re-execs the entire script under `sg docker` to activate the
supplementary GID without a logout/login cycle.  A _DEPLOY_REEXEC
guard prevents infinite loops.
2026-08-17 01:42:05 +05:00
286576715b docs: release notes and version bump for v1.16.1
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 9s
2026-08-17 01:26:05 +05:00
820da8ca01 fix: set 755 permissions on pve CLI so non-root users can read the script
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
sudo cp preserves the source umask which can leave the file without
read permission for group/others.  A bash script needs both read and
execute bits — without read, the shell cannot interpret it.
2026-08-17 01:20:43 +05:00
a275b8bed5 fix: prevent SSL rollback by using container state instead of status text
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
verify_nginx_running grepped for "running|healthy" in the human-readable
STATUS column of docker compose ps, but the column shows "Up Xs (health:
starting)" for the first 30s before the healthcheck passes — neither
word matches.  With max_wait=20s the function always timed out and the
deploy script rolled back to the HTTP-only config even though the SSL
certificate was successfully obtained.

Switch to --format '{{.State}}' which returns the raw "running" state
immediately, and bump max_wait to 60s for slow first starts.
2026-08-17 01:13:43 +05:00
fbfbd76960 fix: install pve CLI without root via sudo fallback to ~/.local/bin
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 9s
Previously install_pve_cli silently skipped installation when deploy.sh
was run without root, leaving the 'pve' command unavailable.  Now it
tries sudo first (password is usually cached from docker operations)
and falls back to ~/.local/bin with automatic PATH configuration.
2026-08-17 00:34:58 +05:00
8fa1208cde feat(frontend): switch to Inter Variable, bump type scale, fix TS errors
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
- Replace DM Sans with Inter Variable (better screen rendering at small sizes)
- Bump text-xs 12→13px, text-sm 14→15px globally via theme tokens
- Fix hardcoded text-[13px] → text-sm in AppLayout, CommandPalette, DashboardPage
- Fix button sm variant text-[0.8rem] → text-xs for consistency
- Fix TS: ScriptExecuteDialog unused isRunning, setResult → setExecutionId(r.id)
- Fix TS: InstanceActionDialogs onValueChange null guards (string | null → string)
- Dockerfile: npm ci → npm install (cross-platform lockfile, Linux optional deps)
2026-08-17 00:14:06 +05:00
ec076959db docs: release notes and version bump for v1.16.0
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
v1.16.0
2026-08-14 20:06:12 +05:00
22162408ac fix: correct password visibility icon logic across all dialogs
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
2026-08-14 19:52:59 +05:00
319de5c96e feat: swap SSH keys when admin changes instance owner
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m21s
Deploy to Production / Trigger production update (push) Failing after 10s
Remove the previous owner's SSH keys and apply the new owner's keys
(profile + library) when ownership is reassigned. If the new owner has
no keys, the old keys are simply removed.

QEMU VMs: updates cloud-init sshkeys via Proxmox API.
LXC containers: writes /root/.ssh/authorized_keys via exec.
The swap is best-effort — failures are logged but do not block the
ownership change.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-08-14 19:07:59 +05:00
f4878eac50 scripts: add patch-cloud-images.sh for building GitHub mirror with qemu-guest-agent
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 11s
2026-08-14 17:02:25 +05:00
4d00fdf959 catalog: point amd64 images to GitHub mirror with qemu-guest-agent and sha256
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m21s
Deploy to Production / Trigger production update (push) Failing after 10s
2026-08-14 16:46:28 +05:00
f29226a735 fix: filter out loop devices and system partitions from VM storage overview
Some checks failed
Backend Tests / pytest (Python 3.12) (push) Failing after 1m20s
Deploy to Production / Trigger production update (push) Failing after 10s
Only show user-relevant filesystems by skipping snap/loop mounts
and /boot/* partitions in QEMU guest agent fsinfo response.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-08-14 16:40:01 +05:00
8ff757f8c1 fix: re-download cached import images when checksum is provided
Some checks failed
Deploy to Production / Trigger production update (push) Has been cancelled
Backend Tests / pytest (Python 3.12) (push) Has been cancelled
volume_exists() only checked file presence, not content. A stale image
from a previous download (different URL/version) would be silently reused,
causing templates and VMs to be created from unpatched images even when
the mirror's checksum pointed to a newer patched build.

Add delete_volume() to ProxmoxClient storage mixin, and update both
_do_image_download_sync and _do_image_template_sync to delete the cached
volume and re-download whenever a checksum is provided, letting Proxmox
verify the new download server-side.
2026-08-14 16:19:41 +05:00
3540291c0e i18n: translate hardcoded Russian strings in graphs, wizard, storages, scripts
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 12s
- GraphsTab: wrap "Все", "Сбросить", "Нет данных", IOPS and disk-pct chart
  titles with t(); add graphs.iops_read/write/disk_usage_pct keys
- CreateInstanceWizard: translate (безопаснее) spans via common.safer;
  translate IP placeholder via wizard.ip_cidr_placeholder
- StoragesTab: translate Ceph monhost placeholder via storages.monhost_placeholder
- ScriptEditDialog: translate name placeholder via scripts.name_placeholder
- Add scripts.execution_title and scripts.no_output keys (EN + RU)
- Add common.safer key (EN + RU)
2026-08-14 14:06:10 +05:00
5af2ffed01 i18n: add missing translation keys for appstore, nodeadm, common, and scripts
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 9s
- appstore.golden.pick_server_hint (EN + RU)
- nodeadm: certs, syslog, tasks, system, tasks_hint, task_start, task_type,
  task_id, task_user, task_running, syslog_hint, tz_saved, dns_saved,
  time, node_time, timezone
- common.changePassword, common.runCommand, common.queued, common.no_data
- Remove duplicate common.no_data key from en.json
2026-08-13 17:26:43 +05:00
d6ea83c8aa i18n(dashboard,instances): translate dashboard, action dialogs and resource cards
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
2026-08-13 17:19:26 +05:00
43db0f79ca i18n(images): translate Images page, dialogs and mirrors manager
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
2026-08-13 16:59:01 +05:00
477faef44a i18n: add scripts and certs sections (ru + en)
Some checks failed
Deploy to Production / Trigger production update (push) Failing after 10s
scripts: full section — catalog, repos, executions tabs, edit/execute
         dialogs, community scripts warning, all labels and toasts
certs: full section — upload form, certificate details, expiry badges
2026-08-13 16:43:04 +05:00