mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2025-11-06 03:12:50 +00:00
Compare commits
22 Commits
2025-06-24
...
2025-06-25
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7289c68399 | ||
|
|
4a5ddc8410 | ||
|
|
93808fbd75 | ||
|
|
24394a0947 | ||
|
|
4676eb616c | ||
|
|
e9ae558c25 | ||
|
|
afee37794b | ||
|
|
72e7bda418 | ||
|
|
69e14c8fca | ||
|
|
6394c0cf17 | ||
|
|
d1deffb235 | ||
|
|
ac885f8adb | ||
|
|
8d91a5df5f | ||
|
|
5ad9323944 | ||
|
|
559bf61c31 | ||
|
|
3a391c34fc | ||
|
|
332a96ea03 | ||
|
|
454c574d38 | ||
|
|
2512c828e7 | ||
|
|
a99ecb60ef | ||
|
|
24f22dfecc | ||
|
|
8521e2389b |
32
CHANGELOG.md
32
CHANGELOG.md
@@ -14,8 +14,40 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment.
|
All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment.
|
||||||
|
|
||||||
|
|
||||||
|
## 2025-06-26
|
||||||
|
|
||||||
## 2025-06-25
|
## 2025-06-25
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Docmost: Increase resources [@tremor021](https://github.com/tremor021) ([#5458](https://github.com/community-scripts/ProxmoxVE/pull/5458))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- tools.func: new helper for imagemagick [@MickLesk](https://github.com/MickLesk) ([#5452](https://github.com/community-scripts/ProxmoxVE/pull/5452))
|
||||||
|
- YunoHost: add Update-Function [@MickLesk](https://github.com/MickLesk) ([#5450](https://github.com/community-scripts/ProxmoxVE/pull/5450))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Refactor: Tailscale [@MickLesk](https://github.com/MickLesk) ([#5454](https://github.com/community-scripts/ProxmoxVE/pull/5454))
|
||||||
|
|
||||||
|
### 🌐 Website
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Update Tooltips component to conditionally display updateable status based on item type [@BramSuurdje](https://github.com/BramSuurdje) ([#5461](https://github.com/community-scripts/ProxmoxVE/pull/5461))
|
||||||
|
- Refactor CommandMenu to prevent duplicate scripts across categories [@BramSuurdje](https://github.com/BramSuurdje) ([#5463](https://github.com/community-scripts/ProxmoxVE/pull/5463))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Enhance InstallCommand component to support Gitea as an alternative source for installation scripts. [@BramSuurdje](https://github.com/BramSuurdje) ([#5464](https://github.com/community-scripts/ProxmoxVE/pull/5464))
|
||||||
|
|
||||||
|
- #### 📝 Script Information
|
||||||
|
|
||||||
|
- Website: mark VM's and "OS"-LXC's as updatable [@MickLesk](https://github.com/MickLesk) ([#5453](https://github.com/community-scripts/ProxmoxVE/pull/5453))
|
||||||
|
|
||||||
## 2025-06-24
|
## 2025-06-24
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
|||||||
APP="Docmost"
|
APP="Docmost"
|
||||||
var_tags="${var_tags:-documents}"
|
var_tags="${var_tags:-documents}"
|
||||||
var_cpu="${var_cpu:-3}"
|
var_cpu="${var_cpu:-3}"
|
||||||
var_ram="${var_ram:-3072}"
|
var_ram="${var_ram:-4096}"
|
||||||
var_disk="${var_disk:-7}"
|
var_disk="${var_disk:-8}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-12}"
|
||||||
|
|
||||||
|
|||||||
@@ -20,18 +20,24 @@ color
|
|||||||
catch_errors
|
catch_errors
|
||||||
|
|
||||||
function update_script() {
|
function update_script() {
|
||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
if [[ ! -f /etc/apt/trusted.gpg.d/php.gpg ]]; then
|
if [[ ! -f /etc/apt/trusted.gpg.d/php.gpg ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
|
||||||
fi
|
|
||||||
msg_info "Updating $APP LXC"
|
|
||||||
$STD apt-get update
|
|
||||||
$STD apt-get -y upgrade
|
|
||||||
msg_ok "Updated $APP LXC"
|
|
||||||
exit
|
exit
|
||||||
|
fi
|
||||||
|
msg_info "Updating OS"
|
||||||
|
$STD apt-get update
|
||||||
|
$STD apt-get -y upgrade
|
||||||
|
msg_ok "Updated OS"
|
||||||
|
|
||||||
|
msg_info "Updating $APP LXC"
|
||||||
|
$STD yunohost tools update
|
||||||
|
$STD yunohost tools upgrade system
|
||||||
|
$STD yunohost tools upgrade apps
|
||||||
|
msg_ok "Updated $APP LXC"
|
||||||
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
start
|
start
|
||||||
|
|||||||
4
frontend/public/json/add-tailscale-lxc.json
generated
4
frontend/public/json/add-tailscale-lxc.json
generated
@@ -32,10 +32,6 @@
|
|||||||
"password": null
|
"password": null
|
||||||
},
|
},
|
||||||
"notes": [
|
"notes": [
|
||||||
{
|
|
||||||
"text": "Only supported on Debian 12 LXCs",
|
|
||||||
"type": "warning"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"text": "After the script finishes, reboot the LXC then run `tailscale up` in the LXC console",
|
"text": "After the script finishes, reboot the LXC then run `tailscale up` in the LXC console",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
|
|||||||
2
frontend/public/json/alpine.json
generated
2
frontend/public/json/alpine.json
generated
@@ -6,7 +6,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "ct",
|
"type": "ct",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": null,
|
"interface_port": null,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
2
frontend/public/json/archlinux-vm.json
generated
2
frontend/public/json/archlinux-vm.json
generated
@@ -6,7 +6,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2025-01-27",
|
"date_created": "2025-01-27",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": null,
|
"interface_port": null,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
2
frontend/public/json/debian-vm.json
generated
2
frontend/public/json/debian-vm.json
generated
@@ -6,7 +6,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": null,
|
"interface_port": null,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
66
frontend/public/json/debian.json
generated
66
frontend/public/json/debian.json
generated
@@ -1,35 +1,35 @@
|
|||||||
{
|
{
|
||||||
"name": "Debian",
|
"name": "Debian",
|
||||||
"slug": "debian",
|
"slug": "debian",
|
||||||
"categories": [
|
"categories": [
|
||||||
2
|
2
|
||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "ct",
|
"type": "ct",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": null,
|
"interface_port": null,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
"website": "https://www.debian.org/",
|
"website": "https://www.debian.org/",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/debian.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/debian.webp",
|
||||||
"config_path": "",
|
"config_path": "",
|
||||||
"description": "Debian Linux is a distribution that emphasizes free software. It supports many hardware platforms.",
|
"description": "Debian Linux is a distribution that emphasizes free software. It supports many hardware platforms.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
"script": "ct/debian.sh",
|
"script": "ct/debian.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 1,
|
"cpu": 1,
|
||||||
"ram": 512,
|
"ram": 512,
|
||||||
"hdd": 2,
|
"hdd": 2,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "12"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"default_credentials": {
|
"default_credentials": {
|
||||||
"username": null,
|
"username": null,
|
||||||
"password": null
|
"password": null
|
||||||
},
|
},
|
||||||
"notes": []
|
"notes": []
|
||||||
}
|
}
|
||||||
|
|||||||
2
frontend/public/json/docker-vm.json
generated
2
frontend/public/json/docker-vm.json
generated
@@ -7,7 +7,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2025-01-20",
|
"date_created": "2025-01-20",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": null,
|
"interface_port": null,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
4
frontend/public/json/docmost.json
generated
4
frontend/public/json/docmost.json
generated
@@ -20,8 +20,8 @@
|
|||||||
"script": "ct/docmost.sh",
|
"script": "ct/docmost.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 3,
|
"cpu": 3,
|
||||||
"ram": 3072,
|
"ram": 4096,
|
||||||
"hdd": 7,
|
"hdd": 8,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "12"
|
||||||
}
|
}
|
||||||
|
|||||||
82
frontend/public/json/haos-vm.json
generated
82
frontend/public/json/haos-vm.json
generated
@@ -1,44 +1,44 @@
|
|||||||
{
|
{
|
||||||
"name": "Home Assistant OS",
|
"name": "Home Assistant OS",
|
||||||
"slug": "haos-vm",
|
"slug": "haos-vm",
|
||||||
"categories": [
|
"categories": [
|
||||||
16
|
16
|
||||||
],
|
],
|
||||||
"date_created": "2024-04-29",
|
"date_created": "2024-04-29",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 8123,
|
"interface_port": 8123,
|
||||||
"documentation": "https://www.home-assistant.io/docs/",
|
"documentation": "https://www.home-assistant.io/docs/",
|
||||||
"website": "https://www.home-assistant.io/",
|
"website": "https://www.home-assistant.io/",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/home-assistant.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/home-assistant.webp",
|
||||||
"config_path": "",
|
"config_path": "",
|
||||||
"description": "This script automates the process of creating a Virtual Machine (VM) using the official KVM (qcow2) disk image provided by the Home Assistant Team. It involves finding, downloading, and extracting the image, defining user-defined settings, importing and attaching the disk, setting the boot order, and starting the VM. It supports various storage types, and does not involve any hidden installations. After the script completes, click on the VM, then on the Summary tab to find the VM IP.",
|
"description": "This script automates the process of creating a Virtual Machine (VM) using the official KVM (qcow2) disk image provided by the Home Assistant Team. It involves finding, downloading, and extracting the image, defining user-defined settings, importing and attaching the disk, setting the boot order, and starting the VM. It supports various storage types, and does not involve any hidden installations. After the script completes, click on the VM, then on the Summary tab to find the VM IP.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
"script": "vm/haos-vm.sh",
|
"script": "vm/haos-vm.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 2,
|
"cpu": 2,
|
||||||
"ram": 4096,
|
"ram": 4096,
|
||||||
"hdd": 32,
|
"hdd": 32,
|
||||||
"os": null,
|
"os": null,
|
||||||
"version": null
|
"version": null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"default_credentials": {
|
"default_credentials": {
|
||||||
"username": null,
|
"username": null,
|
||||||
"password": null
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "The disk must have a minimum size of 32GB and its size cannot be changed during the creation of the VM.",
|
||||||
|
"type": "warning"
|
||||||
},
|
},
|
||||||
"notes": [
|
{
|
||||||
{
|
"text": "After the script completes, click on the VM, then on the Summary or Console tab to find the VM IP.",
|
||||||
"text": "The disk must have a minimum size of 32GB and its size cannot be changed during the creation of the VM.",
|
"type": "info"
|
||||||
"type": "warning"
|
}
|
||||||
},
|
]
|
||||||
{
|
|
||||||
"text": "After the script completes, click on the VM, then on the Summary or Console tab to find the VM IP.",
|
|
||||||
"type": "info"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
2
frontend/public/json/mikrotik-routeros.json
generated
2
frontend/public/json/mikrotik-routeros.json
generated
@@ -7,7 +7,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": null,
|
"interface_port": null,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
2
frontend/public/json/nextcloud-vm.json
generated
2
frontend/public/json/nextcloud-vm.json
generated
@@ -6,7 +6,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2023-11-14",
|
"date_created": "2023-11-14",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 80,
|
"interface_port": 80,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
2
frontend/public/json/openwrt.json
generated
2
frontend/public/json/openwrt.json
generated
@@ -7,7 +7,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": null,
|
"interface_port": null,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
2
frontend/public/json/opnsense-vm.json
generated
2
frontend/public/json/opnsense-vm.json
generated
@@ -7,7 +7,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2025-02-11",
|
"date_created": "2025-02-11",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 443,
|
"interface_port": 443,
|
||||||
"documentation": "https://docs.opnsense.org/",
|
"documentation": "https://docs.opnsense.org/",
|
||||||
|
|||||||
2
frontend/public/json/owncloud-vm.json
generated
2
frontend/public/json/owncloud-vm.json
generated
@@ -6,7 +6,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 80,
|
"interface_port": 80,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
76
frontend/public/json/pimox-haos-vm.json
generated
76
frontend/public/json/pimox-haos-vm.json
generated
@@ -1,40 +1,40 @@
|
|||||||
{
|
{
|
||||||
"name": "PiMox HAOS",
|
"name": "PiMox HAOS",
|
||||||
"slug": "pimox-haos-vm",
|
"slug": "pimox-haos-vm",
|
||||||
"categories": [
|
"categories": [
|
||||||
16
|
16
|
||||||
],
|
],
|
||||||
"date_created": "2024-04-29",
|
"date_created": "2024-04-29",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 8123,
|
"interface_port": 8123,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
"website": "https://github.com/jiangcuo/Proxmox-Port",
|
"website": "https://github.com/jiangcuo/Proxmox-Port",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/home-assistant.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/home-assistant.webp",
|
||||||
"config_path": "",
|
"config_path": "",
|
||||||
"description": "The script automates the manual process of finding, downloading and extracting the aarch64 (qcow2) disk image provided by the Home Assistant Team, creating a VM with user defined settings, importing and attaching the disk, setting the boot order and starting the VM.",
|
"description": "The script automates the manual process of finding, downloading and extracting the aarch64 (qcow2) disk image provided by the Home Assistant Team, creating a VM with user defined settings, importing and attaching the disk, setting the boot order and starting the VM.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
"script": "vm/pimox-haos-vm.sh",
|
"script": "vm/pimox-haos-vm.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 2,
|
"cpu": 2,
|
||||||
"ram": 4096,
|
"ram": 4096,
|
||||||
"hdd": 32,
|
"hdd": 32,
|
||||||
"os": null,
|
"os": null,
|
||||||
"version": null
|
"version": null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"default_credentials": {
|
"default_credentials": {
|
||||||
"username": null,
|
"username": null,
|
||||||
"password": null
|
"password": null
|
||||||
},
|
},
|
||||||
"notes": [
|
"notes": [
|
||||||
{
|
{
|
||||||
"text": "After the script completes, click on the VM, then on the Summary or Console tab to find the VM IP.",
|
"text": "After the script completes, click on the VM, then on the Summary or Console tab to find the VM IP.",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
2
frontend/public/json/postgresql.json
generated
2
frontend/public/json/postgresql.json
generated
@@ -6,7 +6,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "ct",
|
"type": "ct",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 5432,
|
"interface_port": 5432,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
66
frontend/public/json/ubuntu.json
generated
66
frontend/public/json/ubuntu.json
generated
@@ -1,35 +1,35 @@
|
|||||||
{
|
{
|
||||||
"name": "Ubuntu",
|
"name": "Ubuntu",
|
||||||
"slug": "ubuntu",
|
"slug": "ubuntu",
|
||||||
"categories": [
|
"categories": [
|
||||||
2
|
2
|
||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "ct",
|
"type": "ct",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": null,
|
"interface_port": null,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
"website": "https://ubuntu.com/",
|
"website": "https://ubuntu.com/",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/ubuntu.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/ubuntu.webp",
|
||||||
"config_path": "",
|
"config_path": "",
|
||||||
"description": "Ubuntu is a distribution based on Debian, designed to have regular releases and a consistent user experience.",
|
"description": "Ubuntu is a distribution based on Debian, designed to have regular releases and a consistent user experience.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
"script": "ct/ubuntu.sh",
|
"script": "ct/ubuntu.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 1,
|
"cpu": 1,
|
||||||
"ram": 512,
|
"ram": 512,
|
||||||
"hdd": 2,
|
"hdd": 2,
|
||||||
"os": "ubuntu",
|
"os": "ubuntu",
|
||||||
"version": "24.04"
|
"version": "24.04"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"default_credentials": {
|
"default_credentials": {
|
||||||
"username": null,
|
"username": null,
|
||||||
"password": null
|
"password": null
|
||||||
},
|
},
|
||||||
"notes": []
|
"notes": []
|
||||||
}
|
}
|
||||||
|
|||||||
2
frontend/public/json/ubuntu2204-vm.json
generated
2
frontend/public/json/ubuntu2204-vm.json
generated
@@ -6,7 +6,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": null,
|
"interface_port": null,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
2
frontend/public/json/ubuntu2404-vm.json
generated
2
frontend/public/json/ubuntu2404-vm.json
generated
@@ -6,7 +6,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": null,
|
"interface_port": null,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
2
frontend/public/json/ubuntu2410-vm.json
generated
2
frontend/public/json/ubuntu2410-vm.json
generated
@@ -6,7 +6,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2025-01-24",
|
"date_created": "2025-01-24",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": null,
|
"interface_port": null,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
2
frontend/public/json/ubuntu2504-vm.json
generated
2
frontend/public/json/ubuntu2504-vm.json
generated
@@ -6,7 +6,7 @@
|
|||||||
],
|
],
|
||||||
"date_created": "2025-06-19",
|
"date_created": "2025-06-19",
|
||||||
"type": "vm",
|
"type": "vm",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": null,
|
"interface_port": null,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
|
|||||||
196
frontend/public/json/versions.json
generated
196
frontend/public/json/versions.json
generated
@@ -1,18 +1,108 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"name": "mongodb/mongo",
|
||||||
|
"version": "r8.1.2-rc1",
|
||||||
|
"date": "2025-06-25T22:42:04Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "rcourtman/Pulse",
|
||||||
|
"version": "v3.32.0",
|
||||||
|
"date": "2025-06-25T22:27:01Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "gristlabs/grist-core",
|
||||||
|
"version": "v1.6.1",
|
||||||
|
"date": "2025-06-25T21:19:25Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "coder/code-server",
|
||||||
|
"version": "v4.101.2",
|
||||||
|
"date": "2025-06-25T21:18:52Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "msgbyte/tianji",
|
||||||
|
"version": "v1.22.4",
|
||||||
|
"date": "2025-06-25T20:46:20Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "meilisearch/meilisearch",
|
||||||
|
"version": "prototype-tmp-failing-upgrade-0",
|
||||||
|
"date": "2025-06-25T19:51:55Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "home-assistant/core",
|
||||||
|
"version": "2025.6.3",
|
||||||
|
"date": "2025-06-24T13:00:12Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "firefly-iii/firefly-iii",
|
||||||
|
"version": "v6.2.18",
|
||||||
|
"date": "2025-06-20T04:45:37Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ollama/ollama",
|
||||||
|
"version": "v0.9.4-citest0",
|
||||||
|
"date": "2025-06-25T17:44:00Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "influxdata/influxdb",
|
||||||
|
"version": "v3.2.0",
|
||||||
|
"date": "2025-06-25T17:31:48Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "wavelog/wavelog",
|
||||||
|
"version": "2.0.5",
|
||||||
|
"date": "2025-06-25T14:53:31Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "jenkinsci/jenkins",
|
||||||
|
"version": "jenkins-2.504.3",
|
||||||
|
"date": "2025-06-25T14:43:01Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "bunkerity/bunkerweb",
|
||||||
|
"version": "testing",
|
||||||
|
"date": "2025-06-16T18:10:42Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "cockpit-project/cockpit",
|
||||||
|
"version": "341",
|
||||||
|
"date": "2025-06-25T11:49:28Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nzbgetcom/nzbget",
|
||||||
|
"version": "v25.0",
|
||||||
|
"date": "2025-05-12T09:12:04Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mattermost/mattermost",
|
||||||
|
"version": "v9.11.17",
|
||||||
|
"date": "2025-06-18T08:12:05Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "n8n-io/n8n",
|
||||||
|
"version": "n8n@1.100.0",
|
||||||
|
"date": "2025-06-23T12:48:35Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jackett/Jackett",
|
||||||
|
"version": "v0.22.2054",
|
||||||
|
"date": "2025-06-25T05:54:03Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "moghtech/komodo",
|
||||||
|
"version": "v1.18.4",
|
||||||
|
"date": "2025-06-25T00:06:56Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "duplicati/duplicati",
|
"name": "duplicati/duplicati",
|
||||||
"version": "v2.1.0.120-2.1.0.120_canary_2025-06-24",
|
"version": "v2.1.0.120-2.1.0.120_canary_2025-06-24",
|
||||||
"date": "2025-06-24T22:39:50Z"
|
"date": "2025-06-24T22:39:50Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "jenkinsci/jenkins",
|
"name": "keycloak/keycloak",
|
||||||
"version": "jenkins-2.516",
|
"version": "26.2.5",
|
||||||
"date": "2025-06-24T21:06:15Z"
|
"date": "2025-05-28T06:49:43Z"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ollama/ollama",
|
|
||||||
"version": "v0.9.3-rc1",
|
|
||||||
"date": "2025-06-24T20:26:55Z"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "evcc-io/evcc",
|
"name": "evcc-io/evcc",
|
||||||
@@ -39,56 +129,26 @@
|
|||||||
"version": "v2.37.3",
|
"version": "v2.37.3",
|
||||||
"date": "2025-06-24T14:05:33Z"
|
"date": "2025-06-24T14:05:33Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "influxdata/influxdb",
|
|
||||||
"version": "v3.2.0",
|
|
||||||
"date": "2025-06-24T13:20:53Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Checkmk/checkmk",
|
"name": "Checkmk/checkmk",
|
||||||
"version": "v2.4.0p5",
|
"version": "v2.4.0p5",
|
||||||
"date": "2025-06-24T13:06:53Z"
|
"date": "2025-06-24T13:06:53Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "home-assistant/core",
|
|
||||||
"version": "2025.6.3",
|
|
||||||
"date": "2025-06-24T13:00:12Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "rcourtman/Pulse",
|
|
||||||
"version": "v3.31.2",
|
|
||||||
"date": "2025-06-24T09:45:34Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "fallenbagel/jellyseerr",
|
"name": "fallenbagel/jellyseerr",
|
||||||
"version": "preview-fix-proxy-axios",
|
"version": "preview-fix-proxy-axios",
|
||||||
"date": "2025-06-24T08:50:22Z"
|
"date": "2025-06-24T08:50:22Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Jackett/Jackett",
|
|
||||||
"version": "v0.22.2052",
|
|
||||||
"date": "2025-06-24T05:59:30Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "wazuh/wazuh",
|
"name": "wazuh/wazuh",
|
||||||
"version": "coverity-w26-4.13.0",
|
"version": "coverity-w26-4.13.0",
|
||||||
"date": "2025-06-24T02:02:34Z"
|
"date": "2025-06-24T02:02:34Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "meilisearch/meilisearch",
|
|
||||||
"version": "prototype-incremental-vector-store-1",
|
|
||||||
"date": "2025-06-23T21:37:47Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "minio/minio",
|
"name": "minio/minio",
|
||||||
"version": "RELEASE.2025-06-13T11-33-47Z",
|
"version": "RELEASE.2025-06-13T11-33-47Z",
|
||||||
"date": "2025-06-23T20:58:42Z"
|
"date": "2025-06-23T20:58:42Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "keycloak/keycloak",
|
|
||||||
"version": "26.2.5",
|
|
||||||
"date": "2025-05-28T06:49:43Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "esphome/esphome",
|
"name": "esphome/esphome",
|
||||||
"version": "2025.6.1",
|
"version": "2025.6.1",
|
||||||
@@ -104,26 +164,11 @@
|
|||||||
"version": "pmm-6401-v1.120.0",
|
"version": "pmm-6401-v1.120.0",
|
||||||
"date": "2025-06-23T15:12:12Z"
|
"date": "2025-06-23T15:12:12Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "n8n-io/n8n",
|
|
||||||
"version": "n8n@1.98.2",
|
|
||||||
"date": "2025-06-18T18:20:16Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Graylog2/graylog2-server",
|
"name": "Graylog2/graylog2-server",
|
||||||
"version": "6.3.0-rc.2",
|
"version": "6.3.0-rc.2",
|
||||||
"date": "2025-06-23T11:31:38Z"
|
"date": "2025-06-23T11:31:38Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "mattermost/mattermost",
|
|
||||||
"version": "v9.11.17",
|
|
||||||
"date": "2025-06-18T08:12:05Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "firefly-iii/firefly-iii",
|
|
||||||
"version": "v6.2.18",
|
|
||||||
"date": "2025-06-20T04:45:37Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "gotson/komga",
|
"name": "gotson/komga",
|
||||||
"version": "1.22.0",
|
"version": "1.22.0",
|
||||||
@@ -149,11 +194,6 @@
|
|||||||
"version": "v1.4.1",
|
"version": "v1.4.1",
|
||||||
"date": "2025-06-22T19:38:08Z"
|
"date": "2025-06-22T19:38:08Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "msgbyte/tianji",
|
|
||||||
"version": "v1.22.3",
|
|
||||||
"date": "2025-06-22T18:29:00Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "clusterzx/paperless-ai",
|
"name": "clusterzx/paperless-ai",
|
||||||
"version": "v3.0.7",
|
"version": "v3.0.7",
|
||||||
@@ -204,11 +244,6 @@
|
|||||||
"version": "0.50.4",
|
"version": "0.50.4",
|
||||||
"date": "2025-06-21T07:47:02Z"
|
"date": "2025-06-21T07:47:02Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "coder/code-server",
|
|
||||||
"version": "v4.101.1",
|
|
||||||
"date": "2025-06-21T02:47:08Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "go-gitea/gitea",
|
"name": "go-gitea/gitea",
|
||||||
"version": "v1.24.2",
|
"version": "v1.24.2",
|
||||||
@@ -229,26 +264,11 @@
|
|||||||
"version": "v1.25.0",
|
"version": "v1.25.0",
|
||||||
"date": "2025-06-20T19:15:43Z"
|
"date": "2025-06-20T19:15:43Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "mongodb/mongo",
|
|
||||||
"version": "r8.1.2-rc0",
|
|
||||||
"date": "2025-06-20T17:35:38Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "nzbgetcom/nzbget",
|
|
||||||
"version": "v25.0",
|
|
||||||
"date": "2025-05-12T09:12:04Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Sonarr/Sonarr",
|
"name": "Sonarr/Sonarr",
|
||||||
"version": "v4.0.15.2941",
|
"version": "v4.0.15.2941",
|
||||||
"date": "2025-06-20T17:20:54Z"
|
"date": "2025-06-20T17:20:54Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "bunkerity/bunkerweb",
|
|
||||||
"version": "testing",
|
|
||||||
"date": "2025-06-16T18:10:42Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "zabbix/zabbix",
|
"name": "zabbix/zabbix",
|
||||||
"version": "7.2.9",
|
"version": "7.2.9",
|
||||||
@@ -424,11 +444,6 @@
|
|||||||
"version": "15.2",
|
"version": "15.2",
|
||||||
"date": "2025-04-14T15:37:12Z"
|
"date": "2025-04-14T15:37:12Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "moghtech/komodo",
|
|
||||||
"version": "v1.18.3",
|
|
||||||
"date": "2025-06-16T07:03:46Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "jellyfin/jellyfin",
|
"name": "jellyfin/jellyfin",
|
||||||
"version": "v10.10.7",
|
"version": "v10.10.7",
|
||||||
@@ -649,11 +664,6 @@
|
|||||||
"version": "v4.1.1",
|
"version": "v4.1.1",
|
||||||
"date": "2025-06-04T19:10:05Z"
|
"date": "2025-06-04T19:10:05Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "cockpit-project/cockpit",
|
|
||||||
"version": "340",
|
|
||||||
"date": "2025-06-04T16:41:44Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "intri-in/manage-my-damn-life-nextjs",
|
"name": "intri-in/manage-my-damn-life-nextjs",
|
||||||
"version": "v0.7.1",
|
"version": "v0.7.1",
|
||||||
@@ -714,11 +724,6 @@
|
|||||||
"version": "0.26.3",
|
"version": "0.26.3",
|
||||||
"date": "2025-05-29T21:18:15Z"
|
"date": "2025-05-29T21:18:15Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "gristlabs/grist-core",
|
|
||||||
"version": "v1.6.0",
|
|
||||||
"date": "2025-05-29T19:11:21Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "navidrome/navidrome",
|
"name": "navidrome/navidrome",
|
||||||
"version": "v0.56.1",
|
"version": "v0.56.1",
|
||||||
@@ -824,11 +829,6 @@
|
|||||||
"version": "v1.1.1",
|
"version": "v1.1.1",
|
||||||
"date": "2025-05-17T10:10:36Z"
|
"date": "2025-05-17T10:10:36Z"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "wavelog/wavelog",
|
|
||||||
"version": "2.0.4",
|
|
||||||
"date": "2025-05-16T15:09:53Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Dolibarr/dolibarr",
|
"name": "Dolibarr/dolibarr",
|
||||||
"version": "18.0.7",
|
"version": "18.0.7",
|
||||||
|
|||||||
76
frontend/public/json/yunohost.json
generated
76
frontend/public/json/yunohost.json
generated
@@ -1,40 +1,40 @@
|
|||||||
{
|
{
|
||||||
"name": "YunoHost",
|
"name": "YunoHost",
|
||||||
"slug": "yunohost",
|
"slug": "yunohost",
|
||||||
"categories": [
|
"categories": [
|
||||||
2
|
2
|
||||||
],
|
],
|
||||||
"date_created": "2024-05-02",
|
"date_created": "2024-05-02",
|
||||||
"type": "ct",
|
"type": "ct",
|
||||||
"updateable": false,
|
"updateable": true,
|
||||||
"privileged": false,
|
"privileged": false,
|
||||||
"interface_port": 80,
|
"interface_port": 80,
|
||||||
"documentation": null,
|
"documentation": null,
|
||||||
"website": "https://yunohost.org/",
|
"website": "https://yunohost.org/",
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/yunohost.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/yunohost.webp",
|
||||||
"config_path": "",
|
"config_path": "",
|
||||||
"description": "YunoHost is an operating system aiming for the simplest administration of a server, and therefore democratize self-hosting, while making sure it stays reliable, secure, ethical and lightweight.",
|
"description": "YunoHost is an operating system aiming for the simplest administration of a server, and therefore democratize self-hosting, while making sure it stays reliable, secure, ethical and lightweight.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
"script": "ct/yunohost.sh",
|
"script": "ct/yunohost.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 2,
|
"cpu": 2,
|
||||||
"ram": 2048,
|
"ram": 2048,
|
||||||
"hdd": 20,
|
"hdd": 20,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "12"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"default_credentials": {
|
"default_credentials": {
|
||||||
"username": null,
|
"username": null,
|
||||||
"password": null
|
"password": null
|
||||||
},
|
},
|
||||||
"notes": [
|
"notes": [
|
||||||
{
|
{
|
||||||
"text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.",
|
"text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.",
|
||||||
"type": "warning"
|
"type": "warning"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,20 @@
|
|||||||
import CodeCopyButton from "@/components/ui/code-copy-button";
|
import CodeCopyButton from "@/components/ui/code-copy-button";
|
||||||
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
||||||
|
import { Alert, AlertDescription } from "@/components/ui/alert";
|
||||||
|
import { Info } from "lucide-react";
|
||||||
import { basePath } from "@/config/siteConfig";
|
import { basePath } from "@/config/siteConfig";
|
||||||
import { Script } from "@/lib/types";
|
import { Script } from "@/lib/types";
|
||||||
import { getDisplayValueFromType } from "../ScriptInfoBlocks";
|
import { getDisplayValueFromType } from "../ScriptInfoBlocks";
|
||||||
|
|
||||||
const getInstallCommand = (scriptPath = "", isAlpine = false) => {
|
const getInstallCommand = (scriptPath = "", isAlpine = false, useGitea = false) => {
|
||||||
const url = `https://raw.githubusercontent.com/community-scripts/${basePath}/main/${scriptPath}`;
|
const githubUrl = `https://raw.githubusercontent.com/community-scripts/${basePath}/main/${scriptPath}`;
|
||||||
return isAlpine ? `bash -c "$(curl -fsSL ${url})"` : `bash -c "$(curl -fsSL ${url})"`;
|
const giteaUrl = `https://git.community-scripts.org/community-scripts/${basePath}/raw/branch/main/${scriptPath}`;
|
||||||
|
const url = useGitea ? giteaUrl : githubUrl;
|
||||||
|
return `bash -c "$(curl -fsSL ${url})"`;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function InstallCommand({ item }: { item: Script }) {
|
export default function InstallCommand({ item }: { item: Script }) {
|
||||||
const alpineScript = item.install_methods.find((method) => method.type === "alpine");
|
const alpineScript = item.install_methods.find((method) => method.type === "alpine");
|
||||||
|
|
||||||
const defaultScript = item.install_methods.find((method) => method.type === "default");
|
const defaultScript = item.install_methods.find((method) => method.type === "default");
|
||||||
|
|
||||||
const renderInstructions = (isAlpine = false) => (
|
const renderInstructions = (isAlpine = false) => (
|
||||||
@@ -49,9 +52,20 @@ export default function InstallCommand({ item }: { item: Script }) {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
const renderGiteaInfo = () => (
|
||||||
<div className="p-4">
|
<Alert className="mt-3 mb-3">
|
||||||
{alpineScript ? (
|
<Info className="h-4 w-4" />
|
||||||
|
<AlertDescription className="text-sm">
|
||||||
|
<strong>When to use Gitea:</strong> GitHub may have issues including slow connections, delayed updates after bug
|
||||||
|
fixes, no IPv6 support, API rate limits (60/hour). Use our Gitea mirror as a reliable alternative when
|
||||||
|
experiencing these issues.
|
||||||
|
</AlertDescription>
|
||||||
|
</Alert>
|
||||||
|
);
|
||||||
|
|
||||||
|
const renderScriptTabs = (useGitea = false) => {
|
||||||
|
if (alpineScript) {
|
||||||
|
return (
|
||||||
<Tabs defaultValue="default" className="mt-2 w-full max-w-4xl">
|
<Tabs defaultValue="default" className="mt-2 w-full max-w-4xl">
|
||||||
<TabsList>
|
<TabsList>
|
||||||
<TabsTrigger value="default">Default</TabsTrigger>
|
<TabsTrigger value="default">Default</TabsTrigger>
|
||||||
@@ -59,19 +73,40 @@ export default function InstallCommand({ item }: { item: Script }) {
|
|||||||
</TabsList>
|
</TabsList>
|
||||||
<TabsContent value="default">
|
<TabsContent value="default">
|
||||||
{renderInstructions()}
|
{renderInstructions()}
|
||||||
<CodeCopyButton>{getInstallCommand(defaultScript?.script)}</CodeCopyButton>
|
<CodeCopyButton>{getInstallCommand(defaultScript?.script, false, useGitea)}</CodeCopyButton>
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
<TabsContent value="alpine">
|
<TabsContent value="alpine">
|
||||||
{renderInstructions(true)}
|
{renderInstructions(true)}
|
||||||
<CodeCopyButton>{getInstallCommand(alpineScript.script, true)}</CodeCopyButton>
|
<CodeCopyButton>{getInstallCommand(alpineScript.script, true, useGitea)}</CodeCopyButton>
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
) : defaultScript?.script ? (
|
);
|
||||||
|
} else if (defaultScript?.script) {
|
||||||
|
return (
|
||||||
<>
|
<>
|
||||||
{renderInstructions()}
|
{renderInstructions()}
|
||||||
<CodeCopyButton>{getInstallCommand(defaultScript.script)}</CodeCopyButton>
|
<CodeCopyButton>{getInstallCommand(defaultScript.script, false, useGitea)}</CodeCopyButton>
|
||||||
</>
|
</>
|
||||||
) : null}
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="p-4">
|
||||||
|
<Tabs defaultValue="github" className="w-full max-w-4xl">
|
||||||
|
<TabsList>
|
||||||
|
<TabsTrigger value="github">GitHub</TabsTrigger>
|
||||||
|
<TabsTrigger value="gitea">Gitea</TabsTrigger>
|
||||||
|
</TabsList>
|
||||||
|
<TabsContent value="github">
|
||||||
|
{renderScriptTabs(false)}
|
||||||
|
</TabsContent>
|
||||||
|
<TabsContent value="gitea">
|
||||||
|
{renderGiteaInfo()}
|
||||||
|
{renderScriptTabs(true)}
|
||||||
|
</TabsContent>
|
||||||
|
</Tabs>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -34,14 +34,14 @@ export default function Tooltips({ item }: { item: Script }) {
|
|||||||
{item.privileged && (
|
{item.privileged && (
|
||||||
<TooltipBadge variant="warning" label="Privileged" content="This script will be run in a privileged LXC" />
|
<TooltipBadge variant="warning" label="Privileged" content="This script will be run in a privileged LXC" />
|
||||||
)}
|
)}
|
||||||
{item.updateable && (
|
{(item.updateable || item.type !== "pve") && (
|
||||||
<TooltipBadge
|
<TooltipBadge
|
||||||
variant="success"
|
variant="success"
|
||||||
label="Updateable"
|
label="Updateable"
|
||||||
content={`To Update ${item.name}, run the command below (or type update) in the LXC Console.`}
|
content={`To Update ${item.name}, run the command below (or type update) in the LXC Console.`}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{!item.updateable && <TooltipBadge variant="failure" label="Not Updateable" />}
|
{!item.updateable && item.type !== "pve" && <TooltipBadge variant="failure" label="Not Updateable" />}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,34 +134,54 @@ export default function CommandMenu() {
|
|||||||
<CommandInput placeholder="Search for a script..." />
|
<CommandInput placeholder="Search for a script..." />
|
||||||
<CommandList>
|
<CommandList>
|
||||||
<CommandEmpty>{isLoading ? "Loading..." : "No scripts found."}</CommandEmpty>
|
<CommandEmpty>{isLoading ? "Loading..." : "No scripts found."}</CommandEmpty>
|
||||||
{links.map((category) => (
|
{(() => {
|
||||||
<CommandGroup key={`category:${category.name}`} heading={category.name}>
|
// Track seen scripts globally to avoid duplicates across all categories
|
||||||
{category.scripts.map((script) => (
|
const globalSeenScripts = new Set<string>();
|
||||||
<CommandItem
|
|
||||||
key={`script:${script.slug}`}
|
return links.map((category) => {
|
||||||
value={`${script.slug}-${script.name}`}
|
const uniqueScripts = category.scripts.filter((script) => {
|
||||||
onSelect={() => {
|
if (globalSeenScripts.has(script.slug)) {
|
||||||
setOpen(false);
|
return false;
|
||||||
router.push(`/scripts?id=${script.slug}`);
|
}
|
||||||
}}
|
globalSeenScripts.add(script.slug);
|
||||||
>
|
return true;
|
||||||
<div className="flex gap-2" onClick={() => setOpen(false)}>
|
});
|
||||||
<Image
|
|
||||||
src={script.logo || `/${basePath}/logo.png`}
|
// Only render category if it has unique scripts
|
||||||
onError={(e) => ((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)}
|
if (uniqueScripts.length === 0) {
|
||||||
unoptimized
|
return null;
|
||||||
width={16}
|
}
|
||||||
height={16}
|
|
||||||
alt=""
|
return (
|
||||||
className="h-5 w-5"
|
<CommandGroup key={`category:${category.name}`} heading={category.name}>
|
||||||
/>
|
{uniqueScripts.map((script) => (
|
||||||
<span>{script.name}</span>
|
<CommandItem
|
||||||
<span>{formattedBadge(script.type)}</span>
|
key={`script:${script.slug}`}
|
||||||
</div>
|
value={`${script.slug}-${script.name}`}
|
||||||
</CommandItem>
|
onSelect={() => {
|
||||||
))}
|
setOpen(false);
|
||||||
</CommandGroup>
|
router.push(`/scripts?id=${script.slug}`);
|
||||||
))}
|
}}
|
||||||
|
>
|
||||||
|
<div className="flex gap-2" onClick={() => setOpen(false)}>
|
||||||
|
<Image
|
||||||
|
src={script.logo || `/${basePath}/logo.png`}
|
||||||
|
onError={(e) => ((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)}
|
||||||
|
unoptimized
|
||||||
|
width={16}
|
||||||
|
height={16}
|
||||||
|
alt=""
|
||||||
|
className="h-5 w-5"
|
||||||
|
/>
|
||||||
|
<span>{script.name}</span>
|
||||||
|
<span>{formattedBadge(script.type)}</span>
|
||||||
|
</div>
|
||||||
|
</CommandItem>
|
||||||
|
))}
|
||||||
|
</CommandGroup>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
})()}
|
||||||
</CommandList>
|
</CommandList>
|
||||||
</CommandDialog>
|
</CommandDialog>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ update_os() {
|
|||||||
msg_info "Updating Container OS"
|
msg_info "Updating Container OS"
|
||||||
if [[ "$CACHER" == "yes" ]]; then
|
if [[ "$CACHER" == "yes" ]]; then
|
||||||
echo "Acquire::http::Proxy-Auto-Detect \"/usr/local/bin/apt-proxy-detect.sh\";" >/etc/apt/apt.conf.d/00aptproxy
|
echo "Acquire::http::Proxy-Auto-Detect \"/usr/local/bin/apt-proxy-detect.sh\";" >/etc/apt/apt.conf.d/00aptproxy
|
||||||
cat <<EOF >/usr/local/bin/apt-proxy-detect.sh
|
cat <<'EOF' >/usr/local/bin/apt-proxy-detect.sh
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
if nc -w1 -z "${CACHER_IP}" 3142; then
|
if nc -w1 -z "${CACHER_IP}" 3142; then
|
||||||
echo -n "http://${CACHER_IP}:3142"
|
echo -n "http://${CACHER_IP}:3142"
|
||||||
|
|||||||
@@ -1538,3 +1538,73 @@ function setup_yq() {
|
|||||||
msg_error "yq installation incomplete or version mismatch"
|
msg_error "yq installation incomplete or version mismatch"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Installs ImageMagick 7 from source (Debian/Ubuntu only).
|
||||||
|
#
|
||||||
|
# Description:
|
||||||
|
# - Downloads the latest ImageMagick source tarball
|
||||||
|
# - Builds and installs ImageMagick to /usr/local
|
||||||
|
# - Configures dynamic linker (ldconfig)
|
||||||
|
#
|
||||||
|
# Notes:
|
||||||
|
# - Requires: build-essential, libtool, libjpeg-dev, libpng-dev, etc.
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
function setup_imagemagick() {
|
||||||
|
local TMP_DIR
|
||||||
|
TMP_DIR=$(mktemp -d)
|
||||||
|
local VERSION=""
|
||||||
|
local BINARY_PATH="/usr/local/bin/magick"
|
||||||
|
|
||||||
|
if command -v magick &>/dev/null; then
|
||||||
|
VERSION=$(magick -version | awk '/^Version/ {print $3}')
|
||||||
|
msg_ok "ImageMagick already installed ($VERSION)"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Setup ImageMagick (Patience)"
|
||||||
|
$STD apt-get update
|
||||||
|
$STD apt-get install -y \
|
||||||
|
build-essential \
|
||||||
|
libtool \
|
||||||
|
libjpeg-dev \
|
||||||
|
libpng-dev \
|
||||||
|
libtiff-dev \
|
||||||
|
libwebp-dev \
|
||||||
|
libheif-dev \
|
||||||
|
libde265-dev \
|
||||||
|
libopenjp2-7-dev \
|
||||||
|
libxml2-dev \
|
||||||
|
liblcms2-dev \
|
||||||
|
libfreetype6-dev \
|
||||||
|
libraw-dev \
|
||||||
|
libfftw3-dev \
|
||||||
|
liblqr-1-0-dev \
|
||||||
|
libgsl-dev \
|
||||||
|
pkg-config \
|
||||||
|
ghostscript
|
||||||
|
|
||||||
|
curl -fsSL https://imagemagick.org/archive/ImageMagick.tar.gz -o "$TMP_DIR/ImageMagick.tar.gz"
|
||||||
|
tar -xzf "$TMP_DIR/ImageMagick.tar.gz" -C "$TMP_DIR"
|
||||||
|
cd "$TMP_DIR"/ImageMagick-* || {
|
||||||
|
msg_error "Source extraction failed"
|
||||||
|
rm -rf "$TMP_DIR"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
./configure --disable-static >/dev/null
|
||||||
|
$STD make
|
||||||
|
$STD make install
|
||||||
|
$STD ldconfig /usr/local/lib
|
||||||
|
|
||||||
|
if [[ ! -x "$BINARY_PATH" ]]; then
|
||||||
|
msg_error "ImageMagick installation failed"
|
||||||
|
rm -rf "$TMP_DIR"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VERSION=$("$BINARY_PATH" -version | awk '/^Version/ {print $3}')
|
||||||
|
rm -rf "$TMP_DIR"
|
||||||
|
ensure_usr_local_bin_persist
|
||||||
|
msg_ok "Setup ImageMagick $VERSION"
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,10 +2,12 @@
|
|||||||
|
|
||||||
# Copyright (c) 2021-2025 tteck
|
# Copyright (c) 2021-2025 tteck
|
||||||
# Author: tteck (tteckster)
|
# Author: tteck (tteckster)
|
||||||
# License: MIT
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
set -Eeuo pipefail
|
||||||
|
trap 'echo -e "\n[ERROR] in line $LINENO: exit code $?"' ERR
|
||||||
|
|
||||||
|
function header_info() {
|
||||||
clear
|
clear
|
||||||
cat <<"EOF"
|
cat <<"EOF"
|
||||||
______ _ __ __
|
______ _ __ __
|
||||||
@@ -16,60 +18,95 @@ function header_info {
|
|||||||
|
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function msg_info() { echo -e " \e[1;36m➤\e[0m $1"; }
|
||||||
|
function msg_ok() { echo -e " \e[1;32m✔\e[0m $1"; }
|
||||||
|
function msg_error() { echo -e " \e[1;31m✖\e[0m $1"; }
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
set -e
|
|
||||||
|
if ! command -v pveversion &>/dev/null; then
|
||||||
|
msg_error "This script must be run on the Proxmox VE host (not inside an LXC container)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
read -p "This will add Tailscale to an existing LXC Container ONLY. Proceed(y/n)?" yn
|
read -rp "This will add Tailscale to an existing LXC Container ONLY. Proceed (y/n)? " yn
|
||||||
case $yn in
|
case "$yn" in
|
||||||
[Yy]*) break ;;
|
[Yy]*) break ;;
|
||||||
[Nn]*) exit ;;
|
[Nn]*) exit 0 ;;
|
||||||
*) echo "Please answer yes or no." ;;
|
*) echo "Please answer yes or no." ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
echo "Loading..."
|
msg_info "Loading container list..."
|
||||||
function msg() {
|
|
||||||
local TEXT="$1"
|
|
||||||
echo -e "$TEXT"
|
|
||||||
}
|
|
||||||
|
|
||||||
NODE=$(hostname)
|
NODE=$(hostname)
|
||||||
MSG_MAX_LENGTH=0
|
MSG_MAX_LENGTH=0
|
||||||
|
CTID_MENU=()
|
||||||
|
|
||||||
while read -r line; do
|
while read -r line; do
|
||||||
TAG=$(echo "$line" | awk '{print $1}')
|
TAG=$(echo "$line" | awk '{print $1}')
|
||||||
ITEM=$(echo "$line" | awk '{print substr($0,36)}')
|
ITEM=$(echo "$line" | awk '{print substr($0,36)}')
|
||||||
OFFSET=2
|
OFFSET=2
|
||||||
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then
|
((${#ITEM} + OFFSET > MSG_MAX_LENGTH)) && MSG_MAX_LENGTH=$((${#ITEM} + OFFSET))
|
||||||
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET))
|
CTID_MENU+=("$TAG" "$ITEM" "OFF")
|
||||||
fi
|
|
||||||
CTID_MENU+=("$TAG" "$ITEM " "OFF")
|
|
||||||
done < <(pct list | awk 'NR>1')
|
done < <(pct list | awk 'NR>1')
|
||||||
|
|
||||||
while [ -z "${CTID:+x}" ]; do
|
CTID=""
|
||||||
|
while [[ -z "${CTID}" ]]; do
|
||||||
CTID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --radiolist \
|
CTID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --radiolist \
|
||||||
"\nSelect a container to add Tailscale to:\n" \
|
"\nSelect a container to add Tailscale to:\n" \
|
||||||
16 $(($MSG_MAX_LENGTH + 23)) 6 \
|
16 $((MSG_MAX_LENGTH + 23)) 6 \
|
||||||
"${CTID_MENU[@]}" 3>&1 1>&2 2>&3)
|
"${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit 1
|
||||||
done
|
done
|
||||||
|
|
||||||
CTID_CONFIG_PATH=/etc/pve/lxc/${CTID}.conf
|
CTID_CONFIG_PATH="/etc/pve/lxc/${CTID}.conf"
|
||||||
cat <<EOF >>$CTID_CONFIG_PATH
|
|
||||||
lxc.cgroup2.devices.allow: c 10:200 rwm
|
# Skip if already configured
|
||||||
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
|
grep -q "lxc.cgroup2.devices.allow: c 10:200 rwm" "$CTID_CONFIG_PATH" || echo "lxc.cgroup2.devices.allow: c 10:200 rwm" >>"$CTID_CONFIG_PATH"
|
||||||
EOF
|
grep -q "lxc.mount.entry: /dev/net/tun" "$CTID_CONFIG_PATH" || echo "lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file" >>"$CTID_CONFIG_PATH"
|
||||||
|
|
||||||
header_info
|
header_info
|
||||||
msg "Installing Tailscale..."
|
msg_info "Installing Tailscale in CT $CTID"
|
||||||
|
|
||||||
pct exec "$CTID" -- bash -c '
|
pct exec "$CTID" -- bash -c '
|
||||||
|
set -e
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
ID=$(grep "^ID=" /etc/os-release | cut -d"=" -f2)
|
ID=$(grep "^ID=" /etc/os-release | cut -d"=" -f2)
|
||||||
VER=$(grep "^VERSION_CODENAME=" /etc/os-release | cut -d"=" -f2)
|
VER=$(grep "^VERSION_CODENAME=" /etc/os-release | cut -d"=" -f2)
|
||||||
curl -fsSL https://pkgs.tailscale.com/stable/$ID/$VER.noarmor.gpg | tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
|
|
||||||
echo "deb [signed-by=/usr/share/keyrings/tailscale-archive-keyring.gpg] https://pkgs.tailscale.com/stable/$ID $VER main" >/etc/apt/sources.list.d/tailscale.list
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get install -y tailscale &>/dev/null
|
|
||||||
'
|
|
||||||
TAGS=$(awk -F': ' '/^tags:/ {print $2}' /etc/pve/lxc/${CTID}.conf)
|
|
||||||
TAGS="${TAGS:+$TAGS; }tailscale"
|
|
||||||
pct set "$CTID" -tags "${TAGS}"
|
|
||||||
msg "\e[1;32m ✔ Installed Tailscale\e[0m"
|
|
||||||
|
|
||||||
msg "\e[1;31m Reboot ${CTID} LXC to apply the changes, then run tailscale up in the LXC console\e[0m"
|
# fallback if DNS is poisoned or blocked
|
||||||
|
ORIG_RESOLV="/etc/resolv.conf"
|
||||||
|
BACKUP_RESOLV="/tmp/resolv.conf.backup"
|
||||||
|
|
||||||
|
if ! dig +short pkgs.tailscale.com | grep -qvE "^127\.|^0\.0\.0\.0$"; then
|
||||||
|
echo "[INFO] DNS resolution for pkgs.tailscale.com failed (blocked or redirected)."
|
||||||
|
echo "[INFO] Temporarily overriding /etc/resolv.conf with Cloudflare DNS (1.1.1.1)"
|
||||||
|
cp "$ORIG_RESOLV" "$BACKUP_RESOLV"
|
||||||
|
echo "nameserver 1.1.1.1" >"$ORIG_RESOLV"
|
||||||
|
fi
|
||||||
|
|
||||||
|
curl -fsSL https://pkgs.tailscale.com/stable/${ID}/${VER}.noarmor.gpg \
|
||||||
|
| tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
|
||||||
|
|
||||||
|
echo "deb [signed-by=/usr/share/keyrings/tailscale-archive-keyring.gpg] https://pkgs.tailscale.com/stable/${ID} ${VER} main" \
|
||||||
|
>/etc/apt/sources.list.d/tailscale.list
|
||||||
|
|
||||||
|
apt-get update -qq
|
||||||
|
apt-get install -y tailscale >/dev/null
|
||||||
|
|
||||||
|
if [[ -f /tmp/resolv.conf.backup ]]; then
|
||||||
|
echo "[INFO] Restoring original /etc/resolv.conf"
|
||||||
|
mv /tmp/resolv.conf.backup /etc/resolv.conf
|
||||||
|
fi
|
||||||
|
'
|
||||||
|
|
||||||
|
TAGS=$(awk -F': ' '/^tags:/ {print $2}' "$CTID_CONFIG_PATH")
|
||||||
|
TAGS="${TAGS:+$TAGS; }tailscale"
|
||||||
|
pct set "$CTID" -tags "$TAGS"
|
||||||
|
|
||||||
|
msg_ok "Tailscale installed on CT $CTID"
|
||||||
|
msg_info "Reboot the container, then run 'tailscale up' inside the container to activate."
|
||||||
|
|||||||
Reference in New Issue
Block a user