Compare commits

...

19 Commits

Author SHA1 Message Date
CanbiZ (MickLesk) 62498a99de fix(node): add setup_nodejs to update scripts for iobroker, kima-hub, myip
These three scripts had NODE_VERSION in install but not in update,
so running an update would not upgrade Node.js to the correct version.

- iobroker: add NODE_VERSION=24
- kima-hub: add NODE_VERSION=22
- myip: add NODE_VERSION=24
2026-04-20 10:47:59 +02:00
CanbiZ (MickLesk) ef71bcbbf1 fix(node): align Node.js versions with upstream for 5 scripts
Update scripts where upstream requires a newer Node.js version:
- iobroker: 22 → 24 (upstream .nvmrc)
- kima-hub: 20 → 22 (upstream Dockerfile)
- myip: 22 → 24 (upstream Dockerfile)
- outline: 22 → 24 (upstream Dockerfile)
- shelfmark: 22 → 24 (upstream Dockerfile)

Skipped 15 scripts where our version is already newer than upstream.

Ref: community-scripts/ProxmoxVE#13870
2026-04-20 10:46:18 +02:00
community-scripts-pr-app[bot] 7e5e5be161 Update CHANGELOG.md (#13873)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-20 08:19:24 +00:00
CanbiZ (MickLesk) 55c7549c3e Refactor: PMG Post Install (#13693)
* PMG Post Install: Detect gateway via /etc/os-release when /etc/issue is generic

* PMG Post Install: detect gateway via dpkg or PMG service units

* PMG: migrate post-install to deb822 format, fix APT source conflicts

- Simplify PMG detection to dpkg-based check only
- Extend repo_state() to scan .sources files (deb822 format)
- Add toggle_repo() helper for enable/disable on both formats
- Migrate Debian sources correction to deb822 (debian.sources)
- Migrate pmg-enterprise, pmg-no-subscription, pmgtest repo
  creation to deb822 .sources files
- Install script: clean up duplicate APT sources created by
  proxmox-mailgateway-container package (enterprise.list,
  pmg-install-repo.list, legacy sources.list)

* fix: use official Signed-By path & revert install script cleanup

- Change Signed-By from /etc/apt/keyrings/pmg.gpg to
  /usr/share/keyrings/proxmox-archive-keyring.gpg in all three
  PMG repo creation blocks (enterprise, no-subscription, test),
  matching official PMG docs and PVE post-install convention
- Remove APT source cleanup from install script (handled by
  post-pmg-install instead)

* remove empty line
2026-04-20 10:18:55 +02:00
community-scripts-pr-app[bot] 4089fed9c9 Update CHANGELOG.md (#13869)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-20 07:24:30 +00:00
CanbiZ (MickLesk) 325668d5c9 Wanderer: add pocketbase CLI wrapper with env (#13863) 2026-04-20 09:24:08 +02:00
community-scripts-pr-app[bot] 63296fc3e7 Update CHANGELOG.md (#13868)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-20 07:22:25 +00:00
community-scripts-pr-app[bot] e98fae3c54 Update CHANGELOG.md (#13867)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-20 07:22:13 +00:00
CanbiZ (MickLesk) bf97029f57 Pangolin: pre-apply schema migrations to prevent data loss (#13861) 2026-04-20 09:21:54 +02:00
community-scripts-pr-app[bot] 5859c06715 Update CHANGELOG.md (#13866)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-20 07:21:49 +00:00
CanbiZ (MickLesk) 9b4fc56de6 Change migration messages to warnings (#13860) 2026-04-20 09:21:25 +02:00
community-scripts-pr-app[bot] 3a5244e285 Update CHANGELOG.md (#13865)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-20 07:20:48 +00:00
CanbiZ (MickLesk) 1025715a74 slskd: migrate config keys for 0.25.0 breaking change (#13862) 2026-04-20 09:20:20 +02:00
CanbiZ (MickLesk) ec3b79bb61 PocketBase Bot: fix field names notes_json -> notes, install_methods_json -> install_methods
Collection fields were renamed but bot still used old _json suffixed names.
2026-04-20 09:02:27 +02:00
community-scripts-pr-app[bot] 37dfb58d29 Update CHANGELOG.md (#13864)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-20 06:54:03 +00:00
CanbiZ (MickLesk) d95073f505 PocketBase Bot: fix double-stringify on notes_json patch
notes_json was sent as JSON.stringify(arr) inside JSON.stringify(),
causing PocketBase to receive a string instead of a JSON array.
patchMethods already does it correctly — align patchNotes.
2026-04-20 08:53:34 +02:00
community-scripts-pr-app[bot] b34e773cbb Update .app files (#13852)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2026-04-19 19:49:53 +02:00
community-scripts-pr-app[bot] 99782d0422 Update CHANGELOG.md (#13853)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-19 17:48:22 +00:00
push-app-to-main[bot] 00e4a0a6b8 Add nametag (ct) (#13849)
Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
2026-04-19 19:47:54 +02:00
20 changed files with 323 additions and 37 deletions
+6 -6
View File
@@ -337,8 +337,8 @@ jobs:
if (infoMatch) { if (infoMatch) {
// ── INFO SUBCOMMAND ────────────────────────────────────────────── // ── INFO SUBCOMMAND ──────────────────────────────────────────────
const notesArr = readJsonBlob(record.notes_json); const notesArr = readJsonBlob(record.notes);
const methodsArr = readJsonBlob(record.install_methods_json); const methodsArr = readJsonBlob(record.install_methods);
const out = []; const out = [];
out.push('️ **PocketBase Bot**: Info for **`' + slug + '`**\n'); out.push('️ **PocketBase Bot**: Info for **`' + slug + '`**\n');
@@ -382,13 +382,13 @@ jobs:
// ── NOTE SUBCOMMAND ────────────────────────────────────────────── // ── NOTE SUBCOMMAND ──────────────────────────────────────────────
const noteAction = noteMatch[1].toLowerCase(); const noteAction = noteMatch[1].toLowerCase();
const noteArgsStr = rest.substring(noteMatch[0].length).trim(); const noteArgsStr = rest.substring(noteMatch[0].length).trim();
let notesArr = readJsonBlob(record.notes_json); let notesArr = readJsonBlob(record.notes);
async function patchNotes(arr) { async function patchNotes(arr) {
const res = await request(recordsUrl + '/' + record.id, { const res = await request(recordsUrl + '/' + record.id, {
method: 'PATCH', method: 'PATCH',
headers: { 'Authorization': token, 'Content-Type': 'application/json' }, headers: { 'Authorization': token, 'Content-Type': 'application/json' },
body: JSON.stringify({ notes_json: JSON.stringify(arr) }) body: JSON.stringify({ notes: arr })
}); });
if (!res.ok) { if (!res.ok) {
await addReaction('-1'); await addReaction('-1');
@@ -504,7 +504,7 @@ jobs:
// ── METHOD SUBCOMMAND ──────────────────────────────────────────── // ── METHOD SUBCOMMAND ────────────────────────────────────────────
const methodArgs = rest.replace(/^method\s*/i, '').trim(); const methodArgs = rest.replace(/^method\s*/i, '').trim();
const methodListMode = !methodArgs || methodArgs.toLowerCase() === 'list'; const methodListMode = !methodArgs || methodArgs.toLowerCase() === 'list';
let methodsArr = readJsonBlob(record.install_methods_json); let methodsArr = readJsonBlob(record.install_methods);
// Method field classification // Method field classification
const RESOURCE_KEYS = { cpu: 'number', ram: 'number', hdd: 'number', os: 'string', version: 'string' }; const RESOURCE_KEYS = { cpu: 'number', ram: 'number', hdd: 'number', os: 'string', version: 'string' };
@@ -526,7 +526,7 @@ jobs:
const res = await request(recordsUrl + '/' + record.id, { const res = await request(recordsUrl + '/' + record.id, {
method: 'PATCH', method: 'PATCH',
headers: { 'Authorization': token, 'Content-Type': 'application/json' }, headers: { 'Authorization': token, 'Content-Type': 'application/json' },
body: JSON.stringify({ install_methods_json: arr }) body: JSON.stringify({ install_methods: arr })
}); });
if (!res.ok) { if (!res.ok) {
await addReaction('-1'); await addReaction('-1');
+22
View File
@@ -445,8 +445,30 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details> </details>
## 2026-04-20
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Pangolin: pre-apply schema migrations to prevent data loss [@MickLesk](https://github.com/MickLesk) ([#13861](https://github.com/community-scripts/ProxmoxVE/pull/13861))
- ActualBudget: change migration messages to warnings [@MickLesk](https://github.com/MickLesk) ([#13860](https://github.com/community-scripts/ProxmoxVE/pull/13860))
- slskd: migrate config keys for 0.25.0 breaking change [@MickLesk](https://github.com/MickLesk) ([#13862](https://github.com/community-scripts/ProxmoxVE/pull/13862))
- #### ✨ New Features
- Wanderer: add pocketbase CLI wrapper with env [@MickLesk](https://github.com/MickLesk) ([#13863](https://github.com/community-scripts/ProxmoxVE/pull/13863))
- #### 🔧 Refactor
- Refactor: PMG Post Install [@MickLesk](https://github.com/MickLesk) ([#13693](https://github.com/community-scripts/ProxmoxVE/pull/13693))
## 2026-04-19 ## 2026-04-19
### 🆕 New Scripts
- nametag ([#13849](https://github.com/community-scripts/ProxmoxVE/pull/13849))
## 2026-04-18 ## 2026-04-18
### 🆕 New Scripts ### 🆕 New Scripts
+3 -3
View File
@@ -48,9 +48,9 @@ function update_script() {
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
fi fi
else else
msg_info "Old Installation Found, you need to migrate your data and recreate to a new container" msg_warn "Old Installation Found, you need to migrate your data and recreate to a new container"
msg_info "Please follow the instructions on the Actual Budget website to migrate your data" msg_warn "Please follow the instructions on the Actual Budget website to migrate your data"
msg_info "https://actualbudget.org/docs/backup-restore/backup" msg_warn "https://actualbudget.org/docs/backup-restore/backup"
exit exit
fi fi
exit exit
+6
View File
@@ -0,0 +1,6 @@
_ __ __
/ | / /___ _____ ___ ___ / /_____ _____ _
/ |/ / __ `/ __ `__ \/ _ \/ __/ __ `/ __ `/
/ /| / /_/ / / / / / / __/ /_/ /_/ / /_/ /
/_/ |_/\__,_/_/ /_/ /_/\___/\__/\__,_/\__, /
/____/
+3
View File
@@ -27,6 +27,9 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
NODE_VERSION="24" setup_nodejs
msg_info "Updating ${APP} LXC" msg_info "Updating ${APP} LXC"
$STD apt update $STD apt update
$STD apt -y upgrade $STD apt -y upgrade
+2
View File
@@ -29,6 +29,8 @@ function update_script() {
exit exit
fi fi
NODE_VERSION="22" setup_nodejs
if check_for_gh_release "kima-hub" "Chevron7Locked/kima-hub"; then if check_for_gh_release "kima-hub" "Chevron7Locked/kima-hub"; then
msg_info "Stopping Services" msg_info "Stopping Services"
systemctl stop kima-frontend kima-backend kima-analyzer kima-analyzer-clap systemctl stop kima-frontend kima-backend kima-analyzer kima-analyzer-clap
+2
View File
@@ -28,6 +28,8 @@ function update_script() {
exit exit
fi fi
NODE_VERSION="24" setup_nodejs
if check_for_gh_release "myip" "jason5ng32/MyIP"; then if check_for_gh_release "myip" "jason5ng32/MyIP"; then
msg_info "Stopping Services" msg_info "Stopping Services"
systemctl stop myip systemctl stop myip
+83
View File
@@ -0,0 +1,83 @@
#!/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
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/mattogodoy/nametag
APP="Nametag"
var_tags="${var_tags:-contacts;crm}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/nametag ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "nametag" "mattogodoy/nametag"; then
msg_info "Stopping Service"
systemctl stop nametag
msg_ok "Stopped Service"
msg_info "Backing up Data"
cp /opt/nametag/.env /opt/nametag.env.bak
cp -r /opt/nametag/data /opt/nametag_data_bak
msg_ok "Backed up Data"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "nametag" "mattogodoy/nametag" "tarball" "latest" "/opt/nametag"
msg_info "Rebuilding Application"
cd /opt/nametag
$STD npm ci
set -a
source /opt/nametag/.env
set +a
$STD npx prisma generate
$STD npm run build
cp -r /opt/nametag/.next/static /opt/nametag/.next/standalone/.next/static
cp -r /opt/nametag/public /opt/nametag/.next/standalone/public
msg_ok "Rebuilt Application"
msg_info "Restoring Data"
cp /opt/nametag.env.bak /opt/nametag/.env
cp -r /opt/nametag_data_bak/. /opt/nametag/data/
rm -f /opt/nametag.env.bak
rm -rf /opt/nametag_data_bak
msg_ok "Restored Data"
msg_info "Running Migrations"
cd /opt/nametag
$STD npx prisma migrate deploy
msg_ok "Ran Migrations"
msg_info "Starting Service"
systemctl start nametag
msg_ok "Started Service"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
+1 -1
View File
@@ -28,7 +28,7 @@ function update_script() {
exit exit
fi fi
NODE_VERSION="22" setup_nodejs NODE_VERSION="24" setup_nodejs
if check_for_gh_release "outline" "outline/outline"; then if check_for_gh_release "outline" "outline/outline"; then
msg_info "Stopping Services" msg_info "Stopping Services"
+12 -1
View File
@@ -69,7 +69,18 @@ function update_script() {
msg_info "Running database migrations" msg_info "Running database migrations"
cd /opt/pangolin cd /opt/pangolin
ENVIRONMENT=prod $STD npx drizzle-kit push --config drizzle.sqlite.config.ts
# Pre-apply potentially destructive schema changes safely so drizzle-kit
# does not recreate tables (which would delete all rows).
local DB="/opt/pangolin/config/db/db.sqlite"
if [[ -f "$DB" ]]; then
sqlite3 "$DB" "ALTER TABLE 'orgs' ADD COLUMN 'settingsLogRetentionDaysConnection' integer DEFAULT 0 NOT NULL;" 2>/dev/null || true
sqlite3 "$DB" "ALTER TABLE 'clientSitesAssociationsCache' ADD COLUMN 'isJitMode' integer DEFAULT 0 NOT NULL;" 2>/dev/null || true
# Migrate roleId from userOrgs → userOrgRoles before the column is dropped
sqlite3 "$DB" "INSERT OR IGNORE INTO 'userOrgRoles' (userId, orgId, roleId) SELECT userId, orgId, roleId FROM 'userOrgs' WHERE roleId IS NOT NULL;" 2>/dev/null || true
fi
ENVIRONMENT=prod $STD npx drizzle-kit push --force --config drizzle.sqlite.config.ts
msg_ok "Ran database migrations" msg_ok "Ran database migrations"
msg_info "Updating Badger plugin version" msg_info "Updating Badger plugin version"
+1 -1
View File
@@ -29,7 +29,7 @@ function update_script() {
exit exit
fi fi
NODE_VERSION="22" setup_nodejs NODE_VERSION="24" setup_nodejs
PYTHON_VERSION="3.12" setup_uv PYTHON_VERSION="3.12" setup_uv
if check_for_gh_release "shelfmark" "calibrain/shelfmark"; then if check_for_gh_release "shelfmark" "calibrain/shelfmark"; then
+4
View File
@@ -43,6 +43,10 @@ function update_script() {
msg_info "Restoring config" msg_info "Restoring config"
mv /opt/slskd.yml.bak /opt/slskd/config/slskd.yml mv /opt/slskd.yml.bak /opt/slskd/config/slskd.yml
# Migrate 0.25.0 breaking config key renames
sed -i 's/^global:/transfers:/' /opt/slskd/config/slskd.yml
sed -i 's/^integration:/integrations:/' /opt/slskd/config/slskd.yml
msg_ok "Restored config" msg_ok "Restored config"
msg_info "Starting Service(s)" msg_info "Starting Service(s)"
+1 -1
View File
@@ -28,7 +28,7 @@ if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then
exit 10 exit 10
fi fi
NODE_VERSION="22" setup_nodejs NODE_VERSION="24" setup_nodejs
msg_info "Installing ioBroker (Patience)" msg_info "Installing ioBroker (Patience)"
$STD bash <(curl -fsSL https://iobroker.net/install.sh) $STD bash <(curl -fsSL https://iobroker.net/install.sh)
+1 -1
View File
@@ -28,7 +28,7 @@ msg_ok "Installed Dependencies"
PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql
PG_DB_NAME="kima" PG_DB_USER="kima" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db PG_DB_NAME="kima" PG_DB_USER="kima" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db
NODE_VERSION="20" setup_nodejs NODE_VERSION="22" setup_nodejs
msg_info "Configuring Redis" msg_info "Configuring Redis"
systemctl enable -q --now redis-server systemctl enable -q --now redis-server
+1 -1
View File
@@ -13,7 +13,7 @@ setting_up_container
network_check network_check
update_os update_os
NODE_VERSION="22" setup_nodejs NODE_VERSION="24" setup_nodejs
fetch_and_deploy_gh_release "myip" "jason5ng32/MyIP" "tarball" fetch_and_deploy_gh_release "myip" "jason5ng32/MyIP" "tarball"
msg_info "Configuring MyIP" msg_info "Configuring MyIP"
+88
View File
@@ -0,0 +1,88 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/mattogodoy/nametag
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
PG_VERSION="16" setup_postgresql
PG_DB_NAME="nametag_db" PG_DB_USER="nametag" setup_postgresql_db
NODE_VERSION="20" setup_nodejs
fetch_and_deploy_gh_release "nametag" "mattogodoy/nametag" "tarball" "latest" "/opt/nametag"
msg_info "Setting up Application"
cd /opt/nametag
$STD npm ci
DATABASE_URL="postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME}" $STD npx prisma generate
DATABASE_URL="postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME}" $STD npx prisma migrate deploy
msg_ok "Set up Application"
msg_info "Configuring Nametag"
NEXTAUTH_SECRET=$(openssl rand -base64 32)
CRON_SECRET=$(openssl rand -base64 16)
mkdir -p /opt/nametag/data/photos
cat <<EOF >/opt/nametag/.env
DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME}
NEXTAUTH_URL=http://${LOCAL_IP}:3000
NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
CRON_SECRET=${CRON_SECRET}
PHOTO_STORAGE_PATH=/opt/nametag/data/photos
NODE_ENV=production
EOF
msg_ok "Configured Nametag"
msg_info "Building Application"
cd /opt/nametag
set -a
source /opt/nametag/.env
set +a
$STD npm run build
cp -r /opt/nametag/.next/static /opt/nametag/.next/standalone/.next/static
cp -r /opt/nametag/public /opt/nametag/.next/standalone/public
msg_ok "Built Application"
msg_info "Running Production Seed"
cd /opt/nametag
$STD npx esbuild prisma/seed.production.ts --platform=node --format=cjs --outfile=prisma/seed.production.js --bundle --external:@prisma/client --external:pg --minify
$STD node prisma/seed.production.js
msg_ok "Ran Production Seed"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/nametag.service
[Unit]
Description=Nametag - Personal Relationships Manager
After=network.target postgresql.service
[Service]
Type=simple
WorkingDirectory=/opt/nametag
EnvironmentFile=/opt/nametag/.env
ExecStart=/usr/bin/node /opt/nametag/.next/standalone/server.js
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now nametag
msg_ok "Created Service"
msg_info "Setting up Cron Jobs"
cat <<EOF >/etc/cron.d/nametag
0 8 * * * root curl -sf -H "Authorization: Bearer ${CRON_SECRET}" http://127.0.0.1:3000/api/cron/send-reminders >/dev/null 2>&1
0 3 * * * root curl -sf -H "Authorization: Bearer ${CRON_SECRET}" http://127.0.0.1:3000/api/cron/purge-deleted >/dev/null 2>&1
EOF
chmod 644 /etc/cron.d/nametag
msg_ok "Set up Cron Jobs"
motd_ssh
customize
cleanup_lxc
+1 -1
View File
@@ -20,7 +20,7 @@ $STD apt install -y \
redis redis
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
NODE_VERSION="22" setup_nodejs NODE_VERSION="24" setup_nodejs
PG_VERSION="16" setup_postgresql PG_VERSION="16" setup_postgresql
PG_DB_NAME="outline" PG_DB_USER="outline" setup_postgresql_db PG_DB_NAME="outline" PG_DB_USER="outline" setup_postgresql_db
+1 -1
View File
@@ -115,7 +115,7 @@ else
msg_ok "Installed internal bypasser dependencies" msg_ok "Installed internal bypasser dependencies"
fi fi
NODE_VERSION="22" setup_nodejs NODE_VERSION="24" setup_nodejs
PYTHON_VERSION="3.12" setup_uv PYTHON_VERSION="3.12" setup_uv
fetch_and_deploy_gh_release "shelfmark" "calibrain/shelfmark" "tarball" "latest" "/opt/shelfmark" fetch_and_deploy_gh_release "shelfmark" "calibrain/shelfmark" "tarball" "latest" "/opt/shelfmark"
+10
View File
@@ -60,6 +60,16 @@ wait -n
EOF EOF
chmod +x /opt/wanderer/start.sh chmod +x /opt/wanderer/start.sh
cat <<'EOF' >/usr/local/bin/wanderer-pb
#!/usr/bin/env bash
set -a
source /opt/wanderer/.env
set +a
cd /opt/wanderer/source/db
exec ./pocketbase "$@" --dir="$PB_DB_LOCATION"
EOF
chmod +x /usr/local/bin/wanderer-pb
cat <<EOF >/etc/systemd/system/wanderer-web.service cat <<EOF >/etc/systemd/system/wanderer-web.service
[Unit] [Unit]
Description=wanderer Description=wanderer
+75 -20
View File
@@ -47,7 +47,8 @@ msg_error() {
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pmg-install" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pmg-install" "pve"
if ! grep -q "Proxmox Mail Gateway" /etc/issue 2>/dev/null; then if ! dpkg -s proxmox-mailgateway-container >/dev/null 2>&1 &&
! dpkg -s proxmox-mailgateway >/dev/null 2>&1; then
msg_error "This script is only intended for Proxmox Mail Gateway" msg_error "This script is only intended for Proxmox Mail Gateway"
exit 232 exit 232
fi fi
@@ -57,14 +58,24 @@ repo_state() {
local repo="$1" local repo="$1"
local file="" local file=""
local state="missing" local state="missing"
for f in /etc/apt/sources.list /etc/apt/sources.list.d/*.list; do for f in /etc/apt/sources.list /etc/apt/sources.list.d/*.list /etc/apt/sources.list.d/*.sources; do
[[ -f "$f" ]] || continue [[ -f "$f" ]] || continue
if grep -q "$repo" "$f"; then if grep -q "$repo" "$f"; then
file="$f" file="$f"
if grep -qE "^[^#].*${repo}" "$f"; then if [[ "$f" == *.sources ]]; then
state="active" # deb822 format: check Enabled field
elif grep -qE "^#.*${repo}" "$f"; then if grep -qiE '^Enabled:\s*no' "$f"; then
state="disabled" state="disabled"
else
state="active"
fi
else
# legacy format
if grep -qE "^[^#].*${repo}" "$f"; then
state="active"
elif grep -qE "^#.*${repo}" "$f"; then
state="disabled"
fi
fi fi
break break
fi fi
@@ -72,6 +83,28 @@ repo_state() {
echo "$state $file" echo "$state $file"
} }
toggle_repo() {
# $1 = file, $2 = action (enable|disable)
local file="$1" action="$2"
if [[ "$file" == *.sources ]]; then
if [[ "$action" == "disable" ]]; then
if grep -qiE '^Enabled:' "$file"; then
sed -i 's/^Enabled:.*/Enabled: no/' "$file"
else
echo "Enabled: no" >>"$file"
fi
else
sed -i 's/^Enabled:.*/Enabled: yes/' "$file"
fi
else
if [[ "$action" == "disable" ]]; then
sed -i '/^[^#]/s/^/# /' "$file"
else
sed -i 's/^# *//' "$file"
fi
fi
}
start_routines() { start_routines() {
header_info header_info
VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)" VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
@@ -84,11 +117,20 @@ start_routines() {
case $CHOICE in case $CHOICE in
yes) yes)
msg_info "Correcting Debian Sources" msg_info "Correcting Debian Sources"
cat <<EOF >/etc/apt/sources.list cat <<EOF >/etc/apt/sources.list.d/debian.sources
deb http://deb.debian.org/debian ${VERSION} main contrib Types: deb
deb http://deb.debian.org/debian ${VERSION}-updates main contrib URIs: http://deb.debian.org/debian
deb http://security.debian.org/debian-security ${VERSION}-security main contrib Suites: ${VERSION} ${VERSION}-updates
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://security.debian.org/debian-security
Suites: ${VERSION}-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF EOF
rm -f /etc/apt/sources.list
msg_ok "Corrected Debian Sources" msg_ok "Corrected Debian Sources"
;; ;;
no) msg_error "Selected no to Correcting Debian Sources" ;; no) msg_error "Selected no to Correcting Debian Sources" ;;
@@ -108,7 +150,7 @@ EOF
keep) msg_ok "Kept 'pmg-enterprise' repository" ;; keep) msg_ok "Kept 'pmg-enterprise' repository" ;;
disable) disable)
msg_info "Disabling 'pmg-enterprise' repository" msg_info "Disabling 'pmg-enterprise' repository"
sed -i "s/^[^#].*pmg-enterprise/# &/" "$file" toggle_repo "$file" disable
msg_ok "Disabled 'pmg-enterprise' repository" msg_ok "Disabled 'pmg-enterprise' repository"
;; ;;
delete) delete)
@@ -128,7 +170,7 @@ EOF
case $CHOICE in case $CHOICE in
enable) enable)
msg_info "Enabling 'pmg-enterprise' repository" msg_info "Enabling 'pmg-enterprise' repository"
sed -i "s/^#.*pmg-enterprise/deb/" "$file" toggle_repo "$file" enable
msg_ok "Enabled 'pmg-enterprise' repository" msg_ok "Enabled 'pmg-enterprise' repository"
;; ;;
keep) msg_ok "Kept 'pmg-enterprise' repository disabled" ;; keep) msg_ok "Kept 'pmg-enterprise' repository disabled" ;;
@@ -149,8 +191,12 @@ EOF
case $CHOICE in case $CHOICE in
yes) yes)
msg_info "Adding 'pmg-enterprise' repository" msg_info "Adding 'pmg-enterprise' repository"
cat >/etc/apt/sources.list.d/pmg-enterprise.list <<EOF cat >/etc/apt/sources.list.d/pmg-enterprise.sources <<EOF
deb https://enterprise.proxmox.com/debian/pmg ${VERSION} pmg-enterprise Types: deb
URIs: https://enterprise.proxmox.com/debian/pmg
Suites: ${VERSION}
Components: pmg-enterprise
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF EOF
msg_ok "Added 'pmg-enterprise' repository" msg_ok "Added 'pmg-enterprise' repository"
;; ;;
@@ -173,7 +219,7 @@ EOF
keep) msg_ok "Kept 'pmg-no-subscription' repository" ;; keep) msg_ok "Kept 'pmg-no-subscription' repository" ;;
disable) disable)
msg_info "Disabling 'pmg-no-subscription' repository" msg_info "Disabling 'pmg-no-subscription' repository"
sed -i "s/^[^#].*pmg-no-subscription/# &/" "$file" toggle_repo "$file" disable
msg_ok "Disabled 'pmg-no-subscription' repository" msg_ok "Disabled 'pmg-no-subscription' repository"
;; ;;
delete) delete)
@@ -193,7 +239,7 @@ EOF
case $CHOICE in case $CHOICE in
enable) enable)
msg_info "Enabling 'pmg-no-subscription' repository" msg_info "Enabling 'pmg-no-subscription' repository"
sed -i "s/^#.*pmg-no-subscription/deb/" "$file" toggle_repo "$file" enable
msg_ok "Enabled 'pmg-no-subscription' repository" msg_ok "Enabled 'pmg-no-subscription' repository"
;; ;;
keep) msg_ok "Kept 'pmg-no-subscription' repository disabled" ;; keep) msg_ok "Kept 'pmg-no-subscription' repository disabled" ;;
@@ -213,8 +259,12 @@ EOF
case $CHOICE in case $CHOICE in
yes) yes)
msg_info "Adding 'pmg-no-subscription' repository" msg_info "Adding 'pmg-no-subscription' repository"
cat >/etc/apt/sources.list.d/pmg-install-repo.list <<EOF cat >/etc/apt/sources.list.d/pmg-no-subscription.sources <<EOF
deb http://download.proxmox.com/debian/pmg ${VERSION} pmg-no-subscription Types: deb
URIs: http://download.proxmox.com/debian/pmg
Suites: ${VERSION}
Components: pmg-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF EOF
msg_ok "Added 'pmg-no-subscription' repository" msg_ok "Added 'pmg-no-subscription' repository"
;; ;;
@@ -236,8 +286,13 @@ EOF
case $CHOICE in case $CHOICE in
yes) yes)
msg_info "Adding 'pmgtest' repository (disabled)" msg_info "Adding 'pmgtest' repository (disabled)"
cat >/etc/apt/sources.list.d/pmgtest-for-beta.list <<EOF cat >/etc/apt/sources.list.d/pmgtest.sources <<EOF
# deb http://download.proxmox.com/debian/pmg ${VERSION} pmgtest Types: deb
URIs: http://download.proxmox.com/debian/pmg
Suites: ${VERSION}
Components: pmgtest
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
Enabled: no
EOF EOF
msg_ok "Added 'pmgtest' repository" msg_ok "Added 'pmgtest' repository"
;; ;;