Compare commits

..

39 Commits

Author SHA1 Message Date
community-scripts-pr-app[bot] 3d9a7c25d6 Update CHANGELOG.md (#16459)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-13 08:00:43 +00:00
Johann Grobe f1386ecbae [wanderer] refactor (#16448)
* refactor wanderer script

* fix script error

* refactor meilisearch bind

* delete .meilisearch versioning

* delete meilisearch on migration

* delete /usr/bin/meilisearch

* meilisearch migration fix

* simplify meilisearch check

* fix migration check

* next try

* fix meilisearch migration

* try fixing meilisearch error

* meilisearch binary missing

* edit setup_meilisearch

* delete old update script for meiliesearch

* refactor script

* fix services

* start wanderer-web after migration
2026-08-13 10:00:20 +02:00
community-scripts-pr-app[bot] 0456f7642c Update CHANGELOG.md (#16458)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-13 07:54:06 +00:00
Crazy-Duck 68fe5d6b8b feat: Update koillection-install.sh to support API usage (#16425)
* feat: Update koillection-install.sh to support API usage

Current config is missing the generation of the SSH keys necessary to create JWT tokens, as well as the Apache config necessary to allow through Authorization headers.

See:
- https://github.com/benjaminjonard/koillection/wiki/manual-installation
- https://symfony.com/bundles/LexikJWTAuthenticationBundle/current/index.html?utm_source=chatgpt.com#important-note-for-apache-users

* fix: missing backslash

* feat: ensure subsequent executions don't replace keys
2026-08-13 09:53:37 +02:00
community-scripts-pr-app[bot] a222d32a31 Update CHANGELOG.md (#16457)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-13 06:59:00 +00:00
push-app-to-main[bot] cc47798d1f SuggestArr (#16449)
* Add suggestarr (ct)

* fix: source line

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com>
2026-08-13 08:58:35 +02:00
community-scripts-pr-app[bot] c19711ea1b Update CHANGELOG.md (#16447)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-12 11:48:02 +00:00
community-scripts-pr-app[bot] 112e5c076f Update CHANGELOG.md (#16446)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-12 11:47:51 +00:00
community-scripts-pr-app[bot] ca77c8842a Update CHANGELOG.md (#16445)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-12 11:47:37 +00:00
CanbiZ (MickLesk) 3ef0735136 ConvertX: add some new dependencies (#16437)
* convertx: install missing converter dependencies

* convertx: use uv tool install instead of pipx for markitdown
2026-08-12 13:47:27 +02:00
CanbiZ (MickLesk) d04f0fbede networkoptimizer: mitigate dotnet publish hang in LXC (#16436)
* networkoptimizer: mitigate dotnet publish hang in LXC

* Optimize networkoptimizer.sh by removing duplicate restore

Removed redundant restore_backup call after deployment.

* Clean up comments in networkoptimizer-install.sh

Removed comments about MSBuild issues in the installation script.
2026-08-12 13:47:05 +02:00
community-scripts-pr-app[bot] 348df1b607 Update CHANGELOG.md (#16444)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-12 11:46:49 +00:00
CanbiZ (MickLesk) d2d382c499 lazylibrarian: reinstall deps after git pull on update (#16435) 2026-08-12 13:46:46 +02:00
community-scripts-pr-app[bot] 51537451f4 Update CHANGELOG.md (#16443)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-12 11:46:25 +00:00
CanbiZ (MickLesk) 492e7bff73 wanderer: fix deprecated meilisearch upgrade flag (#16434) 2026-08-12 13:46:21 +02:00
community-scripts-pr-app[bot] a27a8a1ba8 Update CHANGELOG.md (#16442)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-12 11:46:05 +00:00
CanbiZ (MickLesk) c64ae2fb3a calibre-web: fix release asset filename pattern (#16433) 2026-08-12 13:45:54 +02:00
community-scripts-pr-app[bot] b454fd6f63 Update CHANGELOG.md (#16441)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-12 11:45:39 +00:00
push-app-to-main[bot] 5f750f2d0d Stalwart (#16388)
* Add stalwart (ct)

* fix: source line

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com>
2026-08-12 13:45:10 +02:00
community-scripts-pr-app[bot] 20b8892733 Update CHANGELOG.md (#16440)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-12 10:21:55 +00:00
Tim Moore 4588e59f5f fix(stirling-pdf): install unoserver on the system python, and append to .env (#16439) 2026-08-12 12:21:25 +02:00
community-scripts-pr-app[bot] ba2f9f86f0 Update CHANGELOG.md (#16432)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-12 07:21:13 +00:00
rcourtman 4dfd7fcf2b fix(pulse): keep the container recoverable when an update fails (#16311)
* fix(pulse): keep the container recoverable when an update fails

- Do not delete /opt/pulse/pulse before the download. CLEAN_INSTALL=1
  already wipes the target, so the rm only widened the failure window and
  destroyed the v5 binary when the fetch failed.
- Guard fetch_and_deploy_gh_release and restart the running installation
  when it fails, instead of exiting through the error handler with Pulse
  stopped.
- Re-enable the unit after the pulse-backend to pulse rename, but only if
  it was enabled before, so a deliberately disabled service stays that way.

* fix(pulse): roll back failed updates transactionally

* revert: keep Pulse update fix focused

---------

Co-authored-by: rcourtman <pulsemonitoringltd@gmail.com>
2026-08-12 09:20:45 +02:00
community-scripts-pr-app[bot] 4bf3fda9c5 Update CHANGELOG.md (#16429)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-12 04:39:05 +00:00
CanbiZ (MickLesk) 68246453fe qf 2026-08-12 06:38:30 +02:00
community-scripts-pr-app[bot] edfc6d5445 Update CHANGELOG.md (#16424)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-11 19:56:32 +00:00
CanbiZ (MickLesk) c396fa0e65 Pelican-Panel: add php artisan p:environment:database (#16397) 2026-08-11 21:56:03 +02:00
community-scripts-pr-app[bot] a755db8f0f Update CHANGELOG.md (#16423)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-11 19:49:30 +00:00
CanbiZ (MickLesk) eb1d9051fd outline: fix URL sed matching wrong line in .env.sample // refactor .env generation (#16408)
* outline: fix URL sed matching wrong line in .env.sample

* Refactor environment variable configuration in install script
2026-08-11 21:49:05 +02:00
community-scripts-pr-app[bot] 2f0900d34c Update CHANGELOG.md (#16422)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-11 19:40:32 +00:00
CanbiZ (MickLesk) 935d2ebeef Update source URL for Reactive Resume (#16407) 2026-08-11 21:39:56 +02:00
community-scripts-pr-app[bot] 4f613d334d Update CHANGELOG.md (#16421)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-11 19:39:23 +00:00
CanbiZ (MickLesk) f3bdffbeac arcane: fix projects/builds dir ownership for non-root container UID (#16411) 2026-08-11 21:38:55 +02:00
community-scripts-pr-app[bot] ae69372d9a Update CHANGELOG.md (#16420)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-11 19:38:53 +00:00
Kevin O'Brien 314d7a387a Open WebUI: add optional OpenTelemetry package install (#16415) 2026-08-11 21:38:34 +02:00
community-scripts-pr-app[bot] dac41766f0 Update CHANGELOG.md (#16419)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-11 19:38:24 +00:00
CanbiZ (MickLesk) 8c1d4f33ff paperless-ngx: reindex Tantivy search index on webserver start (#16395) 2026-08-11 21:37:59 +02:00
community-scripts-pr-app[bot] 962dbbb569 Update CHANGELOG.md (#16413)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-11 08:41:23 +00:00
Adam Camp 7f913fa083 fix(add-tailscale-lxc): stop spinner before whiptail menu (#16402)
msg_info starts a background spinner while loading the container list,
but the script never stops it before opening the interactive radiolist,
so the spinner keeps repainting over the UI.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-11 10:40:56 +02:00
31 changed files with 589 additions and 75 deletions
+57 -1
View File
@@ -521,14 +521,70 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details> </details>
## 2026-08-11 ## 2026-08-13
### 🆕 New Scripts
- SuggestArr ([#16449](https://github.com/community-scripts/ProxmoxVE/pull/16449))
### 🚀 Updated Scripts ### 🚀 Updated Scripts
- #### 🐞 Bug Fixes - #### 🐞 Bug Fixes
- [wanderer] refactor [@johanngrobe](https://github.com/johanngrobe) ([#16448](https://github.com/community-scripts/ProxmoxVE/pull/16448))
- #### ✨ New Features
- feat: Update koillection-install.sh to support API usage [@Crazy-Duck](https://github.com/Crazy-Duck) ([#16425](https://github.com/community-scripts/ProxmoxVE/pull/16425))
## 2026-08-12
### 🆕 New Scripts
- Stalwart ([#16388](https://github.com/community-scripts/ProxmoxVE/pull/16388))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- networkoptimizer: mitigate dotnet publish hang in LXC [@MickLesk](https://github.com/MickLesk) ([#16436](https://github.com/community-scripts/ProxmoxVE/pull/16436))
- lazylibrarian: reinstall deps after git pull on update [@MickLesk](https://github.com/MickLesk) ([#16435](https://github.com/community-scripts/ProxmoxVE/pull/16435))
- wanderer: fix deprecated meilisearch upgrade flag [@MickLesk](https://github.com/MickLesk) ([#16434](https://github.com/community-scripts/ProxmoxVE/pull/16434))
- calibre-web: fix release asset filename pattern [@MickLesk](https://github.com/MickLesk) ([#16433](https://github.com/community-scripts/ProxmoxVE/pull/16433))
- fix(stirling-pdf): unoserver installed into the venv, and login mode truncates .env [@angusmaul](https://github.com/angusmaul) ([#16439](https://github.com/community-scripts/ProxmoxVE/pull/16439))
- fix(pulse): keep the container recoverable when an update fails [@rcourtman](https://github.com/rcourtman) ([#16311](https://github.com/community-scripts/ProxmoxVE/pull/16311))
- #### 🔧 Refactor
- ConvertX: add some new dependencies [@MickLesk](https://github.com/MickLesk) ([#16437](https://github.com/community-scripts/ProxmoxVE/pull/16437))
## 2026-08-11
### 🚀 Updated Scripts
- Update source URL for Reactive Resume [@MickLesk](https://github.com/MickLesk) ([#16407](https://github.com/community-scripts/ProxmoxVE/pull/16407))
- #### 🐞 Bug Fixes
- Pelican-Panel: add php artisan p:environment:database [@MickLesk](https://github.com/MickLesk) ([#16397](https://github.com/community-scripts/ProxmoxVE/pull/16397))
- outline: fix URL sed matching wrong line in .env.sample // refactor .env generation [@MickLesk](https://github.com/MickLesk) ([#16408](https://github.com/community-scripts/ProxmoxVE/pull/16408))
- paperless-ngx: reindex Tantivy search index on webserver start [@MickLesk](https://github.com/MickLesk) ([#16395](https://github.com/community-scripts/ProxmoxVE/pull/16395))
- karakeep: pin Node.js to 22 LTS, avoid Node 24.19 better-sqlite3 crash [@MickLesk](https://github.com/MickLesk) ([#16396](https://github.com/community-scripts/ProxmoxVE/pull/16396)) - karakeep: pin Node.js to 22 LTS, avoid Node 24.19 better-sqlite3 crash [@MickLesk](https://github.com/MickLesk) ([#16396](https://github.com/community-scripts/ProxmoxVE/pull/16396))
- #### ✨ New Features
- Open WebUI: add optional OpenTelemetry package install [@irishpadres](https://github.com/irishpadres) ([#16415](https://github.com/community-scripts/ProxmoxVE/pull/16415))
### 🧰 Tools
- #### 🐞 Bug Fixes
- fix(add-tailscale-lxc): stop spinner before whiptail menu [@halcycon](https://github.com/halcycon) ([#16402](https://github.com/community-scripts/ProxmoxVE/pull/16402))
- #### 🔧 Refactor
- arcane: fix projects/builds dir ownership for non-root container UID [@MickLesk](https://github.com/MickLesk) ([#16411](https://github.com/community-scripts/ProxmoxVE/pull/16411))
## 2026-08-10 ## 2026-08-10
### 🆕 New Scripts ### 🆕 New Scripts
+1 -1
View File
@@ -38,7 +38,7 @@ function update_script() {
create_backup /opt/calibre-web/app.db \ create_backup /opt/calibre-web/app.db \
/opt/calibre-web/data /opt/calibre-web/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Calibre-Web" "janeczku/calibre-web" "prebuild" "latest" "/opt/calibre-web" "calibre-web*.tar.gz" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Calibre-Web" "janeczku/calibre-web" "prebuild" "latest" "/opt/calibre-web" "calibreweb*.tar.gz"
setup_uv setup_uv
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
+13 -1
View File
@@ -34,7 +34,19 @@ function update_script() {
systemctl stop convertx systemctl stop convertx
msg_info "Stopped Service" msg_info "Stopped Service"
ensure_dependencies libreoffice-writer ensure_dependencies libreoffice-writer dasel graphicsmagick libemail-outlook-message-perl libheif-examples libjxl-tools resvg
if ! command -v markitdown &>/dev/null; then
setup_uv
msg_info "Installing markitdown"
export UV_TOOL_BIN_DIR=/usr/local/bin
$STD uv tool install "markitdown[all]"
msg_ok "Installed markitdown"
fi
if ! command -v vtracer &>/dev/null; then
fetch_and_deploy_gh_release "vtracer" "visioncortex/vtracer" "prebuild" "0.6.4" "/usr/local/bin" "vtracer-$(arch_resolve "x86_64" "aarch64")-unknown-linux-musl.tar.gz"
fi
create_backup /opt/convertx/data create_backup /opt/convertx/data
+1 -1
View File
@@ -10,7 +10,7 @@ var_tags="${var_tags:-media}"
var_cpu="${var_cpu:-2}" var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}" var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}" var_disk="${var_disk:-8}"
var_os="${var_os:-Ubuntu}" var_os="${var_os:-ubuntu}"
var_version="${var_version:-24.04}" var_version="${var_version:-24.04}"
var_arm64="${var_arm64:-yes}" var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
+6
View File
@@ -0,0 +1,6 @@
_____ __ __ __
/ ___// /_____ _/ / ______ ______/ /_
\__ \/ __/ __ `/ / | /| / / __ `/ ___/ __/
___/ / /_/ /_/ / /| |/ |/ / /_/ / / / /_
/____/\__/\__,_/_/ |__/|__/\__,_/_/ \__/
+6
View File
@@ -0,0 +1,6 @@
_____ __ ___
/ ___/__ ______ _____ ____ _____/ /_/ | __________
\__ \/ / / / __ `/ __ `/ _ \/ ___/ __/ /| | / ___/ ___/
___/ / /_/ / /_/ / /_/ / __(__ ) /_/ ___ |/ / / /
/____/\__,_/\__, /\__, /\___/____/\__/_/ |_/_/ /_/
/____//____/
+1
View File
@@ -34,6 +34,7 @@ function update_script() {
msg_info "Updating $APP LXC" msg_info "Updating $APP LXC"
$STD git -C /opt/LazyLibrarian pull origin master $STD git -C /opt/LazyLibrarian pull origin master
$STD pip install --break-system-packages /opt/LazyLibrarian
msg_ok "Updated $APP LXC" msg_ok "Updated $APP LXC"
msg_info "Starting LazyLibrarian" msg_info "Starting LazyLibrarian"
+4 -3
View File
@@ -36,13 +36,16 @@ function update_script() {
msg_ok "Stopped Service" msg_ok "Stopped Service"
create_backup /opt/networkoptimizer/networkoptimizer.env create_backup /opt/networkoptimizer/networkoptimizer.env
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "networkoptimizer" "Ozark-Connect/NetworkOptimizer" "tarball" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "networkoptimizer" "Ozark-Connect/NetworkOptimizer" "tarball"
restore_backup
msg_info "Rebuilding NetworkOptimizer" msg_info "Rebuilding NetworkOptimizer"
RID="linux-x64" RID="linux-x64"
[[ "$(dpkg --print-architecture)" == "arm64" ]] && RID="linux-arm64" [[ "$(dpkg --print-architecture)" == "arm64" ]] && RID="linux-arm64"
cd /opt/networkoptimizer cd /opt/networkoptimizer
export MSBUILDDISABLENODEREUSE=1
export DOTNET_CLI_TELEMETRY_OPTOUT=1
export DOTNET_SYSTEM_NET_DISABLEIPV6=1
$STD dotnet publish src/NetworkOptimizer.Web -c Release -r "$RID" --self-contained -o /opt/networkoptimizer/publish $STD dotnet publish src/NetworkOptimizer.Web -c Release -r "$RID" --self-contained -o /opt/networkoptimizer/publish
chmod +x /opt/networkoptimizer/publish/NetworkOptimizer.Web chmod +x /opt/networkoptimizer/publish/NetworkOptimizer.Web
mkdir -p /opt/networkoptimizer/publish/tools mkdir -p /opt/networkoptimizer/publish/tools
@@ -50,8 +53,6 @@ function update_script() {
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 $STD go build -trimpath -ldflags "-s -w" -o /opt/networkoptimizer/publish/tools/uwnspeedtest-linux-arm64 . CGO_ENABLED=0 GOOS=linux GOARCH=arm64 $STD go build -trimpath -ldflags "-s -w" -o /opt/networkoptimizer/publish/tools/uwnspeedtest-linux-arm64 .
msg_ok "Rebuilt NetworkOptimizer" msg_ok "Rebuilt NetworkOptimizer"
restore_backup
msg_info "Starting Service" msg_info "Starting Service"
systemctl start networkoptimizer systemctl start networkoptimizer
msg_ok "Started Service" msg_ok "Started Service"
+8 -1
View File
@@ -114,7 +114,14 @@ EOF
msg_info "Updating Open WebUI via uv" msg_info "Updating Open WebUI via uv"
PYTHON_VERSION="3.12" setup_uv PYTHON_VERSION="3.12" setup_uv
$STD uv tool install --force --python 3.12 --constraint <(echo "numba>=0.60") open-webui[all] OWUI_PYTHON="/root/.local/share/uv/tools/open-webui/bin/python3.12"
OTEL_ARGS=()
if [[ -x "$OWUI_PYTHON" ]]; then
while IFS= read -r pkg; do
OTEL_ARGS+=(--with "$pkg")
done < <(uv pip list --python "$OWUI_PYTHON" --format freeze 2>/dev/null | grep -i '^opentelemetry-' | cut -d= -f1)
fi
$STD uv tool install --force --python 3.12 --constraint <(echo "numba>=0.60") "${OTEL_ARGS[@]}" open-webui[all]
systemctl restart open-webui systemctl restart open-webui
msg_ok "Updated Open WebUI" msg_ok "Updated Open WebUI"
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
+2
View File
@@ -166,6 +166,8 @@ function update_script() {
msg_info "Updating Paperless-ngx" msg_info "Updating Paperless-ngx"
if ((BRIDGE_UPDATE == 0)); then if ((BRIDGE_UPDATE == 0)); then
sed -i 's|^ExecStart=.*|ExecStart=uv run -- granian --interface asginl --ws --loop uvloop "paperless.asgi:application"|' /etc/systemd/system/paperless-webserver.service sed -i 's|^ExecStart=.*|ExecStart=uv run -- granian --interface asginl --ws --loop uvloop "paperless.asgi:application"|' /etc/systemd/system/paperless-webserver.service
grep -q "document_index reindex" /etc/systemd/system/paperless-webserver.service ||
sed -i '/^ExecStart=/i ExecStartPre=uv run -- python manage.py document_index reindex --if-needed --no-progress-bar' /etc/systemd/system/paperless-webserver.service
$STD systemctl daemon-reload $STD systemctl daemon-reload
fi fi
cd /opt/paperless cd /opt/paperless
+16 -4
View File
@@ -35,22 +35,34 @@ function update_script() {
systemctl stop pulse*.service systemctl stop pulse*.service
msg_ok "Stopped Services" msg_ok "Stopped Services"
if [[ -f /opt/pulse/pulse ]]; then if ! CLEAN_INSTALL=1 fetch_and_deploy_gh_release "pulse" "rcourtman/Pulse" "prebuild" "latest" "/opt/pulse" "pulse-v*-linux-$(arch_resolve).tar.gz"; then
rm -f /opt/pulse/pulse msg_error "Download or deployment failed - check network connectivity and GitHub API availability"
if systemctl start pulse 2>/dev/null || systemctl start pulse-backend 2>/dev/null; then
msg_ok "Restarted the previously installed ${APP}"
else
msg_error "${APP} could not be restarted - reinstall it or restore the container from a backup"
fi
exit 250
fi fi
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "pulse" "rcourtman/Pulse" "prebuild" "latest" "/opt/pulse" "pulse-v*-linux-$(arch_resolve).tar.gz"
ln -sf /opt/pulse/bin/pulse /usr/local/bin/pulse ln -sf /opt/pulse/bin/pulse /usr/local/bin/pulse
mkdir -p /etc/pulse mkdir -p /etc/pulse
chown pulse:pulse /etc/pulse chown pulse:pulse /etc/pulse
chown -R pulse:pulse /opt/pulse chown -R pulse:pulse /opt/pulse
chmod 700 /etc/pulse chmod 700 /etc/pulse
UNIT_WAS_ENABLED=0
if [[ -f "$SERVICE_PATH"/pulse-backend.service ]]; then if [[ -f "$SERVICE_PATH"/pulse-backend.service ]]; then
if [[ $(systemctl is-enabled pulse-backend) == enabled ]]; then
UNIT_WAS_ENABLED=1
fi
systemctl disable -q pulse-backend.service 2>/dev/null || true
mv "$SERVICE_PATH"/pulse-backend.service "$SERVICE_PATH"/pulse.service mv "$SERVICE_PATH"/pulse-backend.service "$SERVICE_PATH"/pulse.service
fi fi
sed -i -e 's|pulse/pulse|pulse/bin/pulse|' \ sed -i -e 's|pulse/pulse|pulse/bin/pulse|' \
-e 's/^Environment="API.*$//' "$SERVICE_PATH"/pulse.service -e 's/^Environment="API.*$//' "$SERVICE_PATH"/pulse.service
systemctl daemon-reload systemctl daemon-reload
if [[ "$UNIT_WAS_ENABLED" == "1" ]]; then
systemctl enable -q pulse
fi
if grep -q 'pulse-home:/bin/bash' /etc/passwd; then if grep -q 'pulse-home:/bin/bash' /etc/passwd; then
usermod -s /usr/sbin/nologin pulse usermod -s /usr/sbin/nologin pulse
fi fi
+1 -2
View File
@@ -3,7 +3,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
# Copyright (c) 2021-2026 community-scripts ORG # Copyright (c) 2021-2026 community-scripts ORG
# Author: vhsdream | MickLesk (CanbiZ) # Author: vhsdream | MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://rxresume.org | Github: https://github.com/amruthpillai/reactive-resume # Source: https://rxresu.me/ | Github: https://github.com/amruthpillai/reactive-resume
APP="Reactive-Resume" APP="Reactive-Resume"
var_tags="${var_tags:-documents}" var_tags="${var_tags:-documents}"
@@ -45,7 +45,6 @@ function update_script() {
msg_info "Updating Reactive Resume (Patience)" msg_info "Updating Reactive Resume (Patience)"
cd /opt/reactive-resume cd /opt/reactive-resume
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
corepack prepare --activate corepack prepare --activate
export CI="true" export CI="true"
export NODE_ENV="production" export NODE_ENV="production"
+58
View File
@@ -0,0 +1,58 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/stalwartlabs/stalwart
APP="Stalwart"
var_tags="${var_tags:-mail;smtp;imap}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-20}"
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/stalwart ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "stalwart" "stalwartlabs/stalwart"; then
msg_info "Stopping Service"
systemctl stop stalwart
msg_ok "Stopped Service"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "stalwart" "stalwartlabs/stalwart" "prebuild" "latest" "/opt/stalwart" "stalwart-$(arch_resolve x86_64 aarch64)-unknown-linux-gnu.tar.gz"
chmod +x /opt/stalwart/stalwart
msg_info "Starting Service"
systemctl start stalwart
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}:8080/admin${CL}"
echo -e "${INFO}${YW}The bootstrap admin password was printed to the service log:${CL}"
echo -e "${TAB}${DEFAULT}${BGN}journalctl -u stalwart | grep -A8 'bootstrap mode'${CL}"
+70
View File
@@ -0,0 +1,70 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/giuseppe99barchetta/SuggestArr
APP="SuggestArr"
var_tags="${var_tags:-arr;media}"
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:-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/suggestarr ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "suggestarr" "giuseppe99barchetta/SuggestArr"; then
msg_info "Stopping Service"
systemctl stop suggestarr
msg_ok "Stopped Service"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "suggestarr" "giuseppe99barchetta/SuggestArr" "tarball"
msg_info "Building Frontend"
cd /opt/suggestarr/client
$STD npm install
$STD npm run build
mkdir -p /opt/suggestarr/static
cp -r /opt/suggestarr/client/dist/* /opt/suggestarr/static/
cp -r /opt/suggestarr/client/node_modules/swagger-ui-dist /opt/suggestarr/static/swagger-ui
msg_ok "Built Frontend"
msg_info "Updating Python Environment"
cd /opt/suggestarr
$STD uv venv --python 3.12 /opt/suggestarr/.venv
$STD uv pip install --python /opt/suggestarr/.venv -r /opt/suggestarr/api_service/requirements.txt
msg_ok "Updated Python Environment"
msg_info "Starting Service"
systemctl start suggestarr
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}:5000${CL}"
+96 -15
View File
@@ -25,17 +25,111 @@ function update_script() {
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -f /opt/wanderer/start.sh ]]; then if [[ ! -d /opt/wanderer/source ]]; then
msg_error "No wanderer Installation Found!" msg_error "No wanderer Installation Found!"
exit exit
fi fi
if [[ ! -f /etc/systemd/system/meilisearch.service ]]; then
msg_info "Migrating MeiliSearch"
systemctl stop wanderer-web
rm -rf /opt/wanderer/source/search
MEILI_MASTER_KEY_VAL=$(grep -oP '^MEILI_MASTER_KEY=\K.*' /opt/wanderer/.env)
cat <<EOF >/etc/meilisearch.toml
env = "production"
master_key = "$MEILI_MASTER_KEY_VAL"
db_path = "/opt/wanderer/data/meili_data"
dump_dir = "/var/lib/meilisearch/dumps"
snapshot_dir = "/var/lib/meilisearch/snapshots"
no_analytics = true
http_addr = "127.0.0.1:7700"
EOF
mkdir -p /var/lib/meilisearch/dumps /var/lib/meilisearch/snapshots
cat <<EOF >/etc/systemd/system/meilisearch.service
[Unit]
Description=Meilisearch
After=network.target
[Service]
ExecStart=/usr/bin/meilisearch --config-file-path /etc/meilisearch.toml
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable -q --now meilisearch
sed -i \
-e "s|^MEILI_HTTP_ADDR=.*|MEILI_HTTP_ADDR=127.0.0.1:7700|" \
-e "s|^MEILI_URL=.*|MEILI_URL=http://127.0.0.1:7700|" \
/opt/wanderer/.env
msg_ok "Migrated Meilisearch"
fi
setup_meilisearch
if [[ -f /opt/wanderer/start.sh ]]; then
msg_info "Migrating wanderer services"
systemctl stop wanderer-web
rm -f /opt/wanderer/start.sh
rm -rf /opt/wanderer/source/search
cat <<EOF >/etc/systemd/system/wanderer-pocketbase.service
[Unit]
Description=wanderer PocketBase
Wants=network.target
After=network.target
PartOf=wanderer-web.service
StartLimitIntervalSec=10
StartLimitBurst=5
[Service]
Type=simple
WorkingDirectory=/opt/wanderer/source/db
EnvironmentFile=/opt/wanderer/.env
ExecStart=/opt/wanderer/source/db/pocketbase serve --http=\${PB_URL} --dir=\${PB_DB_LOCATION}
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/wanderer-web.service
[Unit]
Description=wanderer
Wants=network.target meilisearch.service wanderer-pocketbase.service
After=network.target meilisearch.service wanderer-pocketbase.service
StartLimitIntervalSec=10
StartLimitBurst=5
[Service]
Type=simple
WorkingDirectory=/opt/wanderer/source/web
EnvironmentFile=/opt/wanderer/.env
ExecStart=/usr/bin/node build
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable -q wanderer-pocketbase
systemctl start wanderer-web
msg_ok "Migrated wanderer services"
fi
if check_for_gh_release "wanderer" "open-wanderer/wanderer"; then if check_for_gh_release "wanderer" "open-wanderer/wanderer"; then
msg_info "Stopping service" msg_info "Stopping service"
systemctl stop wanderer-web systemctl stop wanderer-web
msg_ok "Stopped service" msg_ok "Stopped service"
create_backup /opt/wanderer/source/search create_backup /opt/wanderer/source
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wanderer" "open-wanderer/wanderer" "tarball" "latest" "/opt/wanderer/source" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wanderer" "open-wanderer/wanderer" "tarball" "latest" "/opt/wanderer/source"
restore_backup restore_backup
@@ -60,19 +154,6 @@ function update_script() {
msg_ok "Started service" msg_ok "Started service"
msg_ok "Update Successful" msg_ok "Update Successful"
fi fi
if check_for_gh_release "meilisearch" "meilisearch/meilisearch"; then
msg_info "Stopping service"
systemctl stop wanderer-web
msg_ok "Stopped service"
fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" "latest" "/opt/wanderer/source/search"
grep -q -- '--experimental-dumpless-upgrade' /opt/wanderer/start.sh || sed -i 's|meilisearch --master-key|meilisearch --experimental-dumpless-upgrade --master-key|' /opt/wanderer/start.sh
msg_info "Starting service"
systemctl start wanderer-web
msg_ok "Started service"
msg_ok "Update Successful"
fi
exit exit
} }
+1 -1
View File
@@ -32,7 +32,7 @@ msg_info "Installing Calibre (for eBook conversion)"
$STD apt install -y calibre $STD apt install -y calibre
msg_ok "Installed Calibre" msg_ok "Installed Calibre"
fetch_and_deploy_gh_release "Calibre-Web" "janeczku/calibre-web" "prebuild" "latest" "/opt/calibre-web" "calibre-web*.tar.gz" fetch_and_deploy_gh_release "Calibre-Web" "janeczku/calibre-web" "prebuild" "latest" "/opt/calibre-web" "calibreweb*.tar.gz"
setup_uv setup_uv
msg_info "Installing Python Dependencies" msg_info "Installing Python Dependencies"
+15
View File
@@ -20,10 +20,15 @@ msg_info "Installing Dependencies"
$STD apt install -y \ $STD apt install -y \
assimp-utils \ assimp-utils \
calibre \ calibre \
dasel \
dcraw \ dcraw \
dvisvgm \ dvisvgm \
ffmpeg \ ffmpeg \
graphicsmagick \
inkscape \ inkscape \
libemail-outlook-message-perl \
libheif-examples \
libjxl-tools \
libreoffice-writer \ libreoffice-writer \
libva2 \ libva2 \
libvips-tools \ libvips-tools \
@@ -33,6 +38,7 @@ $STD apt install -y \
poppler-utils \ poppler-utils \
potrace \ potrace \
python3-numpy \ python3-numpy \
resvg \
texlive \ texlive \
texlive-fonts-recommended \ texlive-fonts-recommended \
texlive-latex-extra \ texlive-latex-extra \
@@ -40,6 +46,15 @@ $STD apt install -y \
texlive-xetex texlive-xetex
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
setup_uv
msg_info "Installing markitdown"
export UV_TOOL_BIN_DIR=/usr/local/bin
$STD uv tool install "markitdown[all]"
msg_ok "Installed markitdown"
fetch_and_deploy_gh_release "vtracer" "visioncortex/vtracer" "prebuild" "0.6.4" "/usr/local/bin" "vtracer-$(arch_resolve "x86_64" "aarch64")-unknown-linux-musl.tar.gz"
NODE_VERSION="22" NODE_MODULE="bun" setup_nodejs NODE_VERSION="22" NODE_MODULE="bun" setup_nodejs
fetch_and_deploy_gh_release "ConvertX" "C4illin/ConvertX" "tarball" "latest" "/opt/convertx" fetch_and_deploy_gh_release "ConvertX" "C4illin/ConvertX" "tarball" "latest" "/opt/convertx"
+2
View File
@@ -38,6 +38,7 @@ export APP_RUNTIME='Symfony\Component\Runtime\SymfonyRuntime'
$STD composer install --no-dev -o --no-interaction --classmap-authoritative $STD composer install --no-dev -o --no-interaction --classmap-authoritative
$STD php bin/console doctrine:migrations:migrate --no-interaction $STD php bin/console doctrine:migrations:migrate --no-interaction
$STD php bin/console app:translations:dump $STD php bin/console app:translations:dump
$STD php bin/console lexik:jwt:generate-keypair --skip-if-exists
cd assets/ cd assets/
$STD yarn install $STD yarn install
$STD yarn build $STD yarn build
@@ -51,6 +52,7 @@ cat <<EOF >/etc/apache2/sites-available/koillection.conf
ServerName koillection ServerName koillection
DocumentRoot /opt/koillection/public DocumentRoot /opt/koillection/public
SetEnv APP_RUNTIME "Symfony\\Component\\Runtime\\SymfonyRuntime" SetEnv APP_RUNTIME "Symfony\\Component\\Runtime\\SymfonyRuntime"
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=\$1
<Directory /opt/koillection/public> <Directory /opt/koillection/public>
Options Indexes FollowSymLinks Options Indexes FollowSymLinks
AllowOverride All AllowOverride All
+3
View File
@@ -35,6 +35,9 @@ RID="linux-x64"
[[ "$(dpkg --print-architecture)" == "arm64" ]] && RID="linux-arm64" [[ "$(dpkg --print-architecture)" == "arm64" ]] && RID="linux-arm64"
cd /opt/networkoptimizer cd /opt/networkoptimizer
export MinVerVersionOverride="$(cat ~/.networkoptimizer)" export MinVerVersionOverride="$(cat ~/.networkoptimizer)"
export MSBUILDDISABLENODEREUSE=1
export DOTNET_CLI_TELEMETRY_OPTOUT=1
export DOTNET_SYSTEM_NET_DISABLEIPV6=1
$STD dotnet publish src/NetworkOptimizer.Web -c Release -r "$RID" --self-contained -o /opt/networkoptimizer/publish $STD dotnet publish src/NetworkOptimizer.Web -c Release -r "$RID" --self-contained -o /opt/networkoptimizer/publish
chmod +x /opt/networkoptimizer/publish/NetworkOptimizer.Web chmod +x /opt/networkoptimizer/publish/NetworkOptimizer.Web
msg_ok "Built NetworkOptimizer" msg_ok "Built NetworkOptimizer"
+21 -1
View File
@@ -25,8 +25,28 @@ setup_hwaccel
PYTHON_VERSION="3.12" setup_uv PYTHON_VERSION="3.12" setup_uv
OTEL_ARGS=()
read -r -p "${TAB3}Would you like to install OpenTelemetry instrumentation packages (requires manual .env configuration)? <y/N> " prompt
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
for pkg in \
opentelemetry-api \
opentelemetry-sdk \
opentelemetry-exporter-otlp \
opentelemetry-exporter-otlp-proto-http \
opentelemetry-instrumentation-fastapi \
opentelemetry-instrumentation-aiohttp-client \
opentelemetry-instrumentation-httpx \
opentelemetry-instrumentation-sqlalchemy \
opentelemetry-instrumentation-requests \
opentelemetry-instrumentation-logging \
opentelemetry-instrumentation-redis \
opentelemetry-instrumentation-system-metrics; do
OTEL_ARGS+=(--with "$pkg")
done
fi
msg_info "Installing Open WebUI" msg_info "Installing Open WebUI"
$STD uv tool install --python 3.12 --constraint <(echo "numba>=0.60") open-webui[all] $STD uv tool install --python 3.12 --constraint <(echo "numba>=0.60") "${OTEL_ARGS[@]}" open-webui[all]
msg_ok "Installed Open WebUI" msg_ok "Installed Open WebUI"
read -r -p "${TAB3}Would you like to add Ollama? <y/N> " prompt read -r -p "${TAB3}Would you like to add Ollama? <y/N> " prompt
+9 -7
View File
@@ -28,21 +28,23 @@ fetch_and_deploy_gh_release "outline" "outline/outline" "tarball"
msg_info "Configuring Outline (Patience)" msg_info "Configuring Outline (Patience)"
SECRET_KEY="$(openssl rand -hex 32)" SECRET_KEY="$(openssl rand -hex 32)"
UTILS_SECRET="$(openssl rand -hex 32)"
cd /opt/outline cd /opt/outline
cp .env.sample .env cp .env.sample .env
export NODE_ENV=development export NODE_ENV=development
sed -i 's/NODE_ENV=production/NODE_ENV=development/g' /opt/outline/.env sed -i "s#^NODE_ENV=.*#NODE_ENV=development#" /opt/outline/.env
sed -i "s/generate_a_new_key/${SECRET_KEY}/g" /opt/outline/.env sed -i "s#^SECRET_KEY=.*#SECRET_KEY=${SECRET_KEY}#" /opt/outline/.env
sed -i "s/user:pass@postgres/${PG_DB_USER}:${PG_DB_PASS}@localhost/g" /opt/outline/.env sed -i "s#^UTILS_SECRET=.*#UTILS_SECRET=${UTILS_SECRET}#" /opt/outline/.env
sed -i 's/redis:6379/localhost:6379/g' /opt/outline/.env sed -i "s#^DATABASE_URL=.*#DATABASE_URL=postgres://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}#" /opt/outline/.env
sed -i "5s#URL=#URL=http://${LOCAL_IP}#g" /opt/outline/.env sed -i "s#^REDIS_URL=.*#REDIS_URL=redis://localhost:6379#" /opt/outline/.env
sed -i 's/FORCE_HTTPS=true/FORCE_HTTPS=false/g' /opt/outline/.env sed -i "s#^URL=.*#URL=http://${LOCAL_IP}#" /opt/outline/.env
sed -i "s#^FORCE_HTTPS=.*#FORCE_HTTPS=false#" /opt/outline/.env
export NODE_OPTIONS="--max-old-space-size=3584" export NODE_OPTIONS="--max-old-space-size=3584"
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
$STD yarn install --immutable $STD yarn install --immutable
export NODE_ENV=production export NODE_ENV=production
sed -i 's/NODE_ENV=development/NODE_ENV=production/g' /opt/outline/.env sed -i "s#^NODE_ENV=.*#NODE_ENV=production#" /opt/outline/.env
$STD yarn build $STD yarn build
msg_ok "Configured Outline" msg_ok "Configured Outline"
+1
View File
@@ -151,6 +151,7 @@ Requires=redis.service
[Service] [Service]
WorkingDirectory=/opt/paperless/src WorkingDirectory=/opt/paperless/src
#ExecStartPre=uv run -- python manage.py document_index reindex --if-needed --no-progress-bar
ExecStart=uv run -- granian --interface asginl --ws --loop uvloop "paperless.asgi:application" ExecStart=uv run -- granian --interface asginl --ws --loop uvloop "paperless.asgi:application"
Environment=GRANIAN_HOST=:: Environment=GRANIAN_HOST=::
Environment=GRANIAN_PORT=8000 Environment=GRANIAN_PORT=8000
+1
View File
@@ -27,6 +27,7 @@ msg_info "Installing Pelican Panel"
cd /opt/pelican-panel cd /opt/pelican-panel
$STD composer install --no-dev --optimize-autoloader --no-interaction $STD composer install --no-dev --optimize-autoloader --no-interaction
$STD php artisan p:environment:setup $STD php artisan p:environment:setup
echo "yes" | $STD php artisan p:environment:database --driver mariadb --host localhost --port 3306 --database "$MARIADB_DB_NAME" --username "$MARIADB_DB_USER" --password "$MARIADB_DB_PASS"
$STD php artisan p:environment:queue-service --no-interaction $STD php artisan p:environment:queue-service --no-interaction
echo "* * * * * php /opt/pelican-panel/artisan schedule:run >> /dev/null 2>&1" | crontab -u www-data - echo "* * * * * php /opt/pelican-panel/artisan schedule:run >> /dev/null 2>&1" | crontab -u www-data -
chown -R www-data:www-data /opt/pelican-panel chown -R www-data:www-data /opt/pelican-panel
+1 -2
View File
@@ -3,7 +3,7 @@
# Copyright (c) 2021-2026 community-scripts ORG # Copyright (c) 2021-2026 community-scripts ORG
# Author: vhsdream | Rewrite: MickLesk (CanbiZ) # Author: vhsdream | Rewrite: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://rxresume.org | Github: https://github.com/amruthpillai/reactive-resume # Source: https://rxresu.me/ | Github: https://github.com/amruthpillai/reactive-resume
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color color
@@ -39,7 +39,6 @@ msg_ok "Built Reactive Resume"
msg_info "Configuring Reactive Resume" msg_info "Configuring Reactive Resume"
AUTH_SECRET=$(openssl rand -hex 32) AUTH_SECRET=$(openssl rand -hex 32)
cat <<EOF >/opt/reactive-resume/.env cat <<EOF >/opt/reactive-resume/.env
# Reactive Resume v5 Configuration # Reactive Resume v5 Configuration
NODE_ENV=production NODE_ENV=production
+62
View File
@@ -0,0 +1,62 @@
#!/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/stalwartlabs/stalwart
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
fetch_and_deploy_gh_release "stalwart" "stalwartlabs/stalwart" "prebuild" "latest" "/opt/stalwart" "stalwart-$(arch_resolve x86_64 aarch64)-unknown-linux-gnu.tar.gz"
chmod +x /opt/stalwart/stalwart
msg_info "Configuring Stalwart"
mkdir -p /opt/stalwart_data/{etc,data,logs}
cat <<EOF >/opt/stalwart_data/etc/stalwart.env
# Uncomment and edit an entry to override its default.
# Apply changes with: systemctl restart stalwart
#STALWART_HOSTNAME=mail.example.com
#STALWART_PUBLIC_URL=https://mail.example.com
#STALWART_RECOVERY_MODE=true
#STALWART_RECOVERY_ADMIN=admin:changeme
EOF
chmod 600 /opt/stalwart_data/etc/stalwart.env
msg_ok "Configured Stalwart"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/stalwart.service
[Unit]
Description=Stalwart Mail Server
Conflicts=postfix.service sendmail.service exim4.service
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/stalwart_data
EnvironmentFile=-/opt/stalwart_data/etc/stalwart.env
ExecStart=/opt/stalwart/stalwart --config=/opt/stalwart_data/etc/config.json
LimitNOFILE=65536
KillMode=process
KillSignal=SIGINT
Restart=on-failure
RestartSec=5
SyslogIdentifier=stalwart
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now stalwart
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc
+10 -3
View File
@@ -34,7 +34,11 @@ msg_ok "Installed Dependencies"
PYTHON_VERSION="3.12" setup_uv PYTHON_VERSION="3.12" setup_uv
JAVA_VERSION="25" setup_java JAVA_VERSION="25" setup_java
read -r -p "${TAB3}Do you want to use Stirling-PDF with Login? (no/n = without Login) [Y/n] " response if ! read -r -p "${TAB3}Do you want to use Stirling-PDF with Login? (no/n = without Login) [Y/n] " response; then
# No interactive stdin (EOF): fall back to the no-login install instead of
# silently selecting login, which the -z test below would otherwise do.
response="n"
fi
response=${response,,} # Convert to lowercase response=${response,,} # Convert to lowercase
login_mode="false" login_mode="false"
if [[ "$response" == "y" || "$response" == "yes" || -z "$response" ]]; then if [[ "$response" == "y" || "$response" == "yes" || -z "$response" ]]; then
@@ -72,7 +76,10 @@ $STD uv pip install \
pillow \ pillow \
pdf2image pdf2image
$STD apt install -y python3-uno python3-pip $STD apt install -y python3-uno python3-pip
$STD pip3 install --break-system-packages --timeout=120 unoserver # Install unoserver for the system Python, not the venv activated above: `uno` is
# provided by python3-uno for /usr/bin/python3 only, and unoserver.service expects
# /usr/local/bin/unoserver. A bare `pip3` here resolves to the venv's pip.
$STD /usr/bin/python3 -m pip install --break-system-packages --timeout=120 unoserver
ln -sf /opt/.venv/bin/python3 /usr/local/bin/python3 ln -sf /opt/.venv/bin/python3 /usr/local/bin/python3
ln -sf /opt/.venv/bin/pip /usr/local/bin/pip ln -sf /opt/.venv/bin/pip /usr/local/bin/pip
msg_ok "Installed Python Dependencies" msg_ok "Installed Python Dependencies"
@@ -104,7 +111,7 @@ PATH=/opt/.venv/bin:/usr/lib/libreoffice/program:/usr/local/sbin:/usr/local/bin:
EOF EOF
if [[ "$login_mode" == "true" ]]; then if [[ "$login_mode" == "true" ]]; then
cat <<EOF >/opt/Stirling-PDF/.env cat <<EOF >>/opt/Stirling-PDF/.env
# activate Login # activate Login
DISABLE_ADDITIONAL_FEATURES=false DISABLE_ADDITIONAL_FEATURES=false
SECURITY_ENABLELOGIN=true SECURITY_ENABLELOGIN=true
+74
View File
@@ -0,0 +1,74 @@
#!/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/giuseppe99barchetta/SuggestArr
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
msg_ok "Installed Dependencies"
UV_PYTHON="3.12" setup_uv
NODE_VERSION="22" setup_nodejs
fetch_and_deploy_gh_release "suggestarr" "giuseppe99barchetta/SuggestArr" "tarball"
msg_info "Building Frontend"
cd /opt/suggestarr/client
$STD npm install
$STD npm run build
mkdir -p /opt/suggestarr/static
cp -r /opt/suggestarr/client/dist/* /opt/suggestarr/static/
cp -r /opt/suggestarr/client/node_modules/swagger-ui-dist /opt/suggestarr/static/swagger-ui
msg_ok "Built Frontend"
msg_info "Setting up Python Environment"
cd /opt/suggestarr
$STD uv venv --python 3.12 /opt/suggestarr/.venv
$STD uv pip install --python /opt/suggestarr/.venv -r /opt/suggestarr/api_service/requirements.txt
msg_ok "Set up Python Environment"
msg_info "Configuring SuggestArr"
mkdir -p /opt/suggestarr_data
cat <<EOF >/opt/suggestarr.env
SUGGESTARR_PORT=5000
LOG_LEVEL=info
CONFIG_DIR=/opt/suggestarr_data
EOF
chmod 600 /opt/suggestarr.env
msg_ok "Configured SuggestArr"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/suggestarr.service
[Unit]
Description=SuggestArr
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/suggestarr
EnvironmentFile=/opt/suggestarr.env
ExecStart=/opt/suggestarr/.venv/bin/uvicorn api_service.app:asgi_app --host 0.0.0.0 --port 5000 --log-level info
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now suggestarr
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc
+31 -28
View File
@@ -15,15 +15,10 @@ update_os
setup_go setup_go
NODE_VERSION="22" setup_nodejs NODE_VERSION="22" setup_nodejs
if [[ "$(arch_resolve)" == "arm64" ]]; then
fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "singlefile" "latest" "/usr/local/bin" "meilisearch-linux-aarch64"
else
fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" "latest" "/opt/wanderer/source/search"
fi
mkdir -p /opt/wanderer/{source,data/pb_data,data/meili_data,data/plugins} mkdir -p /opt/wanderer/{source,data/pb_data,data/meili_data,data/plugins}
MEILISEARCH_DB_PATH="/opt/wanderer/data/meili_data" setup_meilisearch
fetch_and_deploy_gh_release "wanderer" "open-wanderer/wanderer" "tarball" "latest" "/opt/wanderer/source" fetch_and_deploy_gh_release "wanderer" "open-wanderer/wanderer" "tarball" "latest" "/opt/wanderer/source"
mkdir -p /opt/wanderer/source/db/data mkdir -p /opt/wanderer/source/db/data
mkdir -p /opt/wanderer/source/search
[[ -e /opt/wanderer/source/db/data/plugins ]] || ln -sfn /opt/wanderer/data/plugins /opt/wanderer/source/db/data/plugins [[ -e /opt/wanderer/source/db/data/plugins ]] || ln -sfn /opt/wanderer/data/plugins /opt/wanderer/source/db/data/plugins
msg_info "Installing wanderer (patience)" msg_info "Installing wanderer (patience)"
@@ -42,14 +37,13 @@ done
msg_ok "Installed wanderer plugins" msg_ok "Installed wanderer plugins"
msg_info "Creating Service" msg_info "Creating Service"
MEILI_KEY=$(openssl rand -hex 32)
POCKETBASE_KEY=$(openssl rand -hex 16) POCKETBASE_KEY=$(openssl rand -hex 16)
cat <<EOF >/opt/wanderer/.env cat <<EOF >/opt/wanderer/.env
ORIGIN=http://${LOCAL_IP}:3000 ORIGIN=http://${LOCAL_IP}:3000
MEILI_HTTP_ADDR=${LOCAL_IP}:7700 MEILI_HTTP_ADDR=127.0.0.1:7700
MEILI_URL=http://${LOCAL_IP}:7700 MEILI_URL=http://127.0.0.1:7700
MEILI_MASTER_KEY=${MEILI_KEY} MEILI_MASTER_KEY=${MEILISEARCH_MASTER_KEY}
PB_URL=${LOCAL_IP}:8090 PB_URL=${LOCAL_IP}:8090
PUBLIC_POCKETBASE_URL=http://${LOCAL_IP}:8090 PUBLIC_POCKETBASE_URL=http://${LOCAL_IP}:8090
PUBLIC_VALHALLA_URL=https://valhalla1.openstreetmap.de PUBLIC_VALHALLA_URL=https://valhalla1.openstreetmap.de
@@ -58,20 +52,6 @@ PB_DB_LOCATION=/opt/wanderer/data/pb_data
MEILI_DB_PATH=/opt/wanderer/data/meili_data MEILI_DB_PATH=/opt/wanderer/data/meili_data
EOF EOF
cat <<EOF >/opt/wanderer/start.sh
#!/usr/bin/env bash
trap "kill 0" EXIT
cd /opt/wanderer/source/search && meilisearch --upgrade-db --master-key \$MEILI_MASTER_KEY &
sleep 1
cd /opt/wanderer/source/db && ./pocketbase serve --http=\$PB_URL --dir=\$PB_DB_LOCATION &
cd /opt/wanderer/source/web && node build &
wait -n
EOF
chmod +x /opt/wanderer/start.sh
cat <<'EOF' >/usr/local/bin/wanderer-pb cat <<'EOF' >/usr/local/bin/wanderer-pb
#!/usr/bin/env bash #!/usr/bin/env bash
set -a set -a
@@ -82,17 +62,40 @@ exec ./pocketbase "$@" --dir="$PB_DB_LOCATION"
EOF EOF
chmod +x /usr/local/bin/wanderer-pb chmod +x /usr/local/bin/wanderer-pb
cat <<EOF >/etc/systemd/system/wanderer-web.service cat <<EOF >/etc/systemd/system/wanderer-pocketbase.service
[Unit] [Unit]
Description=wanderer Description=wanderer PocketBase
Wants=network.target
After=network.target After=network.target
PartOf=wanderer-web.service
StartLimitIntervalSec=10 StartLimitIntervalSec=10
StartLimitBurst=5 StartLimitBurst=5
[Service] [Service]
Type=simple Type=simple
WorkingDirectory=/opt/wanderer/source/db
EnvironmentFile=/opt/wanderer/.env EnvironmentFile=/opt/wanderer/.env
ExecStart=/usr/bin/bash /opt/wanderer/start.sh ExecStart=/opt/wanderer/source/db/pocketbase serve --http=\${PB_URL} --dir=\${PB_DB_LOCATION}
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/wanderer-web.service
[Unit]
Description=wanderer
Wants=network.target meilisearch.service wanderer-pocketbase.service
After=network.target meilisearch.service wanderer-pocketbase.service
StartLimitIntervalSec=10
StartLimitBurst=5
[Service]
Type=simple
WorkingDirectory=/opt/wanderer/source/web
EnvironmentFile=/opt/wanderer/.env
ExecStart=/usr/bin/node build
Restart=always Restart=always
RestartSec=1 RestartSec=1
@@ -100,7 +103,7 @@ RestartSec=1
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
sleep 1 sleep 1
systemctl enable -q --now wanderer-web systemctl enable -q --now wanderer-pocketbase wanderer-web
msg_ok "Created Service" msg_ok "Created Service"
motd_ssh motd_ssh
+1
View File
@@ -57,6 +57,7 @@ while read -r line; do
CTID_MENU+=("$TAG" "$ITEM" "OFF") CTID_MENU+=("$TAG" "$ITEM" "OFF")
done < <(pct list | awk 'NR>1') done < <(pct list | awk 'NR>1')
stop_spinner
CTID="" CTID=""
while [[ -z "${CTID}" ]]; do while [[ -z "${CTID}" ]]; do
CTID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --radiolist \ CTID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --radiolist \
+14 -1
View File
@@ -59,6 +59,8 @@ function uninstall() {
# UPDATE # UPDATE
# ============================================================================== # ==============================================================================
function update() { function update() {
chown -R 65532:65532 /etc/arcane/projects /etc/arcane/builds 2>/dev/null || true
msg_info "Pulling latest ${APP} image" msg_info "Pulling latest ${APP} image"
cd "$INSTALL_PATH" cd "$INSTALL_PATH"
$STD docker compose pull $STD docker compose pull
@@ -83,15 +85,25 @@ function install() {
msg_ok "Created ${INSTALL_PATH}" msg_ok "Created ${INSTALL_PATH}"
# Generate secrets and config values # Generate secrets and config values
local ENCRYPTION_KEY JWT_SECRET PROJ_DIR local ENCRYPTION_KEY JWT_SECRET PROJ_DIR BUILDS_DIR
ENCRYPTION_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c32) ENCRYPTION_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c32)
JWT_SECRET=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c32) JWT_SECRET=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c32)
PROJ_DIR="/etc/arcane/projects" PROJ_DIR="/etc/arcane/projects"
BUILDS_DIR="/etc/arcane/builds"
# Arcane drops root and runs as UID/GID 65532 by default (Dockerfile default,
# see backend/pkg/libarcane/startup/runtime_identity.go), so bind-mounted
# host directories must be owned by that UID or the container can't write to them.
msg_info "Creating stacks directory" msg_info "Creating stacks directory"
mkdir -p "$PROJ_DIR" mkdir -p "$PROJ_DIR"
chown -R 65532:65532 "$PROJ_DIR"
msg_ok "Created ${PROJ_DIR}" msg_ok "Created ${PROJ_DIR}"
msg_info "Creating builds directory"
mkdir -p "$BUILDS_DIR"
chown -R 65532:65532 "$BUILDS_DIR"
msg_ok "Created ${BUILDS_DIR}"
msg_info "Downloading Docker Compose file" msg_info "Downloading Docker Compose file"
curl -fsSL "https://raw.githubusercontent.com/getarcaneapp/arcane/refs/heads/main/docker/examples/compose.basic.yaml" -o "$COMPOSE_FILE" curl -fsSL "https://raw.githubusercontent.com/getarcaneapp/arcane/refs/heads/main/docker/examples/compose.basic.yaml" -o "$COMPOSE_FILE"
msg_ok "Downloaded Docker Compose file" msg_ok "Downloaded Docker Compose file"
@@ -103,6 +115,7 @@ function install() {
msg_info "Configuring compose and env files" msg_info "Configuring compose and env files"
sed -i '/^[[:space:]]*#/!s|/host/path/to/projects|'"$PROJ_DIR"'|g' "$COMPOSE_FILE" sed -i '/^[[:space:]]*#/!s|/host/path/to/projects|'"$PROJ_DIR"'|g' "$COMPOSE_FILE"
sed -i '/^[[:space:]]*#/!s|/host/path/to/builds|'"$BUILDS_DIR"'|g' "$COMPOSE_FILE"
sed -i '/^[[:space:]]*#/!s|ENCRYPTION_KEY=.*|ENCRYPTION_KEY='"$ENCRYPTION_KEY"'|g' "$COMPOSE_FILE" sed -i '/^[[:space:]]*#/!s|ENCRYPTION_KEY=.*|ENCRYPTION_KEY='"$ENCRYPTION_KEY"'|g' "$COMPOSE_FILE"
sed -i '/^[[:space:]]*#/!s|JWT_SECRET=.*|JWT_SECRET='"$JWT_SECRET"'|g' "$COMPOSE_FILE" sed -i '/^[[:space:]]*#/!s|JWT_SECRET=.*|JWT_SECRET='"$JWT_SECRET"'|g' "$COMPOSE_FILE"
sed -i '/^[[:space:]]*#/!s|APP_URL=.*|APP_URL=http://localhost:'"$DEFAULT_PORT"'|g' "$ENV_FILE" sed -i '/^[[:space:]]*#/!s|APP_URL=.*|APP_URL=http://localhost:'"$DEFAULT_PORT"'|g' "$ENV_FILE"