mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2025-11-04 18:32:51 +00:00
Compare commits
129 Commits
2025-09-25
...
2025-10-05
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ab2bcbb40 | ||
|
|
57031bdaad | ||
|
|
833a369f61 | ||
|
|
8f8eb7aba5 | ||
|
|
942ff02d37 | ||
|
|
3e1753b3c7 | ||
|
|
6863c774fa | ||
|
|
965b8cb33e | ||
|
|
0768456b2c | ||
|
|
9f531ef4a7 | ||
|
|
6491ec3f09 | ||
|
|
9b5fa050c7 | ||
|
|
efb8e0f2f3 | ||
|
|
07eda340ea | ||
|
|
1a37c759c3 | ||
|
|
e39dd5ffa3 | ||
|
|
aded2cbd56 | ||
|
|
2c791b9e41 | ||
|
|
d1786241ec | ||
|
|
73cf6c66e3 | ||
|
|
efc9153926 | ||
|
|
1f4b446788 | ||
|
|
aeafbb1047 | ||
|
|
938609d5eb | ||
|
|
ae6ca4de23 | ||
|
|
dfdf8c0ddb | ||
|
|
4136f5e7e3 | ||
|
|
51302d516e | ||
|
|
ab995bd493 | ||
|
|
ac12051057 | ||
|
|
c3cca616a4 | ||
|
|
b1bca924b9 | ||
|
|
1909e35e62 | ||
|
|
237349ef47 | ||
|
|
e4cf50dfcd | ||
|
|
0c30d8e3e7 | ||
|
|
92999b4db3 | ||
|
|
4a02986de1 | ||
|
|
d06299685f | ||
|
|
71f71fbca9 | ||
|
|
938fb6dc58 | ||
|
|
03d36a6c10 | ||
|
|
8e25b70a25 | ||
|
|
1840cce15f | ||
|
|
1d0ac4ca10 | ||
|
|
deb85bd264 | ||
|
|
348f8863a8 | ||
|
|
74b332b7ec | ||
|
|
2fe3ee667b | ||
|
|
48e3b66342 | ||
|
|
e93dccb0d5 | ||
|
|
168e7b7c2b | ||
|
|
3f54d0d7f4 | ||
|
|
9477677385 | ||
|
|
e58d1dc3d2 | ||
|
|
2a765f58f0 | ||
|
|
8dfb632a4d | ||
|
|
42ae2a4cdc | ||
|
|
36e41aca22 | ||
|
|
6b1141f9de | ||
|
|
97f891d53b | ||
|
|
0c63e64662 | ||
|
|
d83a378af4 | ||
|
|
6820bdcade | ||
|
|
8ff82d0c3c | ||
|
|
9e39c6cd2b | ||
|
|
0bea24888e | ||
|
|
70d2be62e9 | ||
|
|
fe30e06a48 | ||
|
|
193a2ea2df | ||
|
|
ffbe0feee1 | ||
|
|
107865b06d | ||
|
|
0d33b38e29 | ||
|
|
11ae7450c7 | ||
|
|
598bfd291f | ||
|
|
1a38df4c12 | ||
|
|
cfc85c1b79 | ||
|
|
e7d41fecdc | ||
|
|
34ef80ac87 | ||
|
|
b18d45631f | ||
|
|
efe1e1edb5 | ||
|
|
4567505c55 | ||
|
|
42c87ba0d4 | ||
|
|
b52c252553 | ||
|
|
be5ac7153e | ||
|
|
07f2849722 | ||
|
|
760299283a | ||
|
|
0bd2dd7a65 | ||
|
|
6591c30e66 | ||
|
|
780e5c114c | ||
|
|
ba10ec721b | ||
|
|
f66dc834bd | ||
|
|
be36fc6a94 | ||
|
|
65ada6e6f3 | ||
|
|
853eb40bba | ||
|
|
ace6265895 | ||
|
|
639d4f2d53 | ||
|
|
d7e77e232c | ||
|
|
b850d3f79e | ||
|
|
72e5ac5c80 | ||
|
|
587579b3a1 | ||
|
|
9b4e996d93 | ||
|
|
e6f317ede9 | ||
|
|
3e4420e357 | ||
|
|
38f7e81d8b | ||
|
|
8f5d50a9fa | ||
|
|
32048cff2d | ||
|
|
5775f7cf33 | ||
|
|
4d7c004810 | ||
|
|
d74131fe6f | ||
|
|
87b30f67fa | ||
|
|
7ddc50bfe7 | ||
|
|
484a46beb1 | ||
|
|
b85d1e5062 | ||
|
|
05e41f67e1 | ||
|
|
bfe6445c64 | ||
|
|
ffde3a731c | ||
|
|
d5b9da8f5f | ||
|
|
1b8d790a14 | ||
|
|
175b925ae4 | ||
|
|
38a8773d2f | ||
|
|
e7dafcbf3e | ||
|
|
380fb1cfb7 | ||
|
|
10cd6c3f0b | ||
|
|
710bd7f4e7 | ||
|
|
4d72852e53 | ||
|
|
9ad538c2d2 | ||
|
|
ee3872e7e1 | ||
|
|
f6ca81833e |
150
CHANGELOG.md
150
CHANGELOG.md
@@ -10,8 +10,158 @@
|
|||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
|
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
|
||||||
|
|
||||||
|
## 2025-10-06
|
||||||
|
|
||||||
|
## 2025-10-05
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- ActualBudget: bump to debian 13 [@MickLesk](https://github.com/MickLesk) ([#8124](https://github.com/community-scripts/ProxmoxVE/pull/8124))
|
||||||
|
- 2fauth: bump to debian 13 [@MickLesk](https://github.com/MickLesk) ([#8123](https://github.com/community-scripts/ProxmoxVE/pull/8123))
|
||||||
|
- AdventureLog: bump to debian 13 [@MickLesk](https://github.com/MickLesk) ([#8125](https://github.com/community-scripts/ProxmoxVE/pull/8125))
|
||||||
|
- Update cockpit to Debian 13 [@burgerga](https://github.com/burgerga) ([#8119](https://github.com/community-scripts/ProxmoxVE/pull/8119))
|
||||||
|
|
||||||
|
## 2025-10-04
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- immich: guard /dev/dri permissions so CPU-only installs don’t fail [@mlongwell](https://github.com/mlongwell) ([#8094](https://github.com/community-scripts/ProxmoxVE/pull/8094))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- PosgreSQL: Add version choice [@tremor021](https://github.com/tremor021) ([#8103](https://github.com/community-scripts/ProxmoxVE/pull/8103))
|
||||||
|
|
||||||
|
## 2025-10-03
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- pve-scripts-local ([#8083](https://github.com/community-scripts/ProxmoxVE/pull/8083))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- GLPI: Pin version to v10.0.20 [@tremor021](https://github.com/tremor021) ([#8092](https://github.com/community-scripts/ProxmoxVE/pull/8092))
|
||||||
|
- GLPI: Fix database setup [@tremor021](https://github.com/tremor021) ([#8074](https://github.com/community-scripts/ProxmoxVE/pull/8074))
|
||||||
|
- Overseerr: Increase resources [@tremor021](https://github.com/tremor021) ([#8086](https://github.com/community-scripts/ProxmoxVE/pull/8086))
|
||||||
|
- FIX: post-pve-install.sh just quitting [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#8070](https://github.com/community-scripts/ProxmoxVE/pull/8070))
|
||||||
|
- fix: ensure /etc/pulse exists before chown in update script [@rcourtman](https://github.com/rcourtman) ([#8068](https://github.com/community-scripts/ProxmoxVE/pull/8068))
|
||||||
|
- grist: remove unneeded var [@MickLesk](https://github.com/MickLesk) ([#8060](https://github.com/community-scripts/ProxmoxVE/pull/8060))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Immich: bump version to 2.0.1 [@vhsdream](https://github.com/vhsdream) ([#8090](https://github.com/community-scripts/ProxmoxVE/pull/8090))
|
||||||
|
|
||||||
|
### 🌐 Website
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Adjust navbar layout for large screen [@BramSuurdje](https://github.com/BramSuurdje) ([#8087](https://github.com/community-scripts/ProxmoxVE/pull/8087))
|
||||||
|
|
||||||
|
## 2025-10-02
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- EMQX: removal logic in emqx update [@MickLesk](https://github.com/MickLesk) ([#8050](https://github.com/community-scripts/ProxmoxVE/pull/8050))
|
||||||
|
- fix FlareSolverr version check to v3.3.25 [@MickLesk](https://github.com/MickLesk) ([#8051](https://github.com/community-scripts/ProxmoxVE/pull/8051))
|
||||||
|
|
||||||
|
## 2025-10-01
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- New Script: PhpMyAdmin (Addon) [@MickLesk](https://github.com/MickLesk) ([#8030](https://github.com/community-scripts/ProxmoxVE/pull/8030))
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- openwrt: Add conditional logic for EFI disk allocation [@MickLesk](https://github.com/MickLesk) ([#8024](https://github.com/community-scripts/ProxmoxVE/pull/8024))
|
||||||
|
- Plant-IT: Pin version to v0.10.0 [@tremor021](https://github.com/tremor021) ([#8023](https://github.com/community-scripts/ProxmoxVE/pull/8023))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Immich: bump version to 2.0.0 stable [@vhsdream](https://github.com/vhsdream) ([#8041](https://github.com/community-scripts/ProxmoxVE/pull/8041))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Immich: bump version to 1.144.1 [@vhsdream](https://github.com/vhsdream) ([#7994](https://github.com/community-scripts/ProxmoxVE/pull/7994))
|
||||||
|
|
||||||
|
## 2025-09-30
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- caddy: fix typo for setup_go [@MickLesk](https://github.com/MickLesk) ([#8017](https://github.com/community-scripts/ProxmoxVE/pull/8017))
|
||||||
|
- Changedetection: Fix Browserless installation and update process [@h-stoyanov](https://github.com/h-stoyanov) ([#8011](https://github.com/community-scripts/ProxmoxVE/pull/8011))
|
||||||
|
- n8n: Update procedure workaround [@tremor021](https://github.com/tremor021) ([#8004](https://github.com/community-scripts/ProxmoxVE/pull/8004))
|
||||||
|
- Changedetection: Bump nodejs to 24 [@MickLesk](https://github.com/MickLesk) ([#8002](https://github.com/community-scripts/ProxmoxVE/pull/8002))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Bump Guacamole to Debian 13 [@burgerga](https://github.com/burgerga) ([#8010](https://github.com/community-scripts/ProxmoxVE/pull/8010))
|
||||||
|
|
||||||
|
## 2025-09-29
|
||||||
|
|
||||||
|
### 🆕 New Scripts
|
||||||
|
|
||||||
|
- Ghostfolio ([#7982](https://github.com/community-scripts/ProxmoxVE/pull/7982))
|
||||||
|
- Warracker ([#7977](https://github.com/community-scripts/ProxmoxVE/pull/7977))
|
||||||
|
- MyIP ([#7974](https://github.com/community-scripts/ProxmoxVE/pull/7974))
|
||||||
|
- Verdaccio ([#7967](https://github.com/community-scripts/ProxmoxVE/pull/7967))
|
||||||
|
|
||||||
|
### 🌐 Website
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- fix sidebar loading issues and navbar on mobile [@BramSuurdje](https://github.com/BramSuurdje) ([#7991](https://github.com/community-scripts/ProxmoxVE/pull/7991))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Improve mobile ui: added a hamburger navigation to the mobile view. [@BramSuurdje](https://github.com/BramSuurdje) ([#7987](https://github.com/community-scripts/ProxmoxVE/pull/7987))
|
||||||
|
|
||||||
|
- #### 📝 Script Information
|
||||||
|
|
||||||
|
- Remove Frigate from Website [@MickLesk](https://github.com/MickLesk) ([#7972](https://github.com/community-scripts/ProxmoxVE/pull/7972))
|
||||||
|
|
||||||
|
## 2025-09-28
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Metube: remove uv flags [@vhsdream](https://github.com/vhsdream) ([#7962](https://github.com/community-scripts/ProxmoxVE/pull/7962))
|
||||||
|
- freshrss: fix for broken permissions after update [@CrazyWolf13](https://github.com/CrazyWolf13) ([#7953](https://github.com/community-scripts/ProxmoxVE/pull/7953))
|
||||||
|
|
||||||
|
## 2025-09-27
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- GoAway: Make admin password aquisition more reliable [@tremor021](https://github.com/tremor021) ([#7946](https://github.com/community-scripts/ProxmoxVE/pull/7946))
|
||||||
|
- MeTube: Various fixes [@vhsdream](https://github.com/vhsdream) ([#7936](https://github.com/community-scripts/ProxmoxVE/pull/7936))
|
||||||
|
- Oddo: Fix typo in update procedure [@tremor021](https://github.com/tremor021) ([#7941](https://github.com/community-scripts/ProxmoxVE/pull/7941))
|
||||||
|
|
||||||
## 2025-09-26
|
## 2025-09-26
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- Odoo: Fix missing dependencies [@tremor021](https://github.com/tremor021) ([#7931](https://github.com/community-scripts/ProxmoxVE/pull/7931))
|
||||||
|
- OpenWebUI: Update NODE_OPTIONS to increase memory limit [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#7919](https://github.com/community-scripts/ProxmoxVE/pull/7919))
|
||||||
|
|
||||||
|
### 🌐 Website
|
||||||
|
|
||||||
|
- #### 📝 Script Information
|
||||||
|
|
||||||
|
- Clarify descriptions of update scripts [@tremor021](https://github.com/tremor021) ([#7929](https://github.com/community-scripts/ProxmoxVE/pull/7929))
|
||||||
|
|
||||||
## 2025-09-25
|
## 2025-09-25
|
||||||
|
|
||||||
### 🆕 New Scripts
|
### 🆕 New Scripts
|
||||||
|
|||||||
13
ct/2fauth.sh
13
ct/2fauth.sh
@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
|
|||||||
var_ram="${var_ram:-512}"
|
var_ram="${var_ram:-512}"
|
||||||
var_disk="${var_disk:-2}"
|
var_disk="${var_disk:-2}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-13}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
@@ -29,8 +29,8 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
if check_for_gh_release "2fauth" "Bubka/2FAuth"; then
|
if check_for_gh_release "2fauth" "Bubka/2FAuth"; then
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get -y upgrade
|
$STD apt -y upgrade
|
||||||
|
|
||||||
msg_info "Creating Backup"
|
msg_info "Creating Backup"
|
||||||
mv "/opt/2fauth" "/opt/2fauth-backup"
|
mv "/opt/2fauth" "/opt/2fauth-backup"
|
||||||
@@ -60,10 +60,11 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Cleaning Up"
|
msg_info "Cleaning Up"
|
||||||
if dpkg -l | grep -q 'php8.2'; then
|
if dpkg -l | grep -q 'php8.2'; then
|
||||||
$STD apt-get remove --purge -y php8.2*
|
$STD apt remove --purge -y php8.2*
|
||||||
fi
|
fi
|
||||||
$STD apt-get -y autoremove
|
$STD apt -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt -y autoclean
|
||||||
|
$STD apt -y clean
|
||||||
msg_ok "Cleanup Completed"
|
msg_ok "Cleanup Completed"
|
||||||
msg_ok "Updated Successfully"
|
msg_ok "Updated Successfully"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-2}"
|
|||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-2048}"
|
||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-13}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
@@ -28,8 +28,7 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
NODE_VERSION="22"
|
NODE_VERSION="22" setup_nodejs
|
||||||
setup_nodejs
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||||
if [[ -f /opt/actualbudget-data/config.json ]]; then
|
if [[ -f /opt/actualbudget-data/config.json ]]; then
|
||||||
if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then
|
if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ var_disk="${var_disk:-7}"
|
|||||||
var_cpu="${var_cpu:-2}"
|
var_cpu="${var_cpu:-2}"
|
||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-2048}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-13}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
@@ -28,8 +28,8 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
if ! command -v memcached >/dev/null 2>&1; then
|
if ! command -v memcached >/dev/null 2>&1; then
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install -y memcached libmemcached-tools
|
$STD apt install -y memcached libmemcached-tools
|
||||||
fi
|
fi
|
||||||
if check_for_gh_release "adventurelog" "seanmorley15/adventurelog"; then
|
if check_for_gh_release "adventurelog" "seanmorley15/adventurelog"; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
@@ -43,12 +43,12 @@ function update_script() {
|
|||||||
msg_ok "Backup done"
|
msg_ok "Backup done"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "adventurelog" "seanmorley15/adventurelog"
|
fetch_and_deploy_gh_release "adventurelog" "seanmorley15/adventurelog"
|
||||||
PYTHON_VERSION="3.12" setup_uv
|
PYTHON_VERSION="3.13" setup_uv
|
||||||
|
|
||||||
msg_info "Updating ${APP}"
|
msg_info "Updating ${APP}"
|
||||||
cp /opt/adventurelog-backup/backend/server/.env /opt/adventurelog/backend/server/.env
|
cp /opt/adventurelog-backup/backend/server/.env /opt/adventurelog/backend/server/.env
|
||||||
cp -r /opt/adventurelog-backup/backend/server/media /opt/adventurelog/backend/server/media
|
cp -r /opt/adventurelog-backup/backend/server/media /opt/adventurelog/backend/server/media
|
||||||
cd /opt/adventurelog/backend/server
|
cd /opt/adventurelog/backend/server || exit
|
||||||
if [[ ! -x .venv/bin/python ]]; then
|
if [[ ! -x .venv/bin/python ]]; then
|
||||||
$STD uv venv .venv
|
$STD uv venv .venv
|
||||||
$STD .venv/bin/python -m ensurepip --upgrade
|
$STD .venv/bin/python -m ensurepip --upgrade
|
||||||
@@ -59,7 +59,7 @@ function update_script() {
|
|||||||
$STD .venv/bin/python -m manage migrate
|
$STD .venv/bin/python -m manage migrate
|
||||||
|
|
||||||
cp /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env
|
cp /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env
|
||||||
cd /opt/adventurelog/frontend
|
cd /opt/adventurelog/frontend || exit
|
||||||
$STD pnpm i
|
$STD pnpm i
|
||||||
$STD pnpm build
|
$STD pnpm build
|
||||||
msg_ok "Updated ${APP}"
|
msg_ok "Updated ${APP}"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ var_disk="${var_disk:-4}"
|
|||||||
var_cpu="${var_cpu:-1}"
|
var_cpu="${var_cpu:-1}"
|
||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-2048}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-13}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ function update_script() {
|
|||||||
msg_ok "Updated $APP LXC"
|
msg_ok "Updated $APP LXC"
|
||||||
|
|
||||||
if command -v xcaddy >/dev/null 2>&1; then
|
if command -v xcaddy >/dev/null 2>&1; then
|
||||||
install_go
|
setup_go
|
||||||
msg_info "Updating xCaddy"
|
msg_info "Updating xCaddy"
|
||||||
cd /opt
|
cd /opt
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/caddyserver/xcaddy/releases/latest | grep "tag_name" | awk -F '"' '{print $4}')
|
RELEASE=$(curl -fsSL https://api.github.com/repos/caddyserver/xcaddy/releases/latest | grep "tag_name" | awk -F '"' '{print $4}')
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ function update_script() {
|
|||||||
msg_ok "Updated Dependencies"
|
msg_ok "Updated Dependencies"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
NODE_VERSION="24" setup_nodejs
|
||||||
|
|
||||||
msg_info "Updating ${APP}"
|
msg_info "Updating ${APP}"
|
||||||
$STD pip3 install changedetection.io --upgrade
|
$STD pip3 install changedetection.io --upgrade
|
||||||
msg_ok "Updated ${APP}"
|
msg_ok "Updated ${APP}"
|
||||||
@@ -49,6 +51,7 @@ function update_script() {
|
|||||||
$STD git -C /opt/browserless/ fetch --all
|
$STD git -C /opt/browserless/ fetch --all
|
||||||
$STD git -C /opt/browserless/ reset --hard origin/main
|
$STD git -C /opt/browserless/ reset --hard origin/main
|
||||||
$STD npm update --prefix /opt/browserless
|
$STD npm update --prefix /opt/browserless
|
||||||
|
$STD npm ci --include=optional --include=dev --prefix /opt/browserless
|
||||||
$STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps
|
$STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps
|
||||||
# Update Chrome separately, as it has to be done with the force option. Otherwise the installation of other browsers will not be done if Chrome is already installed.
|
# Update Chrome separately, as it has to be done with the force option. Otherwise the installation of other browsers will not be done if Chrome is already installed.
|
||||||
$STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome
|
$STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-2}"
|
|||||||
var_ram="${var_ram:-1024}"
|
var_ram="${var_ram:-1024}"
|
||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-debian}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-12}"
|
var_version="${var_version:-13}"
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
@@ -36,15 +36,15 @@ function update_script() {
|
|||||||
|
|
||||||
if [ "$UPD" == "1" ]; then
|
if [ "$UPD" == "1" ]; then
|
||||||
msg_info "Updating ${APP} LXC"
|
msg_info "Updating ${APP} LXC"
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get -y upgrade
|
$STD apt -y upgrade
|
||||||
msg_ok "Updated ${APP} LXC"
|
msg_ok "Updated ${APP} LXC"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$UPD" == "2" ]; then
|
if [ "$UPD" == "2" ]; then
|
||||||
msg_info "Installing dependencies (patience)"
|
msg_info "Installing dependencies (patience)"
|
||||||
$STD apt-get install -y \
|
$STD apt install -y \
|
||||||
attr \
|
attr \
|
||||||
nfs-kernel-server \
|
nfs-kernel-server \
|
||||||
samba \
|
samba \
|
||||||
@@ -56,7 +56,7 @@ function update_script() {
|
|||||||
URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-file-sharing/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
|
URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-file-sharing/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
|
||||||
FILE=$(basename "$URL")
|
FILE=$(basename "$URL")
|
||||||
curl -fsSL "$URL" -o "$FILE"
|
curl -fsSL "$URL" -o "$FILE"
|
||||||
$STD dpkg -i "$FILE" || $STD apt-get install -f -y
|
$STD dpkg -i "$FILE" || $STD apt install -f -y
|
||||||
rm -f "$FILE"
|
rm -f "$FILE"
|
||||||
msg_ok "Installed Cockpit file sharing"
|
msg_ok "Installed Cockpit file sharing"
|
||||||
exit
|
exit
|
||||||
@@ -64,7 +64,7 @@ function update_script() {
|
|||||||
|
|
||||||
if [ "$UPD" == "3" ]; then
|
if [ "$UPD" == "3" ]; then
|
||||||
msg_info "Installing dependencies (patience)"
|
msg_info "Installing dependencies (patience)"
|
||||||
$STD apt-get install -y \
|
$STD apt install -y \
|
||||||
psmisc \
|
psmisc \
|
||||||
samba \
|
samba \
|
||||||
samba-common-bin
|
samba-common-bin
|
||||||
@@ -73,7 +73,7 @@ function update_script() {
|
|||||||
URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-identities/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
|
URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-identities/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
|
||||||
FILE=$(basename "$URL")
|
FILE=$(basename "$URL")
|
||||||
curl -fsSL "$URL" -o "$FILE"
|
curl -fsSL "$URL" -o "$FILE"
|
||||||
$STD dpkg -i "$FILE" || $STD apt-get install -f -y
|
$STD dpkg -i "$FILE" || $STD apt install -f -y
|
||||||
rm -f "$FILE"
|
rm -f "$FILE"
|
||||||
msg_ok "Installed Cockpit identities"
|
msg_ok "Installed Cockpit identities"
|
||||||
exit
|
exit
|
||||||
@@ -81,7 +81,7 @@ function update_script() {
|
|||||||
|
|
||||||
if [ "$UPD" == "4" ]; then
|
if [ "$UPD" == "4" ]; then
|
||||||
msg_info "Installing dependencies"
|
msg_info "Installing dependencies"
|
||||||
$STD apt-get install -y \
|
$STD apt install -y \
|
||||||
rsync \
|
rsync \
|
||||||
zip
|
zip
|
||||||
msg_ok "Installed dependencies"
|
msg_ok "Installed dependencies"
|
||||||
@@ -89,7 +89,7 @@ function update_script() {
|
|||||||
URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-navigator/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
|
URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-navigator/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
|
||||||
FILE=$(basename "$URL")
|
FILE=$(basename "$URL")
|
||||||
curl -fsSL "$URL" -o "$FILE"
|
curl -fsSL "$URL" -o "$FILE"
|
||||||
$STD dpkg -i "$FILE" || $STD apt-get install -f -y
|
$STD dpkg -i "$FILE" || $STD apt install -f -y
|
||||||
rm -f "$FILE"
|
rm -f "$FILE"
|
||||||
msg_ok "Installed Cockpit navigator"
|
msg_ok "Installed Cockpit navigator"
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -31,7 +31,13 @@ function update_script() {
|
|||||||
msg_ok "Stopped EMQX"
|
msg_ok "Stopped EMQX"
|
||||||
|
|
||||||
msg_info "Removing old EMQX"
|
msg_info "Removing old EMQX"
|
||||||
|
if dpkg -l | grep -q "^ii\s\+emqx\s"; then
|
||||||
$STD apt-get remove --purge -y emqx
|
$STD apt-get remove --purge -y emqx
|
||||||
|
elif dpkg -l | grep -q "^ii\s\+emqx-enterprise\s"; then
|
||||||
|
$STD apt-get remove --purge -y emqx-enterprise
|
||||||
|
else
|
||||||
|
msg_ok "No old EMQX package found"
|
||||||
|
fi
|
||||||
msg_ok "Removed old EMQX"
|
msg_ok "Removed old EMQX"
|
||||||
|
|
||||||
msg_info "Downloading EMQX v${RELEASE}"
|
msg_info "Downloading EMQX v${RELEASE}"
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
if check_for_gh_release "flaresolverr" "FlareSolverr/FlareSolverr" "3.3.5"; then
|
if check_for_gh_release "flaresolverr" "FlareSolverr/FlareSolverr" "3.3.25"; then
|
||||||
msg_info "Stopping service"
|
msg_info "Stopping service"
|
||||||
systemctl stop flaresolverr
|
systemctl stop flaresolverr
|
||||||
msg_ok "Stopped service"
|
msg_ok "Stopped service"
|
||||||
|
|||||||
@@ -27,8 +27,16 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ ! -x /opt/freshrss/cli/sensitive-log.sh ]; then
|
||||||
|
msg_info "Fixing wrong permissions"
|
||||||
|
chmod +x /opt/freshrss/cli/sensitive-log.sh
|
||||||
|
systemctl restart apache2
|
||||||
|
msg_ok "Fixed wrong permissions"
|
||||||
|
else
|
||||||
msg_error "FreshRSS should be updated via the user interface."
|
msg_error "FreshRSS should be updated via the user interface."
|
||||||
exit
|
exit
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
start
|
start
|
||||||
|
|||||||
75
ct/ghostfolio.sh
Normal file
75
ct/ghostfolio.sh
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: lucasfell
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://ghostfol.io/
|
||||||
|
|
||||||
|
APP="Ghostfolio"
|
||||||
|
var_tags="${var_tags:-finance;investment}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-4096}"
|
||||||
|
var_disk="${var_disk:-8}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -f /opt/ghostfolio/dist/apps/api/main.js ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "ghostfolio" "ghostfolio/ghostfolio"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop ghostfolio
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
msg_info "Creating Backup"
|
||||||
|
tar -czf "/opt/ghostfolio_backup_$(date +%F).tar.gz" \
|
||||||
|
-C /opt \
|
||||||
|
--exclude="ghostfolio/node_modules" \
|
||||||
|
--exclude="ghostfolio/dist" \
|
||||||
|
ghostfolio
|
||||||
|
mv /opt/ghostfolio/.env /opt/env.backup
|
||||||
|
msg_ok "Backup Created"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ghostfolio" "ghostfolio/ghostfolio" "tarball" "latest" "/opt/ghostfolio"
|
||||||
|
|
||||||
|
msg_info "Updating Ghostfolio"
|
||||||
|
mv /opt/env.backup /opt/ghostfolio/.env
|
||||||
|
cd /opt/ghostfolio
|
||||||
|
$STD npm ci
|
||||||
|
$STD npm run build:production
|
||||||
|
$STD npx prisma migrate deploy
|
||||||
|
msg_ok "Updated Ghostfolio"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start ghostfolio
|
||||||
|
msg_ok "Started Service"
|
||||||
|
|
||||||
|
msg_info "Cleaning Up"
|
||||||
|
$STD npm cache clean --force
|
||||||
|
msg_ok "Cleanup Completed"
|
||||||
|
msg_ok "Updated Successfully"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3333${CL}"
|
||||||
6
ct/headers/ghostfolio
Normal file
6
ct/headers/ghostfolio
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
________ __ ____ ___
|
||||||
|
/ ____/ /_ ____ _____/ /_/ __/___ / (_)___
|
||||||
|
/ / __/ __ \/ __ \/ ___/ __/ /_/ __ \/ / / __ \
|
||||||
|
/ /_/ / / / / /_/ (__ ) /_/ __/ /_/ / / / /_/ /
|
||||||
|
\____/_/ /_/\____/____/\__/_/ \____/_/_/\____/
|
||||||
|
|
||||||
6
ct/headers/myip
Normal file
6
ct/headers/myip
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
__ ___ ________
|
||||||
|
/ |/ /_ __/ _/ __ \
|
||||||
|
/ /|_/ / / / // // /_/ /
|
||||||
|
/ / / / /_/ // // ____/
|
||||||
|
/_/ /_/\__, /___/_/
|
||||||
|
/____/
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
____ __ _
|
|
||||||
/ __ \___ / /_(_)___
|
|
||||||
/ /_/ / _ \/ __/ / __ \
|
|
||||||
/ ____/ __/ /_/ / /_/ /
|
|
||||||
/_/ \___/\__/_/\____/
|
|
||||||
|
|
||||||
6
ct/headers/pve-scripts-local
Normal file
6
ct/headers/pve-scripts-local
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ _ ________ _____ _ __ __ __
|
||||||
|
/ __ \ | / / ____/ / ___/__________(_)___ / /______ / / ____ _________ _/ /
|
||||||
|
/ /_/ / | / / __/______\__ \/ ___/ ___/ / __ \/ __/ ___/_____/ / / __ \/ ___/ __ `/ /
|
||||||
|
/ ____/| |/ / /__/_____/__/ / /__/ / / / /_/ / /_(__ )_____/ /___/ /_/ / /__/ /_/ / /
|
||||||
|
/_/ |___/_____/ /____/\___/_/ /_/ .___/\__/____/ /_____/\____/\___/\__,_/_/
|
||||||
|
/_/
|
||||||
6
ct/headers/verdaccio
Normal file
6
ct/headers/verdaccio
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
_ __ __ _
|
||||||
|
| | / /__ _________/ /___ ___________(_)___
|
||||||
|
| | / / _ \/ ___/ __ / __ `/ ___/ ___/ / __ \
|
||||||
|
| |/ / __/ / / /_/ / /_/ / /__/ /__/ / /_/ /
|
||||||
|
|___/\___/_/ \__,_/\__,_/\___/\___/_/\____/
|
||||||
|
|
||||||
6
ct/headers/warracker
Normal file
6
ct/headers/warracker
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
_ __ __
|
||||||
|
| | / /___ _______________ ______/ /_____ _____
|
||||||
|
| | /| / / __ `/ ___/ ___/ __ `/ ___/ //_/ _ \/ ___/
|
||||||
|
| |/ |/ / /_/ / / / / / /_/ / /__/ ,< / __/ /
|
||||||
|
|__/|__/\__,_/_/ /_/ \__,_/\___/_/|_|\___/_/
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ function update_script() {
|
|||||||
done
|
done
|
||||||
msg_ok "Image-processing libraries up to date"
|
msg_ok "Image-processing libraries up to date"
|
||||||
fi
|
fi
|
||||||
RELEASE="1.143.1"
|
RELEASE="2.0.1"
|
||||||
if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then
|
if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then
|
||||||
msg_info "Stopping Services"
|
msg_info "Stopping Services"
|
||||||
systemctl stop immich-web
|
systemctl stop immich-web
|
||||||
@@ -158,6 +158,7 @@ EOF
|
|||||||
|
|
||||||
cd "$SRC_DIR"/machine-learning
|
cd "$SRC_DIR"/machine-learning
|
||||||
mkdir -p "$ML_DIR" && chown -R immich:immich "$ML_DIR"
|
mkdir -p "$ML_DIR" && chown -R immich:immich "$ML_DIR"
|
||||||
|
chown immich:immich ./uv.lock
|
||||||
export VIRTUAL_ENV="${ML_DIR}"/ml-venv
|
export VIRTUAL_ENV="${ML_DIR}"/ml-venv
|
||||||
if [[ -f ~/.openvino ]]; then
|
if [[ -f ~/.openvino ]]; then
|
||||||
msg_info "Updating HW-accelerated machine-learning"
|
msg_info "Updating HW-accelerated machine-learning"
|
||||||
@@ -190,6 +191,7 @@ EOF
|
|||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
$STD apt-get -y autoremove
|
$STD apt-get -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt-get -y autoclean
|
||||||
|
$STD apt clean -y
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
systemctl restart immich-ml immich-web
|
systemctl restart immich-ml immich-web
|
||||||
fi
|
fi
|
||||||
|
|||||||
41
ct/metube.sh
41
ct/metube.sh
@@ -29,6 +29,18 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ $(echo ":$PATH:" != *":/usr/local/bin:"*) ]]; then
|
||||||
|
echo 'export PATH="/usr/local/bin:$PATH"' >>~/.bashrc
|
||||||
|
source ~/.bashrc
|
||||||
|
if ! command -v deno &>/dev/null; then
|
||||||
|
export DENO_INSTALL="/usr/local"
|
||||||
|
curl -fsSL https://deno.land/install.sh | $STD sh -s -- -y
|
||||||
|
else
|
||||||
|
$STD deno upgrade
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "metube" "alexta69/metube"; then
|
||||||
msg_info "Stopping ${APP} Service"
|
msg_info "Stopping ${APP} Service"
|
||||||
systemctl stop metube
|
systemctl stop metube
|
||||||
msg_ok "Stopped ${APP} Service"
|
msg_ok "Stopped ${APP} Service"
|
||||||
@@ -40,9 +52,7 @@ function update_script() {
|
|||||||
mv /opt/metube /opt/metube_bak
|
mv /opt/metube /opt/metube_bak
|
||||||
msg_ok "Backup created"
|
msg_ok "Backup created"
|
||||||
|
|
||||||
msg_info "Cloning Latest ${APP} Release"
|
fetch_and_deploy_gh_release "metube" "alexta69/metube" "tarball" "latest"
|
||||||
$STD git clone https://github.com/alexta69/metube /opt/metube
|
|
||||||
msg_ok "Cloned ${APP}"
|
|
||||||
|
|
||||||
msg_info "Building Frontend"
|
msg_info "Building Frontend"
|
||||||
cd /opt/metube/ui
|
cd /opt/metube/ui
|
||||||
@@ -52,16 +62,9 @@ function update_script() {
|
|||||||
|
|
||||||
PYTHON_VERSION="3.13" setup_uv
|
PYTHON_VERSION="3.13" setup_uv
|
||||||
|
|
||||||
msg_info "Setting up Python Environment (uv)"
|
|
||||||
$STD uv venv /opt/metube/.venv
|
|
||||||
$STD /opt/metube/.venv/bin/python -m ensurepip --upgrade
|
|
||||||
$STD /opt/metube/.venv/bin/python -m pip install --upgrade pip
|
|
||||||
$STD /opt/metube/.venv/bin/python -m pip install pipenv
|
|
||||||
msg_ok "Python Environment Ready"
|
|
||||||
|
|
||||||
msg_info "Installing Backend Requirements"
|
msg_info "Installing Backend Requirements"
|
||||||
cd /opt/metube
|
cd /opt/metube
|
||||||
$STD /opt/metube/.venv/bin/pipenv install
|
$STD uv sync
|
||||||
msg_ok "Installed Backend"
|
msg_ok "Installed Backend"
|
||||||
|
|
||||||
msg_info "Restoring Environment File"
|
msg_info "Restoring Environment File"
|
||||||
@@ -70,16 +73,7 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
msg_ok "Restored .env"
|
msg_ok "Restored .env"
|
||||||
|
|
||||||
if [[ ! -d /opt/metube/.venv ]]; then
|
if grep -q 'pipenv' /etc/systemd/system/metube.service; then
|
||||||
msg_info "Migrating to uv-based environment"
|
|
||||||
PYTHON_VERSION="3.13" setup_uv
|
|
||||||
$STD uv venv /opt/metube/.venv
|
|
||||||
$STD /opt/metube/.venv/bin/python -m ensurepip --upgrade
|
|
||||||
$STD /opt/metube/.venv/bin/python -m pip install --upgrade pip
|
|
||||||
$STD /opt/metube/.venv/bin/python -m pip install pipenv
|
|
||||||
$STD /opt/metube/.venv/bin/pipenv install
|
|
||||||
$STD /opt/metube/.venv/bin/pipenv update yt-dlp
|
|
||||||
|
|
||||||
msg_info "Patching systemd Service"
|
msg_info "Patching systemd Service"
|
||||||
cat <<EOF >/etc/systemd/system/metube.service
|
cat <<EOF >/etc/systemd/system/metube.service
|
||||||
[Unit]
|
[Unit]
|
||||||
@@ -90,7 +84,7 @@ After=network.target
|
|||||||
Type=simple
|
Type=simple
|
||||||
WorkingDirectory=/opt/metube
|
WorkingDirectory=/opt/metube
|
||||||
EnvironmentFile=/opt/metube/.env
|
EnvironmentFile=/opt/metube/.env
|
||||||
ExecStart=/opt/metube/.venv/bin/pipenv run python3 app/main.py
|
ExecStart=/opt/metube/.venv/bin/python3 app/main.py
|
||||||
Restart=always
|
Restart=always
|
||||||
User=root
|
User=root
|
||||||
|
|
||||||
@@ -109,11 +103,12 @@ EOF
|
|||||||
msg_ok "Cleaned Up"
|
msg_ok "Cleaned Up"
|
||||||
|
|
||||||
msg_info "Starting ${APP} Service"
|
msg_info "Starting ${APP} Service"
|
||||||
systemctl enable -q --now metube
|
systemctl start metube
|
||||||
sleep 1
|
sleep 1
|
||||||
msg_ok "Started ${APP} Service"
|
msg_ok "Started ${APP} Service"
|
||||||
|
|
||||||
msg_ok "Updated Successfully!"
|
msg_ok "Updated Successfully!"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
start
|
start
|
||||||
|
|||||||
55
ct/myip.sh
Normal file
55
ct/myip.sh
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: Slaviša Arežina (tremor021)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://ipcheck.ing/
|
||||||
|
|
||||||
|
APP="MyIP"
|
||||||
|
var_tags="${var_tags:-network}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /opt/myip ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "myip" "jason5ng32/MyIP"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop myip
|
||||||
|
msg_ok "Stopped Services"
|
||||||
|
|
||||||
|
cp /opt/myip/.env /opt
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "myip" "jason5ng32/MyIP" "tarball"
|
||||||
|
mv /opt/.env /opt/myip
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start myip
|
||||||
|
msg_ok "Started Services"
|
||||||
|
msg_ok "Updated Successfully"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:18966${CL}"
|
||||||
@@ -41,7 +41,8 @@ EOF
|
|||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
|
||||||
msg_info "Updating ${APP} LXC"
|
msg_info "Updating ${APP} LXC"
|
||||||
$STD npm update -g n8n
|
rm -rf /usr/lib/node_modules/.n8n-* /usr/lib/node_modules/n8n
|
||||||
|
$STD npm install -g n8n --force
|
||||||
systemctl restart n8n
|
systemctl restart n8n
|
||||||
msg_ok "Updated Successfully"
|
msg_ok "Updated Successfully"
|
||||||
exit
|
exit
|
||||||
|
|||||||
@@ -28,6 +28,13 @@ function update_script() {
|
|||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
if ! [[ $(dpkg -s python3-lxml-html-clean 2>/dev/null) ]]; then
|
||||||
|
$STD apt-get install python3-lxml
|
||||||
|
curl -fsSL "http://archive.ubuntu.com/ubuntu/pool/universe/l/lxml-html-clean/python3-lxml-html-clean_0.1.1-1_all.deb" -o /opt/python3-lxml-html-clean.deb
|
||||||
|
$STD dpkg -i /opt/python3-lxml-html-clean.deb
|
||||||
|
rm -f /opt/python3-lxml-html-clean.deb
|
||||||
|
fi
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://nightly.odoo.com/ | grep -oE 'href="[0-9]+\.[0-9]+/nightly"' | head -n1 | cut -d'"' -f2 | cut -d/ -f1)
|
RELEASE=$(curl -fsSL https://nightly.odoo.com/ | grep -oE 'href="[0-9]+\.[0-9]+/nightly"' | head -n1 | cut -d'"' -f2 | cut -d/ -f1)
|
||||||
LATEST_VERSION=$(curl -fsSL "https://nightly.odoo.com/${RELEASE}/nightly/deb/" |
|
LATEST_VERSION=$(curl -fsSL "https://nightly.odoo.com/${RELEASE}/nightly/deb/" |
|
||||||
grep -oP "odoo_${RELEASE}\.\d+_all\.deb" |
|
grep -oP "odoo_${RELEASE}\.\d+_all\.deb" |
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ function update_script() {
|
|||||||
fi
|
fi
|
||||||
systemctl stop open-webui.service
|
systemctl stop open-webui.service
|
||||||
$STD npm install --force
|
$STD npm install --force
|
||||||
export NODE_OPTIONS="--max-old-space-size=3584"
|
export NODE_OPTIONS="--max-old-space-size=6000"
|
||||||
$STD npm run build
|
$STD npm run build
|
||||||
cd ./backend
|
cd ./backend
|
||||||
$STD pip install -r requirements.txt -U
|
$STD pip install -r requirements.txt -U
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
|
|||||||
APP="Overseerr"
|
APP="Overseerr"
|
||||||
var_tags="${var_tags:-media}"
|
var_tags="${var_tags:-media}"
|
||||||
var_cpu="${var_cpu:-2}"
|
var_cpu="${var_cpu:-2}"
|
||||||
var_ram="${var_ram:-2048}"
|
var_ram="${var_ram:-4096}"
|
||||||
var_disk="${var_disk:-8}"
|
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}"
|
||||||
|
|||||||
@@ -32,8 +32,10 @@ function update_script() {
|
|||||||
systemctl stop plant-it
|
systemctl stop plant-it
|
||||||
msg_ok "Stopped $APP"
|
msg_ok "Stopped $APP"
|
||||||
|
|
||||||
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "plant-it" "MDeLuise/plant-it" "singlefile" "latest" "/opt/plant-it/backend" "server.jar"
|
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "plant-it" "MDeLuise/plant-it" "singlefile" "0.10.0" "/opt/plant-it/backend" "server.jar"
|
||||||
fetch_and_deploy_gh_release "plant-it-front" "MDeLuise/plant-it" "prebuild" "latest" "/opt/plant-it/frontend" "client.tar.gz"
|
fetch_and_deploy_gh_release "plant-it-front" "MDeLuise/plant-it" "prebuild" "0.10.0" "/opt/plant-it/frontend" "client.tar.gz"
|
||||||
|
msg_warn "Application is updated to latest Web version (v0.10.0). There will be no more updates available."
|
||||||
|
msg_warn "Please read: https://github.com/MDeLuise/plant-it/releases/tag/1.0.0"
|
||||||
|
|
||||||
msg_info "Starting $APP"
|
msg_info "Starting $APP"
|
||||||
systemctl start plant-it
|
systemctl start plant-it
|
||||||
|
|||||||
@@ -40,7 +40,10 @@ function update_script() {
|
|||||||
|
|
||||||
fetch_and_deploy_gh_release "pulse" "rcourtman/Pulse" "prebuild" "latest" "/opt/pulse" "*-linux-amd64.tar.gz"
|
fetch_and_deploy_gh_release "pulse" "rcourtman/Pulse" "prebuild" "latest" "/opt/pulse" "*-linux-amd64.tar.gz"
|
||||||
ln -sf /opt/pulse/bin/pulse /usr/local/bin/pulse
|
ln -sf /opt/pulse/bin/pulse /usr/local/bin/pulse
|
||||||
chown -R pulse:pulse /etc/pulse /opt/pulse
|
mkdir -p /etc/pulse
|
||||||
|
chown pulse:pulse /etc/pulse
|
||||||
|
chown -R pulse:pulse /opt/pulse
|
||||||
|
chmod 700 /etc/pulse
|
||||||
if [[ -f "$SERVICE_PATH"/pulse-backend.service ]]; then
|
if [[ -f "$SERVICE_PATH"/pulse-backend.service ]]; then
|
||||||
mv "$SERVICE_PATH"/pulse-backend.service "$SERVICE_PATH"/pulse.service
|
mv "$SERVICE_PATH"/pulse-backend.service "$SERVICE_PATH"/pulse.service
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
# Copyright (c) 2021-2025 tteck
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
# Author: tteck (tteckster)
|
# Author: michelroegl-brunner
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
# Source: https://petio.tv/
|
# Source: https://www.debian.org/
|
||||||
|
|
||||||
APP="Petio"
|
APP="PVE-Scripts-Local"
|
||||||
var_tags="${var_tags:-media}"
|
var_tags="${var_tags:-pve-scripts-local}"
|
||||||
var_cpu="${var_cpu:-2}"
|
var_cpu="${var_cpu:-2}"
|
||||||
var_ram="${var_ram:-1024}"
|
var_ram="${var_ram:-4096}"
|
||||||
var_disk="${var_disk:-4}"
|
var_disk="${var_disk:-4}"
|
||||||
var_os="${var_os:-ubuntu}"
|
var_os="${var_os:-debian}"
|
||||||
var_version="${var_version:-20.04}"
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
header_info "$APP"
|
header_info "$APP"
|
||||||
variables
|
variables
|
||||||
@@ -22,16 +23,11 @@ function update_script() {
|
|||||||
header_info
|
header_info
|
||||||
check_container_storage
|
check_container_storage
|
||||||
check_container_resources
|
check_container_resources
|
||||||
if [[ ! -d /opt/Petio ]]; then
|
if [[ ! -d /var ]]; then
|
||||||
msg_error "No ${APP} Installation Found!"
|
msg_error "No ${APP} Installation Found!"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
msg_info "Updating $APP"
|
msg_info "No Update function implementd"
|
||||||
systemctl stop petio.service
|
|
||||||
curl -fsSL https://petio.tv/releases/latest -o petio-latest.zip
|
|
||||||
$STD unzip petio-latest.zip -d /opt/Petio
|
|
||||||
systemctl start petio.service
|
|
||||||
msg_ok "Updated $APP"
|
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,4 +38,4 @@ description
|
|||||||
msg_ok "Completed Successfully!\n"
|
msg_ok "Completed Successfully!\n"
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7777${CL}"
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
||||||
49
ct/verdaccio.sh
Normal file
49
ct/verdaccio.sh
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: BrynnJKnight
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://verdaccio.org/
|
||||||
|
|
||||||
|
APP="Verdaccio"
|
||||||
|
var_tags="${var_tags:-dev-tools;npm;registry}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_disk="${var_disk:-8}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -f /etc/systemd/system/verdaccio.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Updating LXC Container"
|
||||||
|
$STD apt update
|
||||||
|
$STD apt -y upgrade
|
||||||
|
msg_ok "Updated LXC Container"
|
||||||
|
|
||||||
|
NODE_VERSION="22" NODE_MODULE="verdaccio" setup_nodejs
|
||||||
|
systemctl restart verdaccio
|
||||||
|
msg_ok "Updated Successfully"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4873${CL}"
|
||||||
63
ct/warracker.sh
Normal file
63
ct/warracker.sh
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: BvdBerg01
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/sassanix/Warracker/
|
||||||
|
|
||||||
|
APP="Warracker"
|
||||||
|
var_tags="${var_tags:-warranty}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /opt/warracker ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "warracker" "sassanix/Warracker"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop warrackermigration
|
||||||
|
systemctl stop warracker
|
||||||
|
systemctl stop nginx
|
||||||
|
msg_ok "Stopped Services"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "warracker" "sassanix/Warracker" "tarball" "latest" "/opt/warracker"
|
||||||
|
|
||||||
|
msg_info "Updating Warracker"
|
||||||
|
cd /opt/warracker/backend
|
||||||
|
$STD uv venv .venv
|
||||||
|
$STD source .venv/bin/activate
|
||||||
|
$STD uv pip install -r requirements.txt
|
||||||
|
msg_ok "Updated Warracker"
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start warracker
|
||||||
|
systemctl start nginx
|
||||||
|
msg_ok "Started Services"
|
||||||
|
msg_ok "Updated Successfully"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
"ram": 512,
|
"ram": 512,
|
||||||
"hdd": 2,
|
"hdd": 2,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
"ram": 2048,
|
"ram": 2048,
|
||||||
"hdd": 4,
|
"hdd": 4,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
"ram": 2048,
|
"ram": 2048,
|
||||||
"hdd": 7,
|
"hdd": 7,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
"ram": 2048,
|
"ram": 2048,
|
||||||
"hdd": 4,
|
"hdd": 4,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
"ram": 1024,
|
"ram": 1024,
|
||||||
"hdd": 4,
|
"hdd": 4,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
"website": null,
|
"website": null,
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/proxmox.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/proxmox.webp",
|
||||||
"config_path": "",
|
"config_path": "",
|
||||||
"description": "This script will add/remove a crontab schedule that updates all LXCs every Sunday at midnight.",
|
"description": "This script will add/remove a crontab schedule that updates the operating system of all LXCs every Sunday at midnight.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
|
|||||||
52
frontend/public/json/ghostfolio.json
Normal file
52
frontend/public/json/ghostfolio.json
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
{
|
||||||
|
"name": "Ghostfolio",
|
||||||
|
"slug": "ghostfolio",
|
||||||
|
"categories": [
|
||||||
|
23
|
||||||
|
],
|
||||||
|
"date_created": "2025-09-29",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 3333,
|
||||||
|
"documentation": "https://github.com/ghostfolio/ghostfolio?tab=readme-ov-file#self-hosting",
|
||||||
|
"website": "https://ghostfol.io/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/ghostfolio.webp",
|
||||||
|
"config_path": "/opt/ghostfolio/.env",
|
||||||
|
"description": "Ghostfolio is an open source wealth management software built with web technology. The application empowers busy people to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/ghostfolio.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 4096,
|
||||||
|
"hdd": 8,
|
||||||
|
"os": "debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Create your first user account by visiting the web interface and clicking 'Get Started'. The first user will automatically get admin privileges.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Database and Redis credentials: `cat ~/ghostfolio.creds`",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Optional: CoinGecko API keys can be added during installation or later in the .env file for enhanced cryptocurrency data.",
|
||||||
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Build process requires 4GB RAM (runtime: ~2GB). A temporary swap file will be created automatically if insufficient memory is detected.",
|
||||||
|
"type": "warning"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
35
frontend/public/json/myip.json
Normal file
35
frontend/public/json/myip.json
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "MyIP",
|
||||||
|
"slug": "myip",
|
||||||
|
"categories": [
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"date_created": "2025-09-29",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"config_path": "/opt/myip/.env",
|
||||||
|
"interface_port": 18966,
|
||||||
|
"documentation": "https://github.com/jason5ng32/MyIP#-environment-variable",
|
||||||
|
"website": "https://ipcheck.ing/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/myip.webp",
|
||||||
|
"description": "The best IP Toolbox. Easy to check what's your IPs, IP geolocation, check for DNS leaks, examine WebRTC connections, speed test, ping test, MTR test, check website availability, whois search and more!",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/myip.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 512,
|
||||||
|
"hdd": 2,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": []
|
||||||
|
}
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
"script": "ct/overseerr.sh",
|
"script": "ct/overseerr.sh",
|
||||||
"resources": {
|
"resources": {
|
||||||
"cpu": 2,
|
"cpu": 2,
|
||||||
"ram": 2048,
|
"ram": 4096,
|
||||||
"hdd": 8,
|
"hdd": 8,
|
||||||
"os": "debian",
|
"os": "debian",
|
||||||
"version": "12"
|
"version": "12"
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Petio",
|
|
||||||
"slug": "petio",
|
|
||||||
"categories": [
|
|
||||||
13
|
|
||||||
],
|
|
||||||
"date_created": "2024-06-12",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 7777,
|
|
||||||
"documentation": "https://docs.petio.tv/",
|
|
||||||
"website": "https://petio.tv/",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/petio.webp",
|
|
||||||
"config_path": "",
|
|
||||||
"description": "Petio is a third party companion app available to Plex server owners to allow their users to request, review and discover content.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/petio.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 2,
|
|
||||||
"ram": 1024,
|
|
||||||
"hdd": 4,
|
|
||||||
"os": "ubuntu",
|
|
||||||
"version": "20.04"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": []
|
|
||||||
}
|
|
||||||
44
frontend/public/json/phpmyadmin.json
Normal file
44
frontend/public/json/phpmyadmin.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"name": "PhpMyAdmin",
|
||||||
|
"slug": "phpmyadmin",
|
||||||
|
"categories": [
|
||||||
|
8
|
||||||
|
],
|
||||||
|
"date_created": "2025-10-01",
|
||||||
|
"type": "addon",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": null,
|
||||||
|
"documentation": "https://www.phpmyadmin.net/docs/",
|
||||||
|
"config_path": "Debian/Ubuntu: /var/www/html/phpMyAdmin | Alpine: /usr/share/phpmyadmin",
|
||||||
|
"website": "https://www.phpmyadmin.net/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/phpmyadmin.webp",
|
||||||
|
"description": "phpMyAdmin is a free software tool written in PHP, intended to handle the administration of MySQL over the Web. phpMyAdmin supports a wide range of operations on MySQL and MariaDB. Frequently used operations (managing databases, tables, columns, relations, indexes, users, permissions, etc) can be performed via the user interface, while you still have the ability to directly execute any SQL statement.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "tools/addon/phpmyadmin.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": null,
|
||||||
|
"ram": null,
|
||||||
|
"hdd": null,
|
||||||
|
"os": null,
|
||||||
|
"version": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "Execute within an existing LXC Console",
|
||||||
|
"type": "warning"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "To update or uninstall run bash call again",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -46,6 +46,10 @@
|
|||||||
{
|
{
|
||||||
"text": "Set a password after installation for postgres user by running `echo \"ALTER USER postgres with encrypted password 'your_password';\" | sudo -u postgres psql`",
|
"text": "Set a password after installation for postgres user by running `echo \"ALTER USER postgres with encrypted password 'your_password';\" | sudo -u postgres psql`",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Debian script offers versions `15, 16, 17, 18`, while Alpine script offers versions `15, 16, 17`.",
|
||||||
|
"type": "info"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
35
frontend/public/json/pve-scripts-local.json
Normal file
35
frontend/public/json/pve-scripts-local.json
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "PVEScriptsLocal",
|
||||||
|
"slug": "pve-scripts-local",
|
||||||
|
"categories": [
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"date_created": "2025-10-03",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": false,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 3000,
|
||||||
|
"documentation": "https://github.com/community-scripts/ProxmoxVE-Local",
|
||||||
|
"config_path": "/opt/PVEScripts-Local/.env",
|
||||||
|
"website": "https://community-scripts.github.io/ProxmoxVE",
|
||||||
|
"logo": "https://community-scripts.github.io/ProxmoxVE/logo.png",
|
||||||
|
"description": "A modern web-based management interface for Proxmox VE (PVE) helper scripts. This tool provides a user-friendly way to discover, download, and execute community-sourced Proxmox scripts locally with real-time terminal output streaming.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/pve-scripts-local.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 4096,
|
||||||
|
"hdd": 4,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": []
|
||||||
|
}
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
"website": null,
|
"website": null,
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/linuxcontainers.webp",
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/linuxcontainers.webp",
|
||||||
"config_path": "",
|
"config_path": "",
|
||||||
"description": "This script has been created to simplify and speed up the process of updating all LXC containers across various Linux distributions, such as Ubuntu, Debian, Devuan, Alpine Linux, CentOS-Rocky-Alma, Fedora, and ArchLinux. It's designed to automatically skip templates and specific containers during the update, enhancing its convenience and usability.",
|
"description": "This script has been created to simplify and speed up the process of updating the operating system running inside LXC containers across various Linux distributions, such as Ubuntu, Debian, Devuan, Alpine Linux, CentOS-Rocky-Alma, Fedora, and ArchLinux. It's designed to automatically skip templates and specific containers during the update, enhancing its convenience and usability.",
|
||||||
"install_methods": [
|
"install_methods": [
|
||||||
{
|
{
|
||||||
"type": "default",
|
"type": "default",
|
||||||
@@ -35,6 +35,10 @@
|
|||||||
{
|
{
|
||||||
"text": "Execute within the Proxmox shell",
|
"text": "Execute within the Proxmox shell",
|
||||||
"type": "info"
|
"type": "info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "The script updates only the operating system of the LXC container. It DOES NOT update the application installed within the container!",
|
||||||
|
"type": "warning"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
40
frontend/public/json/verdaccio.json
Normal file
40
frontend/public/json/verdaccio.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "Verdaccio",
|
||||||
|
"slug": "verdaccio",
|
||||||
|
"categories": [
|
||||||
|
20
|
||||||
|
],
|
||||||
|
"date_created": "2025-09-29",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 4873,
|
||||||
|
"documentation": "https://verdaccio.org/docs/what-is-verdaccio",
|
||||||
|
"website": "https://verdaccio.org/",
|
||||||
|
"logo": "https://verdaccio.org/img/logo/symbol/png/verdaccio-tiny.png",
|
||||||
|
"config_path": "/opt/verdaccio/config/config.yaml",
|
||||||
|
"description": "Verdaccio is a lightweight private npm proxy registry built with Node.js. It allows you to host your own npm registry with minimal configuration, providing a private npm repository for your projects. Verdaccio supports npm, yarn, and pnpm, and can cache packages from the public npm registry, allowing for faster installs and protection against npm registry outages. It includes a web interface for browsing packages, authentication and authorization features, and can be easily integrated into your development workflow.",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/verdaccio.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 2,
|
||||||
|
"ram": 2048,
|
||||||
|
"hdd": 8,
|
||||||
|
"os": "debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "To create the first user, run: npm adduser --registry http://<container-ip>:4873",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
40
frontend/public/json/warracker.json
Normal file
40
frontend/public/json/warracker.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "Warracker",
|
||||||
|
"slug": "warracker",
|
||||||
|
"categories": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"date_created": "2025-09-29",
|
||||||
|
"type": "ct",
|
||||||
|
"updateable": true,
|
||||||
|
"privileged": false,
|
||||||
|
"interface_port": 80,
|
||||||
|
"documentation": null,
|
||||||
|
"config_path": "/opt/.env",
|
||||||
|
"website": "https://warracker.com/",
|
||||||
|
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/warracker.webp",
|
||||||
|
"description": "Warracker is an open source, self-hostable warranty tracker to monitor expirations, store receipts, files. You own the data, your rules!",
|
||||||
|
"install_methods": [
|
||||||
|
{
|
||||||
|
"type": "default",
|
||||||
|
"script": "ct/warracker.sh",
|
||||||
|
"resources": {
|
||||||
|
"cpu": 1,
|
||||||
|
"ram": 512,
|
||||||
|
"hdd": 4,
|
||||||
|
"os": "Debian",
|
||||||
|
"version": "13"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default_credentials": {
|
||||||
|
"username": null,
|
||||||
|
"password": null
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"text": "The first user you register will be the admin user.",
|
||||||
|
"type": "info"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -103,18 +103,22 @@ export default function RootLayout({
|
|||||||
<body className={inter.className}>
|
<body className={inter.className}>
|
||||||
<ThemeProvider attribute="class" defaultTheme="dark" enableSystem disableTransitionOnChange>
|
<ThemeProvider attribute="class" defaultTheme="dark" enableSystem disableTransitionOnChange>
|
||||||
<div className="flex w-full flex-col justify-center">
|
<div className="flex w-full flex-col justify-center">
|
||||||
|
<NuqsAdapter>
|
||||||
|
<QueryProvider>
|
||||||
|
|
||||||
<Navbar />
|
<Navbar />
|
||||||
<div className="flex min-h-screen flex-col justify-center">
|
<div className="flex min-h-screen flex-col justify-center">
|
||||||
<div className="flex w-full justify-center">
|
<div className="flex w-full justify-center">
|
||||||
<div className="w-full max-w-[1440px] ">
|
<div className="w-full max-w-[1440px] ">
|
||||||
<QueryProvider>
|
{children}
|
||||||
<NuqsAdapter>{children}</NuqsAdapter>
|
|
||||||
</QueryProvider>
|
|
||||||
<Toaster richColors />
|
<Toaster richColors />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Footer />
|
<Footer />
|
||||||
</div>
|
</div>
|
||||||
|
</QueryProvider>
|
||||||
|
|
||||||
|
</NuqsAdapter>
|
||||||
</div>
|
</div>
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -27,12 +27,14 @@ export default function ScriptAccordion({
|
|||||||
setSelectedScript,
|
setSelectedScript,
|
||||||
selectedCategory,
|
selectedCategory,
|
||||||
setSelectedCategory,
|
setSelectedCategory,
|
||||||
|
onItemSelect,
|
||||||
}: {
|
}: {
|
||||||
items: Category[];
|
items: Category[];
|
||||||
selectedScript: string | null;
|
selectedScript: string | null;
|
||||||
setSelectedScript: (script: string | null) => void;
|
setSelectedScript: (script: string | null) => void;
|
||||||
selectedCategory: string | null;
|
selectedCategory: string | null;
|
||||||
setSelectedCategory: (category: string | null) => void;
|
setSelectedCategory: (category: string | null) => void;
|
||||||
|
onItemSelect?: () => void;
|
||||||
}) {
|
}) {
|
||||||
const [expandedItem, setExpandedItem] = useState<string | undefined>(undefined);
|
const [expandedItem, setExpandedItem] = useState<string | undefined>(undefined);
|
||||||
const linkRefs = useRef<{ [key: string]: HTMLAnchorElement | null }>({});
|
const linkRefs = useRef<{ [key: string]: HTMLAnchorElement | null }>({});
|
||||||
@@ -77,7 +79,7 @@ export default function ScriptAccordion({
|
|||||||
value={expandedItem}
|
value={expandedItem}
|
||||||
onValueChange={handleAccordionChange}
|
onValueChange={handleAccordionChange}
|
||||||
collapsible
|
collapsible
|
||||||
className="overflow-y-scroll max-h-[calc(100vh-225px)] overflow-x-hidden p-2"
|
className="overflow-y-scroll sm:max-h-[calc(100vh-209px)] overflow-x-hidden p-1"
|
||||||
>
|
>
|
||||||
{items.map(category => (
|
{items.map(category => (
|
||||||
<AccordionItem
|
<AccordionItem
|
||||||
@@ -125,6 +127,7 @@ export default function ScriptAccordion({
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
handleSelected(script.slug);
|
handleSelected(script.slug);
|
||||||
setSelectedCategory(category.name);
|
setSelectedCategory(category.name);
|
||||||
|
onItemSelect?.();
|
||||||
}}
|
}}
|
||||||
ref={(el) => {
|
ref={(el) => {
|
||||||
linkRefs.current[script.slug] = el;
|
linkRefs.current[script.slug] = el;
|
||||||
|
|||||||
@@ -2,21 +2,29 @@
|
|||||||
|
|
||||||
import type { Category, Script } from "@/lib/types";
|
import type { Category, Script } from "@/lib/types";
|
||||||
|
|
||||||
|
import { cn } from "@/lib/utils";
|
||||||
|
|
||||||
import ScriptAccordion from "./script-accordion";
|
import ScriptAccordion from "./script-accordion";
|
||||||
|
|
||||||
|
type SidebarProps = {
|
||||||
|
items: Category[];
|
||||||
|
selectedScript: string | null;
|
||||||
|
setSelectedScript: (script: string | null) => void;
|
||||||
|
selectedCategory: string | null;
|
||||||
|
setSelectedCategory: (category: string | null) => void;
|
||||||
|
onItemSelect?: () => void;
|
||||||
|
className?: string;
|
||||||
|
};
|
||||||
|
|
||||||
function Sidebar({
|
function Sidebar({
|
||||||
items,
|
items,
|
||||||
selectedScript,
|
selectedScript,
|
||||||
setSelectedScript,
|
setSelectedScript,
|
||||||
selectedCategory,
|
selectedCategory,
|
||||||
setSelectedCategory,
|
setSelectedCategory,
|
||||||
}: {
|
onItemSelect,
|
||||||
items: Category[];
|
className,
|
||||||
selectedScript: string | null;
|
}: SidebarProps) {
|
||||||
setSelectedScript: (script: string | null) => void;
|
|
||||||
selectedCategory: string | null;
|
|
||||||
setSelectedCategory: (category: string | null) => void;
|
|
||||||
}) {
|
|
||||||
const uniqueScripts = items.reduce((acc, category) => {
|
const uniqueScripts = items.reduce((acc, category) => {
|
||||||
for (const script of category.scripts) {
|
for (const script of category.scripts) {
|
||||||
if (!acc.some(s => s.name === script.name)) {
|
if (!acc.some(s => s.name === script.name)) {
|
||||||
@@ -27,7 +35,7 @@ function Sidebar({
|
|||||||
}, [] as Script[]);
|
}, [] as Script[]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex min-w-[350px] flex-col sm:max-w-[350px]">
|
<div className={cn("flex w-full flex-col sm:min-w-[350px] sm:max-w-[350px]", className)}>
|
||||||
<div className="flex items-end justify-between pb-4">
|
<div className="flex items-end justify-between pb-4">
|
||||||
<h1 className="text-xl font-bold">Categories</h1>
|
<h1 className="text-xl font-bold">Categories</h1>
|
||||||
<p className="text-xs italic text-muted-foreground">
|
<p className="text-xs italic text-muted-foreground">
|
||||||
@@ -43,6 +51,7 @@ function Sidebar({
|
|||||||
setSelectedScript={setSelectedScript}
|
setSelectedScript={setSelectedScript}
|
||||||
selectedCategory={selectedCategory}
|
selectedCategory={selectedCategory}
|
||||||
setSelectedCategory={setSelectedCategory}
|
setSelectedCategory={setSelectedCategory}
|
||||||
|
onItemSelect={onItemSelect}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
"use client";
|
"use client";
|
||||||
import { useEffect, useState } from "react";
|
import { Suspense, useEffect, useState } from "react";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
|
|
||||||
@@ -8,6 +8,7 @@ import { navbarLinks } from "@/config/site-config";
|
|||||||
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./ui/tooltip";
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./ui/tooltip";
|
||||||
import { GitHubStarsButton } from "./animate-ui/components/buttons/github-stars";
|
import { GitHubStarsButton } from "./animate-ui/components/buttons/github-stars";
|
||||||
import { Button } from "./animate-ui/components/buttons/button";
|
import { Button } from "./animate-ui/components/buttons/button";
|
||||||
|
import MobileSidebar from "./navigation/mobile-sidebar";
|
||||||
import { ThemeToggle } from "./ui/theme-toggle";
|
import { ThemeToggle } from "./ui/theme-toggle";
|
||||||
import CommandMenu from "./command-menu";
|
import CommandMenu from "./command-menu";
|
||||||
|
|
||||||
@@ -30,21 +31,26 @@ function Navbar() {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div
|
<div
|
||||||
className={`fixed left-0 top-0 z-50 flex w-screen justify-center px-4 xl:px-0 ${
|
className={`fixed left-0 top-0 z-50 flex w-screen justify-center px-4 xl:px-0 ${isScrolled ? "glass border-b bg-background/50" : ""
|
||||||
isScrolled ? "glass border-b bg-background/50" : ""
|
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<div className="flex h-20 w-full max-w-[1440px] items-center justify-between sm:flex-row">
|
<div className="flex h-20 w-full max-w-[1440px] items-center justify-between sm:flex-row">
|
||||||
<Link
|
<Link
|
||||||
href="/"
|
href="/"
|
||||||
className="flex cursor-pointer w-full justify-center sm:justify-start flex-row-reverse items-center gap-2 font-semibold sm:flex-row"
|
className="cursor-pointer w-full justify-center sm:justify-start flex-row-reverse hidden sm:flex items-center gap-2 font-semibold sm:flex-row"
|
||||||
>
|
>
|
||||||
<Image height={18} unoptimized width={18} alt="logo" src="/ProxmoxVE/logo.png" className="" />
|
<Image height={18} unoptimized width={18} alt="logo" src="/ProxmoxVE/logo.png" className="" />
|
||||||
<span className="hidden md:block">Proxmox VE Helper-Scripts</span>
|
<span className="">Proxmox VE Helper-Scripts</span>
|
||||||
</Link>
|
</Link>
|
||||||
<div className="flex gap-2">
|
<div className="flex items-center justify-between sm:justify-end gap-2 w-full">
|
||||||
|
<div className="flex sm:hidden">
|
||||||
|
<Suspense>
|
||||||
|
<MobileSidebar />
|
||||||
|
</Suspense>
|
||||||
|
</div>
|
||||||
|
<div className="flex sm:gap-2">
|
||||||
<CommandMenu />
|
<CommandMenu />
|
||||||
<GitHubStarsButton username="community-scripts" repo="ProxmoxVE" />
|
<GitHubStarsButton username="community-scripts" repo="ProxmoxVE" className="hidden md:flex" />
|
||||||
{navbarLinks.map(({ href, event, icon, text, mobileHidden }) => (
|
{navbarLinks.map(({ href, event, icon, text, mobileHidden }) => (
|
||||||
<TooltipProvider key={event}>
|
<TooltipProvider key={event}>
|
||||||
<Tooltip delayDuration={100}>
|
<Tooltip delayDuration={100}>
|
||||||
@@ -66,6 +72,7 @@ function Navbar() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
133
frontend/src/components/navigation/mobile-sidebar.tsx
Normal file
133
frontend/src/components/navigation/mobile-sidebar.tsx
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { useCallback, useEffect, useState } from "react";
|
||||||
|
import { usePathname } from "next/navigation";
|
||||||
|
import { useQueryState } from "nuqs";
|
||||||
|
import { Menu } from "lucide-react";
|
||||||
|
|
||||||
|
import type { Category, Script } from "@/lib/types";
|
||||||
|
|
||||||
|
import { ScriptItem } from "@/app/scripts/_components/script-item";
|
||||||
|
import Sidebar from "@/app/scripts/_components/sidebar";
|
||||||
|
import { fetchCategories } from "@/lib/data";
|
||||||
|
|
||||||
|
import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from "../ui/sheet";
|
||||||
|
import { Button } from "../ui/button";
|
||||||
|
|
||||||
|
function MobileSidebar() {
|
||||||
|
const [isOpen, setIsOpen] = useState(false);
|
||||||
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
|
const [categories, setCategories] = useState<Category[]>([]);
|
||||||
|
const [lastViewedScript, setLastViewedScript] = useState<Script | undefined>(undefined);
|
||||||
|
const pathname = usePathname();
|
||||||
|
|
||||||
|
// Always call the hooks (React hooks can't be conditional)
|
||||||
|
const [selectedScript, setSelectedScript] = useQueryState("id");
|
||||||
|
const [selectedCategory, setSelectedCategory] = useQueryState("category");
|
||||||
|
|
||||||
|
// For non-scripts pages, we'll manage state locally
|
||||||
|
const [tempSelectedScript, setTempSelectedScript] = useState<string | null>(null);
|
||||||
|
const [tempSelectedCategory, setTempSelectedCategory] = useState<string | null>(null);
|
||||||
|
|
||||||
|
const isOnScriptsPage = pathname === "/scripts";
|
||||||
|
const currentSelectedScript = isOnScriptsPage ? selectedScript : tempSelectedScript;
|
||||||
|
const currentSelectedCategory = isOnScriptsPage ? selectedCategory : tempSelectedCategory;
|
||||||
|
|
||||||
|
const loadCategories = useCallback(async () => {
|
||||||
|
setIsLoading(true);
|
||||||
|
try {
|
||||||
|
const response = await fetchCategories();
|
||||||
|
setCategories(response);
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
setIsLoading(false);
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
void loadCategories();
|
||||||
|
}, [loadCategories]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!currentSelectedScript || categories.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const scriptMatch = categories
|
||||||
|
.flatMap(category => category.scripts)
|
||||||
|
.find(script => script.slug === currentSelectedScript);
|
||||||
|
|
||||||
|
setLastViewedScript(scriptMatch);
|
||||||
|
}, [currentSelectedScript, categories]);
|
||||||
|
|
||||||
|
const handleOpenChange = (openState: boolean) => {
|
||||||
|
setIsOpen(openState);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleItemSelect = () => {
|
||||||
|
setIsOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
const hasLinks = categories.length > 0;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Sheet open={isOpen} onOpenChange={handleOpenChange}>
|
||||||
|
<SheetTrigger asChild>
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
size="icon"
|
||||||
|
aria-label="Open navigation menu"
|
||||||
|
tabIndex={0}
|
||||||
|
onKeyDown={(event) => {
|
||||||
|
if (event.key === "Enter" || event.key === " ") {
|
||||||
|
setIsOpen(true);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Menu className="size-5" aria-hidden="true" />
|
||||||
|
</Button>
|
||||||
|
</SheetTrigger>
|
||||||
|
<SheetHeader className="border-b border-border px-6 pb-4 pt-2 sr-only">
|
||||||
|
<SheetTitle className="sr-only">Categories</SheetTitle>
|
||||||
|
</SheetHeader>
|
||||||
|
<SheetContent side="left" className="flex w-full max-w-xs flex-col gap-4 overflow-hidden px-0 pb-6">
|
||||||
|
<div className="flex h-full flex-col gap-4 overflow-y-auto">
|
||||||
|
{isLoading && !hasLinks
|
||||||
|
? (
|
||||||
|
<div className="flex w-full flex-col items-center justify-center gap-2 px-6 py-4 text-sm text-muted-foreground">
|
||||||
|
Loading categories...
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
: (
|
||||||
|
<div className="flex flex-col gap-4 px-4">
|
||||||
|
<Sidebar
|
||||||
|
items={categories}
|
||||||
|
selectedScript={currentSelectedScript}
|
||||||
|
setSelectedScript={isOnScriptsPage ? setSelectedScript : setTempSelectedScript}
|
||||||
|
selectedCategory={currentSelectedCategory}
|
||||||
|
setSelectedCategory={isOnScriptsPage ? setSelectedCategory : setTempSelectedCategory}
|
||||||
|
onItemSelect={handleItemSelect}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{currentSelectedScript && lastViewedScript
|
||||||
|
? (
|
||||||
|
<div className="flex flex-col gap-3 px-4">
|
||||||
|
<p className="text-sm font-medium">Last Viewed</p>
|
||||||
|
<ScriptItem
|
||||||
|
item={lastViewedScript}
|
||||||
|
setSelectedScript={isOnScriptsPage ? setSelectedScript : setTempSelectedScript}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
: null}
|
||||||
|
</div>
|
||||||
|
</SheetContent>
|
||||||
|
</Sheet>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default MobileSidebar;
|
||||||
@@ -6,7 +6,7 @@ import { Command as CommandPrimitive } from "cmdk";
|
|||||||
import { Search } from "lucide-react";
|
import { Search } from "lucide-react";
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
|
|
||||||
import { Dialog, DialogContent } from "@/components/ui/dialog";
|
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog";
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
|
|
||||||
const Command = React.forwardRef<
|
const Command = React.forwardRef<
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import type { Category } from "./types";
|
import type { Category } from "./types";
|
||||||
|
|
||||||
export async function fetchCategories() {
|
export async function fetchCategories() {
|
||||||
const response = await fetch("api/categories");
|
const response = await fetch(`/ProxmoxVE/api/categories`);
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(`Failed to fetch categories: ${response.statusText}`);
|
throw new Error(`Failed to fetch categories: ${response.statusText}`);
|
||||||
}
|
}
|
||||||
@@ -10,7 +10,7 @@ export async function fetchCategories() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchVersions() {
|
export async function fetchVersions() {
|
||||||
const response = await fetch(`api/versions`);
|
const response = await fetch(`/ProxmoxVE/api/versions`);
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(`Failed to fetch versions: ${response.statusText}`);
|
throw new Error(`Failed to fetch versions: ${response.statusText}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt-get install -y \
|
$STD apt install -y \
|
||||||
lsb-release \
|
lsb-release \
|
||||||
nginx
|
nginx
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
@@ -41,7 +41,7 @@ msg_ok "Set up Database"
|
|||||||
fetch_and_deploy_gh_release "2fauth" "Bubka/2FAuth"
|
fetch_and_deploy_gh_release "2fauth" "Bubka/2FAuth"
|
||||||
|
|
||||||
msg_info "Setup 2FAuth"
|
msg_info "Setup 2FAuth"
|
||||||
cd /opt/2fauth
|
cd /opt/2fauth || exit
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
IPADDRESS=$(hostname -I | awk '{print $1}')
|
IPADDRESS=$(hostname -I | awk '{print $1}')
|
||||||
sed -i -e "s|^APP_URL=.*|APP_URL=http://$IPADDRESS|" \
|
sed -i -e "s|^APP_URL=.*|APP_URL=http://$IPADDRESS|" \
|
||||||
@@ -99,6 +99,7 @@ motd_ssh
|
|||||||
customize
|
customize
|
||||||
|
|
||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
$STD apt-get -y autoremove
|
$STD apt -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt -y autoclean
|
||||||
|
$STD apt -y clean
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt-get install -y \
|
$STD apt install -y \
|
||||||
make \
|
make \
|
||||||
g++
|
g++
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
@@ -22,8 +22,7 @@ msg_ok "Installed Dependencies"
|
|||||||
msg_info "Installing Actual Budget"
|
msg_info "Installing Actual Budget"
|
||||||
cd /opt
|
cd /opt
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||||
NODE_VERSION="22"
|
NODE_VERSION="22" setup_nodejs
|
||||||
setup_nodejs
|
|
||||||
mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config}
|
mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config}
|
||||||
chown -R root:root /opt/actualbudget-data
|
chown -R root:root /opt/actualbudget-data
|
||||||
chmod -R 755 /opt/actualbudget-data
|
chmod -R 755 /opt/actualbudget-data
|
||||||
@@ -50,7 +49,7 @@ cat <<EOF >/opt/actualbudget-data/config.json
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
mkdir -p /opt/actualbudget
|
mkdir -p /opt/actualbudget
|
||||||
cd /opt/actualbudget
|
cd /opt/actualbudget || exit
|
||||||
$STD npm install --location=global @actual-app/sync-server
|
$STD npm install --location=global @actual-app/sync-server
|
||||||
$STD openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfhost.key -out selfhost.crt <<EOF
|
$STD openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfhost.key -out selfhost.crt <<EOF
|
||||||
US
|
US
|
||||||
@@ -92,6 +91,7 @@ motd_ssh
|
|||||||
customize
|
customize
|
||||||
|
|
||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
$STD apt-get -y autoremove
|
$STD apt -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt -y autoclean
|
||||||
|
$STD apt -y clean
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt-get install -y \
|
$STD apt install -y \
|
||||||
gdal-bin \
|
gdal-bin \
|
||||||
libgdal-dev \
|
libgdal-dev \
|
||||||
git \
|
git \
|
||||||
@@ -22,9 +22,9 @@ $STD apt-get install -y \
|
|||||||
libmemcached-tools
|
libmemcached-tools
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
PYTHON_VERSION="3.12" setup_uv
|
PYTHON_VERSION="3.13" setup_uv
|
||||||
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
|
NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs
|
||||||
PG_VERSION="16" PG_MODULES="postgis" setup_postgresql
|
PG_VERSION="17" PG_MODULES="postgis" setup_postgresql
|
||||||
|
|
||||||
msg_info "Set up PostgreSQL Database"
|
msg_info "Set up PostgreSQL Database"
|
||||||
DB_NAME="adventurelog_db"
|
DB_NAME="adventurelog_db"
|
||||||
@@ -74,7 +74,7 @@ DISABLE_REGISTRATION=False
|
|||||||
# EMAIL_HOST_PASSWORD='password'
|
# EMAIL_HOST_PASSWORD='password'
|
||||||
# DEFAULT_FROM_EMAIL='user@example.com'
|
# DEFAULT_FROM_EMAIL='user@example.com'
|
||||||
EOF
|
EOF
|
||||||
cd /opt/adventurelog/backend/server
|
cd /opt/adventurelog/backend/server || exit
|
||||||
mkdir -p /opt/adventurelog/backend/server/media
|
mkdir -p /opt/adventurelog/backend/server/media
|
||||||
$STD uv venv /opt/adventurelog/backend/server/.venv
|
$STD uv venv /opt/adventurelog/backend/server/.venv
|
||||||
$STD /opt/adventurelog/backend/server/.venv/bin/python -m ensurepip --upgrade
|
$STD /opt/adventurelog/backend/server/.venv/bin/python -m ensurepip --upgrade
|
||||||
@@ -88,13 +88,13 @@ PUBLIC_SERVER_URL=http://$LOCAL_IP:8000
|
|||||||
BODY_SIZE_LIMIT=Infinity
|
BODY_SIZE_LIMIT=Infinity
|
||||||
ORIGIN='http://$LOCAL_IP:3000'
|
ORIGIN='http://$LOCAL_IP:3000'
|
||||||
EOF
|
EOF
|
||||||
cd /opt/adventurelog/frontend
|
cd /opt/adventurelog/frontend || exit
|
||||||
$STD pnpm i
|
$STD pnpm i
|
||||||
$STD pnpm build
|
$STD pnpm build
|
||||||
msg_ok "Installed AdventureLog"
|
msg_ok "Installed AdventureLog"
|
||||||
|
|
||||||
msg_info "Setting up Django Admin"
|
msg_info "Setting up Django Admin"
|
||||||
cd /opt/adventurelog/backend/server
|
cd /opt/adventurelog/backend/server || exit
|
||||||
$STD .venv/bin/python -m manage shell <<EOF
|
$STD .venv/bin/python -m manage shell <<EOF
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
UserModel = get_user_model()
|
UserModel = get_user_model()
|
||||||
@@ -148,6 +148,7 @@ motd_ssh
|
|||||||
customize
|
customize
|
||||||
|
|
||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
$STD apt-get -y autoremove
|
$STD apt -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt -y autoclean
|
||||||
|
$STD apt -y clean
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
@@ -13,9 +13,12 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing PostgreSQL"
|
read -r -p "${TAB3}Enter PostgreSQL version (15/16/17): " ver
|
||||||
$STD apk add --no-cache postgresql16 postgresql16-contrib postgresql16-openrc sudo
|
[[ $ver =~ ^(15|16|17)$ ]] || { echo "Invalid version"; exit 1; }
|
||||||
msg_ok "Installed PostgreSQL"
|
|
||||||
|
msg_info "Installing PostgreSQL ${ver}"
|
||||||
|
$STD apk add --no-cache postgresql${ver} postgresql${ver}-contrib postgresql${ver}-openrc sudo
|
||||||
|
msg_ok "Installed PostgreSQL ${ver}"
|
||||||
|
|
||||||
msg_info "Enabling PostgreSQL Service"
|
msg_info "Enabling PostgreSQL Service"
|
||||||
$STD rc-update add postgresql default
|
$STD rc-update add postgresql default
|
||||||
@@ -26,8 +29,8 @@ $STD rc-service postgresql start
|
|||||||
msg_ok "Started PostgreSQL"
|
msg_ok "Started PostgreSQL"
|
||||||
|
|
||||||
msg_info "Configuring PostgreSQL for External Access"
|
msg_info "Configuring PostgreSQL for External Access"
|
||||||
conf_file="/etc/postgresql16/postgresql.conf"
|
conf_file="/etc/postgresql${ver}/postgresql.conf"
|
||||||
hba_file="/etc/postgresql16/pg_hba.conf"
|
hba_file="/etc/postgresql${ver}/pg_hba.conf"
|
||||||
sed -i 's/^#listen_addresses =.*/listen_addresses = '\''*'\''/' "$conf_file"
|
sed -i 's/^#listen_addresses =.*/listen_addresses = '\''*'\''/' "$conf_file"
|
||||||
sed -i '/^host\s\+all\s\+all\s\+127.0.0.1\/32\s\+md5/ s/.*/host all all 0.0.0.0\/0 md5/' "$hba_file"
|
sed -i '/^host\s\+all\s\+all\s\+127.0.0.1\/32\s\+md5/ s/.*/host all all 0.0.0.0\/0 md5/' "$hba_file"
|
||||||
$STD rc-service postgresql restart
|
$STD rc-service postgresql restart
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt-get install -y \
|
$STD apt install -y \
|
||||||
build-essential \
|
build-essential \
|
||||||
jq \
|
jq \
|
||||||
libcairo2-dev \
|
libcairo2-dev \
|
||||||
@@ -22,7 +22,7 @@ $STD apt-get install -y \
|
|||||||
libtool-bin \
|
libtool-bin \
|
||||||
libossp-uuid-dev \
|
libossp-uuid-dev \
|
||||||
libvncserver-dev \
|
libvncserver-dev \
|
||||||
freerdp2-dev \
|
freerdp3-dev \
|
||||||
libssh2-1-dev \
|
libssh2-1-dev \
|
||||||
libtelnet-dev \
|
libtelnet-dev \
|
||||||
libwebsockets-dev \
|
libwebsockets-dev \
|
||||||
@@ -56,8 +56,9 @@ mkdir -p /etc/guacamole/{extensions,lib}
|
|||||||
RELEASE_SERVER=$(curl -fsSL https://api.github.com/repos/apache/guacamole-server/tags | jq -r '.[].name' | grep -v -- '-RC' | head -n 1)
|
RELEASE_SERVER=$(curl -fsSL https://api.github.com/repos/apache/guacamole-server/tags | jq -r '.[].name' | grep -v -- '-RC' | head -n 1)
|
||||||
curl -fsSL "https://api.github.com/repos/apache/guacamole-server/tarball/refs/tags/${RELEASE_SERVER}" | tar -xz --strip-components=1 -C /opt/apache-guacamole/server
|
curl -fsSL "https://api.github.com/repos/apache/guacamole-server/tarball/refs/tags/${RELEASE_SERVER}" | tar -xz --strip-components=1 -C /opt/apache-guacamole/server
|
||||||
cd /opt/apache-guacamole/server
|
cd /opt/apache-guacamole/server
|
||||||
|
export CPPFLAGS="-Wno-error=deprecated-declarations"
|
||||||
$STD autoreconf -fi
|
$STD autoreconf -fi
|
||||||
$STD ./configure --with-init-dir=/etc/init.d --enable-allow-freerdp-snapshots
|
$STD ./configure --with-init-dir=/etc/init.d --enable-allow-freerdp-snapshots --disable-guaclog
|
||||||
$STD make
|
$STD make
|
||||||
$STD make install
|
$STD make install
|
||||||
$STD ldconfig
|
$STD ldconfig
|
||||||
@@ -149,6 +150,6 @@ customize
|
|||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
rm -rf ~/mysql-connector-j-9.3.0{,.tar.gz}
|
rm -rf ~/mysql-connector-j-9.3.0{,.tar.gz}
|
||||||
rm -rf ~/guacamole-auth-jdbc-$RELEASE_SERVER{,.tar.gz}
|
rm -rf ~/guacamole-auth-jdbc-$RELEASE_SERVER{,.tar.gz}
|
||||||
$STD apt-get -y autoremove
|
$STD apt -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt -y autoclean
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ $STD apt-get install -y \
|
|||||||
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
||||||
msg_ok "Setup Python3"
|
msg_ok "Setup Python3"
|
||||||
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="24" setup_nodejs
|
||||||
|
|
||||||
msg_info "Installing Change Detection"
|
msg_info "Installing Change Detection"
|
||||||
mkdir /opt/changedetection
|
mkdir /opt/changedetection
|
||||||
@@ -62,7 +62,7 @@ msg_info "Installing Browserless & Playwright"
|
|||||||
mkdir /opt/browserless
|
mkdir /opt/browserless
|
||||||
$STD python3 -m pip install playwright
|
$STD python3 -m pip install playwright
|
||||||
$STD git clone https://github.com/browserless/chrome /opt/browserless
|
$STD git clone https://github.com/browserless/chrome /opt/browserless
|
||||||
$STD npm install --prefix /opt/browserless
|
$STD npm ci --include=optional --include=dev --prefix /opt/browserless
|
||||||
$STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps &>/dev/null
|
$STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps &>/dev/null
|
||||||
$STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome &>/dev/null
|
$STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome &>/dev/null
|
||||||
$STD /opt/browserless/node_modules/playwright-core/cli.js install chromium firefox webkit &>/dev/null
|
$STD /opt/browserless/node_modules/playwright-core/cli.js install chromium firefox webkit &>/dev/null
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ update_os
|
|||||||
msg_info "Installing Cockpit"
|
msg_info "Installing Cockpit"
|
||||||
source /etc/os-release
|
source /etc/os-release
|
||||||
echo "deb http://deb.debian.org/debian ${VERSION_CODENAME}-backports main" >/etc/apt/sources.list.d/backports.list
|
echo "deb http://deb.debian.org/debian ${VERSION_CODENAME}-backports main" >/etc/apt/sources.list.d/backports.list
|
||||||
$STD apt-get update
|
$STD apt update
|
||||||
$STD apt-get install -t ${VERSION_CODENAME}-backports cockpit --no-install-recommends -y
|
$STD apt install -t ${VERSION_CODENAME}-backports cockpit --no-install-recommends -y
|
||||||
sed -i "s/root//g" /etc/cockpit/disallowed-users
|
sed -i "s/root//g" /etc/cockpit/disallowed-users
|
||||||
msg_ok "Installed Cockpit"
|
msg_ok "Installed Cockpit"
|
||||||
|
|
||||||
@@ -26,6 +26,6 @@ motd_ssh
|
|||||||
customize
|
customize
|
||||||
|
|
||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
$STD apt-get -y autoremove
|
$STD apt -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt -y autoclean
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
131
install/ghostfolio-install.sh
Normal file
131
install/ghostfolio-install.sh
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: lucasfell
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://ghostfol.io/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
build-essential \
|
||||||
|
openssl \
|
||||||
|
ca-certificates \
|
||||||
|
redis-server
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
PG_VERSION="17" setup_postgresql
|
||||||
|
NODE_VERSION="24" setup_nodejs
|
||||||
|
|
||||||
|
msg_info "Setting up Database"
|
||||||
|
DB_NAME=ghostfolio
|
||||||
|
DB_USER=ghostfolio
|
||||||
|
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||||
|
REDIS_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||||
|
ACCESS_TOKEN_SALT=$(openssl rand -base64 32)
|
||||||
|
JWT_SECRET_KEY=$(openssl rand -base64 32)
|
||||||
|
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME;"
|
||||||
|
$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH ENCRYPTED PASSWORD '$DB_PASS';"
|
||||||
|
$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;"
|
||||||
|
$STD sudo -u postgres psql -c "ALTER USER $DB_USER CREATEDB;"
|
||||||
|
$STD sudo -u postgres psql -d $DB_NAME -c "GRANT ALL ON SCHEMA public TO $DB_USER;"
|
||||||
|
$STD sudo -u postgres psql -d $DB_NAME -c "GRANT CREATE ON SCHEMA public TO $DB_USER;"
|
||||||
|
$STD sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO $DB_USER;"
|
||||||
|
$STD sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO $DB_USER;"
|
||||||
|
{
|
||||||
|
echo "Ghostfolio Credentials"
|
||||||
|
echo "Database User: $DB_USER"
|
||||||
|
echo "Database Password: $DB_PASS"
|
||||||
|
echo "Database Name: $DB_NAME"
|
||||||
|
echo "Redis Password: $REDIS_PASS"
|
||||||
|
echo "Access Token Salt: $ACCESS_TOKEN_SALT"
|
||||||
|
echo "JWT Secret Key: $JWT_SECRET_KEY"
|
||||||
|
} >>~/ghostfolio.creds
|
||||||
|
msg_ok "Set up Database"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "ghostfolio" "ghostfolio/ghostfolio" "tarball" "latest" "/opt/ghostfolio"
|
||||||
|
|
||||||
|
msg_info "Setup Ghostfolio"
|
||||||
|
sed -i "s/# requirepass foobared/requirepass $REDIS_PASS/" /etc/redis/redis.conf
|
||||||
|
systemctl restart redis-server
|
||||||
|
cd /opt/ghostfolio
|
||||||
|
$STD npm ci
|
||||||
|
$STD npm run build:production
|
||||||
|
msg_ok "Built Ghostfolio"
|
||||||
|
|
||||||
|
msg_ok "Optional CoinGecko API Configuration"
|
||||||
|
echo
|
||||||
|
echo -e "${YW}CoinGecko API keys are optional but provide better cryptocurrency data.${CL}"
|
||||||
|
echo -e "${YW}You can skip this and add them later by editing /opt/ghostfolio/.env${CL}"
|
||||||
|
echo
|
||||||
|
read -rp "${TAB3}CoinGecko Demo API key (press Enter to skip): " COINGECKO_DEMO_KEY
|
||||||
|
read -rp "${TAB3}CoinGecko Pro API key (press Enter to skip): " COINGECKO_PRO_KEY
|
||||||
|
|
||||||
|
msg_info "Setting up Environment"
|
||||||
|
cat <<EOF >/opt/ghostfolio/.env
|
||||||
|
DATABASE_URL=postgresql://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME?connect_timeout=300&sslmode=prefer
|
||||||
|
REDIS_HOST=localhost
|
||||||
|
REDIS_PORT=6379
|
||||||
|
REDIS_PASSWORD=$REDIS_PASS
|
||||||
|
ACCESS_TOKEN_SALT=$ACCESS_TOKEN_SALT
|
||||||
|
JWT_SECRET_KEY=$JWT_SECRET_KEY
|
||||||
|
NODE_ENV=production
|
||||||
|
PORT=3333
|
||||||
|
HOST=0.0.0.0
|
||||||
|
EOF
|
||||||
|
|
||||||
|
if [[ -n "${COINGECKO_DEMO_KEY:-}" ]]; then
|
||||||
|
echo "API_KEY_COINGECKO_DEMO=$COINGECKO_DEMO_KEY" >>/opt/ghostfolio/.env
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${COINGECKO_PRO_KEY:-}" ]]; then
|
||||||
|
echo "API_KEY_COINGECKO_PRO=$COINGECKO_PRO_KEY" >>/opt/ghostfolio/.env
|
||||||
|
fi
|
||||||
|
msg_ok "Set up Environment"
|
||||||
|
|
||||||
|
msg_info "Running Database Migrations"
|
||||||
|
cd /opt/ghostfolio
|
||||||
|
$STD npx prisma migrate deploy
|
||||||
|
$STD npx prisma db seed
|
||||||
|
msg_ok "Database Migrations Complete"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/ghostfolio.service
|
||||||
|
[Unit]
|
||||||
|
Description=Ghostfolio Investment Tracker
|
||||||
|
After=network.target postgresql.service redis-server.service
|
||||||
|
Wants=postgresql.service redis-server.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/ghostfolio/dist/apps/api
|
||||||
|
Environment=NODE_ENV=production
|
||||||
|
EnvironmentFile=/opt/ghostfolio/.env
|
||||||
|
ExecStart=/usr/bin/node main.js
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl enable -q --now ghostfolio
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
$STD npm cache clean --force
|
||||||
|
$STD apt -y autoremove
|
||||||
|
$STD apt -y autoclean
|
||||||
|
$STD apt -y clean
|
||||||
|
msg_ok "Cleaned"
|
||||||
@@ -43,11 +43,11 @@ msg_ok "Set up database"
|
|||||||
|
|
||||||
msg_info "Installing GLPi"
|
msg_info "Installing GLPi"
|
||||||
cd /opt
|
cd /opt
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/glpi-project/glpi/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/')
|
#RELEASE=$(curl -fsSL https://api.github.com/repos/glpi-project/glpi/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/')
|
||||||
curl -fsSL "https://github.com/glpi-project/glpi/releases/download/${RELEASE}/glpi-${RELEASE}.tgz" -o "glpi-${RELEASE}.tgz"
|
curl -fsSL "https://github.com/glpi-project/glpi/releases/download/10.0.20/glpi-10.0.20.tgz" -o "glpi-10.0.20.tgz"
|
||||||
$STD tar -xzvf glpi-${RELEASE}.tgz
|
$STD tar -xzvf glpi-10.0.20.tgz
|
||||||
cd /opt/glpi
|
cd /opt/glpi
|
||||||
$STD php bin/console db:install --db-name=$DB_NAME --db-user=$DB_USER --db-password=$DB_PASS --no-interaction
|
$STD php bin/console db:install --db-name=$DB_NAME --db-user=$DB_USER --db-password=$DB_PASS --no-interaction --allow-superuser
|
||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
||||||
msg_ok "Installed GLPi"
|
msg_ok "Installed GLPi"
|
||||||
|
|
||||||
@@ -144,7 +144,7 @@ customize
|
|||||||
|
|
||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
rm -rf /opt/glpi/install
|
rm -rf /opt/glpi/install
|
||||||
rm -rf /opt/glpi-${RELEASE}.tgz
|
rm -rf /opt/glpi-10.0.20.tgz
|
||||||
$STD apt-get -y autoremove
|
$STD apt-get -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt-get -y autoclean
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
@@ -40,7 +40,11 @@ WantedBy=multi-user.target
|
|||||||
EOF
|
EOF
|
||||||
systemctl enable -q --now goaway
|
systemctl enable -q --now goaway
|
||||||
sleep 10
|
sleep 10
|
||||||
ADMIN_PASS=$(awk -F': ' '/Randomly generated admin password:/ {print $2}' /var/log/goaway.log | tail -n1)
|
for i in {1..30}; do
|
||||||
|
ADMIN_PASS=$(awk -F': ' "/Randomly generated admin password:/ {print \$2; exit}" /var/log/goaway.log)
|
||||||
|
[ -n "$ADMIN_PASS" ] && break
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
{
|
{
|
||||||
echo "GoAway Credentials"
|
echo "GoAway Credentials"
|
||||||
echo "Admin User: admin"
|
echo "Admin User: admin"
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ cat <<EOF >/opt/grist/.env
|
|||||||
NODE_ENV=production
|
NODE_ENV=production
|
||||||
GRIST_HOST=0.0.0.0
|
GRIST_HOST=0.0.0.0
|
||||||
EOF
|
EOF
|
||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
|
||||||
msg_ok "Installed Grist"
|
msg_ok "Installed Grist"
|
||||||
|
|
||||||
msg_info "Create Service"
|
msg_info "Create Service"
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ $STD apt-get update
|
|||||||
$STD apt-get install -y jellyfin-ffmpeg7
|
$STD apt-get install -y jellyfin-ffmpeg7
|
||||||
ln -s /usr/lib/jellyfin-ffmpeg/ffmpeg /usr/bin/ffmpeg
|
ln -s /usr/lib/jellyfin-ffmpeg/ffmpeg /usr/bin/ffmpeg
|
||||||
ln -s /usr/lib/jellyfin-ffmpeg/ffprobe /usr/bin/ffprobe
|
ln -s /usr/lib/jellyfin-ffmpeg/ffprobe /usr/bin/ffprobe
|
||||||
if [[ "$CTTYPE" == "0" ]]; then
|
if [[ "$CTTYPE" == "0" && -d /dev/dri ]]; then
|
||||||
chgrp video /dev/dri
|
chgrp video /dev/dri
|
||||||
chmod 755 /dev/dri
|
chmod 755 /dev/dri
|
||||||
chmod 660 /dev/dri/*
|
chmod 660 /dev/dri/*
|
||||||
@@ -272,7 +272,7 @@ GEO_DIR="${INSTALL_DIR}/geodata"
|
|||||||
mkdir -p "$INSTALL_DIR"
|
mkdir -p "$INSTALL_DIR"
|
||||||
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
|
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.143.1" "$SRC_DIR"
|
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.0.1" "$SRC_DIR"
|
||||||
|
|
||||||
msg_info "Installing ${APPLICATION} (patience)"
|
msg_info "Installing ${APPLICATION} (patience)"
|
||||||
|
|
||||||
@@ -451,4 +451,5 @@ customize
|
|||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
$STD apt-get -y autoremove
|
$STD apt-get -y autoremove
|
||||||
$STD apt-get -y autoclean
|
$STD apt-get -y autoclean
|
||||||
|
$STD apt clean -y
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ $STD apt-get install -y --no-install-recommends \
|
|||||||
g++ \
|
g++ \
|
||||||
musl-dev \
|
musl-dev \
|
||||||
ffmpeg \
|
ffmpeg \
|
||||||
git \
|
|
||||||
make \
|
make \
|
||||||
ca-certificates
|
ca-certificates
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
@@ -30,25 +29,29 @@ msg_ok "Installed Dependencies"
|
|||||||
PYTHON_VERSION="3.13" setup_uv
|
PYTHON_VERSION="3.13" setup_uv
|
||||||
NODE_VERSION="22" setup_nodejs
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
|
||||||
|
msg_info "Installing Deno"
|
||||||
|
export DENO_INSTALL="/usr/local"
|
||||||
|
curl -fsSL https://deno.land/install.sh | $STD sh -s -- -y
|
||||||
|
[[ ":$PATH:" != *":/usr/local/bin:"* ]] &&
|
||||||
|
echo 'export PATH="/usr/local/bin:$PATH"' >>~/.bashrc &&
|
||||||
|
source ~/.bashrc
|
||||||
|
msg_ok "Installed Deno"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "metube" "alexta69/metube" "tarball" "latest"
|
||||||
|
|
||||||
msg_info "Installing MeTube"
|
msg_info "Installing MeTube"
|
||||||
$STD git clone https://github.com/alexta69/metube /opt/metube
|
|
||||||
cd /opt/metube/ui
|
cd /opt/metube/ui
|
||||||
$STD npm install
|
$STD npm install
|
||||||
$STD node_modules/.bin/ng build
|
$STD node_modules/.bin/ng build
|
||||||
cd /opt/metube
|
cd /opt/metube
|
||||||
$STD uv venv /opt/metube/.venv
|
$STD uv sync
|
||||||
$STD /opt/metube/.venv/bin/python -m ensurepip --upgrade
|
|
||||||
$STD /opt/metube/.venv/bin/python -m pip install --upgrade pip
|
|
||||||
$STD /opt/metube/.venv/bin/python -m pip install pipenv
|
|
||||||
$STD /opt/metube/.venv/bin/pipenv install
|
|
||||||
$STD /opt/metube/.venv/bin/pipenv update yt-dlp
|
|
||||||
|
|
||||||
mkdir -p /opt/metube_downloads /opt/metube_downloads/.metube /opt/metube_downloads/music /opt/metube_downloads/videos
|
mkdir -p /opt/metube_downloads /opt/metube_downloads/.metube /opt/metube_downloads/music /opt/metube_downloads/videos
|
||||||
cat <<EOF >/opt/metube/.env
|
cat <<EOF >/opt/metube/.env
|
||||||
DOWNLOAD_DIR=/opt/metube_downloads
|
DOWNLOAD_DIR=/opt/metube_downloads
|
||||||
STATE_DIR=/opt/metube_downloads/.metube
|
STATE_DIR=/opt/metube_downloads/.metube
|
||||||
TEMP_DIR=/opt/metube_downloads
|
TEMP_DIR=/opt/metube_downloads
|
||||||
YTDL_OPTIONS={"trim_file_name":10}
|
YTDL_OPTIONS={"trim_file_name":10,"extractor_args":{"youtube":{"player_client":["default","-tv_simply"]}}}
|
||||||
EOF
|
EOF
|
||||||
msg_ok "Installed MeTube"
|
msg_ok "Installed MeTube"
|
||||||
|
|
||||||
@@ -62,7 +65,7 @@ After=network.target
|
|||||||
Type=simple
|
Type=simple
|
||||||
WorkingDirectory=/opt/metube
|
WorkingDirectory=/opt/metube
|
||||||
EnvironmentFile=/opt/metube/.env
|
EnvironmentFile=/opt/metube/.env
|
||||||
ExecStart=/opt/metube/.venv/bin/pipenv run python3 app/main.py
|
ExecStart=/opt/metube/.venv/bin/python3 app/main.py
|
||||||
Restart=always
|
Restart=always
|
||||||
User=root
|
User=root
|
||||||
|
|
||||||
|
|||||||
54
install/myip-install.sh
Normal file
54
install/myip-install.sh
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: Slaviša Arežina (tremor021)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://ipcheck.ing/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
fetch_and_deploy_gh_release "myip" "jason5ng32/MyIP" "tarball"
|
||||||
|
|
||||||
|
msg_info "Configuring MyIP"
|
||||||
|
cd /opt/myip
|
||||||
|
cp .env.example .env
|
||||||
|
$STD npm install
|
||||||
|
$STD npm run build
|
||||||
|
msg_ok "Configured MyIP"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/myip.service
|
||||||
|
[Unit]
|
||||||
|
Description=MyIP Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/myip
|
||||||
|
ExecStart=/usr/bin/npm start
|
||||||
|
EnvironmentFile=/opt/myip/.env
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now myip
|
||||||
|
msg_ok "Service created"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
$STD apt -y autoremove
|
||||||
|
$STD apt -y autoclean
|
||||||
|
$STD apt -y clean
|
||||||
|
msg_ok "Cleaned"
|
||||||
@@ -14,11 +14,13 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
msg_info "Installing Dependencies"
|
||||||
$STD apt-get install -y \
|
$STD apt-get install -y python3-lxml
|
||||||
build-essential \
|
curl -fsSL "http://archive.ubuntu.com/ubuntu/pool/universe/l/lxml-html-clean/python3-lxml-html-clean_0.1.1-1_all.deb" -o /opt/python3-lxml-html-clean.deb
|
||||||
make
|
$STD dpkg -i /opt/python3-lxml-html-clean.deb
|
||||||
msg_ok "Installed Dependencies"
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
PG_VERSION="18" setup_postgresql
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://nightly.odoo.com/ | grep -oE 'href="[0-9]+\.[0-9]+/nightly"' | head -n1 | cut -d'"' -f2 | cut -d/ -f1)
|
RELEASE=$(curl -fsSL https://nightly.odoo.com/ | grep -oE 'href="[0-9]+\.[0-9]+/nightly"' | head -n1 | cut -d'"' -f2 | cut -d/ -f1)
|
||||||
LATEST_VERSION=$(curl -fsSL "https://nightly.odoo.com/${RELEASE}/nightly/deb/" |
|
LATEST_VERSION=$(curl -fsSL "https://nightly.odoo.com/${RELEASE}/nightly/deb/" |
|
||||||
grep -oP "odoo_${RELEASE}\.\d+_all\.deb" |
|
grep -oP "odoo_${RELEASE}\.\d+_all\.deb" |
|
||||||
@@ -69,6 +71,7 @@ customize
|
|||||||
|
|
||||||
msg_info "Cleaning up"
|
msg_info "Cleaning up"
|
||||||
rm -f /opt/odoo.deb
|
rm -f /opt/odoo.deb
|
||||||
|
rm -f /opt/python3-lxml-html-clean.deb
|
||||||
$STD apt-get autoremove
|
$STD apt-get autoremove
|
||||||
$STD apt-get autoclean
|
$STD apt-get autoclean
|
||||||
msg_ok "Cleaned"
|
msg_ok "Cleaned"
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ ENABLE_OLLAMA_API=false
|
|||||||
OLLAMA_BASE_URL=http://0.0.0.0:11434
|
OLLAMA_BASE_URL=http://0.0.0.0:11434
|
||||||
EOF
|
EOF
|
||||||
$STD npm install --force
|
$STD npm install --force
|
||||||
export NODE_OPTIONS="--max-old-space-size=3584"
|
export NODE_OPTIONS="--max-old-space-size=6000"
|
||||||
$STD npm run build
|
$STD npm run build
|
||||||
msg_ok "Installed Open WebUI"
|
msg_ok "Installed Open WebUI"
|
||||||
|
|
||||||
|
|||||||
@@ -1,69 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2025 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://petio.tv/
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing MongoDB 4.4"
|
|
||||||
curl -fsSL "https://www.mongodb.org/static/pgp/server-4.4.asc" | gpg --dearmor >/usr/share/keyrings/mongodb-server-4.4.gpg
|
|
||||||
# Determine OS ID
|
|
||||||
OS_ID=$(grep '^ID=' /etc/os-release | cut -d'=' -f2)
|
|
||||||
|
|
||||||
if [ "$OS_ID" = "debian" ]; then
|
|
||||||
echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-4.4.gpg ] http://repo.mongodb.org/apt/debian $(grep '^VERSION_CODENAME=' /etc/os-release | cut -d'=' -f2)/mongodb-org/4.4 main" >/etc/apt/sources.list.d/mongodb-org-4.4.list
|
|
||||||
else
|
|
||||||
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-4.4.gpg ] https://repo.mongodb.org/apt/ubuntu $(grep '^VERSION_CODENAME=' /etc/os-release | cut -d'=' -f2)/mongodb-org/4.4 multiverse" >/etc/apt/sources.list.d/mongodb-org-4.4.list
|
|
||||||
fi
|
|
||||||
|
|
||||||
$STD apt-get update
|
|
||||||
$STD apt-get install -y mongodb-org
|
|
||||||
sed -i 's/bindIp: 127.0.0.1/bindIp: 0.0.0.0/' /etc/mongod.conf
|
|
||||||
systemctl enable -q --now mongod
|
|
||||||
msg_ok "MongoDB 4.4 Installed"
|
|
||||||
|
|
||||||
msg_info "Installing Petio"
|
|
||||||
useradd -M --shell=/bin/false petio
|
|
||||||
mkdir /opt/Petio
|
|
||||||
curl -fsSL "https://petio.tv/releases/latest" -o "petio-latest.zip"
|
|
||||||
$STD unzip petio-latest.zip -d /opt/Petio
|
|
||||||
rm -rf petio-latest.zip
|
|
||||||
chown -R petio:petio /opt/Petio
|
|
||||||
msg_ok "Installed Petio"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
cat <<EOF >/etc/systemd/system/petio.service
|
|
||||||
[Unit]
|
|
||||||
Description=Petio a content request system
|
|
||||||
After=network.target mongod.service
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
User=petio
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=1
|
|
||||||
ExecStart=/opt/Petio/bin/petio-linux
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
|
|
||||||
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now petio
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
|
|
||||||
msg_info "Cleaning up"
|
|
||||||
$STD apt-get -y autoremove
|
|
||||||
$STD apt-get -y autoclean
|
|
||||||
msg_ok "Cleaned"
|
|
||||||
@@ -38,8 +38,8 @@ $STD mariadb -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUS
|
|||||||
} >>~/plant-it.creds
|
} >>~/plant-it.creds
|
||||||
msg_ok "Set up MariaDB"
|
msg_ok "Set up MariaDB"
|
||||||
|
|
||||||
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "plant-it" "MDeLuise/plant-it" "singlefile" "latest" "/opt/plant-it/backend" "server.jar"
|
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "plant-it" "MDeLuise/plant-it" "singlefile" "0.10.0" "/opt/plant-it/backend" "server.jar"
|
||||||
fetch_and_deploy_gh_release "plant-it-front" "MDeLuise/plant-it" "prebuild" "latest" "/opt/plant-it/frontend" "client.tar.gz"
|
fetch_and_deploy_gh_release "plant-it-front" "MDeLuise/plant-it" "prebuild" "0.10.0" "/opt/plant-it/frontend" "client.tar.gz"
|
||||||
|
|
||||||
msg_info "Configured Plant-it"
|
msg_info "Configured Plant-it"
|
||||||
mkdir -p /opt/plant-it-data
|
mkdir -p /opt/plant-it-data
|
||||||
|
|||||||
@@ -13,9 +13,11 @@ setting_up_container
|
|||||||
network_check
|
network_check
|
||||||
update_os
|
update_os
|
||||||
|
|
||||||
PG_VERSION="17" setup_postgresql
|
read -r -p "${TAB3}Enter PostgreSQL version (15/16/17/18): " ver
|
||||||
|
[[ $ver =~ ^(15|16|17|18)$ ]] || { echo "Invalid version"; exit 1; }
|
||||||
|
PG_VERSION=$ver setup_postgresql
|
||||||
|
|
||||||
cat <<EOF >/etc/postgresql/17/main/pg_hba.conf
|
cat <<EOF >/etc/postgresql/$ver/main/pg_hba.conf
|
||||||
# PostgreSQL Client Authentication Configuration File
|
# PostgreSQL Client Authentication Configuration File
|
||||||
local all postgres peer
|
local all postgres peer
|
||||||
# TYPE DATABASE USER ADDRESS METHOD
|
# TYPE DATABASE USER ADDRESS METHOD
|
||||||
@@ -34,7 +36,7 @@ host replication all 127.0.0.1/32 scram-sha-256
|
|||||||
host replication all ::1/128 scram-sha-256
|
host replication all ::1/128 scram-sha-256
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cat <<EOF >/etc/postgresql/17/main/postgresql.conf
|
cat <<EOF >/etc/postgresql/$ver/main/postgresql.conf
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
# PostgreSQL configuration file
|
# PostgreSQL configuration file
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
@@ -43,10 +45,10 @@ cat <<EOF >/etc/postgresql/17/main/postgresql.conf
|
|||||||
# FILE LOCATIONS
|
# FILE LOCATIONS
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
data_directory = '/var/lib/postgresql/17/main'
|
data_directory = '/var/lib/postgresql/$ver/main'
|
||||||
hba_file = '/etc/postgresql/17/main/pg_hba.conf'
|
hba_file = '/etc/postgresql/$ver/main/pg_hba.conf'
|
||||||
ident_file = '/etc/postgresql/17/main/pg_ident.conf'
|
ident_file = '/etc/postgresql/$ver/main/pg_ident.conf'
|
||||||
external_pid_file = '/var/run/postgresql/17-main.pid'
|
external_pid_file = '/var/run/postgresql/$ver-main.pid'
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# CONNECTIONS AND AUTHENTICATION
|
# CONNECTIONS AND AUTHENTICATION
|
||||||
@@ -92,7 +94,7 @@ log_timezone = 'Etc/UTC'
|
|||||||
# PROCESS TITLE
|
# PROCESS TITLE
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
cluster_name = '17/main'
|
cluster_name = '$ver/main'
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# CLIENT CONNECTION DEFAULTS
|
# CLIENT CONNECTION DEFAULTS
|
||||||
|
|||||||
64
install/pve-scripts-local-install.sh
Normal file
64
install/pve-scripts-local-install.sh
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: michelroegl-brunner
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt-get update
|
||||||
|
$STD apt-get install -y \
|
||||||
|
build-essential \
|
||||||
|
sshpass \
|
||||||
|
rsync \
|
||||||
|
expect
|
||||||
|
msg_ok "Dependencies installed."
|
||||||
|
|
||||||
|
NODE_VERSION=22 setup_nodejs
|
||||||
|
fetch_and_deploy_gh_release "ProxmoxVE-Local" "community-scripts/ProxmoxVE-Local"
|
||||||
|
|
||||||
|
msg_info "Installing PVE Scripts local"
|
||||||
|
cd /opt/ProxmoxVE-Local
|
||||||
|
$STD npm install
|
||||||
|
cp .env.example .env
|
||||||
|
mkdir -p data
|
||||||
|
chmod 755 data
|
||||||
|
$STD npm run build
|
||||||
|
msg_ok "Installed PVE Scripts local"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/pvescriptslocal.service
|
||||||
|
[Unit]
|
||||||
|
Description=PVEScriptslocal Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/opt/ProxmoxVE-Local
|
||||||
|
ExecStart=/usr/bin/npm start
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
Environment=NODE_ENV=production
|
||||||
|
User=root
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl enable -q --now pvescriptslocal
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
$STD apt -y autoremove
|
||||||
|
$STD apt -y autoclean
|
||||||
|
$STD apt -y clean
|
||||||
|
msg_ok "Cleaned"
|
||||||
96
install/verdaccio-install.sh
Normal file
96
install/verdaccio-install.sh
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: BrynnJKnight
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://verdaccio.org/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt-get install -y \
|
||||||
|
ca-certificates \
|
||||||
|
build-essential
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
NODE_VERSION="22" NODE_MODULE="verdaccio" setup_nodejs
|
||||||
|
|
||||||
|
msg_info "Configuring Verdaccio"
|
||||||
|
mkdir -p /opt/verdaccio/config
|
||||||
|
mkdir -p /opt/verdaccio/storage
|
||||||
|
|
||||||
|
cat <<EOF >/opt/verdaccio/config/config.yaml
|
||||||
|
# Verdaccio configuration
|
||||||
|
storage: /opt/verdaccio/storage
|
||||||
|
auth:
|
||||||
|
htpasswd:
|
||||||
|
file: /opt/verdaccio/storage/htpasswd
|
||||||
|
max_users: 1000
|
||||||
|
uplinks:
|
||||||
|
npmjs:
|
||||||
|
url: https://registry.npmjs.org/
|
||||||
|
packages:
|
||||||
|
'@*/*':
|
||||||
|
access: \$all
|
||||||
|
publish: \$authenticated
|
||||||
|
proxy: npmjs
|
||||||
|
'**':
|
||||||
|
access: \$all
|
||||||
|
publish: \$authenticated
|
||||||
|
proxy: npmjs
|
||||||
|
middlewares:
|
||||||
|
audit:
|
||||||
|
enabled: true
|
||||||
|
logs:
|
||||||
|
- {type: stdout, format: pretty, level: http}
|
||||||
|
listen:
|
||||||
|
- 0.0.0.0:4873
|
||||||
|
web:
|
||||||
|
enable: true
|
||||||
|
title: Verdaccio
|
||||||
|
gravatar: true
|
||||||
|
sort_packages: asc
|
||||||
|
login: true
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chown -R root:root /opt/verdaccio
|
||||||
|
chmod -R 755 /opt/verdaccio
|
||||||
|
msg_ok "Configured Verdaccio"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/verdaccio.service
|
||||||
|
[Unit]
|
||||||
|
Description=Verdaccio lightweight private npm proxy registry
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/bin/verdaccio --config /opt/verdaccio/config/config.yaml
|
||||||
|
Restart=on-failure
|
||||||
|
StandardOutput=journal
|
||||||
|
StandardError=journal
|
||||||
|
SyslogIdentifier=verdaccio
|
||||||
|
KillMode=control-group
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl enable -q --now verdaccio
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
$STD apt -y autoremove
|
||||||
|
$STD apt -y autoclean
|
||||||
|
$STD apt -y clean
|
||||||
|
msg_ok "Cleaned"
|
||||||
119
install/warracker-install.sh
Normal file
119
install/warracker-install.sh
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: bvdberg01
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/sassanix/Warracker/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
build-essential \
|
||||||
|
libpq-dev \
|
||||||
|
nginx
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
PYTHON_VERSION="3.12" setup_uv
|
||||||
|
PG_VERSION="17" setup_postgresql
|
||||||
|
|
||||||
|
msg_info "Setup PostgreSQL"
|
||||||
|
DB_NAME="warranty_db"
|
||||||
|
DB_USER="warranty_user"
|
||||||
|
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
|
||||||
|
DB_ADMIN_USER="warracker_admin"
|
||||||
|
DB_ADMIN_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
|
||||||
|
$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';"
|
||||||
|
$STD sudo -u postgres psql -c "CREATE USER $DB_ADMIN_USER WITH PASSWORD '$DB_ADMIN_PASS' SUPERUSER;"
|
||||||
|
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_ADMIN_USER;"
|
||||||
|
$STD sudo -u postgres psql -d "$DB_NAME" -c "GRANT USAGE ON SCHEMA public TO $DB_USER;"
|
||||||
|
$STD sudo -u postgres psql -d "$DB_NAME" -c "GRANT CREATE ON SCHEMA public TO $DB_USER;"
|
||||||
|
$STD sudo -u postgres psql -d "$DB_NAME" -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO $DB_USER;"
|
||||||
|
{
|
||||||
|
echo "Application Credentials"
|
||||||
|
echo "DB_NAME: $DB_NAME"
|
||||||
|
echo "DB_USER: $DB_USER"
|
||||||
|
echo "DB_PASS: $DB_PASS"
|
||||||
|
echo "DB_ADMIN_USER: $DB_ADMIN_USER"
|
||||||
|
echo "DB_ADMIN_PASS: $DB_ADMIN_PASS"
|
||||||
|
} >>~/warracker.creds
|
||||||
|
msg_ok "Setup PostgreSQL"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "warracker" "sassanix/Warracker" "tarball" "latest" "/opt/warracker"
|
||||||
|
|
||||||
|
msg_info "Installing Warracker"
|
||||||
|
cd /opt/warracker/backend
|
||||||
|
$STD uv venv .venv
|
||||||
|
$STD source .venv/bin/activate
|
||||||
|
$STD uv pip install -r requirements.txt
|
||||||
|
mv /opt/warracker/env.example /opt/.env
|
||||||
|
sed -i \
|
||||||
|
-e "s/your_secure_database_password/$DB_PASS/" \
|
||||||
|
-e "s/your_secure_admin_password/$DB_ADMIN_PASS/" \
|
||||||
|
-e "s|^# DB_PORT=5432$|DB_HOST=127.0.0.1|" \
|
||||||
|
-e "s|your_very_secure_flask_secret_key_change_this_in_production|$(openssl rand -base64 32 | tr -d '\n')|" \
|
||||||
|
/opt/.env
|
||||||
|
mkdir -p /data/uploads
|
||||||
|
msg_ok "Installed Warracker"
|
||||||
|
|
||||||
|
msg_info "Configuring Nginx"
|
||||||
|
mv /opt/warracker/nginx.conf /etc/nginx/sites-available/warracker.conf
|
||||||
|
sed -i \
|
||||||
|
-e "s|alias /var/www/html/locales/;|alias /opt/warracker/locales/;|" \
|
||||||
|
-e "s|/var/www/html|/opt/warracker/frontend|g" \
|
||||||
|
-e "s/client_max_body_size __NGINX_MAX_BODY_SIZE_CONFIG_VALUE__/client_max_body_size 32M/" \
|
||||||
|
/etc/nginx/sites-available/warracker.conf
|
||||||
|
ln -s /etc/nginx/sites-available/warracker.conf /etc/nginx/sites-enabled/warracker.conf
|
||||||
|
rm /etc/nginx/sites-enabled/default
|
||||||
|
systemctl restart nginx
|
||||||
|
|
||||||
|
msg_ok "Configured Nginx"
|
||||||
|
|
||||||
|
msg_info "Creating systemd services"
|
||||||
|
cat <<EOF >/etc/systemd/system/warrackermigration.service
|
||||||
|
[Unit]
|
||||||
|
Description=Warracker Migration Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
WorkingDirectory=/opt/warracker/backend/migrations
|
||||||
|
EnvironmentFile=/opt/.env
|
||||||
|
ExecStart=/opt/warracker/backend/.venv/bin/python apply_migrations.py
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF >/etc/systemd/system/warracker.service
|
||||||
|
[Unit]
|
||||||
|
Description=Warracker Service
|
||||||
|
After=network.target warrackermigration.service
|
||||||
|
Requires=warrackermigration.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/opt/warracker
|
||||||
|
EnvironmentFile=/opt/.env
|
||||||
|
ExecStart=/opt/warracker/backend/.venv/bin/gunicorn --config /opt/warracker/backend/gunicorn_config.py backend:create_app() --bind 127.0.0.1:5000
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now warracker
|
||||||
|
msg_ok "Started Warracker Services"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
|
||||||
|
msg_info "Cleaning up"
|
||||||
|
$STD apt -y autoremove
|
||||||
|
$STD apt -y autoclean
|
||||||
|
$STD apt -y clean
|
||||||
|
msg_ok "Cleaned"
|
||||||
294
tools/addon/phpmyadmin.sh
Normal file
294
tools/addon/phpmyadmin.sh
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2025 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
____ __ __ ___ ___ __ _
|
||||||
|
/ __ \/ /_ ____ / |/ /_ __/ | ____/ /___ ___ (_)___
|
||||||
|
/ /_/ / __ \/ __ \/ /|_/ / / / / /| |/ __ / __ `__ \/ / __ \
|
||||||
|
/ ____/ / / / /_/ / / / / /_/ / ___ / /_/ / / / / / / / / / /
|
||||||
|
/_/ /_/ /_/ .___/_/ /_/\__, /_/ |_\__,_/_/ /_/ /_/_/_/ /_/
|
||||||
|
/_/ /____/
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
CM="${GN}✔️${CL}"
|
||||||
|
CROSS="${RD}✖️${CL}"
|
||||||
|
INFO="${BL}ℹ️${CL}"
|
||||||
|
|
||||||
|
APP="phpMyAdmin"
|
||||||
|
INSTALL_DIR_DEBIAN="/var/www/html/phpMyAdmin"
|
||||||
|
INSTALL_DIR_ALPINE="/usr/share/phpmyadmin"
|
||||||
|
|
||||||
|
IFACE=$(ip -4 route | awk '/default/ {print $5; exit}')
|
||||||
|
IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
|
||||||
|
[[ -z "$IP" ]] && IP=$(hostname -I | awk '{print $1}')
|
||||||
|
[[ -z "$IP" ]] && IP="127.0.0.1"
|
||||||
|
|
||||||
|
# Detect OS
|
||||||
|
if [[ -f "/etc/alpine-release" ]]; then
|
||||||
|
OS="Alpine"
|
||||||
|
PKG_MANAGER_INSTALL="apk add --no-cache"
|
||||||
|
PKG_QUERY="apk info -e"
|
||||||
|
INSTALL_DIR="$INSTALL_DIR_ALPINE"
|
||||||
|
elif [[ -f "/etc/debian_version" ]]; then
|
||||||
|
OS="Debian"
|
||||||
|
PKG_MANAGER_INSTALL="apt-get install -y"
|
||||||
|
PKG_QUERY="dpkg -l"
|
||||||
|
INSTALL_DIR="$INSTALL_DIR_DEBIAN"
|
||||||
|
else
|
||||||
|
echo -e "${CROSS} Unsupported OS detected. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
header_info
|
||||||
|
|
||||||
|
function msg_info() { echo -e "${INFO} ${YW}${1}...${CL}"; }
|
||||||
|
function msg_ok() { echo -e "${CM} ${GN}${1}${CL}"; }
|
||||||
|
function msg_error() { echo -e "${CROSS} ${RD}${1}${CL}"; }
|
||||||
|
|
||||||
|
function check_internet() {
|
||||||
|
msg_info "Checking Internet connectivity to GitHub"
|
||||||
|
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://github.com)
|
||||||
|
if [[ "$HTTP_CODE" -ge 200 && "$HTTP_CODE" -lt 400 ]]; then
|
||||||
|
msg_ok "Internet connectivity OK"
|
||||||
|
else
|
||||||
|
msg_error "Internet connectivity or GitHub unreachable (Status $HTTP_CODE). Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function is_phpmyadmin_installed() {
|
||||||
|
if [[ "$OS" == "Debian" ]]; then
|
||||||
|
[[ -f "$INSTALL_DIR/config.inc.php" ]]
|
||||||
|
else
|
||||||
|
[[ -d "$INSTALL_DIR_ALPINE" ]] && rc-service lighttpd status &>/dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_php_and_modules() {
|
||||||
|
msg_info "Checking existing PHP installation"
|
||||||
|
if command -v php >/dev/null 2>&1; then
|
||||||
|
PHP_VERSION=$(php -r 'echo PHP_VERSION;')
|
||||||
|
msg_ok "Found PHP version $PHP_VERSION"
|
||||||
|
else
|
||||||
|
msg_info "PHP not found, will install PHP core"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$OS" == "Debian" ]]; then
|
||||||
|
PHP_MODULES=("php" "php-mysqli" "php-mbstring" "php-zip" "php-gd" "php-json" "php-curl")
|
||||||
|
MISSING_PACKAGES=()
|
||||||
|
for pkg in "${PHP_MODULES[@]}"; do
|
||||||
|
if ! dpkg -l | grep -qw "$pkg"; then
|
||||||
|
MISSING_PACKAGES+=("$pkg")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [[ ${#MISSING_PACKAGES[@]} -gt 0 ]]; then
|
||||||
|
msg_info "Installing missing PHP packages: ${MISSING_PACKAGES[*]}"
|
||||||
|
if ! apt-get update &>/dev/null || ! apt-get install -y "${MISSING_PACKAGES[@]}" &>/dev/null; then
|
||||||
|
msg_error "Failed to install required PHP modules. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
msg_ok "Installed missing PHP packages"
|
||||||
|
else
|
||||||
|
msg_ok "All required PHP modules are already installed"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
msg_info "Installing Lighttpd and PHP for Alpine"
|
||||||
|
$PKG_MANAGER_INSTALL lighttpd php php-fpm php-session php-json php-mysqli curl tar openssl &>/dev/null
|
||||||
|
msg_ok "Installed Lighttpd and PHP"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_phpmyadmin() {
|
||||||
|
msg_info "Fetching latest phpMyAdmin release from GitHub"
|
||||||
|
LATEST_VERSION_RAW=$(curl -s https://api.github.com/repos/phpmyadmin/phpmyadmin/releases/latest | grep tag_name | cut -d '"' -f4)
|
||||||
|
LATEST_VERSION=$(echo "$LATEST_VERSION_RAW" | sed -e 's/^RELEASE_//' -e 's/_/./g')
|
||||||
|
if [[ -z "$LATEST_VERSION" ]]; then
|
||||||
|
msg_error "Could not determine latest phpMyAdmin version from GitHub – falling back to 5.2.2"
|
||||||
|
LATEST_VERSION="RELEASE_5_2_2"
|
||||||
|
fi
|
||||||
|
msg_ok "Latest version: $LATEST_VERSION"
|
||||||
|
|
||||||
|
TARBALL_URL="https://files.phpmyadmin.net/phpMyAdmin/${LATEST_VERSION}/phpMyAdmin-${LATEST_VERSION}-all-languages.tar.gz"
|
||||||
|
msg_info "Downloading ${TARBALL_URL}"
|
||||||
|
if ! curl -fsSL "$TARBALL_URL" -o /tmp/phpmyadmin.tar.gz; then
|
||||||
|
msg_error "Download failed: $TARBALL_URL"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$INSTALL_DIR"
|
||||||
|
tar xf /tmp/phpmyadmin.tar.gz --strip-components=1 -C "$INSTALL_DIR"
|
||||||
|
}
|
||||||
|
|
||||||
|
function configure_phpmyadmin() {
|
||||||
|
if [[ "$OS" == "Debian" ]]; then
|
||||||
|
cp "$INSTALL_DIR/config.sample.inc.php" "$INSTALL_DIR/config.inc.php"
|
||||||
|
SECRET=$(openssl rand -base64 24)
|
||||||
|
sed -i "s#\$cfg\['blowfish_secret'\] = '';#\$cfg['blowfish_secret'] = '${SECRET}';#" "$INSTALL_DIR/config.inc.php"
|
||||||
|
chmod 660 "$INSTALL_DIR/config.inc.php"
|
||||||
|
chown -R www-data:www-data "$INSTALL_DIR"
|
||||||
|
systemctl restart apache2
|
||||||
|
msg_ok "Configured phpMyAdmin with Apache"
|
||||||
|
else
|
||||||
|
msg_info "Configuring Lighttpd for phpMyAdmin (Alpine detected)"
|
||||||
|
|
||||||
|
mkdir -p /etc/lighttpd
|
||||||
|
cat <<EOF >/etc/lighttpd/lighttpd.conf
|
||||||
|
server.modules = (
|
||||||
|
"mod_access",
|
||||||
|
"mod_alias",
|
||||||
|
"mod_accesslog",
|
||||||
|
"mod_fastcgi"
|
||||||
|
)
|
||||||
|
|
||||||
|
server.document-root = "${INSTALL_DIR}"
|
||||||
|
server.port = 80
|
||||||
|
|
||||||
|
index-file.names = ( "index.php", "index.html" )
|
||||||
|
|
||||||
|
fastcgi.server = ( ".php" =>
|
||||||
|
((
|
||||||
|
"host" => "127.0.0.1",
|
||||||
|
"port" => 9000,
|
||||||
|
"check-local" => "disable"
|
||||||
|
))
|
||||||
|
)
|
||||||
|
|
||||||
|
alias.url = ( "/phpMyAdmin/" => "${INSTALL_DIR}/" )
|
||||||
|
|
||||||
|
accesslog.filename = "/var/log/lighttpd/access.log"
|
||||||
|
server.errorlog = "/var/log/lighttpd/error.log"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
msg_info "Starting PHP-FPM and Lighttpd"
|
||||||
|
|
||||||
|
PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION . PHP_MINOR_VERSION;')
|
||||||
|
PHP_FPM_SERVICE="php-fpm${PHP_VERSION}"
|
||||||
|
|
||||||
|
if $STD rc-service "$PHP_FPM_SERVICE" start && $STD rc-update add "$PHP_FPM_SERVICE" default; then
|
||||||
|
msg_ok "Started PHP-FPM service: $PHP_FPM_SERVICE"
|
||||||
|
else
|
||||||
|
msg_error "Failed to start PHP-FPM service: $PHP_FPM_SERVICE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
$STD rc-service lighttpd start
|
||||||
|
$STD rc-update add lighttpd default
|
||||||
|
msg_ok "Configured and started Lighttpd successfully"
|
||||||
|
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function uninstall_phpmyadmin() {
|
||||||
|
msg_info "Stopping Webserver"
|
||||||
|
if [[ "$OS" == "Debian" ]]; then
|
||||||
|
systemctl stop apache2
|
||||||
|
else
|
||||||
|
$STD rc-service lighttpd stop
|
||||||
|
$STD rc-service php-fpm stop
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Removing phpMyAdmin directory"
|
||||||
|
rm -rf "$INSTALL_DIR"
|
||||||
|
|
||||||
|
if [[ "$OS" == "Alpine" ]]; then
|
||||||
|
msg_info "Removing Lighttpd config"
|
||||||
|
rm -f /etc/lighttpd/lighttpd.conf
|
||||||
|
$STD rc-service php-fpm restart
|
||||||
|
$STD rc-service lighttpd restart
|
||||||
|
else
|
||||||
|
$STD systemctl restart apache2
|
||||||
|
fi
|
||||||
|
msg_ok "Uninstalled phpMyAdmin"
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_phpmyadmin() {
|
||||||
|
msg_info "Fetching latest phpMyAdmin release from GitHub"
|
||||||
|
LATEST_VERSION_RAW=$(curl -s https://api.github.com/repos/phpmyadmin/phpmyadmin/releases/latest | grep tag_name | cut -d '"' -f4)
|
||||||
|
LATEST_VERSION=$(echo "$LATEST_VERSION_RAW" | sed -e 's/^RELEASE_//' -e 's/_/./g')
|
||||||
|
|
||||||
|
if [[ -z "$LATEST_VERSION" ]]; then
|
||||||
|
msg_error "Could not determine latest phpMyAdmin version from GitHub – falling back to 5.2.2"
|
||||||
|
LATEST_VERSION="5.2.2"
|
||||||
|
fi
|
||||||
|
msg_ok "Latest version: $LATEST_VERSION"
|
||||||
|
|
||||||
|
TARBALL_URL="https://files.phpmyadmin.net/phpMyAdmin/${LATEST_VERSION}/phpMyAdmin-${LATEST_VERSION}-all-languages.tar.gz"
|
||||||
|
msg_info "Downloading ${TARBALL_URL}"
|
||||||
|
|
||||||
|
if ! curl -fsSL "$TARBALL_URL" -o /tmp/phpmyadmin.tar.gz; then
|
||||||
|
msg_error "Download failed: $TARBALL_URL"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
BACKUP_DIR="/tmp/phpmyadmin-backup-$(date +%Y%m%d-%H%M%S)"
|
||||||
|
mkdir -p "$BACKUP_DIR"
|
||||||
|
BACKUP_ITEMS=("config.inc.php" "upload" "save" "tmp" "themes")
|
||||||
|
|
||||||
|
msg_info "Backing up existing phpMyAdmin data"
|
||||||
|
for item in "${BACKUP_ITEMS[@]}"; do
|
||||||
|
[[ -e "$INSTALL_DIR/$item" ]] && cp -a "$INSTALL_DIR/$item" "$BACKUP_DIR/" && echo " ↪︎ $item"
|
||||||
|
done
|
||||||
|
msg_ok "Backup completed: $BACKUP_DIR"
|
||||||
|
|
||||||
|
tar xf /tmp/phpmyadmin.tar.gz --strip-components=1 -C "$INSTALL_DIR"
|
||||||
|
msg_ok "Extracted phpMyAdmin $LATEST_VERSION"
|
||||||
|
|
||||||
|
msg_info "Restoring preserved files"
|
||||||
|
for item in "${BACKUP_ITEMS[@]}"; do
|
||||||
|
[[ -e "$BACKUP_DIR/$item" ]] && cp -a "$BACKUP_DIR/$item" "$INSTALL_DIR/" && echo " ↪︎ $item restored"
|
||||||
|
done
|
||||||
|
msg_ok "Restoration completed"
|
||||||
|
|
||||||
|
configure_phpmyadmin
|
||||||
|
}
|
||||||
|
|
||||||
|
if is_phpmyadmin_installed; then
|
||||||
|
echo -e "${YW}⚠️ ${APP} is already installed at ${INSTALL_DIR}.${CL}"
|
||||||
|
read -r -p "Would you like to Update (1), Uninstall (2) or Cancel (3)? [1/2/3]: " action
|
||||||
|
action="${action//[[:space:]]/}"
|
||||||
|
case "$action" in
|
||||||
|
1)
|
||||||
|
check_internet
|
||||||
|
update_phpmyadmin
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
uninstall_phpmyadmin
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
echo -e "${YW}⚠️ Action cancelled. Exiting.${CL}"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo -e "${YW}⚠️ Invalid input. Exiting.${CL}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
read -r -p "Would you like to install ${APP}? (y/n): " install_prompt
|
||||||
|
install_prompt="${install_prompt//[[:space:]]/}"
|
||||||
|
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
|
||||||
|
check_internet
|
||||||
|
install_php_and_modules
|
||||||
|
install_phpmyadmin
|
||||||
|
configure_phpmyadmin
|
||||||
|
if [[ "$OS" == "Debian" ]]; then
|
||||||
|
echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://${IP}/phpMyAdmin${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://${IP}/${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${YW}⚠️ Installation skipped. Exiting.${CL}"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
6
tools/headers/phpmyadmin
Normal file
6
tools/headers/phpmyadmin
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
__ __ ___ ___ __ _
|
||||||
|
____ / /_ ____ / |/ /_ __/ | ____/ /___ ___ (_)___
|
||||||
|
/ __ \/ __ \/ __ \/ /|_/ / / / / /| |/ __ / __ `__ \/ / __ \
|
||||||
|
/ /_/ / / / / /_/ / / / / /_/ / ___ / /_/ / / / / / / / / / /
|
||||||
|
/ .___/_/ /_/ .___/_/ /_/\__, /_/ |_\__,_/_/ /_/ /_/_/_/ /_/
|
||||||
|
/_/ /_/ /____/
|
||||||
@@ -189,7 +189,7 @@ start_routines_9() {
|
|||||||
# check if deb822 Sources (*.sources) exist
|
# check if deb822 Sources (*.sources) exist
|
||||||
if find /etc/apt/sources.list.d/ -maxdepth 1 -name '*.sources' | grep -q .; then
|
if find /etc/apt/sources.list.d/ -maxdepth 1 -name '*.sources' | grep -q .; then
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Deb822 sources detected" \
|
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Deb822 sources detected" \
|
||||||
--msgbox "Modern deb822 sources (*.sources) already exist.\n\nNo changes to sources format required.\n\nYou may still have legacy sources.list or .list files, which you can disable in the next step." 12 65
|
--msgbox "Modern deb822 sources (*.sources) already exist.\n\nNo changes to sources format required.\n\nYou may still have legacy sources.list or .list files, which you can disable in the next step." 12 65 || true
|
||||||
else
|
else
|
||||||
check_and_disable_legacy_sources() {
|
check_and_disable_legacy_sources() {
|
||||||
local LEGACY_COUNT=0
|
local LEGACY_COUNT=0
|
||||||
@@ -197,7 +197,7 @@ start_routines_9() {
|
|||||||
|
|
||||||
# Check sources.list
|
# Check sources.list
|
||||||
if [[ -f "$listfile" ]] && grep -qE '^\s*deb ' "$listfile"; then
|
if [[ -f "$listfile" ]] && grep -qE '^\s*deb ' "$listfile"; then
|
||||||
((LEGACY_COUNT++))
|
(( ++LEGACY_COUNT ))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check .list files
|
# Check .list files
|
||||||
|
|||||||
@@ -530,7 +530,12 @@ msg_ok "Extracted OpenWrt Disk Image ${CL}${BL}$FILE${CL}"
|
|||||||
msg_info "Creating OpenWrt VM"
|
msg_info "Creating OpenWrt VM"
|
||||||
qm create "$VMID" -cores "$CORE_COUNT" -memory "$RAM_SIZE" -name "$HN" \
|
qm create "$VMID" -cores "$CORE_COUNT" -memory "$RAM_SIZE" -name "$HN" \
|
||||||
-onboot 1 -ostype l26 -scsihw virtio-scsi-pci --tablet 0
|
-onboot 1 -ostype l26 -scsihw virtio-scsi-pci --tablet 0
|
||||||
|
if [[ "$(pvesm status | awk -v s=$STORAGE '$1==s {print $2}')" == "dir" ]]; then
|
||||||
|
qm set "$VMID" -efidisk0 "${STORAGE}:0,efitype=4m,size=4M"
|
||||||
|
else
|
||||||
pvesm alloc "$STORAGE" "$VMID" "vm-$VMID-disk-0" 4M >/dev/null
|
pvesm alloc "$STORAGE" "$VMID" "vm-$VMID-disk-0" 4M >/dev/null
|
||||||
|
qm set "$VMID" -efidisk0 "${STORAGE}:vm-$VMID-disk-0,efitype=4m,size=4M"
|
||||||
|
fi
|
||||||
|
|
||||||
IMPORT_OUT="$(qm importdisk "$VMID" "$FILE" "$STORAGE" --format raw 2>&1 || true)"
|
IMPORT_OUT="$(qm importdisk "$VMID" "$FILE" "$STORAGE" --format raw 2>&1 || true)"
|
||||||
DISK_REF="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*successfully imported disk '\([^']\+\)'.*/\1/p")"
|
DISK_REF="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*successfully imported disk '\([^']\+\)'.*/\1/p")"
|
||||||
|
|||||||
Reference in New Issue
Block a user