Compare commits

..

74 Commits

Author SHA1 Message Date
Tobias
2ebbce6443 Revise copyright and license details in dockhand.sh 2026-09-11 10:02:46 +02:00
push-app-to-main[bot]
1b134adf73 Add dockhand (addon) 2026-09-11 06:45:05 +00:00
MickLesk
10ab064f26 formatting fix issue report 2026-09-11 08:37:28 +02:00
community-scripts-pr-app[bot]
db418a7a3b Update CHANGELOG.md (#17185)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:44:06 +00:00
community-scripts-pr-app[bot]
f17a8df641 Update CHANGELOG.md (#17184)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:43:55 +00:00
community-scripts-pr-app[bot]
0fa0a912ac Update CHANGELOG.md (#17183)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:43:37 +00:00
push-app-to-main[bot]
b9f7751590 OneTimeSecret (#17097) 2026-09-11 07:43:35 +02:00
community-scripts-pr-app[bot]
7c0283c73f Update CHANGELOG.md (#17182)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:43:29 +00:00
community-scripts-pr-app[bot]
5774100f05 Update CHANGELOG.md (#17181)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:43:11 +00:00
CanbiZ (MickLesk)
73a8c55c9d passwordpusher: restore data before running migrations (#17141) 2026-09-11 07:43:04 +02:00
community-scripts-pr-app[bot]
06115ca811 Update CHANGELOG.md (#17180)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:43:00 +00:00
community-scripts-pr-app[bot]
e00429ea7e Update CHANGELOG.md (#17179)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:42:44 +00:00
CanbiZ (MickLesk)
de9b2f7ff3 paperclip: install the rust toolchain needed by the runner build (#17142) 2026-09-11 07:42:37 +02:00
community-scripts-pr-app[bot]
2b541531f7 Update CHANGELOG.md (#17178)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:42:32 +00:00
CanbiZ (MickLesk)
c001360b2d Rename lxc-delete.sh to guest-delete.sh (#17152) 2026-09-11 07:42:12 +02:00
community-scripts-pr-app[bot]
b2f8add60f Update CHANGELOG.md (#17177)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:42:10 +00:00
community-scripts-pr-app[bot]
fe26465c2c Update CHANGELOG.md (#17176)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:41:48 +00:00
CanbiZ (MickLesk)
785d33be40 core.func: fall back to a usable HOME when the shell has none (#17154) 2026-09-11 07:41:44 +02:00
community-scripts-pr-app[bot]
28b4ae0b07 Update CHANGELOG.md (#17175)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:41:29 +00:00
CanbiZ (MickLesk)
e253713148 homepage: run next directly instead of through pnpm (#17155) 2026-09-11 07:41:21 +02:00
community-scripts-pr-app[bot]
5748b577c4 Update CHANGELOG.md (#17174)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:41:02 +00:00
CanbiZ (MickLesk)
7304dec635 update-apps: rewrite the retired Gitea base in every container before updating it (#17156) 2026-09-11 07:40:57 +02:00
CanbiZ (MickLesk)
28c18b735b issue template: add PVE release, execution context and phase; refresh distro list (#17160) 2026-09-11 07:40:36 +02:00
community-scripts-pr-app[bot]
46a3f05bfb Update CHANGELOG.md (#17173)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-11 05:39:47 +00:00
Tobias
433064a93f changedetection: fix: pin browserless (#17163) 2026-09-11 07:39:20 +02:00
community-scripts-pr-app[bot]
a9bd59d320 Update CHANGELOG.md (#17168)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-10 20:23:32 +00:00
Chris
4dfb966412 Immich v3.2.0 (#17137)
- explicitly build Sharp during server build (upstream change)
2026-09-10 22:23:08 +02:00
community-scripts-pr-app[bot]
b25ae992e8 Update CHANGELOG.md (#17165)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-10 13:11:29 +00:00
push-app-to-main[bot]
6e109e77c7 Chevereto (#17131)
* Add chevereto (ct)

* Update var_arm64 default value and cleanup messages

Changed default value of var_arm64 to 'yes' and removed setup completion message.

* Remove ffmpeg installation and add setup_ffmpeg call

* chevereto: derive php-fpm from one version, use nginx_enable_site

* chevereto: drop php modules already covered by setup_php

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
2026-09-10 15:10:59 +02:00
community-scripts-pr-app[bot]
2cdca2ca01 Update CHANGELOG.md (#17164)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-10 13:02:45 +00:00
push-app-to-main[bot]
b8eaf1e2a4 Portabase (#17111)
* Add portabase (ct)

* portabase: resolve tusd arch, use nginx and backup helpers, random admin password

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: MickLesk <47820557+MickLesk@users.noreply.github.com>
2026-09-10 15:02:18 +02:00
push-app-to-main[bot]
86270d407e Logseq (#17112)
* Add logseq (ct)

* logseq: provision corepack via setup_nodejs, use nginx helper, set up toolchains on update

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: MickLesk <47820557+MickLesk@users.noreply.github.com>
2026-09-10 15:02:09 +02:00
community-scripts-pr-app[bot]
bee1ccf720 Update CHANGELOG.md (#17162)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-10 12:46:55 +00:00
community-scripts-pr-app[bot]
a1be885aa0 Update CHANGELOG.md (#17159)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-10 12:29:42 +00:00
community-scripts-pr-app[bot]
192bcd3353 Update CHANGELOG.md (#17157)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-10 12:15:55 +00:00
community-scripts-pr-app[bot]
2802f0fc55 Update CHANGELOG.md (#17153)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-10 11:49:47 +00:00
push-app-to-main[bot]
7c822e1642 Safebucket (#17096)
* Add safebucket (ct)

* Update default var_arm64 value to 'yes'

Changed default value of var_arm64 to 'yes' in safebucket.sh.

* safebucket-install.sh aktualisieren

Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com>

* Refactor ARCH variable usage in safebucket.sh

* Refactor Safebucket installation script

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com>
2026-09-10 13:49:15 +02:00
MickLesk
902b341327 Merge branch 'main' of https://github.com/community-scripts/ProxmoxVE into feat/guest-delete-vms 2026-09-10 10:39:42 +02:00
MickLesk
cca5e8320a lxc-delete: also delete VMs, not just containers
One checklist now lists containers and VMs side by side, each tagged with its
type, with separate ALL CT / ALL VM entries. VMs stop via qm stop and are
removed with qm destroy --purge --destroy-unreferenced-disks.

Two fixes fall out of the rework: the destroy exit status is read from the
background job rather than from the spinner, so failures actually surface, and
a guest is only stopped once its deletion is confirmed.
2026-09-10 10:38:39 +02:00
community-scripts-pr-app[bot]
6109ccf128 Update CHANGELOG.md (#17151)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-10 08:33:51 +00:00
Andrew Jones
639eb8e839 fix(solidtime): prevent composer install from hanging on root prompt (#17146)
composer's root/superuser safety prompt blocks on stdin during update_script,
since the container's terminal isn't attached to answer it. Set
COMPOSER_ALLOW_SUPERUSER=1 to suppress the prompt, matching composer's
documented approach for running as root non-interactively.
2026-09-10 10:33:16 +02:00
community-scripts-pr-app[bot]
cb1090623d Update CHANGELOG.md (#17148)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-10 04:28:37 +00:00
Stephen Chin
9101f0c5f4 fix(hermesagent): wait for root gateway cleanup (#17147)
Co-authored-by: Stephen Chin <1290231+steveonjava@users.noreply.github.com>
2026-09-10 06:28:10 +02:00
community-scripts-pr-app[bot]
662d642a37 Update CHANGELOG.md (#17140)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-09 17:55:44 +00:00
Stephen Chin
3b53db7f14 fix(hermesagent): stop spurious root gateway after update (#17126) 2026-09-09 19:55:16 +02:00
community-scripts-pr-app[bot]
b9aa86c785 Update CHANGELOG.md (#17139)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-09 17:54:58 +00:00
CanbiZ (MickLesk)
810a6d2e82 vm: drop the discussions link from the summary (#17117) 2026-09-09 19:54:30 +02:00
community-scripts-pr-app[bot]
e4a455465d Update CHANGELOG.md (#17134)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-09 13:25:36 +00:00
push-app-to-main[bot]
05d4c186fb Lingarr (#17130)
* Add lingarr (ct)

* Update ct/lingarr.sh

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: Sam Heinz <sam@samheinz.com>
2026-09-09 15:25:01 +02:00
community-scripts-pr-app[bot]
1e03820eab Update CHANGELOG.md (#17125)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-08 21:46:42 +00:00
community-scripts-pr-app[bot]
62938627b2 Update CHANGELOG.md (#17119)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-08 15:46:51 +00:00
community-scripts-pr-app[bot]
11859e9e10 Update CHANGELOG.md (#17118)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-08 15:46:36 +00:00
MickLesk
afff8c91cd Omada: resolve libssl1.1 from the Debian pools instead of a pinned URL
bullseye left security.debian.org when its LTS ended, so the hardcoded
libssl1.1_1.1.1w-0+deb11u8 filename now 404s. Scan the security, the
security-archive and the archive pools and take the newest build on offer
for the host architecture.

Closes #17104
2026-09-08 16:44:04 +02:00
community-scripts-pr-app[bot]
5f37e3db9f Update CHANGELOG.md (#17115)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-08 09:20:59 +00:00
push-app-to-main[bot]
8bf8f8629b Decypharr (#17108)
* Add decypharr (ct)

* Change default var_arm64 value to 'yes'

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
2026-09-08 11:20:32 +02:00
community-scripts-pr-app[bot]
7175d81ddc Update CHANGELOG.md (#17114)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-08 09:18:48 +00:00
push-app-to-main[bot]
209e003c7f Stash (#17106)
* Add stash (ct)

* Change default value of var_arm64 to 'yes'

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
2026-09-08 11:18:20 +02:00
community-scripts-pr-app[bot]
751248222f Update CHANGELOG.md (#17113)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-08 08:29:08 +00:00
CanbiZ (MickLesk)
a3c029c341 Update Jellyfin FFmpeg dependency to version 8 (#17109) 2026-09-08 10:28:42 +02:00
community-scripts-pr-app[bot]
13dd4b9c30 Update CHANGELOG.md (#17110)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-08 06:35:57 +00:00
community-scripts-pr-app[bot]
89bf431a18 Update CHANGELOG.md (#17102)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-07 14:58:25 +00:00
community-scripts-pr-app[bot]
4a3ee0aced Update CHANGELOG.md (#17101)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-07 14:58:16 +00:00
push-app-to-main[bot]
20624f3a84 Chatwoot (#17095)
* Add chatwoot (ct)

* Update var_arm64 default value in chatwoot.sh

Uncomment var_arm64 variable and adjust its default value.

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
2026-09-07 16:57:57 +02:00
push-app-to-main[bot]
0b630fc246 Add whisparr-eros (ct) (#17094)
Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
2026-09-07 16:57:48 +02:00
community-scripts-pr-app[bot]
c8722c0828 Update CHANGELOG.md (#17100)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-07 14:53:40 +00:00
push-app-to-main[bot]
08dfb5aa90 Matter-Hub (#17093)
* Add matter-hub (ct)

* Enable ARM64 support by default in matter-hub.sh

* Remove Home Assistant setup instruction

Removed instruction to set Home Assistant URL and token.

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
2026-09-07 16:53:13 +02:00
community-scripts-pr-app[bot]
790b329777 Update CHANGELOG.md (#17099)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-07 14:52:32 +00:00
push-app-to-main[bot]
d458bf5aed Journiv (#17092)
* Add journiv (ct)

* Change default value of var_arm64 to 'yes'

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
2026-09-07 16:51:29 +02:00
community-scripts-pr-app[bot]
aa4dfbf1f3 Update CHANGELOG.md (#17098)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-07 14:37:36 +00:00
CanbiZ (MickLesk)
c039a297b3 flatnotes: follow upstream move to uv and Python 3.13 (#17090) 2026-09-07 16:37:07 +02:00
community-scripts-pr-app[bot]
8910825fd8 Update CHANGELOG.md (#17091)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-07 12:28:20 +00:00
MickLesk
b99dab130c node drift: label bump PRs so they reach the changelog 2026-09-07 14:25:44 +02:00
github-actions[bot]
169f57c2e0 iobroker: bump Node.js from 24 to 26 (#17085)
* iobroker: bump Node.js from 24 to 26

* iobroker: pin npm to 11, npm 12 dropped --unsafe-perm

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: MickLesk <47820557+MickLesk@users.noreply.github.com>
2026-09-07 14:11:03 +02:00
github-actions[bot]
633e9f6a03 kaneo: bump Node.js from 22 to 24 (#17086) 2026-09-07 14:04:26 +02:00
67 changed files with 2786 additions and 177 deletions

View File

@@ -5,15 +5,19 @@ body:
- type: markdown - type: markdown
attributes: attributes:
value: | value: |
## ⚠️ **IMPORTANT - READ FIRST** ## ⚠️ **IMPORTANT - READ FIRST**
- 🔍 **Search first:** Before submitting, check if the issue has already been reported or resolved in [closed issues](https://github.com/community-scripts/ProxmoxVE/issues?q=is%3Aissue+is%3Aclosed). If found, comment on that issue instead of creating a new one.
Alternatively, check the **[Discussions](https://github.com/community-scripts/ProxmoxVE/discussions)** under the *"Announcement"* or *"Guide"* categories for relevant information.
- 🔎 If you encounter `[ERROR] in line 23: exit code *: while executing command "$@" > /dev/null 2>&1`, rerun the script with verbose mode before submitting the issue.
- 📜 **Read the script:** Familiarize yourself with the script's content and its purpose. This will help you understand the issue better and provide more relevant information
Thank you for taking the time to report an issue! Please provide as much detail as possible to help us address the problem efficiently. **1. Reproduce the issue with verbose mode - this is mandatory.**
Set `var_verbose=yes` (or *Advanced Settings → Verbose Mode*) and run the script again.
Only a verbose log shows what actually failed - a bare `[ERROR] in line 23: exit code *` tells us nothing.
**Reports without a verbose log will most likely be closed.**
**2. Search before you post.**
Check the [closed issues](https://github.com/community-scripts/ProxmoxVE/issues?q=is%3Aissue+is%3Aclosed) and the [Discussions](https://github.com/community-scripts/ProxmoxVE/discussions) (*Announcement* / *Guide*). If it is already known, comment there instead of opening a new issue.
**3. Read the script.**
Knowing what it does makes it much easier to describe the problem - and often to solve it yourself.
- type: input - type: input
id: guidelines id: guidelines
attributes: attributes:
@@ -28,7 +32,6 @@ body:
label: 🔎 Did you run the script with verbose mode enabled? label: 🔎 Did you run the script with verbose mode enabled?
description: "Required for debugging any script issue. A verbose log is mandatory." description: "Required for debugging any script issue. A verbose log is mandatory."
options: options:
- ""
- "Yes, verbose mode was enabled and the output is included below" - "Yes, verbose mode was enabled and the output is included below"
- "No (this issue will likely be closed automatically)" - "No (this issue will likely be closed automatically)"
validations: validations:
@@ -50,6 +53,32 @@ body:
validations: validations:
required: true required: true
- type: dropdown
id: issue_phase
attributes:
label: 🕒 When does the issue occur?
options:
- "Initial creation / installation"
- "Update of an existing container"
- "While the application is running"
validations:
required: true
- type: dropdown
id: execution_context
attributes:
label: 🖱️ Where did you run the command?
description: "The shell matters — the Proxmox web console starts without some environment variables that a normal login shell sets."
options:
- "Proxmox web UI → node → Shell"
- "Proxmox web UI → LXC → Console"
- "SSH into the Proxmox host"
- "SSH into the container"
- "pct enter from the host"
- "Other / not listed"
validations:
required: true
- type: checkboxes - type: checkboxes
validations: validations:
required: true required: true
@@ -64,18 +93,31 @@ body:
value: "💡 **Tip:** If you are using Advanced Settings, please test with Default Settings before submitting an issue." value: "💡 **Tip:** If you are using Advanced Settings, please test with Default Settings before submitting an issue."
- type: dropdown - type: dropdown
id: linux_distribution id: os_distribution
attributes: attributes:
label: 🖥️ Which Linux distribution are you using? label: 🖥️ Which Linux distribution is the container running?
options: options:
- - Debian
- Ubuntu
- Alpine - Alpine
- Debian 11 - Devuan
- Debian 12 - AlmaLinux
- Debian 13 - Rocky Linux
- Ubuntu 22.04 - CentOS Stream
- Ubuntu 24.04 - Fedora
- Ubuntu 24.10 - openSUSE
- openEuler
- Gentoo
- Other / not listed
validations:
required: true
- type: input
id: os_version
attributes:
label: 🔢 Which version of that distribution?
description: "Run `cat /etc/os-release` inside the container if unsure."
placeholder: "e.g. 13 (Debian), 24.04 (Ubuntu), 3.22 (Alpine)"
validations: validations:
required: true required: true
@@ -85,16 +127,27 @@ body:
label: 🧱 Is this Proxmox host running arm64? label: 🧱 Is this Proxmox host running arm64?
description: "Run `dpkg --print-architecture` on your Proxmox host if unsure." description: "Run `dpkg --print-architecture` on your Proxmox host if unsure."
options: options:
- ""
- "No" - "No"
- "Yes" - "Yes"
validations: validations:
required: true required: true
- type: dropdown
id: pve_major
attributes:
label: 📈 Which Proxmox VE release are you on?
options:
- "Proxmox VE 9"
- "Proxmox VE 8"
- "Proxmox VE 7 or older (end of life)"
validations:
required: true
- type: input - type: input
id: pve_version id: pve_version
attributes: attributes:
label: 📈 Which Proxmox version are you on? label: 🔢 Exact Proxmox version and kernel
description: "Both matter — several issues turned out to be kernel-specific."
placeholder: "run pveversion in your PVE node console" placeholder: "run pveversion in your PVE node console"
validations: validations:
required: true required: true

3
.github/pull_request_template.md generated vendored
View File

@@ -14,6 +14,9 @@ Fixes #
- [ ] **Tested thoroughly** Changes work as expected. - [ ] **Tested thoroughly** Changes work as expected.
- [ ] **No security risks** No hardcoded secrets, unnecessary privilege escalations, or permission issues. - [ ] **No security risks** No hardcoded secrets, unnecessary privilege escalations, or permission issues.
**Tested on:** <!-- e.g. PVE 9.2 / Debian 13 / fresh install + update. Write "not tested" if you could not run it. -->
--- ---
## 🤖 AI Assistance (**X** in brackets) ## 🤖 AI Assistance (**X** in brackets)

View File

@@ -497,15 +497,25 @@ jobs:
PR_EOF PR_EOF
) )
# The label goes on at creation, not in a second call: it is what # Labels go on at creation, not in a second call: they are what
# exempts the PR from the template check, and that check runs on # exempts the PR from the template check, and that check runs on
# "opened" — a label added a moment later can arrive too late. # "opened" — a label added a moment later can arrive too late.
#
# "keep-open" rather than "automated pr" for that exemption: both
# skip the template check, but changelog-pr.yml drops every PR
# carrying "automated pr" (it marks its own PR with it), so that
# label would keep these bumps out of the changelog entirely.
# "update script" and "bugfix" place them under Updated Scripts →
# Bug Fixes; the autolabeler cannot do it, since a PR opened with
# GITHUB_TOKEN never triggers its pull_request_target run.
if url=$(gh pr create \ if url=$(gh pr create \
--title "${slug}: bump Node.js from ${our} to ${upstream}" \ --title "${slug}: bump Node.js from ${our} to ${upstream}" \
--body "$body" \ --body "$body" \
--base main \ --base main \
--head "$branch" \ --head "$branch" \
--label "automated pr" 2>/dev/null); then --label "keep-open" \
--label "update script" \
--label "bugfix" 2>/dev/null); then
printf '%s|open|%s\n' "$slug" "$url" >>/tmp/drift_prs.txt printf '%s|open|%s\n' "$slug" "$url" >>/tmp/drift_prs.txt
else else
printf '%s|failed||\n' "$slug" >>/tmp/drift_prs.txt printf '%s|failed||\n' "$slug" >>/tmp/drift_prs.txt

View File

@@ -540,12 +540,113 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details> </details>
## 2026-09-07 ## 2026-09-11
### 🆕 New Scripts
- OneTimeSecret ([#17097](https://github.com/community-scripts/ProxmoxVE/pull/17097))
### 🚀 Updated Scripts ### 🚀 Updated Scripts
- #### 🐞 Bug Fixes - #### 🐞 Bug Fixes
- passwordpusher: restore data before running migrations [@MickLesk](https://github.com/MickLesk) ([#17141](https://github.com/community-scripts/ProxmoxVE/pull/17141))
- paperclip: install the rust toolchain needed by the runner build [@MickLesk](https://github.com/MickLesk) ([#17142](https://github.com/community-scripts/ProxmoxVE/pull/17142))
- homepage: run next directly instead of through pnpm [@MickLesk](https://github.com/MickLesk) ([#17155](https://github.com/community-scripts/ProxmoxVE/pull/17155))
- changedetection: fix: pin browserless [@CrazyWolf13](https://github.com/CrazyWolf13) ([#17163](https://github.com/community-scripts/ProxmoxVE/pull/17163))
### 💾 Core
- #### 🐞 Bug Fixes
- core.func: fall back to a usable HOME when the shell has none [@MickLesk](https://github.com/MickLesk) ([#17154](https://github.com/community-scripts/ProxmoxVE/pull/17154))
### 🧰 Tools
- #### 🐞 Bug Fixes
- update-apps: rewrite the retired Gitea base in every container before updating it [@MickLesk](https://github.com/MickLesk) ([#17156](https://github.com/community-scripts/ProxmoxVE/pull/17156))
- #### 🔧 Refactor
- Rename lxc-delete.sh to guest-delete.sh [@MickLesk](https://github.com/MickLesk) ([#17152](https://github.com/community-scripts/ProxmoxVE/pull/17152))
### 📚 Documentation
- issue template: add PVE release, execution context and phase; refresh distro list / pve versions [@MickLesk](https://github.com/MickLesk) ([#17160](https://github.com/community-scripts/ProxmoxVE/pull/17160))
## 2026-09-10
### 🆕 New Scripts
- Chevereto ([#17131](https://github.com/community-scripts/ProxmoxVE/pull/17131))
- Portabase ([#17111](https://github.com/community-scripts/ProxmoxVE/pull/17111))
- Logseq ([#17112](https://github.com/community-scripts/ProxmoxVE/pull/17112))
- Safebucket ([#17096](https://github.com/community-scripts/ProxmoxVE/pull/17096))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Immich v3.2.0 [@vhsdream](https://github.com/vhsdream) ([#17137](https://github.com/community-scripts/ProxmoxVE/pull/17137))
- fix(solidtime): prevent composer install from hanging on root prompt [@supersoju](https://github.com/supersoju) ([#17146](https://github.com/community-scripts/ProxmoxVE/pull/17146))
- fix(hermesagent): wait for root gateway cleanup [@steveonjava](https://github.com/steveonjava) ([#17147](https://github.com/community-scripts/ProxmoxVE/pull/17147))
### 💾 Core
- Keep the script name when regenerating the entrypoint [@MickLesk](https://github.com/MickLesk) ([core#35](https://github.com/community-scripts/core/pull/35))
- Rewrite the dead Gitea base onto GitHub instead of failing the update [@MickLesk](https://github.com/MickLesk) ([core#33](https://github.com/community-scripts/core/pull/33))
- core.func: fall back to a usable HOME when the shell has none [@MickLesk](https://github.com/MickLesk) ([core#32](https://github.com/community-scripts/core/pull/32))
## 2026-09-09
### 🆕 New Scripts
- Lingarr ([#17130](https://github.com/community-scripts/ProxmoxVE/pull/17130))
### 🚀 Updated Scripts
- vm: drop the discussions link from the summary [@MickLesk](https://github.com/MickLesk) ([#17117](https://github.com/community-scripts/ProxmoxVE/pull/17117))
- #### 🐞 Bug Fixes
- fix(hermesagent): stop spurious root gateway after update [@steveonjava](https://github.com/steveonjava) ([#17126](https://github.com/community-scripts/ProxmoxVE/pull/17126))
## 2026-09-08
### 🆕 New Scripts
- Decypharr ([#17108](https://github.com/community-scripts/ProxmoxVE/pull/17108))
- Stash ([#17106](https://github.com/community-scripts/ProxmoxVE/pull/17106))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Update Jellyfin FFmpeg dependency to version 8 [@MickLesk](https://github.com/MickLesk) ([#17109](https://github.com/community-scripts/ProxmoxVE/pull/17109))
### 💾 Core
- Treat a cut-short forge response as a failure, not as HTTP 200 [@MickLesk](https://github.com/MickLesk) ([core#31](https://github.com/community-scripts/core/pull/31))
- Generate app headers [@github-actions[bot]](https://github.com/github-actions[bot]) ([core#28](https://github.com/community-scripts/core/pull/28))
- cloud-init: drop the "configure in Proxmox UI" hint [@MickLesk](https://github.com/MickLesk) ([core#30](https://github.com/community-scripts/core/pull/30))
- Survive an empty /usr/bin/update instead of aborting the run [@MickLesk](https://github.com/MickLesk) ([core#29](https://github.com/community-scripts/core/pull/29))
## 2026-09-07
### 🆕 New Scripts
- Chatwoot ([#17095](https://github.com/community-scripts/ProxmoxVE/pull/17095))
- whisparr-eros ([#17094](https://github.com/community-scripts/ProxmoxVE/pull/17094))
- Matter-Hub ([#17093](https://github.com/community-scripts/ProxmoxVE/pull/17093))
- Journiv ([#17092](https://github.com/community-scripts/ProxmoxVE/pull/17092))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- kaneo: bump Node.js from 22 to 24 [@github-actions[bot]](https://github.com/github-actions[bot]) ([#17086](https://github.com/community-scripts/ProxmoxVE/pull/17086))
- iobroker: bump Node.js from 24 to 26 [@github-actions[bot]](https://github.com/github-actions[bot]) ([#17085](https://github.com/community-scripts/ProxmoxVE/pull/17085))
- reactive-resume: repair any wrong WorkingDirectory on update [@MickLesk](https://github.com/MickLesk) ([#17068](https://github.com/community-scripts/ProxmoxVE/pull/17068)) - reactive-resume: repair any wrong WorkingDirectory on update [@MickLesk](https://github.com/MickLesk) ([#17068](https://github.com/community-scripts/ProxmoxVE/pull/17068))
- mediamtx: keep mediamtx.yml across updates [@MickLesk](https://github.com/MickLesk) ([#17069](https://github.com/community-scripts/ProxmoxVE/pull/17069)) - mediamtx: keep mediamtx.yml across updates [@MickLesk](https://github.com/MickLesk) ([#17069](https://github.com/community-scripts/ProxmoxVE/pull/17069))
- omnitools: allow remote action while npm ci [@MickLesk](https://github.com/MickLesk) ([#17070](https://github.com/community-scripts/ProxmoxVE/pull/17070)) - omnitools: allow remote action while npm ci [@MickLesk](https://github.com/MickLesk) ([#17070](https://github.com/community-scripts/ProxmoxVE/pull/17070))
@@ -556,6 +657,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- #### 🔧 Refactor - #### 🔧 Refactor
- flatnotes: follow upstream move to uv and Python 3.13 [@MickLesk](https://github.com/MickLesk) ([#17090](https://github.com/community-scripts/ProxmoxVE/pull/17090))
- heimdall: set up PHP 8.4 on update, keep only the database, run migrations [@MickLesk](https://github.com/MickLesk) ([#17067](https://github.com/community-scripts/ProxmoxVE/pull/17067)) - heimdall: set up PHP 8.4 on update, keep only the database, run migrations [@MickLesk](https://github.com/MickLesk) ([#17067](https://github.com/community-scripts/ProxmoxVE/pull/17067))
### 📂 Github ### 📂 Github

View File

@@ -69,6 +69,7 @@ function update_script() {
$STD git -C /opt/browserless/ reset --hard origin/main $STD git -C /opt/browserless/ reset --hard origin/main
$STD npm update --prefix /opt/browserless $STD npm update --prefix /opt/browserless
$STD npm ci --include=optional --include=dev --prefix /opt/browserless $STD npm ci --include=optional --include=dev --prefix /opt/browserless
$STD npm install --save-exact playwright-core@1.62.1 --prefix /opt/browserless
$STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps $STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps
# Update Chrome separately, as it has to be done with the force option. Otherwise the installation of other browsers will not be done if Chrome is already installed. # Update Chrome separately, as it has to be done with the force option. Otherwise the installation of other browsers will not be done if Chrome is already installed.
$STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome $STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome

76
ct/chatwoot.sh Normal file
View File

@@ -0,0 +1,76 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.chatwoot.com/
APP="Chatwoot"
var_tags="${var_tags:-support;chat;helpdesk;crm}"
var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-6144}"
var_disk="${var_disk:-16}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-no}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /opt/chatwoot/.env ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "chatwoot" "chatwoot/chatwoot"; then
msg_info "Stopping Services"
systemctl stop chatwoot-web chatwoot-worker
msg_ok "Stopped Services"
create_backup /opt/chatwoot/.env /opt/chatwoot/storage
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "chatwoot" "chatwoot/chatwoot" "tarball"
RUBY_VERSION=$(tr -d ' \n' </opt/chatwoot/.ruby-version)
RUBY_VERSION="${RUBY_VERSION}" RUBY_INSTALL_RAILS="false" setup_ruby
NODE_VERSION=$(tr -d ' \n' </opt/chatwoot/.nvmrc)
NODE_VERSION="${NODE_VERSION}" NODE_MODULE="pnpm" setup_nodejs
export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"
restore_backup
msg_info "Updating Application"
cd /opt/chatwoot
$STD bundle config set --local without 'development test'
$STD bundle config set --local deployment 'true'
$STD bundle install
$STD pnpm install --frozen-lockfile
RAILS_ENV=production $STD bundle exec rails db:chatwoot_prepare
RAILS_ENV=production $STD bundle exec rails assets:precompile
msg_ok "Updated Application"
msg_info "Starting Services"
systemctl start chatwoot-web chatwoot-worker
msg_ok "Started Services"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
echo -e "${GATEWAY}${BGN}http://${IP}:3000${CL}"

73
ct/chevereto.sh Normal file
View File

@@ -0,0 +1,73 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://chevereto.com/
APP="Chevereto"
var_tags="${var_tags:-image-hosting;gallery;media}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
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/chevereto ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "chevereto" "chevereto/chevereto"; then
PHP_FPM_SERVICE="$(basename "$(get_php_fpm_socket)" .sock)"
msg_info "Stopping Services"
systemctl stop nginx "$PHP_FPM_SERVICE"
msg_ok "Stopped Services"
create_backup /opt/chevereto/app/env.php \
/opt/chevereto/images \
/opt/chevereto/content
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "chevereto" "chevereto/chevereto" "tarball"
restore_backup
msg_info "Updating Chevereto"
cd /opt/chevereto/app
export COMPOSER_ALLOW_SUPERUSER=1
$STD composer install --no-dev --prefer-dist --no-interaction --optimize-autoloader
chown -R www-data:www-data /opt/chevereto
chmod -R 775 /opt/chevereto/images /opt/chevereto/content
msg_ok "Updated Chevereto"
msg_info "Starting Services"
systemctl start "$PHP_FPM_SERVICE" nginx
msg_ok "Started Services"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
echo -e "${GATEWAY}${BGN}http://${IP}${CL}"

58
ct/decypharr.sh Normal file
View File

@@ -0,0 +1,58 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/sirrobot01/decypharr
APP="Decypharr"
var_tags="${var_tags:-arr;debrid}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
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/decypharr ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "decypharr" "sirrobot01/decypharr"; then
msg_info "Stopping Service"
systemctl stop decypharr
msg_ok "Stopped Service"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "decypharr" "sirrobot01/decypharr" "prebuild" "latest" "/opt/decypharr" "decypharr_Linux_$(arch_resolve x86_64 arm64).tar.gz"
chmod +x /opt/decypharr/decypharr
msg_info "Starting Service"
systemctl start decypharr
msg_ok "Started Service"
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 "${GATEWAY}${BGN}http://${IP}:8282${CL}"

View File

@@ -38,19 +38,18 @@ function update_script() {
create_backup /opt/flatnotes/.env /opt/flatnotes/data create_backup /opt/flatnotes/.env /opt/flatnotes/data
PYTHON_VERSION="3.13" setup_uv
NODE_VERSION="24" setup_nodejs
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes" "tarball" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes" "tarball"
restore_backup restore_backup
msg_info "Updating Flatnotes" msg_info "Updating Flatnotes"
cd /opt/flatnotes/client
$STD npm install
$STD npm run build
cd /opt/flatnotes cd /opt/flatnotes
rm -f uv.lock $STD uv sync --locked --no-dev
sed -i 's/^name = ""$/name = "flatnotes"/' pyproject.toml $STD npm ci
$STD /usr/local/bin/uvx migrate-to-uv $STD npm run build
$STD /usr/local/bin/uv sync
msg_ok "Updated Flatnotes" msg_ok "Updated Flatnotes"
msg_info "Starting Service" msg_info "Starting Service"

6
ct/headers/chatwoot Normal file
View File

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

6
ct/headers/chevereto Normal file
View File

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

6
ct/headers/decypharr Normal file
View File

@@ -0,0 +1,6 @@
____ __
/ __ \___ _______ ______ / /_ ____ ___________
/ / / / _ \/ ___/ / / / __ \/ __ \/ __ `/ ___/ ___/
/ /_/ / __/ /__/ /_/ / /_/ / / / / /_/ / / / /
/_____/\___/\___/\__, / .___/_/ /_/\__,_/_/ /_/
/____/_/

6
ct/headers/journiv Normal file
View File

@@ -0,0 +1,6 @@
__ _
/ /___ __ ___________ (_) __
__ / / __ \/ / / / ___/ __ \/ / | / /
/ /_/ / /_/ / /_/ / / / / / / /| |/ /
\____/\____/\__,_/_/ /_/ /_/_/ |___/

6
ct/headers/lingarr Normal file
View File

@@ -0,0 +1,6 @@
__ _
/ / (_)___ ____ _____ ___________
/ / / / __ \/ __ `/ __ `/ ___/ ___/
/ /___/ / / / / /_/ / /_/ / / / /
/_____/_/_/ /_/\__, /\__,_/_/ /_/
/____/

6
ct/headers/logseq Normal file
View File

@@ -0,0 +1,6 @@
__
/ / ____ ____ _________ ____ _
/ / / __ \/ __ `/ ___/ _ \/ __ `/
/ /___/ /_/ / /_/ (__ ) __/ /_/ /
/_____/\____/\__, /____/\___/\__, /
/____/ /_/

6
ct/headers/matter-hub Normal file
View File

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

6
ct/headers/onetimesecret Normal file
View File

@@ -0,0 +1,6 @@
____ _______ _____ __
/ __ \____ ___/_ __(_)___ ___ ___ / ___/___ _____________ / /_
/ / / / __ \/ _ \/ / / / __ `__ \/ _ \\__ \/ _ \/ ___/ ___/ _ \/ __/
/ /_/ / / / / __/ / / / / / / / / __/__/ / __/ /__/ / / __/ /_
\____/_/ /_/\___/_/ /_/_/ /_/ /_/\___/____/\___/\___/_/ \___/\__/

6
ct/headers/portabase Normal file
View File

@@ -0,0 +1,6 @@
____ __ __
/ __ \____ _____/ /_____ _/ /_ ____ _________
/ /_/ / __ \/ ___/ __/ __ `/ __ \/ __ `/ ___/ _ \
/ ____/ /_/ / / / /_/ /_/ / /_/ / /_/ (__ ) __/
/_/ \____/_/ \__/\__,_/_.___/\__,_/____/\___/

6
ct/headers/safebucket Normal file
View File

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

6
ct/headers/stash Normal file
View File

@@ -0,0 +1,6 @@
_____ __ __
/ ___// /_____ ______/ /_
\__ \/ __/ __ `/ ___/ __ \
___/ / /_/ /_/ (__ ) / / /
/____/\__/\__,_/____/_/ /_/

6
ct/headers/whisparr-eros Normal file
View File

@@ -0,0 +1,6 @@
_ ____ _ ______
| | / / /_ (_)________ ____ ___________ / ____/________ _____
| | /| / / __ \/ / ___/ __ \/ __ `/ ___/ ___/_____/ __/ / ___/ __ \/ ___/
| |/ |/ / / / / (__ ) /_/ / /_/ / / / / /_____/ /___/ / / /_/ (__ )
|__/|__/_/ /_/_/____/ .___/\__,_/_/ /_/ /_____/_/ \____/____/
/_/

View File

@@ -52,6 +52,16 @@ function update_script() {
set -a; source /etc/default/hermes; set +a set -a; source /etc/default/hermes; set +a
/home/hermes/.local/bin/hermes update --yes /home/hermes/.local/bin/hermes update --yes
' '
# See https://github.com/community-scripts/ProxmoxVE/issues/17123
mapfile -t root_gateway_pids < <(ps -eo user=,pid=,args= | awk '$1 == "root" && $0 ~ /\/home\/hermes\/\.hermes\/hermes-agent\/venv\/bin\/python -m hermes_cli\.main gateway run --replace$/ { print $2 }')
if ((${#root_gateway_pids[@]})); then
kill -TERM "${root_gateway_pids[@]}"
for pid in "${root_gateway_pids[@]}"; do
while kill -0 "$pid" 2>/dev/null; do
sleep 0.1
done
done
fi
chown -R hermes:hermes /home/hermes chown -R hermes:hermes /home/hermes
msg_ok "Updated Hermes Agent" msg_ok "Updated Hermes Agent"

View File

@@ -83,6 +83,10 @@ EOF
sed -i '/^ExecStart=/i Environment=CI=true' /etc/systemd/system/homepage.service sed -i '/^ExecStart=/i Environment=CI=true' /etc/systemd/system/homepage.service
systemctl daemon-reload systemctl daemon-reload
fi fi
if grep -q '^ExecStart=pnpm start' /etc/systemd/system/homepage.service; then
sed -i 's|^ExecStart=pnpm start$|ExecStart=/opt/homepage/node_modules/.bin/next start|' /etc/systemd/system/homepage.service
systemctl daemon-reload
fi
msg_ok "Updated Homepage" msg_ok "Updated Homepage"
msg_info "Starting service" msg_info "Starting service"

View File

@@ -112,7 +112,7 @@ EOF
msg_ok "Image-processing libraries up to date" msg_ok "Image-processing libraries up to date"
fi fi
RELEASE="v3.1.0" RELEASE="v3.2.0"
if check_for_gh_release "Immich" "immich-app/immich" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then if check_for_gh_release "Immich" "immich-app/immich" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then
if [[ $(cat ~/.immich) > "2.5.1" ]]; then if [[ $(cat ~/.immich) > "2.5.1" ]]; then
msg_info "Enabling Maintenance Mode" msg_info "Enabling Maintenance Mode"
@@ -187,11 +187,10 @@ EOF
msg_info "Updating Immich web and microservices" msg_info "Updating Immich web and microservices"
cd "$SRC_DIR"/server cd "$SRC_DIR"/server
# server build # server build
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
$STD pnpm --filter @immich/sdk --filter @immich/plugin-sdk --filter immich build $STD pnpm --filter @immich/sdk --filter @immich/plugin-sdk --filter immich build
unset SHARP_IGNORE_GLOBAL_LIBVIPS
export SHARP_FORCE_GLOBAL_LIBVIPS=true
$STD pnpm --filter immich --prod --no-optional deploy "$APP_DIR" $STD pnpm --filter immich --prod --no-optional deploy "$APP_DIR"
export SHARP_FORCE_GLOBAL_LIBVIPS=true
$STD pnpm --dir "$APP_DIR/node_modules/sharp" exec npm run build
# Patch helmet.json: disable upgrade-insecure-requests for HTTP access # Patch helmet.json: disable upgrade-insecure-requests for HTTP access
if [[ -f "$APP_DIR/helmet.json" ]]; then if [[ -f "$APP_DIR/helmet.json" ]]; then
@@ -205,7 +204,6 @@ EOF
cd "$SRC_DIR" cd "$SRC_DIR"
echo "packageImportMethod: hardlink" >>./pnpm-workspace.yaml echo "packageImportMethod: hardlink" >>./pnpm-workspace.yaml
unset SHARP_FORCE_GLOBAL_LIBVIPS unset SHARP_FORCE_GLOBAL_LIBVIPS
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
$STD pnpm --filter @immich/sdk --filter immich-web --filter @immich/cli build $STD pnpm --filter @immich/sdk --filter immich-web --filter @immich/cli build
$STD pnpm --filter @immich/cli --prod --no-optional deploy "$APP_DIR"/cli $STD pnpm --filter @immich/cli --prod --no-optional deploy "$APP_DIR"/cli
cp -a web/build "$APP_DIR"/www cp -a web/build "$APP_DIR"/www

View File

@@ -31,7 +31,7 @@ function update_script() {
exit exit
fi fi
NODE_VERSION="24" setup_nodejs NODE_VERSION="26" NPM_VERSION="11" setup_nodejs
msg_info "Updating ${APP} LXC" msg_info "Updating ${APP} LXC"
$STD apt update $STD apt update

View File

@@ -64,7 +64,7 @@ function update_script() {
ln -sf "/usr/lib/$(arch_resolve "x86_64-linux-gnu" "aarch64-linux-gnu")/libjemalloc.so.2" /usr/lib/libjemalloc.so ln -sf "/usr/lib/$(arch_resolve "x86_64-linux-gnu" "aarch64-linux-gnu")/libjemalloc.so.2" /usr/lib/libjemalloc.so
fi fi
$STD apt -y upgrade $STD apt -y upgrade
$STD apt -y --with-new-pkgs upgrade jellyfin jellyfin-server jellyfin-ffmpeg7 $STD apt -y --with-new-pkgs upgrade jellyfin jellyfin-server jellyfin-ffmpeg8
ln -sf /usr/lib/jellyfin-ffmpeg/ffmpeg /usr/bin/ffmpeg ln -sf /usr/lib/jellyfin-ffmpeg/ffmpeg /usr/bin/ffmpeg
ln -sf /usr/lib/jellyfin-ffmpeg/ffprobe /usr/bin/ffprobe ln -sf /usr/lib/jellyfin-ffmpeg/ffprobe /usr/bin/ffprobe
msg_ok "Updated Jellyfin" msg_ok "Updated Jellyfin"

69
ct/journiv.sh Normal file
View File

@@ -0,0 +1,69 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/journiv/journiv-app
APP="Journiv"
var_tags="${var_tags:-journal;notes}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-12}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
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/journiv ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "journiv" "journiv/journiv-app"; then
msg_info "Stopping Services"
systemctl stop journiv journiv-worker journiv-beat
msg_ok "Stopped Services"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "journiv" "journiv/journiv-app" "tarball"
msg_info "Updating Python Environment"
cd /opt/journiv
$STD uv sync --locked --no-editable --no-install-project
msg_ok "Updated Python Environment"
msg_info "Running Database Migrations"
set -a
source /opt/journiv.env
set +a
$STD /opt/journiv/.venv/bin/python -c "from alembic.config import main; main(['upgrade', 'head'])"
msg_ok "Ran Database Migrations"
msg_info "Starting Services"
systemctl start journiv journiv-worker journiv-beat
msg_ok "Started Services"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
echo -e "${GATEWAY}${BGN}http://${IP}:8000${CL}"

View File

@@ -42,7 +42,7 @@ function update_script() {
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "kaneo" "usekaneo/kaneo" "tarball" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "kaneo" "usekaneo/kaneo" "tarball"
PNPM_VERSION=$(sed -n 's/.*"packageManager": "pnpm@\([^"+]*\).*/\1/p' /opt/kaneo/package.json) PNPM_VERSION=$(sed -n 's/.*"packageManager": "pnpm@\([^"+]*\).*/\1/p' /opt/kaneo/package.json)
NODE_VERSION="22" NODE_MODULE="pnpm@${PNPM_VERSION:-10.32.1}" setup_nodejs NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION:-10.32.1}" setup_nodejs
restore_backup restore_backup

70
ct/lingarr.sh Normal file
View File

@@ -0,0 +1,70 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/lingarr-translate/lingarr
APP="Lingarr"
var_tags="${var_tags:-arr;subtitles}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-16}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
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/lingarr ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "lingarr" "lingarr-translate/lingarr"; then
msg_info "Stopping Service"
systemctl stop lingarr
msg_ok "Stopped Service"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "lingarr" "lingarr-translate/lingarr" "tarball"
msg_info "Building Lingarr (Patience)"
cd /opt/lingarr/Lingarr.Client
$STD npm ci
$STD npm run build
mkdir -p /opt/lingarr/Lingarr.Server/wwwroot
cp -r /opt/lingarr/Lingarr.Client/dist/* /opt/lingarr/Lingarr.Server/wwwroot/
cd /opt/lingarr
export DOTNET_CLI_TELEMETRY_OPTOUT=1
rm -rf /opt/lingarr_app
$STD dotnet publish ./Lingarr.Server/Lingarr.Server.csproj -c Release -o /opt/lingarr_app /p:UseAppHost=false /p:Version="$(cat ~/.lingarr)"
msg_ok "Built Lingarr"
msg_info "Starting Service"
systemctl start lingarr
msg_ok "Started Service"
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 "${GATEWAY}${BGN}http://${IP}:9876${CL}"
echo -e "${INFO}${YW}Set your translation backend in /opt/lingarr.env${CL}"

66
ct/logseq.sh Normal file
View File

@@ -0,0 +1,66 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://logseq.com/
APP="Logseq"
var_tags="${var_tags:-notes;knowledge-base}"
var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-8192}"
var_disk="${var_disk:-16}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
#var_arm64="${var_arm64:-no}" # unset = ask the user; set yes/no only when verified
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/logseq ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "logseq" "logseq/logseq"; then
NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
JAVA_VERSION="21" setup_java
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "logseq" "logseq/logseq" "tarball"
msg_info "Building Logseq Web App (Patience)"
cd /opt/logseq
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
export NODE_OPTIONS="--max-old-space-size=4096"
export JAVA_TOOL_OPTIONS="-Xmx4g"
$STD corepack enable
$STD pnpm install --config.network-timeout=240000
$STD pnpm release
msg_ok "Built Logseq Web App"
msg_info "Reloading Webserver"
systemctl reload nginx
msg_ok "Reloaded Webserver"
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 "${GATEWAY}${BGN}http://${IP}${CL}"

72
ct/matter-hub.sh Normal file
View File

@@ -0,0 +1,72 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/RiDDiX/home-assistant-matter-hub
APP="Matter-Hub"
var_tags="${var_tags:-smarthome;matter}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-12}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
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/matter-hub ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "matter-hub" "RiDDiX/home-assistant-matter-hub"; then
msg_info "Stopping Service"
systemctl stop matter-hub
msg_ok "Stopped Service"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "matter-hub" "RiDDiX/home-assistant-matter-hub" "tarball"
msg_info "Building Matter Hub"
cd /opt/matter-hub
MATTER_HUB_VERSION=$(cat ~/.matter-hub)
$STD pnpm install --frozen-lockfile
$STD pnpm run release:version "$MATTER_HUB_VERSION"
APP_VERSION="$MATTER_HUB_VERSION" $STD pnpm build
sed -i "s|^APP_VERSION=.*|APP_VERSION=${MATTER_HUB_VERSION}|" /opt/matter-hub.env
msg_ok "Built Matter Hub"
msg_info "Installing Matter Hub"
rm -rf /opt/matter-hub_app/node_modules /opt/matter-hub_app/package-lock.json
cd /opt/matter-hub_app
$STD npm install --omit=dev --no-audit --no-fund
msg_ok "Installed Matter Hub"
msg_info "Starting Service"
systemctl start matter-hub
msg_ok "Started Service"
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 "${GATEWAY}${BGN}http://${IP}:8482${CL}"

101
ct/onetimesecret.sh Normal file
View File

@@ -0,0 +1,101 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: Hai Tran (epiHATR)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://onetimesecret.com/ | Github: https://github.com/onetimesecret/onetimesecret
APP="OneTimeSecret"
var_tags="${var_tags:-security;privacy;secrets}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-no}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
SSL_VALUE="${OTS_SSL:-}"
if [[ -n "${SSL_VALUE}" ]]; then
case "${SSL_VALUE,,}" in
1 | true | yes | on) SSL_VALUE="true" ;;
0 | false | no | off) SSL_VALUE="false" ;;
*)
msg_error "Invalid OTS_SSL value '${OTS_SSL}' (use true/false)"
exit 1
;;
esac
fi
if [[ ! -d /opt/onetimesecret ]] || [[ ! -f /opt/onetimesecret/.env ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "onetimesecret" "onetimesecret/onetimesecret"; then
msg_info "Stopping Service"
systemctl stop onetimesecret
msg_ok "Stopped Service"
create_backup /opt/onetimesecret/.env
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "onetimesecret" "onetimesecret/onetimesecret" "tarball"
RUBY_VERSION=$(tr -d ' \n' </opt/onetimesecret/.ruby-version 2>/dev/null)
RUBY_VERSION="${RUBY_VERSION:-3.4.10}" setup_ruby
PNPM_VERSION=$(sed -n 's/.*"packageManager": "pnpm@\([^"]*\)".*/\1/p' /opt/onetimesecret/package.json)
NODE_VERSION=$(tr -d ' \n' </opt/onetimesecret/.nvmrc 2>/dev/null)
NODE_VERSION="${NODE_VERSION:-25}" NODE_MODULE="pnpm@${PNPM_VERSION:-11.1.2}" setup_nodejs
restore_backup
msg_info "Reconciling Application"
systemctl enable -q --now redis-server
cd /opt/onetimesecret
mkdir -p tmp/pids log
$STD bash bin/setup reconcile
msg_ok "Reconciled Application"
msg_info "Building Frontend"
cd /opt/onetimesecret
$STD pnpm run build
msg_ok "Built Frontend"
msg_info "Starting Service"
systemctl start onetimesecret
msg_ok "Started Service"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
DISPLAY_HOST="${OTS_HOST:-$IP}"
case "${OTS_SSL:-false,,}" in
1 | true | yes | on)
DISPLAY_SCHEME="https"
;;
*)
DISPLAY_SCHEME="http"
;;
esac
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 "${GATEWAY}${BGN}${DISPLAY_SCHEME}://${DISPLAY_HOST}${CL}"

View File

@@ -43,6 +43,8 @@ function update_script() {
restore_backup restore_backup
setup_rust
msg_info "Rebuilding Paperclip" msg_info "Rebuilding Paperclip"
cd /opt/paperclip-ai cd /opt/paperclip-ai
export HUSKY=0 export HUSKY=0

View File

@@ -40,6 +40,9 @@ function update_script() {
create_backup /opt/passwordpusher/storage /opt/passwordpusher/.env.production create_backup /opt/passwordpusher/storage /opt/passwordpusher/.env.production
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "passwordpusher" "pglombardo/PasswordPusher" "tarball" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "passwordpusher" "pglombardo/PasswordPusher" "tarball"
restore_backup
RUBY_VERSION="$(cat /opt/passwordpusher/.ruby-version)" RUBY_INSTALL_RAILS="false" setup_ruby RUBY_VERSION="$(cat /opt/passwordpusher/.ruby-version)" RUBY_INSTALL_RAILS="false" setup_ruby
msg_info "Installing Gem Dependencies" msg_info "Installing Gem Dependencies"
@@ -62,8 +65,6 @@ function update_script() {
RAILS_ENV=production SECRET_KEY_BASE_DUMMY=1 $STD bundle exec rails assets:precompile RAILS_ENV=production SECRET_KEY_BASE_DUMMY=1 $STD bundle exec rails assets:precompile
msg_ok "Precompiled Assets" msg_ok "Precompiled Assets"
restore_backup
msg_info "Starting Service" msg_info "Starting Service"
systemctl start passwordpusher systemctl start passwordpusher
msg_ok "Started Service" msg_ok "Started Service"

76
ct/portabase.sh Normal file
View File

@@ -0,0 +1,76 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://portabase.io
APP="Portabase"
var_tags="${var_tags:-database;backup}"
var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-8192}"
var_disk="${var_disk:-15}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
#var_arm64="${var_arm64:-no}" # unset = ask the user; set yes/no only when verified
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/portabase ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "portabase" "Portabase/portabase"; then
msg_info "Stopping Services"
systemctl stop portabase portabase-tusd
msg_ok "Stopped Services"
create_backup /opt/portabase/.env
NODE_VERSION="22" NODE_MODULE="pnpm@11.8.0" setup_nodejs
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "portabase" "Portabase/portabase" "tarball"
restore_backup
msg_info "Building Portabase"
cd /opt/portabase
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
export NEXT_TELEMETRY_DISABLED=1
$STD pnpm install --frozen-lockfile
$STD pnpm run build
cp -r /opt/portabase/.next/static /opt/portabase/.next/standalone/.next/static
cp -r /opt/portabase/public /opt/portabase/.next/standalone/public
mkdir -p /opt/portabase/.next/standalone/src/db
cp -r /opt/portabase/src/db/migrations /opt/portabase/.next/standalone/src/db/migrations
ln -sf /opt/portabase/.env /opt/portabase/.next/standalone/.env
msg_ok "Built Portabase"
msg_info "Starting Services"
systemctl start portabase-tusd portabase
msg_ok "Started Services"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
echo -e "${GATEWAY}${BGN}http://${IP}:3000${CL}"

63
ct/safebucket.sh Normal file
View File

@@ -0,0 +1,63 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: renizmy
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/safebucket/safebucket
APP="Safebucket"
var_tags="${var_tags:-files;sharing}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /opt/safebucket/safebucket ]]; then
msg_error "No ${APP} Installation Found!"
exit 1
fi
if check_for_gh_release "safebucket" "safebucket/safebucket"; then
msg_info "Stopping Service"
systemctl stop safebucket
msg_ok "Stopped Service"
create_backup /opt/safebucket/config.yaml /opt/safebucket/data/
fetch_and_deploy_gh_release "safebucket" "safebucket/safebucket" "singlefile" "latest" "/opt/safebucket" "safebucket-linux-$(arch_resolve)"
restore_backup
msg_info "Configuring Safebucket"
chown -R safebucket:safebucket /opt/safebucket
msg_ok "Configured Safebucket"
msg_info "Starting Service"
systemctl start safebucket
msg_ok "Started Service"
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}:8080${CL}"

View File

@@ -45,7 +45,7 @@ function update_script() {
msg_info "Updating Application" msg_info "Updating Application"
cd /opt/solidtime cd /opt/solidtime
$STD composer install --no-dev --optimize-autoloader COMPOSER_ALLOW_SUPERUSER=1 $STD composer install --no-dev --optimize-autoloader
$STD npm install $STD npm install
$STD npm run build $STD npm run build
$STD php artisan migrate --force $STD php artisan migrate --force

58
ct/stash.sh Normal file
View File

@@ -0,0 +1,58 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/stashapp/stash
APP="Stash"
var_tags="${var_tags:-media;organizer}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_gpu="${var_gpu:-yes}"
var_arm64="${var_arm64:-yes}"
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/stash ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "stash" "stashapp/stash"; then
msg_info "Stopping Service"
systemctl stop stash
msg_ok "Stopped Service"
fetch_and_deploy_gh_release "stash" "stashapp/stash" "singlefile" "latest" "/opt/stash" "$(arch_resolve stash-linux stash-linux-arm64v8)"
msg_info "Starting Service"
systemctl start stash
msg_ok "Started Service"
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 "${GATEWAY}${BGN}http://${IP}:9999${CL}"

59
ct/whisparr-eros.sh Normal file
View File

@@ -0,0 +1,59 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: angusmaul
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/Whisparr/Whisparr-Eros
APP="Whisparr-Eros"
var_tags="${var_tags:-arr}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
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 /var/lib/whisparr-eros ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "whisparr-eros" "Whisparr/Whisparr-Eros"; then
msg_info "Stopping Service"
systemctl stop whisparr-eros
msg_ok "Stopped Service"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "whisparr-eros" "Whisparr/Whisparr-Eros" "prebuild" "latest" "/opt/Whisparr-Eros" "Whisparr.eros.*.linux-$(arch_resolve "x64" "arm64").tar.gz"
rm -rf /opt/Whisparr-Eros/Whisparr.Update
chmod +x /opt/Whisparr-Eros/Whisparr
msg_info "Starting Service"
systemctl start whisparr-eros
msg_ok "Started Service"
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}:6969${CL}"

View File

@@ -62,6 +62,7 @@ mkdir /opt/browserless
$STD /opt/changedetection/.venv/bin/python -m pip install playwright $STD /opt/changedetection/.venv/bin/python -m pip install playwright
$STD git clone https://github.com/browserless/chrome /opt/browserless $STD git clone https://github.com/browserless/chrome /opt/browserless
$STD npm ci --include=optional --include=dev --prefix /opt/browserless $STD npm ci --include=optional --include=dev --prefix /opt/browserless
$STD npm install --save-exact playwright-core@1.62.1 --prefix /opt/browserless
$STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps &>/dev/null $STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps &>/dev/null
$STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome &>/dev/null $STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome &>/dev/null
$STD /opt/browserless/node_modules/playwright-core/cli.js install chromium firefox webkit &>/dev/null $STD /opt/browserless/node_modules/playwright-core/cli.js install chromium firefox webkit &>/dev/null

130
install/chatwoot-install.sh Normal file
View File

@@ -0,0 +1,130 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.chatwoot.com/
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y \
build-essential \
git \
imagemagick \
libpq-dev \
libvips42 \
pkg-config \
redis-server
msg_ok "Installed Dependencies"
PG_VERSION="17" PG_MODULES="pgvector" setup_postgresql
PG_DB_NAME="chatwoot_production" PG_DB_USER="chatwoot" PG_DB_EXTENSIONS="vector,pg_stat_statements" setup_postgresql_db
fetch_and_deploy_gh_release "chatwoot" "chatwoot/chatwoot" "tarball"
RUBY_VERSION=$(tr -d ' \n' </opt/chatwoot/.ruby-version)
RUBY_VERSION="${RUBY_VERSION}" RUBY_INSTALL_RAILS="false" setup_ruby
NODE_VERSION=$(grep -oP '"node":\s*"\K[0-9]+' /opt/chatwoot/package.json)
NODE_VERSION="${NODE_VERSION}" NODE_MODULE="pnpm" setup_nodejs
export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"
msg_info "Installing Application Dependencies"
cd /opt/chatwoot
$STD bundle config set --local without 'development test'
$STD bundle config set --local deployment 'true'
$STD bundle install
$STD pnpm install --frozen-lockfile
msg_ok "Installed Application Dependencies"
msg_info "Configuring Chatwoot"
SECRET_KEY_BASE=$(openssl rand -hex 64)
mkdir -p /opt/chatwoot/storage
cat <<EOF >/opt/chatwoot/.env
RAILS_ENV=production
NODE_ENV=production
RAILS_LOG_TO_STDOUT=true
SECRET_KEY_BASE=${SECRET_KEY_BASE}
FRONTEND_URL=http://${LOCAL_IP}:3000
FORCE_SSL=false
ENABLE_ACCOUNT_SIGNUP=false
POSTGRES_HOST=127.0.0.1
POSTGRES_PORT=5432
POSTGRES_DATABASE=${PG_DB_NAME}
POSTGRES_USERNAME=${PG_DB_USER}
POSTGRES_PASSWORD=${PG_DB_PASS}
REDIS_URL=redis://127.0.0.1:6379
ACTIVE_STORAGE_SERVICE=local
EOF
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=$(openssl rand -hex 32)
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=$(openssl rand -hex 32)
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=$(openssl rand -hex 32)
cat <<EOF >>/opt/chatwoot/.env
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=${ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY}
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=${ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY}
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=${ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT}
EOF
chmod 640 /opt/chatwoot/.env
msg_ok "Configured Chatwoot"
msg_info "Preparing Database"
RAILS_ENV=production $STD bundle exec rails db:chatwoot_prepare
msg_ok "Prepared Database"
msg_info "Precompiling Assets"
RAILS_ENV=production NODE_OPTIONS="--max-old-space-size=4096" $STD bundle exec rails assets:precompile
msg_ok "Precompiled Assets"
msg_info "Creating Services"
cat <<EOF >/etc/systemd/system/chatwoot-web.service
[Unit]
Description=Chatwoot Web
After=network.target postgresql.service redis-server.service
Requires=postgresql.service redis-server.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/chatwoot
EnvironmentFile=/opt/chatwoot/.env
Environment=PATH=/root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ExecStart=/root/.rbenv/shims/bundle exec rails server -p 3000 -e production
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/chatwoot-worker.service
[Unit]
Description=Chatwoot Worker
After=network.target postgresql.service redis-server.service
Requires=postgresql.service redis-server.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/chatwoot
EnvironmentFile=/opt/chatwoot/.env
Environment=PATH=/root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ExecStart=/root/.rbenv/shims/bundle exec sidekiq -C config/sidekiq.yml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now chatwoot-web chatwoot-worker redis-server
msg_ok "Created Services"
motd_ssh
customize
cleanup_lxc

View File

@@ -0,0 +1,106 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://chevereto.com/
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 \
nginx \
exiftran \
libimage-exiftool-perl
msg_ok "Installed Dependencies"
PHP_VERSION="8.3" PHP_FPM="YES" PHP_UPLOAD_MAX_FILESIZE="512M" PHP_POST_MAX_SIZE="512M" PHP_MAX_EXECUTION_TIME="600" setup_php
setup_composer
setup_mariadb
setup_ffmpeg
MARIADB_DB_NAME="chevereto" MARIADB_DB_USER="chevereto" setup_mariadb_db
fetch_and_deploy_gh_release "chevereto" "chevereto/chevereto" "tarball"
msg_info "Installing Chevereto Dependencies"
cd /opt/chevereto/app
export COMPOSER_ALLOW_SUPERUSER=1
$STD composer install --no-dev --prefer-dist --no-interaction --optimize-autoloader
msg_ok "Installed Chevereto Dependencies"
msg_info "Configuring Chevereto"
cat <<EOF >/opt/chevereto/app/env.php
<?php
return [
'CHEVERETO_DB_HOST' => 'localhost',
'CHEVERETO_DB_PORT' => '3306',
'CHEVERETO_DB_NAME' => '${MARIADB_DB_NAME}',
'CHEVERETO_DB_USER' => '${MARIADB_DB_USER}',
'CHEVERETO_DB_PASS' => '${MARIADB_DB_PASS}',
'CHEVERETO_DB_TABLE_PREFIX' => 'chv_',
'CHEVERETO_HOSTNAME' => '${LOCAL_IP}',
];
EOF
chown -R www-data:www-data /opt/chevereto
chmod -R 775 /opt/chevereto/images /opt/chevereto/content
msg_ok "Configured Chevereto"
msg_info "Configuring Nginx"
cat <<'EOF' >/etc/nginx/sites-available/chevereto
server {
listen 80;
server_name _;
root /opt/chevereto;
index index.php;
charset utf-8;
client_max_body_size 512M;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location ~* ^/images/.+\.(gif|jpe?g|png|bmp|webp)$ {
try_files $uri =404;
}
location = /index.php {
include fastcgi_params;
fastcgi_pass unix:__PHP_FPM_SOCK__;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_read_timeout 600;
}
location ~ \.php$ {
deny all;
}
location ^~ /app/ {
deny all;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
EOF
sed -i "s|__PHP_FPM_SOCK__|$(get_php_fpm_socket)|" /etc/nginx/sites-available/chevereto
nginx_enable_site chevereto
msg_ok "Configured Nginx"
motd_ssh
customize
cleanup_lxc

View File

@@ -0,0 +1,47 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/sirrobot01/decypharr
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 fuse3
msg_ok "Installed Dependencies"
fetch_and_deploy_gh_release "decypharr" "sirrobot01/decypharr" "prebuild" "latest" "/opt/decypharr" "decypharr_Linux_$(arch_resolve x86_64 arm64).tar.gz"
chmod +x /opt/decypharr/decypharr
msg_info "Creating Service"
mkdir -p /opt/decypharr_data
cat <<EOF >/etc/systemd/system/decypharr.service
[Unit]
Description=Decypharr
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/decypharr
ExecStart=/opt/decypharr/decypharr --config /opt/decypharr_data
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now decypharr
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc

View File

@@ -14,17 +14,14 @@ network_check
update_os update_os
fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes" "tarball" fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes" "tarball"
USE_UVX="YES" setup_uv PYTHON_VERSION="3.13" setup_uv
NODE_VERSION="24" setup_nodejs NODE_VERSION="24" setup_nodejs
msg_info "Setting up Flatnotes" msg_info "Setting up Flatnotes"
cd /opt/flatnotes cd /opt/flatnotes
sed -i 's/^name = ""$/name = "flatnotes"/' pyproject.toml $STD uv sync --locked --no-dev
$STD /usr/local/bin/uvx migrate-to-uv
$STD /usr/local/bin/uv sync
mkdir -p /opt/flatnotes/data mkdir -p /opt/flatnotes/data
cd /opt/flatnotes/client $STD npm ci
$STD npm install
$STD npm run build $STD npm run build
cat <<EOF >/opt/flatnotes/.env cat <<EOF >/opt/flatnotes/.env

View File

@@ -64,7 +64,7 @@ RestartSec=1
User=root User=root
WorkingDirectory=/opt/homepage/ WorkingDirectory=/opt/homepage/
Environment=CI=true Environment=CI=true
ExecStart=pnpm start ExecStart=/opt/homepage/node_modules/.bin/next start
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target

View File

@@ -353,7 +353,7 @@ ML_DIR="${APP_DIR}/machine-learning"
GEO_DIR="${INSTALL_DIR}/geodata" GEO_DIR="${INSTALL_DIR}/geodata"
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache} mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
fetch_and_deploy_gh_release "Immich" "immich-app/immich" "tarball" "v3.1.0" "$SRC_DIR" fetch_and_deploy_gh_release "Immich" "immich-app/immich" "tarball" "v3.2.0" "$SRC_DIR"
PNPM_VERSION="$(jq -r '.packageManager | split("@")[1] | split("+")[0]' ${SRC_DIR}/package.json)" PNPM_VERSION="$(jq -r '.packageManager | split("@")[1] | split("+")[0]' ${SRC_DIR}/package.json)"
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
@@ -370,11 +370,10 @@ export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
export CI=1 export CI=1
# server build # server build
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
$STD pnpm --filter @immich/sdk --filter @immich/plugin-sdk --filter immich build $STD pnpm --filter @immich/sdk --filter @immich/plugin-sdk --filter immich build
unset SHARP_IGNORE_GLOBAL_LIBVIPS
export SHARP_FORCE_GLOBAL_LIBVIPS=true
$STD pnpm --filter immich --prod --no-optional deploy "$APP_DIR" $STD pnpm --filter immich --prod --no-optional deploy "$APP_DIR"
export SHARP_FORCE_GLOBAL_LIBVIPS=true
$STD pnpm --dir "$APP_DIR/node_modules/sharp" exec npm run build
# Patch helmet.json: disable upgrade-insecure-requests for HTTP access # Patch helmet.json: disable upgrade-insecure-requests for HTTP access
if [[ -f "$APP_DIR/helmet.json" ]]; then if [[ -f "$APP_DIR/helmet.json" ]]; then
@@ -388,7 +387,6 @@ sed -i "s|^start|${APP_DIR}/bin/start|" "$APP_DIR"/bin/immich-admin
cd "$SRC_DIR" cd "$SRC_DIR"
echo "packageImportMethod: hardlink" >>./pnpm-workspace.yaml echo "packageImportMethod: hardlink" >>./pnpm-workspace.yaml
unset SHARP_FORCE_GLOBAL_LIBVIPS unset SHARP_FORCE_GLOBAL_LIBVIPS
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
$STD pnpm --filter @immich/sdk --filter immich-web --filter @immich/cli build $STD pnpm --filter @immich/sdk --filter immich-web --filter @immich/cli build
$STD pnpm --filter @immich/cli --prod --no-optional deploy "$APP_DIR"/cli $STD pnpm --filter @immich/cli --prod --no-optional deploy "$APP_DIR"/cli
cp -a web/build "$APP_DIR"/www cp -a web/build "$APP_DIR"/www

View File

@@ -28,7 +28,7 @@ if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then
exit 10 exit 10
fi fi
NODE_VERSION="24" setup_nodejs NODE_VERSION="26" NPM_VERSION="11" setup_nodejs
msg_info "Installing ioBroker (Patience)" msg_info "Installing ioBroker (Patience)"
$STD bash <(curl -fsSL https://iobroker.net/install.sh) $STD bash <(curl -fsSL https://iobroker.net/install.sh)

View File

@@ -33,7 +33,7 @@ setup_deb822_repo \
msg_ok "Set up Jellyfin Repository" msg_ok "Set up Jellyfin Repository"
msg_info "Installing Jellyfin" msg_info "Installing Jellyfin"
ensure_dependencies jellyfin jellyfin-ffmpeg7 ensure_dependencies jellyfin jellyfin-ffmpeg8
ln -sf /usr/lib/jellyfin-ffmpeg/ffmpeg /usr/bin/ffmpeg ln -sf /usr/lib/jellyfin-ffmpeg/ffmpeg /usr/bin/ffmpeg
ln -sf /usr/lib/jellyfin-ffmpeg/ffprobe /usr/bin/ffprobe ln -sf /usr/lib/jellyfin-ffmpeg/ffprobe /usr/bin/ffprobe
msg_ok "Installed Jellyfin" msg_ok "Installed Jellyfin"

131
install/journiv-install.sh Normal file
View File

@@ -0,0 +1,131 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/journiv/journiv-app
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y \
build-essential \
libffi-dev \
libpq-dev \
libmagic1 \
libheif1 \
libde265-0 \
libpango-1.0-0 \
libpangoft2-1.0-0 \
redis-server
systemctl enable -q --now redis-server
msg_ok "Installed Dependencies"
setup_ffmpeg
PG_VERSION="17" setup_postgresql
PG_DB_NAME="journiv" PG_DB_USER="journiv" setup_postgresql_db
UV_PYTHON="3.12" setup_uv
fetch_and_deploy_gh_release "journiv" "journiv/journiv-app" "tarball"
msg_info "Setting up Python Environment"
cd /opt/journiv
$STD uv sync --locked --no-editable --no-install-project
msg_ok "Set up Python Environment"
msg_info "Configuring Journiv"
mkdir -p /opt/journiv_data/{media,logs,exports,imports/temp}
cat <<EOF >/opt/journiv.env
ENVIRONMENT=production
SECRET_KEY=$(openssl rand -hex 32)
DB_DRIVER=postgres
DATABASE_URL=postgresql://journiv:${PG_DB_PASS}@localhost:5432/journiv
REDIS_URL=redis://127.0.0.1:6379/0
MEDIA_ROOT=/opt/journiv_data/media
LOG_DIR=/opt/journiv_data/logs
EXPORT_DIR=/opt/journiv_data/exports
IMPORT_TEMP_DIR=/opt/journiv_data/imports/temp
DOMAIN_NAME=${LOCAL_IP}
DOMAIN_SCHEME=http
PYTHONPATH=/opt/journiv
EOF
chmod 600 /opt/journiv.env
msg_ok "Configured Journiv"
msg_info "Initializing Database"
set -a
source /opt/journiv.env
set +a
$STD /opt/journiv/.venv/bin/python -c "from alembic.config import main; main(['upgrade', 'head'])"
SKIP_DATA_SEEDING=false $STD /opt/journiv/.venv/bin/python -c "from app.core.database import seed_initial_data; seed_initial_data()"
msg_ok "Initialized Database"
msg_info "Creating Services"
cat <<EOF >/etc/systemd/system/journiv.service
[Unit]
Description=Journiv
Wants=network-online.target
After=network-online.target postgresql.service redis-server.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/journiv
EnvironmentFile=/opt/journiv.env
ExecStart=/opt/journiv/.venv/bin/python -m gunicorn app.main:app -w 2 -k uvicorn.workers.UvicornWorker --timeout 300 -b 0.0.0.0:8000
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/journiv-worker.service
[Unit]
Description=Journiv Celery Worker
Wants=network-online.target
After=network-online.target journiv.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/journiv
EnvironmentFile=/opt/journiv.env
ExecStart=/opt/journiv/.venv/bin/python -m celery -A app.core.celery_app worker --loglevel=info
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/journiv-beat.service
[Unit]
Description=Journiv Celery Beat
Wants=network-online.target
After=network-online.target journiv.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/journiv
EnvironmentFile=/opt/journiv.env
ExecStart=/opt/journiv/.venv/bin/python -m celery -A app.core.celery_app beat --loglevel=info --scheduler redbeat.RedBeatScheduler --pidfile=/run/journiv-beat.pid
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now journiv journiv-worker journiv-beat
msg_ok "Created Services"
motd_ssh
customize
cleanup_lxc

View File

@@ -22,7 +22,7 @@ PG_DB_NAME="kaneo" PG_DB_USER="kaneo" setup_postgresql_db
fetch_and_deploy_gh_release "kaneo" "usekaneo/kaneo" "tarball" fetch_and_deploy_gh_release "kaneo" "usekaneo/kaneo" "tarball"
PNPM_VERSION=$(sed -n 's/.*"packageManager": "pnpm@\([^"+]*\).*/\1/p' /opt/kaneo/package.json) PNPM_VERSION=$(sed -n 's/.*"packageManager": "pnpm@\([^"+]*\).*/\1/p' /opt/kaneo/package.json)
NODE_VERSION="22" NODE_MODULE="pnpm@${PNPM_VERSION:-10.32.1}" setup_nodejs NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION:-10.32.1}" setup_nodejs
msg_info "Configuring Kaneo" msg_info "Configuring Kaneo"
cat <<EOF >/opt/kaneo/.env cat <<EOF >/opt/kaneo/.env

View File

@@ -0,0 +1,83 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/lingarr-translate/lingarr
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
PG_VERSION="17" setup_postgresql
PG_DB_NAME="lingarr" PG_DB_USER="lingarr" setup_postgresql_db
NODE_VERSION="24" setup_nodejs
DOTNET_VERSION="10" DOTNET_TYPE="sdk" setup_dotnet
fetch_and_deploy_gh_release "lingarr" "lingarr-translate/lingarr" "tarball"
msg_info "Building Lingarr (Patience)"
cd /opt/lingarr/Lingarr.Client
$STD npm ci
$STD npm run build
mkdir -p /opt/lingarr/Lingarr.Server/wwwroot
cp -r /opt/lingarr/Lingarr.Client/dist/* /opt/lingarr/Lingarr.Server/wwwroot/
cd /opt/lingarr
export DOTNET_CLI_TELEMETRY_OPTOUT=1
$STD dotnet publish ./Lingarr.Server/Lingarr.Server.csproj -c Release -o /opt/lingarr_app /p:UseAppHost=false /p:Version="$(cat ~/.lingarr)"
msg_ok "Built Lingarr"
msg_info "Configuring Lingarr"
mkdir -p /opt/lingarr_data/{config,plugins}
cat <<EOF >/opt/lingarr.env
ASPNETCORE_ENVIRONMENT=Production
ASPNETCORE_URLS=http://+:9876
ASPNETCORE_HTTP_PORTS=9876
DB_CONNECTION=postgresql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=lingarr
DB_USERNAME=lingarr
DB_PASSWORD=${PG_DB_PASS}
PLUGINS_PATH=/opt/lingarr_data/plugins
DOTNET_CLI_TELEMETRY_OPTOUT=1
# Translation backend. Alternatives: openai, deepl, anthropic, gemini, localai
SERVICE_TYPE=libretranslate
LIBRE_TRANSLATE_URL=http://CHANGE_ME:5000
EOF
chmod 600 /opt/lingarr.env
msg_ok "Configured Lingarr"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/lingarr.service
[Unit]
Description=Lingarr
Wants=network-online.target
After=network-online.target postgresql.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/lingarr_app
EnvironmentFile=/opt/lingarr.env
ExecStart=/usr/bin/dotnet /opt/lingarr_app/Lingarr.Server.dll
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now lingarr
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc

86
install/logseq-install.sh Normal file
View File

@@ -0,0 +1,86 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://logseq.com/
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 \
git \
nginx \
build-essential \
libcairo2-dev \
libpango1.0-dev \
libjpeg-dev \
libgif-dev \
librsvg2-dev
msg_ok "Installed Dependencies"
NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs
JAVA_VERSION="21" setup_java
msg_info "Installing Clojure CLI"
cd /tmp
curl_download "linux-install.sh" "https://github.com/clojure/brew-install/releases/latest/download/linux-install.sh"
$STD bash linux-install.sh
rm -f linux-install.sh
msg_ok "Installed Clojure CLI"
fetch_and_deploy_gh_release "logseq" "logseq/logseq" "tarball"
msg_info "Building Logseq Web App (Patience)"
cd /opt/logseq
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
export NODE_OPTIONS="--max-old-space-size=4096"
export JAVA_TOOL_OPTIONS="-Xmx4g"
$STD corepack enable
$STD pnpm install --config.network-timeout=240000
$STD pnpm release
msg_ok "Built Logseq Web App"
msg_info "Generating Self-Signed Certificate"
create_self_signed_cert "logseq"
msg_ok "Generated Self-Signed Certificate"
msg_info "Configuring Nginx"
cat <<'EOF' >/etc/nginx/sites-available/logseq
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl default_server;
http2 on;
server_name _;
ssl_certificate /etc/ssl/logseq/logseq.crt;
ssl_certificate_key /etc/ssl/logseq/logseq.key;
root /opt/logseq/static;
index index.html;
add_header Cross-Origin-Opener-Policy same-origin always;
add_header Cross-Origin-Embedder-Policy require-corp always;
location / {
try_files $uri $uri/ /index.html;
}
}
EOF
nginx_enable_site logseq
msg_ok "Configured Nginx"
motd_ssh
customize
cleanup_lxc

View File

@@ -0,0 +1,80 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/RiDDiX/home-assistant-matter-hub
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
NODE_VERSION="24" NODE_MODULE="pnpm@^10" setup_nodejs
fetch_and_deploy_gh_release "matter-hub" "RiDDiX/home-assistant-matter-hub" "tarball"
msg_info "Building Matter Hub"
cd /opt/matter-hub
MATTER_HUB_VERSION=$(cat ~/.matter-hub)
$STD pnpm install --frozen-lockfile
$STD pnpm run release:version "$MATTER_HUB_VERSION"
APP_VERSION="$MATTER_HUB_VERSION" $STD pnpm build
msg_ok "Built Matter Hub"
msg_info "Installing Matter Hub"
mkdir -p /opt/matter-hub_app
cat <<EOF >/opt/matter-hub_app/package.json
{
"name": "hamh-wrapper",
"version": "0.0.0",
"private": true,
"dependencies": {
"home-assistant-matter-hub": "file:/opt/matter-hub/apps/home-assistant-matter-hub/package.tgz"
}
}
EOF
cd /opt/matter-hub_app
$STD npm install --omit=dev --no-audit --no-fund
msg_ok "Installed Matter Hub"
msg_info "Configuring Matter Hub"
mkdir -p /opt/matter-hub_data
cat <<EOF >/opt/matter-hub.env
HAMH_HOME_ASSISTANT_URL=http://CHANGE_ME:8123/
HAMH_HOME_ASSISTANT_ACCESS_TOKEN=CHANGE_ME
HAMH_HTTP_PORT=8482
HAMH_LOG_LEVEL=info
APP_VERSION=${MATTER_HUB_VERSION}
EOF
chmod 600 /opt/matter-hub.env
msg_ok "Configured Matter Hub"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/matter-hub.service
[Unit]
Description=Home Assistant Matter Hub
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/matter-hub_data
EnvironmentFile=/opt/matter-hub.env
ExecStart=/opt/matter-hub_app/node_modules/.bin/home-assistant-matter-hub start --storage-location=/opt/matter-hub_data
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now matter-hub
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc

View File

@@ -28,7 +28,31 @@ fi
if ! dpkg -l | grep -q 'libssl1.1'; then if ! dpkg -l | grep -q 'libssl1.1'; then
msg_info "Installing libssl (if needed)" msg_info "Installing libssl (if needed)"
curl_download "/tmp/libssl.deb" "https://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.1_1.1.1w-0+deb11u8_$(arch_resolve).deb" # libssl1.1 is bullseye's last build, and the pinned filename rotted twice over:
# the point release moves on its own schedule, and bullseye left
# security.debian.org when its LTS ended. Take the newest build from whichever
# pool still carries one instead of hardcoding a name.
LIBSSL_ARCH=$(arch_resolve)
LIBSSL_URL=""
LIBSSL_DEB=""
for POOL in \
"https://security.debian.org/debian-security/pool/updates/main/o/openssl" \
"https://archive.debian.org/debian-security/pool/updates/main/o/openssl" \
"https://archive.debian.org/debian/pool/main/o/openssl"; do
FOUND=$(curl -fsSL "$POOL/" | grep -oE "libssl1\.1_[^\"<>]+_${LIBSSL_ARCH}\.deb" | sort -V | tail -n1 || true)
[[ -z "$FOUND" ]] && continue
# Newest across every pool, not the first hit: the security archive still
# only carries buster, whose 1.1.1n is older than bullseye's 1.1.1w.
if [[ -z "$LIBSSL_DEB" || "$(printf '%s\n%s\n' "$LIBSSL_DEB" "$FOUND" | sort -V | tail -n1)" == "$FOUND" ]]; then
LIBSSL_DEB="$FOUND"
LIBSSL_URL="$POOL/$FOUND"
fi
done
if [[ -z "$LIBSSL_URL" ]]; then
msg_error "No libssl1.1 package for ${LIBSSL_ARCH} found in any Debian pool"
exit 1
fi
curl_download "/tmp/libssl.deb" "$LIBSSL_URL"
$STD dpkg -i /tmp/libssl.deb $STD dpkg -i /tmp/libssl.deb
rm -f /tmp/libssl.deb rm -f /tmp/libssl.deb
msg_ok "Installed libssl1.1" msg_ok "Installed libssl1.1"

View File

@@ -0,0 +1,138 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: Hai Tran (epiHATR)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://onetimesecret.com/ | Github: https://github.com/onetimesecret/onetimesecret
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y \
build-essential \
git \
libffi-dev \
libgmp-dev \
libpq-dev \
libreadline-dev \
libsodium23 \
libsqlite3-dev \
libssl-dev \
libxml2-dev \
libxslt1-dev \
libyaml-dev \
nginx \
pkg-config \
python3 \
redis-server \
zlib1g-dev
msg_ok "Installed Dependencies"
fetch_and_deploy_gh_release "onetimesecret" "onetimesecret/onetimesecret" "tarball"
RUBY_VERSION=$(tr -d ' \n' </opt/onetimesecret/.ruby-version 2>/dev/null)
RUBY_VERSION="${RUBY_VERSION:-3.4.10}" setup_ruby
PNPM_VERSION=$(sed -n 's/.*"packageManager": "pnpm@\([^"]*\)".*/\1/p' /opt/onetimesecret/package.json)
NODE_VERSION=$(tr -d ' \n' </opt/onetimesecret/.nvmrc 2>/dev/null)
NODE_VERSION="${NODE_VERSION:-25}" NODE_MODULE="pnpm@${PNPM_VERSION:-11.1.2}" setup_nodejs
HOST_VALUE="${OTS_HOST:-$LOCAL_IP}"
SSL_VALUE="${OTS_SSL:-false}"
case "${SSL_VALUE,,}" in
1 | true | yes | on) SSL_VALUE="true" ;;
0 | false | no | off | "") SSL_VALUE="false" ;;
*)
msg_error "Invalid OTS_SSL value '${OTS_SSL}' (use true/false)"
exit 1
;;
esac
msg_info "Configuring Application"
systemctl enable -q --now redis-server
cd /opt/onetimesecret
$STD bash bin/setup init
sed -i \
-e "s|^REDIS_URL=.*|REDIS_URL=redis://127.0.0.1:6379/0|" \
-e "s|^HOST=.*|HOST=${HOST_VALUE//&/\\&}|" \
-e "s|^SSL=.*|SSL=${SSL_VALUE}|" \
/opt/onetimesecret/.env
if grep -q '^RACK_ENV=' /opt/onetimesecret/.env; then
sed -i 's|^RACK_ENV=.*|RACK_ENV=production|' /opt/onetimesecret/.env
else
echo "RACK_ENV=production" >>/opt/onetimesecret/.env
fi
if grep -q '^AUTHENTICATION_MODE=' /opt/onetimesecret/.env; then
sed -i 's|^AUTHENTICATION_MODE=.*|AUTHENTICATION_MODE=simple|' /opt/onetimesecret/.env
else
echo "AUTHENTICATION_MODE=simple" >>/opt/onetimesecret/.env
fi
if ! grep -q '^PORT=' /opt/onetimesecret/.env; then
echo "PORT=3000" >>/opt/onetimesecret/.env
fi
chmod 600 /opt/onetimesecret/.env
mkdir -p /opt/onetimesecret/tmp/pids /opt/onetimesecret/log
msg_ok "Configured Application"
msg_info "Reconciling Application"
cd /opt/onetimesecret
$STD bash bin/setup reconcile
msg_ok "Reconciled Application"
msg_info "Building Frontend"
cd /opt/onetimesecret
$STD pnpm run build
msg_ok "Built Frontend"
msg_info "Creating Service"
cat <<'EOF' >/etc/systemd/system/onetimesecret.service
[Unit]
Description=Onetime Secret Service
After=network.target redis-server.service
Requires=redis-server.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/onetimesecret
Environment=HOME=/root
Environment=PATH=/root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
EnvironmentFile=/opt/onetimesecret/.env
ExecStart=/root/.rbenv/shims/bundle exec puma -C etc/puma.rb
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now onetimesecret
msg_ok "Created Service"
msg_info "Configuring Nginx"
cat <<'EOF' >/etc/nginx/sites-available/onetimesecret
server {
listen 80 default_server;
server_name _;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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
nginx_enable_site onetimesecret
msg_ok "Configured Nginx"
motd_ssh
customize
cleanup_lxc

View File

@@ -23,6 +23,7 @@ msg_ok "Installed Dependencies"
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
PG_VERSION="17" setup_postgresql PG_VERSION="17" setup_postgresql
PG_DB_NAME="paperclip" PG_DB_USER="paperclip" setup_postgresql_db PG_DB_NAME="paperclip" PG_DB_USER="paperclip" setup_postgresql_db
setup_rust
fetch_and_deploy_gh_release "paperclip-ai" "paperclipai/paperclip" "tarball" fetch_and_deploy_gh_release "paperclip-ai" "paperclipai/paperclip" "tarball"

View File

@@ -0,0 +1,163 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://portabase.io
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y \
build-essential \
git \
nginx
msg_ok "Installed Dependencies"
NODE_VERSION="22" NODE_MODULE="pnpm@11.8.0" setup_nodejs
PG_VERSION="17" setup_postgresql
PG_DB_NAME="portabase" PG_DB_USER="portabase" setup_postgresql_db
fetch_and_deploy_gh_release "portabase" "Portabase/portabase" "tarball"
fetch_and_deploy_gh_release "tusd" "tus/tusd" "prebuild" "latest" "/opt/tusd" "tusd_linux_$(arch_resolve).tar.gz"
msg_info "Configuring Portabase"
mkdir -p /opt/portabase-data/uploads/tmp
mv -f "/opt/tusd/tusd_linux_$(arch_resolve)/tusd" /opt/tusd/tusd
rm -rf "/opt/tusd/tusd_linux_$(arch_resolve)"
chmod +x /opt/tusd/tusd
PROJECT_SECRET=$(openssl rand -hex 32)
ADMIN_PASSWORD=$(openssl rand -base64 18 | tr -dc 'A-Za-z0-9' | head -c 16)
cat <<EOF >/opt/portabase/.env
LOG_LEVEL=info
DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME}
PROJECT_NAME=Portabase
PROJECT_URL=http://${LOCAL_IP}:3000
PROJECT_SECRET=${PROJECT_SECRET}
TRUSTED_DOMAINS=http://${LOCAL_IP}:3000
PRIVATE_PATH=/opt/portabase-data
AUTH_DEFAULT_USER_NAME=Portabase Admin
AUTH_DEFAULT_USER=admin@example.com
AUTH_DEFAULT_PASSWORD=${ADMIN_PASSWORD}
AUTH_EMAIL_PASSWORD_ENABLED=true
AUTH_SIGNUP_ENABLED=true
RETENTION_CRON=0 7 * * *
TUSD_BEHIND_PROXY=true
TELEMETRY=false
EOF
cat <<EOF >~/portabase.creds
Portabase Admin
Username: admin@example.com
Password: ${ADMIN_PASSWORD}
EOF
msg_ok "Configured Portabase"
msg_info "Building Portabase"
cd /opt/portabase
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
export NEXT_TELEMETRY_DISABLED=1
$STD pnpm install --frozen-lockfile
$STD pnpm run build
cp -r /opt/portabase/.next/static /opt/portabase/.next/standalone/.next/static
cp -r /opt/portabase/public /opt/portabase/.next/standalone/public
mkdir -p /opt/portabase/.next/standalone/src/db
cp -r /opt/portabase/src/db/migrations /opt/portabase/.next/standalone/src/db/migrations
ln -sf /opt/portabase/.env /opt/portabase/.next/standalone/.env
msg_ok "Built Portabase"
msg_info "Creating Services"
cat <<EOF >/etc/systemd/system/portabase-tusd.service
[Unit]
Description=Portabase tusd Upload Server
After=network.target
Before=portabase.service
[Service]
Type=simple
ExecStart=/opt/tusd/tusd --base-path /tus/files/ --upload-dir /opt/portabase-data/uploads/tmp --hooks-http http://127.0.0.1:8887/api/tus/hooks --port 1080 --max-size 21474836480 --behind-proxy
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/portabase.service
[Unit]
Description=Portabase
After=network.target postgresql.service portabase-tusd.service
Wants=postgresql.service
[Service]
Type=simple
WorkingDirectory=/opt/portabase/.next/standalone
Environment=NODE_ENV=production
Environment=PORT=8887
Environment=HOSTNAME=127.0.0.1
ExecStart=/usr/bin/node /opt/portabase/.next/standalone/server.js
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now portabase-tusd portabase
msg_ok "Created Services"
msg_info "Configuring Nginx"
cat <<'EOF' >/etc/nginx/sites-available/portabase
map $http_x_forwarded_proto $forwarded_proto {
default $scheme;
"~*^\s*(https?)\s*(?:,|$)" $1;
}
server {
listen 3000;
server_name _;
client_max_body_size 20G;
ignore_invalid_headers off;
location /tus/ {
proxy_pass http://127.0.0.1:1080/tus/;
proxy_pass_request_headers on;
proxy_request_buffering off;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $forwarded_proto;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location = /api/tus/hooks {
deny all;
return 404;
}
location / {
proxy_pass http://127.0.0.1:8887;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $forwarded_proto;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
EOF
nginx_enable_site portabase
msg_ok "Configured Nginx"
motd_ssh
customize
cleanup_lxc

View File

@@ -0,0 +1,226 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: renizmy
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/safebucket/safebucket
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 awscli
msg_ok "Installed Dependencies"
msg_info "Installing Garage"
useradd --system --no-create-home --shell /usr/sbin/nologin garage 2>/dev/null || true
GARAGE_VERSION=$(get_latest_gh_tag "deuxfleurs-org/garage" "v")
if [[ -z "$GARAGE_VERSION" ]]; then
msg_error "Could not determine latest stable Garage version"
exit 1
fi
curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GARAGE_VERSION}/$(arch_resolve "x86_64-unknown-linux-musl" "aarch64-unknown-linux-musl")/garage" -o /usr/local/bin/garage
chmod +x /usr/local/bin/garage
mkdir -p /opt/garage/{data,meta}
RPC_SECRET=$(openssl rand -hex 32)
ADMIN_TOKEN=$(openssl rand -base64 32)
cat <<EOF >/opt/garage/garage.toml
metadata_dir = "/opt/garage/meta"
data_dir = "/opt/garage/data"
db_engine = "lmdb"
replication_factor = 1
rpc_bind_addr = "[::]:3901"
rpc_public_addr = "127.0.0.1:3901"
rpc_secret = "${RPC_SECRET}"
[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
root_domain = ".s3.garage.localhost"
[admin]
api_bind_addr = "[::]:3903"
admin_token = "${ADMIN_TOKEN}"
EOF
chmod 600 /opt/garage/garage.toml
chown -R garage:garage /opt/garage
cat <<EOF >/etc/systemd/system/garage.service
[Unit]
Description=Garage Object Storage
After=network.target
[Service]
Type=simple
User=garage
Group=garage
WorkingDirectory=/opt/garage
ExecStart=/usr/local/bin/garage -c /opt/garage/garage.toml server
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now garage
msg_ok "Installed Garage"
msg_info "Configuring Garage Bucket"
RETRIES=0
until garage -c /opt/garage/garage.toml status &>/dev/null; do
RETRIES=$((RETRIES + 1))
if [[ $RETRIES -ge 60 ]]; then
msg_error "Garage did not become ready within 60 seconds"
exit 1
fi
sleep 1
done
NODE_ID=$(garage -c /opt/garage/garage.toml status 2>/dev/null | awk '/^[0-9a-f]/{print $1; exit}')
if [[ -z "$NODE_ID" ]]; then
msg_error "Could not determine Garage node ID from cluster status"
exit 1
fi
GARAGE_CAPACITY="${GARAGE_CAPACITY:-$(df -BG --output=avail /opt/garage | awk 'NR==2{gsub(/G/,"",$1); v=$1-1; print (v<1?1:v)"G"}')}"
$STD garage -c /opt/garage/garage.toml layout assign -z dc1 -c "${GARAGE_CAPACITY}" "${NODE_ID}"
$STD garage -c /opt/garage/garage.toml layout apply --version 1
GARAGE_KEY_INFO=$(garage -c /opt/garage/garage.toml key create safebucket-key)
GARAGE_ACCESS_KEY=$(echo "$GARAGE_KEY_INFO" | awk '/Key ID:/{print $3}')
GARAGE_SECRET_KEY=$(echo "$GARAGE_KEY_INFO" | awk '/Secret key:/{print $3}')
$STD garage -c /opt/garage/garage.toml bucket create safebucket
$STD garage -c /opt/garage/garage.toml bucket allow --read --write --owner safebucket --key safebucket-key
msg_ok "Configured Garage Bucket"
msg_info "Applying CORS Policy to Bucket"
export AWS_ACCESS_KEY_ID="${GARAGE_ACCESS_KEY}"
export AWS_SECRET_ACCESS_KEY="${GARAGE_SECRET_KEY}"
export AWS_DEFAULT_REGION="garage"
if aws s3api put-bucket-cors \
--bucket safebucket \
--endpoint-url "http://127.0.0.1:3900" \
--cors-configuration '{"CORSRules":[{"AllowedHeaders":["*"],"AllowedMethods":["GET","PUT","POST","DELETE","HEAD"],"AllowedOrigins":["http://'"${LOCAL_IP}"':8080"],"ExposeHeaders":["ETag"]}]}' &>/dev/null; then
msg_ok "Applied CORS Policy to Bucket"
else
msg_warn "Could not apply CORS policy automatically; direct browser uploads may fail until CORS is configured manually"
fi
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION
fetch_and_deploy_gh_release "safebucket" "safebucket/safebucket" "singlefile" "latest" "/opt/safebucket" "safebucket-linux-$(arch_resolve)"
msg_info "Configuring Safebucket"
useradd --system --no-create-home --shell /usr/sbin/nologin safebucket 2>/dev/null || true
mkdir -p /opt/safebucket/data/{notifications,activity}
TOKEN_SECRET=$(openssl rand -base64 32)
MFA_KEY=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | cut -c1-32)
ADMIN_PASSWORD=$(openssl rand -hex 12)
cat <<EOF >/opt/safebucket/config.yaml
app:
profile: default
log_level: info
api_url: http://${LOCAL_IP}:8080
web_url: http://${LOCAL_IP}:8080
allowed_origins:
- http://${LOCAL_IP}:8080
port: 8080
token_secret: "${TOKEN_SECRET}"
mfa_encryption_key: "${MFA_KEY}"
mfa_required: false
admin_email: admin@safebucket.io
admin_password: "${ADMIN_PASSWORD}"
trash_retention_days: 7
max_upload_size: 5368709120
trusted_proxies:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
- 127.0.0.0/8
- ::1/128
- fc00::/7
static_files:
enabled: true
database:
type: sqlite
sqlite:
path: /opt/safebucket/data/safebucket.db
cache:
type: memory
storage:
type: s3
s3:
bucket_name: safebucket
endpoint: 127.0.0.1:3900
external_endpoint: http://${LOCAL_IP}:3900
access_key: ${GARAGE_ACCESS_KEY}
secret_key: ${GARAGE_SECRET_KEY}
region: garage
force_path_style: true
use_tls: false
events:
type: memory
queues:
notifications:
name: safebucket-notifications
object_deletion:
name: safebucket-object-deletion
bucket_events:
name: safebucket-bucket-events
notifier:
type: filesystem
filesystem:
directory: /opt/safebucket/data/notifications
activity:
type: filesystem
filesystem:
directory: /opt/safebucket/data/activity
auth:
providers:
local:
name: local
type: local
sharing:
allowed: true
domains: []
EOF
chmod 600 /opt/safebucket/config.yaml
chown -R safebucket:safebucket /opt/safebucket
msg_ok "Configured Safebucket"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/safebucket.service
[Unit]
Description=Safebucket File Sharing Platform
After=network-online.target garage.service
Wants=network-online.target
Requires=garage.service
[Service]
Type=simple
User=safebucket
Group=safebucket
WorkingDirectory=/opt/safebucket
Environment=CONFIG_FILE_PATH=/opt/safebucket/config.yaml
ExecStart=/opt/safebucket/safebucket
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now safebucket
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc

46
install/stash-install.sh Normal file
View File

@@ -0,0 +1,46 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/stashapp/stash
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
setup_ffmpeg
setup_hwaccel
fetch_and_deploy_gh_release "stash" "stashapp/stash" "singlefile" "latest" "/opt/stash" "$(arch_resolve stash-linux stash-linux-arm64v8)"
msg_info "Creating Service"
mkdir -p /opt/stash_data
cat <<EOF >/etc/systemd/system/stash.service
[Unit]
Description=Stash
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/stash
Environment=STASH_CONFIG_FILE=/opt/stash_data/config.yml
ExecStart=/opt/stash/stash
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now stash
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc

View File

@@ -0,0 +1,51 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: angusmaul
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/Whisparr/Whisparr-Eros
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 sqlite3 libicu-dev
msg_ok "Installed Dependencies"
fetch_and_deploy_gh_release "whisparr-eros" "Whisparr/Whisparr-Eros" "prebuild" "latest" "/opt/Whisparr-Eros" "Whisparr.eros.*.linux-$(arch_resolve "x64" "arm64").tar.gz"
msg_info "Configuring Whisparr-Eros"
rm -rf /opt/Whisparr-Eros/Whisparr.Update
chmod +x /opt/Whisparr-Eros/Whisparr
mkdir -p /var/lib/whisparr-eros/
chmod 775 /var/lib/whisparr-eros/ /opt/Whisparr-Eros/
msg_ok "Configured Whisparr-Eros"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/whisparr-eros.service
[Unit]
Description=Whisparr-Eros Daemon
After=syslog.target network.target
[Service]
UMask=0002
Type=simple
ExecStart=/opt/Whisparr-Eros/Whisparr -nobrowser -data=/var/lib/whisparr-eros/
TimeoutStopSec=20
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now whisparr-eros
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc

View File

@@ -15,6 +15,11 @@
[[ -n "${_CORE_FUNC_LOADED:-}" ]] && return [[ -n "${_CORE_FUNC_LOADED:-}" ]] && return
_CORE_FUNC_LOADED=1 _CORE_FUNC_LOADED=1
if [[ -z "${HOME:-}" ]]; then
HOME="$(getent passwd "$(id -u)" 2>/dev/null | cut -d: -f6)"
export HOME="${HOME:-/root}"
fi
# ============================================================================== # ==============================================================================
# SECTION 1: INITIALIZATION & SETUP # SECTION 1: INITIALIZATION & SETUP
# ============================================================================== # ==============================================================================

111
tools/addon/dockhand.sh Normal file
View File

@@ -0,0 +1,111 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/Finsys/dockhand
if command -v curl >/dev/null 2>&1; then
source <(curl -fsSL ${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/core.func)
load_functions
elif command -v wget >/dev/null 2>&1; then
source <(wget -qO- ${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/core.func)
load_functions
fi
source <(curl -fsSL ${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/lib/tools.func)
color
catch_errors
APP="Dockhand"
APP_TYPE="addon"
INSTALL_PATH="/opt/dockhand"
COMPOSE_FILE="${INSTALL_PATH}/docker-compose.yaml"
DEFAULT_PORT=3000
header_info "$APP"
IP=$(_get_current_ip)
function check_docker() {
if ! command -v docker >/dev/null 2>&1; then
msg_error "Docker is not installed. This addon requires an existing Docker host/LXC. Exiting."
exit 1
fi
if ! docker compose version >/dev/null 2>&1; then
msg_error "Docker Compose plugin is not available. Install it before running this addon. Exiting."
exit 1
fi
msg_ok "Docker $(docker --version | cut -d' ' -f3 | tr -d ',') and Docker Compose are available"
}
function install_dockhand() {
local port="${1:-$DEFAULT_PORT}"
check_docker
msg_info "Creating Compose Project"
mkdir -p "$INSTALL_PATH"
cat <<EOF >"$COMPOSE_FILE"
services:
dockhand:
image: fnsys/dockhand:latest
container_name: dockhand
restart: unless-stopped
ports:
- ${port}:3000
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- dockhand_data:/app/data
volumes:
dockhand_data:
EOF
msg_ok "Created Compose Project"
msg_info "Starting ${APP}"
cd "$INSTALL_PATH"
$STD docker compose up -d
msg_ok "Started ${APP}"
msg_ok "${APP} is reachable at http://${IP}:${port}"
echo -e "${TAB}Open the URL and complete the first-run setup wizard to create the admin account."
}
function update_dockhand() {
msg_info "Pulling latest ${APP} image"
cd "$INSTALL_PATH"
$STD docker compose pull
msg_ok "Pulled latest image"
msg_info "Restarting ${APP}"
$STD docker compose up -d --remove-orphans
msg_ok "Restarted ${APP}"
msg_ok "${APP} updated successfully"
}
function uninstall_dockhand() {
msg_info "Removing ${APP}"
cd "$INSTALL_PATH"
$STD docker compose down --remove-orphans
cd /
rm -rf "$INSTALL_PATH"
msg_ok "${APP} uninstalled (the dockhand_data volume was kept; remove it with: docker volume rm dockhand_data)"
}
if [[ -f "$COMPOSE_FILE" ]]; then
read -r -p "Update (1), Uninstall (2), Cancel (3)? [1/2/3]: " action
action="${action//[[:space:]]/}"
case "$action" in
1) update_dockhand ;;
2) uninstall_dockhand ;;
3) msg_info "Cancelled" ;;
*) msg_error "Invalid input" ;;
esac
else
read -r -p "Enter port number (default: ${DEFAULT_PORT}): " PORT_INPUT
PORT="${PORT_INPUT:-$DEFAULT_PORT}"
read -r -p "Install ${APP}? (y/n): " answer
answer="${answer//[[:space:]]/}"
[[ "${answer,,}" =~ ^(y|yes)$ ]] && install_dockhand "$PORT" || msg_info "Installation skipped"
fi

189
tools/pve/guest-delete.sh Normal file
View File

@@ -0,0 +1,189 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
____ ______ __ ____ __ __
/ __ \_________ _ ______ ___ ____ _ __ / ____/_ _____ _____/ /_ / __ \___ / /__ / /____
/ /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/ / / __/ / / / _ \/ ___/ __/ / / / / _ \/ / _ \/ __/ _ \
/ ____/ / / /_/ /> </ / / / / / /_/ /> < / /_/ / /_/ / __(__ ) /_ / /_/ / __/ / __/ /_/ __/
/_/ /_/ \____/_/|_/_/ /_/ /_/\____/_/|_| \____/\__,_/\___/____/\__/ /_____/\___/_/\___/\__/\___/
EOF
}
spinner() {
local pid=$1
local delay=0.1
local spinstr='|/-\'
while ps -p $pid >/dev/null; do
printf " [%c] " "$spinstr"
spinstr=${spinstr#?}${spinstr%"${spinstr#?}"}
sleep $delay
printf "\r"
done
printf " \r"
}
set -eEuo pipefail
YW=$(echo "\033[33m")
BL=$(echo "\033[36m")
RD=$(echo "\033[01;31m")
GN=$(echo "\033[1;92m")
CL=$(echo "\033[m")
TAB=" "
CM="${TAB}✔️${TAB}${CL}"
# Telemetry
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "guest-delete" "pve"
GUEST_LOG=$(mktemp)
trap 'rm -f "$GUEST_LOG"' EXIT
# pct and qm differ in both their subcommands and their list layout, so every
# guest carries its type from the menu through to the destroy call.
stop_guest() {
local type=$1 id=$2 pid
if [ "$type" == "ct" ]; then
pct stop "$id" >"$GUEST_LOG" 2>&1 &
else
qm stop "$id" >"$GUEST_LOG" 2>&1 &
fi
pid=$!
spinner "$pid"
wait "$pid" || true
}
destroy_guest() {
local type=$1 id=$2 pid
if [ "$type" == "ct" ]; then
pct destroy "$id" -f >"$GUEST_LOG" 2>&1 &
else
qm destroy "$id" --purge --destroy-unreferenced-disks >"$GUEST_LOG" 2>&1 &
fi
pid=$!
spinner "$pid"
wait "$pid"
}
header_info
echo "Loading..."
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE Guest Deletion" --yesno "This will delete LXC containers and/or VMs. Proceed?" 10 58
NODE=$(hostname)
containers=$(pct list 2>/dev/null | tail -n +2 || true)
vms=$(qm list 2>/dev/null | tail -n +2 || true)
if [ -z "$containers" ] && [ -z "$vms" ]; then
whiptail --title "Guest Delete" --msgbox "No LXC containers or VMs available!" 10 60
exit 234
fi
declare -A GUEST_TYPE=()
menu_items=()
FORMAT="%-4s %-20s %-10s"
if [ -n "$containers" ]; then
menu_items+=("ALL-CT" "$(printf "$FORMAT" "CT" "Delete ALL containers" "")" "OFF")
while read -r line; do
[ -z "$line" ] && continue
# pct list: VMID Status [Lock] Name -- Lock is usually blank, so take the
# name from the end of the row rather than a fixed column.
container_id=$(awk '{print $1}' <<<"$line")
container_status=$(awk '{print $2}' <<<"$line")
container_name=$(awk '{print $NF}' <<<"$line")
GUEST_TYPE[$container_id]="ct"
menu_items+=("$container_id" "$(printf "$FORMAT" "CT" "$container_name" "$container_status")" "OFF")
done <<<"$containers"
fi
if [ -n "$vms" ]; then
menu_items+=("ALL-VM" "$(printf "$FORMAT" "VM" "Delete ALL VMs" "")" "OFF")
while read -r line; do
[ -z "$line" ] && continue
# qm list: VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
vm_id=$(awk '{print $1}' <<<"$line")
vm_name=$(awk '{print $2}' <<<"$line")
vm_status=$(awk '{print $3}' <<<"$line")
GUEST_TYPE[$vm_id]="vm"
menu_items+=("$vm_id" "$(printf "$FORMAT" "VM" "$vm_name" "$vm_status")" "OFF")
done <<<"$vms"
fi
CHOICES=$(whiptail --title "Guest Delete" \
--checklist "Select LXC containers and VMs to delete:" 25 70 13 \
"${menu_items[@]}" 3>&2 2>&1 1>&3 || true)
if [ -z "$CHOICES" ]; then
whiptail --title "Guest Delete" \
--msgbox "No guests selected!" 10 60
exit 0
fi
read -p "Delete guests manually or automatically? (Default: manual) m/a: " DELETE_MODE
DELETE_MODE=${DELETE_MODE:-m}
# Expand the ALL entries, keeping each ID once so selecting ALL alongside a
# single guest does not try to destroy that guest twice.
expanded_ids=""
for choice in $(echo "$CHOICES" | tr -d '"' | tr -s ' ' '\n'); do
case "$choice" in
ALL-CT) expanded_ids+=$'\n'$(awk '{print $1}' <<<"$containers") ;;
ALL-VM) expanded_ids+=$'\n'$(awk '{print $1}' <<<"$vms") ;;
*) expanded_ids+=$'\n'"$choice" ;;
esac
done
selected_ids=$(echo "$expanded_ids" | sed '/^$/d' | awk '!seen[$0]++')
for guest_id in $selected_ids; do
guest_type="${GUEST_TYPE[$guest_id]:-}"
if [ -z "$guest_type" ]; then
echo -e "${BL}[Info]${RD} Skipping unknown guest $guest_id...${CL}"
continue
fi
if [ "$guest_type" == "ct" ]; then
label="container $guest_id"
else
label="VM $guest_id"
fi
if [[ "$DELETE_MODE" == "a" ]]; then
echo -e "${BL}[Info]${GN} Automatically deleting $label...${CL}"
else
read -p "Delete $label? (y/N): " CONFIRM
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
echo -e "${BL}[Info]${RD} Skipping $label...${CL}"
continue
fi
echo -e "${BL}[Info]${GN} Deleting $label...${CL}"
fi
# Stop only once the deletion is confirmed, so declining leaves a running
# guest running instead of powering it off on the way out.
if [ "$guest_type" == "ct" ]; then
status=$(pct status "$guest_id" 2>/dev/null || echo "unknown")
else
status=$(qm status "$guest_id" 2>/dev/null || echo "unknown")
fi
if [ "$status" == "status: running" ]; then
echo -e "${BL}[Info]${GN} Stopping $label...${CL}"
stop_guest "$guest_type" "$guest_id"
echo -e "${BL}[Info]${GN} ${label^} stopped.${CL}"
fi
if destroy_guest "$guest_type" "$guest_id"; then
echo -e "${CM}${GN}${label^} deleted.${CL}"
else
whiptail --title "Error" --msgbox "Failed to delete ${label}.\n\n$(tail -n 5 "$GUEST_LOG")" 15 70
fi
done
header_info
echo -e "${GN}Deletion process completed.${CL}\n"

View File

@@ -1,119 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
function header_info {
clear
cat <<"EOF"
____ __ _ ________ ____ __ __
/ __ \_________ _ ______ ___ ____ _ __ / / | |/ / ____/ / __ \___ / /__ / /____
/ /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/ / / | / / / / / / _ \/ / _ \/ __/ _ \
/ ____/ / / /_/ /> </ / / / / / /_/ /> < / /___/ / /___ / /_/ / __/ / __/ /_/ __/
/_/ /_/ \____/_/|_/_/ /_/ /_/\____/_/|_| /_____/_/|_\____/ /_____/\___/_/\___/\__/\___/
EOF
}
spinner() {
local pid=$1
local delay=0.1
local spinstr='|/-\'
while ps -p $pid >/dev/null; do
printf " [%c] " "$spinstr"
spinstr=${spinstr#?}${spinstr%"${spinstr#?}"}
sleep $delay
printf "\r"
done
printf " \r"
}
set -eEuo pipefail
YW=$(echo "\033[33m")
BL=$(echo "\033[36m")
RD=$(echo "\033[01;31m")
GN=$(echo "\033[1;92m")
CL=$(echo "\033[m")
TAB=" "
CM="${TAB}✔️${TAB}${CL}"
# Telemetry
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "lxc-delete" "pve"
header_info
echo "Loading..."
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Deletion" --yesno "This will delete LXC containers. Proceed?" 10 58
NODE=$(hostname)
containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}')
if [ -z "$containers" ]; then
whiptail --title "LXC Container Delete" --msgbox "No LXC containers available!" 10 60
exit 234
fi
menu_items=("ALL" "Delete ALL containers" "OFF") # Add as first option
FORMAT="%-10s %-15s %-10s"
while read -r container; do
container_id=$(echo $container | awk '{print $1}')
container_name=$(echo $container | awk '{print $2}')
container_status=$(echo $container | awk '{print $3}')
formatted_line=$(printf "$FORMAT" "$container_name" "$container_status")
menu_items+=("$container_id" "$formatted_line" "OFF")
done <<<"$containers"
CHOICES=$(whiptail --title "LXC Container Delete" \
--checklist "Select LXC containers to delete:" 25 60 13 \
"${menu_items[@]}" 3>&2 2>&1 1>&3)
if [ -z "$CHOICES" ]; then
whiptail --title "LXC Container Delete" \
--msgbox "No containers selected!" 10 60
exit 0
fi
read -p "Delete containers manually or automatically? (Default: manual) m/a: " DELETE_MODE
DELETE_MODE=${DELETE_MODE:-m}
selected_ids=$(echo "$CHOICES" | tr -d '"' | tr -s ' ' '\n')
# If "ALL" is selected, override with all container IDs
if echo "$selected_ids" | grep -q "^ALL$"; then
selected_ids=$(echo "$containers" | awk '{print $1}')
fi
for container_id in $selected_ids; do
status=$(pct status $container_id)
if [ "$status" == "status: running" ]; then
echo -e "${BL}[Info]${GN} Stopping container $container_id...${CL}"
pct stop $container_id &
sleep 5
echo -e "${BL}[Info]${GN} Container $container_id stopped.${CL}"
fi
if [[ "$DELETE_MODE" == "a" ]]; then
echo -e "${BL}[Info]${GN} Automatically deleting container $container_id...${CL}"
pct destroy "$container_id" -f &
pid=$!
spinner $pid
[ $? -eq 0 ] && echo "Container $container_id deleted." || whiptail --title "Error" --msgbox "Failed to delete container $container_id." 10 60
else
read -p "Delete container $container_id? (y/N): " CONFIRM
if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
echo -e "${BL}[Info]${GN} Deleting container $container_id...${CL}"
pct destroy "$container_id" -f &
pid=$!
spinner $pid
[ $? -eq 0 ] && echo "Container $container_id deleted." || whiptail --title "Error" --msgbox "Failed to delete container $container_id." 10 60
else
echo -e "${BL}[Info]${RD} Skipping container $container_id...${CL}"
fi
fi
done
header_info
echo -e "${GN}Deletion process completed.${CL}\n"

View File

@@ -178,6 +178,24 @@ function resolve_service_script() {
return 1 return 1
} }
# The retired Gitea mirror. The old entrypoint pulls ct/<app>.sh straight from
# it and never reaches the update helper that would repair itself, so rewrite it
# here. Only host and /raw/<kind>/ change; owner, repo and ref are kept.
function repair_update_url() {
local container="$1"
pct exec "$container" -- sh -c '
[ -f /usr/bin/update ] || exit 1
grep -q git.community-scripts.org /usr/bin/update || exit 1
sed -i \
-e "s|https://git[.]community-scripts[.]org/|https://raw.githubusercontent.com/|g" \
-e "s|/raw/branch/|/|g" -e "s|/raw/tag/|/|g" -e "s|/raw/commit/|/|g" \
/usr/bin/update
' >/dev/null 2>&1 || return 1
echo -e "${BL}[INFO]${CL} Repaired update URL (Gitea -> GitHub) in container $container"
log_write "Container $container: rewrote the retired Gitea base in /usr/bin/update"
}
function detect_service() { function detect_service() {
local container="$1" local container="$1"
local tmpdir update_file local tmpdir update_file
@@ -489,6 +507,9 @@ for container in $CHOICE; do
sleep 5 sleep 5
fi fi
#0.5) Rewrite a retired Gitea base before anything reads it.
repair_update_url "$container"
#1) Detect service using the service name in the update command #1) Detect service using the service name in the update command
detect_service $container detect_service $container

View File

@@ -675,4 +675,3 @@ if [ "$START_VM" == "yes" ]; then
fi fi
msg_ok "Completed successfully!\n" msg_ok "Completed successfully!\n"
echo "More Info at https://github.com/community-scripts/ProxmoxVE/discussions/836"

View File

@@ -612,4 +612,3 @@ if [ "$START_VM" == "yes" ]; then
fi fi
msg_ok "Completed successfully!\n" msg_ok "Completed successfully!\n"
echo "More Info at https://github.com/community-scripts/ProxmoxVE/discussions/836"