Compare commits

..

67 Commits

Author SHA1 Message Date
MickLesk
28c19a79d3 feat(exit-codes): add systemd and build error codes (150-154)
- 150: Systemd service failed to start
- 151: Systemd service unit not found
- 152: Permission denied (EACCES)
- 153: Build/compile failed (make/gcc/cmake)
- 154: Node.js native addon build failed (node-gyp)

Based on issue analysis: 57 service failures, 25 build failures, 22 node-gyp issues
2026-01-26 20:48:17 +01:00
MickLesk
8e4d5b1d28 fix(exit-codes): sync error_handler.func and api.func with conflict-free code ranges
- Add curl error codes (6, 7, 22, 28, 35)
- Add APT lock code (102), timeout (124), signals (134, 141)
- Move Python codes: 210-212 → 160-162 (avoid Proxmox conflict)
- Move PostgreSQL codes: 231-234 → 170-173
- Move MySQL/MariaDB codes: 241-244 → 180-183
- Move MongoDB codes: 251-254 → 190-193
- Keep Node.js at 243-249, Proxmox at 200-231
- Both files now synchronized with identical mappings
2026-01-26 20:28:37 +01:00
MickLesk
e731b9fb65 fix(api.func): fix duplicate exit codes and add missing error codes
Exit code fixes:
- Remove duplicate definitions for codes 243, 254 (Node.js vs DB)
- Reassign MySQL/MariaDB to 240-242, 244 (was 241-244)
- Reassign MongoDB to 250-253 (was 251-254)

New exit codes added (based on GitHub issues analysis):
- 6: curl couldn't resolve host (DNS failure)
- 7: curl failed to connect (network unreachable)
- 22: curl HTTP error (404, 429 rate limit, 500)
- 28: curl timeout (very common in download failures)
- 35: curl SSL error
- 102: APT lock held by another process
- 124: Command timeout
- 141: SIGPIPE (broken pipe)

Also update OOM detection to include exit code 134 (SIGABRT)
which is commonly seen in Node.js heap overflow issues.

Fixes based on analysis of ~500 GitHub issues.
2026-01-26 20:23:04 +01:00
MickLesk
93cb6f99fe feat(build.func): smart error recovery menu for failed installations
Replace simple Y/n removal prompt with interactive recovery menu:

- Option 1: Remove container and exit (default, auto after 60s timeout)
- Option 2: Keep container for debugging
- Option 3: Retry installation with verbose mode enabled
- Option 4: Retry with 1.5x RAM and +1 CPU core (OOM errors only)

Improvements:
- Detect OOM errors (exit codes 137, 243) and offer resource increase
- Show human-readable error explanation using explain_exit_code()
- Recursive rebuild preserves ALL settings from advanced/app.vars/default.vars
- Settings preserved: Network (IP, Gateway, VLAN, MTU, Bridge), Features
  (Nesting, FUSE, TUN, GPU), Storage, SSH keys, Tags, Hostname, etc.
- Show rebuild summary before retry (old→new CTID, resources, network)
- New container ID generated automatically for rebuilds

This helps users recover from transient failures without re-running
the entire script manually.
2026-01-26 20:19:22 +01:00
community-scripts-pr-app[bot]
4e910de96d Update CHANGELOG.md (#11202)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-26 15:28:00 +00:00
CanbiZ (MickLesk)
b3b67651c9 fix(jellystat): correct WorkingDirectory to /backend for task resolution (#10747) (#11201) 2026-01-26 16:27:33 +01:00
community-scripts-pr-app[bot]
9aadff9c95 Update CHANGELOG.md (#11200)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-26 13:55:28 +00:00
CanbiZ (MickLesk)
d42dbc155c core: refine cleanup_lxc to safely clear caches (#11197)
Updated the cleanup_lxc function to directly remove cache directories for Python, Node.js, Go, Rust, Ruby, and PHP, instead of relying on package manager commands. Improved error handling to prevent cleanup failures from affecting installs, and clarified documentation to reflect safer, more targeted cache removal.
2026-01-26 14:55:04 +01:00
community-scripts-pr-app[bot]
92f15001b6 Update CHANGELOG.md (#11199)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-26 13:45:25 +00:00
CanbiZ (MickLesk)
13a4af4300 jotty: full refactor / now use prebuild packages and less ressources (#11059)
* jotty: full refactor / now use prebuild packages and less ressources

* add latest

* llatest
2026-01-26 14:44:59 +01:00
community-scripts-pr-app[bot]
78bc815a4f Update CHANGELOG.md (#11198)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-26 13:26:01 +00:00
Slaviša Arežina
427986deaf Fix (#11196) 2026-01-26 14:25:34 +01:00
community-scripts-pr-app[bot]
6767ea4420 Update versions.json (#11195)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-26 13:06:37 +01:00
community-scripts-pr-app[bot]
befc014eb9 Update CHANGELOG.md (#11191)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-26 07:22:40 +00:00
durzo
35a011e5c5 tracearr: fix install check and update node to version 24 (#11188)
* tracearr: fix install check and update node to version 24

* refactor

---------

Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com>
2026-01-26 08:22:15 +01:00
community-scripts-pr-app[bot]
b9eef7a257 Update CHANGELOG.md (#11190)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-26 00:17:36 +00:00
community-scripts-pr-app[bot]
64752790b6 Update versions.json (#11189)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-26 01:17:05 +01:00
community-scripts-pr-app[bot]
cf08e8d644 Update CHANGELOG.md (#11187)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-25 22:00:32 +00:00
Chris
9603c39487 [FIX] Tautulli: ensure virtualenv is recreated during update; backup tautulli.db (#11182)
* Recreate virtualenv during update; remove some superfluous commands

* backup and restore tautulli.db during update

* ensure clear virtualenv
2026-01-25 23:00:11 +01:00
community-scripts-pr-app[bot]
b53cfe6bbc Update CHANGELOG.md (#11185)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-25 20:01:55 +00:00
Chris
f05927602c ensure additional JSON files are in place (#11183) 2026-01-25 21:01:31 +01:00
community-scripts-pr-app[bot]
2a234829b8 Update CHANGELOG.md (#11179)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-25 12:42:34 +00:00
community-scripts-pr-app[bot]
cd678bf8a9 Update CHANGELOG.md (#11178)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-25 12:42:23 +00:00
CanbiZ (MickLesk)
ac696e22ca Termix: recreate nginx dirs and backup uploads on update (#11169) 2026-01-25 13:42:11 +01:00
community-scripts-pr-app[bot]
3471392fe4 Update CHANGELOG.md (#11177)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-25 12:42:01 +00:00
CanbiZ (MickLesk)
9f3fa8e46c fix(deluge): correct service paths to /usr/local/bin (#11170) 2026-01-25 13:41:38 +01:00
community-scripts-pr-app[bot]
d91d5d7fd0 Update versions.json (#11176)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-25 13:06:13 +01:00
community-scripts-pr-app[bot]
377dbcddfc Update CHANGELOG.md (#11171)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-25 08:05:47 +00:00
Shuo Feng
596f0166dc Karakeep: Add the FFmpeg option to the installation script (#11157)
Co-authored-by: Chris <punk.sand7393@fastmail.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
2026-01-25 09:05:26 +01:00
community-scripts-pr-app[bot]
1b5db3dce7 Update CHANGELOG.md (#11168)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-25 07:12:12 +00:00
community-scripts-pr-app[bot]
8c28895ec4 Update CHANGELOG.md (#11167)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-25 07:12:00 +00:00
Chris
918d7c9053 Manyfold: fix permissions error (#11165) 2026-01-25 08:11:48 +01:00
community-scripts-pr-app[bot]
4b83732478 Update CHANGELOG.md (#11166)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-25 07:11:37 +00:00
CanbiZ (MickLesk)
92d33ee5e9 feat(apt-cacher-ng): add avahi-daemon for mDNS service discovery (#11140)
apt-cacher-ng ships with Avahi service config but needs avahi-daemon
to advertise itself via mDNS for auto-apt-proxy discovery.

Closes #11101
2026-01-25 08:10:51 +01:00
community-scripts-pr-app[bot]
be154d9a20 Update CHANGELOG.md (#11160)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-25 00:16:21 +00:00
community-scripts-pr-app[bot]
1702f693b8 Update versions.json (#11159)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-25 01:15:54 +01:00
community-scripts-pr-app[bot]
54e99261b4 Update CHANGELOG.md (#11153)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 22:52:48 +00:00
community-scripts-pr-app[bot]
5b612a0f11 Update .app files (#11151)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2026-01-24 23:52:20 +01:00
community-scripts-pr-app[bot]
16fb028ad4 Update CHANGELOG.md (#11152)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 22:50:41 +00:00
community-scripts-pr-app[bot]
68b2043fd6 Update CHANGELOG.md (#11150)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 22:50:19 +00:00
community-scripts-pr-app[bot]
d8b0db99f1 Update date in json (#11149)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2026-01-24 22:50:15 +00:00
push-app-to-main[bot]
352bbc880e manyfold (#11143)
Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
Co-authored-by: Chris <punk.sand7393@fastmail.com>
2026-01-24 23:49:59 +01:00
community-scripts-pr-app[bot]
9311829cf4 Update CHANGELOG.md (#11148)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 22:48:58 +00:00
community-scripts-pr-app[bot]
105b83fcc3 Update CHANGELOG.md (#11147)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 22:48:46 +00:00
community-scripts-pr-app[bot]
dc2810c5d4 Update CHANGELOG.md (#11146)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 22:48:34 +00:00
CanbiZ (MickLesk)
28b42883b7 fix(elementsynapse): correct parameter order in fetch_and_deploy_gh_release (#11145)
Fixed wrong parameter order that caused malformed GitHub API URL.
The function was called with repo as first arg and path as second,
instead of app name as first and repo as second.

Closes #11144
2026-01-24 23:48:24 +01:00
Tobias
8742fedcea bump crafty-controller to debian 13 (#11094)
* chore: bump to deb13

* chore: bump to deb 13

* chore: bump to deb 13
2026-01-24 23:48:09 +01:00
community-scripts-pr-app[bot]
a31febc8ce Update CHANGELOG.md (#11142)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 22:23:29 +00:00
CanbiZ (MickLesk)
61ea6d980a fix(nvidia): use versioned nvidia-utils package for Ubuntu fallback (#11139)
- nvidia-utils is a virtual package and requires version suffix (e.g. nvidia-utils-580)
- Use nvidia_major_version to install correct versioned packages
- Show helpful warning message instead of crashing on failure

Fixes installation failures on Ubuntu 24.04 with NVIDIA 580.x drivers
2026-01-24 23:23:10 +01:00
MickLesk
aab4edf25e fix(authelia): handle IP vs domain for authelia_url config
- IP address: use https://IP:9091 instead of invalid https://auth.IP
- Domain: keep https://auth.DOMAIN as before
- Improve completion message with actual URL hint

Closes #11117
2026-01-24 23:23:00 +01:00
community-scripts-pr-app[bot]
87610515a3 Update CHANGELOG.md (#11141)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 22:15:14 +00:00
Chris
d6b4cea3ba Netbox: Refactor (#11126)
* refactor install script

* refactor update script
2026-01-24 23:14:55 +01:00
community-scripts-pr-app[bot]
ebcbe90c99 Update CHANGELOG.md (#11138)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 22:02:00 +00:00
CanbiZ (MickLesk)
5ce7f35793 leantime: fix backup file naming (#11137) 2026-01-24 23:01:36 +01:00
community-scripts-pr-app[bot]
8764bbc754 Update CHANGELOG.md (#11136)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 21:50:28 +00:00
Chris
83cd058586 [Hotfix] Element Synapse (#11135) 2026-01-24 22:50:04 +01:00
community-scripts-pr-app[bot]
661fb9efe0 Update CHANGELOG.md (#11127)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 17:21:16 +00:00
CanbiZ (MickLesk)
d356ba4822 fix(authelia): use POSIX-safe arithmetic to avoid exit code 1 with set -e (#11125) 2026-01-24 18:20:53 +01:00
community-scripts-pr-app[bot]
b17b555139 Update CHANGELOG.md (#11124)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 15:40:03 +00:00
Tobias
1741e007bb add config file (#11120) 2026-01-24 16:39:41 +01:00
community-scripts-pr-app[bot]
06ce9de1fa Update CHANGELOG.md (#11123)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 15:39:18 +00:00
Slaviša Arežina
c0fb35c90b Update bitmagnet installation script with environment variables (#11119) 2026-01-24 16:38:57 +01:00
community-scripts-pr-app[bot]
f66a751427 Update CHANGELOG.md (#11122)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 15:30:07 +00:00
Chris
4b3f7f688c Spoolman: move to uv (#11121) 2026-01-24 16:29:46 +01:00
community-scripts-pr-app[bot]
0828068d39 Update versions.json (#11118)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 13:05:58 +01:00
community-scripts-pr-app[bot]
b7ef77cb66 Update CHANGELOG.md (#11113)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-24 06:55:25 +00:00
Slaviša Arežina
e7f8a27aac Standard (#11109) 2026-01-24 07:55:04 +01:00
43 changed files with 1060 additions and 598 deletions

View File

@@ -10,8 +10,83 @@
> [!CAUTION]
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
## 2026-01-26
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Ghost: Fix missing dependency [@tremor021](https://github.com/tremor021) ([#11196](https://github.com/community-scripts/ProxmoxVE/pull/11196))
- tracearr: fix install check and update node to version 24 [@durzo](https://github.com/durzo) ([#11188](https://github.com/community-scripts/ProxmoxVE/pull/11188))
- #### ✨ New Features
- jotty: full refactor / prebuild package [@MickLesk](https://github.com/MickLesk) ([#11059](https://github.com/community-scripts/ProxmoxVE/pull/11059))
### 💾 Core
- #### 🐞 Bug Fixes
- core: refine cleanup_lxc to safely clear caches [@MickLesk](https://github.com/MickLesk) ([#11197](https://github.com/community-scripts/ProxmoxVE/pull/11197))
### 🧰 Tools
- #### 🐞 Bug Fixes
- jellystat: correct WorkingDirectory to /backend [@MickLesk](https://github.com/MickLesk) ([#11201](https://github.com/community-scripts/ProxmoxVE/pull/11201))
## 2026-01-25
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- [FIX] Tautulli: ensure virtualenv is recreated during update; backup tautulli.db [@vhsdream](https://github.com/vhsdream) ([#11182](https://github.com/community-scripts/ProxmoxVE/pull/11182))
- [Fix] Pangolin: ensure additional JSON files are in place [@vhsdream](https://github.com/vhsdream) ([#11183](https://github.com/community-scripts/ProxmoxVE/pull/11183))
- Manyfold: fix permissions error [@vhsdream](https://github.com/vhsdream) ([#11165](https://github.com/community-scripts/ProxmoxVE/pull/11165))
- Termix: recreate nginx dirs and backup uploads on update [@MickLesk](https://github.com/MickLesk) ([#11169](https://github.com/community-scripts/ProxmoxVE/pull/11169))
- Deluge: correct service paths to /usr/local/bin [@MickLesk](https://github.com/MickLesk) ([#11170](https://github.com/community-scripts/ProxmoxVE/pull/11170))
- #### ✨ New Features
- Karakeep: Add the FFmpeg option to the installation script [@vonhyou](https://github.com/vonhyou) ([#11157](https://github.com/community-scripts/ProxmoxVE/pull/11157))
- apt-cacher-ng: add avahi-daemon for mDNS service discovery [@MickLesk](https://github.com/MickLesk) ([#11140](https://github.com/community-scripts/ProxmoxVE/pull/11140))
## 2026-01-24
### 🆕 New Scripts
- Manyfold ([#11143](https://github.com/community-scripts/ProxmoxVE/pull/11143))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- elementsynapse: correct parameter order in fetch_and_deploy_gh_release [@MickLesk](https://github.com/MickLesk) ([#11145](https://github.com/community-scripts/ProxmoxVE/pull/11145))
- leantime: fix backup file naming [@MickLesk](https://github.com/MickLesk) ([#11137](https://github.com/community-scripts/ProxmoxVE/pull/11137))
- [Hotfix] Element Synapse [@vhsdream](https://github.com/vhsdream) ([#11135](https://github.com/community-scripts/ProxmoxVE/pull/11135))
- authelia: use POSIX-safe arithmetic to avoid exit code 1 with set -e in subshells [@MickLesk](https://github.com/MickLesk) ([#11125](https://github.com/community-scripts/ProxmoxVE/pull/11125))
- Bitmagnet: PostgreSQL and environment variable fixes [@tremor021](https://github.com/tremor021) ([#11119](https://github.com/community-scripts/ProxmoxVE/pull/11119))
- Spoolman: move to uv [@vhsdream](https://github.com/vhsdream) ([#11121](https://github.com/community-scripts/ProxmoxVE/pull/11121))
- #### 🔧 Refactor
- bump crafty-controller to debian 13 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11094](https://github.com/community-scripts/ProxmoxVE/pull/11094))
- Netbox: Refactor [@vhsdream](https://github.com/vhsdream) ([#11126](https://github.com/community-scripts/ProxmoxVE/pull/11126))
- Flatnotes: Standard enforcing [@tremor021](https://github.com/tremor021) ([#11109](https://github.com/community-scripts/ProxmoxVE/pull/11109))
### 💾 Core
- #### 🐞 Bug Fixes
- nvidia: use versioned nvidia-utils package for Ubuntu fallback [@MickLesk](https://github.com/MickLesk) ([#11139](https://github.com/community-scripts/ProxmoxVE/pull/11139))
### 🌐 Website
- #### 📝 Script Information
- Byparr: Add config file path to website [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11120](https://github.com/community-scripts/ProxmoxVE/pull/11120))
## 2026-01-23
### 🆕 New Scripts

View File

@@ -45,4 +45,4 @@ 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}https://YOUR_AUTHELIA_URL${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9091 or https://auth.YOURDOMAIN ${CL}"

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-16}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"

View File

@@ -27,7 +27,7 @@ function update_script() {
msg_error "No ${APP} Installation Found!"
exit
fi
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
msg_info "Updating LXC"
@@ -35,26 +35,25 @@ function update_script() {
$STD apt -y upgrade
msg_ok "Updated LXC"
if check_for_gh_release "synapse-admin" "etkecc/synapse-admin"; then
msg_info "Stopping Service"
systemctl stop synapse-admin
msg_ok "Stopped Service"
if check_for_gh_release "synapse-admin" "etkecc/synapse-admin"; then
msg_info "Stopping Service"
systemctl stop synapse-admin
msg_ok "Stopped Service"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "synapse-admin" "etkecc/synapse-admin" "tarball" "latest" "/opt/synapse-admin"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "synapse-admin" "etkecc/synapse-admin" "tarball" "latest" "/opt/synapse-admin"
msg_info "Building Synapse-Admin"
cd /opt/synapse-admin
$STD yarn global add serve
$STD yarn install --ignore-engines
$STD yarn build
mv ./dist ../ && rm -rf * && mv ../dist ./
msg_ok "Built Synapse-Admin"
msg_info "Building Synapse-Admin"
cd /opt/synapse-admin
$STD yarn global add serve
$STD yarn install --ignore-engines
$STD yarn build
mv ./dist ../ && rm -rf * && mv ../dist ./
msg_ok "Built Synapse-Admin"
msg_info "Starting Service"
systemctl start synapse-admin
msg_ok "Started Service"
msg_ok "Updated Synapse-Admin to ${CHECK_UPDATE_RELEASE}"
fi
msg_info "Starting Service"
systemctl start synapse-admin
msg_ok "Started Service"
msg_ok "Updated Synapse-Admin to ${CHECK_UPDATE_RELEASE}"
fi
exit
}

View File

@@ -40,18 +40,15 @@ function update_script() {
fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes"
msg_info "Updating Frontend"
msg_info "Updating Flatnotes"
cd /opt/flatnotes/client
$STD npm install
$STD npm run build
msg_ok "Updated Frontend"
msg_info "Updating Backend"
cd /opt/flatnotes
rm -f uv.lock
$STD /usr/local/bin/uvx migrate-to-uv
$STD /usr/local/bin/uv sync
msg_ok "Updated Backend"
msg_ok "Updated Flatnotes"
msg_info "Restoring Configuration and Data"
cp /opt/flatnotes.env /opt/flatnotes/.env

View File

@@ -26,6 +26,7 @@ function update_script() {
setup_mariadb
NODE_VERSION="22" setup_nodejs
ensure_dependencies git
msg_info "Updating Ghost"
if command -v ghost &>/dev/null; then

6
ct/headers/manyfold Normal file
View File

@@ -0,0 +1,6 @@
__ ___ ____ __ __
/ |/ /___ _____ __ __/ __/___ / /___/ /
/ /|_/ / __ `/ __ \/ / / / /_/ __ \/ / __ /
/ / / / /_/ / / / / /_/ / __/ /_/ / / /_/ /
/_/ /_/\__,_/_/ /_/\__, /_/ \____/_/\__,_/
/____/

View File

@@ -7,9 +7,9 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
APP="jotty"
var_tags="${var_tags:-tasks;notes}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-8}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
@@ -35,61 +35,21 @@ function update_script() {
msg_ok "Stopped Service"
msg_info "Backing up configuration & data"
cd /opt/jotty
cp ./.env /opt/app.env
$STD tar -cf /opt/data_config.tar ./data ./config
cp /opt/jotty/.env /opt/app.env
[[ -d /opt/jotty/data ]] && mv /opt/jotty/data /opt/data
msg_ok "Backed up configuration & data"
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "jotty" "fccview/jotty" "tarball" "latest" "/opt/jotty"
msg_info "Updating jotty"
cd /opt/jotty
unset NODE_OPTIONS
export NODE_OPTIONS="--max-old-space-size=3072"
$STD yarn --frozen-lockfile
$STD yarn next telemetry disable
$STD yarn build
[ -d "public" ] && cp -r public .next/standalone/
[ -d "howto" ] && cp -r howto .next/standalone/
mkdir -p .next/standalone/.next
cp -r .next/static .next/standalone/.next/
mv .next/standalone /tmp/jotty_standalone
rm -rf ./* .next .git .gitignore .yarn
mv /tmp/jotty_standalone/* .
mv /tmp/jotty_standalone/.[!.]* . 2>/dev/null || true
rm -rf /tmp/jotty_standalone
msg_ok "Updated jotty"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "jotty" "fccview/jotty" "prebuild" "latest" "/opt/jotty" "jotty_*_prebuild.tar.gz"
msg_info "Restoring configuration & data"
mv /opt/app.env /opt/jotty/.env
$STD tar -xf /opt/data_config.tar
[[ -d /opt/data ]] && mv /opt/data /opt/jotty/data
msg_ok "Restored configuration & data"
msg_info "Updating Service"
cat <<EOF >/etc/systemd/system/jotty.service
[Unit]
Description=jotty server
After=network.target
[Service]
WorkingDirectory=/opt/jotty
EnvironmentFile=/opt/jotty/.env
ExecStart=/usr/bin/node server.js
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
msg_ok "Updated Service"
msg_info "Starting Service"
systemctl start jotty
msg_ok "Started Service"
rm /opt/data_config.tar
msg_ok "Updated successfully!"
fi
exit

View File

@@ -31,8 +31,8 @@ function update_script() {
setup_mariadb
if check_for_gh_release "leantime" "Leantime/leantime"; then
msg_info "Creating Backup"
mariadb-dump leantime >"/opt/${APP}_db_backup_$(date +%F).sql"
tar -czf "/opt/${APP}_backup_$(date +%F).tar.gz" "/opt/${APP}"
mariadb-dump leantime >"/opt/leantime_db_backup_$(date +%F).sql"
tar -czf "/opt/leantime_backup_$(date +%F).tar.gz" "/opt/leantime"
mv /opt/leantime /opt/leantime_bak
msg_ok "Backup Created"

107
ct/manyfold.sh Normal file
View File

@@ -0,0 +1,107 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: bvdberg01 | Co-Author: SunFlowerOwl
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/manyfold3d/manyfold
APP="Manyfold"
var_tags="${var_tags:-3d}"
var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-15}"
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/manyfold ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "manyfold" "manyfold3d/manyfold"; then
msg_info "Stopping Services"
systemctl stop manyfold.target manyfold-rails.1 manyfold-default_worker.1 manyfold-performance_worker.1
msg_ok "Stopped Services"
msg_info "Backing up Data"
CURRENT_VERSION=$(grep -oP 'APP_VERSION=\K[^ ]+' /opt/manyfold/.env || echo "unknown")
cp -r /opt/manyfold/app/storage /opt/manyfold_storage_backup 2>/dev/null || true
cp -r /opt/manyfold/app/tmp /opt/manyfold_tmp_backup 2>/dev/null || true
cp /opt/manyfold/app/config/credentials.yml.enc /opt/manyfold_credentials.yml.enc 2>/dev/null || true
cp /opt/manyfold/app/config/master.key /opt/manyfold_master.key 2>/dev/null || true
$STD tar -czf "/opt/manyfold_${CURRENT_VERSION}_backup.tar.gz" -C /opt/manyfold app
msg_ok "Backed up Data"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "manyfold" "manyfold3d/manyfold" "tarball" "latest" "/opt/manyfold/app"
msg_info "Configuring Manyfold"
RUBY_INSTALL_VERSION=$(cat /opt/manyfold/app/.ruby-version)
YARN_VERSION=$(grep '"packageManager":' /opt/manyfold/app/package.json | sed -E 's/.*"(yarn@[0-9\.]+)".*/\1/')
RELEASE=$(get_latest_github_release "manyfold3d/manyfold")
sed -i "s/^export APP_VERSION=.*/export APP_VERSION=$RELEASE/" "/opt/manyfold/.env"
msg_ok "Configured Manyfold"
RUBY_VERSION=${RUBY_INSTALL_VERSION} RUBY_INSTALL_RAILS="true" HOME=/home/manyfold setup_ruby
msg_info "Installing Manyfold"
chown -R manyfold:manyfold {/home/manyfold,/opt/manyfold}
chown -R manyfold:manyfold /opt/manyfold
sudo -u manyfold bash -c '
source /opt/manyfold/.env
export PATH="/home/manyfold/.rbenv/bin:$PATH"
eval "$(/home/manyfold/.rbenv/bin/rbenv init - bash)"
cd /opt/manyfold/app
gem install bundler sidekiq foreman
bundle install
corepack enable yarn
corepack prepare '"$YARN_VERSION"' --activate
corepack use '"$YARN_VERSION"'
bin/rails db:migrate
bin/rails assets:precompile
'
msg_ok "Installed Manyfold"
msg_info "Restoring Data"
rm -rf /opt/manyfold/app/{storage,tmp,config/credentials.yml.enc,config/master.key}
cp -r /opt/manyfold_storage_backup /opt/manyfold/app/storage 2>/dev/null || true
cp -r /opt/manyfold_tmp_backup /opt/manyfold/app/tmp 2>/dev/null || true
cp /opt/manyfold_credentials.yml.enc /opt/manyfold/app/config/credentials.yml.enc 2>/dev/null || true
cp /opt/manyfold_master.key /opt/manyfold/app/config/master.key 2>/dev/null || true
chown -R manyfold:manyfold /opt/manyfold/app/storage /opt/manyfold/app/tmp /opt/manyfold/app/config
rm -rf /opt/manyfold_storage_backup /opt/manyfold_tmp_backup /opt/manyfold_credentials.yml.enc /opt/manyfold_master.key
msg_ok "Restored Data"
msg_info "Restarting Services"
source /opt/manyfold/.env
export PATH="/home/manyfold/.rbenv/shims:/home/manyfold/.rbenv/bin:$PATH"
$STD foreman export systemd /etc/systemd/system -a manyfold -u manyfold -f /opt/manyfold/app/Procfile
for f in /etc/systemd/system/manyfold-*.service; do
sed -i "s|/bin/bash -lc '|/bin/bash -lc 'source /opt/manyfold/.env \&\& |" "$f"
done
systemctl daemon-reload
systemctl enable -q --now manyfold.target manyfold-rails.1 manyfold-default_worker.1 manyfold-performance_worker.1
msg_ok "Restarted 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}"

View File

@@ -28,46 +28,30 @@ function update_script() {
exit
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/netbox-community/netbox/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Stopping Service"
if check_for_gh_release "netbox" "netbox-community/netbox"; then
msg_info "Stopping Services"
systemctl stop netbox netbox-rq
msg_ok "Stopped Service"
msg_ok "Stopped Services"
msg_info "Updating $APP to v${RELEASE}"
msg_info "Backing up NetBox configurations"
mv /opt/netbox/ /opt/netbox-backup
cd /opt
curl -fsSL "https://github.com/netbox-community/netbox/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/netbox-community/netbox/archive/refs/tags/v${RELEASE}.zip")
$STD unzip "v${RELEASE}.zip"
mv /opt/netbox-${RELEASE}/ /opt/netbox/
msg_ok "Backed up NetBox configurations"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "netbox" "netbox-community/netbox" "tarball"
cp -r /opt/netbox-backup/netbox/netbox/configuration.py /opt/netbox/netbox/netbox/
cp -r /opt/netbox-backup/netbox/media/ /opt/netbox/netbox/
cp -r /opt/netbox-backup/netbox/scripts /opt/netbox/netbox/
cp -r /opt/netbox-backup/netbox/reports /opt/netbox/netbox/
cp -r /opt/netbox-backup/netbox/{media,scripts,reports}/ /opt/netbox/netbox/
cp -r /opt/netbox-backup/gunicorn.py /opt/netbox/
if [ -f /opt/netbox-backup/local_requirements.txt ]; then
cp -r /opt/netbox-backup/local_requirements.txt /opt/netbox/
fi
if [ -f /opt/netbox-backup/netbox/netbox/ldap_config.py ]; then
cp -r /opt/netbox-backup/netbox/netbox/ldap_config.py /opt/netbox/netbox/netbox/
fi
[[ -f /opt/netbox-backup/local_requirements.txt ]] && cp -r /opt/netbox-backup/local_requirements.txt /opt/netbox/
[[ -f /opt/netbox-backup/netbox/netbox/ldap_config.py ]] && cp -r /opt/netbox-backup/netbox/netbox/ldap_config.py /opt/netbox/netbox/netbox/
$STD /opt/netbox/upgrade.sh
rm -r "/opt/v${RELEASE}.zip"
rm -r /opt/netbox-backup
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated $APP to v${RELEASE}"
msg_info "Starting Service"
msg_info "Starting Services"
systemctl start netbox netbox-rq
msg_ok "Started Service"
msg_ok "Started Services"
msg_ok "Updated successfully!"
else
msg_ok "No update required. ${APP} is already at v${RELEASE}"
fi
exit
}

View File

@@ -53,6 +53,8 @@ function update_script() {
cp -R .next/standalone ./
chmod +x ./dist/cli.mjs
cp server/db/names.json ./dist/names.json
cp server/db/ios_models.json ./dist/ios_models.json
cp server/db/mac_models.json ./dist/mac_models.json
msg_ok "Updated Pangolin"
msg_info "Restoring config"

View File

@@ -28,6 +28,8 @@ function update_script() {
exit
fi
PYTHON_VERSION="3.14" setup_uv
if check_for_gh_release "spoolman" "Donkie/Spoolman"; then
msg_info "Stopping Service"
systemctl stop spoolman
@@ -42,8 +44,10 @@ function update_script() {
msg_info "Updating Spoolman"
cd /opt/spoolman
$STD pip3 install -r requirements.txt
$STD uv sync --locked --no-install-project
$STD uv sync --locked
cp /opt/spoolman_bak/.env /opt/spoolman
sed -i 's|^ExecStart=.*|ExecStart=/usr/bin/bash /opt/spoolman/scripts/start.sh|' /etc/systemd/system/spoolman.service
msg_ok "Updated Spoolman"
msg_info "Starting Service"

View File

@@ -35,9 +35,10 @@ function update_script() {
systemctl stop tautulli
msg_ok "Stopped Service"
msg_info "Backing up config"
msg_info "Backing up config and database"
cp /opt/Tautulli/config.ini /opt/tautulli_config.ini.backup
msg_ok "Backed up config"
cp /opt/Tautulli/tautulli.db /opt/tautulli.db.backup
msg_ok "Backed up config and database"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Tautulli" "Tautulli/Tautulli" "tarball"
@@ -46,17 +47,17 @@ function update_script() {
TAUTULLI_VERSION=$(get_latest_github_release "Tautulli/Tautulli" "false")
echo "${TAUTULLI_VERSION}" >/opt/Tautulli/version.txt
echo "master" >/opt/Tautulli/branch.txt
source /opt/Tautulli/.venv/bin/activate
$STD pip install --upgrade uv
$STD uv pip install -q -r requirements.txt
$STD uv pip install -q pyopenssl
deactivate
$STD uv venv -c
$STD source /opt/Tautulli/.venv/bin/activate
$STD uv pip install -r requirements.txt
$STD uv pip install pyopenssl
msg_ok "Updated Tautulli"
msg_info "Restoring config"
msg_info "Restoring config and database"
cp /opt/tautulli_config.ini.backup /opt/Tautulli/config.ini
rm -f /opt/tautulli_config.ini.backup
msg_ok "Restored config"
cp /opt/tautulli.db.backup /opt/Tautulli/tautulli.db
rm -f /opt/{tautulli_config.ini.backup,tautulli.db.backup}
msg_ok "Restored config and database"
msg_info "Starting Service"
systemctl start tautulli

View File

@@ -36,10 +36,19 @@ function update_script() {
msg_info "Backing up Data"
cp -r /opt/termix/data /opt/termix_data_backup
cp -r /opt/termix/uploads /opt/termix_uploads_backup
msg_ok "Backed up Data"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix"
msg_info "Recreating Directories"
mkdir -p /opt/termix/html \
/opt/termix/nginx \
/opt/termix/nginx/logs \
/opt/termix/nginx/cache \
/opt/termix/nginx/client_body
msg_ok "Recreated Directories"
msg_info "Building Frontend"
cd /opt/termix
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
@@ -60,9 +69,9 @@ function update_script() {
msg_ok "Set up Production Dependencies"
msg_info "Restoring Data"
mkdir -p /opt/termix/data
cp -r /opt/termix_data_backup/. /opt/termix/data
rm -rf /opt/termix_data_backup
cp -r /opt/termix_data_backup /opt/termix/data
cp -r /opt/termix_uploads_backup /opt/termix/uploads
rm -rf /opt/termix_data_backup /opt/termix_uploads_backup
msg_ok "Restored Data"
msg_info "Updating Frontend Files"

View File

@@ -23,11 +23,13 @@ function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /etc/systemd/system/tracearr.service ]]; then
if [[ ! -f /lib/systemd/system/tracearr.service ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
NODE_VERSION="24" setup_nodejs
if check_for_gh_release "tracearr" "connorgallopo/Tracearr"; then
msg_info "Stopping Services"
systemctl stop tracearr postgresql redis

View File

@@ -12,7 +12,7 @@
"documentation": "https://github.com/ThePhaseless/Byparr/blob/master/README.md",
"website": "https://github.com/ThePhaseless/Byparr",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/byparr.webp",
"config_path": "",
"config_path": "/etc/systemd/system/byparr.service",
"description": "Byparr is a proxy server to bypass Cloudflare and DDoS-GUARD protection.",
"install_methods": [
{

View File

@@ -23,7 +23,7 @@
"ram": 4096,
"hdd": 16,
"os": "debian",
"version": "12"
"version": "13"
}
}
],

View File

@@ -19,9 +19,9 @@
"type": "default",
"script": "ct/jotty.sh",
"resources": {
"cpu": 2,
"ram": 4096,
"hdd": 8,
"cpu": 1,
"ram": 1024,
"hdd": 5,
"os": "debian",
"version": "13"
}
@@ -31,10 +31,5 @@
"username": null,
"password": null
},
"notes": [
{
"text": "jotty was previously named rwMarkable",
"type": "info"
}
]
"notes": []
}

View File

@@ -0,0 +1,40 @@
{
"name": "Manyfold",
"slug": "manyfold",
"categories": [
24
],
"date_created": "2026-01-24",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 80,
"documentation": "https://manyfold.app/sysadmin/",
"website": "https://manyfold.app/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/manyfold.webp",
"config_path": "/opt/manyfold/.env",
"description": "Manyfold is an open source, self-hosted web application for managing a collection of 3d models, particularly focused on 3d printing.",
"install_methods": [
{
"type": "default",
"script": "ct/manyfold.sh",
"resources": {
"cpu": 4,
"ram": 4096,
"hdd": 15,
"os": "debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "Setup library on first connection in /opt/manyfold/data",
"type": "info"
}
]
}

View File

@@ -1,14 +1,224 @@
[
{
"name": "node-red/node-red",
"version": "4.1.4",
"date": "2026-01-26T11:29:13Z"
},
{
"name": "meilisearch/meilisearch",
"version": "latest",
"date": "2026-01-26T09:30:03Z"
},
{
"name": "syncthing/syncthing",
"version": "v2.0.13",
"date": "2026-01-06T12:09:32Z"
},
{
"name": "emqx/emqx",
"version": "e5.10.3-rc.3",
"date": "2026-01-26T08:27:48Z"
},
{
"name": "alam00000/bentopdf",
"version": "v1.16.1",
"date": "2026-01-26T08:27:11Z"
},
{
"name": "jupyter/notebook",
"version": "v7.5.3",
"date": "2026-01-26T07:28:46Z"
},
{
"name": "firefly-iii/firefly-iii",
"version": "v6.4.16",
"date": "2026-01-17T07:54:15Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.24.946",
"date": "2026-01-26T06:11:11Z"
},
{
"name": "morpheus65535/bazarr",
"version": "v1.5.4",
"date": "2026-01-04T22:41:00Z"
},
{
"name": "plexguide/Huntarr.io",
"version": "9.0.5",
"date": "2026-01-26T03:34:21Z"
},
{
"name": "hyperion-project/hyperion.ng",
"version": "2.1.1",
"date": "2025-06-14T17:45:06Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v4.1.0",
"date": "2025-11-23T12:13:34Z"
},
{
"name": "jeedom/core",
"version": "4.5.2",
"date": "2026-01-26T00:27:06Z"
},
{
"name": "TasmoAdmin/TasmoAdmin",
"version": "v4.3.4",
"date": "2026-01-25T22:16:41Z"
},
{
"name": "seerr-team/seerr",
"version": "preview-availability-sync-single-server-resolution",
"date": "2026-01-25T21:05:21Z"
},
{
"name": "Part-DB/Part-DB-server",
"version": "v2.5.1",
"date": "2026-01-25T20:50:59Z"
},
{
"name": "esphome/esphome",
"version": "2026.1.2",
"date": "2026-01-25T18:21:29Z"
},
{
"name": "FreshRSS/FreshRSS",
"version": "1.28.1",
"date": "2026-01-25T18:20:14Z"
},
{
"name": "project-zot/zot",
"version": "v2.1.14",
"date": "2026-01-25T17:14:38Z"
},
{
"name": "benjaminjonard/koillection",
"version": "1.8.0",
"date": "2026-01-25T13:48:30Z"
},
{
"name": "fuma-nama/fumadocs",
"version": "@fumadocs/story@0.0.4",
"date": "2026-01-25T13:39:02Z"
},
{
"name": "evcc-io/evcc",
"version": "0.300.6",
"date": "2026-01-25T10:37:05Z"
},
{
"name": "Athou/commafeed",
"version": "6.1.0",
"date": "2026-01-25T10:24:27Z"
},
{
"name": "eclipse-mosquitto/mosquitto",
"version": "v2.1.0rc3",
"date": "2026-01-25T09:15:01Z"
},
{
"name": "kimai/kimai",
"version": "2.47.0",
"date": "2026-01-25T09:01:46Z"
},
{
"name": "mayswind/AriaNg",
"version": "1.3.13",
"date": "2026-01-25T07:56:27Z"
},
{
"name": "BerriAI/litellm",
"version": "v1.81.3.rc.1",
"date": "2026-01-25T03:17:11Z"
},
{
"name": "ollama/ollama",
"version": "v0.15.0-rc2",
"date": "2026-01-23T23:37:17Z"
"version": "v0.15.1-rc1",
"date": "2026-01-25T00:33:54Z"
},
{
"name": "crafty-controller/crafty-4",
"version": "v4.9.0",
"date": "2026-01-25T00:31:51Z"
},
{
"name": "runtipi/runtipi",
"version": "v4.7.1",
"date": "2026-01-24T21:03:08Z"
},
{
"name": "go-vikunja/vikunja",
"version": "v1.0.0-rc0",
"date": "2025-08-17T18:47:15Z"
},
{
"name": "fosrl/pangolin",
"version": "1.15.1",
"date": "2026-01-24T20:34:24Z"
},
{
"name": "moghtech/komodo",
"version": "v1.19.5",
"date": "2025-09-27T20:59:46Z"
},
{
"name": "benzino77/tasmocompiler",
"version": "v13.1.0",
"date": "2026-01-24T17:52:54Z"
},
{
"name": "booklore-app/booklore",
"version": "v1.18.5",
"date": "2026-01-24T17:15:32Z"
},
{
"name": "Luligu/matterbridge",
"version": "3.5.1",
"date": "2026-01-24T14:44:07Z"
},
{
"name": "gtsteffaniak/filebrowser",
"version": "v1.2.1-beta",
"date": "2026-01-24T14:38:21Z"
},
{
"name": "tobychui/zoraxy",
"version": "v3.3.1-rc3",
"date": "2026-01-24T14:31:01Z"
},
{
"name": "BookStackApp/BookStack",
"version": "v25.12.2",
"date": "2026-01-24T14:01:03Z"
},
{
"name": "deuxfleurs-org/garage",
"version": "v1.3.1",
"date": "2026-01-24T13:50:25Z"
},
{
"name": "MediaBrowser/Emby.Releases",
"version": "4.9.3.0",
"date": "2026-01-08T16:08:34Z"
},
{
"name": "nickheyer/discopanel",
"version": "v1.0.25",
"date": "2026-01-24T05:56:58Z"
},
{
"name": "Stirling-Tools/Stirling-PDF",
"version": "v2.4.0",
"date": "2026-01-24T00:51:05Z"
},
{
"name": "azukaar/Cosmos-Server",
"version": "v0.20.2",
"date": "2026-01-24T00:12:39Z"
},
{
"name": "mongodb/mongo",
"version": "r8.3.0-alpha1",
@@ -34,21 +244,11 @@
"version": "2026.1.3",
"date": "2026-01-23T20:15:10Z"
},
{
"name": "firefly-iii/firefly-iii",
"version": "v6.4.16",
"date": "2026-01-17T07:54:15Z"
},
{
"name": "bunkerity/bunkerweb",
"version": "v1.6.7",
"date": "2026-01-12T09:54:36Z"
},
{
"name": "fosrl/pangolin",
"version": "1.15.0",
"date": "2026-01-23T19:48:21Z"
},
{
"name": "metabase/metabase",
"version": "v0.58.x",
@@ -64,20 +264,15 @@
"version": "v1.51.0",
"date": "2026-01-23T19:29:49Z"
},
{
"name": "booklore-app/booklore",
"version": "v1.18.3",
"date": "2026-01-22T23:11:30Z"
},
{
"name": "ghostfolio/ghostfolio",
"version": "2.233.0",
"date": "2026-01-23T18:41:45Z"
},
{
"name": "azukaar/Cosmos-Server",
"version": "v0.20.1",
"date": "2026-01-23T17:58:18Z"
"name": "keycloak/keycloak",
"version": "26.5.2",
"date": "2026-01-23T14:26:58Z"
},
{
"name": "openobserve/openobserve",
@@ -94,11 +289,6 @@
"version": "v25.4",
"date": "2025-10-09T10:27:01Z"
},
{
"name": "keycloak/keycloak",
"version": "26.5.2",
"date": "2026-01-23T14:26:58Z"
},
{
"name": "zitadel/zitadel",
"version": "v4.10.0",
@@ -119,56 +309,16 @@
"version": "v1.7.6",
"date": "2026-01-23T09:41:22Z"
},
{
"name": "jupyter/notebook",
"version": "@jupyter-notebook/ui-components@7.6.0-alpha.2",
"date": "2026-01-23T08:07:05Z"
},
{
"name": "neo4j/neo4j",
"version": "5.26.20",
"date": "2026-01-23T07:30:39Z"
},
{
"name": "plexguide/Huntarr.io",
"version": "8.2.25",
"date": "2026-01-23T07:00:51Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.24.903",
"date": "2026-01-23T05:55:59Z"
},
{
"name": "9001/copyparty",
"version": "v1.20.4",
"date": "2026-01-23T01:29:26Z"
},
{
"name": "jeedom/core",
"version": "4.5.2",
"date": "2026-01-23T00:27:08Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v4.1.0",
"date": "2025-11-23T12:13:34Z"
},
{
"name": "esphome/esphome",
"version": "2026.1.1",
"date": "2026-01-22T23:19:21Z"
},
{
"name": "runtipi/runtipi",
"version": "nightly",
"date": "2026-01-22T20:38:13Z"
},
{
"name": "crafty-controller/crafty-4",
"version": "v4.8.0",
"date": "2026-01-22T20:08:17Z"
},
{
"name": "tailscale/tailscale",
"version": "v1.94.1",
@@ -229,11 +379,6 @@
"version": "2026-01-22-r1",
"date": "2026-01-22T10:20:04Z"
},
{
"name": "eclipse-mosquitto/mosquitto",
"version": "v2.1.0rc2",
"date": "2026-01-22T09:42:43Z"
},
{
"name": "dgtlmoon/changedetection.io",
"version": "0.52.9",
@@ -254,11 +399,6 @@
"version": "v4.2.3",
"date": "2026-01-22T03:57:50Z"
},
{
"name": "BerriAI/litellm",
"version": "v1.81.0.rc.5",
"date": "2026-01-22T03:30:46Z"
},
{
"name": "go-gitea/gitea",
"version": "v1.25.4",
@@ -269,11 +409,6 @@
"version": "v0.156.3",
"date": "2026-01-22T00:44:20Z"
},
{
"name": "Stirling-Tools/Stirling-PDF",
"version": "v2.3.1",
"date": "2026-01-21T22:50:25Z"
},
{
"name": "influxdata/influxdb",
"version": "v2.8.0",
@@ -299,30 +434,15 @@
"version": "jenkins-2.541.1",
"date": "2026-01-21T15:09:10Z"
},
{
"name": "node-red/node-red",
"version": "4.1.3",
"date": "2026-01-07T16:24:23Z"
},
{
"name": "semaphoreui/semaphore",
"version": "v2.17.0-rc7",
"date": "2026-01-21T12:12:33Z"
},
{
"name": "evcc-io/evcc",
"version": "0.300.5",
"date": "2026-01-21T11:35:44Z"
},
{
"name": "javedh-dev/tracktor",
"version": "1.2.1",
"date": "2026-01-21T11:12:28Z"
},
{
"name": "emqx/emqx",
"version": "e5.10.3-rc.2",
"date": "2026-01-21T08:57:16Z"
"date": "2026-01-21T09:31:18Z"
},
{
"name": "docker/compose",
@@ -344,11 +464,6 @@
"version": "v2.20.5",
"date": "2026-01-21T00:12:33Z"
},
{
"name": "seerr-team/seerr",
"version": "preview-availability-sync-fix",
"date": "2026-01-20T22:11:24Z"
},
{
"name": "rcourtman/Pulse",
"version": "v5.0.17",
@@ -364,11 +479,6 @@
"version": "v4.5.1",
"date": "2026-01-20T19:45:05Z"
},
{
"name": "nickheyer/discopanel",
"version": "v1.0.24",
"date": "2026-01-20T18:31:20Z"
},
{
"name": "mysql/mysql-server",
"version": "mysql-cluster-8.0.45",
@@ -382,12 +492,7 @@
{
"name": "chrisvel/tududi",
"version": "v0.88.4",
"date": "2026-01-20T16:02:12Z"
},
{
"name": "gtsteffaniak/filebrowser",
"version": "v1.1.1-stable",
"date": "2026-01-12T23:25:10Z"
"date": "2026-01-20T15:11:58Z"
},
{
"name": "mattermost/mattermost",
@@ -399,11 +504,6 @@
"version": "v14.0.8",
"date": "2026-01-20T15:10:44Z"
},
{
"name": "meilisearch/meilisearch",
"version": "latest",
"date": "2026-01-20T14:25:19Z"
},
{
"name": "sysadminsmedia/homebox",
"version": "v0.23.0-rc.1",
@@ -424,21 +524,11 @@
"version": "v5.9.0-test.1",
"date": "2026-01-20T10:34:53Z"
},
{
"name": "Luligu/matterbridge",
"version": "3.5.0",
"date": "2026-01-20T08:53:52Z"
},
{
"name": "HydroshieldMKII/Guardian",
"version": "v1.3.4",
"date": "2026-01-20T06:20:36Z"
},
{
"name": "morpheus65535/bazarr",
"version": "v1.5.4",
"date": "2026-01-04T22:41:00Z"
},
{
"name": "diced/zipline",
"version": "v4.4.1",
@@ -499,11 +589,6 @@
"version": "v1.0.0-beta22",
"date": "2026-01-18T22:38:36Z"
},
{
"name": "Part-DB/Part-DB-server",
"version": "v2.5.0",
"date": "2026-01-18T22:16:38Z"
},
{
"name": "Brandawg93/PeaNUT",
"version": "v5.21.2",
@@ -524,11 +609,6 @@
"version": "2.4",
"date": "2026-01-18T12:12:02Z"
},
{
"name": "hyperion-project/hyperion.ng",
"version": "2.1.1",
"date": "2025-06-14T17:45:06Z"
},
{
"name": "oauth2-proxy/oauth2-proxy",
"version": "v7.14.2",
@@ -619,11 +699,6 @@
"version": "v4.8.0",
"date": "2026-01-14T17:54:36Z"
},
{
"name": "alam00000/bentopdf",
"version": "v1.16.0",
"date": "2026-01-14T16:45:03Z"
},
{
"name": "Bubka/2FAuth",
"version": "v6.0.0",
@@ -634,11 +709,6 @@
"version": "v3.6.7",
"date": "2026-01-14T14:11:45Z"
},
{
"name": "tobychui/zoraxy",
"version": "v3.3.1-rc2",
"date": "2026-01-14T12:29:28Z"
},
{
"name": "cloudreve/cloudreve",
"version": "4.11.1",
@@ -759,11 +829,6 @@
"version": "v0.7.2",
"date": "2026-01-10T21:00:12Z"
},
{
"name": "Athou/commafeed",
"version": "6.0.0",
"date": "2026-01-10T20:28:07Z"
},
{
"name": "blakeblackshear/frigate",
"version": "v0.14.1",
@@ -789,11 +854,6 @@
"version": "v3007.11",
"date": "2026-01-09T17:23:23Z"
},
{
"name": "fuma-nama/fumadocs",
"version": "@fumadocs/base-ui@16.4.6",
"date": "2026-01-09T10:54:11Z"
},
{
"name": "webmin/webmin",
"version": "2.620",
@@ -804,11 +864,6 @@
"version": "v26.1.1",
"date": "2026-01-08T22:02:15Z"
},
{
"name": "MediaBrowser/Emby.Releases",
"version": "4.9.3.0",
"date": "2026-01-08T16:08:34Z"
},
{
"name": "openhab/openhab-core",
"version": "5.1.1",
@@ -869,11 +924,6 @@
"version": "2.2.16",
"date": "2026-01-07T03:26:27Z"
},
{
"name": "kimai/kimai",
"version": "2.46.0",
"date": "2026-01-07T00:19:31Z"
},
{
"name": "caddyserver/caddy",
"version": "v2.10.2",
@@ -889,11 +939,6 @@
"version": "26.1.0.118079",
"date": "2026-01-06T14:46:07Z"
},
{
"name": "syncthing/syncthing",
"version": "v2.0.13",
"date": "2026-01-06T12:09:32Z"
},
{
"name": "transmission/transmission",
"version": "4.0.1-beta.1",
@@ -932,7 +977,7 @@
{
"name": "mealie-recipes/mealie",
"version": "v3.9.2",
"date": "2026-01-02T19:40:19Z"
"date": "2026-01-02T19:40:09Z"
},
{
"name": "gotify/server",
@@ -954,11 +999,6 @@
"version": "2.2.2",
"date": "2025-12-31T16:53:34Z"
},
{
"name": "BookStackApp/BookStack",
"version": "v25.12.1",
"date": "2025-12-30T17:25:57Z"
},
{
"name": "ArchiveBox/ArchiveBox",
"version": "v0.8.6rc1",
@@ -984,11 +1024,6 @@
"version": "v1.3.7",
"date": "2025-12-25T11:08:14Z"
},
{
"name": "FreshRSS/FreshRSS",
"version": "1.28.0",
"date": "2025-12-24T19:27:21Z"
},
{
"name": "Dolibarr/dolibarr",
"version": "22.0.4",
@@ -1014,11 +1049,6 @@
"version": "v1.6.11",
"date": "2025-12-23T10:40:42Z"
},
{
"name": "project-zot/zot",
"version": "v2.1.13",
"date": "2025-12-23T10:14:48Z"
},
{
"name": "sabnzbd/sabnzbd",
"version": "4.5.5",
@@ -1029,11 +1059,6 @@
"version": "v4.0.16.2944",
"date": "2025-11-05T01:56:48Z"
},
{
"name": "benjaminjonard/koillection",
"version": "1.7.1",
"date": "2025-12-21T17:06:17Z"
},
{
"name": "ventoy/Ventoy",
"version": "v1.1.10",
@@ -1094,11 +1119,6 @@
"version": "v5.0.87",
"date": "2025-12-14T08:35:11Z"
},
{
"name": "mayswind/AriaNg",
"version": "1.3.12",
"date": "2025-12-14T02:58:24Z"
},
{
"name": "martabal/qbittorrent-exporter",
"version": "v1.13.2",
@@ -1244,11 +1264,6 @@
"version": "1.23.6",
"date": "2025-11-28T03:52:50Z"
},
{
"name": "go-vikunja/vikunja",
"version": "v1.0.0-rc0",
"date": "2025-08-17T18:47:15Z"
},
{
"name": "phpipam/phpipam",
"version": "v1.7.4",
@@ -1284,11 +1299,6 @@
"version": "mariadb-12.1.2",
"date": "2025-11-18T15:16:21Z"
},
{
"name": "TasmoAdmin/TasmoAdmin",
"version": "v4.3.2",
"date": "2025-10-18T12:11:00Z"
},
{
"name": "nextcloud/nextcloudpi",
"version": "v1.56.0",
@@ -1359,11 +1369,6 @@
"version": "2.11.1",
"date": "2025-11-08T14:27:27Z"
},
{
"name": "deuxfleurs-org/garage",
"version": "v1.99.3-internal",
"date": "2025-11-06T17:27:21Z"
},
{
"name": "Notifiarr/notifiarr",
"version": "v0.9.1",
@@ -1419,11 +1424,6 @@
"version": "v2.7.0",
"date": "2025-10-23T17:15:07Z"
},
{
"name": "benzino77/tasmocompiler",
"version": "v13.0.0",
"date": "2025-10-19T10:03:18Z"
},
{
"name": "minio/minio",
"version": "RELEASE.2025-10-15T17-29-55Z",

View File

@@ -14,7 +14,7 @@ network_check
update_os
msg_info "Installing Apt-Cacher NG"
DEBIAN_FRONTEND=noninteractive $STD apt -o Dpkg::Options::="--force-confold" install -y apt-cacher-ng
DEBIAN_FRONTEND=noninteractive $STD apt -o Dpkg::Options::="--force-confold" install -y apt-cacher-ng avahi-daemon
sed -i 's/# PassThroughPattern: .* # this would allow CONNECT to everything/PassThroughPattern: .*/' /etc/apt-cacher-ng/acng.conf
cat <<EOF >/etc/apt/apt.conf.d/00aptproxy.conf
Acquire::http::Proxy "http://localhost:3142";

View File

@@ -15,11 +15,10 @@ update_os
fetch_and_deploy_gh_release "authelia" "authelia/authelia" "binary"
get_lxc_ip
MAX_ATTEMPTS=3
attempt=0
while true; do
((attempt++))
attempt=$((attempt + 1))
read -rp "${TAB3}Enter your domain or IP (ex. example.com or 192.168.1.100): " DOMAIN
if [[ -z "$DOMAIN" ]]; then
if ((attempt >= MAX_ATTEMPTS)); then
@@ -53,6 +52,14 @@ touch /etc/authelia/emails.txt
JWT_SECRET=$(openssl rand -hex 64)
SESSION_SECRET=$(openssl rand -hex 64)
STORAGE_KEY=$(openssl rand -hex 64)
if [[ "$DOMAIN" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
AUTHELIA_URL="https://${DOMAIN}:9091"
else
AUTHELIA_URL="https://auth.${DOMAIN}"
fi
echo "$AUTHELIA_URL" > /etc/authelia/.authelia_url
cat <<EOF >/etc/authelia/users.yml
users:
authelia:
@@ -76,7 +83,7 @@ session:
remember_me: '1M'
cookies:
- domain: "${DOMAIN}"
authelia_url: "https://auth.${DOMAIN}"
authelia_url: "${AUTHELIA_URL}"
storage:
encryption_key: "${STORAGE_KEY}"
local:

View File

@@ -21,12 +21,12 @@ $STD apt install -y \
msg_ok "Installed Dependencies"
PG_VERSION="16" setup_postgresql
PG_DB_NAME="bitmagnet" PG_DB_USER="bitmagnet" setup_postgresql_db
setup_go
fetch_and_deploy_gh_release "bitmagnet" "bitmagnet-io/bitmagnet" "tarball"
RELEASE=$(cat ~/.bitmagnet)
PG_DB_NAME="bitmagnet" PG_DB_USER="postgres" setup_postgresql_db
msg_info "Configuring bitmagnet"
cd /opt/bitmagnet
$STD go build -ldflags "-s -w -X github.com/bitmagnet-io/bitmagnet/internal/version.GitTag=v${RELEASE}"
@@ -34,6 +34,20 @@ chmod +x bitmagnet
msg_ok "Configured bitmagnet"
read -r -p "${TAB3}Enter your TMDB API key if you have one: " tmdbapikey
cat <<EOF >/etc/bitmagnet.env
POSTGRES_HOST=localhost
POSTGRES_USER=${PG_DB_USER}
POSTGRES_NAME=${PG_DB_NAME}
POSTGRES_PASSWORD=${PG_DB_PASS}
EOF
if [ -z "$tmdbapikey" ]; then
echo "TMDB_ENABLED=false" >>/etc/bitmagnet.env
else
echo "TMDB_API_KEY=$tmdbapikey" >>/etc/bitmagnet.env
fi
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/bitmagnet-web.service
[Unit]
@@ -44,10 +58,8 @@ After=network-online.target
Type=simple
User=root
WorkingDirectory=/opt/bitmagnet
EnvironmentFile=/etc/bitmagnet.env
ExecStart=/opt/bitmagnet/bitmagnet worker run --all
Environment=POSTGRES_HOST=localhost
Environment=POSTGRES_PASSWORD=${PG_DB_PASS}
Environment=TMDB_API_KEY=$tmdbapikey
Restart=on-failure
[Install]

View File

@@ -13,24 +13,14 @@ setting_up_container
network_check
update_os
msg_info "Installing Dependencies (a lot of patience)"
$STD apt-get install -y \
git \
sed \
lsb-release \
apt-transport-https \
coreutils \
software-properties-common
msg_ok "Installed Dependencies"
msg_info "Setting up TemurinJDK"
setup_java
$STD apt-get install -y temurin-{8,11,17,21}-jre
$STD apt install -y temurin-{8,11,17,21}-jre
sudo update-alternatives --set java /usr/lib/jvm/temurin-21-jre-amd64/bin/java
msg_ok "Installed TemurinJDK"
msg_info "Setup Python3"
$STD apt-get install -y \
$STD apt install -y \
python3 \
python3-dev \
python3-pip \
@@ -59,8 +49,8 @@ $STD sudo -u crafty bash -c '
'
msg_ok "Installed Craft-Controller and dependencies"
msg_info "Setting up Crafty-Controller service"
cat >/etc/systemd/system/crafty-controller.service <<'EOF'
msg_info "Setting up service"
cat <<EOF >/etc/systemd/system/crafty-controller.service
[Unit]
Description=Crafty 4
After=network.target
@@ -83,7 +73,7 @@ sleep 10
echo "Username: $(grep -oP '(?<="username": ")[^"]*' /opt/crafty-controller/crafty/crafty-4/app/config/default-creds.txt)"
echo "Password: $(grep -oP '(?<="password": ")[^"]*' /opt/crafty-controller/crafty/crafty-4/app/config/default-creds.txt)"
} >>~/crafty-controller.creds
msg_ok "Crafty-Controller service started"
msg_ok "Service started"
motd_ssh
customize

View File

@@ -38,7 +38,7 @@ After=network-online.target
[Service]
Type=simple
UMask=007
ExecStart=/usr/bin/deluged -d
ExecStart=/usr/local/bin/deluged -d
Restart=on-failure
TimeoutStopSec=300
@@ -56,7 +56,7 @@ Wants=deluged.service
[Service]
Type=simple
UMask=027
ExecStart=/usr/bin/deluge-web -d
ExecStart=/usr/local/bin/deluge-web -d
Restart=on-failure
[Install]

View File

@@ -51,7 +51,7 @@ sed -i '34d' /etc/matrix-synapse/homeserver.yaml
systemctl start matrix-synapse
msg_ok "Installed Element Synapse"
fetch_and_deploy_gh_release "etkecc/synapse-admin" "/opt/synapse-admin" "tarball"
fetch_and_deploy_gh_release "synapse-admin" "etkecc/synapse-admin" "tarball"
msg_info "Installing Synapse-Admin"
cd /opt/synapse-admin

View File

@@ -13,25 +13,19 @@ setting_up_container
network_check
update_os
fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes"
USE_UVX=YES setup_uv
setup_nodejs
fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes" "tarball"
USE_UVX="YES" setup_uv
NODE_VERSION="22" setup_nodejs
msg_info "Installing Backend"
msg_info "Setting up Flatnotes"
cd /opt/flatnotes
$STD /usr/local/bin/uvx migrate-to-uv
$STD /usr/local/bin/uv sync
mkdir /opt/flatnotes/data
msg_ok "Installed Backend"
msg_info "Installing Frontend"
mkdir -p /opt/flatnotes/data
cd /opt/flatnotes/client
$STD npm install
$STD npm run build
msg_ok "Installed Frontend"
msg_info "Creating Service"
cat <<EOF >/opt/flatnotes/.env
FLATNOTES_AUTH_TYPE='none'
FLATNOTES_PATH='/opt/flatnotes/data/'
@@ -39,6 +33,9 @@ FLATNOTES_PATH='/opt/flatnotes/data/'
#FLATNOTES_PASSWORD='password'
#FLATNOTES_SECRET_KEY='secret-key'
EOF
msg_ok "Setup Flatnotes"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/flatnotes.service
[Unit]
Description=Flatnotes

View File

@@ -17,7 +17,8 @@ msg_info "Installing Dependencies"
$STD apt install -y \
nginx \
ca-certificates \
libjemalloc2
libjemalloc2 \
git
msg_ok "Installed Dependencies"
setup_mariadb

View File

@@ -14,33 +14,16 @@ network_check
update_os
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
fetch_and_deploy_gh_release "jotty" "fccview/jotty" "tarball" "latest" "/opt/jotty"
msg_info "Installing ${APPLICATION}"
cd /opt/jotty
unset NODE_OPTIONS
export NODE_OPTIONS="--max-old-space-size=3072"
$STD yarn --frozen-lockfile
$STD yarn next telemetry disable
$STD yarn build
[ -d "public" ] && cp -r public .next/standalone/
[ -d "howto" ] && cp -r howto .next/standalone/
mkdir -p .next/standalone/.next
cp -r .next/static .next/standalone/.next/
mv .next/standalone /tmp/jotty_standalone
rm -rf ./* .next .git .gitignore .yarn
mv /tmp/jotty_standalone/* .
mv /tmp/jotty_standalone/.[!.]* . 2>/dev/null || true
rm -rf /tmp/jotty_standalone
fetch_and_deploy_gh_release "jotty" "fccview/jotty" "prebuild" "latest" "/opt/jotty" "jotty_*_prebuild.tar.gz"
msg_info "Setup jotty"
mkdir -p data/{users,checklists,notes}
cat <<EOF >/opt/jotty/.env
NODE_ENV=production
# --- Uncomment to enable
# APP_URL=https://your-jotty-domain.com
# INTERNAL_API_URL=http://localhost:3000
# HTTPS=true
# SERVE_PUBLIC_IMAGES=yes
# SERVE_PUBLIC_FILES=yes
@@ -53,12 +36,11 @@ NODE_ENV=production
# SSO_MODE=oidc
# OIDC_ISSUER=<your-oidc-issuer-url>
# OIDC_CLIENT_ID=<oidc-client-id>
# APP_URL=<https://app.domain.tld>
# SSO_FALLBACK_LOCAL=yes
# OIDC_CLIENT_SECRET=your_client_secret
# OIDC_ADMIN_GROUPS=admins
EOF
msg_ok "Installed ${APPLICATION}"
msg_ok "Setup jotty"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/jotty.service

View File

@@ -19,7 +19,8 @@ $STD apt install -y \
ca-certificates \
chromium \
graphicsmagick \
ghostscript
ghostscript \
ffmpeg
msg_ok "Installed Dependencies"
fetch_and_deploy_gh_release "monolith" "Y2Z/monolith" "singlefile" "latest" "/usr/bin" "monolith-gnu-linux-x86_64"

139
install/manyfold-install.sh Normal file
View File

@@ -0,0 +1,139 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: bvdberg01 | Co-Author: SunFlowerOwl
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/manyfold3d/manyfold
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 \
libarchive-dev \
git \
libmariadb-dev \
redis-server \
nginx \
libassimp-dev
msg_ok "Installed Dependencies"
setup_imagemagick
PG_VERSION="16" setup_postgresql
PG_DB_NAME="manyfold" PG_DB_USER="manyfold" setup_postgresql_db
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
fetch_and_deploy_gh_release "manyfold" "manyfold3d/manyfold" "tarball" "latest" "/opt/manyfold/app"
RUBY_INSTALL_VERSION=$(cat /opt/manyfold/app/.ruby-version)
RUBY_VERSION=${RUBY_INSTALL_VERSION} RUBY_INSTALL_RAILS="true" HOME=/home/manyfold setup_ruby
msg_info "Configuring Manyfold"
YARN_VERSION=$(grep '"packageManager":' /opt/manyfold/app/package.json | sed -E 's/.*"(yarn@[0-9\.]+)".*/\1/')
RELEASE=$(get_latest_github_release "manyfold3d/manyfold")
useradd -m -s /usr/bin/bash manyfold
cat <<EOF >/opt/manyfold/.env
export APP_VERSION=${RELEASE}
export GUID=1002
export PUID=1001
export PUBLIC_PORT=5000
export REDIS_URL=redis://127.0.0.1:6379/1
export DATABASE_ADAPTER=postgresql
export DATABASE_HOST=127.0.0.1
export DATABASE_USER=${PG_DB_USER}
export DATABASE_PASSWORD=${PG_DB_PASS}
export DATABASE_NAME=${PG_DB_NAME}
export DATABASE_CONNECTION_POOL=16
export MULTIUSER=enabled
export HTTPS_ONLY=false
export RAILS_ENV=production
EOF
cat <<EOF >/opt/manyfold/user_setup.sh
#!/bin/bash
source /opt/manyfold/.env
export PATH="/home/manyfold/.rbenv/bin:\$PATH"
eval "\$(/home/manyfold/.rbenv/bin/rbenv init - bash)"
cd /opt/manyfold/app
rbenv global $RUBY_INSTALL_VERSION
gem install bundler
bundle install
gem install sidekiq
gem install foreman
corepack enable yarn
rm -f /opt/manyfold/app/config/credentials.yml.enc
corepack prepare $YARN_VERSION --activate
corepack use $YARN_VERSION
export VISUAL="code --wait"
bin/rails credentials:edit
bin/rails db:migrate
bin/rails assets:precompile
EOF
$STD mkdir -p /opt/manyfold_data
msg_ok "Configured Manyfold"
msg_info "Installing Manyfold"
chown -R manyfold:manyfold {/home/manyfold,/opt/manyfold}
chmod +x /opt/manyfold/user_setup.sh
$STD npm install --global corepack
$STD sudo -u manyfold bash /opt/manyfold/user_setup.sh
rm -f /opt/manyfold/user_setup.sh
msg_ok "Installed Manyfold"
msg_info "Creating Services"
source /opt/manyfold/.env
export PATH="/home/manyfold/.rbenv/shims:/home/manyfold/.rbenv/bin:$PATH"
$STD foreman export systemd /etc/systemd/system -a manyfold -u manyfold -f /opt/manyfold/app/Procfile
for f in /etc/systemd/system/manyfold-*.service; do
sed -i "s|/bin/bash -lc '|/bin/bash -lc 'source /opt/manyfold/.env \&\& |" "$f"
done
systemctl enable -q --now manyfold.target manyfold-rails.1 manyfold-default_worker.1 manyfold-performance_worker.1
cat <<EOF >/etc/nginx/sites-available/manyfold.conf
server {
listen 80;
server_name manyfold;
root /opt/manyfold/app/public;
location /cable {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host \$host;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
location / {
try_files \$uri/index.html \$uri @rails;
}
location @rails {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
}
EOF
ln -s /etc/nginx/sites-available/manyfold.conf /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
$STD systemctl reload nginx
msg_ok "Created Services"
motd_ssh
customize
msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"

View File

@@ -27,6 +27,7 @@ $STD apt install -y \
msg_ok "Installed Dependencies"
PG_VERSION="16" setup_postgresql
PG_DB_NAME="netbox" PG_DB_USER="netbox" setup_postgresql_db
msg_info "Installing Python"
$STD apt install -y \
@@ -36,42 +37,24 @@ $STD apt install -y \
python3-dev
msg_ok "Installed Python"
msg_info "Setting up PostgreSQL"
DB_NAME=netbox
DB_USER=netbox
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;"
{
echo "Netbox-Credentials"
echo -e "Netbox Database User: \e[32m$DB_USER\e[0m"
echo -e "Netbox Database Password: \e[32m$DB_PASS\e[0m"
echo -e "Netbox Database Name: \e[32m$DB_NAME\e[0m"
} >>~/netbox.creds
msg_ok "Set up PostgreSQL"
fetch_and_deploy_gh_release "netbox" "netbox-community/netbox" "tarball"
msg_info "Installing NetBox (Patience)"
cd /opt
RELEASE=$(curl -fsSL https://api.github.com/repos/netbox-community/netbox/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
curl -fsSL "https://github.com/netbox-community/netbox/archive/refs/tags/v${RELEASE}.zip" -o "v${RELEASE}.zip"
$STD unzip "v${RELEASE}.zip"
mv /opt/netbox-"${RELEASE}"/ /opt/netbox
msg_info "Configuring NetBox (Patience)"
cd /opt/netbox
mkdir -p /opt/netbox/netbox/media
$STD adduser --system --group netbox
chown --recursive netbox /opt/netbox/netbox/media/
chown --recursive netbox /opt/netbox/netbox/reports/
chown --recursive netbox /opt/netbox/netbox/scripts/
chown -R netbox /opt/netbox/netbox
mv /opt/netbox/netbox/netbox/configuration_example.py /opt/netbox/netbox/netbox/configuration.py
SECRET_KEY=$(python3 /opt/netbox/netbox/generate_secret_key.py)
ESCAPED_SECRET_KEY=$(printf '%s\n' "$SECRET_KEY" | sed 's/[&/\]/\\&/g')
sed -i 's/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = ["*"]/' /opt/netbox/netbox/netbox/configuration.py
sed -i "s|SECRET_KEY = ''|SECRET_KEY = '${ESCAPED_SECRET_KEY}'|" /opt/netbox/netbox/netbox/configuration.py
sed -i "/DATABASES = {/,/}/s/'USER': '[^']*'/'USER': '$DB_USER'/" /opt/netbox/netbox/netbox/configuration.py
sed -i "/DATABASES = {/,/}/s/'PASSWORD': '[^']*'/'PASSWORD': '$DB_PASS'/" /opt/netbox/netbox/netbox/configuration.py
sed -i -e 's/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = ["*"]/' \
-e "s|SECRET_KEY = ''|SECRET_KEY = '${ESCAPED_SECRET_KEY}'|" \
-e "/DATABASES = {/,/}/s/'USER': '[^']*'/'USER': '$PG_DB_USER'/" \
-e "/DATABASES = {/,/}/s/'PASSWORD': '[^']*'/'PASSWORD': '$PG_DB_PASS'/" /opt/netbox/netbox/netbox/configuration.py
$STD /opt/netbox/upgrade.sh
ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
@@ -86,10 +69,8 @@ mv /opt/netbox/contrib/gunicorn.py /opt/netbox/gunicorn.py
mv /opt/netbox/contrib/*.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable -q --now netbox netbox-rq
rm "/opt/v${RELEASE}.zip"
echo "${RELEASE}" >/opt/"${APPLICATION}"_version.txt
echo -e "Netbox Secret: \e[32m$SECRET_KEY\e[0m" >>~/netbox.creds
msg_ok "Installed NetBox"
msg_ok "Configured NetBox"
msg_info "Setting up Django Admin"
DJANGO_USER=Admin

View File

@@ -47,6 +47,8 @@ cd /opt/pangolin
EOF
chmod +x /usr/local/bin/pangctl ./dist/cli.mjs
cp server/db/names.json ./dist/names.json
cp server/db/ios_models.json ./dist/ios_models.json
cp server/db/mac_models.json ./dist/mac_models.json
mkdir -p /var/config
cat <<EOF >/opt/pangolin/config/config.yml

View File

@@ -17,27 +17,22 @@ update_os
msg_info "Installing Dependencies"
$STD apt install -y \
build-essential \
libpq-dev
libpq-dev \
libffi-dev
msg_ok "Installed Dependencies"
msg_info "Setting up Python3"
$STD apt install -y \
python3-dev \
python3-setuptools \
python3-wheel \
python3-pip
msg_ok "Setup Python3"
fetch_and_deploy_gh_release "spoolman" "Donkie/Spoolman" "prebuild" "latest" "/opt/spoolman" "spoolman.zip"
PYTHON_VERSION="3.14" setup_uv
msg_info "Setting up Spoolman"
cd /opt/spoolman
$STD pip3 install --upgrade --ignore-installed -r requirements.txt
$STD uv sync --locked --no-install-project
$STD uv sync --locked
cp .env.example .env
msg_ok "Setup Spoolman"
msg_info "Creating Service"
cat <<'EOF' >/etc/systemd/system/spoolman.service
cat <<EOF >/etc/systemd/system/spoolman.service
[Unit]
Description=Spoolman
After=network.target
@@ -46,7 +41,7 @@ After=network.target
Type=simple
WorkingDirectory=/opt/spoolman
EnvironmentFile=/opt/spoolman/.env
ExecStart=uvicorn spoolman.main:app --host "${SPOOLMAN_HOST}" --port "${SPOOLMAN_PORT}"
ExecStart=/usr/bin/bash /opt/spoolman/scripts/start.sh
Restart=always
User=root

View File

@@ -25,9 +25,10 @@ cd /opt/Tautulli
TAUTULLI_VERSION=$(get_latest_github_release "Tautulli/Tautulli" "false")
echo "${TAUTULLI_VERSION}" >/opt/Tautulli/version.txt
echo "master" >/opt/Tautulli/branch.txt
uv venv -q
uv pip install -q -r requirements.txt
uv pip install -q pyopenssl
$STD uv venv
$STD source /opt/Tautulli/.venv/bin/activate
$STD uv pip install -r requirements.txt
$STD uv pip install pyopenssl
msg_ok "Installed Tautulli"
msg_info "Creating Service"

View File

@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y redis-server
msg_ok "Installed Dependencies"
NODE_VERSION="22" setup_nodejs
NODE_VERSION="24" setup_nodejs
PG_VERSION="18" setup_postgresql
msg_info "Installing pnpm"

View File

@@ -36,14 +36,16 @@
#
# - Maps numeric exit codes to human-readable error descriptions
# - Supports:
# * Generic/Shell errors (1, 2, 126, 127, 128, 130, 137, 139, 143)
# * Package manager errors (APT, DPKG: 100, 101, 255)
# * Node.js/npm errors (243-249, 254)
# * Python/pip/uv errors (210-212)
# * PostgreSQL errors (231-234)
# * MySQL/MariaDB errors (241-244)
# * MongoDB errors (251-254)
# * Generic/Shell errors (1, 2, 124, 126-130, 134, 137, 139, 141, 143)
# * curl/wget errors (6, 7, 22, 28, 35)
# * Package manager errors (APT, DPKG: 100-102, 255)
# * Systemd/Service errors (150-154)
# * Python/pip/uv errors (160-162)
# * PostgreSQL errors (170-173)
# * MySQL/MariaDB errors (180-183)
# * MongoDB errors (190-193)
# * Proxmox custom codes (200-231)
# * Node.js/npm errors (243, 245-249)
# - Returns description string for given exit code
# - Shared function with error_handler.func for consistency
# ------------------------------------------------------------------------------
@@ -53,73 +55,98 @@ explain_exit_code() {
# --- Generic / Shell ---
1) echo "General error / Operation not permitted" ;;
2) echo "Misuse of shell builtins (e.g. syntax error)" ;;
# --- curl / wget errors (commonly seen in downloads) ---
6) echo "curl: DNS resolution failed (could not resolve host)" ;;
7) echo "curl: Failed to connect (network unreachable / host down)" ;;
22) echo "curl: HTTP error returned (404, 429, 500+)" ;;
28) echo "curl: Operation timeout (network slow or server not responding)" ;;
35) echo "curl: SSL/TLS handshake failed (certificate error)" ;;
# --- Package manager / APT / DPKG ---
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
102) echo "APT: Lock held by another process (dpkg/apt still running)" ;;
# --- Common shell/system errors ---
124) echo "Command timed out (timeout command)" ;;
126) echo "Command invoked cannot execute (permission problem?)" ;;
127) echo "Command not found" ;;
128) echo "Invalid argument to exit" ;;
130) echo "Terminated by Ctrl+C (SIGINT)" ;;
134) echo "Process aborted (SIGABRT - possibly Node.js heap overflow)" ;;
137) echo "Killed (SIGKILL / Out of memory?)" ;;
139) echo "Segmentation fault (core dumped)" ;;
141) echo "Broken pipe (SIGPIPE - output closed prematurely)" ;;
143) echo "Terminated (SIGTERM)" ;;
# --- Package manager / APT / DPKG ---
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
255) echo "DPKG: Fatal internal error" ;;
# --- Systemd / Service errors (150-154) ---
150) echo "Systemd: Service failed to start" ;;
151) echo "Systemd: Service unit not found" ;;
152) echo "Permission denied (EACCES)" ;;
153) echo "Build/compile failed (make/gcc/cmake)" ;;
154) echo "Node.js: Native addon build failed (node-gyp)" ;;
# --- Node.js / npm / pnpm / yarn ---
# --- Python / pip / uv (160-162) ---
160) echo "Python: Virtualenv / uv environment missing or broken" ;;
161) echo "Python: Dependency resolution failed" ;;
162) echo "Python: Installation aborted (permissions or EXTERNALLY-MANAGED)" ;;
# --- PostgreSQL (170-173) ---
170) echo "PostgreSQL: Connection failed (server not running / wrong socket)" ;;
171) echo "PostgreSQL: Authentication failed (bad user/password)" ;;
172) echo "PostgreSQL: Database does not exist" ;;
173) echo "PostgreSQL: Fatal error in query / syntax" ;;
# --- MySQL / MariaDB (180-183) ---
180) echo "MySQL/MariaDB: Connection failed (server not running / wrong socket)" ;;
181) echo "MySQL/MariaDB: Authentication failed (bad user/password)" ;;
182) echo "MySQL/MariaDB: Database does not exist" ;;
183) echo "MySQL/MariaDB: Fatal error in query / syntax" ;;
# --- MongoDB (190-193) ---
190) echo "MongoDB: Connection failed (server not running)" ;;
191) echo "MongoDB: Authentication failed (bad user/password)" ;;
192) echo "MongoDB: Database not found" ;;
193) echo "MongoDB: Fatal query error" ;;
# --- Proxmox Custom Codes (200-231) ---
200) echo "Proxmox: Failed to create lock file" ;;
203) echo "Proxmox: Missing CTID variable" ;;
204) echo "Proxmox: Missing PCT_OSTYPE variable" ;;
205) echo "Proxmox: Invalid CTID (<100)" ;;
206) echo "Proxmox: CTID already in use" ;;
207) echo "Proxmox: Password contains unescaped special characters" ;;
208) echo "Proxmox: Invalid configuration (DNS/MAC/Network format)" ;;
209) echo "Proxmox: Container creation failed" ;;
210) echo "Proxmox: Cluster not quorate" ;;
211) echo "Proxmox: Timeout waiting for template lock" ;;
212) echo "Proxmox: Storage type 'iscsidirect' does not support containers (VMs only)" ;;
213) echo "Proxmox: Storage type does not support 'rootdir' content" ;;
214) echo "Proxmox: Not enough storage space" ;;
215) echo "Proxmox: Container created but not listed (ghost state)" ;;
216) echo "Proxmox: RootFS entry missing in config" ;;
217) echo "Proxmox: Storage not accessible" ;;
218) echo "Proxmox: Template file corrupted or incomplete" ;;
219) echo "Proxmox: CephFS does not support containers - use RBD" ;;
220) echo "Proxmox: Unable to resolve template path" ;;
221) echo "Proxmox: Template file not readable" ;;
222) echo "Proxmox: Template download failed" ;;
223) echo "Proxmox: Template not available after download" ;;
224) echo "Proxmox: PBS storage is for backups only" ;;
225) echo "Proxmox: No template available for OS/Version" ;;
231) echo "Proxmox: LXC stack upgrade failed" ;;
# --- Node.js / npm / pnpm / yarn (243-249) ---
243) echo "Node.js: Out of memory (JavaScript heap out of memory)" ;;
245) echo "Node.js: Invalid command-line option" ;;
246) echo "Node.js: Internal JavaScript Parse Error" ;;
247) echo "Node.js: Fatal internal error" ;;
248) echo "Node.js: Invalid C++ addon / N-API failure" ;;
249) echo "Node.js: Inspector error" ;;
254) echo "npm/pnpm/yarn: Unknown fatal error" ;;
249) echo "npm/pnpm/yarn: Unknown fatal error" ;;
# --- Python / pip / uv ---
210) echo "Python: Virtualenv / uv environment missing or broken" ;;
211) echo "Python: Dependency resolution failed" ;;
212) echo "Python: Installation aborted (permissions or EXTERNALLY-MANAGED)" ;;
# --- PostgreSQL ---
231) echo "PostgreSQL: Connection failed (server not running / wrong socket)" ;;
232) echo "PostgreSQL: Authentication failed (bad user/password)" ;;
233) echo "PostgreSQL: Database does not exist" ;;
234) echo "PostgreSQL: Fatal error in query / syntax" ;;
# --- MySQL / MariaDB ---
241) echo "MySQL/MariaDB: Connection failed (server not running / wrong socket)" ;;
242) echo "MySQL/MariaDB: Authentication failed (bad user/password)" ;;
243) echo "MySQL/MariaDB: Database does not exist" ;;
244) echo "MySQL/MariaDB: Fatal error in query / syntax" ;;
# --- MongoDB ---
251) echo "MongoDB: Connection failed (server not running)" ;;
252) echo "MongoDB: Authentication failed (bad user/password)" ;;
253) echo "MongoDB: Database not found" ;;
254) echo "MongoDB: Fatal query error" ;;
# --- Proxmox Custom Codes ---
200) echo "Custom: Failed to create lock file" ;;
203) echo "Custom: Missing CTID variable" ;;
204) echo "Custom: Missing PCT_OSTYPE variable" ;;
205) echo "Custom: Invalid CTID (<100)" ;;
206) echo "Custom: CTID already in use (check 'pct list' and /etc/pve/lxc/)" ;;
207) echo "Custom: Password contains unescaped special characters (-, /, \\, *, etc.)" ;;
208) echo "Custom: Invalid configuration (DNS/MAC/Network format error)" ;;
209) echo "Custom: Container creation failed (check logs for pct create output)" ;;
210) echo "Custom: Cluster not quorate" ;;
211) echo "Custom: Timeout waiting for template lock (concurrent download in progress)" ;;
214) echo "Custom: Not enough storage space" ;;
215) echo "Custom: Container created but not listed (ghost state - check /etc/pve/lxc/)" ;;
216) echo "Custom: RootFS entry missing in config (incomplete creation)" ;;
217) echo "Custom: Storage does not support rootdir (check storage capabilities)" ;;
218) echo "Custom: Template file corrupted or incomplete download (size <1MB or invalid archive)" ;;
220) echo "Custom: Unable to resolve template path" ;;
221) echo "Custom: Template file exists but not readable (check file permissions)" ;;
222) echo "Custom: Template download failed after 3 attempts (network/storage issue)" ;;
223) echo "Custom: Template not available after download (storage sync issue)" ;;
225) echo "Custom: No template available for OS/Version (check 'pveam available')" ;;
231) echo "Custom: LXC stack upgrade/retry failed (outdated pve-container - check https://github.com/community-scripts/ProxmoxVE/discussions/8126)" ;;
# --- DPKG ---
255) echo "DPKG: Fatal internal error" ;;
# --- Default ---
*) echo "Unknown error" ;;

View File

@@ -3970,30 +3970,127 @@ EOF'
# Prompt user for cleanup with 60s timeout (plain echo - no msg_info to avoid spinner)
echo ""
echo -en "${YW}Remove broken container ${CTID}? (Y/n) [auto-remove in 60s]: ${CL}"
# Detect error type for smart recovery options
local is_oom=false
local error_explanation=""
if declare -f explain_exit_code >/dev/null 2>&1; then
error_explanation="$(explain_exit_code "$install_exit_code")"
fi
# OOM detection: exit codes 134 (SIGABRT/heap), 137 (SIGKILL/OOM), 243 (Node.js heap)
if [[ $install_exit_code -eq 134 || $install_exit_code -eq 137 || $install_exit_code -eq 243 ]]; then
is_oom=true
fi
# Show error explanation if available
if [[ -n "$error_explanation" ]]; then
echo -e "${TAB}${RD}Error: ${error_explanation}${CL}"
echo ""
fi
# Build recovery menu based on error type
echo -e "${YW}What would you like to do?${CL}"
echo ""
echo -e " ${GN}1)${CL} Remove container and exit"
echo -e " ${GN}2)${CL} Keep container for debugging"
echo -e " ${GN}3)${CL} Retry with verbose mode"
if [[ "$is_oom" == true ]]; then
local new_ram=$((RAM_SIZE * 3 / 2))
local new_cpu=$((CORE_COUNT + 1))
echo -e " ${GN}4)${CL} Retry with more resources (RAM: ${RAM_SIZE}${new_ram} MiB, CPU: ${CORE_COUNT}${new_cpu} cores)"
fi
echo ""
echo -en "${YW}Select option [1-$([[ "$is_oom" == true ]] && echo "4" || echo "3")] (default: 1, auto-remove in 60s): ${CL}"
if read -t 60 -r response; then
if [[ -z "$response" || "$response" =~ ^[Yy]$ ]]; then
# Remove container
echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID}${CL}"
pct stop "$CTID" &>/dev/null || true
pct destroy "$CTID" &>/dev/null || true
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
elif [[ "$response" =~ ^[Nn]$ ]]; then
echo -e "\n${TAB}${YW}Container ${CTID} kept for debugging${CL}"
# Dev mode: Setup MOTD/SSH for debugging access to broken container
if [[ "${DEV_MODE_MOTD:-false}" == "true" ]]; then
echo -e "${TAB}${HOLD}${DGN}Setting up MOTD and SSH for debugging...${CL}"
if pct exec "$CTID" -- bash -c "
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/install.func)
declare -f motd_ssh >/dev/null 2>&1 && motd_ssh || true
" >/dev/null 2>&1; then
local ct_ip=$(pct exec "$CTID" ip a s dev eth0 2>/dev/null | awk '/inet / {print $2}' | cut -d/ -f1)
echo -e "${BFR}${CM}${GN}MOTD/SSH ready - SSH into container: ssh root@${ct_ip}${CL}"
case "${response:-1}" in
1)
# Remove container
echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID}${CL}"
pct stop "$CTID" &>/dev/null || true
pct destroy "$CTID" &>/dev/null || true
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
;;
2)
echo -e "\n${TAB}${YW}Container ${CTID} kept for debugging${CL}"
# Dev mode: Setup MOTD/SSH for debugging access to broken container
if [[ "${DEV_MODE_MOTD:-false}" == "true" ]]; then
echo -e "${TAB}${HOLD}${DGN}Setting up MOTD and SSH for debugging...${CL}"
if pct exec "$CTID" -- bash -c "
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/install.func)
declare -f motd_ssh >/dev/null 2>&1 && motd_ssh || true
" >/dev/null 2>&1; then
local ct_ip=$(pct exec "$CTID" ip a s dev eth0 2>/dev/null | awk '/inet / {print $2}' | cut -d/ -f1)
echo -e "${BFR}${CM}${GN}MOTD/SSH ready - SSH into container: ssh root@${ct_ip}${CL}"
fi
fi
fi
fi
exit $install_exit_code
;;
3)
# Retry with verbose mode
echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID} for rebuild...${CL}"
pct stop "$CTID" &>/dev/null || true
pct destroy "$CTID" &>/dev/null || true
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
echo ""
# Get new container ID
local old_ctid="$CTID"
export CTID=$(get_valid_container_id "$CTID")
export VERBOSE="yes"
export var_verbose="yes"
# Show rebuild summary
echo -e "${YW}Rebuilding with preserved settings:${CL}"
echo -e " Container ID: ${old_ctid}${CTID}"
echo -e " RAM: ${RAM_SIZE} MiB | CPU: ${CORE_COUNT} cores | Disk: ${DISK_SIZE} GB"
echo -e " Network: ${NET:-dhcp} | Bridge: ${BRG:-vmbr0}"
echo -e " Verbose: ${GN}enabled${CL}"
echo ""
msg_info "Restarting installation..."
# Re-run build_container
build_container
return $?
;;
4)
if [[ "$is_oom" == true ]]; then
# Retry with more resources
echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID} for rebuild with more resources...${CL}"
pct stop "$CTID" &>/dev/null || true
pct destroy "$CTID" &>/dev/null || true
echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}"
echo ""
# Get new container ID and increase resources
local old_ctid="$CTID"
local old_ram="$RAM_SIZE"
local old_cpu="$CORE_COUNT"
export CTID=$(get_valid_container_id "$CTID")
export RAM_SIZE=$((RAM_SIZE * 3 / 2))
export CORE_COUNT=$((CORE_COUNT + 1))
export var_ram="$RAM_SIZE"
export var_cpu="$CORE_COUNT"
# Show rebuild summary
echo -e "${YW}Rebuilding with increased resources:${CL}"
echo -e " Container ID: ${old_ctid}${CTID}"
echo -e " RAM: ${old_ram}${GN}${RAM_SIZE}${CL} MiB (+50%)"
echo -e " CPU: ${old_cpu}${GN}${CORE_COUNT}${CL} cores (+1)"
echo -e " Disk: ${DISK_SIZE} GB | Network: ${NET:-dhcp} | Bridge: ${BRG:-vmbr0}"
echo ""
msg_info "Restarting installation..."
# Re-run build_container
build_container
return $?
else
echo -e "\n${TAB}${YW}Invalid option. Container ${CTID} kept.${CL}"
exit $install_exit_code
fi
;;
*)
echo -e "\n${TAB}${YW}Invalid option. Container ${CTID} kept.${CL}"
exit $install_exit_code
;;
esac
else
# Timeout - auto-remove
echo -e "\n${YW}No response - auto-removing container${CL}"

View File

@@ -815,11 +815,9 @@ is_verbose_mode() {
# ------------------------------------------------------------------------------
# cleanup_lxc()
#
# - Comprehensive cleanup of package managers, caches, and logs
# - Supports Alpine (apk), Debian/Ubuntu (apt), and language package managers
# - Cleans: Python (pip/uv), Node.js (npm/yarn/pnpm), Go, Rust, Ruby, PHP
# - Truncates log files and vacuums systemd journal
# - Run at end of container creation to minimize disk usage
# - Cleans package manager and language caches (safe for installs AND updates)
# - Supports Alpine (apk), Debian/Ubuntu (apt), Python, Node.js, Go, Rust, Ruby, PHP
# - Uses fallback error handling to prevent cleanup failures from breaking installs
# ------------------------------------------------------------------------------
cleanup_lxc() {
msg_info "Cleaning up"
@@ -828,32 +826,52 @@ cleanup_lxc() {
$STD apk cache clean || true
rm -rf /var/cache/apk/*
else
$STD apt -y autoremove || true
$STD apt -y autoclean || true
$STD apt -y clean || true
$STD apt -y autoremove 2>/dev/null || msg_warn "apt autoremove failed (non-critical)"
$STD apt -y autoclean 2>/dev/null || msg_warn "apt autoclean failed (non-critical)"
$STD apt -y clean 2>/dev/null || msg_warn "apt clean failed (non-critical)"
fi
# Clear temp artifacts (keep sockets/FIFOs; ignore errors)
find /tmp /var/tmp -type f -name 'tmp*' -delete 2>/dev/null || true
find /tmp /var/tmp -type f -name 'tempfile*' -delete 2>/dev/null || true
# Node.js npm - directly remove cache directory
# npm cache clean/verify can fail with ENOTEMPTY errors, so we skip them
# Python
if command -v pip &>/dev/null; then
rm -rf /root/.cache/pip 2>/dev/null || true
fi
if command -v uv &>/dev/null; then
rm -rf /root/.cache/uv 2>/dev/null || true
fi
# Node.js
if command -v npm &>/dev/null; then
rm -rf /root/.npm/_cacache /root/.npm/_logs 2>/dev/null || true
fi
# Node.js yarn
if command -v yarn &>/dev/null; then yarn cache clean &>/dev/null || true; fi
# Node.js pnpm
if command -v pnpm &>/dev/null; then pnpm store prune &>/dev/null || true; fi
# Go
if command -v go &>/dev/null; then $STD go clean -cache -modcache || true; fi
# Rust cargo
if command -v cargo &>/dev/null; then $STD cargo clean || true; fi
# Ruby gem
if command -v gem &>/dev/null; then $STD gem cleanup || true; fi
# Composer (PHP)
if command -v composer &>/dev/null; then COMPOSER_ALLOW_SUPERUSER=1 $STD composer clear-cache || true; fi
if command -v yarn &>/dev/null; then
rm -rf /root/.cache/yarn /root/.yarn/cache 2>/dev/null || true
fi
if command -v pnpm &>/dev/null; then
pnpm store prune &>/dev/null || true
fi
# Go (only build cache, not modules)
if command -v go &>/dev/null; then
$STD go clean -cache 2>/dev/null || true
fi
# Rust (only registry cache, not build artifacts)
if command -v cargo &>/dev/null; then
rm -rf /root/.cargo/registry/cache /root/.cargo/.package-cache 2>/dev/null || true
fi
# Ruby
if command -v gem &>/dev/null; then
rm -rf /root/.gem/cache 2>/dev/null || true
fi
# PHP
if command -v composer &>/dev/null; then
rm -rf /root/.composer/cache 2>/dev/null || true
fi
msg_ok "Cleaned"
}

View File

@@ -29,15 +29,18 @@
#
# - Maps numeric exit codes to human-readable error descriptions
# - Supports:
# * Generic/Shell errors (1, 2, 126, 127, 128, 130, 137, 139, 143)
# * Package manager errors (APT, DPKG: 100, 101, 255)
# * Node.js/npm errors (243-249, 254)
# * Python/pip/uv errors (210-212)
# * PostgreSQL errors (231-234)
# * MySQL/MariaDB errors (241-244)
# * MongoDB errors (251-254)
# * Generic/Shell errors (1, 2, 124, 126-130, 134, 137, 139, 141, 143)
# * curl/wget errors (6, 7, 22, 28, 35)
# * Package manager errors (APT, DPKG: 100-102, 255)
# * Systemd/Service errors (150-154)
# * Python/pip/uv errors (160-162)
# * PostgreSQL errors (170-173)
# * MySQL/MariaDB errors (180-183)
# * MongoDB errors (190-193)
# * Proxmox custom codes (200-231)
# * Node.js/npm errors (243-249)
# - Returns description string for given exit code
# - Shared function with api.func for consistency
# ------------------------------------------------------------------------------
explain_exit_code() {
local code="$1"
@@ -45,52 +48,64 @@ explain_exit_code() {
# --- Generic / Shell ---
1) echo "General error / Operation not permitted" ;;
2) echo "Misuse of shell builtins (e.g. syntax error)" ;;
6) echo "curl: DNS resolution failed (could not resolve host)" ;;
7) echo "curl: Failed to connect (network unreachable / host down)" ;;
22) echo "curl: HTTP error returned (404, 429, 500+)" ;;
28) echo "curl: Operation timeout (network slow or server not responding)" ;;
35) echo "curl: SSL/TLS handshake failed (certificate error)" ;;
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
102) echo "APT: Lock held by another process (dpkg/apt still running)" ;;
124) echo "Command timed out (timeout command)" ;;
126) echo "Command invoked cannot execute (permission problem?)" ;;
127) echo "Command not found" ;;
128) echo "Invalid argument to exit" ;;
130) echo "Terminated by Ctrl+C (SIGINT)" ;;
134) echo "Process aborted (SIGABRT - possibly Node.js heap overflow)" ;;
137) echo "Killed (SIGKILL / Out of memory?)" ;;
139) echo "Segmentation fault (core dumped)" ;;
141) echo "Broken pipe (SIGPIPE - output closed prematurely)" ;;
143) echo "Terminated (SIGTERM)" ;;
# --- Package manager / APT / DPKG ---
100) echo "APT: Package manager error (broken packages / dependency problems)" ;;
101) echo "APT: Configuration error (bad sources.list, malformed config)" ;;
255) echo "DPKG: Fatal internal error" ;;
# --- Systemd / Service errors (150-154) ---
150) echo "Systemd: Service failed to start" ;;
151) echo "Systemd: Service unit not found" ;;
152) echo "Permission denied (EACCES)" ;;
153) echo "Build/compile failed (make/gcc/cmake)" ;;
154) echo "Node.js: Native addon build failed (node-gyp)" ;;
# --- Node.js / npm / pnpm / yarn ---
# --- Node.js / npm / pnpm / yarn (243-249) ---
243) echo "Node.js: Out of memory (JavaScript heap out of memory)" ;;
245) echo "Node.js: Invalid command-line option" ;;
246) echo "Node.js: Internal JavaScript Parse Error" ;;
247) echo "Node.js: Fatal internal error" ;;
248) echo "Node.js: Invalid C++ addon / N-API failure" ;;
249) echo "Node.js: Inspector error" ;;
254) echo "npm/pnpm/yarn: Unknown fatal error" ;;
249) echo "npm/pnpm/yarn: Unknown fatal error" ;;
# --- Python / pip / uv ---
210) echo "Python: Virtualenv / uv environment missing or broken" ;;
211) echo "Python: Dependency resolution failed" ;;
212) echo "Python: Installation aborted (permissions or EXTERNALLY-MANAGED)" ;;
# --- Python / pip / uv (160-162) ---
160) echo "Python: Virtualenv / uv environment missing or broken" ;;
161) echo "Python: Dependency resolution failed" ;;
162) echo "Python: Installation aborted (permissions or EXTERNALLY-MANAGED)" ;;
# --- PostgreSQL ---
231) echo "PostgreSQL: Connection failed (server not running / wrong socket)" ;;
232) echo "PostgreSQL: Authentication failed (bad user/password)" ;;
233) echo "PostgreSQL: Database does not exist" ;;
234) echo "PostgreSQL: Fatal error in query / syntax" ;;
# --- PostgreSQL (170-174) ---
170) echo "PostgreSQL: Connection failed (server not running / wrong socket)" ;;
171) echo "PostgreSQL: Authentication failed (bad user/password)" ;;
172) echo "PostgreSQL: Database does not exist" ;;
173) echo "PostgreSQL: Fatal error in query / syntax" ;;
# --- MySQL / MariaDB ---
241) echo "MySQL/MariaDB: Connection failed (server not running / wrong socket)" ;;
242) echo "MySQL/MariaDB: Authentication failed (bad user/password)" ;;
243) echo "MySQL/MariaDB: Database does not exist" ;;
244) echo "MySQL/MariaDB: Fatal error in query / syntax" ;;
# --- MySQL / MariaDB (180-183) ---
180) echo "MySQL/MariaDB: Connection failed (server not running / wrong socket)" ;;
181) echo "MySQL/MariaDB: Authentication failed (bad user/password)" ;;
182) echo "MySQL/MariaDB: Database does not exist" ;;
183) echo "MySQL/MariaDB: Fatal error in query / syntax" ;;
# --- MongoDB ---
251) echo "MongoDB: Connection failed (server not running)" ;;
252) echo "MongoDB: Authentication failed (bad user/password)" ;;
253) echo "MongoDB: Database not found" ;;
254) echo "MongoDB: Fatal query error" ;;
# --- MongoDB (190-193) ---
190) echo "MongoDB: Connection failed (server not running)" ;;
191) echo "MongoDB: Authentication failed (bad user/password)" ;;
192) echo "MongoDB: Database not found" ;;
193) echo "MongoDB: Fatal query error" ;;
# --- Proxmox Custom Codes ---
# --- Proxmox Custom Codes (200-231) ---
200) echo "Proxmox: Failed to create lock file" ;;
203) echo "Proxmox: Missing CTID variable" ;;
204) echo "Proxmox: Missing PCT_OSTYPE variable" ;;
@@ -107,16 +122,19 @@ explain_exit_code() {
215) echo "Proxmox: Container created but not listed (ghost state)" ;;
216) echo "Proxmox: RootFS entry missing in config" ;;
217) echo "Proxmox: Storage not accessible" ;;
219) echo "Proxmox: CephFS does not support containers - use RBD" ;;
224) echo "Proxmox: PBS storage is for backups only" ;;
218) echo "Proxmox: Template file corrupted or incomplete" ;;
219) echo "Proxmox: CephFS does not support containers - use RBD" ;;
220) echo "Proxmox: Unable to resolve template path" ;;
221) echo "Proxmox: Template file not readable" ;;
222) echo "Proxmox: Template download failed" ;;
223) echo "Proxmox: Template not available after download" ;;
224) echo "Proxmox: PBS storage is for backups only" ;;
225) echo "Proxmox: No template available for OS/Version" ;;
231) echo "Proxmox: LXC stack upgrade failed" ;;
# --- DPKG ---
255) echo "DPKG: Fatal internal error" ;;
# --- Default ---
*) echo "Unknown error" ;;
esac

View File

@@ -3135,13 +3135,25 @@ NVIDIA_PIN
if $STD apt-get -y -o Dpkg::Options::="--force-confold" install --no-install-recommends $nvidia_pkgs 2>/dev/null; then
msg_ok "Installed version-matched NVIDIA libraries"
else
# Fallback to Ubuntu repo packages
$STD apt-get -y -o Dpkg::Options::="--force-confold" install --no-install-recommends libnvidia-decode libnvidia-encode nvidia-utils 2>/dev/null || msg_warn "NVIDIA installation failed"
# Fallback to Ubuntu repo packages with versioned nvidia-utils
msg_warn "CUDA repo install failed - trying Ubuntu native packages (nvidia-utils-${nvidia_major_version})"
if $STD apt-get -y -o Dpkg::Options::="--force-confold" install --no-install-recommends \
libnvidia-decode-${nvidia_major_version} libnvidia-encode-${nvidia_major_version} nvidia-utils-${nvidia_major_version} 2>/dev/null; then
msg_ok "Installed Ubuntu NVIDIA packages (${nvidia_major_version})"
else
msg_warn "NVIDIA driver installation failed - please install manually: apt install nvidia-utils-${nvidia_major_version}"
fi
fi
else
msg_warn "No NVIDIA packages for version ${nvidia_major_version}.x in CUDA repo"
# Fallback to Ubuntu repo packages
$STD apt-get -y -o Dpkg::Options::="--force-confold" install --no-install-recommends libnvidia-decode libnvidia-encode nvidia-utils 2>/dev/null || msg_warn "NVIDIA installation failed"
# Fallback to Ubuntu repo packages with versioned nvidia-utils
msg_info "Trying Ubuntu native packages (nvidia-utils-${nvidia_major_version})"
if $STD apt-get -y -o Dpkg::Options::="--force-confold" install --no-install-recommends \
libnvidia-decode-${nvidia_major_version} libnvidia-encode-${nvidia_major_version} nvidia-utils-${nvidia_major_version} 2>/dev/null; then
msg_ok "Installed Ubuntu NVIDIA packages (${nvidia_major_version})"
else
msg_warn "NVIDIA driver installation failed - please install manually: apt install nvidia-utils-${nvidia_major_version}"
fi
fi
fi

View File

@@ -265,7 +265,7 @@ After=network.target postgresql.service
[Service]
Type=simple
User=root
WorkingDirectory=${INSTALL_PATH}
WorkingDirectory=${INSTALL_PATH}/backend
EnvironmentFile=${CONFIG_PATH}
ExecStart=/usr/bin/node ${INSTALL_PATH}/backend/server.js
Restart=always