From 957f7e8ba23cb3850cc00aa917f41c5b48c7dcce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Gj=C3=B8by=20Thom?= <34199185+havardthom@users.noreply.github.com> Date: Fri, 8 Nov 2024 22:27:01 +0100 Subject: [PATCH] Fix disk setup and documentation for Turnkey VMs (#141) --- .../scripts/_components/ScriptAccordion.tsx | 16 ++++----- .../scripts/_components/ScriptInfoBlocks.tsx | 8 ++--- frontend/src/app/scripts/page.tsx | 10 +++--- frontend/src/components/CommandMenu.tsx | 6 ++-- json/jellyfin.json | 2 +- json/nextcloud-vm.json | 34 +++++++++++++++++++ json/owncloud-vm.json | 6 ++-- vm/nextcloud-vm.sh | 12 ++++--- vm/owncloud-vm.sh | 32 +++++++++-------- 9 files changed, 82 insertions(+), 44 deletions(-) create mode 100644 json/nextcloud-vm.json diff --git a/frontend/src/app/scripts/_components/ScriptAccordion.tsx b/frontend/src/app/scripts/_components/ScriptAccordion.tsx index 4f08ae09a..9aad70d33 100644 --- a/frontend/src/app/scripts/_components/ScriptAccordion.tsx +++ b/frontend/src/app/scripts/_components/ScriptAccordion.tsx @@ -26,14 +26,14 @@ export default function ScriptAccordion({ undefined, ); const linkRefs = useRef<{ [key: string]: HTMLAnchorElement | null }>({}); - + const handleAccordionChange = (value: string | undefined) => { setExpandedItem(value); }; const handleSelected = useCallback( - (title: string) => { - setSelectedScript(title); + (slug: string) => { + setSelectedScript(slug); }, [setSelectedScript], ); @@ -41,7 +41,7 @@ export default function ScriptAccordion({ useEffect(() => { if (selectedScript) { const category = items.find((category) => - category.scripts.some((script) => script.name === selectedScript), + category.scripts.some((script) => script.slug === selectedScript), ); if (category) { setExpandedItem(category.name); @@ -89,17 +89,17 @@ export default function ScriptAccordion({ handleSelected(script.name)} + onClick={() => handleSelected(script.slug)} ref={(el) => { - linkRefs.current[script.name] = el; + linkRefs.current[script.slug] = el; }} >
diff --git a/frontend/src/app/scripts/_components/ScriptInfoBlocks.tsx b/frontend/src/app/scripts/_components/ScriptInfoBlocks.tsx index 34bf4427d..962e516f8 100644 --- a/frontend/src/app/scripts/_components/ScriptInfoBlocks.tsx +++ b/frontend/src/app/scripts/_components/ScriptInfoBlocks.tsx @@ -85,7 +85,7 @@ export function LatestScripts({ items }: { items: Category[] }) {
{latestScripts.slice(startIndex, endIndex).map((script) => ( @@ -121,7 +121,7 @@ export function LatestScripts({ items }: { items: Category[] }) { View Script @@ -153,7 +153,7 @@ export function MostViewedScripts({ items }: { items: Category[] }) {
{mostViewedScripts.map((script) => ( @@ -189,7 +189,7 @@ export function MostViewedScripts({ items }: { items: Category[] }) { diff --git a/frontend/src/app/scripts/page.tsx b/frontend/src/app/scripts/page.tsx index 2e82a3147..a02f80b83 100644 --- a/frontend/src/app/scripts/page.tsx +++ b/frontend/src/app/scripts/page.tsx @@ -3,16 +3,16 @@ export const dynamic = "force-static"; import ScriptItem from "@/app/scripts/_components/ScriptItem"; +import { fetchCategories } from "@/lib/data"; import { Category, Script } from "@/lib/types"; import { Loader2 } from "lucide-react"; -import { Suspense, useEffect, useState } from "react"; -import Sidebar from "./_components/Sidebar"; import { useQueryState } from "nuqs"; +import { Suspense, useEffect, useState } from "react"; import { LatestScripts, MostViewedScripts, } from "./_components/ScriptInfoBlocks"; -import { fetchCategories } from "@/lib/data"; +import Sidebar from "./_components/Sidebar"; function ScriptContent() { const [selectedScript, setSelectedScript] = useQueryState("id"); @@ -24,7 +24,7 @@ function ScriptContent() { const script = links .map((category) => category.scripts) .flat() - .find((script) => script.name === selectedScript); + .find((script) => script.slug === selectedScript); setItem(script); } }, [selectedScript, links]); @@ -76,4 +76,4 @@ export default function Page() { ); -} \ No newline at end of file +} diff --git a/frontend/src/components/CommandMenu.tsx b/frontend/src/components/CommandMenu.tsx index cc6d690f2..8aba6a668 100644 --- a/frontend/src/components/CommandMenu.tsx +++ b/frontend/src/components/CommandMenu.tsx @@ -92,11 +92,11 @@ export default function CommandMenu() { > {category.scripts.map((script) => ( { setOpen(false); - router.push(`/scripts?id=${script.name}`); + router.push(`/scripts?id=${script.slug}`); }} >
setOpen(false)}> diff --git a/json/jellyfin.json b/json/jellyfin.json index 59d8eb98a..429402f2f 100644 --- a/json/jellyfin.json +++ b/json/jellyfin.json @@ -12,7 +12,7 @@ "documentation": null, "website": null, "logo": "https://github.com/home-assistant/brands/blob/master/core_integrations/jellyfin/icon.png?raw=true", - "description": null, + "description": "Jellyfin is a free and open-source media server and suite of multimedia applications designed to organize, manage, and share digital media files to networked devices.", "install_methods": [ { "type": "default", diff --git a/json/nextcloud-vm.json b/json/nextcloud-vm.json new file mode 100644 index 000000000..33c7d8779 --- /dev/null +++ b/json/nextcloud-vm.json @@ -0,0 +1,34 @@ +{ + "name": "Nextcloud", + "slug": "nextcloud-vm", + "categories": [ + 12 + ], + "date_created": "2023-11-14", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": "80", + "documentation": null, + "website": "https://www.turnkeylinux.org/nextcloud", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/nextcloud.svg", + "description": "TurnKey Nextcloud is an open-source file sharing server and collaboration platform that can store your personal content, like documents and pictures, in a centralized location.", + "install_methods": [ + { + "type": "default", + "script": "vm/nextcloud-vm.sh", + "resources": { + "cpu": "2", + "ram": "2048", + "hdd": "12G", + "os": "debian", + "version": 12 + } + } + ], + "default_credentials": { + "username": "admin", + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/json/owncloud-vm.json b/json/owncloud-vm.json index 08f64faae..cac02cba2 100644 --- a/json/owncloud-vm.json +++ b/json/owncloud-vm.json @@ -21,13 +21,13 @@ "cpu": "2", "ram": "2048", "hdd": "12G", - "os": null, - "version": null + "os": "debian", + "version": 12 } } ], "default_credentials": { - "username": null, + "username": "admin", "password": null }, "notes": [] diff --git a/vm/nextcloud-vm.sh b/vm/nextcloud-vm.sh index 8ffc81300..b956cd537 100644 --- a/vm/nextcloud-vm.sh +++ b/vm/nextcloud-vm.sh @@ -32,7 +32,7 @@ BFR="\\r\\033[K" HOLD="-" CM="${GN}✓${CL}" CROSS="${RD}✗${CL}" -THIN="discard=on,ssd=1," +THIN="discard=on,ssd=1" set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT @@ -207,7 +207,7 @@ function advanced_settings() { exit-script fi - if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 $HN --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 turnkey-nextcloud-vm --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $VM_NAME ]; then HN="$HN" echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" @@ -393,7 +393,7 @@ btrfs) THIN="" ;; esac -for i in {0,1}; do +for i in {0,1,2}; do disk="DISK$i" eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} @@ -403,11 +403,13 @@ msg_info "Creating a $NAME" qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios seabios${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +pvesm alloc $STORAGE $VMID $DISK1 12G 1>&/dev/null qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null qm set $VMID \ -efidisk0 ${DISK0_REF}${FORMAT} \ - -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=12G \ - -boot order=scsi0 \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN} \ + -scsi1 ${DISK2_REF},${DISK_CACHE}${THIN} \ + -boot order='scsi1;scsi0' \ -description "
# $NAME diff --git a/vm/owncloud-vm.sh b/vm/owncloud-vm.sh index 61d0f753d..3e68f8239 100644 --- a/vm/owncloud-vm.sh +++ b/vm/owncloud-vm.sh @@ -19,7 +19,7 @@ header_info echo -e "\n Loading..." GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') NEXTID=$(pvesh get /cluster/nextid) - +NAME="TurnKey ownCloud VM" YW=$(echo "\033[33m") BL=$(echo "\033[36m") HA=$(echo "\033[1;34m") @@ -32,7 +32,7 @@ BFR="\\r\\033[K" HOLD="-" CM="${GN}✓${CL}" CROSS="${RD}✗${CL}" -THIN="discard=on,ssd=1," +THIN="discard=on,ssd=1" set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT @@ -59,7 +59,7 @@ function cleanup() { TEMP_DIR=$(mktemp -d) pushd $TEMP_DIR >/dev/null -if whiptail --backtitle "Proxmox VE Helper Scripts" --title "TurnKey-ownCloud VM" --yesno "This will create a New TurnKey-ownCloud VM. Proceed?" 10 58; then +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "$NAME" --yesno "This will create a New $NAME. Proceed?" 10 58; then : else header_info && echo -e "⚠ User exited script \n" && exit @@ -154,7 +154,7 @@ function default_settings() { echo -e "${DGN}Using VLAN: ${BGN}Default${CL}" echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}" echo -e "${DGN}Start VM when completed: ${BGN}no${CL}" - echo -e "${BL}Creating a TurnKey ownCloud VM using the above default settings${CL}" + echo -e "${BL}Creating a $NAME using the above default settings${CL}" } function advanced_settings() { @@ -313,8 +313,8 @@ function advanced_settings() { START_VM="no" fi - if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a TurnKey ownCloud VM?" --no-button Do-Over 10 58); then - echo -e "${RD}Creating a TurnKey ownCloud VM using the above advanced settings${CL}" + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a $NAME?" --no-button Do-Over 10 58); then + echo -e "${RD}Creating a $NAME using the above advanced settings${CL}" else header_info echo -e "${RD}Using Advanced Settings${CL}" @@ -368,7 +368,7 @@ else fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." -msg_info "Retrieving the URL for the TurnKey ownCloud ISO Disk Image" +msg_info "Retrieving the URL for the $NAME Disk Image" URL=http://mirror.turnkeylinux.org/turnkeylinux/images/iso/turnkey-owncloud-18.0-bookworm-amd64.iso sleep 2 msg_ok "${CL}${BL}${URL}${CL}" @@ -393,31 +393,33 @@ btrfs) THIN="" ;; esac -for i in {0,1}; do +for i in {0,1,2}; do disk="DISK$i" eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} done -msg_info "Creating a TurnKey ownCloud VM" +msg_info "Creating a $NAME" qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios seabios${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +pvesm alloc $STORAGE $VMID $DISK1 12G 1>&/dev/null qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null qm set $VMID \ -efidisk0 ${DISK0_REF}${FORMAT} \ - -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=12G \ - -boot order=scsi0 \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN} \ + -scsi1 ${DISK2_REF},${DISK_CACHE}${THIN} \ + -boot order='scsi1;scsi0' \ -description "
- # TurnKey ownCloud VM + # $NAME
" >/dev/null -msg_ok "Created a TurnKey ownCloud VM ${CL}${BL}(${HN})" +msg_ok "Created a $NAME ${CL}${BL}(${HN})" if [ "$START_VM" == "yes" ]; then - msg_info "Starting TurnKey ownCloud VM" + msg_info "Starting $NAME" qm start $VMID - msg_ok "Started TurnKey ownCloud VM" + msg_ok "Started $NAME" fi msg_ok "Completed Successfully!\n"