├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── config.yml
│ └── new-script.yaml
├── CODEOWNERS
├── workflows
│ ├── scripts
│ │ ├── update-json.sh
│ │ ├── update_json_date.sh
│ │ ├── get-gh-release.sh
│ │ └── generate-app-headers.sh
│ ├── delete-discord-thread.yml
│ └── push-to-gitea.yml
├── CONTRIBUTOR_AND_GUIDES
│ ├── json
│ │ ├── AppName.md
│ │ └── AppName.json
│ └── CODE-AUDIT.md
└── pull_request_template.md
├── .vscode
├── .shellcheckrc
├── extensions.json
└── settings.json
├── frontend
├── .prettierignore
├── public
│ ├── logo.png
│ ├── defaultimg.png
│ └── json
│ │ ├── frigate.json
│ │ ├── byparr.json
│ │ ├── ubuntu.json
│ │ ├── nextexplorer.json
│ │ ├── almalinux.json
│ │ ├── debian.json
│ │ ├── fedora.json
│ │ ├── opensuse.json
│ │ ├── openeuler.json
│ │ ├── rockylinux.json
│ │ ├── alpine.json
│ │ ├── rybbit.json
│ │ ├── romm.json
│ │ ├── devuan.json
│ │ ├── gentoo.json
│ │ ├── allstarlink.json
│ │ ├── centos.json
│ │ ├── unifi-os-server-vm.json
│ │ ├── petio.json
│ │ ├── freepbx.json
│ │ ├── pihole-exporter.json
│ │ ├── jellystat.json
│ │ ├── qbittorrent-exporter.json
│ │ ├── garmin-grafana.json
│ │ ├── koel.json
│ │ ├── transmission-openvpn.json
│ │ ├── postgresus.json
│ │ ├── pixelfed.json
│ │ └── ente.json
├── .prettierrc
├── src
│ ├── app
│ │ ├── favicon.ico
│ │ ├── scripts
│ │ │ └── _components
│ │ │ │ ├── VersionBadge.tsx
│ │ │ │ ├── ScriptItems
│ │ │ │ ├── ConfigFile.tsx
│ │ │ │ ├── Description.tsx
│ │ │ │ ├── InterFaces.tsx
│ │ │ │ ├── Alerts.tsx
│ │ │ │ ├── DefaultSettings.tsx
│ │ │ │ ├── DefaultPassword.tsx
│ │ │ │ └── Tooltips.tsx
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ └── ResourceDisplay.tsx
│ │ ├── robots.ts
│ │ ├── sitemap.ts
│ │ ├── not-found.tsx
│ │ ├── manifest.ts
│ │ ├── api
│ │ │ ├── versions
│ │ │ │ └── route.ts
│ │ │ └── categories
│ │ │ │ └── route.ts
│ │ └── json-editor
│ │ │ └── _schemas
│ │ │ └── schemas.ts
│ ├── __tests__
│ │ ├── setupTests.ts
│ │ └── app
│ │ │ └── page.test.tsx
│ ├── lib
│ │ ├── utils.ts
│ │ ├── utils
│ │ │ └── resource-utils.ts
│ │ ├── time.ts
│ │ ├── data.ts
│ │ └── types.ts
│ ├── components
│ │ ├── theme-provider.tsx
│ │ ├── handleCopy.tsx
│ │ ├── query-provider.tsx
│ │ ├── ui
│ │ │ ├── textarea.tsx
│ │ │ ├── label.tsx
│ │ │ ├── separator.tsx
│ │ │ ├── input.tsx
│ │ │ ├── sonner.tsx
│ │ │ ├── animated-gradient-text.tsx
│ │ │ ├── switch.tsx
│ │ │ ├── tooltip.tsx
│ │ │ ├── popover.tsx
│ │ │ ├── badge.tsx
│ │ │ ├── theme-toggle.tsx
│ │ │ ├── config-copy-button.tsx
│ │ │ ├── number-ticker.tsx
│ │ │ └── alert.tsx
│ │ ├── Modal.tsx
│ │ ├── TextCopyBlock.tsx
│ │ ├── icons
│ │ │ └── resource-icons.tsx
│ │ ├── FAQ.tsx
│ │ └── Footer.tsx
│ └── hooks
│ │ └── useVersions.ts
├── .eslintrc.json
├── postcss.config.mjs
├── vitest.config.mjs
├── components.json
├── next.config.mjs
├── .gitignore
├── tsconfig.json
└── LICENSE
├── api
├── .env.example
└── go.mod
├── misc
└── images
│ ├── logo.png
│ └── logo-81x112.png
├── bak
└── core_ref
│ ├── newtemplateavailable.png
│ └── pve-container-upgrader.png
├── ct
├── headers
│ ├── ente
│ ├── petio
│ ├── mealie
│ ├── alpine
│ ├── romm
│ ├── debian
│ ├── rybbit
│ ├── docker
│ ├── qdrant
│ ├── viseron
│ ├── ubuntu
│ ├── frigate
│ ├── freepbx
│ ├── metabase
│ ├── wanderer
│ ├── web-check
│ ├── snowshare
│ ├── alpine-ntfy
│ ├── gitea-mirror
│ ├── joplin-server
│ ├── garmin-grafana
│ └── transmission-openvpn
├── deferred
│ ├── maxun.json
│ ├── docspell.json
│ ├── polaris.sh
│ ├── ocis.sh
│ ├── kanba.sh
│ ├── pixelfed.sh
│ ├── ampache.sh
│ ├── docspell.sh
│ ├── squirrelserversmanager.sh
│ └── maxun.sh
├── fedora.sh
├── almalinux.sh
├── opensuse.sh
├── rockylinux.sh
├── openeuler.sh
├── centos.sh
├── devuan.sh
├── rybbit.sh
├── gentoo.sh
├── ente.sh
├── alpine.sh
├── debian.sh
├── ubuntu.sh
├── frigate.sh
├── petio.sh
├── alpine-ntfy.sh
├── byparr.sh
└── opencloud.sh
├── docs
├── misc
│ ├── cloud-init.func
│ │ ├── CLOUD_INIT_FUNC_INTEGRATION.md
│ │ ├── CLOUD_INIT_FUNC_USAGE_EXAMPLES.md
│ │ ├── CLOUD_INIT_FUNC_FLOWCHART.md
│ │ └── CLOUD_INIT_FUNC_FUNCTIONS_REFERENCE.md
│ ├── alpine-tools.func
│ │ ├── ALPINE_TOOLS_FUNC_INTEGRATION.md
│ │ ├── ALPINE_TOOLS_FUNC_USAGE_EXAMPLES.md
│ │ ├── ALPINE_TOOLS_FUNC_FLOWCHART.md
│ │ └── ALPINE_TOOLS_FUNC_FUNCTIONS_REFERENCE.md
│ ├── alpine-install.func
│ │ ├── ALPINE_INSTALL_FUNC_INTEGRATION.md
│ │ ├── ALPINE_INSTALL_FUNC_USAGE_EXAMPLES.md
│ │ ├── ALPINE_INSTALL_FUNC_FLOWCHART.md
│ │ └── ALPINE_INSTALL_FUNC_FUNCTIONS_REFERENCE.md
│ └── install.func
│ │ └── INSTALL_FUNC_USAGE_EXAMPLES.md
└── contribution
│ └── CODE-AUDIT.md
├── tools
├── headers
│ ├── add-iptag
│ ├── glances
│ ├── saltminion
│ ├── copyparty
│ ├── filebrowser
│ ├── code-server
│ ├── phpmyadmin
│ ├── meilisearch-ui
│ ├── prx-add-ips
│ ├── core-restore-from-backup
│ ├── qbittorrent-exporter
│ ├── filebrowser-quantum
│ ├── pve-privilege-converter
│ └── container-restore-from-backup
├── addon
│ └── grafana-loki.sh
└── pve
│ └── usb-passthrough.sh
├── vm
└── headers
│ ├── docker-vm
│ ├── umbrel-os-vm
│ └── ubuntu2410-vm
├── .gitignore
├── install
├── almalinux-install.sh
├── devuan-install.sh
├── fedora-install.sh
├── gentoo-install.sh
├── opensuse-install.sh
├── rockylinux-install.sh
├── openeuler-install.sh
├── centos-install.sh
├── alpine-install.sh
├── ubuntu-install.sh
├── alpine-ntfy-install.sh
├── debian-install.sh
├── deferred
│ ├── ocis-install.sh
│ ├── vikunja-install.sh
│ ├── jumpserver-install.sh
│ └── netbootxyz-install.sh
├── byparr-install.sh
├── plex2-install.sh
├── heimdall-dashboard-install.sh
├── plex-install.sh
└── cronmaster-install.sh
├── .editorconfig
├── LICENSE
├── README.md
└── SECURITY.md
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | ko_fi: community_scripts
2 | github: community_scripts
3 |
--------------------------------------------------------------------------------
/.vscode/.shellcheckrc:
--------------------------------------------------------------------------------
1 | disable=SC2034,SC1091,SC2155,SC2086,SC2317,SC2181
2 |
--------------------------------------------------------------------------------
/frontend/.prettierignore:
--------------------------------------------------------------------------------
1 | dist
2 | node_modules
3 | .next
4 | build
5 | .contentlayer
--------------------------------------------------------------------------------
/api/.env.example:
--------------------------------------------------------------------------------
1 | MONGO_USER=
2 | MONGO_PASSWORD=
3 | MONGO_IP=
4 | MONGO_PORT=
5 | MONGO_DATABASE=
--------------------------------------------------------------------------------
/misc/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/community-scripts/ProxmoxVED/HEAD/misc/images/logo.png
--------------------------------------------------------------------------------
/frontend/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/community-scripts/ProxmoxVED/HEAD/frontend/public/logo.png
--------------------------------------------------------------------------------
/frontend/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "plugins": ["prettier-plugin-tailwindcss", "prettier-plugin-organize-imports"]
3 | }
4 |
--------------------------------------------------------------------------------
/misc/images/logo-81x112.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/community-scripts/ProxmoxVED/HEAD/misc/images/logo-81x112.png
--------------------------------------------------------------------------------
/frontend/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/community-scripts/ProxmoxVED/HEAD/frontend/src/app/favicon.ico
--------------------------------------------------------------------------------
/frontend/public/defaultimg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/community-scripts/ProxmoxVED/HEAD/frontend/public/defaultimg.png
--------------------------------------------------------------------------------
/bak/core_ref/newtemplateavailable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/community-scripts/ProxmoxVED/HEAD/bak/core_ref/newtemplateavailable.png
--------------------------------------------------------------------------------
/bak/core_ref/pve-container-upgrader.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/community-scripts/ProxmoxVED/HEAD/bak/core_ref/pve-container-upgrader.png
--------------------------------------------------------------------------------
/frontend/src/__tests__/setupTests.ts:
--------------------------------------------------------------------------------
1 | import { vi } from "vitest";
2 |
3 | // Mock canvas getContext
4 | HTMLCanvasElement.prototype.getContext = vi.fn();
--------------------------------------------------------------------------------
/frontend/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["next/core-web-vitals"],
3 | "parser": "@typescript-eslint/parser",
4 | "plugins": ["@typescript-eslint"]
5 | }
6 |
--------------------------------------------------------------------------------
/ct/headers/ente:
--------------------------------------------------------------------------------
1 | ______ __
2 | / ____/___ / /____
3 | / __/ / __ \/ __/ _ \
4 | / /___/ / / / /_/ __/
5 | /_____/_/ /_/\__/\___/
6 |
7 |
--------------------------------------------------------------------------------
/ct/headers/petio:
--------------------------------------------------------------------------------
1 | ____ __ _
2 | / __ \___ / /_(_)___
3 | / /_/ / _ \/ __/ / __ \
4 | / ____/ __/ /_/ / /_/ /
5 | /_/ \___/\__/_/\____/
6 |
7 |
--------------------------------------------------------------------------------
/frontend/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('postcss-load-config').Config} */
2 | const config = {
3 | plugins: {
4 | tailwindcss: {},
5 | },
6 | };
7 |
8 | export default config;
9 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "bmalehorn.shell-syntax",
4 | "timonwong.shellcheck",
5 | "foxundermoon.shell-format"
6 | ],
7 | "unwantedRecommendations": []
8 | }
9 |
--------------------------------------------------------------------------------
/docs/misc/cloud-init.func/CLOUD_INIT_FUNC_INTEGRATION.md:
--------------------------------------------------------------------------------
1 | # cloud-init.func Integration Guide
2 |
3 | Cloud-init integration with Proxmox VM provisioning.
4 |
5 | ---
6 |
7 | **Last Updated**: December 2025
8 |
--------------------------------------------------------------------------------
/frontend/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx";
2 | import { twMerge } from "tailwind-merge";
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs));
6 | }
7 |
--------------------------------------------------------------------------------
/ct/headers/mealie:
--------------------------------------------------------------------------------
1 | __ ___ ___
2 | / |/ /__ ____ _/ (_)__
3 | / /|_/ / _ \/ __ `/ / / _ \
4 | / / / / __/ /_/ / / / __/
5 | /_/ /_/\___/\__,_/_/_/\___/
6 |
7 |
--------------------------------------------------------------------------------
/ct/headers/alpine:
--------------------------------------------------------------------------------
1 | ___ __ _
2 | / | / /___ (_)___ ___
3 | / /| | / / __ \/ / __ \/ _ \
4 | / ___ |/ / /_/ / / / / / __/
5 | /_/ |_/_/ .___/_/_/ /_/\___/
6 | /_/
7 |
--------------------------------------------------------------------------------
/docs/misc/alpine-tools.func/ALPINE_TOOLS_FUNC_INTEGRATION.md:
--------------------------------------------------------------------------------
1 | # alpine-tools.func Integration Guide
2 |
3 | Alpine tool installation integration with container workflows.
4 |
5 | ---
6 |
7 | **Last Updated**: December 2025
8 |
--------------------------------------------------------------------------------
/ct/headers/romm:
--------------------------------------------------------------------------------
1 | ____ __ ___
2 | / __ \____ ____ ___ / |/ /
3 | / /_/ / __ \/ __ `__ \/ /|_/ /
4 | / _, _/ /_/ / / / / / / / / /
5 | /_/ |_|\____/_/ /_/ /_/_/ /_/
6 |
7 |
--------------------------------------------------------------------------------
/ct/headers/debian:
--------------------------------------------------------------------------------
1 | ____ __ _
2 | / __ \___ / /_ (_)___ _____
3 | / / / / _ \/ __ \/ / __ `/ __ \
4 | / /_/ / __/ /_/ / / /_/ / / / /
5 | /_____/\___/_.___/_/\__,_/_/ /_/
6 |
7 |
--------------------------------------------------------------------------------
/ct/headers/rybbit:
--------------------------------------------------------------------------------
1 | ____ __ __ _ __
2 | / __ \__ __/ /_ / /_ (_) /_
3 | / /_/ / / / / __ \/ __ \/ / __/
4 | / _, _/ /_/ / /_/ / /_/ / / /_
5 | /_/ |_|\__, /_.___/_.___/_/\__/
6 | /____/
7 |
--------------------------------------------------------------------------------
/ct/headers/docker:
--------------------------------------------------------------------------------
1 | ____ __
2 | / __ \____ _____/ /_____ _____
3 | / / / / __ \/ ___/ //_/ _ \/ ___/
4 | / /_/ / /_/ / /__/ ,< / __/ /
5 | /_____/\____/\___/_/|_|\___/_/
6 |
7 |
--------------------------------------------------------------------------------
/ct/headers/qdrant:
--------------------------------------------------------------------------------
1 | ____ __ __
2 | / __ \____/ /________ _____ / /_
3 | / / / / __ / ___/ __ `/ __ \/ __/
4 | / /_/ / /_/ / / / /_/ / / / / /_
5 | \___\_\__,_/_/ \__,_/_/ /_/\__/
6 |
7 |
--------------------------------------------------------------------------------
/ct/headers/viseron:
--------------------------------------------------------------------------------
1 | _ ___
2 | | | / (_)_______ _________ ____
3 | | | / / / ___/ _ \/ ___/ __ \/ __ \
4 | | |/ / (__ ) __/ / / /_/ / / / /
5 | |___/_/____/\___/_/ \____/_/ /_/
6 |
7 |
--------------------------------------------------------------------------------
/ct/headers/ubuntu:
--------------------------------------------------------------------------------
1 | __ ____ __
2 | / / / / /_ __ ______ / /___ __
3 | / / / / __ \/ / / / __ \/ __/ / / /
4 | / /_/ / /_/ / /_/ / / / / /_/ /_/ /
5 | \____/_.___/\__,_/_/ /_/\__/\__,_/
6 |
7 |
--------------------------------------------------------------------------------
/tools/headers/add-iptag:
--------------------------------------------------------------------------------
1 | ________ ______
2 | / _/ __ \ /_ __/___ _____ _
3 | / // /_/ /_____/ / / __ `/ __ `/
4 | _/ // ____/_____/ / / /_/ / /_/ /
5 | /___/_/ /_/ \__,_/\__, /
6 | /____/
7 |
--------------------------------------------------------------------------------
/ct/headers/frigate:
--------------------------------------------------------------------------------
1 | ______ _ __
2 | / ____/____(_)___ _____ _/ /____
3 | / /_ / ___/ / __ `/ __ `/ __/ _ \
4 | / __/ / / / / /_/ / /_/ / /_/ __/
5 | /_/ /_/ /_/\__, /\__,_/\__/\___/
6 | /____/
7 |
--------------------------------------------------------------------------------
/tools/headers/glances:
--------------------------------------------------------------------------------
1 | ________
2 | / ____/ /___ _____ ________ _____
3 | / / __/ / __ `/ __ \/ ___/ _ \/ ___/
4 | / /_/ / / /_/ / / / / /__/ __(__ )
5 | \____/_/\__,_/_/ /_/\___/\___/____/
6 |
7 |
--------------------------------------------------------------------------------
/ct/headers/freepbx:
--------------------------------------------------------------------------------
1 | ______ ____ ____ _ __
2 | / ____/_______ ___ / __ \/ __ ) |/ /
3 | / /_ / ___/ _ \/ _ \/ /_/ / __ | /
4 | / __/ / / / __/ __/ ____/ /_/ / |
5 | /_/ /_/ \___/\___/_/ /_____/_/|_|
6 |
7 |
--------------------------------------------------------------------------------
/frontend/src/lib/utils/resource-utils.ts:
--------------------------------------------------------------------------------
1 | export function getDisplayValueFromRAM(ram: number): string {
2 | return ram >= 1024 ? `${Math.floor(ram / 1024)}GB` : `${ram}MB`;
3 | }
4 |
5 | export function cleanSlug(slug: string): string {
6 | return slug.replace(/[^a-z0-9]/gi, "").toLowerCase();
7 | }
8 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: 🌟 new Script request
4 | url: https://github.com/community-scripts/ProxmoxVE/discussions/new?category=request-script
5 | about: For feature/script requests, please use the Discussions section.
6 |
7 |
--------------------------------------------------------------------------------
/vm/headers/docker-vm:
--------------------------------------------------------------------------------
1 | ____ __ _ ____ ___
2 | / __ \____ _____/ /_____ _____ | | / / |/ /
3 | / / / / __ \/ ___/ //_/ _ \/ ___/ | | / / /|_/ /
4 | / /_/ / /_/ / /__/ ,< / __/ / | |/ / / / /
5 | /_____/\____/\___/_/|_|\___/_/ |___/_/ /_/
6 |
7 |
--------------------------------------------------------------------------------
/ct/headers/metabase:
--------------------------------------------------------------------------------
1 | __ ___ __ __
2 | / |/ /__ / /_____ _/ /_ ____ _________
3 | / /|_/ / _ \/ __/ __ `/ __ \/ __ `/ ___/ _ \
4 | / / / / __/ /_/ /_/ / /_/ / /_/ (__ ) __/
5 | /_/ /_/\___/\__/\__,_/_.___/\__,_/____/\___/
6 |
7 |
--------------------------------------------------------------------------------
/ct/headers/wanderer:
--------------------------------------------------------------------------------
1 | _ __ __
2 | | | / /___ _____ ____/ /__ ________ _____
3 | | | /| / / __ `/ __ \/ __ / _ \/ ___/ _ \/ ___/
4 | | |/ |/ / /_/ / / / / /_/ / __/ / / __/ /
5 | |__/|__/\__,_/_/ /_/\__,_/\___/_/ \___/_/
6 |
7 |
--------------------------------------------------------------------------------
/frontend/src/lib/time.ts:
--------------------------------------------------------------------------------
1 | export function extractDate(dateString: string): string {
2 | const date = new Date(dateString);
3 | const year = date.getFullYear();
4 | const month = String(date.getMonth() + 1).padStart(2, "0");
5 | const day = String(date.getDate()).padStart(2, "0");
6 | return `${year}-${month}-${day}`;
7 | }
8 |
--------------------------------------------------------------------------------
/tools/headers/saltminion:
--------------------------------------------------------------------------------
1 | ____ _ _
2 | _________ _/ / /_____ ___ (_)___ (_)___ ____
3 | / ___/ __ `/ / __/ __ `__ \/ / __ \/ / __ \/ __ \
4 | (__ ) /_/ / / /_/ / / / / / / / / / / /_/ / / / /
5 | /____/\__,_/_/\__/_/ /_/ /_/_/_/ /_/_/\____/_/ /_/
6 |
7 |
--------------------------------------------------------------------------------
/ct/headers/web-check:
--------------------------------------------------------------------------------
1 | __ __ __
2 | _ _____ / /_ _____/ /_ ___ _____/ /__
3 | | | /| / / _ \/ __ \______/ ___/ __ \/ _ \/ ___/ //_/
4 | | |/ |/ / __/ /_/ /_____/ /__/ / / / __/ /__/ ,<
5 | |__/|__/\___/_.___/ \___/_/ /_/\___/\___/_/|_|
6 |
7 |
--------------------------------------------------------------------------------
/frontend/vitest.config.mjs:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vitest/config'
2 | import react from '@vitejs/plugin-react'
3 | import tsconfigPaths from 'vite-tsconfig-paths'
4 |
5 | export default defineConfig({
6 | plugins: [tsconfigPaths(), react()],
7 | test: {
8 | environment: "jsdom",
9 | setupFiles: ["src/__tests__/setupTests.ts"]
10 | },
11 | })
--------------------------------------------------------------------------------
/tools/headers/copyparty:
--------------------------------------------------------------------------------
1 | ______ ____ __
2 | / ____/___ ____ __ __/ __ \____ ______/ /___ __
3 | / / / __ \/ __ \/ / / / /_/ / __ `/ ___/ __/ / / /
4 | / /___/ /_/ / /_/ / /_/ / ____/ /_/ / / / /_/ /_/ /
5 | \____/\____/ .___/\__, /_/ \__,_/_/ \__/\__, /
6 | /_/ /____/ /____/
7 |
--------------------------------------------------------------------------------
/frontend/src/components/theme-provider.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { ThemeProvider as NextThemesProvider } from "next-themes";
4 | import { type ThemeProviderProps } from "next-themes/dist/types";
5 |
6 | export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
7 | return {children};
8 | }
9 |
--------------------------------------------------------------------------------
/ct/headers/snowshare:
--------------------------------------------------------------------------------
1 | _____ _____ __
2 | / ___/____ ____ _ __/ ___// /_ ____ _________
3 | \__ \/ __ \/ __ \ | /| / /\__ \/ __ \/ __ `/ ___/ _ \
4 | ___/ / / / / /_/ / |/ |/ /___/ / / / / /_/ / / / __/
5 | /____/_/ /_/\____/|__/|__//____/_/ /_/\__,_/_/ \___/
6 |
7 |
--------------------------------------------------------------------------------
/frontend/src/components/handleCopy.tsx:
--------------------------------------------------------------------------------
1 | import { ClipboardCheck } from "lucide-react";
2 | import { toast } from "sonner";
3 |
4 | export default function handleCopy(type: string, value: string) {
5 | navigator.clipboard.writeText(value);
6 |
7 | toast.success(`copied ${type} to clipboard`, {
8 | icon: ,
9 | });
10 | }
11 |
--------------------------------------------------------------------------------
/ct/headers/alpine-ntfy:
--------------------------------------------------------------------------------
1 | ___ __ _ __ ____
2 | / | / /___ (_)___ ___ ____ / /_/ __/_ __
3 | / /| | / / __ \/ / __ \/ _ \______/ __ \/ __/ /_/ / / /
4 | / ___ |/ / /_/ / / / / / __/_____/ / / / /_/ __/ /_/ /
5 | /_/ |_/_/ .___/_/_/ /_/\___/ /_/ /_/\__/_/ \__, /
6 | /_/ /____/
7 |
--------------------------------------------------------------------------------
/tools/headers/filebrowser:
--------------------------------------------------------------------------------
1 | _______ __ ____
2 | / ____(_) /__ / __ )_________ _ __________ _____
3 | / /_ / / / _ \/ __ / ___/ __ \ | /| / / ___/ _ \/ ___/
4 | / __/ / / / __/ /_/ / / / /_/ / |/ |/ (__ ) __/ /
5 | /_/ /_/_/\___/_____/_/ \____/|__/|__/____/\___/_/
6 |
7 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .vscode/settings.json
2 | CHANGELOG_MISC.md
3 | misc/COMPLETION_REPORT.md
4 | misc/DOCUMENTATION_INDEX.md
5 | misc/DOCUMENTATION_SUMMARY.md
6 | misc/live/alpine-install.func
7 | misc/live/build.func
8 | misc/live/install.func
9 | vm/debian-13-vm.sh
10 | vm/README-vm-manager.md
11 | vm/vm-manager.sh
12 | vm/debian-13-vm.sh
13 | vm/vm-manager.sh
14 | vm/vm-manager.sh
15 | vm/debian-13-vm.sh
16 |
--------------------------------------------------------------------------------
/frontend/src/components/query-provider.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
3 | import React from "react";
4 |
5 | const queryClient = new QueryClient();
6 |
7 | export default function QueryProvider({ children }: { children: React.ReactNode }) {
8 | return {children};
9 | }
10 |
--------------------------------------------------------------------------------
/tools/headers/code-server:
--------------------------------------------------------------------------------
1 | ______ __ _____
2 | / ____/___ ____/ /__ / ___/___ ______ _____ _____
3 | / / / __ \/ __ / _ \ \__ \/ _ \/ ___/ | / / _ \/ ___/
4 | / /___/ /_/ / /_/ / __/ ___/ / __/ / | |/ / __/ /
5 | \____/\____/\__,_/\___/ /____/\___/_/ |___/\___/_/
6 |
7 |
--------------------------------------------------------------------------------
/frontend/src/app/scripts/_components/VersionBadge.tsx:
--------------------------------------------------------------------------------
1 | import { AppVersion } from "@/lib/types";
2 |
3 | interface VersionBadgeProps {
4 | version: AppVersion;
5 | }
6 |
7 | export function VersionBadge({ version }: VersionBadgeProps) {
8 | return (
9 |
10 | {version.version}
11 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/docs/misc/alpine-install.func/ALPINE_INSTALL_FUNC_INTEGRATION.md:
--------------------------------------------------------------------------------
1 | # alpine-install.func Integration Guide
2 |
3 | Integration of alpine-install.func with Alpine container workflows.
4 |
5 | ## Alpine-Specific Integration
6 |
7 | Alpine containers use:
8 | - `apk` instead of `apt-get`
9 | - `OpenRC` instead of `systemd`
10 | - Alpine-specific package names
11 |
12 | ---
13 |
14 | **Last Updated**: December 2025
15 |
--------------------------------------------------------------------------------
/docs/misc/cloud-init.func/CLOUD_INIT_FUNC_USAGE_EXAMPLES.md:
--------------------------------------------------------------------------------
1 | # cloud-init.func Usage Examples
2 |
3 | Examples for VM cloud-init configuration.
4 |
5 | ### Example: Basic Cloud-Init
6 |
7 | ```bash
8 | #!/usr/bin/env bash
9 |
10 | generate_cloud_init > cloud-init.yaml
11 | setup_ssh_keys "$VMID" "$SSH_KEY"
12 | apply_cloud_init "$VMID" cloud-init.yaml
13 | ```
14 |
15 | ---
16 |
17 | **Last Updated**: December 2025
18 |
--------------------------------------------------------------------------------
/tools/headers/phpmyadmin:
--------------------------------------------------------------------------------
1 | __ __ ___ ___ __ _
2 | ____ / /_ ____ / |/ /_ __/ | ____/ /___ ___ (_)___
3 | / __ \/ __ \/ __ \/ /|_/ / / / / /| |/ __ / __ `__ \/ / __ \
4 | / /_/ / / / / /_/ / / / / /_/ / ___ / /_/ / / / / / / / / / /
5 | / .___/_/ /_/ .___/_/ /_/\__, /_/ |_\__,_/_/ /_/ /_/_/_/ /_/
6 | /_/ /_/ /____/
7 |
--------------------------------------------------------------------------------
/ct/headers/gitea-mirror:
--------------------------------------------------------------------------------
1 | _ __ _
2 | ____ _(_) /____ ____ _ ____ ___ (_)_____________ _____
3 | / __ `/ / __/ _ \/ __ `/_____/ __ `__ \/ / ___/ ___/ __ \/ ___/
4 | / /_/ / / /_/ __/ /_/ /_____/ / / / / / / / / / / /_/ / /
5 | \__, /_/\__/\___/\__,_/ /_/ /_/ /_/_/_/ /_/ \____/_/
6 | /____/
7 |
--------------------------------------------------------------------------------
/frontend/src/app/robots.ts:
--------------------------------------------------------------------------------
1 | import { basePath } from "@/config/siteConfig";
2 | import type { MetadataRoute } from "next";
3 |
4 | export const dynamic = "force-static";
5 |
6 | export default function robots(): MetadataRoute.Robots {
7 | return {
8 | rules: {
9 | userAgent: "*",
10 | allow: "/",
11 | },
12 | sitemap: `https://community-scripts.github.io/${basePath}/sitemap.xml`,
13 | };
14 | }
15 |
--------------------------------------------------------------------------------
/docs/misc/alpine-tools.func/ALPINE_TOOLS_FUNC_USAGE_EXAMPLES.md:
--------------------------------------------------------------------------------
1 | # alpine-tools.func Usage Examples
2 |
3 | Examples for Alpine tool installation.
4 |
5 | ### Example: Alpine Setup with Tools
6 |
7 | ```bash
8 | #!/usr/bin/env bash
9 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
10 |
11 | apk_update
12 | setup_nodejs "20"
13 | setup_php "8.3"
14 | setup_mariadb "11"
15 | ```
16 |
17 | ---
18 |
19 | **Last Updated**: December 2025
20 |
--------------------------------------------------------------------------------
/frontend/src/app/scripts/_components/ScriptItems/ConfigFile.tsx:
--------------------------------------------------------------------------------
1 | import ConfigCopyButton from "@/components/ui/config-copy-button";
2 | import { Script } from "@/lib/types";
3 |
4 | export default function ConfigFile({ item }: { item: Script }) {
5 | return (
6 |
7 | {item.config_path ? item.config_path : "No config path set"}
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/ct/headers/joplin-server:
--------------------------------------------------------------------------------
1 | __ ___ _____
2 | / /___ ____ / (_)___ / ___/___ ______ _____ _____
3 | __ / / __ \/ __ \/ / / __ \______\__ \/ _ \/ ___/ | / / _ \/ ___/
4 | / /_/ / /_/ / /_/ / / / / / /_____/__/ / __/ / | |/ / __/ /
5 | \____/\____/ .___/_/_/_/ /_/ /____/\___/_/ |___/\___/_/
6 | /_/
7 |
--------------------------------------------------------------------------------
/frontend/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "default",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.ts",
8 | "css": "@/styles/globals.css",
9 | "baseColor": "slate",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/frontend/src/__tests__/app/page.test.tsx:
--------------------------------------------------------------------------------
1 | import { screen } from "@testing-library/dom";
2 | import { render } from "@testing-library/react";
3 | import { describe, expect, it } from "vitest";
4 | import Page from "@/app/page";
5 |
6 | describe("Page", () => {
7 | it("should show button to view scripts", () => {
8 | render();
9 | expect(screen.getByRole("button", { name: "View Scripts" })).toBeDefined();
10 | });
11 | });
12 |
--------------------------------------------------------------------------------
/tools/headers/meilisearch-ui:
--------------------------------------------------------------------------------
1 | __ ___ _ ___ __ __ ______
2 | / |/ /__ (_) (_)_______ ____ ___________/ /_ / / / / _/
3 | / /|_/ / _ \/ / / / ___/ _ \/ __ `/ ___/ ___/ __ \ / / / // /
4 | / / / / __/ / / (__ ) __/ /_/ / / / /__/ / / / / /_/ // /
5 | /_/ /_/\___/_/_/_/____/\___/\__,_/_/ \___/_/ /_/ \____/___/
6 |
7 |
--------------------------------------------------------------------------------
/vm/headers/umbrel-os-vm:
--------------------------------------------------------------------------------
1 | __ __ __ __ ____ _____ _ ____ ___
2 | / / / /___ ___ / /_ ________ / / / __ \/ ___/ | | / / |/ /
3 | / / / / __ `__ \/ __ \/ ___/ _ \/ / / / / /\__ \ | | / / /|_/ /
4 | / /_/ / / / / / / /_/ / / / __/ / / /_/ /___/ / | |/ / / / /
5 | \____/_/ /_/ /_/_.___/_/ \___/_/ \____//____/ |___/_/ /_/
6 |
7 |
--------------------------------------------------------------------------------
/install/almalinux-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://almalinux.org/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | motd_ssh
17 | customize
18 | cleanup_lxc
19 |
--------------------------------------------------------------------------------
/install/devuan-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://www.devuan.org/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | motd_ssh
17 | customize
18 | cleanup_lxc
19 |
--------------------------------------------------------------------------------
/install/fedora-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://fedoraproject.org/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | motd_ssh
17 | customize
18 | cleanup_lxc
19 |
--------------------------------------------------------------------------------
/install/gentoo-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://www.gentoo.org/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | motd_ssh
17 | customize
18 | cleanup_lxc
19 |
--------------------------------------------------------------------------------
/install/opensuse-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://www.opensuse.org/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | motd_ssh
17 | customize
18 | cleanup_lxc
19 |
--------------------------------------------------------------------------------
/install/rockylinux-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://rockylinux.org/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | motd_ssh
17 | customize
18 | cleanup_lxc
19 |
--------------------------------------------------------------------------------
/install/openeuler-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://www.openeuler.org/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | motd_ssh
17 | customize
18 | cleanup_lxc
19 |
--------------------------------------------------------------------------------
/install/centos-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://www.centos.org/centos-stream/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | motd_ssh
17 | customize
18 | cleanup_lxc
19 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | ; editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | continuation_indent_size = 2
7 | end_of_line = lf
8 | indent_size = 2
9 | indent_style = space
10 | insert_final_newline = true
11 | max_line_length = 120
12 | tab_width = 2
13 | ; trim_trailing_whitespace = true ; disabled until files are cleaned up
14 |
15 | [*.md]
16 | trim_trailing_whitespace = false
17 |
--------------------------------------------------------------------------------
/docs/misc/cloud-init.func/CLOUD_INIT_FUNC_FLOWCHART.md:
--------------------------------------------------------------------------------
1 | # cloud-init.func Flowchart
2 |
3 | Cloud-init VM provisioning flow.
4 |
5 | ## Cloud-Init Generation and Application
6 |
7 | ```
8 | generate_cloud_init()
9 | ↓
10 | generate_user_data()
11 | ↓
12 | setup_ssh_keys()
13 | ↓
14 | Apply to VM
15 | ↓
16 | VM Boot
17 | ↓
18 | cloud-init phases
19 | ├─ system
20 | ├─ config
21 | └─ final
22 | ↓
23 | VM Ready ✓
24 | ```
25 |
26 | ---
27 |
28 | **Last Updated**: December 2025
29 |
--------------------------------------------------------------------------------
/vm/headers/ubuntu2410-vm:
--------------------------------------------------------------------------------
1 | __ ____ __ ___ __ __ _______ _ ____ ___
2 | / / / / /_ __ ______ / /___ __ |__ \/ // / < / __ \ | | / / |/ /
3 | / / / / __ \/ / / / __ \/ __/ / / / __/ / // /_ / / / / / | | / / /|_/ /
4 | / /_/ / /_/ / /_/ / / / / /_/ /_/ / / __/__ __/ / / /_/ / | |/ / / / /
5 | \____/_.___/\__,_/_/ /_/\__/\__,_/ /____/ /_/ (_)_/\____/ |___/_/ /_/
6 |
7 |
--------------------------------------------------------------------------------
/frontend/src/app/scripts/_components/ScriptItems/Description.tsx:
--------------------------------------------------------------------------------
1 | import TextCopyBlock from "@/components/TextCopyBlock";
2 | import { Script } from "@/lib/types";
3 |
4 | export default function Description({ item }: { item: Script }) {
5 | return (
6 |
7 |
Description
8 |
9 | {TextCopyBlock(item.description)}
10 |
11 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/docs/misc/alpine-tools.func/ALPINE_TOOLS_FUNC_FLOWCHART.md:
--------------------------------------------------------------------------------
1 | # alpine-tools.func Flowchart
2 |
3 | Alpine tool installation and package management flow.
4 |
5 | ## Tool Installation on Alpine
6 |
7 | ```
8 | apk_update()
9 | ↓
10 | add_community_repo() [optional]
11 | ↓
12 | apk_add PACKAGES
13 | ↓
14 | Tool Installation
15 | ↓
16 | rc-service start
17 | ↓
18 | rc-update add [enable at boot]
19 | ↓
20 | Complete ✓
21 | ```
22 |
23 | ---
24 |
25 | **Last Updated**: December 2025
26 |
--------------------------------------------------------------------------------
/frontend/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | webpack: (config) => {
4 | config.resolve.alias.canvas = false;
5 |
6 | return config;
7 | },
8 | images: {
9 | remotePatterns: [
10 | {
11 | protocol: "https",
12 | hostname: "**",
13 | },
14 | ],
15 | },
16 |
17 | env: {
18 | BASE_PATH: "ProxmoxVED",
19 | },
20 |
21 | output: "export",
22 | basePath: `/ProxmoxVED`,
23 | };
24 |
25 | export default nextConfig;
26 |
--------------------------------------------------------------------------------
/docs/misc/alpine-install.func/ALPINE_INSTALL_FUNC_USAGE_EXAMPLES.md:
--------------------------------------------------------------------------------
1 | # alpine-install.func Usage Examples
2 |
3 | Basic examples for Alpine container installation.
4 |
5 | ### Example: Basic Alpine Setup
6 |
7 | ```bash
8 | #!/usr/bin/env bash
9 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
10 |
11 | setting_up_container
12 | update_os
13 |
14 | # Install Alpine packages
15 | apk add --no-cache curl wget git
16 |
17 | motd_ssh
18 | customize
19 | cleanup_lxc
20 | ```
21 |
22 | ---
23 |
24 | **Last Updated**: December 2025
25 |
--------------------------------------------------------------------------------
/ct/headers/garmin-grafana:
--------------------------------------------------------------------------------
1 | _ ____
2 | ____ _____ __________ ___ (_)___ ____ __________ _/ __/___ _____ ____ _
3 | / __ `/ __ `/ ___/ __ `__ \/ / __ \______/ __ `/ ___/ __ `/ /_/ __ `/ __ \/ __ `/
4 | / /_/ / /_/ / / / / / / / / / / / /_____/ /_/ / / / /_/ / __/ /_/ / / / / /_/ /
5 | \__, /\__,_/_/ /_/ /_/ /_/_/_/ /_/ \__, /_/ \__,_/_/ \__,_/_/ /_/\__,_/
6 | /____/ /____/
7 |
--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | #
2 | # CODEOWNERS for ProxmoxVE
3 | #
4 |
5 | # Order is important; the last matching pattern takes the most
6 | # precedence.
7 |
8 |
9 | # Codeowners for specific folders and files
10 | # Remember ending folders with /
11 |
12 |
13 | # Set default reviewers
14 | * @community-scripts/Contributor
15 |
16 | # All changes in frontend
17 | /frontend/ @community-scripts/Frontend-Dev
18 |
--------------------------------------------------------------------------------
/.github/workflows/scripts/update-json.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | FILE=$1
4 | TODAY=$(date -u +"%Y-%m-%d")
5 |
6 | if [[ -z "$FILE" ]]; then
7 | echo "No file specified. Exiting."
8 | exit 1
9 | fi
10 |
11 | if [[ ! -f "$FILE" ]]; then
12 | echo "File $FILE not found. Exiting."
13 | exit 1
14 | fi
15 |
16 | DATE_IN_JSON=$(jq -r '.date_created' "$FILE" 2>/dev/null || echo "")
17 |
18 | if [[ "$DATE_IN_JSON" != "$TODAY" ]]; then
19 | jq --arg date "$TODAY" '.date_created = $date' "$FILE" > tmp.json && mv tmp.json "$FILE"
20 | fi
21 |
--------------------------------------------------------------------------------
/tools/headers/prx-add-ips:
--------------------------------------------------------------------------------
1 | ____ ___ __ __ ________
2 | / __ \_________ _ ______ ___ ____ _ __ / | ____/ /___/ / / _/ __ \_____
3 | / /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/ / /| |/ __ / __ /_____ / // /_/ / ___/
4 | / ____/ / / /_/ /> / / / / / /_/ /> < / ___ / /_/ / /_/ /_____// // ____(__ )
5 | /_/ /_/ \____/_/|_/_/ /_/ /_/\____/_/|_| /_/ |_\__,_/\__,_/ /___/_/ /____/
6 |
7 |
--------------------------------------------------------------------------------
/install/alpine-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 tteck
4 | # Author: tteck (tteckster)
5 | # License: MIT
6 | # https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Installing Dependencies"
17 | $STD apk add newt
18 | $STD apk add curl
19 | $STD apk add openssh
20 | $STD apk add nano
21 | $STD apk add mc
22 | msg_ok "Installed Dependencies"
23 |
24 | motd_ssh
25 | customize
26 |
--------------------------------------------------------------------------------
/.github/CONTRIBUTOR_AND_GUIDES/json/AppName.md:
--------------------------------------------------------------------------------
1 | # **AppName.json Files**
2 |
3 | `AppName.json` files found in the `/json` directory. These files are used to provide informations for the website. For this guide we take `/json/snipeit.json` as example.
4 |
5 | ## Table of Contents
6 |
7 | - [**AppName.json Files**](#appnamejson-files)
8 | - [Table of Contents](#table-of-contents)
9 | - [1. JSON Generator](#1-json-generator)
10 |
11 | ## 1. JSON Generator
12 |
13 | Use the [JSON Generator](https://community-scripts.github.io/ProxmoxVED/json-editor) to create this file for your application.
14 |
--------------------------------------------------------------------------------
/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .yarn/install-state.gz
8 |
9 | # wrangler
10 | .worker-next
11 | .wrangler
12 |
13 | # testing
14 | /coverage
15 |
16 | # next.js
17 | /.next/
18 | out
19 | # production
20 | /build
21 |
22 | # misc
23 | .DS_Store
24 | *.pem
25 |
26 | # debug
27 | npm-debug.log*
28 | yarn-debug.log*
29 | yarn-error.log*
30 |
31 | # # local env files
32 | # .env*.local
33 | # .env
34 | # vercel
35 | .vercel
36 |
37 | # typescript
38 | *.tsbuildinfo
39 | next-env.d.ts
40 |
--------------------------------------------------------------------------------
/install/ubuntu-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 tteck
4 | # Author: tteck (tteckster)
5 | # License: MIT
6 | # https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Installing Dependencies"
17 | $STD apt-get install -y jq
18 | msg_ok "Installed Dependencies"
19 |
20 | motd_ssh
21 | customize
22 |
23 | msg_info "Cleaning up"
24 | $STD apt-get -y autoremove
25 | $STD apt-get -y autoclean
26 | msg_ok "Cleaned"
27 |
--------------------------------------------------------------------------------
/frontend/src/lib/data.ts:
--------------------------------------------------------------------------------
1 | import { Category } from "./types";
2 |
3 | export const fetchCategories = async () => {
4 | const response = await fetch("api/categories");
5 | if (!response.ok) {
6 | throw new Error(`Failed to fetch categories: ${response.statusText}`);
7 | }
8 | const categories: Category[] = await response.json();
9 | return categories;
10 | };
11 |
12 | export const fetchVersions = async () => {
13 | const response = await fetch(`api/versions`);
14 | if (!response.ok) {
15 | throw new Error(`Failed to fetch versions: ${response.statusText}`);
16 | }
17 | return response.json();
18 | };
19 |
--------------------------------------------------------------------------------
/docs/misc/alpine-install.func/ALPINE_INSTALL_FUNC_FLOWCHART.md:
--------------------------------------------------------------------------------
1 | # alpine-install.func Flowchart
2 |
3 | Alpine container initialization flow (apk-based, OpenRC init system).
4 |
5 | ## Alpine Container Setup Flow
6 |
7 | ```
8 | Alpine Container Started
9 | ↓
10 | setting_up_container()
11 | ↓
12 | verb_ip6() [optional - IPv6]
13 | ↓
14 | update_os() [apk update/upgrade]
15 | ↓
16 | network_check()
17 | ↓
18 | Application Installation
19 | ↓
20 | motd_ssh()
21 | ↓
22 | customize()
23 | ↓
24 | cleanup_lxc()
25 | ↓
26 | Complete ✓
27 | ```
28 |
29 | **Last Updated**: December 2025
30 |
--------------------------------------------------------------------------------
/tools/headers/core-restore-from-backup:
--------------------------------------------------------------------------------
1 | __ __ ___ _ __ __ ______
2 | / / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_ / ____/___ ________
3 | / /_/ / __ \/ __ `__ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/ / / / __ \/ ___/ _ \
4 | / __ / /_/ / / / / / / __/ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_ / /___/ /_/ / / / __/
5 | /_/ /_/\____/_/ /_/ /_/\___/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ \____/\____/_/ \___/
6 |
7 |
--------------------------------------------------------------------------------
/tools/headers/qbittorrent-exporter:
--------------------------------------------------------------------------------
1 | __ _ __ __ __ __
2 | ____ _/ /_ (_) /_/ /_____ _____________ ____ / /_ ___ _ ______ ____ _____/ /____ _____
3 | / __ `/ __ \/ / __/ __/ __ \/ ___/ ___/ _ \/ __ \/ __/_____/ _ \| |/_/ __ \/ __ \/ ___/ __/ _ \/ ___/
4 | / /_/ / /_/ / / /_/ /_/ /_/ / / / / / __/ / / / /_/_____/ __/> /_/ / /_/ / / / /_/ __/ /
5 | \__, /_.___/_/\__/\__/\____/_/ /_/ \___/_/ /_/\__/ \___/_/|_/ .___/\____/_/ \__/\___/_/
6 | /_/ /_/
7 |
--------------------------------------------------------------------------------
/tools/headers/filebrowser-quantum:
--------------------------------------------------------------------------------
1 | _______ __ ____ ____ __
2 | / ____(_) /__ / __ )_________ _ __________ _____ / __ \__ ______ _____ / /___ ______ ___
3 | / /_ / / / _ \/ __ / ___/ __ \ | /| / / ___/ _ \/ ___/ / / / / / / / __ `/ __ \/ __/ / / / __ `__ \
4 | / __/ / / / __/ /_/ / / / /_/ / |/ |/ (__ ) __/ / / /_/ / /_/ / /_/ / / / / /_/ /_/ / / / / / /
5 | /_/ /_/_/\___/_____/_/ \____/|__/|__/____/\___/_/ \___\_\__,_/\__,_/_/ /_/\__/\__,_/_/ /_/ /_/
6 |
7 |
--------------------------------------------------------------------------------
/frontend/src/hooks/useVersions.ts:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { fetchVersions } from "@/lib/data";
4 | import { AppVersion } from "@/lib/types";
5 | import { useQuery } from "@tanstack/react-query";
6 |
7 | export function useVersions() {
8 | return useQuery({
9 | queryKey: ["versions"],
10 | queryFn: async () => {
11 | const fetchedVersions = await fetchVersions();
12 | if (Array.isArray(fetchedVersions)) {
13 | return fetchedVersions;
14 | }
15 | if (fetchedVersions && typeof fetchedVersions === "object") {
16 | return [fetchedVersions];
17 | }
18 | return [];
19 | },
20 | });
21 | }
22 |
--------------------------------------------------------------------------------
/docs/misc/cloud-init.func/CLOUD_INIT_FUNC_FUNCTIONS_REFERENCE.md:
--------------------------------------------------------------------------------
1 | # cloud-init.func Functions Reference
2 |
3 | Cloud-init and VM provisioning functions.
4 |
5 | ## Core Functions
6 |
7 | ### generate_cloud_init()
8 | Generate cloud-init configuration.
9 |
10 | ### generate_user_data()
11 | Generate user-data script for VM.
12 |
13 | ### apply_cloud_init()
14 | Apply cloud-init to VM.
15 |
16 | ### setup_ssh_keys()
17 | Deploy SSH public keys.
18 |
19 | ### setup_static_ip()
20 | Configure static IP on VM.
21 |
22 | ### setup_dns()
23 | Configure DNS for VM.
24 |
25 | ### setup_ipv6()
26 | Enable IPv6 on VM.
27 |
28 | ---
29 |
30 | **Last Updated**: December 2025
31 |
--------------------------------------------------------------------------------
/ct/headers/transmission-openvpn:
--------------------------------------------------------------------------------
1 | __ _ _
2 | / /__________ _____ _________ ___ (_)_________(_)___ ____ ____ ____ ___ ____ _ ______ ____
3 | / __/ ___/ __ `/ __ \/ ___/ __ `__ \/ / ___/ ___/ / __ \/ __ \______/ __ \/ __ \/ _ \/ __ \ | / / __ \/ __ \
4 | / /_/ / / /_/ / / / (__ ) / / / / / (__ |__ ) / /_/ / / / /_____/ /_/ / /_/ / __/ / / / |/ / /_/ / / / /
5 | \__/_/ \__,_/_/ /_/____/_/ /_/ /_/_/____/____/_/\____/_/ /_/ \____/ .___/\___/_/ /_/|___/ .___/_/ /_/
6 | /_/ /_/
7 |
--------------------------------------------------------------------------------
/frontend/src/app/sitemap.ts:
--------------------------------------------------------------------------------
1 | import { basePath } from "@/config/siteConfig";
2 | import type { MetadataRoute } from "next";
3 |
4 | export const dynamic = "force-static";
5 |
6 | export default async function sitemap(): Promise {
7 | let domain = "community-scripts.github.io";
8 | let protocol = "https";
9 | return [
10 | {
11 | url: `${protocol}://${domain}/${basePath}`,
12 | lastModified: new Date(),
13 | },
14 | {
15 | url: `${protocol}://${domain}/${basePath}/scripts`,
16 | lastModified: new Date(),
17 | },
18 | {
19 | url: `${protocol}://${domain}/${basePath}/json-editor`,
20 | lastModified: new Date(),
21 | }
22 | ];
23 | }
24 |
--------------------------------------------------------------------------------
/install/alpine-ntfy-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: cobalt (cobaltgit)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://ntfy.sh/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Installing ntfy"
17 | $STD apk add --no-cache ntfy ntfy-openrc libcap
18 | sed -i '/^listen-http/s/^\(.*\)$/#\1\n/' /etc/ntfy/server.yml
19 | setcap 'cap_net_bind_service=+ep' /usr/bin/ntfy
20 | $STD rc-update add ntfy default
21 | $STD service ntfy start
22 | msg_ok "Installed ntfy"
23 |
24 | motd_ssh
25 | customize
26 |
27 |
--------------------------------------------------------------------------------
/tools/headers/pve-privilege-converter:
--------------------------------------------------------------------------------
1 | ____ _ ________ ____ _ _ __ ______ __
2 | / __ \ | / / ____/ / __ \_____(_) __(_) /__ ____ ____ / ____/___ ____ _ _____ _____/ /____ _____
3 | / /_/ / | / / __/______/ /_/ / ___/ / | / / / / _ \/ __ `/ _ \______/ / / __ \/ __ \ | / / _ \/ ___/ __/ _ \/ ___/
4 | / ____/| |/ / /__/_____/ ____/ / / /| |/ / / / __/ /_/ / __/_____/ /___/ /_/ / / / / |/ / __/ / / /_/ __/ /
5 | /_/ |___/_____/ /_/ /_/ /_/ |___/_/_/\___/\__, /\___/ \____/\____/_/ /_/|___/\___/_/ \__/\___/_/
6 | /____/
7 |
--------------------------------------------------------------------------------
/api/go.mod:
--------------------------------------------------------------------------------
1 | module proxmox-api
2 |
3 | go 1.24.0
4 |
5 | require (
6 | github.com/gorilla/mux v1.8.1
7 | github.com/joho/godotenv v1.5.1
8 | github.com/rs/cors v1.11.1
9 | go.mongodb.org/mongo-driver v1.17.2
10 | )
11 |
12 | require (
13 | github.com/golang/snappy v0.0.4 // indirect
14 | github.com/klauspost/compress v1.16.7 // indirect
15 | github.com/montanaflynn/stats v0.7.1 // indirect
16 | github.com/xdg-go/pbkdf2 v1.0.0 // indirect
17 | github.com/xdg-go/scram v1.1.2 // indirect
18 | github.com/xdg-go/stringprep v1.0.4 // indirect
19 | github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
20 | golang.org/x/crypto v0.45.0 // indirect
21 | golang.org/x/sync v0.18.0 // indirect
22 | golang.org/x/text v0.31.0 // indirect
23 | )
24 |
--------------------------------------------------------------------------------
/frontend/src/app/not-found.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { Button } from "@/components/ui/button";
3 |
4 | export default function NotFoundPage() {
5 | return (
6 |
7 |
8 |
9 | 404
10 |
11 |
12 | Oops, the page you are looking for could not be found.
13 |
14 |
15 |
18 |
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/docs/misc/alpine-install.func/ALPINE_INSTALL_FUNC_FUNCTIONS_REFERENCE.md:
--------------------------------------------------------------------------------
1 | # alpine-install.func Functions Reference
2 |
3 | Alpine Linux-specific installation functions (apk-based, OpenRC).
4 |
5 | ## Core Functions
6 |
7 | ### setting_up_container()
8 | Initialize Alpine container setup.
9 |
10 | ### update_os()
11 | Update Alpine packages via `apk update && apk upgrade`.
12 |
13 | ### verb_ip6()
14 | Enable IPv6 on Alpine with persistent configuration.
15 |
16 | ### network_check()
17 | Verify network connectivity in Alpine.
18 |
19 | ### motd_ssh()
20 | Configure SSH daemon and MOTD on Alpine.
21 |
22 | ### customize()
23 | Apply Alpine-specific customizations.
24 |
25 | ### cleanup_lxc()
26 | Final cleanup (Alpine-specific).
27 |
28 | ---
29 |
30 | **Last Updated**: December 2025
31 |
--------------------------------------------------------------------------------
/tools/headers/container-restore-from-backup:
--------------------------------------------------------------------------------
1 | __ __ ___ _ __ __ ______ __ _
2 | / / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_ / ____/___ ____ / /_____ _(_)___ ___ _____
3 | / /_/ / __ \/ __ `__ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/ / / / __ \/ __ \/ __/ __ `/ / __ \/ _ \/ ___/
4 | / __ / /_/ / / / / / / __/ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_ / /___/ /_/ / / / / /_/ /_/ / / / / / __/ /
5 | /_/ /_/\____/_/ /_/ /_/\___/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ \____/\____/_/ /_/\__/\__,_/_/_/ /_/\___/_/
6 |
7 |
--------------------------------------------------------------------------------
/docs/misc/alpine-tools.func/ALPINE_TOOLS_FUNC_FUNCTIONS_REFERENCE.md:
--------------------------------------------------------------------------------
1 | # alpine-tools.func Functions Reference
2 |
3 | Alpine-specific tool installation functions.
4 |
5 | ## Core Functions
6 |
7 | ### apk_update()
8 | Update Alpine package lists.
9 |
10 | ### apk_add(PACKAGES)
11 | Install Alpine packages.
12 |
13 | ### apk_del(PACKAGES)
14 | Remove Alpine packages.
15 |
16 | ### add_community_repo()
17 | Enable Alpine community repository.
18 |
19 | ### add_testing_repo()
20 | Enable Alpine testing repository.
21 |
22 | ### Alpine Tool Functions
23 | - `setup_nodejs()` - Alpine Node.js
24 | - `setup_php()` - Alpine PHP
25 | - `setup_mariadb()` - Alpine MariaDB
26 | - `setup_postgresql()` - Alpine PostgreSQL
27 | - (+ more Alpine-specific setups)
28 |
29 | ---
30 |
31 | **Last Updated**: December 2025
32 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/textarea.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | const Textarea = React.forwardRef<
6 | HTMLTextAreaElement,
7 | React.ComponentProps<"textarea">
8 | >(({ className, ...props }, ref) => {
9 | return (
10 |
18 | )
19 | })
20 | Textarea.displayName = "Textarea"
21 |
22 | export { Textarea }
23 |
--------------------------------------------------------------------------------
/install/debian-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source:
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Installing Base Dependencies"
17 | $STD apt-get install -y curl wget ca-certificates
18 | msg_ok "Installed Base Dependencies"
19 |
20 | # msg_info "Downloading and executing tools.func test suite"
21 | # bash <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/test-tools-func.sh)
22 | # msg_ok "Test suite completed"
23 |
24 | motd_ssh
25 | customize
26 | cleanup_lxc
27 |
--------------------------------------------------------------------------------
/.github/workflows/scripts/update_json_date.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Verzeichnis, das die JSON-Dateien enthält
4 | json_dir="./json/*.json"
5 |
6 | current_date=$(date +"%Y-%m-%d")
7 |
8 | for json_file in $json_dir; do
9 | if [[ -f "$json_file" ]]; then
10 | current_json_date=$(jq -r '.date_created' "$json_file")
11 |
12 | if [[ "$current_json_date" != "$current_date" ]]; then
13 | echo "Updating $json_file with date $current_date"
14 | jq --arg date "$current_date" '.date_created = $date' "$json_file" > temp.json && mv temp.json "$json_file"
15 |
16 | git add "$json_file"
17 | git commit -m "Update date_created to $current_date in $json_file"
18 | else
19 | echo "Date in $json_file is already up to date."
20 | fi
21 | fi
22 | done
23 | git push origin HEAD
24 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/label.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as LabelPrimitive from "@radix-ui/react-label"
5 | import { cva, type VariantProps } from "class-variance-authority"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const labelVariants = cva(
10 | "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
11 | )
12 |
13 | const Label = React.forwardRef<
14 | React.ElementRef,
15 | React.ComponentPropsWithoutRef &
16 | VariantProps
17 | >(({ className, ...props }, ref) => (
18 |
23 | ))
24 | Label.displayName = LabelPrimitive.Root.displayName
25 |
26 | export { Label }
27 |
--------------------------------------------------------------------------------
/frontend/src/components/Modal.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import React from "react";
4 |
5 | interface ModalProps {
6 | isOpen: boolean;
7 | onClose: () => void;
8 | children: React.ReactNode;
9 | }
10 |
11 | const Modal: React.FC = ({ isOpen, onClose, children }) => {
12 | if (!isOpen) return null;
13 |
14 | return (
15 |
16 |
17 |
23 | {children}
24 |
25 |
26 | );
27 | };
28 |
29 | export default Modal;
30 |
--------------------------------------------------------------------------------
/frontend/src/components/TextCopyBlock.tsx:
--------------------------------------------------------------------------------
1 | import { ClipboardIcon } from "lucide-react";
2 | import handleCopy from "./handleCopy";
3 |
4 | export default function TextCopyBlock(description: string) {
5 | const pattern = /`([^`]*)`/g;
6 | const parts = description.split(pattern);
7 |
8 | const formattedDescription = parts.map((part: string, index: number) => {
9 | if (index % 2 === 1) {
10 | return (
11 |
15 | {part}
16 | handleCopy("command", part)}
19 | />
20 |
21 | );
22 | } else {
23 | return part;
24 | }
25 | });
26 |
27 | return formattedDescription;
28 | }
29 |
--------------------------------------------------------------------------------
/frontend/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "lib": [
4 | "dom",
5 | "dom.iterable",
6 | "esnext"
7 | ],
8 | "allowJs": true,
9 | "skipLibCheck": true,
10 | "strict": true,
11 | "noEmit": true,
12 | "esModuleInterop": true,
13 | "module": "esnext",
14 | "moduleResolution": "bundler",
15 | "resolveJsonModule": true,
16 | "isolatedModules": true,
17 | "jsx": "preserve",
18 | "incremental": true,
19 | "plugins": [
20 | {
21 | "name": "next"
22 | }
23 | ],
24 | "paths": {
25 | "@/*": [
26 | "./src/*"
27 | ]
28 | },
29 | "target": "ES2017"
30 | },
31 | "include": [
32 | "next-env.d.ts",
33 | "**/*.ts",
34 | "**/*.tsx",
35 | ".next/types/**/*.ts",
36 | "next.config.mjs"
37 | ],
38 | "exclude": [
39 | "node_modules"
40 | ]
41 | }
42 |
--------------------------------------------------------------------------------
/ct/deferred/maxun.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Maxun",
3 | "slug": "maxun",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "2025-07-02",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "config_path": "/opt/maxun/.env",
12 | "interface_port": 3000,
13 | "documentation": "https://maxun.io/",
14 | "website": "https://maxun.io/",
15 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/maxun.svg",
16 | "description": "Maxun is an open-source self-hosted application.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/maxun.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 1024,
24 | "hdd": 2,
25 | "os": "Debian",
26 | "version": "12"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": []
35 | }
--------------------------------------------------------------------------------
/frontend/src/app/manifest.ts:
--------------------------------------------------------------------------------
1 | import { basePath } from "@/config/siteConfig";
2 | import type { MetadataRoute } from "next";
3 |
4 | export const generateStaticParams = () => {
5 | return [];
6 | };
7 |
8 | export default function manifest(): MetadataRoute.Manifest {
9 | return {
10 | name: "Proxmox VE Helper-Scripts Development",
11 | short_name: "Proxmox VE Helper-Scripts Development",
12 | description:
13 | "A Re-designed Front-end for the Proxmox VE Helper-Scripts Repository. Featuring over 200+ scripts to help you manage your Proxmox VE environment.",
14 | theme_color: "#030712",
15 | background_color: "#030712",
16 | display: "standalone",
17 | orientation: "portrait",
18 | scope: `${basePath}`,
19 | start_url: `${basePath}`,
20 | icons: [
21 | {
22 | src: "logo.png",
23 | sizes: "512x512",
24 | type: "image/png",
25 | },
26 | ],
27 | };
28 | }
29 |
--------------------------------------------------------------------------------
/tools/addon/grafana-loki.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 tteck
4 | # Author: tteck (tteckster)
5 | # License: MIT
6 | # https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Installing Dependencies"
17 | $STD apt-get install -y gnupg2
18 | msg_ok "Installed Dependencies"
19 |
20 | msg_info "Setting up rclone"
21 | wget https://github.com/rclone/rclone/releases/download/v1.69.1/rclone-v1.69.1-linux-amd64.de
22 | dpkg -i rclone-v1.69.1-linux-amd64.deb
23 | rclone rcd --rc-web-gui --rc-web-gui-no-open-browser --rc-addr :3000 --rc-user admin --rc-pass 12345
24 | msg_ok "Set up Grafana"
25 |
26 | motd_ssh
27 | customize
28 |
29 | msg_info "Cleaning up"
30 | $STD apt-get -y autoremove
31 | $STD apt-get -y autoclean
32 | msg_ok "Cleaned"
33 |
--------------------------------------------------------------------------------
/ct/deferred/docspell.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Docspell",
3 | "slug": "docspell",
4 | "categories": [
5 | 12
6 | ],
7 | "date_created": "2025-07-02",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "config_path": "/opt/docspell/.env",
12 | "interface_port": 3000,
13 | "documentation": "https://docspell.io/",
14 | "website": "https://docspell.io/",
15 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/docspell.svg",
16 | "description": "Docspell is an open-source self-hosted application.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/docspell.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 1024,
24 | "hdd": 2,
25 | "os": "Debian",
26 | "version": "12"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": []
35 | }
--------------------------------------------------------------------------------
/frontend/src/components/ui/separator.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as SeparatorPrimitive from "@radix-ui/react-separator";
4 | import * as React from "react";
5 |
6 | import { cn } from "@/lib/utils";
7 |
8 | const Separator = React.forwardRef<
9 | React.ElementRef,
10 | React.ComponentPropsWithoutRef
11 | >(
12 | (
13 | { className, orientation = "horizontal", decorative = true, ...props },
14 | ref,
15 | ) => (
16 |
27 | ),
28 | );
29 | Separator.displayName = SeparatorPrimitive.Root.displayName;
30 |
31 | export { Separator };
32 |
--------------------------------------------------------------------------------
/.github/CONTRIBUTOR_AND_GUIDES/json/AppName.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AppName",
3 | "slug": "appname",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "DATE CREATED",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": DEFAULT-PORT,
12 | "documentation": null,
13 | "website": "LINK TO WEBSITE",
14 | "logo": "LINK TO LOGO",
15 | "description": "Description of the app",
16 | "install_methods": [
17 | {
18 | "type": "default",
19 | "script": "ct/AppName.sh",
20 | "resources": {
21 | "cpu": 2,
22 | "ram": 2048,
23 | "hdd": 4,
24 | "os": "debian",
25 | "version": "12"
26 | }
27 | }
28 | ],
29 | "default_credentials": {
30 | "username": null,
31 | "password": null
32 | },
33 | "notes": []
34 | }
--------------------------------------------------------------------------------
/frontend/src/components/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 |
3 | import { cn } from "@/lib/utils";
4 |
5 | export interface InputProps
6 | extends React.InputHTMLAttributes {}
7 |
8 | const Input = React.forwardRef(
9 | ({ className, type, ...props }, ref) => {
10 | return (
11 |
20 | );
21 | },
22 | );
23 | Input.displayName = "Input";
24 |
25 | export { Input };
26 |
--------------------------------------------------------------------------------
/frontend/src/app/scripts/_components/ScriptItems/InterFaces.tsx:
--------------------------------------------------------------------------------
1 | import handleCopy from "@/components/handleCopy";
2 | import { buttonVariants } from "@/components/ui/button";
3 | import { Script } from "@/lib/types";
4 | import { cn } from "@/lib/utils";
5 | import { ClipboardIcon } from "lucide-react";
6 |
7 | export default function InterFaces({ item }: { item: Script }) {
8 | return (
9 |
10 | {item.interface_port !== null ? (
11 |
12 |
Default Interface:
13 |
14 | {item.interface_port}
15 | handleCopy("default interface", String(item.interface_port))} className="size-4 cursor-pointer" />
16 |
17 |
18 | ) : null}
19 |
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/sonner.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useTheme } from "next-themes";
4 | import { Toaster as Sonner } from "sonner";
5 |
6 | type ToasterProps = React.ComponentProps;
7 |
8 | const Toaster = ({ ...props }: ToasterProps) => {
9 | const { theme = "system" } = useTheme();
10 |
11 | return (
12 |
28 | );
29 | };
30 |
31 | export { Toaster };
32 |
--------------------------------------------------------------------------------
/frontend/public/json/frigate.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Frigate",
3 | "slug": "frigate",
4 | "categories": [
5 | 15
6 | ],
7 | "date_created": "2025-07-02",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "config_path": "/opt/frigate/.env",
12 | "interface_port": 3000,
13 | "documentation": "https://frigate.io/",
14 | "website": "https://frigate.io/",
15 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/frigate-light.webp",
16 | "description": "Frigate is an open-source self-hosted application.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/frigate.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 1024,
24 | "hdd": 2,
25 | "os": "Debian",
26 | "version": "12"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/install/deferred/ocis-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source:
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Installing Dependencies"
17 | $STD apt-get install -y \
18 | build-essential \
19 | make \
20 | git
21 | msg_ok "Installed Dependencies"
22 |
23 | ## WIP - only protoype with git call
24 |
25 | setup_go
26 | NODE_VERSION="22" NODE_MODULE="pnpm" setup_nodejs
27 |
28 | msg_info "Setup ocis"
29 | cd /opt
30 | git clone https://github.com/owncloud/ocis
31 | cd /opt/ocis
32 | make generate
33 | make -C ocis build
34 | #./ocis/bin/ocis init
35 | #IDM_CREATE_DEMO_USERS=true ./ocis/bin/ocis server
36 | msg_ok "Setup ocis"
37 |
38 | motd_ssh
39 | customize
40 |
41 | msg_info "Cleaning up"
42 | $STD apt-get -y autoremove
43 | $STD apt-get -y autoclean
44 | msg_ok "Cleaned"
45 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/animated-gradient-text.tsx:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 |
3 | import { cn } from "@/lib/utils";
4 |
5 | export default function AnimatedGradientText({
6 | children,
7 | className,
8 | }: {
9 | children: ReactNode;
10 | className?: string;
11 | }) {
12 | return (
13 |
19 |
22 |
23 | {children}
24 |
25 | );
26 | }
27 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "files.associations": {
3 | "*.func": "shellscript"
4 | },
5 | "files.eol": "\n",
6 | "files.encoding": "utf8",
7 | "files.trimTrailingWhitespace": true,
8 | "files.insertFinalNewline": true,
9 | "files.autoSave": "afterDelay",
10 | "files.autoGuessEncoding": false,
11 | "editor.detectIndentation": false,
12 | "editor.tabSize": 4,
13 | "editor.insertSpaces": true,
14 | "editor.wordWrap": "off",
15 | "editor.renderWhitespace": "boundary",
16 | "editor.formatOnSave": true,
17 | "editor.formatOnPaste": true,
18 | "editor.minimap.enabled": false,
19 | "terminal.integrated.scrollback": 10000,
20 | "[shellscript]": {
21 | "editor.defaultFormatter": "foxundermoon.shell-format",
22 | "editor.tabSize": 4,
23 | "editor.insertSpaces": true,
24 | },
25 | "shellcheck.customArgs": [
26 | "--rcfile",
27 | ".vscode/.shellcheckrc"
28 | ],
29 | "git.autofetch": true,
30 | "git.confirmSync": false,
31 | "git.enableSmartCommit": true,
32 | "extensions.ignoreRecommendations": false
33 | }
34 |
--------------------------------------------------------------------------------
/frontend/public/json/byparr.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Byparr",
3 | "slug": "byparr",
4 | "categories": [
5 | 14
6 | ],
7 | "date_created": "2025-12-02",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": 8191,
12 | "documentation": "https://github.com/ThePhaseless/Byparr/blob/master/README.md",
13 | "website": "https://github.com/ThePhaseless/Byparr",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/byparr.webp",
15 | "config_path": "",
16 | "description": "Byparr is a proxy server to bypass Cloudflare and DDoS-GUARD protection.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/byparr.sh",
21 | "resources": {
22 | "cpu": 2,
23 | "ram": 2048,
24 | "hdd": 4,
25 | "os": "debian",
26 | "version": "13"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/frontend/public/json/ubuntu.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Ubuntu",
3 | "slug": "ubuntu",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "2025-12-04",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://help.ubuntu.com/",
13 | "website": "https://ubuntu.com/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/ubuntu.webp",
15 | "config_path": "",
16 | "description": "Ubuntu is a popular Linux distribution based on Debian. Known for its ease of use and regular release cycle with LTS versions.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/ubuntu.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 512,
24 | "hdd": 4,
25 | "os": "ubuntu",
26 | "version": "24.04"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "root",
32 | "password": null
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/frontend/public/json/nextexplorer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nextExplorer",
3 | "slug": "nextexplorer",
4 | "categories": [
5 | 11,
6 | 12
7 | ],
8 | "date_created": "2025-12-11",
9 | "type": "ct",
10 | "updateable": true,
11 | "privileged": false,
12 | "interface_port": 3000,
13 | "documentation": "https://explorer.nxz.ai",
14 | "website": "https://github.com/vikramsoni2/nextExplorer",
15 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nextexplorer.webp",
16 | "config_path": "/etc/nextExplorer/.env",
17 | "description": "",
18 | "install_methods": [
19 | {
20 | "type": "default",
21 | "script": "ct/nextexplorer.sh",
22 | "resources": {
23 | "cpu": 2,
24 | "ram": 3072,
25 | "hdd": 8,
26 | "os": "Debian",
27 | "version": "13"
28 | }
29 | }
30 | ],
31 | "notes": [
32 | {
33 | "text": "Bind mount your volume(s) in the `/mnt` directory",
34 | "type": "info"
35 | }
36 | ]
37 | }
38 |
--------------------------------------------------------------------------------
/frontend/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Bram Suurd
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/frontend/public/json/almalinux.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AlmaLinux",
3 | "slug": "almalinux",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "2025-12-04",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://wiki.almalinux.org/",
13 | "website": "https://almalinux.org/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/almalinux.webp",
15 | "config_path": "",
16 | "description": "AlmaLinux is an open-source, community-driven Linux distribution, 1:1 binary compatible with RHEL. A free alternative to CentOS.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/almalinux.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 512,
24 | "hdd": 4,
25 | "os": "almalinux",
26 | "version": "10"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "root",
32 | "password": null
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/frontend/public/json/debian.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Debian",
3 | "slug": "debian",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "2025-12-04",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://www.debian.org/doc/",
13 | "website": "https://www.debian.org/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/debian.webp",
15 | "config_path": "",
16 | "description": "Debian is a free operating system (OS) that comes with over 59000 packages. It's known for its stability, security, and extensive software repository.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/debian.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 512,
24 | "hdd": 4,
25 | "os": "debian",
26 | "version": "13"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "root",
32 | "password": null
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/frontend/public/json/fedora.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Fedora",
3 | "slug": "fedora",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "2025-12-04",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://docs.fedoraproject.org/",
13 | "website": "https://fedoraproject.org/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/fedora.webp",
15 | "config_path": "",
16 | "description": "Fedora is a cutting-edge Linux distribution sponsored by Red Hat. It features the latest software and technologies while maintaining stability.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/fedora.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 512,
24 | "hdd": 4,
25 | "os": "fedora",
26 | "version": "42"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "root",
32 | "password": null
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/frontend/public/json/opensuse.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "openSUSE",
3 | "slug": "opensuse",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "2025-12-04",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://doc.opensuse.org/",
13 | "website": "https://www.opensuse.org/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/opensuse.webp",
15 | "config_path": "",
16 | "description": "openSUSE is a stable, easy-to-use, and complete Linux distribution. Known for its YaST configuration tool and zypper package manager.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/opensuse.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 512,
24 | "hdd": 4,
25 | "os": "opensuse",
26 | "version": "15.6"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "root",
32 | "password": null
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021-2025 tteck | community-scripts ORG
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/frontend/public/json/openeuler.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "openEuler",
3 | "slug": "openeuler",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "2025-12-04",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://docs.openeuler.org/",
13 | "website": "https://www.openeuler.org/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/openeuler.webp",
15 | "config_path": "",
16 | "description": "openEuler is an open-source Linux distribution from Huawei. It's designed for servers and cloud computing with enterprise-grade features.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/openeuler.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 512,
24 | "hdd": 4,
25 | "os": "openeuler",
26 | "version": "25.03"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "root",
32 | "password": null
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/frontend/public/json/rockylinux.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Rocky Linux",
3 | "slug": "rockylinux",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "2025-12-04",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://docs.rockylinux.org/",
13 | "website": "https://rockylinux.org/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/rocky-linux.webp",
15 | "config_path": "",
16 | "description": "Rocky Linux is an enterprise-grade Linux distribution designed to be 100% bug-for-bug compatible with Red Hat Enterprise Linux (RHEL).",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/rockylinux.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 512,
24 | "hdd": 4,
25 | "os": "rockylinux",
26 | "version": "10"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "root",
32 | "password": null
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/new-script.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | name: 🛠️ New Script
3 | description: New Script proposal.
4 | labels: [task]
5 | body:
6 | - type: markdown
7 | attributes:
8 | value: |
9 | # 🛠️ **New Script**
10 | Create an Issue when you want to merge a new Script. The name of the Issue must be the same as your APP.sh file. (Example: SnipeIT, snipeit.sh; Alpine-Docker, alpine-docker.sh)
11 | - type: input
12 | id: task_summary
13 | attributes:
14 | label: Name of the Script
15 | placeholder: e.g., SnipeIT
16 | validations:
17 | required: true
18 | - type: dropdown
19 | id: script_type
20 | attributes:
21 | label: Script Type
22 | description: What type of script is this?
23 | options:
24 | - CT (LXC Container)
25 | - VM (Virtual Machine)
26 | - Addon (tools/addon)
27 | - PVE Tool (tools/pve)
28 | validations:
29 | required: true
30 | - type: textarea
31 | id: task_details
32 | attributes:
33 | label: 📋 Script Details
34 | placeholder: Explain what is needed or special about this script
35 | validations:
36 | required: true
37 |
--------------------------------------------------------------------------------
/frontend/public/json/alpine.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Alpine Linux",
3 | "slug": "alpine",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "2025-12-04",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://wiki.alpinelinux.org/",
13 | "website": "https://alpinelinux.org/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/alpine-linux.webp",
15 | "config_path": "",
16 | "description": "Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox. Perfect for containers due to its minimal footprint.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/alpine.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 512,
24 | "hdd": 1,
25 | "os": "alpine",
26 | "version": "3.22"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "root",
32 | "password": null
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/ct/fedora.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://fedoraproject.org/
7 |
8 | APP="Fedora"
9 | var_tags="${var_tags:-os}"
10 | var_cpu="${var_cpu:-1}"
11 | var_ram="${var_ram:-512}"
12 | var_disk="${var_disk:-4}"
13 | var_os="${var_os:-fedora}"
14 | var_version="${var_version:-42}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /var ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD dnf -y upgrade
32 | msg_ok "Updated $APP LXC"
33 | exit
34 | }
35 |
36 | start
37 | build_container
38 | description
39 |
40 | msg_ok "Completed Successfully!"
41 | msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
42 |
--------------------------------------------------------------------------------
/frontend/public/json/rybbit.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Rybbit",
3 | "slug": "rybbit",
4 | "categories": [
5 | 9
6 | ],
7 | "date_created": "2025-01-15",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": 3000,
12 | "documentation": "https://github.com/rybbit-io/rybbit",
13 | "website": "https://github.com/rybbit-io/rybbit",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/rybbit-light.webp",
15 | "config_path": "/opt/rybbit",
16 | "description": "Rybbit is a privacy-focused, open-source web analytics platform. Track your website visitors without compromising their privacy or using cookies.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/rybbit.sh",
21 | "resources": {
22 | "cpu": 2,
23 | "ram": 2048,
24 | "hdd": 5,
25 | "os": "debian",
26 | "version": "13"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/ct/almalinux.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://almalinux.org/
7 |
8 | APP="AlmaLinux"
9 | var_tags="${var_tags:-os}"
10 | var_cpu="${var_cpu:-1}"
11 | var_ram="${var_ram:-512}"
12 | var_disk="${var_disk:-4}"
13 | var_os="${var_os:-almalinux}"
14 | var_version="${var_version:-10}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /var ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD dnf -y upgrade
32 | msg_ok "Updated $APP LXC"
33 | exit
34 | }
35 |
36 | start
37 | build_container
38 | description
39 |
40 | msg_ok "Completed Successfully!"
41 | msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
42 |
--------------------------------------------------------------------------------
/ct/opensuse.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://www.opensuse.org/
7 |
8 | APP="openSUSE"
9 | var_tags="${var_tags:-os}"
10 | var_cpu="${var_cpu:-1}"
11 | var_ram="${var_ram:-512}"
12 | var_disk="${var_disk:-4}"
13 | var_os="${var_os:-opensuse}"
14 | var_version="${var_version:-15.6}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /var ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD zypper -n update
32 | msg_ok "Updated $APP LXC"
33 | exit
34 | }
35 |
36 | start
37 | build_container
38 | description
39 |
40 | msg_ok "Completed Successfully!"
41 | msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
42 |
--------------------------------------------------------------------------------
/ct/rockylinux.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://rockylinux.org/
7 |
8 | APP="Rocky Linux"
9 | var_tags="${var_tags:-os}"
10 | var_cpu="${var_cpu:-1}"
11 | var_ram="${var_ram:-512}"
12 | var_disk="${var_disk:-4}"
13 | var_os="${var_os:-rockylinux}"
14 | var_version="${var_version:-10}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /var ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD dnf -y upgrade
32 | msg_ok "Updated $APP LXC"
33 | exit
34 | }
35 |
36 | start
37 | build_container
38 | description
39 |
40 | msg_ok "Completed Successfully!"
41 | msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
42 |
--------------------------------------------------------------------------------
/ct/openeuler.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://www.openeuler.org/
7 |
8 | APP="openEuler"
9 | var_tags="${var_tags:-os}"
10 | var_cpu="${var_cpu:-1}"
11 | var_ram="${var_ram:-512}"
12 | var_disk="${var_disk:-4}"
13 | var_os="${var_os:-openeuler}"
14 | var_version="${var_version:-25.03}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /var ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD dnf -y upgrade
32 | msg_ok "Updated $APP LXC"
33 | exit
34 | }
35 |
36 | start
37 | build_container
38 | description
39 |
40 | msg_ok "Completed Successfully!"
41 | msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
42 |
--------------------------------------------------------------------------------
/ct/centos.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://www.centos.org/centos-stream/
7 |
8 | APP="CentOS Stream"
9 | var_tags="${var_tags:-os}"
10 | var_cpu="${var_cpu:-1}"
11 | var_ram="${var_ram:-512}"
12 | var_disk="${var_disk:-4}"
13 | var_os="${var_os:-centos}"
14 | var_version="${var_version:-9}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /var ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD dnf -y upgrade
32 | msg_ok "Updated $APP LXC"
33 | exit
34 | }
35 |
36 | start
37 | build_container
38 | description
39 |
40 | msg_ok "Completed Successfully!"
41 | msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
42 |
--------------------------------------------------------------------------------
/frontend/public/json/romm.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "RomM",
3 | "slug": "romm",
4 | "categories": [
5 | 24
6 | ],
7 | "date_created": "2025-03-10",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": 8080,
12 | "documentation": "https://docs.romm.app/latest/",
13 | "website": "https://romm.app/",
14 | "config_path": "/opt",
15 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/romm.webp",
16 | "description": "RomM (ROM Manager) allows you to scan, enrich, browse and play your game collection with a clean and responsive interface. Support for multiple platforms, various naming schemes, and custom tags.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/romm.sh",
21 | "resources": {
22 | "cpu": 2,
23 | "ram": 4096,
24 | "hdd": 20,
25 | "os": "ubuntu",
26 | "version": "24.04"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "romm",
32 | "password": "changeme"
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/install/byparr-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: luismco
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source: https://github.com/ThePhaseless/Byparr
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Installing Dependencies"
17 | $STD apt -y install \
18 | xauth \
19 | xvfb \
20 | scrot \
21 | chromium \
22 | chromium-driver \
23 | ca-certificates
24 | msg_ok "Installed Dependencies"
25 |
26 | fetch_and_deploy_gh_release "Byparr" "ThePhaseless/Byparr"
27 | setup_uv
28 |
29 | msg_info "Creating Service"
30 | cat </etc/systemd/system/byparr.service
31 | [Unit]
32 | Description=Byparr
33 | After=network.target
34 |
35 | [Service]
36 | Type=simple
37 | WorkingDirectory=/opt/Byparr
38 | ExecStart=/usr/local/bin/uv run python3 main.py
39 | Restart=on-failure
40 | RestartSec=10
41 |
42 | [Install]
43 | WantedBy=multi-user.target
44 | EOF
45 | systemctl enable -q --now byparr
46 | msg_ok "Created Service"
47 |
48 | motd_ssh
49 | customize
50 | cleanup_lxc
51 |
--------------------------------------------------------------------------------
/ct/devuan.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://www.devuan.org/
7 |
8 | APP="Devuan"
9 | var_tags="${var_tags:-os}"
10 | var_cpu="${var_cpu:-1}"
11 | var_ram="${var_ram:-512}"
12 | var_disk="${var_disk:-4}"
13 | var_os="${var_os:-devuan}"
14 | var_version="${var_version:-5.0}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /var ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD apt-get update
32 | $STD apt-get -y upgrade
33 | msg_ok "Updated $APP LXC"
34 | exit
35 | }
36 |
37 | start
38 | build_container
39 | description
40 |
41 | msg_ok "Completed Successfully!"
42 | msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
43 |
--------------------------------------------------------------------------------
/.github/workflows/delete-discord-thread.yml:
--------------------------------------------------------------------------------
1 | name: Delete Discord Thread on GitHub Issue Closure
2 |
3 | on:
4 | issues:
5 | types:
6 | - closed
7 |
8 | jobs:
9 | close_discord_thread:
10 | if: github.repository == 'community-scripts/ProxmoxVED'
11 | runs-on: ubuntu-latest
12 | env:
13 | ISSUE_TITLE: ${{ github.event.issue.title }}
14 |
15 | steps:
16 | - name: Get thread-ID op and close thread
17 | run: |
18 | THREAD_ID=$(curl -s -X GET "https://discord.com/api/v10/guilds/${{ secrets.DISCORD_GUILD_ID }}/threads/active" \
19 | -H "Authorization: Bot ${{ secrets.DISCORD_BOT_TOKEN }}" \
20 | -H "Content-Type: application/json" | \
21 | jq -r --arg TITLE "$ISSUE_TITLE" '.threads[] | select(.parent_id == "${{ secrets.DISCORD_CHANNEL_ID }}" and .name == ("Wanted Tester for " + $TITLE)) | .id')
22 |
23 | if [ -n "$THREAD_ID" ]; then
24 | echo "Thread found: $THREAD_ID. Archiving..."
25 | curl -X DELETE "https://discord.com/api/v10/channels/$THREAD_ID" \
26 | -H "Authorization: Bot ${{ secrets.DISCORD_BOT_TOKEN }}"
27 | else
28 | echo "No thread found for issue: $ISSUE_TITLE"
29 | fi
30 |
--------------------------------------------------------------------------------
/ct/rybbit.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://github.com/rybbit-io/rybbit
7 |
8 | APP="Rybbit"
9 | var_tags="${var_tags:-analytics}"
10 | var_cpu="${var_cpu:-2}"
11 | var_ram="${var_ram:-2048}"
12 | var_disk="${var_disk:-5}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-13}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /var ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD apt-get update
32 | $STD apt-get -y upgrade
33 | msg_ok "Updated $APP LXC"
34 | exit
35 | }
36 |
37 | start
38 | build_container
39 | description
40 |
41 | msg_ok "Completed Successfully!"
42 | msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
43 |
--------------------------------------------------------------------------------
/ct/gentoo.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://www.gentoo.org/
7 |
8 | APP="Gentoo"
9 | var_tags="${var_tags:-os}"
10 | var_cpu="${var_cpu:-2}"
11 | var_ram="${var_ram:-1024}"
12 | var_disk="${var_disk:-8}"
13 | var_os="${var_os:-gentoo}"
14 | var_version="${var_version:-current}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /var ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD emerge --sync
32 | $STD emerge --quiet --update --deep @world
33 | msg_ok "Updated $APP LXC"
34 | exit
35 | }
36 |
37 | start
38 | build_container
39 | description
40 |
41 | msg_ok "Completed Successfully!"
42 | msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
43 |
--------------------------------------------------------------------------------
/ct/ente.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://www.debian.org/
7 |
8 | APP="Ente"
9 | var_tags="${var_tags:-photos}"
10 | var_cpu="${var_cpu:-4}"
11 | var_ram="${var_ram:-4096}"
12 | var_disk="${var_disk:-10}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-12}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /var ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD apt-get update
32 | $STD apt-get -y upgrade
33 | msg_ok "Updated $APP LXC"
34 | exit
35 | }
36 |
37 | start
38 | build_container
39 | description
40 |
41 | msg_ok "Completed Successfully!"
42 | msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
43 |
--------------------------------------------------------------------------------
/ct/alpine.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 tteck
4 | # Author: tteck (tteckster)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://alpinelinux.org/
7 |
8 | APP="Alpine"
9 | var_tags="${var_tags:-os;alpine}"
10 | var_cpu="${var_cpu:-4}"
11 | var_ram="${var_ram:-4096}"
12 | var_disk="${var_disk:-5}"
13 | var_os="${var_os:-alpine}"
14 | var_version="${var_version:-3.22}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | #check_container_storage
25 | #check_container_resources
26 | UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 1 \
27 | "1" "Check for Alpine Updates" ON \
28 | 3>&1 1>&2 2>&3)
29 |
30 | header_info
31 | if [ "$UPD" == "1" ]; then
32 | apk update && apk upgrade
33 | exit
34 | fi
35 | }
36 |
37 | start
38 | build_container
39 | description
40 |
41 | msg_ok "Completed Successfully!\n"
42 |
--------------------------------------------------------------------------------
/ct/deferred/polaris.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://github.com/agersant/polaris
7 |
8 | APP="Polaris"
9 | var_tags="${var_tags:-music}"
10 | var_cpu="${var_cpu:-3}"
11 | var_ram="${var_ram:-2048}"
12 | var_disk="${var_disk:-7}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-12}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 |
27 | if [[ ! -d /opt/polaris ]]; then
28 | msg_error "No Installation Found!"
29 | exit
30 | fi
31 | }
32 |
33 | start
34 | build_container
35 | description
36 |
37 | msg_ok "Completed Successfully!\n"
38 | echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
39 | echo -e "${INFO}${YW} Access it using the following URL:${CL}"
40 | echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5050${CL}"
41 |
--------------------------------------------------------------------------------
/frontend/src/components/icons/resource-icons.tsx:
--------------------------------------------------------------------------------
1 | export function CPUIcon() {
2 | return (
3 |
14 | );
15 | }
16 |
17 | export function RAMIcon() {
18 | return (
19 |
30 | );
31 | }
32 |
33 | export function HDDIcon() {
34 | return (
35 |
47 | );
48 | }
49 |
--------------------------------------------------------------------------------
/frontend/src/app/scripts/_components/ScriptItems/Alerts.tsx:
--------------------------------------------------------------------------------
1 | import TextCopyBlock from "@/components/TextCopyBlock";
2 | import { AlertColors } from "@/config/siteConfig";
3 | import { Script } from "@/lib/types";
4 | import { cn } from "@/lib/utils";
5 | import { AlertCircle, NotepadText } from "lucide-react";
6 |
7 | type NoteProps = {
8 | text: string;
9 | type: keyof typeof AlertColors;
10 | }
11 |
12 | export default function Alerts({ item }: { item: Script }) {
13 | return (
14 | <>
15 | {item?.notes?.length > 0 &&
16 | item.notes.map((note: NoteProps, index: number) => (
17 |
18 |
24 | {note.type == "info" ? (
25 |
26 | ) : (
27 |
28 | )}
29 | {TextCopyBlock(note.text)}
30 |
31 |
32 | ))}
33 | >
34 | );
35 | }
36 |
--------------------------------------------------------------------------------
/frontend/public/json/devuan.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Devuan",
3 | "slug": "devuan",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "2025-12-04",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://www.devuan.org/os/documentation",
13 | "website": "https://www.devuan.org/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/devuan.webp",
15 | "config_path": "",
16 | "description": "Devuan is a fork of Debian without systemd. It uses sysvinit and other alternative init systems, providing freedom of choice.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/devuan.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 512,
24 | "hdd": 4,
25 | "os": "devuan",
26 | "version": "5.0"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "root",
32 | "password": null
33 | },
34 | "notes": [
35 | {
36 | "text": "Devuan uses sysvinit instead of systemd.",
37 | "type": "info"
38 | }
39 | ]
40 | }
41 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/switch.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as SwitchPrimitives from "@radix-ui/react-switch"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Switch = React.forwardRef<
9 | React.ElementRef,
10 | React.ComponentPropsWithoutRef
11 | >(({ className, ...props }, ref) => (
12 |
20 |
25 |
26 | ))
27 | Switch.displayName = SwitchPrimitives.Root.displayName
28 |
29 | export { Switch }
30 |
--------------------------------------------------------------------------------
/ct/debian.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source:
7 |
8 | APP="Debian"
9 | var_tags="${var_tags:-}"
10 | var_cpu="${var_cpu:-4}"
11 | var_ram="${var_ram:-8192}"
12 | var_disk="${var_disk:-20}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-13}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 | var_gpu="${var_gpu:-yes}"
17 | #var_fuse="${var_fuse:-no}"
18 | #var_tun="${var_tun:-no}"
19 |
20 | header_info "$APP"
21 | variables
22 | color
23 | catch_errors
24 |
25 | function update_script() {
26 | header_info
27 | check_container_storage
28 | check_container_resources
29 | if [[ ! -d /var ]]; then
30 | msg_error "No ${APP} Installation Found!"
31 | exit
32 | fi
33 | msg_info "Updating $APP LXC"
34 | $STD apt update
35 | $STD apt upgrade -y
36 | msg_ok "Updated $APP LXC"
37 | cleanup_lxc
38 | exit
39 | }
40 |
41 | start
42 | build_container
43 | description
44 |
45 | msg_ok "Completed Successfully!"
46 | msg_custom "🚀" "${GN}" "${APP} setup has been successfully initialized!"
47 |
--------------------------------------------------------------------------------
/frontend/public/json/gentoo.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Gentoo",
3 | "slug": "gentoo",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "2025-12-04",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://wiki.gentoo.org/",
13 | "website": "https://www.gentoo.org/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/gentoo.webp",
15 | "config_path": "",
16 | "description": "Gentoo is a highly customizable source-based Linux distribution. Users compile software optimized for their specific hardware.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/gentoo.sh",
21 | "resources": {
22 | "cpu": 2,
23 | "ram": 1024,
24 | "hdd": 8,
25 | "os": "gentoo",
26 | "version": "current"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "root",
32 | "password": null
33 | },
34 | "notes": [
35 | {
36 | "text": "Gentoo compiles packages from source. Initial setup may take time.",
37 | "type": "warning"
38 | }
39 | ]
40 | }
41 |
--------------------------------------------------------------------------------
/.github/workflows/push-to-gitea.yml:
--------------------------------------------------------------------------------
1 | name: Sync to Gitea
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 |
8 | jobs:
9 | sync:
10 | if: github.repository == 'community-scripts/ProxmoxVED'
11 | runs-on: ubuntu-latest
12 |
13 | steps:
14 | - name: Checkout source repo
15 | uses: actions/checkout@v4
16 | with:
17 | fetch-depth: 0
18 | - name: Set Git identity for actions
19 | run: |
20 | git config --global user.name "Push From Github"
21 | git config --global user.email "actions@github.com"
22 | - name: Add Gitea remote
23 | run: git remote add gitea https://$GITEA_USER:$GITEA_TOKEN@git.community-scripts.org/community-scripts/ProxmoxVED.git
24 | env:
25 | GITEA_USER: ${{ secrets.GITEA_USERNAME }}
26 | GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
27 | - name: Pull Gitea changes
28 | run: |
29 | git fetch gitea
30 | git merge --strategy=ours gitea/main
31 | env:
32 | GITEA_USER: ${{ secrets.GITEA_USERNAME }}
33 | GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
34 |
35 | - name: Push to Gitea
36 | run: git push gitea main --force
37 | env:
38 | GITEA_USER: ${{ secrets.GITEA_USERNAME }}
39 | GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
40 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/tooltip.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as TooltipPrimitive from "@radix-ui/react-tooltip";
4 | import * as React from "react";
5 |
6 | import { cn } from "@/lib/utils";
7 |
8 | const TooltipProvider = TooltipPrimitive.Provider;
9 |
10 | const Tooltip = TooltipPrimitive.Root;
11 |
12 | const TooltipTrigger = TooltipPrimitive.Trigger;
13 |
14 | const TooltipContent = React.forwardRef<
15 | React.ElementRef,
16 | React.ComponentPropsWithoutRef
17 | >(({ className, sideOffset = 4, ...props }, ref) => (
18 |
27 | ));
28 | TooltipContent.displayName = TooltipPrimitive.Content.displayName;
29 |
30 | export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
31 |
--------------------------------------------------------------------------------
/frontend/public/json/allstarlink.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AllStarLink",
3 | "slug": "allstarlink-vm",
4 | "categories": [
5 | 24
6 | ],
7 | "date_created": "2025-05-05",
8 | "type": "vm",
9 | "updateable": false,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://allstarlink.github.io/",
13 | "website": "https://www.allstarlink.org/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/allstar-link.webp",
15 | "config_path": "",
16 | "description": "AllStarLink is a network of Amateur Radio repeaters, remote base stations and hot spots accessible to each other via Voice over Internet Protocol.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "vm/allstarlink-vm.sh",
21 | "resources": {
22 | "cpu": 2,
23 | "ram": 2048,
24 | "hdd": 8,
25 | "os": "debian",
26 | "version": "12"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": [
35 | {
36 | "text": "Options to Install Allmon3",
37 | "type": "info"
38 | }
39 | ]
40 | }
41 |
--------------------------------------------------------------------------------
/frontend/public/json/centos.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CentOS Stream",
3 | "slug": "centos",
4 | "categories": [
5 | 0
6 | ],
7 | "date_created": "2025-12-04",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://docs.centos.org/",
13 | "website": "https://www.centos.org/centos-stream/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/centos.webp",
15 | "config_path": "",
16 | "description": "CentOS Stream is a continuously delivered Linux distribution that tracks just ahead of RHEL development. The upstream for the next RHEL release.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/centos.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 512,
24 | "hdd": 4,
25 | "os": "centos",
26 | "version": "9"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "root",
32 | "password": null
33 | },
34 | "notes": [
35 | {
36 | "text": "CentOS Stream is the upstream development platform for RHEL.",
37 | "type": "info"
38 | }
39 | ]
40 | }
41 |
--------------------------------------------------------------------------------
/frontend/public/json/unifi-os-server-vm.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Unifi OS Server VM",
3 | "slug": "unifi-os-server-vm",
4 | "categories": [
5 | 2
6 | ],
7 | "date_created": "2025-12-02",
8 | "type": "vm",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": null,
12 | "documentation": "https://help.ui.com/hc/en-us",
13 | "website": "https://www.ui.com/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/ubiquiti-unifi.webp",
15 | "config_path": "",
16 | "description": "Unifi OS Server is the operating system that powers Ubiquiti's UniFi line of network devices. It provides a centralized platform for managing and monitoring UniFi access points, switches, and security gateways, offering features such as network configuration, device provisioning, and performance analytics.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "vm/unifi-os-server-vm.sh",
21 | "resources": {
22 | "cpu": 2,
23 | "ram": 4096,
24 | "hdd": 32,
25 | "os": null,
26 | "version": null
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": []
35 | }
36 |
--------------------------------------------------------------------------------
/frontend/public/json/petio.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Petio",
3 | "slug": "petio",
4 | "categories": [
5 | 13
6 | ],
7 | "date_created": "2025-01-15",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": 7777,
12 | "documentation": "https://docs.petio.tv/",
13 | "website": "https://petio.tv/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/petio.webp",
15 | "config_path": "/opt/petio",
16 | "description": "Petio is a third party companion app available to Plex server owners to allow their users to request, review and discover content. It integrates with your existing services, such as Sonarr and Radarr, for seamless content management.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/petio.sh",
21 | "resources": {
22 | "cpu": 2,
23 | "ram": 1024,
24 | "hdd": 4,
25 | "os": "ubuntu",
26 | "version": "24.04"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": [
35 | {
36 | "text": "Installation path: /opt/Petio",
37 | "type": "info"
38 | }
39 | ]
40 | }
41 |
--------------------------------------------------------------------------------
/ct/deferred/ocis.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 tteck
4 | # Author: tteck (tteckster)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://www.debian.org/
7 |
8 | APP="ocis"
9 | var_tags="${var_tags:-cloud}"
10 | var_cpu="${var_cpu:-4}"
11 | var_ram="${var_ram:-4096}"
12 | var_disk="${var_disk:-10}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-12}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /var ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD apt-get update
32 | $STD apt-get -y upgrade
33 | msg_ok "Updated $APP LXC"
34 | exit
35 | }
36 |
37 | start
38 | build_container
39 | description
40 |
41 | msg_ok "Completed Successfully!\n"
42 | echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
43 | echo -e "${INFO}${YW} Access it using the following URL:${CL}"
44 | echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9200${CL}"
45 |
--------------------------------------------------------------------------------
/install/plex2-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 tteck
4 | # Author: tteck (tteckster)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source: https://www.plex.tv/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | setup_hwaccel
17 |
18 | msg_info "Setting Up Plex Media Server Repository"
19 | curl -fsSL https://downloads.plex.tv/plex-keys/PlexSign.key | tee /usr/share/keyrings/PlexSign.asc >/dev/null
20 | cat </etc/apt/sources.list.d/plexmediaserver.sources
21 | Types: deb
22 | URIs: https://downloads.plex.tv/repo/deb/
23 | Suites: public
24 | Components: main
25 | Signed-By: /usr/share/keyrings/PlexSign.asc
26 | EOF
27 | msg_ok "Set Up Plex Media Server Repository"
28 |
29 | msg_info "Installing Plex Media Server"
30 | $STD apt update
31 | $STD apt -o Dpkg::Options::="--force-confold" install -y plexmediaserver
32 | if [[ "$CTTYPE" == "0" ]]; then
33 | sed -i -e 's/^ssl-cert:x:104:plex$/render:x:104:root,plex/' -e 's/^render:x:108:root$/ssl-cert:x:108:plex/' /etc/group
34 | else
35 | sed -i -e 's/^ssl-cert:x:104:plex$/render:x:104:plex/' -e 's/^render:x:108:$/ssl-cert:x:108:/' /etc/group
36 | fi
37 | msg_ok "Installed Plex Media Server"
38 |
39 | motd_ssh
40 | customize
41 | cleanup_lxc
42 |
--------------------------------------------------------------------------------
/ct/ubuntu.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/github.func)
4 | # Copyright (c) 2021-2025 tteck
5 | # Author: tteck (tteckster)
6 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
7 | # Source: https://ubuntu.com/
8 |
9 | echo -e "Loading..."
10 | APP="Ubuntu"
11 | var_tags="${var_tags:-os}"
12 | var_cpu="${var_cpu:-1}"
13 | var_ram="${var_ram:-512}"
14 | var_disk="${var_disk:-2}"
15 | var_os="${var_os:-ubuntu}"
16 | var_version="${var_version:-24.04}"
17 | var_unprivileged="${var_unprivileged:-0}"
18 |
19 | header_info "$APP"
20 | variables
21 | color
22 | catch_errors
23 |
24 | function update_script() {
25 | header_info
26 | check_container_storage
27 | check_container_resources
28 | if [[ ! -d /var ]]; then
29 | msg_error "No ${APP} Installation Found!"
30 | exit
31 | fi
32 | msg_info "Updating ${APP} LXC"
33 | $STD apt-get update
34 | $STD apt-get -y upgrade
35 | msg_ok "Updated ${APP} LXC"
36 | exit
37 | }
38 |
39 | start
40 | build_container
41 | description
42 |
43 | msg_ok "Completed Successfully!\n"
44 | echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
45 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/popover.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as PopoverPrimitive from "@radix-ui/react-popover"
5 |
6 | import { cn } from "@/lib/utils"
7 |
8 | const Popover = PopoverPrimitive.Root
9 |
10 | const PopoverTrigger = PopoverPrimitive.Trigger
11 |
12 | const PopoverContent = React.forwardRef<
13 | React.ElementRef,
14 | React.ComponentPropsWithoutRef
15 | >(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
16 |
17 |
27 |
28 | ))
29 | PopoverContent.displayName = PopoverPrimitive.Content.displayName
30 |
31 | export { Popover, PopoverTrigger, PopoverContent }
32 |
--------------------------------------------------------------------------------
/ct/frigate.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Authors: MickLesk (CanbiZ) | Co-Author: remz1337
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source: https://frigate.video/
7 |
8 | APP="Frigate"
9 | var_tags="${var_tags:-nvr}"
10 | var_cpu="${var_cpu:-4}"
11 | var_ram="${var_ram:-4096}"
12 | var_disk="${var_disk:-20}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-12}"
15 | var_unprivileged="${var_unprivileged:-0}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -f /etc/systemd/system/frigate.service ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_error "To update Frigate, create a new container and transfer your configuration."
31 | exit
32 | }
33 |
34 | start
35 | build_container
36 | description
37 |
38 | msg_ok "Completed Successfully!\n"
39 | echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
40 | echo -e "${INFO}${YW} Access it using the following URL:${CL}"
41 | echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
42 |
--------------------------------------------------------------------------------
/install/deferred/vikunja-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (Canbiz)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source: https://vikunja.io/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Installing Dependencies"
17 | $STD apt-get install -y make
18 | msg_ok "Installed Dependencies"
19 |
20 | msg_info "Setup Vikunja (Patience)"
21 | cd /opt
22 | RELEASE=$(curl -fsSL https://dl.vikunja.io/vikunja/ | grep -oP 'href="/vikunja/\K[0-9]+\.[0-9]+\.[0-9]+' | sort -V | tail -n 1)
23 | curl -fsSL "https://dl.vikunja.io/vikunja/$RELEASE/vikunja-$RELEASE-amd64.deb" -o vikunja-$RELEASE-amd64.deb
24 | $STD dpkg -i vikunja-$RELEASE-amd64.deb
25 | sed -i 's|^ timezone: .*| timezone: UTC|' /etc/vikunja/config.yml
26 | sed -i 's|"./vikunja.db"|"/etc/vikunja/vikunja.db"|' /etc/vikunja/config.yml
27 | sed -i 's|./files|/etc/vikunja/files|' /etc/vikunja/config.yml
28 | systemctl start vikunja.service
29 | echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
30 | msg_ok "Installed Vikunja"
31 |
32 | motd_ssh
33 | customize
34 |
35 | msg_info "Cleaning up"
36 | rm -rf /opt/vikunja-$RELEASE-amd64.deb
37 | $STD apt-get autoremove
38 | $STD apt-get autoclean
39 | msg_ok "Cleaned"
40 |
--------------------------------------------------------------------------------
/ct/deferred/kanba.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://github.com/Kanba-co/kanba
7 |
8 | APP="Kanba"
9 | var_tags="${var_tags:-kanban}"
10 | var_cpu="${var_cpu:-2}"
11 | var_ram="${var_ram:-2048}"
12 | var_disk="${var_disk:-5}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-12}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /var ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD apt-get update
32 | $STD apt-get -y upgrade
33 | msg_ok "Updated $APP LXC"
34 | exit
35 | }
36 |
37 | start
38 | build_container
39 | description
40 |
41 | msg_ok "Completed Successfully!\n"
42 | echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
43 | echo -e "${INFO}${YW} Access it using the following URL:${CL}"
44 | echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
45 |
--------------------------------------------------------------------------------
/ct/petio.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
3 | # Copyright (c) 2021-2025 tteck
4 | # Author: tteck (tteckster)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source: https://petio.tv/
7 |
8 | APP="Petio"
9 | var_tags="${var_tags:-media}"
10 | var_cpu="${var_cpu:-2}"
11 | var_ram="${var_ram:-1024}"
12 | var_disk="${var_disk:-4}"
13 | var_os="${var_os:-ubuntu}"
14 | var_version="${var_version:-24.04}"
15 |
16 | header_info "$APP"
17 | variables
18 | color
19 | catch_errors
20 |
21 | function update_script() {
22 | header_info
23 | check_container_storage
24 | check_container_resources
25 | if [[ ! -d /opt/Petio ]]; then
26 | msg_error "No ${APP} Installation Found!"
27 | exit
28 | fi
29 | msg_info "Updating $APP"
30 | systemctl stop petio.service
31 | curl -fsSL https://petio.tv/releases/latest -o petio-latest.zip
32 | $STD unzip petio-latest.zip -d /opt/Petio
33 | systemctl start petio.service
34 | msg_ok "Updated $APP"
35 | exit
36 | }
37 |
38 | start
39 | build_container
40 | description
41 |
42 | msg_ok "Completed Successfully!\n"
43 | echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
44 | echo -e "${INFO}${YW} Access it using the following URL:${CL}"
45 | echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7777${CL}"
46 |
--------------------------------------------------------------------------------
/.github/workflows/scripts/get-gh-release.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | INPUT_FILE=".github/workflows/scripts/repos.txt"
4 | OUTPUT_FILE="frontend/public/json/versions.json"
5 | TMP_FILE="releases_tmp.json"
6 |
7 | if [ -f "$OUTPUT_FILE" ]; then
8 | cp "$OUTPUT_FILE" "$TMP_FILE"
9 | else
10 | echo "[]" > "$TMP_FILE"
11 | fi
12 |
13 | while IFS= read -r repo; do
14 | echo "Checking $repo..."
15 |
16 | response=$(curl -s -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/${repo}/releases/latest")
17 | tag=$(echo "$response" | jq -r .tag_name)
18 | date=$(echo "$response" | jq -r .published_at)
19 |
20 | if [[ "$tag" == "null" || "$date" == "null" ]]; then
21 | echo "No release found for $repo"
22 | continue
23 | fi
24 |
25 | existing_version=$(jq -r --arg name "$repo" '.[] | select(.name == $name) | .version' "$TMP_FILE")
26 |
27 | if [[ "$existing_version" != "$tag" ]]; then
28 | echo "New release for $repo: $tag"
29 | jq --arg name "$repo" 'del(.[] | select(.name == $name))' "$TMP_FILE" > "$TMP_FILE.tmp" && mv "$TMP_FILE.tmp" "$TMP_FILE"
30 |
31 | jq --arg name "$repo" --arg version "$tag" --arg date "$date" \
32 | '. += [{"name": $name, "version": $version, "date": $date}]' "$TMP_FILE" > "$TMP_FILE.tmp" && mv "$TMP_FILE.tmp" "$TMP_FILE"
33 | else
34 | echo "No change for $repo"
35 | fi
36 |
37 | done < "$INPUT_FILE"
38 |
39 | #mv "$TMP_FILE" "$OUTPUT_FILE"
40 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 🚧 ProxmoxVED Helper-Scripts (Development Repository)
2 |
3 | **Warning: This repository is under active development and is not intended for production use. Changes may occur at any time!**
4 |
5 |
6 |
7 | ---
8 |
9 | ## 🔧 What is this?
10 |
11 | This repository contains a collection of scripts for managing and automating Proxmox Virtual Environment (Proxmox VE). Originally created by [tteck](https://github.com/tteck), the project is now community-driven and continues to evolve.
12 |
13 | ---
14 |
15 | ## 🚀 Development Status
16 |
17 | - **⚠️ Unstable**: Features may be incomplete or subject to change.
18 | - **📢 Community-driven**: Contributions and feedback are welcome.
19 | - **🔄 Frequent updates**: Active development means rapid iterations and fixes.
20 |
21 | ---
22 |
23 | ## 💬 Get Involved
24 |
25 | Join the discussion, contribute code, or report issues:
26 |
27 | - **Discord**: [Join the Proxmox Helper Scripts Discord server](https://discord.gg/UHrpNWGwkH)
28 | - **GitHub Issues**: [Report bugs or request features](https://github.com/community-scripts/ProxmoxVED/issues)
29 |
30 | ## 📜 License
31 |
32 | This project is licensed under the [MIT License](LICENSE).
33 |
34 |
35 |
36 |
37 | Proxmox® is a registered trademark of Proxmox Server Solutions GmbH.
38 |
39 |
--------------------------------------------------------------------------------
/frontend/src/app/scripts/_components/Sidebar.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import type { Category, Script } from "@/lib/types";
4 | import ScriptAccordion from "./ScriptAccordion";
5 |
6 | const Sidebar = ({
7 | items,
8 | selectedScript,
9 | setSelectedScript,
10 | }: {
11 | items: Category[];
12 | selectedScript: string | null;
13 | setSelectedScript: (script: string | null) => void;
14 | }) => {
15 | const filteredItems = items.filter(category => category.scripts && category.scripts.length > 0);
16 |
17 | const uniqueScripts = filteredItems.reduce((acc, category) => {
18 | for (const script of category.scripts) {
19 | if (!acc.some((s) => s.name === script.name)) {
20 | acc.push(script);
21 | }
22 | }
23 | return acc;
24 | }, [] as Script[]);
25 |
26 | return (
27 |
28 |
29 |
Categories
30 |
31 | {uniqueScripts.length} Total scripts
32 |
33 |
34 |
35 |
40 |
41 |
42 | );
43 | };
44 |
45 | export default Sidebar;
46 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/badge.tsx:
--------------------------------------------------------------------------------
1 | import { cva, type VariantProps } from "class-variance-authority";
2 | import * as React from "react";
3 |
4 | import { cn } from "@/lib/utils";
5 |
6 | const badgeVariants = cva(
7 | "inline-flex items-center rounded-full border px-1.5 py-0.1 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
8 | {
9 | variants: {
10 | variant: {
11 | default:
12 | "border-transparent text-primary-foreground border-primary-foreground",
13 | secondary:
14 | "border-transparent text-secondary-foreground border-secondary-foreground",
15 | destructive:
16 | "border-transparent text-destructive-foreground border-destructive-foreground",
17 | outline: "text-foreground",
18 | success: "text-green-500 border-green-500",
19 | warning: "text-yellow-500 border-yellow-500",
20 | failure: "text-red-500 border-red-500",
21 | },
22 | },
23 | defaultVariants: {
24 | variant: "default",
25 | },
26 | },
27 | );
28 |
29 | export interface BadgeProps
30 | extends React.HTMLAttributes,
31 | VariantProps {}
32 |
33 | function Badge({ className, variant, ...props }: BadgeProps) {
34 | return (
35 |
36 | );
37 | }
38 |
39 | export { Badge, badgeVariants };
40 |
--------------------------------------------------------------------------------
/.github/workflows/scripts/generate-app-headers.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Function for generating Figlet headers
4 | generate_headers() {
5 | local base_dir=$1
6 | local target_subdir=$2
7 | local search_pattern=$3
8 |
9 | local headers_dir="${base_dir}/headers"
10 | mkdir -p "$headers_dir"
11 | rm -f "$headers_dir"/*
12 |
13 | # Recursive or non-recursive search
14 | if [[ "$search_pattern" == "**" ]]; then
15 | shopt -s globstar nullglob
16 | file_list=("${base_dir}"/**/*.sh)
17 | shopt -u globstar
18 | else
19 | file_list=("${base_dir}"/*.sh)
20 | fi
21 |
22 | for script in "${file_list[@]}"; do
23 | [[ -f "$script" ]] || continue
24 |
25 | app_name=$(grep -oP '^APP="\K[^"]+' "$script" 2>/dev/null)
26 | if [[ -n "$app_name" ]]; then
27 | output_file="${headers_dir}/$(basename "${script%.*}")"
28 | figlet_output=$(figlet -w 500 -f slant "$app_name")
29 | if [[ -n "$figlet_output" ]]; then
30 | echo "$figlet_output" >"$output_file"
31 | echo "Generated: $output_file"
32 | else
33 | echo "Figlet failed for $app_name in $script"
34 | fi
35 | else
36 | echo "No APP name found in $script, skipping."
37 | fi
38 | done
39 | }
40 |
41 | # ct
42 | generate_headers "./ct" "headers" "*"
43 |
44 | # tools (addon, pve, ...)
45 | generate_headers "./tools" "headers" "**"
46 |
47 | # vm
48 | generate_headers "./vm" "headers" "*"
49 |
50 | echo "Completed processing all sections."
51 |
--------------------------------------------------------------------------------
/install/deferred/jumpserver-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: Nícolas Pastorello (opastorello)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source: https://github.com/jumpserver/jumpserver
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Installing Dependencies"
17 | $STD apt-get install -y \
18 | iptables
19 | msg_ok "Installed Dependencies"
20 |
21 | msg_info "Installing JumpServer"
22 | cd /opt
23 | RELEASE=$(curl -fsSL https://api.github.com/repos/jumpserver/installer/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/')
24 | curl -fsSL "https://github.com/jumpserver/installer/releases/download/${RELEASE}/jumpserver-installer-${RELEASE}.tar.gz" -o jumpserver-installer-${RELEASE}.tar.gz
25 | mkdir -p /opt/jumpserver
26 | tar -xzvf jumpserver-installer-${RELEASE}.tar.gz -C /opt/jumpserver --strip-components=1
27 | cd /opt/jumpserver
28 | $STD ./jmsctl.sh install </opt/${APP}_version.txt
38 | msg_ok "Installed JumpServer"
39 |
40 | motd_ssh
41 | customize
42 |
43 | msg_info "Cleaning up"
44 | rm -rf /opt/jumpserver-installer-${RELEASE}.tar.gz
45 | $STD apt-get -y autoremove
46 | $STD apt-get -y autoclean
47 | msg_ok "Cleaned"
48 |
--------------------------------------------------------------------------------
/frontend/public/json/freepbx.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "FreePBX",
3 | "slug": "freepbx",
4 | "categories": [
5 | 17
6 | ],
7 | "date_created": "2025-01-15",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": 80,
12 | "documentation": "https://wiki.freepbx.org/",
13 | "website": "https://www.freepbx.org/",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/freepbx.webp",
15 | "config_path": "/etc/freepbx.conf",
16 | "description": "FreePBX is a web-based open-source graphical user interface that manages Asterisk, a voice over IP and telephony server. FreePBX provides a complete PBX solution with call routing, voicemail, IVR, and more.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/freepbx.sh",
21 | "resources": {
22 | "cpu": 2,
23 | "ram": 2048,
24 | "hdd": 10,
25 | "os": "debian",
26 | "version": "12"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": [
35 | {
36 | "text": "Access the web interface to complete initial setup",
37 | "type": "info"
38 | },
39 | {
40 | "text": "SIP Port: 5060, IAX2 Port: 4569",
41 | "type": "info"
42 | }
43 | ]
44 | }
45 |
--------------------------------------------------------------------------------
/frontend/src/app/scripts/_components/ScriptItems/DefaultSettings.tsx:
--------------------------------------------------------------------------------
1 | import { Script } from "@/lib/types";
2 |
3 | export default function DefaultSettings({ item }: { item: Script }) {
4 | const getDisplayValueFromRAM = (ram: number) => (ram >= 1024 ? `${Math.floor(ram / 1024)}GB` : `${ram}MB`);
5 |
6 | const ResourceDisplay = ({ settings, title }: { settings: (typeof item.install_methods)[0]; title: string }) => {
7 | const { cpu, ram, hdd } = settings.resources;
8 | return (
9 |
10 |
{title}
11 |
CPU: {cpu}vCPU
12 |
RAM: {getDisplayValueFromRAM(ram ?? 0)}
13 |
HDD: {hdd}GB
14 |
15 | );
16 | };
17 |
18 | const defaultSettings = item.install_methods.find((method) => method.type === "default");
19 | const defaultAlpineSettings = item.install_methods.find((method) => method.type === "alpine");
20 |
21 | const hasDefaultSettings = defaultSettings?.resources && Object.values(defaultSettings.resources).some(Boolean);
22 |
23 | return (
24 |
25 | {hasDefaultSettings && }
26 | {defaultAlpineSettings && }
27 |
28 | );
29 | }
30 |
--------------------------------------------------------------------------------
/frontend/src/lib/types.ts:
--------------------------------------------------------------------------------
1 | import { AlertColors } from "@/config/siteConfig";
2 |
3 | export type Script = {
4 | name: string;
5 | slug: string;
6 | categories: number[];
7 | date_created: string;
8 | type: "vm" | "ct" | "pve" | "addon";
9 | updateable: boolean;
10 | privileged: boolean;
11 | interface_port: number | null;
12 | documentation: string | null;
13 | website: string | null;
14 | logo: string | null;
15 | description: string;
16 | config_path: string | null;
17 | install_methods: {
18 | type: "default" | "alpine";
19 | script: string;
20 | resources: {
21 | cpu: number | null;
22 | ram: number | null;
23 | hdd: number | null;
24 | os: string | null;
25 | version: string | null;
26 | };
27 | }[];
28 | default_credentials: {
29 | username: string | null;
30 | password: string | null;
31 | };
32 | notes: [
33 | {
34 | text: string;
35 | type: keyof typeof AlertColors;
36 | },
37 | ];
38 | };
39 |
40 | export type Category = {
41 | name: string;
42 | id: number;
43 | sort_order: number;
44 | scripts: Script[];
45 | };
46 |
47 | export type Metadata = {
48 | categories: Category[];
49 | };
50 |
51 | export interface Version {
52 | name: string;
53 | slug: string;
54 | }
55 |
56 | export interface OperatingSystem {
57 | name: string;
58 | versions: Version[];
59 | }
60 |
61 | export interface AppVersion {
62 | name: string;
63 | version: string;
64 | date: Date;
65 | }
66 |
--------------------------------------------------------------------------------
/ct/alpine-ntfy.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: cobalt (cobaltgit)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://ntfy.sh/
7 |
8 | APP="Alpine-ntfy"
9 | var_tags="${var_tags:-notification}"
10 | var_cpu="${var_cpu:-1}"
11 | var_ram="${var_ram:-256}"
12 | var_disk="${var_disk:-2}"
13 | var_os="${var_os:-alpine}"
14 | var_version="${var_version:-3.22}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /etc/ntfy ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating $APP LXC"
31 | $STD apk -U upgrade
32 | setcap 'cap_net_bind_service=+ep' /usr/bin/ntfy
33 | msg_ok "Updated $APP LXC"
34 |
35 | msg_info "Restarting ntfy"
36 | rc-service ntfy restart
37 | msg_ok "Restarted ntfy"
38 | exit
39 | }
40 |
41 | start
42 | build_container
43 | description
44 |
45 | msg_ok "Completed Successfully!\n"
46 | echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
47 | echo -e "${INFO}${YW} Access it using the following URL:${CL}"
48 | echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
49 |
--------------------------------------------------------------------------------
/frontend/public/json/pihole-exporter.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Pi-Hole Exporter",
3 | "slug": "pihole-exporter",
4 | "categories": [
5 | 9
6 | ],
7 | "date_created": "2025-12-08",
8 | "type": "addon",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": 9617,
12 | "documentation": "https://github.com/eko/pihole-exporter",
13 | "website": "https://github.com/eko/pihole-exporter",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/pi-hole.webp",
15 | "config_path": "/opt/pihole-exporter.env",
16 | "description": "A Prometheus exporter for PI-Hole's Raspberry PI ad blocker",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "tools/addon/pihole-exporter.sh",
21 | "resources": {
22 | "cpu": null,
23 | "ram": null,
24 | "hdd": null,
25 | "os": null,
26 | "version": null
27 | }
28 | },
29 | {
30 | "type": "alpine",
31 | "script": "tools/addon/pihole-exporter.sh",
32 | "resources": {
33 | "cpu": null,
34 | "ram": null,
35 | "hdd": null,
36 | "os": null,
37 | "version": null
38 | }
39 | }
40 | ],
41 | "default_credentials": {
42 | "username": null,
43 | "password": null
44 | },
45 | "notes": []
46 | }
47 |
--------------------------------------------------------------------------------
/frontend/src/app/api/versions/route.ts:
--------------------------------------------------------------------------------
1 | import { AppVersion } from "@/lib/types";
2 | import { error } from "console";
3 | import { promises as fs } from "fs";
4 | // import Error from "next/error";
5 | import { NextResponse } from "next/server";
6 | import path from "path";
7 |
8 | export const dynamic = "force-static";
9 |
10 | const jsonDir = "public/json";
11 | const versionsFileName = "versions.json";
12 | const encoding = "utf-8";
13 |
14 | const getVersions = async () => {
15 | const filePath = path.resolve(jsonDir, versionsFileName);
16 | const fileContent = await fs.readFile(filePath, encoding);
17 | const versions: AppVersion[] = JSON.parse(fileContent);
18 | console.log("Versions: ", versions);
19 | const modifiedVersions = versions.map(version => {
20 | let newName = version.name;
21 | // Ensure date is included in the returned object
22 | newName = newName.toLowerCase().replace(/[^a-z0-9/]/g, '');
23 | return { ...version, name: newName};
24 | });
25 |
26 | return modifiedVersions;
27 | };
28 |
29 | export async function GET() {
30 | try {
31 |
32 | const versions = await getVersions();
33 | return NextResponse.json(versions);
34 |
35 | } catch (error) {
36 | console.error(error);
37 | const err = error as globalThis.Error;
38 | return NextResponse.json({
39 | name: err.name,
40 | message: err.message || "An unexpected error occurred",
41 | version: "No version found - Error"
42 | }, {
43 | status: 500,
44 | });
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/ct/deferred/pixelfed.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (Canbiz)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source:
7 |
8 | APP="Pixelfed"
9 | var_tags="${var_tags:-pictures}"
10 | var_disk="${var_disk:-7}"
11 | var_cpu="${var_cpu:-2}"
12 | var_ram="${var_ram:-2048}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-12}"
15 |
16 | header_info "$APP"
17 | variables
18 | color
19 | catch_errors
20 |
21 | function update_script() {
22 | header_info
23 | check_container_storage
24 | check_container_resources
25 | if [[ ! -d /opt/pixelfed ]]; then
26 | msg_error "No ${APP} Installation Found!"
27 | exit
28 | fi
29 | RELEASE=$(curl -fsSL https://api.github.com/repos/xxxx/xxxx/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
30 | if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
31 | msg_info "Updating ${APP} to ${RELEASE}"
32 | cd /opt
33 | else
34 | msg_ok "No update required. ${APP} is already at ${RELEASE}"
35 | fi
36 | exit
37 | }
38 |
39 | start
40 | build_container
41 | description
42 |
43 | msg_ok "Completed Successfully!\n"
44 | echo -e "${APP} Setup should be reachable by going to the following URL.
45 | ${BL}http://${IP}:8000${CL} \n"
46 |
--------------------------------------------------------------------------------
/install/heimdall-dashboard-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 tteck
4 | # Author: tteck (tteckster)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source: https://heimdall.site/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Installing Dependencies"
17 | $STD apt install -y apt-transport-https
18 | msg_ok "Installed Dependencies"
19 |
20 | PHP_VERSION="8.4" PHP_MODULE="bz2,sqlite3" PHP_FPM="YES" setup_php
21 | setup_composer
22 | fetch_and_deploy_gh_release "Heimdall" "linuxserver/Heimdall" "tarball"
23 |
24 | msg_info "Setting up Heimdall-Dashboard"
25 | cd /opt/Heimdall
26 | cp .env.example .env
27 | $STD php artisan key:generate
28 | msg_ok "Setup Heimdall-Dashboard"
29 |
30 | msg_info "Creating Service"
31 | cat </etc/systemd/system/heimdall.service
32 | [Unit]
33 | Description=Heimdall
34 | After=network.target
35 |
36 | [Service]
37 | Restart=always
38 | RestartSec=5
39 | Type=simple
40 | User=root
41 | WorkingDirectory=/opt/Heimdall
42 | ExecStart=/usr/bin/php artisan serve --port 7990 --host 0.0.0.0
43 | TimeoutStopSec=30
44 |
45 | [Install]
46 | WantedBy=multi-user.target"
47 | EOF
48 | systemctl enable -q --now heimdall
49 | cd /opt/Heimdall
50 | export COMPOSER_ALLOW_SUPERUSER=1
51 | $STD composer dump-autoload
52 | systemctl restart heimdall.service
53 | msg_ok "Created Service"
54 |
55 | motd_ssh
56 | customize
57 | cleanup_lxc
58 |
--------------------------------------------------------------------------------
/frontend/public/json/jellystat.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Jellystat",
3 | "slug": "jellystat",
4 | "categories": [
5 | 9
6 | ],
7 | "date_created": "2025-12-08",
8 | "type": "addon",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": 3000,
12 | "documentation": "https://github.com/CyferShepard/Jellystat",
13 | "website": "https://github.com/CyferShepard/Jellystat",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/jellystat.webp",
15 | "config_path": "/opt/jellystat/.env",
16 | "description": "A free and open source statistics app for Jellyfin",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "tools/addon/jellystat.sh",
21 | "resources": {
22 | "cpu": null,
23 | "ram": null,
24 | "hdd": null,
25 | "os": null,
26 | "version": null
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": [
35 | {
36 | "text": "Requires Node.js 20+ and PostgreSQL (auto-installed if missing)",
37 | "type": "info"
38 | },
39 | {
40 | "text": "Default PostgreSQL credentials: jellystat / jellystat",
41 | "type": "info"
42 | },
43 | {
44 | "text": "Update with: update_jellystat",
45 | "type": "info"
46 | }
47 | ]
48 | }
49 |
--------------------------------------------------------------------------------
/frontend/src/app/scripts/_components/ResourceDisplay.tsx:
--------------------------------------------------------------------------------
1 | import { CPUIcon, HDDIcon, RAMIcon } from "@/components/icons/resource-icons";
2 | import { getDisplayValueFromRAM } from "@/lib/utils/resource-utils";
3 |
4 | interface ResourceDisplayProps {
5 | title: string;
6 | cpu: number | null;
7 | ram: number | null;
8 | hdd: number | null;
9 | }
10 |
11 | interface IconTextProps {
12 | icon: React.ReactNode;
13 | label: string;
14 | }
15 |
16 | function IconText({ icon, label }: IconTextProps) {
17 | return (
18 |
19 | {icon}
20 | {label}
21 |
22 | );
23 | }
24 |
25 | export function ResourceDisplay({ title, cpu, ram, hdd }: ResourceDisplayProps) {
26 | const hasCPU = typeof cpu === "number" && cpu > 0;
27 | const hasRAM = typeof ram === "number" && ram > 0;
28 | const hasHDD = typeof hdd === "number" && hdd > 0;
29 |
30 | if (!hasCPU && !hasRAM && !hasHDD) return null;
31 |
32 | return (
33 |
34 |
{title}
35 |
36 | {hasCPU && } label={`${cpu} vCPU`} />}
37 | {hasRAM && } label={getDisplayValueFromRAM(ram!)} />}
38 | {hasHDD && } label={`${hdd} GB`} />}
39 |
40 |
41 | );
42 | }
43 |
--------------------------------------------------------------------------------
/frontend/public/json/qbittorrent-exporter.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "qbittorrent Exporter",
3 | "slug": "qbittorrent-exporter",
4 | "categories": [
5 | 9
6 | ],
7 | "date_created": "2025-11-21",
8 | "type": "addon",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": 8090,
12 | "documentation": "https://github.com/martabal/qbittorrent-exporter",
13 | "website": "https://github.com/martabal/qbittorrent-exporter",
14 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/qbittorrent.webp",
15 | "config_path": "/opt/qbittorrent-exporter.env",
16 | "description": "A fast and lightweight prometheus exporter for qBittorrent ",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "tools/addon/qbittorrent-exporter.sh",
21 | "resources": {
22 | "cpu": null,
23 | "ram": null,
24 | "hdd": null,
25 | "os": null,
26 | "version": null
27 | }
28 | },
29 | {
30 | "type": "alpine",
31 | "script": "tools/addon/qbittorrent-exporter.sh",
32 | "resources": {
33 | "cpu": null,
34 | "ram": null,
35 | "hdd": null,
36 | "os": null,
37 | "version": null
38 | }
39 | }
40 | ],
41 | "default_credentials": {
42 | "username": null,
43 | "password": null
44 | },
45 | "notes": []
46 | }
47 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/theme-toggle.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { MoonIcon, SunIcon } from "@radix-ui/react-icons";
4 | import { useTheme } from "next-themes";
5 | import { Button } from "./button";
6 | import {
7 | Tooltip,
8 | TooltipContent,
9 | TooltipProvider,
10 | TooltipTrigger,
11 | } from "./tooltip";
12 |
13 | export function ThemeToggle() {
14 | const { setTheme, theme: currentTheme } = useTheme();
15 |
16 | const handleChangeTheme = (theme: "light" | "dark") => {
17 | if (theme === currentTheme) return;
18 |
19 | if (!document.startViewTransition) return setTheme(theme);
20 | document.startViewTransition(() => setTheme(theme));
21 | };
22 |
23 | return (
24 |
25 |
26 |
27 |
40 |
41 |
42 | Theme Toggle
43 |
44 |
45 |
46 | );
47 | }
48 |
--------------------------------------------------------------------------------
/ct/deferred/ampache.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (Canbiz)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source:
7 |
8 | APP="Ampache"
9 | var_tags="${var_tags:-music}"
10 | var_disk="${var_disk:-5}"
11 | var_cpu="${var_cpu:-4}"
12 | var_ram="${var_ram:-2048}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-12}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /opt/ampache ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
31 | msg_info "Updating ${APP} LXC"
32 | cd /opt/ampache
33 | ###### Update Script Here ######
34 | msg_ok "Updated Successfully"
35 | else
36 | msg_ok "No update required. ${APP} is already at v${RELEASE}"
37 | fi
38 | exit
39 | }
40 |
41 | start
42 | build_container
43 | description
44 |
45 | msg_ok "Completed Successfully!\n"
46 | echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
47 | echo -e "${INFO}${YW} Access it using the following URL:${CL}"
48 | echo -e "${TAB}${GATEWAY}${BGN}http://${IP}/install.php${CL}"
49 |
--------------------------------------------------------------------------------
/frontend/src/app/scripts/_components/ScriptItems/DefaultPassword.tsx:
--------------------------------------------------------------------------------
1 | import handleCopy from "@/components/handleCopy";
2 | import { Button } from "@/components/ui/button";
3 | import { Separator } from "@/components/ui/separator";
4 | import { Script } from "@/lib/types";
5 |
6 | export default function DefaultPassword({ item }: { item: Script }) {
7 | const { username, password } = item.default_credentials;
8 | const hasDefaultLogin = username && password;
9 |
10 | if (!hasDefaultLogin) return null;
11 |
12 | const copyCredential = (type: "username" | "password") => {
13 | handleCopy(type, item.default_credentials[type] ?? "");
14 | };
15 |
16 | return (
17 |
18 |
19 |
Default Login Credentials
20 |
21 |
22 |
23 |
24 | You can use the following credentials to login to the {item.name} {item.type}.
25 |
26 | {["username", "password"].map((type) => (
27 |
28 | {type.charAt(0).toUpperCase() + type.slice(1)}:{" "}
29 |
32 |
33 | ))}
34 |
35 |
36 | );
37 | }
38 |
--------------------------------------------------------------------------------
/frontend/src/components/FAQ.tsx:
--------------------------------------------------------------------------------
1 | import * as AccordionPrimitive from "@radix-ui/react-accordion";
2 | import { Plus } from "lucide-react";
3 | import { FAQ_Items } from "../config/faqConfig";
4 | import { Accordion, AccordionContent, AccordionItem } from "./ui/accordion";
5 |
6 | export default function FAQ() {
7 | return (
8 |
9 |
10 | {FAQ_Items.map((item, index) => (
11 |
12 |
13 |
14 | {item.title}
15 |
21 |
22 |
23 | {item.content}
24 |
25 | ))}
26 |
27 |
28 | );
29 | }
30 |
--------------------------------------------------------------------------------
/frontend/public/json/garmin-grafana.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "garmin-grafana",
3 | "slug": "garmin-grafana",
4 | "categories": [
5 | 24
6 | ],
7 | "date_created": "2025-05-08",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": 3000,
12 | "documentation": "https://github.com/arpanghosh8453/garmin-grafana",
13 | "config_path": "",
14 | "website": "https://github.com/arpanghosh8453/garmin-grafana",
15 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/garmin-grafana.webp",
16 | "description": "A docker container to fetch data from Garmin servers and store the data in a local influxdb database for appealing visualization with Grafana.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/garmin-grafana.sh",
21 | "resources": {
22 | "cpu": 2,
23 | "ram": 2,
24 | "hdd": 8,
25 | "os": "Debian",
26 | "version": "12"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": [
35 | {
36 | "text": "Show login and database credentials: `cat ~/.garmin-grafana.creds`",
37 | "type": "info"
38 | },
39 | {
40 | "text": "`garmin-grafana` only imports the past 7 days by default. To import historical data, use the `~/bulk-import.sh` script after installation.",
41 | "type": "info"
42 | }
43 | ]
44 | }
45 |
--------------------------------------------------------------------------------
/ct/byparr.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: luismco
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source: https://github.com/ThePhaseless/Byparr
7 |
8 | APP="Byparr"
9 | var_tags="${var_tags:-proxy}"
10 | var_cpu="${var_cpu:-2}"
11 | var_ram="${var_ram:-2048}"
12 | var_disk="${var_disk:-4}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-13}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /opt/Byparr ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 |
31 | if check_for_gh_release "Byparr" "ThePhaseless/Byparr"; then
32 | msg_info "Stopping Service"
33 | systemctl stop byparr
34 | msg_ok "Stopped Service"
35 |
36 | fetch_and_deploy_gh_release "Byparr" "ThePhaseless/Byparr"
37 |
38 | msg_info "Starting Service"
39 | systemctl start byparr
40 | msg_ok "Started Service"
41 | msg_ok "Updated Successfully!"
42 | fi
43 | exit
44 | }
45 |
46 | start
47 | build_container
48 | description
49 |
50 | msg_ok "Completed Successfully!\n"
51 | echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
52 | echo -e "${INFO}${YW} Access it using the following URL:${CL}"
53 | echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8191${CL}"
54 |
--------------------------------------------------------------------------------
/frontend/public/json/koel.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Koel",
3 | "slug": "koel",
4 | "categories": [
5 | 13
6 | ],
7 | "date_created": "2025-12-10",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": 80,
12 | "documentation": "https://docs.koel.dev/",
13 | "config_path": "/opt/koel/.env",
14 | "website": "https://koel.dev/",
15 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/koel-light.webp",
16 | "description": "Koel is a simple web-based personal audio streaming service written in Vue and Laravel. It supports multiple users, audio visualization, smart playlists, YouTube integration, and Last.fm scrobbling.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/koel.sh",
21 | "resources": {
22 | "cpu": 2,
23 | "ram": 2048,
24 | "hdd": 8,
25 | "os": "Debian",
26 | "version": "13"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": "admin@koel.dev",
32 | "password": "KoelIsCool"
33 | },
34 | "notes": [
35 | {
36 | "text": "Media files should be placed in /opt/koel_media",
37 | "type": "info"
38 | },
39 | {
40 | "text": "Database credentials are stored in ~/koel.creds",
41 | "type": "info"
42 | },
43 | {
44 | "text": "Music library is scanned hourly via cron job",
45 | "type": "info"
46 | }
47 | ]
48 | }
49 |
--------------------------------------------------------------------------------
/frontend/public/json/transmission-openvpn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Transmission-Openvpn",
3 | "slug": "transmission-openvpn",
4 | "categories": [
5 | 11
6 | ],
7 | "date_created": "2025-09-04",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": 9091,
12 | "documentation": "https://haugene.github.io/docker-transmission-openvpn/",
13 | "config_path": "/opt/transmission-openvpn/",
14 | "website": "https://github.com/haugene/docker-transmission-openvpn",
15 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/transmission.webp",
16 | "description": "This project runs Transmission + OpenVPN natively in an LXC container, using the popular docker-transmission-openvpn image as a base. It ensures all torrent traffic is securely routed through a VPN tunnel, supports a wide range of VPN providers, and offers flexible configuration options",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/transmission-openvpn.sh",
21 | "resources": {
22 | "cpu": 1,
23 | "ram": 512,
24 | "hdd": 8,
25 | "os": "Debian",
26 | "version": "13"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": [
35 | {
36 | "text": "This application requires a VPN provider to work. Please refer to your VPN provider’s documentation for setting up OpenVPN.",
37 | "type": "warning"
38 | }
39 | ]
40 | }
41 |
--------------------------------------------------------------------------------
/frontend/src/app/scripts/_components/ScriptItems/Tooltips.tsx:
--------------------------------------------------------------------------------
1 | import { Badge } from "@/components/ui/badge";
2 | import {
3 | Tooltip,
4 | TooltipContent,
5 | TooltipProvider,
6 | TooltipTrigger,
7 | } from "@/components/ui/tooltip";
8 | import { Script } from "@/lib/types";
9 | import { CircleHelp } from "lucide-react";
10 | import React from "react";
11 |
12 | interface TooltipProps {
13 | variant: "warning" | "success";
14 | label: string;
15 | content: string;
16 | }
17 |
18 | const TooltipBadge: React.FC = ({ variant, label, content }) => (
19 |
20 |
21 |
22 |
23 | {label}
24 |
25 |
26 |
27 | {content}
28 |
29 |
30 |
31 | );
32 |
33 | export default function Tooltips({ item }: { item: Script }) {
34 | return (
35 |
36 | {item.privileged && (
37 |
42 | )}
43 | {item.updateable && (
44 |
49 | )}
50 |
51 | );
52 | }
53 |
--------------------------------------------------------------------------------
/frontend/public/json/postgresus.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Postgresus",
3 | "slug": "postgresus",
4 | "categories": [
5 | 6,
6 | 11
7 | ],
8 | "date_created": "2025-12-11",
9 | "type": "ct",
10 | "updateable": true,
11 | "privileged": false,
12 | "interface_port": 80,
13 | "documentation": "https://github.com/RostislavDugin/postgresus",
14 | "website": "https://github.com/RostislavDugin/postgresus",
15 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/postgresus.webp",
16 | "config_path": "/opt/postgresus/.env",
17 | "description": "Free, open source and self-hosted solution for automated PostgreSQL backups. With multiple storage options, notifications, scheduling, and a beautiful web interface for managing database backups across multiple PostgreSQL instances.",
18 | "install_methods": [
19 | {
20 | "type": "default",
21 | "script": "ct/postgresus.sh",
22 | "resources": {
23 | "cpu": 2,
24 | "ram": 2048,
25 | "hdd": 8,
26 | "os": "Debian",
27 | "version": "13"
28 | }
29 | }
30 | ],
31 | "default_credentials": {
32 | "username": "admin@localhost",
33 | "password": "See /root/postgresus.creds"
34 | },
35 | "notes": [
36 | {
37 | "text": "Supports PostgreSQL versions 12-18 with cloud and self-hosted instances",
38 | "type": "info"
39 | },
40 | {
41 | "text": "Features: Scheduled backups, multiple storage providers, notifications, encryption",
42 | "type": "info"
43 | }
44 | ]
45 | }
46 |
--------------------------------------------------------------------------------
/tools/pve/usb-passthrough.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 tteck
4 | # Author: tteck (tteckster)
5 | # License: MIT
6 | # https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
7 |
8 | echo -e "\e[1;33m This script will allow USB passthrough to a PRIVILEGED LXC Container ONLY\e[0m"
9 | while true; do
10 | read -p "Did you replace 106 with your LXC ID? Proceed(y/n)?" yn
11 | case $yn in
12 | [Yy]*) break ;;
13 | [Nn]*) exit ;;
14 | *) echo "Please answer yes or no." ;;
15 | esac
16 | done
17 |
18 | TEMP_DIR=$(mktemp -d)
19 | pushd $TEMP_DIR >/dev/null
20 | CHAR_DEVS+=("166:.*")
21 | CHAR_DEVS+=("188:.*")
22 | CHAR_DEVS+=("189:.*")
23 |
24 | for char_dev in ${CHAR_DEVS[@]}; do
25 | [ ! -z "${CHAR_DEV_STRING-}" ] && CHAR_DEV_STRING+=" -o"
26 | CHAR_DEV_STRING+=" -regex \".*/${char_dev}\""
27 | done
28 |
29 | read -r -d '' HOOK_SCRIPT <<-EOF || true
30 | for char_dev in \$(find /sys/dev/char -regextype sed $CHAR_DEV_STRING); do
31 | dev="/dev/\$(sed -n "/DEVNAME/ s/^.*=\(.*\)$/\1/p" \${char_dev}/uevent)";
32 | mkdir -p \$(dirname \${LXC_ROOTFS_MOUNT}\${dev});
33 | for link in \$(udevadm info --query=property \$dev | sed -n "s/DEVLINKS=//p"); do
34 | mkdir -p \${LXC_ROOTFS_MOUNT}\$(dirname \$link);
35 | cp -dpR \$link \${LXC_ROOTFS_MOUNT}\${link};
36 | done;
37 | cp -dpR \$dev \${LXC_ROOTFS_MOUNT}\${dev};
38 | done;
39 | EOF
40 | HOOK_SCRIPT=${HOOK_SCRIPT//$'\n'/}
41 |
42 | CTID=$1
43 | CTID_CONFIG_PATH=/etc/pve/lxc/${CTID}.conf
44 | sed '/autodev/d' $CTID_CONFIG_PATH >CTID.conf
45 | cat CTID.conf >$CTID_CONFIG_PATH
46 |
47 | cat <>$CTID_CONFIG_PATH
48 | lxc.autodev: 1
49 | lxc.hook.autodev: bash -c '$HOOK_SCRIPT'
50 | EOF
51 | echo -e "\e[1;33m Finished....Reboot ${CTID} LXC to apply the changes \e[0m"
52 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/config-copy-button.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { cn } from "@/lib/utils";
3 | import { CheckIcon, ClipboardIcon } from "lucide-react";
4 | import { useEffect, useState } from "react";
5 | import { toast } from "sonner";
6 | import { Card } from "./card";
7 |
8 | export default function CodeCopyButton({
9 | children,
10 | }: {
11 | children: React.ReactNode;
12 | }) {
13 | const [hasCopied, setHasCopied] = useState(false);
14 | const isMobile = window.innerWidth <= 640;
15 |
16 | useEffect(() => {
17 | if (hasCopied) {
18 | setTimeout(() => {
19 | setHasCopied(false);
20 | }, 2000);
21 | }
22 | }, [hasCopied]);
23 |
24 | const handleCopy = (type: string, value: any) => {
25 | navigator.clipboard.writeText(value);
26 |
27 | setHasCopied(true);
28 |
29 |
30 | // toast.success(`copied ${type} to clipboard`, {
31 | // icon: ,
32 | // });
33 | };
34 |
35 | return (
36 |
37 |
38 |
39 | {!isMobile && children ? children : "Copy Config File Path"}
40 |
41 | handleCopy("install command", children)}
44 | >
45 | {hasCopied ? (
46 |
47 | ) : (
48 |
49 | )}
50 | Copy
51 |
52 |
53 |
54 | );
55 | }
56 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/number-ticker.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useInView, useMotionValue, useSpring } from "framer-motion";
4 | import { useEffect, useRef } from "react";
5 |
6 | import { cn } from "@/lib/utils";
7 |
8 | export default function NumberTicker({
9 | value,
10 | direction = "up",
11 | delay = 0,
12 | className,
13 | decimalPlaces = 0,
14 | }: {
15 | value: number;
16 | direction?: "up" | "down";
17 | className?: string;
18 | delay?: number; // delay in s
19 | decimalPlaces?: number;
20 | }) {
21 | const ref = useRef(null);
22 | const motionValue = useMotionValue(direction === "down" ? value : 0);
23 | const springValue = useSpring(motionValue, {
24 | damping: 60,
25 | stiffness: 100,
26 | });
27 | const isInView = useInView(ref as React.RefObject, {
28 | once: true,
29 | margin: "0px",
30 | });
31 |
32 | useEffect(() => {
33 | isInView &&
34 | setTimeout(() => {
35 | motionValue.set(direction === "down" ? 0 : value);
36 | }, delay * 1000);
37 | }, [motionValue, isInView, delay, value, direction]);
38 |
39 | useEffect(
40 | () =>
41 | springValue.on("change", (latest) => {
42 | if (ref.current) {
43 | ref.current.textContent = Intl.NumberFormat("en-US", {
44 | minimumFractionDigits: decimalPlaces,
45 | maximumFractionDigits: decimalPlaces,
46 | }).format(Number(latest.toFixed(decimalPlaces)));
47 | }
48 | }),
49 | [springValue, decimalPlaces],
50 | );
51 |
52 | return (
53 |
60 | );
61 | }
62 |
--------------------------------------------------------------------------------
/install/deferred/netbootxyz-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2023 tteck
4 | # Author: tteck (tteckster)
5 | # License: MIT
6 | # https://github.com/tteck/Proxmox/raw/main/LICENSE
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Installing Dependencies"
17 | $STD apt-get install -y ansible git apache2
18 | msg_ok "Installed Dependencies"
19 |
20 | RELEASE=$(curl -sX GET "https://api.github.com/repos/netbootxyz/netboot.xyz/releases/latest" | awk '/tag_name/{print $4;exit}' FS='[""]')
21 | msg_info "Installing netboot.xyz ${RELEASE}"
22 | $STD curl --silent -o ${RELEASE}.tar.gz -L "https://github.com/netbootxyz/netboot.xyz/archive/${RELEASE}.tar.gz"
23 | $STD tar xvzf ${RELEASE}.tar.gz
24 | VER=$(curl -s https://api.github.com/repos/netbootxyz/netboot.xyz/releases/latest |
25 | grep "tag_name" |
26 | awk '{print substr($2, 2, length($2)-3) }')
27 | rm -rf ${RELEASE}.tar.gz
28 | mv netboot.xyz-${VER} /opt/netboot.xyz
29 | msg_ok "Installed netboot.xyz ${RELEASE}"
30 |
31 | msg_info "Creating Service"
32 | service_path="/etc/systemd/system/netbootxyz.service"
33 | echo "[Unit]
34 | Description=netboot.xyz
35 | After=network.target
36 |
37 | [Service]
38 | Restart=always
39 | RestartSec=5
40 | Type=simple
41 | User=root
42 | WorkingDirectory=/opt/netboot.xyz
43 | ExecStart="ansible-playbook" -i inventory site.yml
44 | TimeoutStopSec=30
45 |
46 | [Install]
47 | WantedBy=multi-user.target" >$service_path
48 | $STD sudo systemctl enable --now netbootxyz.service
49 | msg_ok "Created Service"
50 |
51 | motd_ssh
52 | customize
53 |
54 | msg_info "Cleaning up"
55 | $STD apt-get autoremove
56 | $STD apt-get autoclean
57 | msg_ok "Cleaned"
58 |
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 | ## Supported Versions
2 | This project currently supports the following versions of Proxmox VE:
3 |
4 | | Version | Supported |
5 | | ------- | ------------------ |
6 | | 8.3.x | :white_check_mark: |
7 | | 8.2.x | :white_check_mark: |
8 | | 8.1.x | :white_check_mark: |
9 | | 8.0.x | Limited support* ❕|
10 | | < 8.0 | :x: |
11 |
12 | *Version 8.0.x has limited support. Security updates may not be provided for all issues in this version.
13 |
14 | ## Reporting a Vulnerability
15 |
16 | Security vulnerabilities shouldn’t be reported publicly to prevent potential exploitation. Instead, please report any vulnerabilities privately by reaching out directly to us. You can either join our [Discord server](https://discord.gg/UHrpNWGwkH) and send a direct message to a maintainer or contact us via email at contact@community-scripts.org. Be sure to include a detailed description of the vulnerability and the steps to reproduce it. Thank you for helping us keep our project secure!
17 |
18 | Once a vulnerability has been reported, the project maintainers will review it and acknowledge the report within 7 business days. We will then work to address the vulnerability and provide a fix as soon as possible. Depending on the severity of the issue, a patch may be released immediately or included in the next scheduled update.
19 |
20 | Please note that not all reported vulnerabilities may be accepted. The project maintainers reserve the right to decline a vulnerability report if it is deemed to be a low-risk issue or if it conflicts with the project's design or architecture. In such cases, we will provide an explanation for the decision.
21 |
22 | If you have any questions or concerns about this security policy, please don't hesitate to contact the project maintainers.
23 |
24 |
--------------------------------------------------------------------------------
/install/plex-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 tteck
4 | # Author: tteck (tteckster)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source: https://www.plex.tv/
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Setting Up Hardware Acceleration"
17 | $STD apt -y install {va-driver-all,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools}
18 | if [[ -d /dev/dri ]]; then
19 | chgrp video /dev/dri 2>/dev/null || true
20 | chmod 755 /dev/dri 2>/dev/null || true
21 | chmod 660 /dev/dri/* 2>/dev/null || true
22 | $STD adduser "$(id -u -n)" video
23 | $STD adduser "$(id -u -n)" render
24 | fi
25 | msg_ok "Set Up Hardware Acceleration"
26 |
27 | msg_info "Setting Up Plex Media Server Repository"
28 | curl -fsSL https://downloads.plex.tv/plex-keys/PlexSign.key | tee /usr/share/keyrings/PlexSign.asc >/dev/null
29 | cat </etc/apt/sources.list.d/plexmediaserver.sources
30 | Types: deb
31 | URIs: https://downloads.plex.tv/repo/deb/
32 | Suites: public
33 | Components: main
34 | Signed-By: /usr/share/keyrings/PlexSign.asc
35 | EOF
36 | msg_ok "Set Up Plex Media Server Repository"
37 |
38 | msg_info "Installing Plex Media Server"
39 | $STD apt update
40 | $STD apt -o Dpkg::Options::="--force-confold" install -y plexmediaserver
41 | if [[ "$CTTYPE" == "0" ]]; then
42 | sed -i -e 's/^ssl-cert:x:104:plex$/render:x:104:root,plex/' -e 's/^render:x:108:root$/ssl-cert:x:108:plex/' /etc/group
43 | else
44 | sed -i -e 's/^ssl-cert:x:104:plex$/render:x:104:plex/' -e 's/^render:x:108:$/ssl-cert:x:108:/' /etc/group
45 | fi
46 | msg_ok "Installed Plex Media Server"
47 |
48 | motd_ssh
49 | customize
50 | cleanup_lxc
51 |
--------------------------------------------------------------------------------
/ct/deferred/docspell.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (Canbiz)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source: https://github.com/community-scripts/ProxmoxVE
7 |
8 | APP="Docspell"
9 | var_tags="${var_tags:-document}"
10 | var_disk="${var_disk:-7}"
11 | var_cpu="${var_cpu:-4}"
12 | var_ram="${var_ram:-2048}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-12}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 | if [[ ! -d /opt/docspell ]]; then
27 | msg_error "No ${APP} Installation Found!"
28 | exit
29 | fi
30 | msg_info "Updating ${APP} LXC"
31 | cd /opt/bookstack
32 | git config --global --add safe.directory /opt/bookstack >/dev/null 2>&1
33 | git pull origin release >/dev/null 2>&1
34 | composer install --no-interaction --no-dev >/dev/null 2>&1
35 | php artisan migrate --force >/dev/null 2>&1
36 | php artisan cache:clear
37 | php artisan config:clear
38 | php artisan view:clear
39 | msg_ok "Updated Successfully"
40 | exit
41 | msg_error "There is currently no update path available."
42 | }
43 |
44 | start
45 | build_container
46 | description
47 |
48 | msg_ok "Completed Successfully!\n"
49 | echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
50 | echo -e "${INFO}${YW} Access it using the following URL:${CL}"
51 | echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7880${CL}"
52 |
--------------------------------------------------------------------------------
/docs/contribution/CODE-AUDIT.md:
--------------------------------------------------------------------------------
1 |
2 |

3 |
4 | Exploring the Scripts and Steps Involved in an Application LXC Installation
5 |
6 | 1) [adguard.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/adguard.sh): This script collects system parameters. (Also holds the function to update the application.)
7 | 2) [build.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/build.func): Adds user settings and integrates collected information.
8 | 3) [create_lxc.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/create_lxc.sh): Constructs the LXC container.
9 | 4) [adguard-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/install/adguard-install.sh): Executes functions from [install.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/install.func), and installs the application.
10 | 5) [adguard.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/adguard.sh) (again): To display the completion message.
11 |
12 | The installation process uses reusable scripts: [build.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/build.func), [create_lxc.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/create_lxc.sh), and [install.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/install.func), which are not specific to any particular application.
13 |
14 | To gain a better understanding, focus on reviewing [adguard-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/install/adguard-install.sh). This script contains the commands and configurations for installing and configuring AdGuard Home within the LXC container.
15 |
--------------------------------------------------------------------------------
/docs/misc/install.func/INSTALL_FUNC_USAGE_EXAMPLES.md:
--------------------------------------------------------------------------------
1 | # install.func Usage Examples
2 |
3 | Practical examples for using install.func functions in application installation scripts.
4 |
5 | ## Basic Examples
6 |
7 | ### Example 1: Minimal Setup
8 |
9 | ```bash
10 | #!/usr/bin/env bash
11 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
12 |
13 | setting_up_container
14 | network_check
15 | update_os
16 |
17 | # ... application installation ...
18 |
19 | motd_ssh
20 | customize
21 | cleanup_lxc
22 | ```
23 |
24 | ### Example 2: With Error Handling
25 |
26 | ```bash
27 | #!/usr/bin/env bash
28 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
29 |
30 | catch_errors
31 | setting_up_container
32 |
33 | if ! network_check; then
34 | msg_error "Network failed"
35 | exit 1
36 | fi
37 |
38 | if ! update_os; then
39 | msg_error "OS update failed"
40 | exit 1
41 | fi
42 |
43 | # ... continue ...
44 | ```
45 |
46 | ---
47 |
48 | ## Production Examples
49 |
50 | ### Example 3: Full Application Installation
51 |
52 | ```bash
53 | #!/usr/bin/env bash
54 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
55 |
56 | catch_errors
57 | setting_up_container
58 | network_check
59 | update_os
60 |
61 | msg_info "Installing application"
62 | # ... install steps ...
63 | msg_ok "Application installed"
64 |
65 | motd_ssh
66 | customize
67 | cleanup_lxc
68 | ```
69 |
70 | ### Example 4: With IPv6 Support
71 |
72 | ```bash
73 | #!/usr/bin/env bash
74 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
75 |
76 | catch_errors
77 | setting_up_container
78 | verb_ip6
79 | network_check
80 | update_os
81 |
82 | # ... application installation ...
83 |
84 | motd_ssh
85 | customize
86 | cleanup_lxc
87 | ```
88 |
89 | ---
90 |
91 | **Last Updated**: December 2025
92 | **Examples**: Basic and production patterns
93 | **All examples production-ready**
94 |
--------------------------------------------------------------------------------
/.github/CONTRIBUTOR_AND_GUIDES/CODE-AUDIT.md:
--------------------------------------------------------------------------------
1 |
2 |

3 |
4 | Exploring the Scripts and Steps Involved in an Application LXC Installation
5 |
6 | 1) [adguard.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/adguard.sh): This script collects system parameters. (Also holds the function to update the application.)
7 | 2) [build.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/build.func): Adds user settings and integrates collected information.
8 | 3) [create_lxc.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/create_lxc.sh): Constructs the LXC container.
9 | 4) [adguard-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/install/adguard-install.sh): Executes functions from [install.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/install.func), and installs the application.
10 | 5) [adguard.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/adguard.sh) (again): To display the completion message.
11 |
12 | The installation process uses reusable scripts: [build.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/build.func), [create_lxc.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/create_lxc.sh), and [install.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/install.func), which are not specific to any particular application.
13 |
14 | To gain a better understanding, focus on reviewing [adguard-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/install/adguard-install.sh). This script contains the commands and configurations for installing and configuring AdGuard Home within the LXC container.
15 |
--------------------------------------------------------------------------------
/.github/pull_request_template.md:
--------------------------------------------------------------------------------
1 | ## **Scripts wich are clearly AI generated and not further revied by the Author of this PR (in terms of Coding Standards and Script Layout) may be closed without review.**
2 |
3 | ## ✍️ Description
4 |
5 |
6 | ## 🔗 Related PR / Issue
7 |
8 | Link: #
9 |
10 | ## ✅ Prerequisites (**X** in brackets)
11 |
12 | - [ ] **Self-review completed** – Code follows project standards.
13 | - [ ] **Tested thoroughly** – Changes work as expected.
14 | - [ ] **No breaking changes** – Existing functionality remains intact.
15 | - [ ] **No security risks** – No hardcoded secrets, unnecessary privilege escalations, or permission issues.
16 |
17 | ---
18 |
19 | ## 🛠️ Type of Change (**X** in brackets)
20 |
21 | - [ ] 🐞 **Bug fix** – Resolves an issue without breaking functionality.
22 | - [ ] ✨ **New feature** – Adds new, non-breaking functionality.
23 | - [ ] 💥 **Breaking change** – Alters existing functionality in a way that may require updates.
24 | - [ ] 🆕 **New script** – A fully functional and tested script or script set.
25 | - [ ] 🌍 **Website update** – Changes to website-related JSON files or metadata.
26 | - [ ] 🔧 **Refactoring / Code Cleanup** – Improves readability or maintainability without changing functionality.
27 | - [ ] 📝 **Documentation update** – Changes to `README`, `AppName.md`, `CONTRIBUTING.md`, or other docs.
28 |
29 | ---
30 |
31 | ## 🔍 Code & Security Review (**X** in brackets)
32 |
33 | - [ ] **Follows `Code_Audit.md` & `CONTRIBUTING.md` guidelines**
34 | - [ ] **Uses correct script structure (`AppName.sh`, `AppName-install.sh`, `AppName.json`)**
35 | - [ ] **No hardcoded credentials**
36 |
37 |
38 | ## 📋 Additional Information (optional)
39 |
40 |
--------------------------------------------------------------------------------
/frontend/public/json/pixelfed.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Pixelfed",
3 | "slug": "pixelfed",
4 | "categories": [
5 | 17
6 | ],
7 | "date_created": "2024-06-15",
8 | "type": "ct",
9 | "updateable": true,
10 | "privileged": false,
11 | "interface_port": 80,
12 | "documentation": "https://docs.pixelfed.org/",
13 | "config_path": "/opt/pixelfed/.env",
14 | "website": "https://pixelfed.org/",
15 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/pixelfed.webp",
16 | "description": "Pixelfed is a free, ethical, and decentralized photo sharing platform powered by ActivityPub federation. It offers an ad-free, privacy-focused alternative to Instagram with features like Stories, Collections, and photo filters.",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/pixelfed.sh",
21 | "resources": {
22 | "cpu": 2,
23 | "ram": 2048,
24 | "hdd": 10,
25 | "os": "Debian",
26 | "version": "12"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": [
35 | {
36 | "text": "Create admin account with: cd /opt/pixelfed && sudo -u pixelfed php artisan user:create",
37 | "type": "warning"
38 | },
39 | {
40 | "text": "Credentials saved in /root/pixelfed.creds",
41 | "type": "info"
42 | },
43 | {
44 | "text": "ActivityPub federation is enabled by default",
45 | "type": "info"
46 | },
47 | {
48 | "text": "Uses PostgreSQL, Redis (socket), and PHP-FPM",
49 | "type": "info"
50 | }
51 | ]
52 | }
53 |
--------------------------------------------------------------------------------
/frontend/src/components/Footer.tsx:
--------------------------------------------------------------------------------
1 | import { basePath } from "@/config/siteConfig";
2 | import Link from "next/link";
3 | import { FileJson, Server, ExternalLink } from "lucide-react";
4 | import { buttonVariants } from "./ui/button";
5 | import { cn } from "@/lib/utils";
6 |
7 | export default function Footer() {
8 | return (
9 |
10 |
11 |
12 |
13 | Website built by the community. The source code is available on{" "}
14 |
21 | GitHub
22 |
23 | .
24 |
25 |
26 |
27 |
31 | JSON Editor
32 |
33 |
37 | API Data
38 |
39 |
40 |
41 |
42 | );
43 | }
44 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/alert.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 | import { cva, type VariantProps } from "class-variance-authority"
3 |
4 | import { cn } from "@/lib/utils"
5 |
6 | const alertVariants = cva(
7 | "relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",
8 | {
9 | variants: {
10 | variant: {
11 | default: "bg-background text-foreground",
12 | destructive:
13 | "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
14 | },
15 | },
16 | defaultVariants: {
17 | variant: "default",
18 | },
19 | }
20 | )
21 |
22 | const Alert = React.forwardRef<
23 | HTMLDivElement,
24 | React.HTMLAttributes & VariantProps
25 | >(({ className, variant, ...props }, ref) => (
26 |
32 | ))
33 | Alert.displayName = "Alert"
34 |
35 | const AlertTitle = React.forwardRef<
36 | HTMLParagraphElement,
37 | React.HTMLAttributes
38 | >(({ className, ...props }, ref) => (
39 |
44 | ))
45 | AlertTitle.displayName = "AlertTitle"
46 |
47 | const AlertDescription = React.forwardRef<
48 | HTMLParagraphElement,
49 | React.HTMLAttributes
50 | >(({ className, ...props }, ref) => (
51 |
56 | ))
57 | AlertDescription.displayName = "AlertDescription"
58 |
59 | export { Alert, AlertTitle, AlertDescription }
60 |
--------------------------------------------------------------------------------
/frontend/src/app/json-editor/_schemas/schemas.ts:
--------------------------------------------------------------------------------
1 | import { z } from "zod";
2 |
3 | export const InstallMethodSchema = z.object({
4 | type: z.enum(["default", "alpine"], {
5 | errorMap: () => ({ message: "Type must be either 'default' or 'alpine'" })
6 | }),
7 | script: z.string().min(1, "Script content cannot be empty"),
8 | resources: z.object({
9 | cpu: z.number().nullable(),
10 | ram: z.number().nullable(),
11 | hdd: z.number().nullable(),
12 | os: z.string().nullable(),
13 | version: z.string().nullable(),
14 | }),
15 | });
16 |
17 | const NoteSchema = z.object({
18 | text: z.string().min(1, "Note text cannot be empty"),
19 | type: z.string().min(1, "Note type cannot be empty"),
20 | });
21 |
22 | export const ScriptSchema = z.object({
23 | name: z.string().min(1, "Name is required"),
24 | slug: z.string().min(1, "Slug is required"),
25 | categories: z.array(z.number()),
26 | date_created: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in YYYY-MM-DD format").min(1, "Date is required"),
27 | type: z.enum(["vm", "ct", "pve", "addon", "turnkey"], {
28 | errorMap: () => ({ message: "Type must be either 'vm', 'ct', 'pve', 'addon' or 'turnkey'" })
29 | }),
30 | updateable: z.boolean(),
31 | privileged: z.boolean(),
32 | interface_port: z.number().nullable(),
33 | documentation: z.string().nullable(),
34 | website: z.string().url().nullable(),
35 | logo: z.string().url().nullable(),
36 | description: z.string().min(1, "Description is required"),
37 | config_path: z.string(),
38 | install_methods: z.array(InstallMethodSchema).min(1, "At least one install method is required"),
39 | default_credentials: z.object({
40 | username: z.string().nullable(),
41 | password: z.string().nullable(),
42 | }),
43 | notes: z.array(NoteSchema),
44 | });
45 |
46 | export type Script = z.infer;
47 |
--------------------------------------------------------------------------------
/frontend/src/app/api/categories/route.ts:
--------------------------------------------------------------------------------
1 | import { Metadata, Script } from "@/lib/types";
2 | import { promises as fs } from "fs";
3 | import { NextResponse } from "next/server";
4 | import path from "path";
5 |
6 | export const dynamic = "force-static";
7 |
8 | const jsonDir = "public/json";
9 | const metadataFileName = "metadata.json";
10 | const encoding = "utf-8";
11 |
12 | const getMetadata = async () => {
13 | const filePath = path.resolve(jsonDir, metadataFileName);
14 | console.log("TEST");
15 | console.log("FilePath: ", filePath);
16 | const fileContent = await fs.readFile(filePath, encoding);
17 | const metadata: Metadata = JSON.parse(fileContent);
18 | return metadata;
19 | };
20 |
21 | const getScripts = async () => {
22 | const filePaths = (await fs.readdir(jsonDir))
23 | .filter((fileName) => fileName !== metadataFileName)
24 | .map((fileName) => path.resolve(jsonDir, fileName));
25 |
26 | const scripts = await Promise.all(
27 | filePaths.map(async (filePath) => {
28 | const fileContent = await fs.readFile(filePath, encoding);
29 | const script: Script = JSON.parse(fileContent);
30 | return script;
31 | }),
32 | );
33 | return scripts;
34 | };
35 |
36 | export async function GET() {
37 | try {
38 | const metadata = await getMetadata();
39 | const scripts = await getScripts();
40 |
41 | const categories = metadata.categories
42 | .map((category) => {
43 | category.scripts = scripts.filter((script) =>
44 | script.categories?.includes(category.id),
45 | );
46 | return category;
47 | })
48 | .sort((a, b) => a.sort_order - b.sort_order);
49 |
50 | return NextResponse.json(categories);
51 | } catch (error) {
52 | console.error(error as Error);
53 | return NextResponse.json(
54 | { error: "Failed to fetch categories" },
55 | { status: 500 },
56 | );
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/ct/deferred/squirrelserversmanager.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (Canbiz)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
6 | # Source:
7 |
8 | APP="Squirrel Servers Manager"
9 | var_tags="${var_tags:-manager}"
10 | var_disk="${var_disk:-10}"
11 | var_cpu="${var_cpu:-2}"
12 | var_ram="${var_ram:-4096}"
13 | var_os="${var_os:-alpine}"
14 | var_version="${var_version:-3.21}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | variables
18 | color
19 | catch_errors
20 |
21 | function update_script() {
22 | header_info
23 | if [[ ! -d /opt/squirrelserversmanager ]]; then
24 | msg_error "No ${APP} Installation Found!"
25 | exit
26 | fi
27 | msg_info "Updating ${APP}"
28 | pm2 stop "squirrelserversmanager-frontend"
29 | pm2 stop "squirrelserversmanager-backend"
30 | cd /opt/squirrelserversmanager
31 | git pull
32 | cd /opt/squirrelserversmanager/shared-lib
33 | npm ci &>/dev/null
34 | npm run build
35 | cd /opt/squirrelserversmanager/server
36 | npm ci &>/dev/null
37 | npm run build
38 | cd /opt/squirrelserversmanager/client
39 | npm ci &>/dev/null
40 | npm run build
41 | pm2 flush
42 | pm2 restart "squirrelserversmanager-frontend"
43 | pm2 restart "squirrelserversmanager-backend"
44 | msg_ok "Successfully Updated ${APP}"
45 | exit
46 | }
47 |
48 | start
49 | build_container
50 | description
51 | msg_info "Setting Container to Normal Resources"
52 | pct set $CTID -memory 1024
53 | pct set $CTID -cores 1
54 | msg_ok "Set Container to Normal Resources"
55 | msg_ok "Completed Successfully!\n"
56 | echo -e "${APP} should be reachable by going to the following URL.
57 | ${BL}http://${IP}:80${CL} \n"
58 |
--------------------------------------------------------------------------------
/frontend/public/json/ente.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Ente",
3 | "slug": "ente",
4 | "categories": [
5 | 13
6 | ],
7 | "date_created": "2025-11-22",
8 | "type": "ct",
9 | "updateable": false,
10 | "privileged": false,
11 | "config_path": "/opt",
12 | "interface_port": 3000,
13 | "documentation": "https://github.com/ente-io/ente",
14 | "website": "https://ente.io/",
15 | "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/ente-photos.webp",
16 | "description": "Ente is a service that provides a fully open source, end-to-end encrypted platform for you to store your data in the cloud without needing to trust the service provider. On top of this platform, we have built two apps so far: Ente Photos (an alternative to Apple and Google Photos) and Ente Auth (a 2FA alternative to the deprecated Authy).",
17 | "install_methods": [
18 | {
19 | "type": "default",
20 | "script": "ct/ente.sh",
21 | "resources": {
22 | "cpu": 4,
23 | "ram": 4096,
24 | "hdd": 10,
25 | "os": "debian",
26 | "version": "12"
27 | }
28 | }
29 | ],
30 | "default_credentials": {
31 | "username": null,
32 | "password": null
33 | },
34 | "notes": [
35 | {
36 | "text": "Please use `journalctl -u ente-museum.service -n 10` to read logs for the signup verification code",
37 | "type": "info"
38 | },
39 | {
40 | "text": "If you want to use the Ente CLI to add/whitelist admins, please follow the instructions at https://ente.io/help/self-hosting/administration/cli",
41 | "type": "info"
42 | },
43 | {
44 | "text": "To see Museium config: `cat /opt/ente/server/museum.yaml`",
45 | "type": "info"
46 | }
47 | ]
48 | }
49 |
--------------------------------------------------------------------------------
/ct/deferred/maxun.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: MickLesk (CanbiZ)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://github.com/getmaxun/maxun
7 |
8 | APP="Maxun"
9 | var_tags="${var_tags:-automation;scraper}"
10 | var_cpu="${var_cpu:-2}"
11 | var_ram="${var_ram:-4096}"
12 | var_disk="${var_disk:-10}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-12}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 |
27 | if [[ ! -d /opt/maxun ]]; then
28 | msg_error "No ${APP} Installation Found!"
29 | exit
30 | fi
31 |
32 | # NOTE: Updates temporarily disabled due to upstream TypeScript build errors in v0.0.27+
33 | # The mcp-worker.ts file has type instantiation issues that prevent compilation
34 | # Pinned to v0.0.26 until upstream fixes the issue
35 | # See: https://github.com/getmaxun/maxun/releases
36 | msg_warn "Updates are temporarily disabled due to upstream build issues"
37 | msg_info "Current pinned version: v0.0.26"
38 | msg_info "Check https://github.com/getmaxun/maxun/releases for fixes"
39 | exit
40 | }
41 |
42 | start
43 | build_container
44 | description
45 |
46 | msg_ok "Completed Successfully!\n"
47 | echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
48 | echo -e "${INFO}${YW} Access it using the following URL:${CL}"
49 | echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
50 | echo -e "${INFO}${YW} MinIO Console:${CL}"
51 | echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9001${CL}"
52 | echo -e "${INFO}${YW} Credentials saved in:${CL}"
53 | echo -e "${TAB}/root/maxun.creds"
54 |
--------------------------------------------------------------------------------
/ct/opencloud.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: vhsdream
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://opencloud.eu
7 |
8 | APP="OpenCloud"
9 | var_tags="${var_tags:-files;cloud}"
10 | var_cpu="${var_cpu:-2}"
11 | var_ram="${var_ram:-2048}"
12 | var_disk="${var_disk:-20}"
13 | var_os="${var_os:-debian}"
14 | var_version="${var_version:-13}"
15 | var_unprivileged="${var_unprivileged:-1}"
16 |
17 | header_info "$APP"
18 | variables
19 | color
20 | catch_errors
21 |
22 | function update_script() {
23 | header_info
24 | check_container_storage
25 | check_container_resources
26 |
27 | if [[ ! -d /etc/opencloud ]]; then
28 | msg_error "No ${APP} Installation Found!"
29 | exit
30 | fi
31 |
32 | RELEASE="v4.0.0"
33 | if check_for_gh_release "opencloud" "opencloud-eu/opencloud" "${RELEASE}"; then
34 | msg_info "Stopping services"
35 | systemctl stop opencloud opencloud-wopi
36 | msg_ok "Stopped services"
37 |
38 | msg_info "Updating packages"
39 | $STD apt-get update
40 | $STD apt-get dist-upgrade
41 | msg_ok "Updated packages"
42 |
43 | CLEAN_INSTALL=1 fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "${RELEASE}" "/usr/bin" "opencloud-*-linux-amd64"
44 |
45 | msg_info "Starting services"
46 | systemctl start opencloud opencloud-wopi
47 | msg_ok "Started services"
48 | msg_ok "Updated successfully"
49 | fi
50 | exit
51 | }
52 |
53 | start
54 | build_container
55 | description
56 |
57 | msg_ok "Completed Successfully!\n"
58 | echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
59 | echo -e "${INFO}${YW} Access it using the following URL:${CL}"
60 | echo -e "${TAB}${GATEWAY}${BGN}https://${CL}"
61 |
--------------------------------------------------------------------------------
/install/cronmaster-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Copyright (c) 2021-2025 community-scripts ORG
4 | # Author: Slaviša Arežina (tremor021)
5 | # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
6 | # Source: https://github.com/fccview/cronmaster
7 |
8 | source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
9 | color
10 | verb_ip6
11 | catch_errors
12 | setting_up_container
13 | network_check
14 | update_os
15 |
16 | msg_info "Installing dependencies"
17 | $STD apt install -y pciutils
18 | msg_ok "Installed dependencies"
19 |
20 | NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs
21 |
22 | setup_deb822_repo \
23 | "docker" \
24 | "https://download.docker.com/linux/debian/gpg" \
25 | "https://download.docker.com/linux/debian" \
26 | "trixie" \
27 | "stable"
28 | $STD apt install -y docker-ce-cli
29 | fetch_and_deploy_gh_release "cronmaster" "fccview/cronmaster" "tarball"
30 |
31 | msg_info "Setting up CronMaster"
32 | AUTH_PASS="$(openssl rand -base64 18 | cut -c1-13)"
33 | cd /opt/cronmaster
34 | $STD yarn --frozen-lockfile
35 | export NEXT_TELEMETRY_DISABLED=1
36 | $STD yarn build
37 | cat </opt/cronmaster/.env
38 | NODE_ENV=production
39 | APP_URL=
40 | LOCALE=
41 | HOME=
42 | AUTH_PASSWORD=${AUTH_PASS}
43 | PORT=3000
44 | HOSTNAME="0.0.0.0"
45 | NEXT_TELEMETRY_DISABLED=1
46 | EOF
47 | {
48 | echo "CronMaster Credentials:"
49 | echo ""
50 | echo "Password: $AUTH_PASS"
51 | }>>~/cronmaster.creds
52 | msg_ok "Setup CronMaster"
53 |
54 | msg_info "Creating Service"
55 | cat </etc/systemd/system/cronmaster.service
56 | [Unit]
57 | Description=CronMaster Service
58 | After=network.target
59 |
60 | [Service]
61 | EnvironmentFile=/opt/cronmaster/.env
62 | WorkingDirectory=/opt/cronmaster
63 | ExecStart=/usr/bin/yarn start
64 | Restart=always
65 |
66 | [Install]
67 | WantedBy=multi-user.target
68 | EOF
69 | systemctl start --now -q cronmaster
70 | msg_info "Created Service"
71 |
72 | motd_ssh
73 | customize
74 | cleanup_lxc
75 |
--------------------------------------------------------------------------------