From 9e3334d75f4f6eee4011ff337e630cf7b71f8fc8 Mon Sep 17 00:00:00 2001 From: MacRimi Date: Sat, 13 Dec 2025 21:19:08 +0100 Subject: [PATCH] Update web --- web/app/docs/about/code-of-conduct/page.tsx | 2 +- web/app/docs/about/faq/page.tsx | 2 +- web/app/docs/create-vm/page.tsx | 2 +- web/app/docs/create-vm/synology/page.tsx | 75 ++++---- web/app/docs/create-vm/system-linux/page.tsx | 6 +- web/app/docs/create-vm/system-nas/page.tsx | 2 +- .../system-nas/system-nas-others/page.tsx | 16 +- .../docs/create-vm/system-windows/page.tsx | 14 +- .../hardware/igpu-acceleration-lxc/page.tsx | 2 +- web/app/docs/help-info/page.tsx | 2 +- web/app/docs/installation/page.tsx | 4 +- web/app/docs/introduction/page.tsx | 2 +- web/app/docs/layout.tsx | 1 + .../docs/post-install/basic-settings/page.tsx | 17 +- .../docs/post-install/customization/page.tsx | 1 + web/app/docs/post-install/monitoring/page.tsx | 1 + web/app/docs/post-install/network/page.tsx | 1 + web/app/docs/post-install/optional/page.tsx | 13 +- .../docs/post-install/performance/page.tsx | 1 + web/app/docs/post-install/storage/page.tsx | 1 + web/app/docs/post-install/system/page.tsx | 1 + .../docs/post-install/virtualization/page.tsx | 1 + .../docs/storage/disk-passthrough-ct/page.tsx | 180 +++++++++++++----- .../docs/storage/disk-passthrough-vm/page.tsx | 4 +- .../docs/utils/UUp-Dump-ISO-Creator/page.tsx | 18 +- web/app/layout.tsx | 14 +- web/app/metadata.ts | 14 +- web/app/rss.xml/route.ts | 37 ++-- web/components/footer.tsx | 3 +- web/components/footer2.tsx | 2 +- web/components/hero.tsx | 1 + web/components/hero2.tsx | 3 +- web/components/mouse-move-effect.tsx | 1 + web/components/navbar.tsx | 12 +- web/components/rss-link.tsx | 2 +- web/components/support-project.tsx | 1 + web/components/testimonials.tsx | 1 + web/components/ui/image-with-caption.tsx | 2 +- web/components/ui/steps.tsx | 1 + 39 files changed, 292 insertions(+), 171 deletions(-) diff --git a/web/app/docs/about/code-of-conduct/page.tsx b/web/app/docs/about/code-of-conduct/page.tsx index d147e71..cbe96b1 100644 --- a/web/app/docs/about/code-of-conduct/page.tsx +++ b/web/app/docs/about/code-of-conduct/page.tsx @@ -64,4 +64,4 @@ export default async function CodeOfConductPage() { ) -} +} \ No newline at end of file diff --git a/web/app/docs/about/faq/page.tsx b/web/app/docs/about/faq/page.tsx index 5b8a952..48cf871 100644 --- a/web/app/docs/about/faq/page.tsx +++ b/web/app/docs/about/faq/page.tsx @@ -206,4 +206,4 @@ export default function FaqPage() { ); -} +} \ No newline at end of file diff --git a/web/app/docs/create-vm/page.tsx b/web/app/docs/create-vm/page.tsx index b98a2dc..ebf98d7 100644 --- a/web/app/docs/create-vm/page.tsx +++ b/web/app/docs/create-vm/page.tsx @@ -84,7 +84,7 @@ export default function VirtualMachinesPage() { diff --git a/web/app/docs/create-vm/synology/page.tsx b/web/app/docs/create-vm/synology/page.tsx index b18603e..e137689 100644 --- a/web/app/docs/create-vm/synology/page.tsx +++ b/web/app/docs/create-vm/synology/page.tsx @@ -241,7 +241,7 @@ export default function Page() {

You can upload custom loaders from the local storage options:

@@ -345,7 +345,7 @@ export default function Page() {

@@ -355,7 +355,7 @@ export default function Page() {

@@ -372,7 +372,7 @@ export default function Page() {

@@ -382,7 +382,7 @@ export default function Page() {

@@ -399,7 +399,7 @@ export default function Page() {

@@ -410,7 +410,7 @@ export default function Page() {

@@ -433,7 +433,7 @@ export default function Page() { {activeLoader === "arc" && (
@@ -443,7 +443,7 @@ export default function Page() { {activeLoader === "rr" && (
@@ -453,7 +453,7 @@ export default function Page() { {activeLoader === "tinycore" && (
@@ -476,12 +476,12 @@ export default function Page() { {activeLoader === "arc" && (
@@ -491,17 +491,17 @@ export default function Page() { {activeLoader === "rr" && (
@@ -511,12 +511,12 @@ export default function Page() { {activeLoader === "tinycore" && (
@@ -541,7 +541,7 @@ export default function Page() { automatically reboot once the process is complete.

@@ -550,22 +550,22 @@ export default function Page() { the loader:

@@ -575,17 +575,17 @@ export default function Page() { {activeLoader === "rr" && (
@@ -595,22 +595,22 @@ export default function Page() { {activeLoader === "tinycore" && (
@@ -634,7 +634,7 @@ export default function Page() { {activeLoader === "arc" && (
@@ -644,7 +644,7 @@ export default function Page() { {activeLoader === "rr" && (
@@ -654,7 +654,7 @@ export default function Page() { {activeLoader === "tinycore" && (
@@ -677,7 +677,7 @@ export default function Page() { {activeLoader === "arc" && (
@@ -687,7 +687,7 @@ export default function Page() { {activeLoader === "rr" && (
@@ -697,7 +697,7 @@ export default function Page() { {activeLoader === "tinycore" && (
@@ -719,7 +719,7 @@ export default function Page() {

Follow the on-screen steps to complete the DSM installation.

@@ -729,7 +729,7 @@ export default function Page() { is nearing completion.

@@ -833,3 +833,4 @@ function StepNumber({ number }: { number: number }) {
) } + diff --git a/web/app/docs/create-vm/system-linux/page.tsx b/web/app/docs/create-vm/system-linux/page.tsx index c53706f..c677e2b 100644 --- a/web/app/docs/create-vm/system-linux/page.tsx +++ b/web/app/docs/create-vm/system-linux/page.tsx @@ -49,7 +49,7 @@ export default function LinuxVMContent() {
@@ -351,7 +351,7 @@ export default function LinuxVMContent() {
@@ -411,7 +411,7 @@ export default function LinuxVMContent() {
diff --git a/web/app/docs/create-vm/system-nas/page.tsx b/web/app/docs/create-vm/system-nas/page.tsx index cbd3777..716cde5 100644 --- a/web/app/docs/create-vm/system-nas/page.tsx +++ b/web/app/docs/create-vm/system-nas/page.tsx @@ -164,7 +164,7 @@ export default function SystemNASPage() {
diff --git a/web/app/docs/create-vm/system-nas/system-nas-others/page.tsx b/web/app/docs/create-vm/system-nas/system-nas-others/page.tsx index cfdf2a7..88a859c 100644 --- a/web/app/docs/create-vm/system-nas/system-nas-others/page.tsx +++ b/web/app/docs/create-vm/system-nas/system-nas-others/page.tsx @@ -468,7 +468,7 @@ export default function OtherNASSystemsPage() {

Shell Interface

TrueNAS SCALE Shell InterfaceWeb Interface
TrueNAS SCALE Web InterfaceShell Interface
TrueNAS CORE Shell InterfaceWeb Interface
TrueNAS CORE Web InterfaceShell Interface
OpenMediaVault Shell InterfaceWeb Interface
OpenMediaVault Web InterfaceShell Interface
Rockstor Shell InterfaceWeb Interface
Rockstor Web Interface @@ -412,7 +412,7 @@ export default function WindowsVMPage() {
@@ -492,7 +492,7 @@ export default function WindowsVMPage() { During Windows installation, if no disks are shown on the “Where do you want to install Windows?” screen, it means the required storage drivers for your selected disk interface (such as SCSI or VirtIO) are not available. You'll need to load them manually.

@@ -505,7 +505,7 @@ export default function WindowsVMPage() { Click the “Load driver” button to browse the mounted VirtIO ISO. This will allow you to load the necessary storage drivers so Windows can detect the virtual disk.

@@ -519,7 +519,7 @@ export default function WindowsVMPage() { For example, the viostor folder contains storage drivers, and you'll find subfolders organized by version (e.g., Windows 10, 11, Server).

@@ -532,7 +532,7 @@ export default function WindowsVMPage() { After selecting the folder, Windows will list the available drivers. Choose the appropriate one — usually “Red Hat VirtIO SCSI controller” — and click “Next” to proceed with the installation.

@@ -545,7 +545,7 @@ export default function WindowsVMPage() { Pro Tip: If you selected VirtIO as the network interface, Windows will not recognize it by default. To enable internet access during installation, load the VirtIO network driver from the ISO by browsing to the NetKVM folder and selecting the correct subfolder for your Windows version.

diff --git a/web/app/docs/hardware/igpu-acceleration-lxc/page.tsx b/web/app/docs/hardware/igpu-acceleration-lxc/page.tsx index e8f48ed..d16fb43 100644 --- a/web/app/docs/hardware/igpu-acceleration-lxc/page.tsx +++ b/web/app/docs/hardware/igpu-acceleration-lxc/page.tsx @@ -31,7 +31,7 @@ export default function IGPUAccelerationLXC() {

You will be presented with a list of your LXC containers to choose from.

- Select LXC Container + Select LXC Container

The script applies the following changes to your container:

diff --git a/web/app/docs/help-info/page.tsx b/web/app/docs/help-info/page.tsx index c6b0658..66955d1 100644 --- a/web/app/docs/help-info/page.tsx +++ b/web/app/docs/help-info/page.tsx @@ -97,7 +97,7 @@ export default function HelpAndInfoPage() {
diff --git a/web/app/docs/installation/page.tsx b/web/app/docs/installation/page.tsx index d96eaea..2dae8dd 100644 --- a/web/app/docs/installation/page.tsx +++ b/web/app/docs/installation/page.tsx @@ -46,7 +46,7 @@ export default function InstallationPage() {

Installation Progress

The installation process will look like this:

- ProxMenux Installation + ProxMenux Installation

How to Use

@@ -78,4 +78,4 @@ export default function InstallationPage() {

) -} +} \ No newline at end of file diff --git a/web/app/docs/introduction/page.tsx b/web/app/docs/introduction/page.tsx index 1e11974..fb0134f 100644 --- a/web/app/docs/introduction/page.tsx +++ b/web/app/docs/introduction/page.tsx @@ -8,7 +8,7 @@ export default function IntroductionPage() { {/* Logo + Title Section */}
ProxMenux Logo ) } + diff --git a/web/app/docs/post-install/basic-settings/page.tsx b/web/app/docs/post-install/basic-settings/page.tsx index cda4b2a..346c02f 100644 --- a/web/app/docs/post-install/basic-settings/page.tsx +++ b/web/app/docs/post-install/basic-settings/page.tsx @@ -63,7 +63,7 @@ export default function BasicSettingsPage() {
System Utilities Selection Menu @@ -83,7 +83,7 @@ export default function BasicSettingsPage() {

Example usage:

dialog --title "Hello" --msgbox "Hello, World!" 10 20 Dialog Example @@ -103,7 +103,7 @@ export default function BasicSettingsPage() {

To start htop, simply type:

htop htop Example @@ -113,7 +113,7 @@ export default function BasicSettingsPage() {

To start btop, type:

btop btop Example @@ -123,7 +123,7 @@ export default function BasicSettingsPage() {

To start iftop (requires root):

iftop iftop Example @@ -133,7 +133,7 @@ export default function BasicSettingsPage() {

To start iotop (requires root):

siotop iotop Example @@ -155,7 +155,7 @@ export default function BasicSettingsPage() {

To start iptraf-ng:

iptraf-ng iptraf-ng Example @@ -212,7 +212,7 @@ export default function BasicSettingsPage() { tmux Example @@ -383,3 +383,4 @@ sudo apt-get install -y zfsutils-linux proxmox-backup-restore-image chrony
) } + diff --git a/web/app/docs/post-install/customization/page.tsx b/web/app/docs/post-install/customization/page.tsx index 84ae3f4..bf8a4a4 100644 --- a/web/app/docs/post-install/customization/page.tsx +++ b/web/app/docs/post-install/customization/page.tsx @@ -139,3 +139,4 @@ echo "DPkg::Post-Invoke { \\"dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxl
) } + diff --git a/web/app/docs/post-install/monitoring/page.tsx b/web/app/docs/post-install/monitoring/page.tsx index 6fcc757..108e29b 100644 --- a/web/app/docs/post-install/monitoring/page.tsx +++ b/web/app/docs/post-install/monitoring/page.tsx @@ -95,3 +95,4 @@ fi
) } + diff --git a/web/app/docs/post-install/network/page.tsx b/web/app/docs/post-install/network/page.tsx index 4cc774f..8bd4bac 100644 --- a/web/app/docs/post-install/network/page.tsx +++ b/web/app/docs/post-install/network/page.tsx @@ -304,3 +304,4 @@ sudo sysctl -p /etc/sysctl.d/99-network-performance.conf
) } + diff --git a/web/app/docs/post-install/optional/page.tsx b/web/app/docs/post-install/optional/page.tsx index 351003a..cb2d6ac 100644 --- a/web/app/docs/post-install/optional/page.tsx +++ b/web/app/docs/post-install/optional/page.tsx @@ -244,7 +244,7 @@ systemctl enable --now pve-ha-lrm pve-ha-crm corosync

ProxMenux

ProxMenux Logo @@ -252,7 +252,7 @@ systemctl enable --now pve-ha-lrm pve-ha-crm corosync

Proxmox

Proxmox Logo @@ -260,7 +260,7 @@ systemctl enable --now pve-ha-lrm pve-ha-crm corosync

Helper-Scripts

Helper-Scripts Logo @@ -268,7 +268,7 @@ systemctl enable --now pve-ha-lrm pve-ha-crm corosync

Home-Labs-Club

Home-Labs-Club Logo @@ -276,7 +276,7 @@ systemctl enable --now pve-ha-lrm pve-ha-crm corosync

Proxmology

Proxmology Logo @@ -336,7 +336,7 @@ echo "clear && fastfetch" >> ~/.bashrc
Figurine Example Output ) } + diff --git a/web/app/docs/post-install/performance/page.tsx b/web/app/docs/post-install/performance/page.tsx index bf9760e..fef5175 100644 --- a/web/app/docs/post-install/performance/page.tsx +++ b/web/app/docs/post-install/performance/page.tsx @@ -139,3 +139,4 @@ export default function PerformanceSettingsPage() {
) } + diff --git a/web/app/docs/post-install/storage/page.tsx b/web/app/docs/post-install/storage/page.tsx index e6e8c4c..5b10fa2 100644 --- a/web/app/docs/post-install/storage/page.tsx +++ b/web/app/docs/post-install/storage/page.tsx @@ -164,3 +164,4 @@ EOF
) } + diff --git a/web/app/docs/post-install/system/page.tsx b/web/app/docs/post-install/system/page.tsx index ff3a190..181bf8c 100644 --- a/web/app/docs/post-install/system/page.tsx +++ b/web/app/docs/post-install/system/page.tsx @@ -337,3 +337,4 @@ sudo systemctl restart systemd-journald
) } + diff --git a/web/app/docs/post-install/virtualization/page.tsx b/web/app/docs/post-install/virtualization/page.tsx index eb59e6e..7de2e33 100644 --- a/web/app/docs/post-install/virtualization/page.tsx +++ b/web/app/docs/post-install/virtualization/page.tsx @@ -145,3 +145,4 @@ sudo systemctl start ksm
) } + diff --git a/web/app/docs/storage/disk-passthrough-ct/page.tsx b/web/app/docs/storage/disk-passthrough-ct/page.tsx index cc7627f..3a5340e 100644 --- a/web/app/docs/storage/disk-passthrough-ct/page.tsx +++ b/web/app/docs/storage/disk-passthrough-ct/page.tsx @@ -1,69 +1,163 @@ import { Steps } from "@/components/ui/steps" -import CopyableCode from "@/components/CopyableCode" +import { HardDrive, ArrowRight } from "lucide-react" +import { ImageWithCaption } from "@/components/ui/image-with-caption" +import type { Metadata } from "next" -export const metadata = { - title: "Disk Passthrough to a VM | ProxMenux Documentation", - description: "Step-by-step guide to configure disk passthrough to a virtual machine in Proxmox VE using ProxMenux.", +export const metadata: Metadata = { + title: "Disk Passthrough to a CT | ProxMenux Documentation", + description: "Step-by-step guide to configure disk passthrough to a container (CT) in Proxmox VE using ProxMenux.", + openGraph: { + title: "Disk Passthrough to a CT | ProxMenux Documentation", + description: "Step-by-step guide to configure disk passthrough to a container (CT) in Proxmox VE using ProxMenux.", + type: "article", + url: "https://macrimi.github.io/ProxMenux/docs/disk-ct", + images: [ + { + url: "https://macrimi.github.io/ProxMenux/disk-ct/disk-selection.png", + width: 1200, + height: 630, + alt: "Disk Passthrough to a CT", + }, + ], + }, + twitter: { + card: "summary_large_image", + title: "Disk Passthrough to a CT | ProxMenux Documentation", + description: "Step-by-step guide to configure disk passthrough to a container (CT) in Proxmox VE using ProxMenux.", + images: ["https://macrimi.github.io/ProxMenux/disk-ct/disk-selection.png"], + }, } -export default function DiskPassthroughVM() { +export default function DiskPassthroughCT() { return (
-

Disk Passthrough to a VM

- +
+ + +

+ Disk Passthrough to a CT +

+
+

- This guide explains how to assign physical disks to virtual machines (VMs) in Proxmox VE using ProxMenux. - Disk passthrough allows a VM to have direct access to a physical disk, providing improved performance and compatibility for certain applications. + This guide explains how to assign a dedicated physical disk to a container (CT) in{" "} + Proxmox VE using ProxMenux. Assigning a full disk to a container is useful + when you need isolation, ease of access, or the ability to move the disk between systems, especially for + services handling large volumes of data such as Samba, Nextcloud, or video surveillance software, among others.

- -

Overview

-

The script automates the following steps:

+ +

+ While it's more common to passthrough entire disks to virtual machines (VMs), there are scenarios where giving + full disk access to an LXC container can be very useful. +

+ +
    +
  • + A user running a video surveillance system like Frigate or Agent DVR might + want recordings saved on a dedicated disk, so they can easily transfer it to another system for review. +
  • +
  • + A Nextcloud container might need full disk access to manage user files and take advantage of + the entire disk capacity. +
  • +
  • + A container may be used for downloads, storing files on a dedicated disk and sharing them over the local + network. +
  • +
  • Another use case could be writing backups to an isolated disk.
  • +
+ +

+ As you can see, there are many different use cases where assigning a physical disk directly to a CT is the ideal + solution. +

+ +

Description

    -
  1. Lists available physical disks on the Proxmox host, excluding the system disk.
  2. -
  3. Displays a list of available virtual machines (VMs) for selection.
  4. -
  5. Allows the user to select multiple disks to assign to a VM.
  6. -
  7. Ensures selected disks are not already in use by another VM.
  8. -
  9. Configures the selected disks for passthrough to the chosen VM.
  10. +
  11. Lists physical disks on the Proxmox host, excluding the system disk and mounted system disks.
  12. +
  13. Displays all existing LXC containers (CTs) for user selection.
  14. +
  15. + Allows the user to select one physical disk per execution. +
  16. +
  17. + Formats the disk (with user confirmation) or reuses it, then assigns it as a mount point in the selected CT. +
- -

Implementation Steps

+ +

Step-by-Step Instructions

- - Disk Selection Menu -

The script scans the system and displays a list of available physical disks, excluding the system disk.

+ + + +

The user selects the destination LXC container (CT) to which the disk will be assigned.

- -

The user selects the virtual machine (VM) to which the disk(s) will be assigned.

+ + +

+ The script lists all physical disks, excluding those used by the system. It also displays metadata like ZFS, + LVM, and RAID, and shows warnings if the disk is already in use. +

- - Disk Assigment Menu +

The script performs the following actions:

    -
  • Ensures the selected disk is not in use by another VM.
  • -
  • Provides an interface choice (SATA, SCSI, VirtIO, or IDE).
  • -
  • Automatically configures the disk passthrough and assigns it to the VM.
  • +
  • Detects whether the disk has a supported filesystem (ext4, xfs, btrfs).
  • +
  • Offers to format the disk if no valid filesystem is found.
  • +
  • + Prompts the user to define the mount point (e.g. /mnt/disk_passthrough). +
- -

The script verifies the operation and confirms the successful disk passthrough.

+ + +

+ The selected disk is mounted inside the container at the specified path, and permissions are set + automatically. +

- +

Expected Results

    -
  • The selected physical disk(s) are successfully assigned to the specified VM.
  • -
  • Users are provided with a confirmation of the disk assignment.
  • -
  • The VM is configured to recognize the disk(s) upon startup.
  • +
  • The selected disk is successfully mounted and accessible within the specified container.
  • +
  • The script shows a summary of the operation, including any warnings or errors.
  • +
  • The container can use the assigned storage immediately.
  • +
- -

Important Considerations

-
    -
  • Ensure the selected disk is not already in use by another VM.
  • -
  • VMs must be powered off before adding disks to prevent data corruption.
  • -
  • Using disk passthrough limits certain VM features, such as live migration.
  • -
- + +

Important Considerations

+
+

Important:

+

+ The container must be privileged to allow direct read/write access to the physical disk. +

+
+
    +
  • + Only one disk can be assigned per script execution. +
  • +
  • Avoid assigning the same disk to multiple VMs or CTs that may run at the same time, as this can lead to data corruption or file loss.
  • +
  • + Clean any RAID, ZFS, or LVM metadata manually before assigning the disk. +
  • +
) } diff --git a/web/app/docs/storage/disk-passthrough-vm/page.tsx b/web/app/docs/storage/disk-passthrough-vm/page.tsx index cc7627f..1cbd84b 100644 --- a/web/app/docs/storage/disk-passthrough-vm/page.tsx +++ b/web/app/docs/storage/disk-passthrough-vm/page.tsx @@ -29,14 +29,14 @@ export default function DiskPassthroughVM() {

Implementation Steps

- Disk Selection Menu + Disk Selection Menu

The script scans the system and displays a list of available physical disks, excluding the system disk.

The user selects the virtual machine (VM) to which the disk(s) will be assigned.

- Disk Assigment Menu + Disk Assigment Menu

The script performs the following actions:

  • Ensures the selected disk is not in use by another VM.
  • diff --git a/web/app/docs/utils/UUp-Dump-ISO-Creator/page.tsx b/web/app/docs/utils/UUp-Dump-ISO-Creator/page.tsx index 72ab46d..e7f72c9 100644 --- a/web/app/docs/utils/UUp-Dump-ISO-Creator/page.tsx +++ b/web/app/docs/utils/UUp-Dump-ISO-Creator/page.tsx @@ -76,7 +76,7 @@ export default function UUPDumpISOCreatorPage() {
@@ -240,7 +240,7 @@ export default function UUPDumpISOCreatorPage() { ) and select the Windows version you want to download.

@@ -258,7 +258,7 @@ export default function UUPDumpISOCreatorPage() { Preview builds, or specific versions.

@@ -275,7 +275,7 @@ export default function UUPDumpISOCreatorPage() { Choose the language for the Windows image. You can select any language available for that specific build.

@@ -293,7 +293,7 @@ export default function UUPDumpISOCreatorPage() { (Home, Pro, Enterprise, etc.).

@@ -313,7 +313,7 @@ export default function UUPDumpISOCreatorPage() { edition.

@@ -341,7 +341,7 @@ export default function UUPDumpISOCreatorPage() { that the URL contains all the necessary parameters.

@@ -356,7 +356,7 @@ export default function UUPDumpISOCreatorPage() {

Access the Utilities section in ProxMenux and select "UUP Dump ISO Creator".

@@ -374,7 +374,7 @@ export default function UUPDumpISOCreatorPage() { ISO image. The ISO will be immediately available for use in creating virtual machines in Proxmox.

diff --git a/web/app/layout.tsx b/web/app/layout.tsx index b2098b2..cdea253 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -22,16 +22,16 @@ export const metadata = { address: false, telephone: false, }, - metadataBase: new URL(`https://proxmenux.com`), + metadataBase: new URL(`https://macrimi.github.io/ProxMenux/`), openGraph: { title: "ProxMenux", description: "A menu-driven script for Proxmox VE management, designed to simplify and streamline the execution of commands and tasks.", - url: "https://proxmenux.com", + url: "https://macrimi.github.io/ProxMenux/", siteName: "ProxMenux", images: [ { - url: "https://proxmenux.com/main.png", + url: "https://macrimi.github.io/ProxMenux/main.png", width: 1363, height: 735, alt: "ProxMenux", @@ -45,14 +45,14 @@ export const metadata = { title: "ProxMenux", description: "A menu-driven script for Proxmox VE management, designed to simplify and streamline the execution of commands and tasks.", - images: ["https://proxmenux.com/main.png"], + images: ["https://macrimi.github.io/ProxMenux/main.png"], }, icons: { icon: [ - { url: "https://proxmenux.com/favicon.ico", sizes: "any" }, - { url: "https://proxmenux.com/icon.svg", type: "image/svg+xml" }, + { url: "https://macrimi.github.io/ProxMenux/favicon.ico", sizes: "any" }, + { url: "https://macrimi.github.io/ProxMenux/icon.svg", type: "image/svg+xml" }, ], - apple: [{ url: "https://proxmenux.com/apple-touch-icon.png", sizes: "180x180" } as const], + apple: [{ url: "https://macrimi.github.io/ProxMenux/apple-touch-icon.png", sizes: "180x180" } as const], }, } diff --git a/web/app/metadata.ts b/web/app/metadata.ts index 926db59..1499c93 100644 --- a/web/app/metadata.ts +++ b/web/app/metadata.ts @@ -1,9 +1,11 @@ -import type { Metadata } from "next" +import type { Metadata } from 'next' -const description = - "A menu-driven script for Proxmox VE management, designed to simplify and streamline the execution of commands and tasks." + + +const description = "A menu-driven script for Proxmox VE management, designed to simplify and streamline the execution of commands and tasks." export const metadata: Metadata = { + title: "ProxMenux", description, generator: "Next.js", @@ -18,11 +20,11 @@ export const metadata: Metadata = { address: false, telephone: false, }, - metadataBase: new URL(`https://proxmenux.com`), + metadataBase: new URL(`https://macrimi.github.io/ProxMenux/`), openGraph: { title: "ProxMenux", description, - url: `https://proxmenux.com`, + url: `https://macrimi.github.io/ProxMenux/`, siteName: "ProxMenux", images: [ { @@ -47,4 +49,4 @@ export const metadata: Metadata = { ], apple: [{ url: "https://raw.githubusercontent.com/MacRimi/ProxMenux/main/web/public//apple-touch-icon.png" }], }, -} +} \ No newline at end of file diff --git a/web/app/rss.xml/route.ts b/web/app/rss.xml/route.ts index c81ab7f..6a0d54c 100644 --- a/web/app/rss.xml/route.ts +++ b/web/app/rss.xml/route.ts @@ -10,24 +10,25 @@ interface ChangelogEntry { title: string } +// Function to clean and format markdown content for RSS function formatContentForRSS(content: string): string { return ( content - // Convert ### headers to

tags - .replace(/^### (.+)$/gm, "

$1

") - // Convert ** bold ** to tags - .replace(/\*\*(.*?)\*\*/g, "$1") - // Convert code blocks to
 tags
+      // Convert ### headers to bold text
+      .replace(/^### (.+)$/gm, "**$1**")
+      // Convert ** bold ** to simple bold
+      .replace(/\*\*(.*?)\*\*/g, "$1")
+      // Clean code blocks - remove ``` and format nicely
       .replace(/```[\s\S]*?```/g, (match) => {
         const code = match.replace(/```/g, "").trim()
-        return `
${code}
` + return `\n${code}\n` }) - // Convert - bullet points to
  • tags - .replace(/^- (.+)$/gm, "
  • $1
  • ") - // Wrap consecutive
  • tags in
      - .replace(/(
    • .*?<\/li>\s*)+/g, (match) => `
        ${match}
      `) - // Convert double newlines to

      for paragraphs - .replace(/\n\n/g, "

      ") + // Convert - bullet points to • + .replace(/^- /gm, "• ") + // Clean up multiple newlines + .replace(/\n{3,}/g, "\n\n") + // Remove backslashes used for line breaks + .replace(/\\\s*$/gm, "") // Clean up extra spaces .replace(/\s+/g, " ") .trim() @@ -74,7 +75,7 @@ async function parseChangelog(): Promise { currentEntry = { version, date, - url: `https://proxmenux.com/changelog#${version}`, + url: `https://macrimi.github.io/ProxMenux/changelog#${version}`, title: `ProxMenux ${version}`, } } else if (dateMatch) { @@ -82,7 +83,7 @@ async function parseChangelog(): Promise { currentEntry = { version: date, date, - url: `https://proxmenux.com/changelog#${date}`, + url: `https://macrimi.github.io/ProxMenux/changelog#${date}`, title: `ProxMenux Update ${date}`, } } @@ -114,13 +115,13 @@ async function parseChangelog(): Promise { export async function GET() { const entries = await parseChangelog() - const siteUrl = "https://proxmenux.com" + const siteUrl = "https://macrimi.github.io/ProxMenux" const rssXml = ` - + ProxMenux Changelog - Latest updates and changes in ProxMenux - An Interactive Menu for Proxmox VE Management + Latest updates and changes in ProxMenux ${siteUrl}/changelog en-US @@ -133,7 +134,7 @@ export async function GET() { (entry) => ` ${entry.title} - + 1000 ? entry.content.substring(0, 1000) + "..." : entry.content}]]> ${entry.url} ${entry.url} ${new Date(entry.date).toUTCString()} diff --git a/web/components/footer.tsx b/web/components/footer.tsx index b765fe5..6a0dc37 100644 --- a/web/components/footer.tsx +++ b/web/components/footer.tsx @@ -22,7 +22,7 @@ export default function Footer() { className="hover:opacity-90 transition-opacity flex items-center" > Support me on Ko-fi ) } + diff --git a/web/components/footer2.tsx b/web/components/footer2.tsx index 02ba795..f10e72a 100644 --- a/web/components/footer2.tsx +++ b/web/components/footer2.tsx @@ -19,7 +19,7 @@ export default function Footer() { className="hover:opacity-90 transition-opacity" > Support me on Ko-fi ) } + diff --git a/web/components/hero2.tsx b/web/components/hero2.tsx index 3680566..b471f34 100644 --- a/web/components/hero2.tsx +++ b/web/components/hero2.tsx @@ -36,7 +36,7 @@ export default function Hero() {
      ProxMenux Logo ) } + diff --git a/web/components/mouse-move-effect.tsx b/web/components/mouse-move-effect.tsx index 3b91f02..d2d9f1c 100644 --- a/web/components/mouse-move-effect.tsx +++ b/web/components/mouse-move-effect.tsx @@ -26,3 +26,4 @@ export default function MouseMoveEffect() { /> ) } + diff --git a/web/components/navbar.tsx b/web/components/navbar.tsx index 76217d6..eac7443 100644 --- a/web/components/navbar.tsx +++ b/web/components/navbar.tsx @@ -20,7 +20,13 @@ export default function Navbar() {
      - ProxMenux Logo + ProxMenux Logo ProxMenux @@ -40,7 +46,7 @@ export default function Navbar() { {/* RSS Feed Link */} setIsMenuOpen(false)} target="_blank" diff --git a/web/components/rss-link.tsx b/web/components/rss-link.tsx index 9557681..34daa21 100644 --- a/web/components/rss-link.tsx +++ b/web/components/rss-link.tsx @@ -6,7 +6,7 @@ import { useState } from "react" export default function RSSLink() { const [copied, setCopied] = useState(false) - const rssUrl = "https://proxmenux.com/rss.xml" + const rssUrl = "https://macrimi.github.io/ProxMenux/rss.xml" const copyToClipboard = async () => { try { diff --git a/web/components/support-project.tsx b/web/components/support-project.tsx index 9e16ed8..9cd06c5 100644 --- a/web/components/support-project.tsx +++ b/web/components/support-project.tsx @@ -26,3 +26,4 @@ export default function SupportProject() { ) } + diff --git a/web/components/testimonials.tsx b/web/components/testimonials.tsx index da84986..9044196 100644 --- a/web/components/testimonials.tsx +++ b/web/components/testimonials.tsx @@ -32,3 +32,4 @@ export default function Testimonials() { ) } + diff --git a/web/components/ui/image-with-caption.tsx b/web/components/ui/image-with-caption.tsx index 2bf5bf1..57b7ed9 100644 --- a/web/components/ui/image-with-caption.tsx +++ b/web/components/ui/image-with-caption.tsx @@ -23,4 +23,4 @@ export function ImageWithCaption({ src, alt, caption, width = 800, height = 450
      {caption}
      ) -} +} \ No newline at end of file diff --git a/web/components/ui/steps.tsx b/web/components/ui/steps.tsx index 0aafab4..58c6ae9 100644 --- a/web/components/ui/steps.tsx +++ b/web/components/ui/steps.tsx @@ -32,3 +32,4 @@ const Steps: React.FC & { Step: typeof Step } = ({ children }) => ( Steps.Step = Step export { Steps } +