Compare commits

...

28 Commits

Author SHA1 Message Date
github-actions[bot]
a6d538f5c4 Update CHANGELOG.md 2026-09-05 20:43:55 +00:00
community-scripts-pr-app[bot]
f100076ae3 Update CHANGELOG.md (#17043)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 20:43:24 +00:00
community-scripts-pr-app[bot]
e4c52cbe0b Update CHANGELOG.md (#17042)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 20:43:16 +00:00
community-scripts-pr-app[bot]
1fa93da239 Update CHANGELOG.md (#17041)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 20:42:59 +00:00
community-scripts-pr-app[bot]
1a5fafa8ec Update CHANGELOG.md (#17040)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 20:42:46 +00:00
community-scripts-pr-app[bot]
ba84aca0f5 Update CHANGELOG.md (#17039)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 20:42:23 +00:00
CanbiZ (MickLesk)
d4771cbf98 authentik: scope blueprints chown to avoid recursing into the mp0 bind mount (#17008) 2026-09-05 22:41:58 +02:00
community-scripts-pr-app[bot]
7878f3095f Update CHANGELOG.md (#17038)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 20:41:37 +00:00
CanbiZ (MickLesk)
535f2f2d2e iventoy: run iventoy.sh with bash instead of dash (#17034) 2026-09-05 22:41:32 +02:00
CanbiZ (MickLesk)
166c798e35 frigate: restart go2rtc.service before frigate starts (#17035) 2026-09-05 22:41:14 +02:00
community-scripts-pr-app[bot]
bcb82ac446 Update CHANGELOG.md (#17032)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 03:05:20 +00:00
community-scripts-pr-app[bot]
eeafdafcd0 Update CHANGELOG.md (#17031)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 03:05:10 +00:00
CanbiZ (MickLesk)
89f179e05e snapotter: seed AI venv base packages on arm64, warn amd64 has no working CPU bundle (#16903) 2026-09-05 13:04:53 +10:00
community-scripts-pr-app[bot]
a5cde1fa8c Update CHANGELOG.md (#17030)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 03:04:51 +00:00
community-scripts-pr-app[bot]
a81a11649e Update CHANGELOG.md (#17029)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 03:04:40 +00:00
CanbiZ (MickLesk)
9c750ffaf5 update-apps: follow renamed ct/ scripts instead of erroring out (#16991)
A container keeps the slug it was built with, so a renamed ct/ script leaves
the updater looking for a name that no longer exists.

Reported for pbs, renamed to proxmox-backup-server in 0e5f663df. The Alpine
merge on 2026-08-18 retired 29 more names the same way, so every container
installed from an alpine-* script before that date hits this too.

Candidates are only accepted when the target script really exists, so an
unknown slug still errors rather than running some other app's updater.

Fixes #16989
2026-09-05 13:04:27 +10:00
community-scripts-pr-app[bot]
f3742af941 Update CHANGELOG.md (#17028)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 03:04:21 +00:00
community-scripts-pr-app[bot]
40160b0a58 Update CHANGELOG.md (#17027)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 03:04:08 +00:00
CanbiZ (MickLesk)
d9c276c49c tolgee: bump required JDK from 21 to 25 (#17005) 2026-09-05 13:03:57 +10:00
CanbiZ (MickLesk)
cfb0bfe4ac Refactor FileFlows: Stop Spinner before read -rp / Switch from "Node" to "Agent" (#17007)
* FileFlows Node: Stop Spinner before read -rp

* fileflows: update install path for Node->Agent rename, detect service unit dynamically

* fileflows: tolerate no pre-existing fileflows units when checking for the new Agent unit
2026-09-05 13:03:40 +10:00
community-scripts-pr-app[bot]
1d973f42a8 Update CHANGELOG.md (#17026)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-05 03:03:06 +00:00
CanbiZ (MickLesk)
1d1fd98d05 romm: write real version into backend/__version__.py placeholder (#17009) 2026-09-05 13:02:40 +10:00
community-scripts-pr-app[bot]
d01e9a2c33 Update CHANGELOG.md (#17024)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-04 20:55:38 +00:00
Corgei
06cafd68c4 fix(shlink): preserve servers.json across web-client updates (#17023)
CLEAN_INSTALL wipes /opt/shlink-web-client on every `update`, deleting the
user's servers.json (and its API key) with no backup, unlike the main
/opt/shlink app which already backs up/restores .env and data around its
CLEAN_INSTALL. This makes the Web Client lose its configured server(s) on
every update.

Reuse the existing create_backup/restore_backup helpers around the
web-client's CLEAN_INSTALL, mirroring the pattern already used for
/opt/shlink.
2026-09-04 22:55:11 +02:00
community-scripts-pr-app[bot]
455039d11f Update CHANGELOG.md (#17017)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-04 15:53:00 +00:00
CanbiZ (MickLesk)
c272987bad Fix npm v12 allow-git/allow-remote restrictions across affected scripts (#17014)
* bentopdf: allow remote npm dependency for xlsx under npm v12

* librechat: allow remote npm dependency for xlsx under npm v12

* pangolin: allow remote npm dependencies for iron-remote-desktop packages under npm v12

* baserow: allow remote npm dependency for xlsx under npm v12

* cryptpad: allow git-based npm dependencies for drawio and json.sortify under npm v12
2026-09-04 17:52:31 +02:00
community-scripts-pr-app[bot]
02c54f3be5 Update CHANGELOG.md (#17013)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-04 12:39:50 +00:00
lucas-at-3x-eye
734e43004e Fix/poznote - 1st party Docker parity (#17011)
* fix(poznote): align nginx config with upstream Docker defaults

* fix(poznote): run init.sh on install and update, not just in Docker

* fix(poznote): add systemd units for the reminder-email and s3-backup workers

* fix(poznote): retrofit nginx config and worker services on update, sanitize timeout comment

* fix(poznote): silence init.sh output and consolidate worker enable/start

* fix(poznote): update ct/poznote.sh to use new default bootstrapper
2026-09-04 14:39:17 +02:00
25 changed files with 426 additions and 35 deletions

View File

@@ -530,13 +530,45 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details> </details>
## 2026-09-05
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- authentik: scope blueprints chown to avoid recursing into the mp0 bind mount [@MickLesk](https://github.com/MickLesk) ([#17008](https://github.com/community-scripts/ProxmoxVE/pull/17008))
- iventoy: run iventoy.sh with bash instead of dash [@MickLesk](https://github.com/MickLesk) ([#17034](https://github.com/community-scripts/ProxmoxVE/pull/17034))
- frigate: restart go2rtc.service before frigate starts [@MickLesk](https://github.com/MickLesk) ([#17035](https://github.com/community-scripts/ProxmoxVE/pull/17035))
- snapotter: seed AI venv base packages on arm64, warn amd64 has no working CPU bundle [@MickLesk](https://github.com/MickLesk) ([#16903](https://github.com/community-scripts/ProxmoxVE/pull/16903))
- tolgee: bump required JDK from 21 to 25 [@MickLesk](https://github.com/MickLesk) ([#17005](https://github.com/community-scripts/ProxmoxVE/pull/17005))
- romm: write real version into backend/__version__.py placeholder [@MickLesk](https://github.com/MickLesk) ([#17009](https://github.com/community-scripts/ProxmoxVE/pull/17009))
- #### 🔧 Refactor
- Refactor FileFlows: Stop Spinner before read -rp / Switch from "Node" to "Agent" [@MickLesk](https://github.com/MickLesk) ([#17007](https://github.com/community-scripts/ProxmoxVE/pull/17007))
### 💾 Core
- update helper: follow renamed ct/ scripts instead of curling a 404 [@MickLesk](https://github.com/MickLesk) ([core#22](https://github.com/community-scripts/core/pull/22))
- Use Proxmox for a template before reaching for linuxcontainers.org [@MickLesk](https://github.com/MickLesk) ([core#23](https://github.com/community-scripts/core/pull/23))
- implement exponential backoff for curl retries in _cs_curl_retry function [@MickLesk](https://github.com/MickLesk) ([core#26](https://github.com/community-scripts/core/pull/26))
### 🧰 Tools
- #### 🐞 Bug Fixes
- update-apps: follow renamed ct/ scripts instead of erroring out [@MickLesk](https://github.com/MickLesk) ([#16991](https://github.com/community-scripts/ProxmoxVE/pull/16991))
## 2026-09-04 ## 2026-09-04
### 🚀 Updated Scripts ### 🚀 Updated Scripts
- #### 🐞 Bug Fixes - #### 🐞 Bug Fixes
- fix(shlink): preserve servers.json across web-client updates [@Corgei](https://github.com/Corgei) ([#17023](https://github.com/community-scripts/ProxmoxVE/pull/17023))
- fix-update-authentik-2026.8.1 [@thieneret](https://github.com/thieneret) ([#16999](https://github.com/community-scripts/ProxmoxVE/pull/16999)) - fix-update-authentik-2026.8.1 [@thieneret](https://github.com/thieneret) ([#16999](https://github.com/community-scripts/ProxmoxVE/pull/16999))
- Fix npm v12 allow-git/allow-remote restrictions across affected scripts [@MickLesk](https://github.com/MickLesk) ([#17014](https://github.com/community-scripts/ProxmoxVE/pull/17014))
- Fix/poznote - 1st party Docker parity [@lucas-at-3x-eye](https://github.com/lucas-at-3x-eye) ([#17011](https://github.com/community-scripts/ProxmoxVE/pull/17011))
### 💾 Core ### 💾 Core

View File

@@ -88,7 +88,7 @@ function update_script() {
msg_info "Moving blueprints to presistent directory" msg_info "Moving blueprints to presistent directory"
cp -r /opt/authentik/blueprints /opt/authentik-data/ cp -r /opt/authentik/blueprints /opt/authentik-data/
rm -r /opt/authentik/blueprints rm -r /opt/authentik/blueprints
chown -Rf authentik:authentik /opt/authentik-data $STD find /opt/authentik-data -path '*/lost+found' -prune -o -exec chown authentik:authentik {} +
yq -i ".blueprints_dir = \"/opt/authentik-data/blueprints\"" /etc/authentik/config.yml yq -i ".blueprints_dir = \"/opt/authentik-data/blueprints\"" /etc/authentik/config.yml
msg_ok "blueprints moved to presistent directory" msg_ok "blueprints moved to presistent directory"
msg_warn "The blueprints provided by authentik are always overwritten when updated! Only manually created custom blueprints remain unchanged between updates." msg_warn "The blueprints provided by authentik are always overwritten when updated! Only manually created custom blueprints remain unchanged between updates."
@@ -155,7 +155,7 @@ function update_script() {
cp -r /opt/authentik/blueprints /opt/authentik-data/ cp -r /opt/authentik/blueprints /opt/authentik-data/
rm -r /opt/authentik/blueprints rm -r /opt/authentik/blueprints
chown -Rf authentik:authentik /opt/authentik-data $STD find /opt/authentik-data -path '*/lost+found' -prune -o -exec chown authentik:authentik {} +
if [[ $MAJOR == 2026 && $MINOR -lt 8 ]]; then if [[ $MAJOR == 2026 && $MINOR -lt 8 ]]; then
msg_info "Updating Worker and Server config (from $MAJOR.$MINOR)" msg_info "Updating Worker and Server config (from $MAJOR.$MINOR)"
@@ -178,8 +178,8 @@ EOF
fi fi
msg_info "Updating Worker and Server config" msg_info "Updating Worker and Server config"
sed -i "s|/dev/shm$|/dev/shm/authentik-server|g" /etc/default/authentik-server sed -i "s|/dev/shm\/\?$|/dev/shm/authentik-server|g" /etc/default/authentik-server
sed -i "s|/dev/shm$|/dev/shm/authentik-worker|g" /etc/default/authentik-worker sed -i "s|/dev/shm\/\?$|/dev/shm/authentik-worker|g" /etc/default/authentik-worker
msg_ok "Updated Worker and Server config" msg_ok "Updated Worker and Server config"
msg_info "Updating services" msg_info "Updating services"
@@ -228,7 +228,7 @@ $STD pct exec "$CTID" -- bash -c "mkdir -p /opt/authentik-data/{certs,media,geoi
cp /opt/authentik/tests/GeoLite2-City-Test.mmdb /opt/authentik-data/geoip/GeoLite2-City.mmdb; \ cp /opt/authentik/tests/GeoLite2-City-Test.mmdb /opt/authentik-data/geoip/GeoLite2-City.mmdb; \
cp -r /opt/authentik/blueprints /opt/authentik-data/; \ cp -r /opt/authentik/blueprints /opt/authentik-data/; \
rm -r /opt/authentik/blueprints; \ rm -r /opt/authentik/blueprints; \
chown -Rf authentik:authentik /opt/authentik-data" find /opt/authentik-data -path '*/lost+found' -prune -o -exec chown authentik:authentik {} +"
msg_ok "Attached data storage volume" msg_ok "Attached data storage volume"
msg_info "Starting Services" msg_info "Starting Services"

View File

@@ -48,7 +48,7 @@ function update_script() {
msg_info "Rebuilding Frontend" msg_info "Rebuilding Frontend"
cd /opt/baserow/web-frontend cd /opt/baserow/web-frontend
$STD npm install $STD npm install --allow-remote=all
$STD npm run build $STD npm run build
msg_ok "Rebuilt Frontend" msg_ok "Rebuilt Frontend"

View File

@@ -44,7 +44,7 @@ function update_script() {
msg_info "Configuring BentoPDF" msg_info "Configuring BentoPDF"
cd /opt/bentopdf cd /opt/bentopdf
$STD npm ci --no-audit --no-fund $STD npm ci --no-audit --no-fund --allow-remote=all
export NODE_OPTIONS="--max-old-space-size=3072" export NODE_OPTIONS="--max-old-space-size=3072"
export SIMPLE_MODE=true export SIMPLE_MODE=true
export VITE_USE_CDN=true export VITE_USE_CDN=true

View File

@@ -51,7 +51,7 @@ function update_script() {
msg_info "Updating CryptPad" msg_info "Updating CryptPad"
cd /opt/cryptpad cd /opt/cryptpad
$STD npm ci $STD npm ci --allow-git=all
$STD npm run install:components $STD npm run install:components
if [ -f "/opt/cryptpad/install-onlyoffice.sh" ]; then if [ -f "/opt/cryptpad/install-onlyoffice.sh" ]; then
$STD bash /opt/cryptpad/install-onlyoffice.sh --accept-license $STD bash /opt/cryptpad/install-onlyoffice.sh --accept-license

View File

@@ -45,7 +45,7 @@ function update_script() {
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
cd /opt/librechat cd /opt/librechat
$STD npm ci $STD npm ci --allow-remote=all
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
msg_info "Building Frontend" msg_info "Building Frontend"

View File

@@ -63,7 +63,7 @@ function update_script() {
msg_info "Updating Pangolin" msg_info "Updating Pangolin"
cd /opt/pangolin cd /opt/pangolin
$STD npm ci $STD npm ci --allow-remote=all
$STD npm run set:pg $STD npm run set:pg
$STD npm run set:oss $STD npm run set:oss
rm -rf server/private rm -rf server/private

View File

@@ -35,6 +35,7 @@ function update_script() {
if check_for_gh_release "poznote" "timothepoznanski/poznote"; then if check_for_gh_release "poznote" "timothepoznanski/poznote"; then
msg_info "Stopping Service" msg_info "Stopping Service"
systemctl stop nginx systemctl stop nginx
systemctl stop poznote-reminder-worker poznote-s3-backup-worker 2>/dev/null || true
msg_ok "Stopped Service" msg_ok "Stopped Service"
create_backup /var/www/html/data create_backup /var/www/html/data
@@ -48,8 +49,178 @@ function update_script() {
restore_backup restore_backup
msg_info "Running Poznote Initialization"
chmod +x /opt/poznote/init.sh
$STD /opt/poznote/init.sh
msg_ok "Initialized Poznote Data Directory"
msg_info "Updating Nginx Configuration"
[[ -f /etc/nginx/sites-available/poznote ]] && cp /etc/nginx/sites-available/poznote /etc/nginx/sites-available/poznote.bak
PHP_SOCK=$(get_php_fpm_socket)
cat <<EOF >/etc/nginx/sites-available/poznote
# The Excalidraw editor must keep its window.opener relationship with
# libraries.excalidraw.com so "Add to Excalidraw" can hand the chosen library
# back to the already-open editor tab; COOP same-origin would sever it.
map \$uri \$poznote_coop {
default "same-origin";
/excalidraw_editor.php "unsafe-none";
}
server {
listen 8040;
root /var/www/html;
index index.php index.html;
gzip on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_vary on;
gzip_proxied any;
gzip_types text/css application/javascript text/javascript application/json
image/svg+xml application/manifest+json font/ttf font/otf;
location ~* \.webmanifest$ {
default_type application/manifest+json;
try_files \$uri =404;
}
client_max_body_size 800M;
location /api/v1 {
try_files \$uri \$uri/ /api/v1/index.php?\$query_string;
}
location = /api/health {
rewrite ^ /api_health.php last;
}
location = /api/info {
rewrite ^ /api_health.php last;
}
location / {
try_files \$uri \$uri/ @poznote_public;
}
location @poznote_public {
rewrite ^/folder/([^/]+)/?$ /public_folder.php?token=\$1 last;
rewrite ^/workspace/([^/]+)/?$ /public_note.php?token=\$1 last;
rewrite ^/([^/]+)/?$ /public_slug.php?slug=\$1 last;
}
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Cross-Origin-Opener-Policy \$poznote_coop always;
add_header Cross-Origin-Resource-Policy "same-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;
location ~* ^/data/.*\.(php[0-9]?|phtml|phar|pht)$ {
deny all;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:${PHP_SOCK};
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT \$document_root;
fastcgi_param PATH_INFO \$fastcgi_path_info;
fastcgi_param HTTP_X_FORWARDED_FOR \$http_x_forwarded_for;
fastcgi_param HTTP_X_FORWARDED_PROTO \$http_x_forwarded_proto;
fastcgi_param HTTP_X_FORWARDED_HOST \$http_x_forwarded_host;
fastcgi_param HTTP_X_FORWARDED_PORT \$http_x_forwarded_port;
fastcgi_param HTTP_X_REAL_IP \$http_x_real_ip;
fastcgi_param HTTPS \$https if_not_empty;
# fastcgi_read_timeout 600;
# fastcgi_send_timeout 600;
# Left at nginx's 60s default, not Docker's 600s:
# a stalled git-sync request can hold the PHP session lock, otherwise
}
location ~ /\. {
deny all;
}
location ~ ^/data/users/[0-9]+/backgrounds/ {
try_files \$uri =404;
}
location ~ ^/data/css/[A-Za-z0-9._-]+\.css$ {
try_files \$uri =404;
}
location ~ ^/(data|config)/ {
deny all;
}
location ~* ^/pwa/poznote(-[0-9]+)?\.png$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header X-Content-Type-Options "nosniff" always;
add_header Cross-Origin-Resource-Policy "cross-origin" always;
try_files \$uri =404;
}
location ~* \.(?:js|css|png|jpg|jpeg|gif|svg|ico|woff2?|ttf|otf|eot|webp|webmanifest)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header X-Content-Type-Options "nosniff" always;
add_header Cross-Origin-Resource-Policy "same-origin" always;
try_files \$uri =404;
}
}
EOF
msg_ok "Updated Nginx Configuration"
if [[ ! -f /etc/systemd/system/poznote-reminder-worker.service ]]; then
msg_info "Creating Reminder Worker Service"
cat <<EOF >/etc/systemd/system/poznote-reminder-worker.service
[Unit]
Description=Poznote Reminder Email Worker
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /var/www/html/workers/reminder-email-worker.php
WorkingDirectory=/var/www/html
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
msg_ok "Created Reminder Worker Service"
fi
if [[ ! -f /etc/systemd/system/poznote-s3-backup-worker.service ]]; then
msg_info "Creating S3 Backup Worker Service"
cat <<EOF >/etc/systemd/system/poznote-s3-backup-worker.service
[Unit]
Description=Poznote S3 Backup Worker
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /var/www/html/workers/s3-backup-worker.php
WorkingDirectory=/var/www/html
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
msg_ok "Created S3 Backup Worker Service"
fi
msg_info "Starting Service" msg_info "Starting Service"
systemctl start nginx systemctl start nginx
systemctl enable -q --now poznote-reminder-worker poznote-s3-backup-worker
msg_ok "Started Service" msg_ok "Started Service"
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
fi fi

View File

@@ -51,6 +51,7 @@ function update_script() {
/opt/romm/frontend/dist/assets/ruffle /opt/romm/frontend/dist/assets/ruffle
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "romm" "rommapp/romm" "tarball" "latest" "/opt/romm" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "romm" "rommapp/romm" "tarball" "latest" "/opt/romm"
echo "__version__ = \"$(cat ~/.romm)\"" >/opt/romm/backend/__version__.py
find /opt/romm/backend/alembic/versions -maxdepth 1 -type f -name '1.*.py' -delete 2>/dev/null || true find /opt/romm/backend/alembic/versions -maxdepth 1 -type f -name '1.*.py' -delete 2>/dev/null || true
find /opt/romm/backend/alembic/versions -maxdepth 1 -type f -name '2.0.0_.py' -delete 2>/dev/null || true find /opt/romm/backend/alembic/versions -maxdepth 1 -type f -name '2.0.0_.py' -delete 2>/dev/null || true

View File

@@ -61,7 +61,12 @@ function update_script() {
if [[ -d /opt/shlink-web-client ]]; then if [[ -d /opt/shlink-web-client ]]; then
if check_for_gh_release "shlink-web-client" "shlinkio/shlink-web-client"; then if check_for_gh_release "shlink-web-client" "shlinkio/shlink-web-client"; then
create_backup /opt/shlink-web-client/servers.json
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "shlink-web-client" "shlinkio/shlink-web-client" "prebuild" "latest" "/opt/shlink-web-client" "shlink-web-client_*_dist.zip" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "shlink-web-client" "shlinkio/shlink-web-client" "prebuild" "latest" "/opt/shlink-web-client" "shlink-web-client_*_dist.zip"
restore_backup
msg_ok "Updated Web Client" msg_ok "Updated Web Client"
fi fi
fi fi

View File

@@ -88,6 +88,13 @@ EOF
msg_info "Updating SnapOtter" msg_info "Updating SnapOtter"
$STD uv python install 3.11 $STD uv python install 3.11
$STD uv venv --seed --python 3.11 /opt/snapotter_data/ai/venv $STD uv venv --seed --python 3.11 /opt/snapotter_data/ai/venv
if [[ "$(arch_resolve)" == "arm64" ]]; then
$STD uv pip install --python /opt/snapotter_data/ai/venv/bin/python \
numpy==1.26.4 Pillow==12.3.0 opencv-python-headless==4.10.0.84 fonttools \
'huggingface-hub[hf_xet,hf_transfer]==0.36.2'
else
msg_warn "SnapOtter AI Features have no working CPU-only bundle for amd64 upstream (published bundle is Python 3.12/GPU-CUDA only). Use the official Docker image instead: https://docs.snapotter.com"
fi
ln -sfn /opt/snapotter /app ln -sfn /opt/snapotter /app
msg_ok "Updated SnapOtter" msg_ok "Updated SnapOtter"

View File

@@ -37,6 +37,8 @@ function update_script() {
systemctl stop tolgee systemctl stop tolgee
msg_ok "Stopped Service" msg_ok "Stopped Service"
JAVA_VERSION="25" setup_java
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tolgee" "tolgee/tolgee-platform" "singlefile" "latest" "/opt/tolgee" "tolgee-*.jar" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tolgee" "tolgee/tolgee-platform" "singlefile" "latest" "/opt/tolgee" "tolgee-*.jar"
find /opt/tolgee -maxdepth 1 -type f -name 'tolgee-*.jar' -exec mv {} /opt/tolgee/tolgee.jar \; find /opt/tolgee -maxdepth 1 -type f -name 'tolgee-*.jar' -exec mv {} /opt/tolgee/tolgee.jar \;

View File

@@ -45,7 +45,7 @@ msg_ok "Installed Backend Dependencies"
msg_info "Building Frontend" msg_info "Building Frontend"
cd /opt/baserow/web-frontend cd /opt/baserow/web-frontend
NODE_OPTIONS="--max-old-space-size=4096" $STD npm install --legacy-peer-deps NODE_OPTIONS="--max-old-space-size=4096" $STD npm install --legacy-peer-deps --allow-remote=all
NODE_OPTIONS="--max-old-space-size=4096" $STD npm run build NODE_OPTIONS="--max-old-space-size=4096" $STD npm run build
msg_ok "Built Frontend" msg_ok "Built Frontend"

View File

@@ -24,7 +24,7 @@ fetch_and_deploy_gh_release "bentopdf" "alam00000/bentopdf" "tarball" "latest" "
msg_info "Setup BentoPDF" msg_info "Setup BentoPDF"
cd /opt/bentopdf cd /opt/bentopdf
$STD npm ci --no-audit --no-fund $STD npm ci --no-audit --no-fund --allow-remote=all
cp ./.env.example ./.env.production cp ./.env.example ./.env.production
export NODE_OPTIONS="--max-old-space-size=3072" export NODE_OPTIONS="--max-old-space-size=3072"
export SIMPLE_MODE=true export SIMPLE_MODE=true

View File

@@ -24,7 +24,7 @@ fetch_and_deploy_gh_release "cryptpad" "cryptpad/cryptpad" "tarball"
msg_info "Setup CryptPad" msg_info "Setup CryptPad"
cd /opt/cryptpad cd /opt/cryptpad
$STD npm ci $STD npm ci --allow-git=all
$STD npm run install:components $STD npm run install:components
if [[ "$onlyoffice" =~ ^[Yy]$ ]]; then if [[ "$onlyoffice" =~ ^[Yy]$ ]]; then
$STD bash -c "./install-onlyoffice.sh --accept-license" $STD bash -c "./install-onlyoffice.sh --accept-license"

View File

@@ -45,7 +45,7 @@ $STD ln -svf /usr/bin/ffmpeg /usr/local/bin/ffmpeg
$STD ln -svf /usr/bin/ffprobe /usr/local/bin/ffprobe $STD ln -svf /usr/bin/ffprobe /usr/local/bin/ffprobe
$STD rm -rf /opt/fileflows/Server/runtimes/win-* $STD rm -rf /opt/fileflows/Server/runtimes/win-*
read -r -p "${TAB3}Do you want to install FileFlows Server or Node? (S/N): " install_server read -r -p "${TAB3}Do you want to install FileFlows Server or Agent? (S/A): " install_server
if [[ "$install_server" =~ ^[Ss]$ ]]; then if [[ "$install_server" =~ ^[Ss]$ ]]; then
msg_info "Installing FileFlows Server" msg_info "Installing FileFlows Server"
@@ -54,15 +54,23 @@ if [[ "$install_server" =~ ^[Ss]$ ]]; then
systemctl enable -q --now fileflows systemctl enable -q --now fileflows
msg_ok "Installed FileFlows Server" msg_ok "Installed FileFlows Server"
else else
msg_info "Installing FileFlows Node" msg_info "Installing FileFlows Agent"
stop_spinner
read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url
while [[ -z "${server_url// /}" ]]; do while [[ -z "${server_url// /}" ]]; do
read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url
done done
cd /opt/fileflows/Node cd /opt/fileflows/Agent
$STD dotnet FileFlows.Node.dll --server "$server_url" --systemd install --root true before_units="$(systemctl list-unit-files 'fileflows*' --no-legend 2>/dev/null | awk '{print $1}' | sort || true)"
systemctl enable -q --now fileflows-node $STD dotnet FileFlows.Agent.dll --server "$server_url" --systemd install --root true
msg_ok "Installed FileFlows Node" after_units="$(systemctl list-unit-files 'fileflows*' --no-legend 2>/dev/null | awk '{print $1}' | sort || true)"
agent_unit="$(comm -13 <(echo "$before_units") <(echo "$after_units") | head -n1)"
if [[ -n "$agent_unit" ]]; then
systemctl enable -q --now "$agent_unit"
else
msg_warn "Could not detect the FileFlows Agent systemd unit; start it manually (systemctl list-unit-files 'fileflows*')."
fi
msg_ok "Installed FileFlows Agent"
fi fi
motd_ssh motd_ssh

View File

@@ -362,6 +362,7 @@ Restart=always
RestartSec=1 RestartSec=1
User=root User=root
EnvironmentFile=/etc/frigate.env EnvironmentFile=/etc/frigate.env
ExecStartPre=+/usr/bin/systemctl restart go2rtc.service
ExecStartPre=+rm -f /dev/shm/logs/frigate/current ExecStartPre=+rm -f /dev/shm/logs/frigate/current
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '" ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
StandardOutput=file:/dev/shm/logs/frigate/current StandardOutput=file:/dev/shm/logs/frigate/current

View File

@@ -31,8 +31,8 @@ Environment=IVENTOY_API_ALL=1
Environment=IVENTOY_AUTO_RUN=1 Environment=IVENTOY_AUTO_RUN=1
Environment=LIBRARY_PATH=/opt/iventoy/lib/lin64 Environment=LIBRARY_PATH=/opt/iventoy/lib/lin64
Environment=LD_LIBRARY_PATH=/opt/iventoy/lib/lin64 Environment=LD_LIBRARY_PATH=/opt/iventoy/lib/lin64
ExecStart=/bin/sh /opt/iventoy/iventoy.sh -R start ExecStart=/bin/bash /opt/iventoy/iventoy.sh -R start
ExecStop=/bin/sh /opt/iventoy/iventoy.sh stop ExecStop=/bin/bash /opt/iventoy/iventoy.sh stop
Restart=on-failure Restart=on-failure
RestartSec=5 RestartSec=5

View File

@@ -25,7 +25,7 @@ fetch_and_deploy_gh_release "rag-api" "danny-avila/rag_api" "tarball"
msg_info "Installing LibreChat Dependencies" msg_info "Installing LibreChat Dependencies"
cd /opt/librechat cd /opt/librechat
$STD npm ci $STD npm ci --allow-remote=all
msg_ok "Installed LibreChat Dependencies" msg_ok "Installed LibreChat Dependencies"
msg_info "Building Frontend" msg_info "Building Frontend"

View File

@@ -45,7 +45,7 @@ SECRET_KEY=$(openssl rand -base64 48 | tr -dc 'A-Za-z0-9' | head -c 32)
BADGER_VERSION=$(get_latest_github_release "fosrl/badger" "false") BADGER_VERSION=$(get_latest_github_release "fosrl/badger" "false")
cd /opt/pangolin cd /opt/pangolin
mkdir -p /opt/pangolin/config/{traefik,db,letsencrypt,logs} mkdir -p /opt/pangolin/config/{traefik,db,letsencrypt,logs}
$STD npm ci $STD npm ci --allow-remote=all
$STD npm run set:pg $STD npm run set:pg
$STD npm run set:oss $STD npm run set:oss
rm -rf server/private rm -rf server/private

View File

@@ -28,16 +28,73 @@ touch /var/www/html/data/database/poznote.db
chown -R www-data:www-data /var/www/html chown -R www-data:www-data /var/www/html
msg_ok "Deployed Poznote" msg_ok "Deployed Poznote"
msg_info "Running Poznote Initialization"
chmod +x /opt/poznote/init.sh
$STD /opt/poznote/init.sh
msg_ok "Initialized Poznote Data Directory"
msg_info "Configuring Nginx" msg_info "Configuring Nginx"
PHP_SOCK=$(get_php_fpm_socket) PHP_SOCK=$(get_php_fpm_socket)
cat <<EOF >/etc/nginx/sites-available/poznote cat <<EOF >/etc/nginx/sites-available/poznote
# The Excalidraw editor must keep its window.opener relationship with
# libraries.excalidraw.com so "Add to Excalidraw" can hand the chosen library
# back to the already-open editor tab; COOP same-origin would sever it.
map \$uri \$poznote_coop {
default "same-origin";
/excalidraw_editor.php "unsafe-none";
}
server { server {
listen 8040; listen 8040;
root /var/www/html; root /var/www/html;
index index.php index.html; index index.php index.html;
gzip on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_vary on;
gzip_proxied any;
gzip_types text/css application/javascript text/javascript application/json
image/svg+xml application/manifest+json font/ttf font/otf;
location ~* \.webmanifest$ {
default_type application/manifest+json;
try_files \$uri =404;
}
client_max_body_size 800M;
location /api/v1 {
try_files \$uri \$uri/ /api/v1/index.php?\$query_string;
}
location = /api/health {
rewrite ^ /api_health.php last;
}
location = /api/info {
rewrite ^ /api_health.php last;
}
location / { location / {
try_files \$uri \$uri/ /index.php?\$query_string; try_files \$uri \$uri/ @poznote_public;
}
location @poznote_public {
rewrite ^/folder/([^/]+)/?$ /public_folder.php?token=\$1 last;
rewrite ^/workspace/([^/]+)/?$ /public_note.php?token=\$1 last;
rewrite ^/([^/]+)/?$ /public_slug.php?slug=\$1 last;
}
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Cross-Origin-Opener-Policy \$poznote_coop always;
add_header Cross-Origin-Resource-Policy "same-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;
location ~* ^/data/.*\.(php[0-9]?|phtml|phar|pht)$ {
deny all;
} }
location ~ \.php$ { location ~ \.php$ {
@@ -45,16 +102,93 @@ server {
fastcgi_pass unix:${PHP_SOCK}; fastcgi_pass unix:${PHP_SOCK};
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT \$document_root; fastcgi_param DOCUMENT_ROOT \$document_root;
fastcgi_param PATH_INFO \$fastcgi_path_info;
fastcgi_param HTTP_X_FORWARDED_FOR \$http_x_forwarded_for;
fastcgi_param HTTP_X_FORWARDED_PROTO \$http_x_forwarded_proto;
fastcgi_param HTTP_X_FORWARDED_HOST \$http_x_forwarded_host;
fastcgi_param HTTP_X_FORWARDED_PORT \$http_x_forwarded_port;
fastcgi_param HTTP_X_REAL_IP \$http_x_real_ip;
fastcgi_param HTTPS \$https if_not_empty;
# fastcgi_read_timeout 600;
# fastcgi_send_timeout 600;
# Left at nginx's 60s default, not Docker's 600s:
# a stalled git-sync request can hold the PHP session lock, otherwise
} }
location ~ /\.ht { location ~ /\. {
deny all; deny all;
} }
location ~ ^/data/users/[0-9]+/backgrounds/ {
try_files \$uri =404;
}
location ~ ^/data/css/[A-Za-z0-9._-]+\.css$ {
try_files \$uri =404;
}
location ~ ^/(data|config)/ {
deny all;
}
location ~* ^/pwa/poznote(-[0-9]+)?\.png$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header X-Content-Type-Options "nosniff" always;
add_header Cross-Origin-Resource-Policy "cross-origin" always;
try_files \$uri =404;
}
location ~* \.(?:js|css|png|jpg|jpeg|gif|svg|ico|woff2?|ttf|otf|eot|webp|webmanifest)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header X-Content-Type-Options "nosniff" always;
add_header Cross-Origin-Resource-Policy "same-origin" always;
try_files \$uri =404;
}
} }
EOF EOF
nginx_enable_site poznote nginx_enable_site poznote
msg_ok "Configured Nginx" msg_ok "Configured Nginx"
msg_info "Creating Background Worker Services"
cat <<EOF >/etc/systemd/system/poznote-reminder-worker.service
[Unit]
Description=Poznote Reminder Email Worker
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /var/www/html/workers/reminder-email-worker.php
WorkingDirectory=/var/www/html
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF >/etc/systemd/system/poznote-s3-backup-worker.service
[Unit]
Description=Poznote S3 Backup Worker
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /var/www/html/workers/s3-backup-worker.php
WorkingDirectory=/var/www/html
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now poznote-reminder-worker poznote-s3-backup-worker
msg_ok "Created Background Worker Services"
motd_ssh motd_ssh
customize customize
cleanup_lxc cleanup_lxc

View File

@@ -161,6 +161,7 @@ else
fi fi
fetch_and_deploy_gh_release "romm" "rommapp/romm" "tarball" fetch_and_deploy_gh_release "romm" "rommapp/romm" "tarball"
echo "__version__ = \"$(cat ~/.romm)\"" >/opt/romm/backend/__version__.py
msg_info "Creating environment file" msg_info "Creating environment file"
sed -i 's/^supervised no/supervised systemd/' /etc/redis/redis.conf sed -i 's/^supervised no/supervised systemd/' /etc/redis/redis.conf

View File

@@ -34,7 +34,12 @@ $STD apt install -y \
python3 \ python3 \
python3-dev \ python3-dev \
gcc \ gcc \
g++ g++ \
libavif-bin \
libavif-dev \
libopencv-dev \
python3-opencv \
libgles2
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
PYTHON_VERSION="3.11" setup_uv PYTHON_VERSION="3.11" setup_uv
@@ -59,11 +64,13 @@ msg_info "Setting up Python Environment"
mkdir -p /opt/snapotter_data/ai/models/rembg mkdir -p /opt/snapotter_data/ai/models/rembg
$STD uv python install 3.11 $STD uv python install 3.11
$STD uv venv --seed --python 3.11 /opt/snapotter_data/ai/venv $STD uv venv --seed --python 3.11 /opt/snapotter_data/ai/venv
#if [[ -f /opt/snapotter/packages/ai/python/requirements.txt ]]; then if [[ "$(arch_resolve)" == "arm64" ]]; then
# $STD uv pip install \ $STD uv pip install --python /opt/snapotter_data/ai/venv/bin/python \
# --python /opt/snapotter_data/ai/venv/bin/python \ numpy==1.26.4 Pillow==12.3.0 opencv-python-headless==4.10.0.84 fonttools \
# -r /opt/snapotter/packages/ai/python/requirements.txt 'huggingface-hub[hf_xet,hf_transfer]==0.36.2'
#fi else
msg_warn "SnapOtter AI Features have no working CPU-only bundle for amd64 upstream (published bundle is Python 3.12/GPU-CUDA only). Use the official Docker image instead: https://docs.snapotter.com"
fi
ln -sfn /opt/snapotter /app ln -sfn /opt/snapotter /app
msg_ok "Set up Python Environment" msg_ok "Set up Python Environment"

View File

@@ -13,7 +13,7 @@ setting_up_container
network_check network_check
update_os update_os
JAVA_VERSION="21" setup_java JAVA_VERSION="25" setup_java
PG_VERSION="16" setup_postgresql PG_VERSION="16" setup_postgresql
PG_DB_NAME="tolgee" PG_DB_USER="tolgee" setup_postgresql_db PG_DB_NAME="tolgee" PG_DB_USER="tolgee" setup_postgresql_db

View File

@@ -155,13 +155,29 @@ function sanitize_service_name() {
return 0 return 0
} }
function validate_service_script() { function script_exists() {
local name="$1" local name="$1"
sanitize_service_name "$name" || return 1 sanitize_service_name "$name" || return 1
curl -fsSL --max-time 10 -o /dev/null \ curl -fsSL --max-time 10 -o /dev/null \
"https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${name}.sh" 2>/dev/null "https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${name}.sh" 2>/dev/null
} }
# A container keeps the slug it was built with, so a renamed ct/ script leaves it
# pointing at a name that no longer exists. Try the successors, but only accept one
# that is really there -- guessing wrong would run a foreign app's updater.
function resolve_service_script() {
local n="$1" c
script_exists "$n" && { printf '%s' "$n"; return 0; }
for c in "${n#alpine-}" "$(printf '%s' "$n" | sed -E 's/-v[0-9]+$//')"; do
[[ -n "$c" && "$c" != "$n" ]] || continue
script_exists "$c" && { printf '%s' "$c"; return 0; }
done
case "$n" in
pbs) script_exists proxmox-backup-server && { printf '%s' proxmox-backup-server; return 0; } ;;
esac
return 1
}
function detect_service() { function detect_service() {
local container="$1" local container="$1"
local tmpdir update_file local tmpdir update_file
@@ -484,12 +500,18 @@ for container in $CHOICE; do
continue continue
fi fi
if ! validate_service_script "${service}"; then resolved_service="$(resolve_service_script "${service}")"
if [ -z "${resolved_service}" ]; then
echo -e "${RD}[ERROR]${CL} Service '${service}' does not resolve to ct/${service}.sh" echo -e "${RD}[ERROR]${CL} Service '${service}' does not resolve to ct/${service}.sh"
log_result "$container" "${service}" "ERROR" "No matching ct/${service}.sh script found" log_result "$container" "${service}" "ERROR" "No matching ct/${service}.sh script found"
log_write "Container $container: ERROR — ct/${service}.sh not found" log_write "Container $container: ERROR — ct/${service}.sh not found"
continue continue
fi fi
if [ "${resolved_service}" != "${service}" ]; then
echo -e "${BL}[INFO]${CL} Script was renamed: ${service} -> ${GN}${resolved_service}${CL}"
log_write "Container $container: slug ${service} resolved to ${resolved_service}"
service="${resolved_service}"
fi
echo -e "${BL}[INFO]${CL} Detected service: ${GN}${service}${CL}" echo -e "${BL}[INFO]${CL} Detected service: ${GN}${service}${CL}"
log_write "Container $container: detected service '${service}'" log_write "Container $container: detected service '${service}'"