Compare commits

..

19 Commits

Author SHA1 Message Date
MickLesk
f2140484e6 scanopy: name the deployed binary what the unit starts
singlefile mode writes the asset to <target>/<app name>:

  local target_file="$app"
  [[ "${USE_ORIGINAL_FILENAME:-false}" == "true" ]] && target_file="$filename"

so with the app renamed to Scanopy the binary lands at /usr/bin/Scanopy
while the unit starts /usr/bin/scanopy-server, and the service never
comes up on a fresh install. Rename it after the deploy, the same way
the daemon block already renames "Scanopy Daemon".

Keeping the app name is what matters here: it is also the version file
(~/.scanopy), and changing it would make every existing container
report an update it does not need.
2026-09-18 07:58:58 +02:00
MickLesk
34b9c447ed scanopy: make the rollback restore the whole old setup
The health check put the previous binary back but nothing else, and the
source tree it needs was already gone by then: the update deleted
/opt/scanopy/ui before starting the new server, and removed
SCANOPY_WEB_EXTERNAL_PATH from the env at the same time. A failed
health check therefore left the old binary running without the UI it
serves from disk, so the rollback produced an API-only server.

Back up the env file and the unit alongside the binary, restore all
three when the check fails, and delete the source tree only once the
new server has answered. Nothing the old version needs is removed
before the new one has proven itself.
2026-09-18 07:58:32 +02:00
CanbiZ (MickLesk)
64d0becd62 Fix case sensitivity in fetch_and_deploy_gh_release 2026-09-18 07:46:53 +02:00
CanbiZ (MickLesk)
4663415b28 Update service names from 'scanopy-server' to 'Scanopy' 2026-09-18 07:46:15 +02:00
CanbiZ (MickLesk)
79471a030a Refactor scanopy-install.sh for server setup
Updated installation script to configure Scanopy server and removed daemon configuration section.
2026-09-16 12:20:39 +02:00
MickLesk
a9f091f30b scanopy: serve the UI from the binary, drop the source build
Upstream confirmed in scanopy/scanopy#698 that scanopy-server-linux-*
has carried the built UI since v0.17.13, fixtures and service logos
included, served on the same port as the API. The release notes never
said so, which is why we kept building it.

That removes the source tarball, the Rust toolchain and
generate-fixtures, Node with npm ci and npm run build, and
SCANOPY_WEB_EXTERNAL_PATH. With the variable set to a directory that no
longer has an index.html, v0.17.14 and earlier refuse to start, so the
update deletes the line rather than leaving it. build-essential,
libssl-dev and pkg-config go too: the release binary is static-pie with
no INTERP segment, so it has no runtime library dependencies.

/opt/scanopy stays, now only for .env and oidc.toml, and the unit's
WorkingDirectory follows it out of the removed backend directory. Since
nothing wipes that directory any more, the config survives an update on
its own, which is the report upstream passed on of an update coming
back without SCANOPY_WEB_EXTERNAL_PATH and the server starting API-only.

The update keeps the running binary until the new one answers
/api/health and puts it back if it does not, so a bad release leaves a
working server instead of a stopped one.

check_for_gh_release now keys on scanopy-server, matching the version
file the binary deploy writes; the Scanopy key belonged to the tarball
that is gone. Existing containers run one extra update, then agree.
2026-09-16 12:10:59 +02:00
MickLesk
263f8ac12c scanopy: restore generate-fixtures build, ui/src/lib/data is gitignored and incomplete 2026-09-16 12:06:22 +02:00
MickLesk
3f0e40159e scanopy: drop unneeded rust build, use committed UI fixtures 2026-09-16 12:06:22 +02:00
MickLesk
004d1744a7 scanopy: use prebuilt server binary, relax release profile for generate-fixtures 2026-09-16 12:06:21 +02:00
community-scripts-pr-app[bot]
039e65d803 Update CHANGELOG.md (#17280)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-15 09:59:36 +00:00
community-scripts-pr-app[bot]
05dc593f99 Update CHANGELOG.md (#17274)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-15 07:53:02 +00:00
community-scripts-pr-app[bot]
a7d58ba5c7 Update CHANGELOG.md (#17272)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-15 07:17:09 +00:00
push-app-to-main[bot]
8a8c636a83 valhalla (#17231) 2026-09-15 09:16:43 +02:00
community-scripts-pr-app[bot]
7c851f766e Update CHANGELOG.md (#17271)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-15 07:16:39 +00:00
CanbiZ (MickLesk)
fbea9c04c3 monitor-all: decide on flag values, not on key presence (#17261) 2026-09-15 09:16:12 +02:00
community-scripts-pr-app[bot]
1e500043b7 Update CHANGELOG.md (#17270)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-15 06:48:14 +00:00
Connor Gallopo
dd421cec72 copy packages/emails into the tracearr deploy tree (#17268) 2026-09-15 08:47:51 +02:00
community-scripts-pr-app[bot]
e4d5fcede1 Update CHANGELOG.md (#17269)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-15 06:31:07 +00:00
Chris
91c6673ae0 Pin to v3.2.1 (#17264) 2026-09-15 08:30:40 +02:00
40 changed files with 440 additions and 195 deletions

View File

@@ -543,6 +543,30 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details> </details>
## 2026-09-15
### 🆕 New Scripts
- valhalla ([#17231](https://github.com/community-scripts/ProxmoxVE/pull/17231))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- tracearr: copy packages/emails into the deploy tree [@connorgallopo](https://github.com/connorgallopo) ([#17268](https://github.com/community-scripts/ProxmoxVE/pull/17268))
- Immich: Pin to v3.2.1 [@vhsdream](https://github.com/vhsdream) ([#17264](https://github.com/community-scripts/ProxmoxVE/pull/17264))
### 💾 Core
- Add vm_extract_image, which two VM scripts already call [@MickLesk](https://github.com/MickLesk) ([core#40](https://github.com/community-scripts/core/pull/40))
- Releases: rank releases on their numbers, not on sort -V over the raw tag [@MickLesk](https://github.com/MickLesk) ([core#39](https://github.com/community-scripts/core/pull/39))
### 🧰 Tools
- #### 🔧 Refactor
- Refactor: monitor-all (decide on flag values, not on key presence) [@MickLesk](https://github.com/MickLesk) ([#17261](https://github.com/community-scripts/ProxmoxVE/pull/17261))
## 2026-09-14 ## 2026-09-14
### 🆕 New Scripts ### 🆕 New Scripts

6
ct/headers/valhalla Normal file
View File

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

View File

@@ -112,7 +112,7 @@ EOF
msg_ok "Image-processing libraries up to date" msg_ok "Image-processing libraries up to date"
fi fi
RELEASE="v3.2.0" RELEASE="v3.2.1"
if check_for_gh_release "Immich" "immich-app/immich" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then if check_for_gh_release "Immich" "immich-app/immich" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then
if [[ $(cat ~/.immich) > "2.5.1" ]]; then if [[ $(cat ~/.immich) > "2.5.1" ]]; then
msg_info "Enabling Maintenance Mode" msg_info "Enabling Maintenance Mode"

View File

@@ -38,35 +38,20 @@ function update_script() {
[[ -f /etc/systemd/system/scanopy-daemon.service ]] && systemctl stop scanopy-daemon [[ -f /etc/systemd/system/scanopy-daemon.service ]] && systemctl stop scanopy-daemon
msg_ok "Stopped services" msg_ok "Stopped services"
create_backup /opt/scanopy/.env /opt/scanopy/oidc.toml cp -f /usr/bin/scanopy-server /usr/bin/scanopy-server.bak 2>/dev/null || true
cp -f /opt/scanopy/.env /opt/scanopy/.env.bak
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy" cp -f /etc/systemd/system/scanopy-server.service /etc/systemd/system/scanopy-server.service.bak
restore_backup
ensure_dependencies pkg-config libssl-dev
TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')"
RUST_TOOLCHAIN=$TOOLCHAIN setup_rust
if ! grep -q "PUBLIC_URL" /opt/scanopy/.env; then if ! grep -q "PUBLIC_URL" /opt/scanopy/.env; then
sed -i "\|_PATH=|a\\scanopy_PUBLIC_URL=http://${LOCAL_IP}:60072" /opt/scanopy/.env sed -i "\|_PATH=|a\\SCANOPY_PUBLIC_URL=http://${LOCAL_IP}:60072" /opt/scanopy/.env
fi fi
sed -i 's|_TARGET=.*$|_URL=http://127.0.0.1:60072|' /opt/scanopy/.env sed -i 's|_TARGET=.*$|_URL=http://127.0.0.1:60072|' /opt/scanopy/.env
sed -i '/^SCANOPY_WEB_EXTERNAL_PATH=/d' /opt/scanopy/.env
sed -i 's|^WorkingDirectory=/opt/scanopy/backend$|WorkingDirectory=/opt/scanopy|' /etc/systemd/system/scanopy-server.service
systemctl daemon-reload
msg_info "Building Scanopy Server (patience)" fetch_and_deploy_gh_release "Scanopy" "scanopy/scanopy" "singlefile" "latest" "/usr/bin" "scanopy-server-linux-$(arch_resolve)"
cd /opt/scanopy/backend mv -f /usr/bin/Scanopy /usr/bin/scanopy-server
CARGO_BUILD_JOBS="$(get_parallel_jobs)" $STD cargo build --release --bin server --bin generate-fixtures
$STD ./target/release/generate-fixtures --output-dir /opt/scanopy/ui/src/lib/data
mv ./target/release/server /usr/bin/scanopy-server
msg_ok "Built Scanopy Server"
msg_info "Creating frontend UI"
export PUBLIC_SERVER_HOSTNAME=default
export PUBLIC_SERVER_PORT=""
cd /opt/scanopy/ui
$STD npm ci --no-fund --no-audit
$STD npm run build
msg_ok "Created frontend UI"
if [[ -f /etc/systemd/system/scanopy-daemon.service ]]; then if [[ -f /etc/systemd/system/scanopy-daemon.service ]]; then
fetch_and_deploy_gh_release "Scanopy Daemon" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-$(arch_resolve)" fetch_and_deploy_gh_release "Scanopy Daemon" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-$(arch_resolve)"
@@ -81,6 +66,26 @@ function update_script() {
msg_info "Starting services" msg_info "Starting services"
systemctl start scanopy-server systemctl start scanopy-server
healthy=0
for _ in {1..30}; do
if curl -fsS -o /dev/null http://127.0.0.1:60072/api/health 2>/dev/null; then
healthy=1
break
fi
sleep 2
done
if [[ "$healthy" -ne 1 ]]; then
systemctl stop scanopy-server
[[ -f /usr/bin/scanopy-server.bak ]] && mv -f /usr/bin/scanopy-server.bak /usr/bin/scanopy-server
mv -f /opt/scanopy/.env.bak /opt/scanopy/.env
mv -f /etc/systemd/system/scanopy-server.service.bak /etc/systemd/system/scanopy-server.service
systemctl daemon-reload
systemctl start scanopy-server
msg_error "New server did not answer /api/health, restored the previous version"
exit 1
fi
rm -rf /opt/scanopy/backend /opt/scanopy/ui
rm -f /usr/bin/scanopy-server.bak /opt/scanopy/.env.bak /etc/systemd/system/scanopy-server.service.bak
[[ -f /etc/systemd/system/scanopy-daemon.service ]] && systemctl start scanopy-daemon [[ -f /etc/systemd/system/scanopy-daemon.service ]] && systemctl start scanopy-daemon
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
fi fi

View File

@@ -124,7 +124,7 @@ EOF
$STD pnpm turbo telemetry disable $STD pnpm turbo telemetry disable
$STD pnpm turbo run build --no-daemon --filter=@tracearr/shared --filter=@tracearr/server --filter=@tracearr/web $STD pnpm turbo run build --no-daemon --filter=@tracearr/shared --filter=@tracearr/server --filter=@tracearr/web
rm -rf /opt/tracearr rm -rf /opt/tracearr
mkdir -p /opt/tracearr/{packages/shared,apps/server,apps/web,apps/server/src/db} mkdir -p /opt/tracearr/{packages/shared,packages/emails,apps/server,apps/web,apps/server/src/db}
cp -rf package.json /opt/tracearr/ cp -rf package.json /opt/tracearr/
cp -rf pnpm-workspace.yaml /opt/tracearr/ cp -rf pnpm-workspace.yaml /opt/tracearr/
cp -rf pnpm-lock.yaml /opt/tracearr/ cp -rf pnpm-lock.yaml /opt/tracearr/
@@ -134,6 +134,8 @@ EOF
cp -rf apps/web/dist /opt/tracearr/apps/web/dist cp -rf apps/web/dist /opt/tracearr/apps/web/dist
cp -rf packages/shared/package.json /opt/tracearr/packages/shared/ cp -rf packages/shared/package.json /opt/tracearr/packages/shared/
cp -rf packages/shared/dist /opt/tracearr/packages/shared/dist cp -rf packages/shared/dist /opt/tracearr/packages/shared/dist
cp -rf packages/emails/package.json /opt/tracearr/packages/emails/
cp -rf packages/emails/dist /opt/tracearr/packages/emails/dist
cp -rf apps/server/src/db/migrations /opt/tracearr/apps/server/src/db/migrations cp -rf apps/server/src/db/migrations /opt/tracearr/apps/server/src/db/migrations
cp -rf data /opt/tracearr/data cp -rf data /opt/tracearr/data
mkdir -p /opt/tracearr/data/image-cache mkdir -p /opt/tracearr/data/image-cache

104
ct/valhalla.sh Normal file
View File

@@ -0,0 +1,104 @@
#!/usr/bin/env bash
_CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main"
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
# Copyright (c) 2021-2026 community-scripts ORG
# Author: CrazyWolf13
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/valhalla/valhalla
APP="Valhalla"
var_tags="${var_tags:-mapping;routing}"
var_cpu="${var_cpu:-6}"
var_ram="${var_ram:-6144}"
var_disk="${var_disk:-24}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /etc/systemd/system/valhalla.service ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "prime_server" "kevinkreiser/prime_server"; then
RELEASE="$CHECK_UPDATE_RELEASE"
msg_info "Stopping Service"
systemctl stop valhalla
msg_ok "Stopped Service"
msg_info "Building prime_server ${RELEASE} (Patience)"
rm -rf /tmp/prime_server
$STD git clone --recurse-submodules --depth 1 --branch "$RELEASE" https://github.com/kevinkreiser/prime_server /tmp/prime_server
cd /tmp/prime_server
$STD ./autogen.sh
$STD ./configure
$STD make -j"$(nproc)"
$STD make install
cd /
rm -rf /tmp/prime_server
ldconfig
echo "${RELEASE#v}" >"$HOME/.prime_server"
msg_ok "Built prime_server ${RELEASE}"
msg_info "Starting Service"
systemctl start valhalla
msg_ok "Started Service"
fi
if check_for_gh_release "valhalla" "valhalla/valhalla"; then
RELEASE="$CHECK_UPDATE_RELEASE"
msg_info "Stopping Service"
systemctl stop valhalla
msg_ok "Stopped Service"
msg_info "Fetching Valhalla ${RELEASE} (Patience)"
rm -rf /opt/valhalla
$STD git clone --recurse-submodules --depth 1 --branch "$RELEASE" https://github.com/valhalla/valhalla.git /opt/valhalla
msg_ok "Fetched Valhalla ${RELEASE}"
msg_info "Compiling Valhalla ${RELEASE} (this takes 20-45+ minutes, be patient)"
MEM_MB=$(awk '/MemTotal/{print int($2/1024)}' /proc/meminfo)
BUILD_JOBS=$((MEM_MB / 2000))
[[ $BUILD_JOBS -lt 1 ]] && BUILD_JOBS=1
[[ $BUILD_JOBS -gt $(nproc) ]] && BUILD_JOBS=$(nproc)
cd /opt/valhalla
$STD cmake -B build -DCMAKE_BUILD_TYPE=Release -DENABLE_PYTHON_BINDINGS=OFF -DENABLE_TESTS=OFF -DENABLE_SINGLE_FILES_WERROR=OFF
$STD cmake --build build -- -j"$BUILD_JOBS"
$STD cmake --install build
ldconfig
echo "${RELEASE#v}" >"$HOME/.valhalla"
msg_ok "Compiled Valhalla ${RELEASE}"
msg_info "Starting Service"
systemctl start valhalla
msg_ok "Started Service"
fi
msg_ok "Updated Successfully!\n"
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}:8002/status${CL}"
echo -e "${INFO}${YW}No routing tiles are built yet. Build them for your region with:${CL}"
echo -e "${TAB}${BGN}/opt/valhalla_data/build-tiles.sh https://download.geofabrik.de/<continent>/<region>-latest.osm.pbf${CL}"

View File

@@ -353,7 +353,7 @@ ML_DIR="${APP_DIR}/machine-learning"
GEO_DIR="${INSTALL_DIR}/geodata" GEO_DIR="${INSTALL_DIR}/geodata"
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache} mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
fetch_and_deploy_gh_release "Immich" "immich-app/immich" "tarball" "v3.2.0" "$SRC_DIR" fetch_and_deploy_gh_release "Immich" "immich-app/immich" "tarball" "v3.2.1" "$SRC_DIR"
PNPM_VERSION="$(jq -r '.packageManager | split("@")[1] | split("+")[0]' ${SRC_DIR}/package.json)" PNPM_VERSION="$(jq -r '.packageManager | split("@")[1] | split("+")[0]' ${SRC_DIR}/package.json)"
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs

View File

@@ -13,40 +13,16 @@ setting_up_container
network_check network_check
update_os update_os
msg_info "Installing Dependencies"
$STD apt install -y \
build-essential \
libssl-dev \
pkg-config
msg_ok "Installed Dependencies"
PG_VERSION=17 setup_postgresql PG_VERSION=17 setup_postgresql
NODE_VERSION="24" setup_nodejs
PG_DB_NAME="scanopy_db" PG_DB_USER="scanopy" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db PG_DB_NAME="scanopy_db" PG_DB_USER="scanopy" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db
fetch_and_deploy_gh_release "Scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy" fetch_and_deploy_gh_release "Scanopy" "scanopy/scanopy" "singlefile" "latest" "/usr/bin" "scanopy-server-linux-$(arch_resolve)"
TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')" mv -f /usr/bin/Scanopy /usr/bin/scanopy-server
RUST_TOOLCHAIN=$TOOLCHAIN setup_rust
msg_info "Building Scanopy Server (patience)" msg_info "Configuring Scanopy"
cd /opt/scanopy/backend mkdir -p /opt/scanopy
CARGO_BUILD_JOBS="$(get_parallel_jobs)" $STD cargo build --release --bin server --bin generate-fixtures
$STD ./target/release/generate-fixtures --output-dir /opt/scanopy/ui/src/lib/data
mv ./target/release/server /usr/bin/scanopy-server
msg_ok "Built Scanopy Server"
msg_info "Creating frontend UI"
export PUBLIC_SERVER_HOSTNAME=default
export PUBLIC_SERVER_PORT=""
cd /opt/scanopy/ui
$STD npm ci --no-fund --no-audit
$STD npm run build
msg_ok "Created frontend UI"
msg_info "Configuring server for first-run"
cat <<EOF >/opt/scanopy/.env cat <<EOF >/opt/scanopy/.env
### - SERVER ### - SERVER
SCANOPY_DATABASE_URL=postgresql://$PG_DB_USER:$PG_DB_PASS@localhost:5432/$PG_DB_NAME SCANOPY_DATABASE_URL=postgresql://$PG_DB_USER:$PG_DB_PASS@localhost:5432/$PG_DB_NAME
SCANOPY_WEB_EXTERNAL_PATH="/opt/scanopy/ui/build"
SCANOPY_PUBLIC_URL=http://${LOCAL_IP}:60072 SCANOPY_PUBLIC_URL=http://${LOCAL_IP}:60072
SCANOPY_SERVER_PORT=60072 SCANOPY_SERVER_PORT=60072
SCANOPY_LOG_LEVEL=info SCANOPY_LOG_LEVEL=info
@@ -73,7 +49,9 @@ SCANOPY_HEARTBEAT_INTERVAL=30
### - see https://github.com/scanopy/scanopy/blob/main/docs/CONFIGURATION.md for more options ### - see https://github.com/scanopy/scanopy/blob/main/docs/CONFIGURATION.md for more options
EOF EOF
msg_ok "Configured Scanopy"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/scanopy-server.service cat <<EOF >/etc/systemd/system/scanopy-server.service
[Unit] [Unit]
Description=Scanopy Network Discovery Server Description=Scanopy Network Discovery Server
@@ -81,7 +59,7 @@ After=network.target postgresql.service
[Service] [Service]
Type=simple Type=simple
WorkingDirectory=/opt/scanopy/backend WorkingDirectory=/opt/scanopy
EnvironmentFile=/opt/scanopy/.env EnvironmentFile=/opt/scanopy/.env
ExecStart=/usr/bin/scanopy-server ExecStart=/usr/bin/scanopy-server
Restart=always Restart=always
@@ -92,43 +70,8 @@ StandardError=journal
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
systemctl enable -q --now scanopy-server systemctl enable -q --now scanopy-server
msg_ok "Created Service"
# Creating short script to configure scanopy-daemon
# cat <<EOF >~/configure_daemon.sh
# #!/usr/bin/env bash
#
# echo "Auto-configuring integrated daemon..."
#
# NETWORK_ID="\$(sudo -u postgres psql -1 -t -d "${PG_DB_NAME}" -c 'SELECT id FROM networks;')"
# API_KEY="\$(sudo -u postgres psql -1 -t -d "${PG_DB_NAME}" -c 'SELECT key FROM api_keys;')"
#
# cat <<END >/etc/systemd/system/scanopy-daemon.service
# [Unit]
# Description=Scanopy Network Discovery Daemon
# After=network-online.target
# Wants=network-online.target
#
# [Service]
# Type=simple
# User=root
# ExecStart=/usr/bin/scanopy-daemon --server-url http://127.0.0.1:60072 --network-id \${NETWORK_ID} --daemon-api-key \${API_KEY} --mode push
# Restart=always
# RestartSec=10
# StandardOutput=journal
# StandardError=journal
#
# [Install]
# WantedBy=multi-user.target
# END
#
# systemctl enable -q --now scanopy-daemon
# echo "Scanopy daemon configured and running"
#
# EOF
# chmod +x ~/configure_daemon.sh
msg_ok "Scanopy server running - please create an account, daemon API key and daemon in the Scanopy UI."
motd_ssh motd_ssh
customize customize

View File

@@ -67,7 +67,7 @@ cd /opt/tracearr.build
$STD pnpm install --frozen-lockfile --force $STD pnpm install --frozen-lockfile --force
$STD pnpm turbo telemetry disable $STD pnpm turbo telemetry disable
$STD pnpm turbo run build --no-daemon --filter=@tracearr/shared --filter=@tracearr/server --filter=@tracearr/web $STD pnpm turbo run build --no-daemon --filter=@tracearr/shared --filter=@tracearr/server --filter=@tracearr/web
mkdir -p /opt/tracearr/{packages/shared,apps/server,apps/web,apps/server/src/db} mkdir -p /opt/tracearr/{packages/shared,packages/emails,apps/server,apps/web,apps/server/src/db}
cp -rf package.json /opt/tracearr/ cp -rf package.json /opt/tracearr/
cp -rf pnpm-workspace.yaml /opt/tracearr/ cp -rf pnpm-workspace.yaml /opt/tracearr/
cp -rf pnpm-lock.yaml /opt/tracearr/ cp -rf pnpm-lock.yaml /opt/tracearr/
@@ -77,6 +77,8 @@ cp -rf apps/server/scripts /opt/tracearr/apps/server/scripts
cp -rf apps/web/dist /opt/tracearr/apps/web/dist cp -rf apps/web/dist /opt/tracearr/apps/web/dist
cp -rf packages/shared/package.json /opt/tracearr/packages/shared/ cp -rf packages/shared/package.json /opt/tracearr/packages/shared/
cp -rf packages/shared/dist /opt/tracearr/packages/shared/dist cp -rf packages/shared/dist /opt/tracearr/packages/shared/dist
cp -rf packages/emails/package.json /opt/tracearr/packages/emails/
cp -rf packages/emails/dist /opt/tracearr/packages/emails/dist
cp -rf apps/server/src/db/migrations /opt/tracearr/apps/server/src/db/migrations cp -rf apps/server/src/db/migrations /opt/tracearr/apps/server/src/db/migrations
cp -rf data /opt/tracearr/data cp -rf data /opt/tracearr/data
mkdir -p /opt/tracearr/data/image-cache mkdir -p /opt/tracearr/data/image-cache

187
install/valhalla-install.sh Normal file
View File

@@ -0,0 +1,187 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: CrazyWolf13
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/valhalla/valhalla
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 \
autoconf \
automake \
ccache \
clang \
clang-tidy \
coreutils \
cmake \
g++ \
gcc \
git \
jq \
lcov \
libboost-all-dev \
libcurl4-openssl-dev \
libczmq-dev \
libgdal-dev \
libgeos++-dev \
libgeos-dev \
libluajit-5.1-dev \
liblz4-dev \
libprotobuf-dev \
libspatialite-dev \
libsqlite3-dev \
libsqlite3-mod-spatialite \
libtool \
libzmq3-dev \
lld \
locales \
luajit \
make \
osmium-tool \
parallel \
pkgconf \
protobuf-compiler \
python3-all-dev \
python3-shapely \
python3-requests \
python3-pip \
spatialite-bin \
unzip \
zlib1g-dev
msg_ok "Installed Dependencies"
PRIME_SERVER_RELEASE=$(get_latest_github_release "kevinkreiser/prime_server" "false")
msg_info "Building prime_server ${PRIME_SERVER_RELEASE} (Patience)"
$STD git clone --recurse-submodules --depth 1 --branch "$PRIME_SERVER_RELEASE" https://github.com/kevinkreiser/prime_server /tmp/prime_server
cd /tmp/prime_server
$STD ./autogen.sh
$STD ./configure
$STD make -j"$(nproc)"
$STD make install
cd /
rm -rf /tmp/prime_server
echo "${PRIME_SERVER_RELEASE#v}" >"$HOME/.prime_server"
msg_ok "Built prime_server"
RELEASE=$(get_latest_github_release "valhalla/valhalla" "false")
msg_info "Cloning Valhalla ${RELEASE} (Patience)"
mkdir -p /opt/valhalla
$STD git clone --recurse-submodules --depth 1 --branch "$RELEASE" https://github.com/valhalla/valhalla.git /opt/valhalla
msg_ok "Cloned Valhalla ${RELEASE}"
msg_info "Compiling Valhalla ${RELEASE} (this takes 20-45+ minutes, be patient)"
MEM_MB=$(awk '/MemTotal/{print int($2/1024)}' /proc/meminfo)
BUILD_JOBS=$((MEM_MB / 2000))
[[ $BUILD_JOBS -lt 1 ]] && BUILD_JOBS=1
[[ $BUILD_JOBS -gt $(nproc) ]] && BUILD_JOBS=$(nproc)
cd /opt/valhalla
$STD cmake -B build -DCMAKE_BUILD_TYPE=Release -DENABLE_PYTHON_BINDINGS=OFF -DENABLE_TESTS=OFF -DENABLE_SINGLE_FILES_WERROR=OFF
$STD cmake --build build -- -j"$BUILD_JOBS"
$STD cmake --install build
ldconfig
echo "${RELEASE#v}" >"$HOME/.valhalla"
msg_ok "Compiled Valhalla ${RELEASE}"
msg_info "Configuring Valhalla"
useradd --system --no-create-home --shell /usr/sbin/nologin valhalla 2>/dev/null || true
mkdir -p /opt/valhalla_data/{valhalla_tiles,pbf}
THREADS=$(nproc)
valhalla_build_config \
--mjolnir-tile-dir /opt/valhalla_data/valhalla_tiles \
--mjolnir-tile-extract /opt/valhalla_data/valhalla_tiles.tar \
--mjolnir-admin /opt/valhalla_data/admins.sqlite \
--mjolnir-timezone /opt/valhalla_data/timezones.sqlite \
--mjolnir-concurrency "$THREADS" \
>/opt/valhalla_data/valhalla.json
cat <<'EOF' >/opt/valhalla_data/build-tiles.sh
#!/usr/bin/env bash
# (Re)builds Valhalla routing tiles from one or more OSM extracts.
# Usage: build-tiles.sh <pbf-url-or-path> [<pbf-url-or-path> ...]
# Example: build-tiles.sh https://download.geofabrik.de/europe/germany-latest.osm.pbf
set -euo pipefail
export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
if [[ $# -eq 0 ]]; then
echo "Usage: $0 <pbf-url-or-path> [<pbf-url-or-path> ...]" >&2
exit 1
fi
DATA_DIR=/opt/valhalla_data
CONFIG="$DATA_DIR/valhalla.json"
mkdir -p "$DATA_DIR/pbf"
FILES=()
for src in "$@"; do
if [[ "$src" == http://* || "$src" == https://* ]]; then
fname="$DATA_DIR/pbf/$(basename "$src")"
echo "Downloading $src"
curl -fL --progress-bar -o "$fname" "$src"
else
fname="$src"
fi
FILES+=("$fname")
done
systemctl stop valhalla
echo "Building admin database"
valhalla_build_admins --config "$CONFIG" "${FILES[@]}"
echo "Building timezone database"
valhalla_build_timezones >"$DATA_DIR/timezones.sqlite"
echo "Building initial tile graph"
valhalla_build_tiles -c "$CONFIG" -e build "${FILES[@]}"
echo "Enhancing tile graph"
valhalla_build_tiles -c "$CONFIG" -s enhance "${FILES[@]}"
echo "Packing tiles into a single extract"
valhalla_build_extract -c "$CONFIG" -v
chown -R valhalla:valhalla "$DATA_DIR"
systemctl start valhalla
echo "Done. Tiles are in $DATA_DIR/valhalla_tiles (and packed at $DATA_DIR/valhalla_tiles.tar)."
EOF
chmod +x /opt/valhalla_data/build-tiles.sh
chown -R valhalla:valhalla /opt/valhalla_data
msg_ok "Configured Valhalla"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/valhalla.service
[Unit]
Description=Valhalla Routing Engine
After=network.target
[Service]
Type=simple
User=valhalla
Group=valhalla
WorkingDirectory=/opt/valhalla_data
ExecStart=/usr/local/bin/valhalla_service /opt/valhalla_data/valhalla.json ${THREADS}
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now valhalla
msg_ok "Created Service"
if [[ -n "${VALHALLA_PBF_URLS:-}" ]]; then
msg_info "Building Initial Tiles from VALHALLA_PBF_URLS (this can take a long time)"
$STD /opt/valhalla_data/build-tiles.sh $VALHALLA_PBF_URLS
msg_ok "Built Initial Tiles"
fi
motd_ssh
customize
cleanup_lxc

View File

@@ -32,8 +32,7 @@ CM="${GN}✓${CL} "
CROSS="${RD}${CL} " CROSS="${RD}${CL} "
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "add-iptag" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "add-iptag" "pve"
# Stop any running spinner # Stop any running spinner

View File

@@ -24,8 +24,7 @@ GN="\033[1;92m"
CL="\033[m" CL="\033[m"
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "clean-lxcs" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "clean-lxcs" "pve"
header_info header_info

View File

@@ -17,8 +17,7 @@ EOF
} }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "clean-orphaned-lvm" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "clean-orphaned-lvm" "pve"
# Function to check for orphaned LVM volumes # Function to check for orphaned LVM volumes

View File

@@ -45,8 +45,7 @@ EOF
header_info header_info
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "container-restore" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "container-restore" "pve"
function msg_info() { function msg_info() {

View File

@@ -45,8 +45,7 @@ EOF
header_info header_info
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "core-restore" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "core-restore" "pve"
function msg_info() { function msg_info() {

View File

@@ -5,9 +5,8 @@
# License: MIT # License: MIT
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/refs/heads/main/misc/core.func)
source <(curl -fsSL "${_CS_CORE_URL}/core/core.func") source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
load_functions load_functions
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "disk-health" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "disk-health" "pve"

View File

@@ -24,8 +24,7 @@ GN=$(echo "\033[1;92m")
CL=$(echo "\033[m") CL=$(echo "\033[m")
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "execute-lxcs" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "execute-lxcs" "pve"
header_info header_info

View File

@@ -17,8 +17,7 @@ EOF
} }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "frigate-support" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "frigate-support" "pve"
header_info header_info

View File

@@ -20,8 +20,7 @@ GN="\033[1;92m"
CL="\033[m" CL="\033[m"
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "fstrim" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "fstrim" "pve"
LOGFILE="/var/log/fstrim.log" LOGFILE="/var/log/fstrim.log"

View File

@@ -39,8 +39,7 @@ TAB=" "
CM="${TAB}✔️${TAB}${CL}" CM="${TAB}✔️${TAB}${CL}"
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "guest-delete" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "guest-delete" "pve"
GUEST_LOG=$(mktemp) GUEST_LOG=$(mktemp)

View File

@@ -17,8 +17,7 @@ EOF
} }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "host-backup" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "host-backup" "pve"
# Function to perform backup # Function to perform backup

View File

@@ -31,8 +31,7 @@ CM="${GN}✓${CL}"
set -e set -e
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "hw-acceleration" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "hw-acceleration" "pve"
header_info header_info

View File

@@ -23,8 +23,7 @@ RD="\033[01;31m"
CL="\033[m" CL="\033[m"
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "kernel-clean" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "kernel-clean" "pve"
# Detect current kernel # Detect current kernel

View File

@@ -27,8 +27,7 @@ current_kernel=$(uname -r)
available_kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print substr($2, 16, length($2)-22)}') available_kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print substr($2, 16, length($2)-22)}')
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "kernel-pin" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "kernel-pin" "pve"
header_info header_info

View File

@@ -30,8 +30,7 @@ msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; } msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "microcode" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "microcode" "pve"
header_info header_info

View File

@@ -16,8 +16,7 @@ cat <<"EOF"
EOF EOF
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "monitor-all" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "monitor-all" "pve"
add() { add() {
@@ -46,6 +45,8 @@ add() {
excluded_instances=("$@") excluded_instances=("$@")
echo "Excluded instances: ${excluded_instances[@]}" echo "Excluded instances: ${excluded_instances[@]}"
value_of() { sed -n "s/^$1:[[:space:]]*//p" <<<"$config" | head -n1; }
while true; do while true; do
for instance in $(pct list | awk 'NR>1 {print $1}'; qm list | awk 'NR>1 {print $1}'); do for instance in $(pct list | awk 'NR>1 {print $1}'; qm list | awk 'NR>1 {print $1}'); do
@@ -60,21 +61,21 @@ while true; do
if [ -r "/etc/pve/lxc/$instance.conf" ]; then if [ -r "/etc/pve/lxc/$instance.conf" ]; then
type="ct" type="ct"
config_file="/etc/pve/lxc/$instance.conf" config_file="/etc/pve/lxc/$instance.conf"
else elif [ -r "/etc/pve/qemu-server/$instance.conf" ]; then
type="vm" type="vm"
config_file="/etc/pve/qemu-server/$instance.conf" config_file="/etc/pve/qemu-server/$instance.conf"
else
echo "Skipping $instance because its config is no longer readable"
continue
fi fi
config=$(sed '/^\[/,$d' "$config_file") config=$(sed '/^\[/,$d' "$config_file")
# Skip templates and onboot-disabled # Both are booleans that Proxmox also writes as 0, so the value decides and
if grep -q "onboot: 0" <<<"$config" || ! grep -q "onboot" <<<"$config"; then # not the presence of the key.
onboot="true" [ "$(value_of onboot)" = "1" ] && onboot="true" || onboot="false"
else [ "$(value_of template)" = "1" ] && template="true" || template="false"
onboot="false"
fi
template=$(grep -q "^template:" <<<"$config" && echo "true" || echo "false")
if [ "$onboot" == "true" ]; then if [ "$onboot" != "true" ]; then
echo "Skipping $instance because it is set not to boot" echo "Skipping $instance because it is set not to boot"
continue continue
elif [ "$template" == "true" ]; then elif [ "$template" == "true" ]; then
@@ -82,34 +83,40 @@ while true; do
continue continue
fi fi
# Check for mon-restart tag # Tags are semicolon separated, so match a whole entry instead of a
has_tag=$(grep -q "tags:.*mon-restart" <<<"$config" && echo "true" || echo "false") # substring of a longer tag such as mon-restart-disabled.
if [ "$has_tag" != "true" ]; then tags=";$(value_of tags | tr -d '[:space:]');"
if [[ "$tags" != *";mon-restart;"* ]]; then
echo "Skipping $instance because it does not have 'mon-restart' tag" echo "Skipping $instance because it does not have 'mon-restart' tag"
continue continue
fi fi
# Responsiveness check and restart if needed # Responsiveness check and restart if needed
if [ "$type" == "vm" ]; then if [ "$type" == "vm" ]; then
# Check if guest agent responds if ! qm status "$instance" 2>/dev/null | grep -q "status: running"; then
if qm guest cmd $instance ping >/dev/null 2>&1; then echo "$(date): VM $instance is not running, starting..."
qm start "$instance" >/dev/null 2>&1
elif qm guest cmd "$instance" ping >/dev/null 2>&1; then
echo "VM $instance is responsive via guest agent" echo "VM $instance is responsive via guest agent"
else else
echo "$(date): VM $instance is not responding to agent ping, restarting..." echo "$(date): VM $instance is not responding to agent ping, restarting..."
if qm status $instance | grep -q "status: running"; then qm stop "$instance" >/dev/null 2>&1
qm stop $instance >/dev/null 2>&1
sleep 5 sleep 5
fi qm start "$instance" >/dev/null 2>&1
qm start $instance >/dev/null 2>&1
fi fi
else else
# Container: get IP and ping if ! pct status "$instance" 2>/dev/null | grep -q "status: running"; then
IP=$(pct exec $instance ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1 | head -n1) echo "$(date): CT $instance is not running, starting..."
if ! ping -c 1 $IP >/dev/null 2>&1; then pct start "$instance" >/dev/null 2>&1
continue
fi
# Not every container names its interface eth0.
IP=$(pct exec "$instance" -- ip -4 -o addr show scope global 2>/dev/null | awk '{print $4}' | cut -d/ -f1 | head -n1)
if [ -z "$IP" ] || ! ping -c 1 -W 2 "$IP" >/dev/null 2>&1; then
echo "$(date): CT $instance is not responding, restarting..." echo "$(date): CT $instance is not responding, restarting..."
pct stop $instance >/dev/null 2>&1 pct stop "$instance" >/dev/null 2>&1
sleep 5 sleep 5
pct start $instance >/dev/null 2>&1 pct start "$instance" >/dev/null 2>&1
else else
echo "CT $instance is responsive" echo "CT $instance is responsive"
fi fi
@@ -125,23 +132,18 @@ EOF
touch /var/log/ping-instances.log touch /var/log/ping-instances.log
chmod +x /usr/local/bin/ping-instances.sh chmod +x /usr/local/bin/ping-instances.sh
cat <<EOF >/etc/systemd/system/ping-instances.timer # The service loops with its own five minute sleep, so the timer that earlier
[Unit] # versions installed could only ever start a unit that was already running.
Description=Delay ping-instances.service by 5 minutes if [[ -f /etc/systemd/system/ping-instances.timer ]]; then
systemctl disable -q --now ping-instances.timer 2>/dev/null || true
[Timer] rm -f /etc/systemd/system/ping-instances.timer
OnBootSec=300 fi
OnUnitActiveSec=300
[Install]
WantedBy=timers.target
EOF
cat <<EOF >/etc/systemd/system/ping-instances.service cat <<EOF >/etc/systemd/system/ping-instances.service
[Unit] [Unit]
Description=Ping instances every 5 minutes and restart if necessary Description=Ping instances every 5 minutes and restart if necessary
After=ping-instances.timer After=pve-cluster.service
Requires=ping-instances.timer Wants=pve-cluster.service
[Service] [Service]
Type=simple Type=simple
@@ -159,7 +161,6 @@ WantedBy=multi-user.target
EOF EOF
systemctl daemon-reload systemctl daemon-reload
systemctl enable -q --now ping-instances.timer
systemctl enable -q --now ping-instances.service systemctl enable -q --now ping-instances.service
clear clear
echo -e "\n Monitor All installed." echo -e "\n Monitor All installed."
@@ -168,7 +169,7 @@ EOF
} }
remove() { remove() {
systemctl disable -q --now ping-instances.timer systemctl disable -q --now ping-instances.timer 2>/dev/null || true
systemctl disable -q --now ping-instances.service systemctl disable -q --now ping-instances.service
rm -f /etc/systemd/system/ping-instances.service rm -f /etc/systemd/system/ping-instances.service
rm -f /etc/systemd/system/ping-instances.timer rm -f /etc/systemd/system/ping-instances.timer

View File

@@ -34,8 +34,7 @@ EOF
} }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "nic-offloading-fix" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "nic-offloading-fix" "pve"
header_info header_info

View File

@@ -30,8 +30,7 @@ CROSS="${RD}✗${CL}"
msg_info() { echo -ne " ${HOLD} ${YW}$1..."; } msg_info() { echo -ne " ${HOLD} ${YW}$1..."; }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pbs-microcode" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pbs-microcode" "pve"
msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; } msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; } msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }

View File

@@ -45,8 +45,7 @@ msg_error() {
} }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pbs3-upgrade" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pbs3-upgrade" "pve"
start_routines() { start_routines() {

View File

@@ -33,8 +33,7 @@ msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; } msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pbs4-upgrade" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pbs4-upgrade" "pve"
start_routines() { start_routines() {

View File

@@ -33,8 +33,7 @@ msg_ok() { echo -e "${BFR} ${CM} ${GN}$1${CL}"; }
msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; } msg_error() { echo -e "${BFR} ${CROSS} ${RD}$1${CL}"; }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pbs-install" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pbs-install" "pve"
# ---- helpers ---- # ---- helpers ----

View File

@@ -44,8 +44,7 @@ msg_error() {
} }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pdm-install" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pdm-install" "pve"
if ! dpkg -s proxmox-datacenter-manager >/dev/null 2>&1; then if ! dpkg -s proxmox-datacenter-manager >/dev/null 2>&1; then

View File

@@ -44,8 +44,7 @@ msg_error() {
} }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/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 ! dpkg -s proxmox-mailgateway-container >/dev/null 2>&1 && if ! dpkg -s proxmox-mailgateway-container >/dev/null 2>&1 &&

View File

@@ -45,8 +45,7 @@ msg_error() {
} }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pve-install" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "post-pve-install" "pve"
get_pve_version() { get_pve_version() {

View File

@@ -10,9 +10,8 @@ if ! command -v curl >/dev/null 2>&1; then
apt-get update >/dev/null 2>&1 apt-get update >/dev/null 2>&1
apt-get install -y curl >/dev/null 2>&1 apt-get install -y curl >/dev/null 2>&1
fi fi
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL "${_CS_CORE_URL}/core/core.func") source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
load_functions load_functions
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pve-privilege-converter" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pve-privilege-converter" "pve"

View File

@@ -45,8 +45,7 @@ msg_error() {
} }
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pve8-upgrade" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "pve8-upgrade" "pve"
start_routines() { start_routines() {

View File

@@ -7,8 +7,7 @@
set -e set -e
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "scaling-governor" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "scaling-governor" "pve"
header_info() { header_info() {

View File

@@ -3,9 +3,8 @@
# Author: MickLesk (CanbiZ) # Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/refs/heads/main/misc/core.func)
source <(curl -fsSL "${_CS_CORE_URL}/core/core.func") source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
load_functions load_functions
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "storage-share-helper" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "storage-share-helper" "pve"

View File

@@ -26,8 +26,7 @@ GN=$(echo "\033[1;92m")
CL=$(echo "\033[m") CL=$(echo "\033[m")
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-lxcs" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-lxcs" "pve"
header_info header_info

View File

@@ -24,8 +24,7 @@ GN=$(echo "\033[1;92m")
CL=$(echo "\033[m") CL=$(echo "\033[m")
# Telemetry # Telemetry
_CS_CORE_URL="${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}" source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) 2>/dev/null || true
source <(curl -fsSL "${_CS_CORE_URL}/api/api.func") 2>/dev/null || true
declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-repo" "pve" declare -f init_tool_telemetry &>/dev/null && init_tool_telemetry "update-repo" "pve"
header_info header_info