mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-10-25 11:02:01 -04:00
Compare commits
31 Commits
fix/immich
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1dee4473eb | ||
|
|
cbefc8590e | ||
|
|
193659402e | ||
|
|
ff2645698a | ||
|
|
359fd5d01a | ||
|
|
43ec20463e | ||
|
|
507b5a1556 | ||
|
|
469da44126 | ||
|
|
b0a39be6c0 | ||
|
|
ecf5376265 | ||
|
|
6717059b8c | ||
|
|
ef0579b39d | ||
|
|
80cc9edf9c | ||
|
|
c50aa2dfe3 | ||
|
|
e045557655 | ||
|
|
bedc06d73f | ||
|
|
74c8ba79fa | ||
|
|
4dd47de8ff | ||
|
|
31560bceba | ||
|
|
d2053aaf6b | ||
|
|
264386a338 | ||
|
|
7595fbf0fe | ||
|
|
714dd4d739 | ||
|
|
f52c8e1ea4 | ||
|
|
6018a31dd1 | ||
|
|
ac51382b21 | ||
|
|
c62f9da4c6 | ||
|
|
e62f5a91ae | ||
|
|
ab223217bf | ||
|
|
b7add5b2d7 | ||
|
|
4e22061f07 |
24
CHANGELOG.md
24
CHANGELOG.md
@@ -570,10 +570,25 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
## 2026-10-25
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- TaskView ([#18166](https://github.com/community-scripts/ProxmoxVE/pull/18166))
|
||||
- EmDash ([#18165](https://github.com/community-scripts/ProxmoxVE/pull/18165))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Element Synapse: remove the registration line by its text, not line 34 [@MickLesk](https://github.com/MickLesk) ([#18201](https://github.com/community-scripts/ProxmoxVE/pull/18201))
|
||||
- Element Synapse: drop the ::1 listener so a container without IPv6 starts [@MickLesk](https://github.com/MickLesk) ([#18180](https://github.com/community-scripts/ProxmoxVE/pull/18180))
|
||||
- Heimdall: generate the app key without the production prompt [@MickLesk](https://github.com/MickLesk) ([#18156](https://github.com/community-scripts/ProxmoxVE/pull/18156))
|
||||
- Frigate: fetch the Intel graphics key with retries before building the media driver [@MickLesk](https://github.com/MickLesk) ([#18192](https://github.com/community-scripts/ProxmoxVE/pull/18192))
|
||||
- Pterodactyl Panel: default the admin's first and last name when left empty [@MickLesk](https://github.com/MickLesk) ([#18177](https://github.com/community-scripts/ProxmoxVE/pull/18177))
|
||||
- Jellyseerr: point fresh installs to Seerr instead of a missing install script [@MickLesk](https://github.com/MickLesk) ([#18183](https://github.com/community-scripts/ProxmoxVE/pull/18183))
|
||||
- Pi-hole: download the installer before running it [@MickLesk](https://github.com/MickLesk) ([#18182](https://github.com/community-scripts/ProxmoxVE/pull/18182))
|
||||
- OmniTools: give the build a git commit to read [@MickLesk](https://github.com/MickLesk) ([#18181](https://github.com/community-scripts/ProxmoxVE/pull/18181))
|
||||
- iVentoy: stop early in an unprivileged container [@MickLesk](https://github.com/MickLesk) ([#18179](https://github.com/community-scripts/ProxmoxVE/pull/18179))
|
||||
- Immich: stop early on Debian 12 instead of failing at apt [@MickLesk](https://github.com/MickLesk) ([#18178](https://github.com/community-scripts/ProxmoxVE/pull/18178))
|
||||
- paperless-ngx: fix missing index folder [@Segelzwerg](https://github.com/Segelzwerg) ([#18142](https://github.com/community-scripts/ProxmoxVE/pull/18142))
|
||||
- Anytype Server: keep the .env across updates and recreate a lost one [@MickLesk](https://github.com/MickLesk) ([#18155](https://github.com/community-scripts/ProxmoxVE/pull/18155))
|
||||
- changedetection: build Browserless from its lockfile on update [@MickLesk](https://github.com/MickLesk) ([#18157](https://github.com/community-scripts/ProxmoxVE/pull/18157))
|
||||
@@ -584,6 +599,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
- Gramps-Web: run the Celery task queue with Redis [@MickLesk](https://github.com/MickLesk) ([#18141](https://github.com/community-scripts/ProxmoxVE/pull/18141))
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- tubearchivist: fix: prepare tubearchivist for v0.6.0 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#17867](https://github.com/community-scripts/ProxmoxVE/pull/17867))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- TREK: build 5.0 with 4 GB RAM and without dependency install scripts [@MickLesk](https://github.com/MickLesk) ([#18194](https://github.com/community-scripts/ProxmoxVE/pull/18194))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- alpine: fix uv release url [@mfelipe](https://github.com/mfelipe) ([core#168](https://github.com/community-scripts/core/pull/168))
|
||||
@@ -594,6 +617,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- post-pmg-install: hide the subscription nag in the PMG 9 mobile quarantine [@MickLesk](https://github.com/MickLesk) ([#18140](https://github.com/community-scripts/ProxmoxVE/pull/18140))
|
||||
- post-pve-install: hide the mobile subscription nag in every UI language [@MickLesk](https://github.com/MickLesk) ([#18143](https://github.com/community-scripts/ProxmoxVE/pull/18143))
|
||||
|
||||
## 2026-10-24
|
||||
|
||||
72
ct/emdash.sh
Normal file
72
ct/emdash.sh
Normal file
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env bash
|
||||
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
|
||||
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/emdash-cms/emdash
|
||||
|
||||
APP="EmDash"
|
||||
var_tags="${var_tags:-cms;blog}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-3072}"
|
||||
var_disk="${var_disk:-6}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
export var_emdash_url="${var_emdash_url:-}"
|
||||
export var_emdash_template="${var_emdash_template:-}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/emdash ]]; then
|
||||
msg_error "No EmDash Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "emdash" "emdash-cms/emdash" "" "" "emdash@"; then
|
||||
msg_info "Stopping EmDash"
|
||||
systemctl stop emdash
|
||||
msg_ok "Stopped EmDash"
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm@11" setup_nodejs
|
||||
|
||||
msg_info "Updating EmDash"
|
||||
cd /opt/emdash
|
||||
set -a && source /opt/emdash_data/.env && set +a
|
||||
$STD pnpm add "${CHECK_UPDATE_RELEASE}"
|
||||
$STD pnpm build
|
||||
$STD pnpm store prune
|
||||
cat <<EOF >~/.emdash
|
||||
${CHECK_UPDATE_RELEASE}
|
||||
EOF
|
||||
msg_ok "Updated EmDash"
|
||||
|
||||
msg_info "Starting EmDash"
|
||||
systemctl start emdash
|
||||
msg_ok "Started EmDash"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
|
||||
echo -e "${GATEWAY}${BGN}http://${IP}:4321${CL}"
|
||||
echo -e "${INFO}${YW}The admin at /_emdash/admin signs in with passkeys only, and browsers allow those on HTTPS with a domain or on localhost, never on an IP address.${CL}"
|
||||
echo -e "${INFO}${YW}Put EmDash behind a reverse proxy with a trusted certificate, set EMDASH_SITE_URL in /opt/emdash_data/.env to that address and rebuild (see the notes), then create the admin there.${CL}"
|
||||
@@ -96,6 +96,12 @@ EOF
|
||||
exit
|
||||
}
|
||||
|
||||
if [[ ! -d /opt/jellyseerr ]]; then
|
||||
msg_error "Jellyseerr is now Seerr and can no longer be installed with this script."
|
||||
msg_warn "Install Seerr instead: https://community-scripts.org/scripts/seerr"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
@@ -34,12 +34,15 @@ function update_script() {
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
if check_for_gh_release "omnitools" "iib0011/omni-tools"; then
|
||||
ensure_dependencies git
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "omnitools" "iib0011/omni-tools" "tarball"
|
||||
|
||||
msg_info "Building OmniTools"
|
||||
cd /opt/omnitools
|
||||
export HUSKY=0
|
||||
$STD npm ci --allow-remote=all
|
||||
$STD git init -q
|
||||
$STD git -c user.name=build -c user.email=build@localhost commit -q --allow-empty -m build
|
||||
$STD npm run build
|
||||
msg_ok "Built OmniTools"
|
||||
|
||||
|
||||
74
ct/taskview.sh
Normal file
74
ct/taskview.sh
Normal file
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env bash
|
||||
_cs_boot="${COMMUNITY_SCRIPTS_CORE_DIR:-$(dirname "${BASH_SOURCE[0]}")/../../core}/core/build.func"
|
||||
source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_URL:-https://raw.githubusercontent.com/community-scripts/core/main}/core/build.func")
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/Gimanh/taskview-community
|
||||
|
||||
APP="TaskView"
|
||||
var_tags="${var_tags:-project-management;tasks;kanban}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-6144}"
|
||||
var_disk="${var_disk:-10}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-yes}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/taskview ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "taskview" "Gimanh/taskview-community"; then
|
||||
msg_info "Stopping TaskView"
|
||||
systemctl stop taskview
|
||||
msg_ok "Stopped TaskView"
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "taskview" "Gimanh/taskview-community" "tarball"
|
||||
|
||||
msg_info "Building TaskView"
|
||||
cd /opt/taskview
|
||||
$STD pnpm install --frozen-lockfile
|
||||
cd /opt/taskview/api
|
||||
$STD pnpm run build:docker
|
||||
$STD pnpm run build:migration
|
||||
cp -r src/migrations/taskview dist-migration/
|
||||
cd /opt/taskview/web
|
||||
$STD pnpm run build:packages
|
||||
$STD pnpm run build-only
|
||||
msg_ok "Built TaskView"
|
||||
|
||||
msg_info "Migrating TaskView Database"
|
||||
cd /opt/taskview_data
|
||||
$STD node /opt/taskview/api/dist-migration/taskview-db-migration.js
|
||||
msg_ok "Migrated TaskView Database"
|
||||
|
||||
msg_info "Starting TaskView"
|
||||
systemctl start taskview
|
||||
msg_ok "Started TaskView"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
|
||||
echo -e "${GATEWAY}${BGN}http://${IP}${CL}"
|
||||
@@ -9,7 +9,7 @@ source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_
|
||||
APP="TREK"
|
||||
var_tags="${var_tags:-travel;planning;collaboration}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
@@ -43,6 +43,7 @@ function update_script() {
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
ensure_dependencies "libkitinerary-bin"
|
||||
ln -sf "$(find /usr/lib -name kitinerary-extractor -type f | head -1)" /usr/local/bin/kitinerary-extractor
|
||||
|
||||
create_backup /opt/trek/server/.env \
|
||||
/opt/trek/data \
|
||||
@@ -52,7 +53,7 @@ function update_script() {
|
||||
|
||||
msg_info "Building TREK"
|
||||
cd /opt/trek
|
||||
$STD npm ci
|
||||
$STD npm ci --ignore-scripts
|
||||
$STD npm run build --workspace=shared
|
||||
$STD npm run build --workspace=client
|
||||
$STD npm run build --workspace=server
|
||||
@@ -72,7 +73,7 @@ function update_script() {
|
||||
|
||||
rm -rf /opt/trek/node_modules
|
||||
cd /opt/trek
|
||||
$STD npm ci --workspace=server --omit=dev
|
||||
$STD npm ci --workspace=server --omit=dev --ignore-scripts
|
||||
msg_ok "Set up TREK Workspace"
|
||||
|
||||
if [[ "$MIGRATION" == "1" ]]; then
|
||||
|
||||
@@ -71,6 +71,41 @@ EOF
|
||||
|
||||
restore_backup
|
||||
|
||||
if grep -q '^TA_BACKEND_PORT=' /opt/tubearchivist/.env 2>/dev/null; then
|
||||
msg_info "Migrating to v0.6.0 (dropping Nginx)"
|
||||
systemctl disable -q --now nginx
|
||||
$STD apt autoremove --purge -y nginx
|
||||
sed -i 's/^TA_BACKEND_PORT=.*/TA_PORT=8000/' /opt/tubearchivist/.env
|
||||
cat <<'RUNEOF' >/opt/tubearchivist/backend/run.sh
|
||||
#!/bin/bash
|
||||
set -e
|
||||
cd /opt/tubearchivist/backend
|
||||
set -a
|
||||
source /opt/tubearchivist/.env
|
||||
set +a
|
||||
PYTHON=/opt/tubearchivist/.venv/bin/python
|
||||
|
||||
echo "Waiting for ElasticSearch..."
|
||||
for i in $(seq 1 30); do
|
||||
if curl -sf http://localhost:9200/_cluster/health >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
$PYTHON manage.py ta_stop_on_error
|
||||
$PYTHON manage.py migrate
|
||||
$PYTHON manage.py collectstatic --noinput -c
|
||||
$PYTHON manage.py ta_envcheck
|
||||
$PYTHON manage.py ta_connection
|
||||
$PYTHON manage.py ta_startup
|
||||
|
||||
exec $PYTHON backend_start.py
|
||||
RUNEOF
|
||||
chmod +x /opt/tubearchivist/backend/run.sh
|
||||
msg_ok "Migrated to v0.6.0 (dropping Nginx)"
|
||||
fi
|
||||
|
||||
msg_info "Rebuilding Tube Archivist"
|
||||
cd /opt/tubearchivist/frontend
|
||||
$STD npm install
|
||||
@@ -113,7 +148,6 @@ EOF
|
||||
|
||||
msg_info "Starting Services"
|
||||
systemctl start bgutil-provider tubearchivist tubearchivist-celery tubearchivist-beat
|
||||
systemctl reload nginx
|
||||
msg_ok "Started Services"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
@@ -128,3 +162,5 @@ msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
|
||||
echo -e "${GATEWAY}${BGN}http://${IP}:8000${CL}"
|
||||
echo -e "${INFO}${YW}Admin credentials saved to ~/tubearchivist.creds${CL}"
|
||||
echo -e "${INFO}${YW}The WebUI may take a couple of minutes to become available on first start, while Elasticsearch and the backend initialize.${CL}"
|
||||
|
||||
@@ -40,7 +40,7 @@ chmod +x /usr/sbin/policy-rc.d
|
||||
$STD apt install matrix-synapse-py3 -y
|
||||
rm -f /usr/sbin/policy-rc.d
|
||||
sed -i 's/127.0.0.1/0.0.0.0/g' /etc/matrix-synapse/homeserver.yaml
|
||||
sed -i 's/'\''::1'\'', //g' /etc/matrix-synapse/homeserver.yaml
|
||||
sed -i '/^ *- ::1$/d' /etc/matrix-synapse/homeserver.yaml
|
||||
SECRET=$(openssl rand -hex 32)
|
||||
ADMIN_PASS="$(random_password 13)"
|
||||
echo "enable_registration_without_verification: true" >>/etc/matrix-synapse/homeserver.yaml
|
||||
@@ -71,7 +71,7 @@ Admin username: admin
|
||||
Admin password: $ADMIN_PASS
|
||||
EOF
|
||||
systemctl stop matrix-synapse
|
||||
sed -i '34d' /etc/matrix-synapse/homeserver.yaml
|
||||
sed -i '/^enable_registration_without_verification: true$/d' /etc/matrix-synapse/homeserver.yaml
|
||||
systemctl start matrix-synapse
|
||||
msg_ok "Installed Element Synapse"
|
||||
|
||||
|
||||
70
install/emdash-install.sh
Normal file
70
install/emdash-install.sh
Normal file
@@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/emdash-cms/emdash
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm@11" setup_nodejs
|
||||
|
||||
msg_info "Creating EmDash Site"
|
||||
cd /opt
|
||||
$STD pnpm dlx create-emdash@latest emdash --platform node --template "${var_emdash_template:-blog}" --pm pnpm --no-install --yes
|
||||
mkdir -p /opt/emdash_data/uploads
|
||||
mv /opt/emdash/.env /opt/emdash_data/.env
|
||||
sed -i -e 's|file:./data.db|file:/opt/emdash_data/data.db|' -e 's|"./uploads"|"/opt/emdash_data/uploads"|' /opt/emdash/astro.config.mjs
|
||||
cat <<EOF >>/opt/emdash_data/.env
|
||||
HOST=0.0.0.0
|
||||
PORT=4321
|
||||
# The address in the browser bar. Passkeys are bound to its hostname, and the build bakes it in for image optimization:
|
||||
# after a change run cd /opt/emdash && set -a && . /opt/emdash_data/.env && set +a && pnpm build && systemctl restart emdash
|
||||
EMDASH_SITE_URL=${var_emdash_url:-http://${LOCAL_IP}:4321}
|
||||
EOF
|
||||
chmod 600 /opt/emdash_data/.env
|
||||
msg_ok "Created EmDash Site"
|
||||
|
||||
msg_info "Building EmDash"
|
||||
cd /opt/emdash
|
||||
# pnpm keeps Astro's sharp out of the site's reach, and every /_image request then fails with MissingSharp
|
||||
$STD pnpm add sharp
|
||||
set -a && source /opt/emdash_data/.env && set +a
|
||||
$STD pnpm build
|
||||
cat <<EOF >~/.emdash
|
||||
emdash@$(node -p 'require("/opt/emdash/node_modules/emdash/package.json").version')
|
||||
EOF
|
||||
msg_ok "Built EmDash"
|
||||
|
||||
msg_info "Creating EmDash Service"
|
||||
cat <<EOF >/etc/systemd/system/emdash.service
|
||||
[Unit]
|
||||
Description=EmDash
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/emdash
|
||||
EnvironmentFile=/opt/emdash_data/.env
|
||||
Environment=NODE_ENV=production
|
||||
ExecStart=/usr/bin/node /opt/emdash/dist/server/entry.mjs
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now emdash
|
||||
msg_ok "Created EmDash Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -124,6 +124,8 @@ msg_ok "Built SQLite Extensions"
|
||||
|
||||
if [[ "$(arch_resolve)" == "amd64" ]]; then
|
||||
msg_info "Building Intel Media Driver (Patience)"
|
||||
download_gpg_key "https://repositories.intel.com/gpu/intel-graphics.key" "/usr/share/keyrings/intel-graphics.gpg" "dearmor"
|
||||
sed -i '/intel-graphics.key/d' /opt/frigate/docker/main/build_intel_media_driver.sh
|
||||
$STD bash /opt/frigate/docker/main/build_intel_media_driver.sh
|
||||
cp -a /rootfs/. /
|
||||
rm -rf /rootfs
|
||||
|
||||
@@ -25,7 +25,7 @@ msg_info "Setting up Heimdall-Dashboard"
|
||||
cd /opt/Heimdall
|
||||
cp .env.example .env
|
||||
sed -i 's/^APP_ENV=.*/APP_ENV=production/' .env
|
||||
$STD php artisan key:generate
|
||||
$STD php artisan key:generate --force
|
||||
msg_ok "Setup Heimdall-Dashboard"
|
||||
|
||||
msg_info "Creating Service"
|
||||
|
||||
@@ -13,6 +13,11 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
if is_debian && [[ "$(get_os_version_major)" -lt 13 ]]; then
|
||||
msg_error "Immich needs Debian 13: its build dependencies and Intel runtime packages are not available on Debian 12."
|
||||
exit 238
|
||||
fi
|
||||
|
||||
RELEASE="v3.3.5"
|
||||
if lscpu | grep -q 'GenuineIntel'; then
|
||||
echo ""
|
||||
|
||||
@@ -13,6 +13,12 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
if [[ "${CTTYPE:-1}" != "0" ]]; then
|
||||
msg_error "iVentoy requires a privileged LXC container."
|
||||
msg_error "Recreate the container with unprivileged=0."
|
||||
exit 10
|
||||
fi
|
||||
|
||||
fetch_and_deploy_gh_release "iventoy" "ventoy/PXE" "prebuild" "latest" "/opt/iventoy" "iventoy-*-linux-$(arch_resolve x86_64-free arm64-trial).tar.gz"
|
||||
mkdir -p /opt/iventoy/{data,iso}
|
||||
|
||||
|
||||
@@ -14,7 +14,9 @@ network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y nginx
|
||||
$STD apt install -y \
|
||||
git \
|
||||
nginx
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
@@ -24,6 +26,8 @@ msg_info "Building OmniTools"
|
||||
cd /opt/omnitools
|
||||
export HUSKY=0
|
||||
$STD npm ci --allow-remote=all
|
||||
$STD git init -q
|
||||
$STD git -c user.name=build -c user.email=build@localhost commit -q --allow-empty -m build
|
||||
$STD npm run build
|
||||
msg_ok "Built OmniTools"
|
||||
|
||||
|
||||
@@ -80,7 +80,6 @@ set -a
|
||||
. /opt/paperless/paperless.conf
|
||||
set +a
|
||||
$STD uv run -- python manage.py migrate
|
||||
$STD uv run -- python manage.py reindex
|
||||
msg_ok "Setup Paperless-ngx"
|
||||
|
||||
msg_info "Setting up admin Paperless-ngx User & Password"
|
||||
|
||||
@@ -22,7 +22,9 @@ msg_ok "Installed Dependencies"
|
||||
msg_info "Installing Pi-hole"
|
||||
mkdir -p /etc/pihole
|
||||
touch /etc/pihole/pihole.toml
|
||||
$STD bash <(curl -fsSL https://install.pi-hole.net) --unattended
|
||||
curl_with_retry "https://install.pi-hole.net" /tmp/pihole-install.sh
|
||||
$STD bash /tmp/pihole-install.sh --unattended
|
||||
rm -f /tmp/pihole-install.sh
|
||||
sed -i -E '
|
||||
/^\s*upstreams =/ s|=.*|= ["8.8.8.8", "8.8.4.4"]|
|
||||
/^\s*interface =/ s|=.*|= "eth0"|
|
||||
|
||||
@@ -51,11 +51,11 @@ ADMIN_EMAIL="${var_pterodactyl_panel_admin_email:-}"
|
||||
[[ -n "$ADMIN_EMAIL" ]] || read -r -p "${TAB3}Provide an email address for admin login, this should be a valid email address: " ADMIN_EMAIL || true
|
||||
[[ -n "$ADMIN_EMAIL" ]] || { msg_error "No admin email given; set var_pterodactyl_panel_admin_email or answer the prompt"; exit 64; }
|
||||
NAME_FIRST="${var_pterodactyl_panel_first_name:-}"
|
||||
[[ -n "$NAME_FIRST" ]] || read -r -p "${TAB3}Enter your First Name: " NAME_FIRST || true
|
||||
[[ -n "$NAME_FIRST" ]] || { msg_error "No first name given; set var_pterodactyl_panel_first_name or answer the prompt"; exit 64; }
|
||||
[[ -n "$NAME_FIRST" ]] || read -r -p "${TAB3}Enter your First Name [Admin]: " NAME_FIRST || true
|
||||
NAME_FIRST="${NAME_FIRST:-Admin}"
|
||||
NAME_LAST="${var_pterodactyl_panel_last_name:-}"
|
||||
[[ -n "$NAME_LAST" ]] || read -r -p "${TAB3}Enter your Last Name: " NAME_LAST || true
|
||||
[[ -n "$NAME_LAST" ]] || { msg_error "No last name given; set var_pterodactyl_panel_last_name or answer the prompt"; exit 64; }
|
||||
[[ -n "$NAME_LAST" ]] || read -r -p "${TAB3}Enter your Last Name [User]: " NAME_LAST || true
|
||||
NAME_LAST="${NAME_LAST:-User}"
|
||||
|
||||
fetch_and_deploy_gh_release "pterodactyl-panel" "pterodactyl/panel" "prebuild" "latest" "/opt/pterodactyl-panel" "panel.tar.gz"
|
||||
|
||||
|
||||
135
install/taskview-install.sh
Normal file
135
install/taskview-install.sh
Normal file
@@ -0,0 +1,135 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/Gimanh/taskview-community
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y nginx
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
|
||||
PG_VERSION="18" setup_postgresql
|
||||
PG_DB_NAME="taskview" PG_DB_USER="taskview" setup_postgresql_db
|
||||
|
||||
msg_info "Configuring PostgreSQL for TaskView"
|
||||
# Every migration run terminates all other sessions on the database, autovacuum workers included
|
||||
$STD sudo -u postgres psql -c "GRANT pg_signal_autovacuum_worker TO taskview;"
|
||||
msg_ok "Configured PostgreSQL for TaskView"
|
||||
|
||||
fetch_and_deploy_gh_release "taskview" "Gimanh/taskview-community" "tarball"
|
||||
|
||||
msg_info "Building TaskView"
|
||||
cd /opt/taskview
|
||||
$STD pnpm install --frozen-lockfile
|
||||
cd /opt/taskview/api
|
||||
$STD pnpm run build:docker
|
||||
$STD pnpm run build:migration
|
||||
cp -r src/migrations/taskview dist-migration/
|
||||
cd /opt/taskview/web
|
||||
# upstream's build script type-checks before Vite has generated the auto-import types, which fails on a fresh checkout
|
||||
$STD pnpm run build:packages
|
||||
$STD pnpm run build-only
|
||||
msg_ok "Built TaskView"
|
||||
|
||||
msg_info "Configuring TaskView"
|
||||
mkdir -p /opt/taskview_data
|
||||
cat <<EOF >/opt/taskview_data/.env
|
||||
NODE_ENV=production
|
||||
DB_HOST=localhost
|
||||
DB_PORT=5432
|
||||
DB_NAME=taskview
|
||||
DB_USER=taskview
|
||||
DB_PASSWORD=${PG_DB_PASS}
|
||||
APP_PORT=1401
|
||||
APP_URL=http://${LOCAL_IP}
|
||||
CORS_ALLOWED_ORIGINS=http://${LOCAL_IP}
|
||||
TRUST_PROXY=1
|
||||
JWT_ALG=HS256
|
||||
JWT_SIGN=$(openssl rand -hex 64)
|
||||
ACCESS_LIFE_TIME=3d
|
||||
REFRESH_LIFE_TIME=9d
|
||||
ENCRYPTION_KEY=$(openssl rand -hex 32)
|
||||
PASSWORD_CHANGE_CONFIRMATION=password
|
||||
EOF
|
||||
chmod 600 /opt/taskview_data/.env
|
||||
msg_ok "Configured TaskView"
|
||||
|
||||
msg_info "Creating TaskView Database Schema"
|
||||
# The migration reads DB_* from the .env in its working directory
|
||||
cd /opt/taskview_data
|
||||
$STD node /opt/taskview/api/dist-migration/taskview-db-migration.js --create
|
||||
msg_ok "Created TaskView Database Schema"
|
||||
|
||||
msg_info "Configuring Nginx"
|
||||
cat <<'EOF' >/etc/nginx/sites-available/taskview
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
root /opt/taskview/web/dist;
|
||||
index index.html;
|
||||
|
||||
gzip_types text/css application/javascript application/json image/svg+xml;
|
||||
|
||||
location ~ ^/(module|scim|\.well-known)/ {
|
||||
proxy_pass http://127.0.0.1:1401;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# Pins the web client to the API behind this same origin and hides the server selector
|
||||
location = /config.js {
|
||||
default_type application/javascript;
|
||||
add_header Cache-Control "no-cache, no-store, must-revalidate";
|
||||
return 200 'window.__TASKVIEW_CONFIG__ = { apiUrl: window.location.origin };';
|
||||
}
|
||||
|
||||
location = /index.html {
|
||||
add_header Cache-Control "no-cache, no-store, must-revalidate";
|
||||
}
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
nginx_enable_site "taskview"
|
||||
msg_ok "Configured Nginx"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/taskview.service
|
||||
[Unit]
|
||||
Description=TaskView API
|
||||
After=network.target postgresql.service
|
||||
Requires=postgresql.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/taskview_data
|
||||
EnvironmentFile=/opt/taskview_data/.env
|
||||
ExecStart=/usr/bin/node /opt/taskview/api/dist/taskview-server.js
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now taskview
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -17,6 +17,7 @@ msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
build-essential \
|
||||
libkitinerary-bin
|
||||
ln -sf "$(find /usr/lib -name kitinerary-extractor -type f | head -1)" /usr/local/bin/kitinerary-extractor
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
@@ -24,7 +25,7 @@ fetch_and_deploy_gh_release "trek" "liketrek/TREK" "tarball"
|
||||
|
||||
msg_info "Setup TREK"
|
||||
cd /opt/trek
|
||||
$STD npm ci
|
||||
$STD npm ci --ignore-scripts
|
||||
$STD npm run build --workspace=shared
|
||||
$STD npm run build --workspace=client
|
||||
$STD npm run build --workspace=server
|
||||
@@ -43,13 +44,16 @@ mkdir -p \
|
||||
/opt/trek/uploads/files \
|
||||
/opt/trek/uploads/covers \
|
||||
/opt/trek/uploads/avatars \
|
||||
/opt/trek/uploads/photos
|
||||
/opt/trek/uploads/photos \
|
||||
/opt/trek/uploads/journey \
|
||||
/opt/trek/uploads/places
|
||||
rm -rf /opt/trek/server/data
|
||||
rm -rf /opt/trek/server/uploads
|
||||
ln -s /opt/trek/data /opt/trek/server/data
|
||||
ln -s /opt/trek/uploads /opt/trek/server/uploads
|
||||
rm -rf /opt/trek/node_modules
|
||||
cd /opt/trek
|
||||
$STD npm prune --omit=dev
|
||||
$STD npm ci --workspace=server --omit=dev --ignore-scripts
|
||||
msg_ok "Set up TREK Workspace"
|
||||
|
||||
msg_info "Configuring TREK"
|
||||
|
||||
@@ -17,7 +17,6 @@ msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
build-essential \
|
||||
git \
|
||||
nginx \
|
||||
redis-server \
|
||||
atomicparsley \
|
||||
python3-dev \
|
||||
@@ -107,7 +106,7 @@ cat <<EOF >/opt/tubearchivist/.env
|
||||
TA_HOST=http://${LOCAL_IP}:8000
|
||||
TA_USERNAME=admin
|
||||
TA_PASSWORD=${TA_PASSWORD}
|
||||
TA_BACKEND_PORT=8080
|
||||
TA_PORT=8000
|
||||
TA_APP_DIR=/opt/tubearchivist/backend
|
||||
TA_CACHE_DIR=/cache
|
||||
TA_MEDIA_DIR=/youtube
|
||||
@@ -133,92 +132,6 @@ msg_info "Installing yt-dlp Nightly"
|
||||
$STD uv pip install --python /opt/tubearchivist/.venv/bin/python -U --prerelease allow "yt-dlp[default]"
|
||||
msg_ok "Installed yt-dlp Nightly"
|
||||
|
||||
msg_info "Configuring Nginx"
|
||||
sed -i 's/^user www-data;$/user root;/' /etc/nginx/nginx.conf
|
||||
cat <<'EOF' >/etc/nginx/sites-available/default
|
||||
server {
|
||||
listen 8000;
|
||||
|
||||
location = /_auth {
|
||||
internal;
|
||||
proxy_pass http://localhost:8080/api/ping/;
|
||||
proxy_pass_request_body off;
|
||||
proxy_set_header Content-Length "";
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header Cookie $http_cookie;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
location /cache/videos/ {
|
||||
auth_request /_auth;
|
||||
alias /cache/videos/;
|
||||
}
|
||||
|
||||
location /cache/channels/ {
|
||||
auth_request /_auth;
|
||||
alias /cache/channels/;
|
||||
}
|
||||
|
||||
location /cache/playlists/ {
|
||||
auth_request /_auth;
|
||||
alias /cache/playlists/;
|
||||
}
|
||||
|
||||
location /media/ {
|
||||
auth_request /_auth;
|
||||
alias /youtube/;
|
||||
types {
|
||||
text/vtt vtt;
|
||||
}
|
||||
}
|
||||
|
||||
location /youtube/ {
|
||||
auth_request /_auth;
|
||||
alias /youtube/;
|
||||
types {
|
||||
video/mp4 mp4;
|
||||
}
|
||||
}
|
||||
|
||||
location /api {
|
||||
include proxy_params;
|
||||
proxy_pass http://localhost:8080;
|
||||
}
|
||||
|
||||
location /admin {
|
||||
include proxy_params;
|
||||
proxy_pass http://localhost:8080;
|
||||
}
|
||||
|
||||
location /static/ {
|
||||
alias /opt/tubearchivist/backend/staticfiles/;
|
||||
}
|
||||
|
||||
root /opt/tubearchivist/backend/static;
|
||||
index index.html;
|
||||
|
||||
location ~* ^/(?!static/|cache/).*\.(?:css|js|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
|
||||
try_files $uri $uri/ /index.html =404;
|
||||
}
|
||||
|
||||
location = /index.html {
|
||||
add_header Cache-Control "no-store, no-cache, must-revalidate";
|
||||
add_header Pragma "no-cache";
|
||||
expires 0;
|
||||
}
|
||||
|
||||
location / {
|
||||
add_header Cache-Control "no-store, no-cache, must-revalidate";
|
||||
add_header Pragma "no-cache";
|
||||
expires 0;
|
||||
try_files $uri $uri/ /index.html =404;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
systemctl enable -q nginx
|
||||
systemctl restart nginx
|
||||
msg_ok "Configured Nginx"
|
||||
|
||||
msg_info "Creating Services"
|
||||
cat <<'RUNEOF' >/opt/tubearchivist/backend/run.sh
|
||||
#!/bin/bash
|
||||
@@ -237,6 +150,7 @@ for i in $(seq 1 30); do
|
||||
sleep 2
|
||||
done
|
||||
|
||||
$PYTHON manage.py ta_stop_on_error
|
||||
$PYTHON manage.py migrate
|
||||
$PYTHON manage.py collectstatic --noinput -c
|
||||
$PYTHON manage.py ta_envcheck
|
||||
|
||||
@@ -314,21 +314,54 @@ EOF
|
||||
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" \
|
||||
"Supporting the software's development team is essential.\nPlease consider buying a subscription." 10 58
|
||||
msg_info "Disabling subscription nag"
|
||||
cat >/etc/apt/apt.conf.d/no-nag-script <<'EOF'
|
||||
DPkg::Post-Invoke { "if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; then sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; fi"; };
|
||||
EOF
|
||||
mkdir -p /usr/local/bin
|
||||
cat >/usr/local/bin/pmg-remove-nag.sh <<'EOF'
|
||||
#!/bin/sh
|
||||
WEB_JS=/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
|
||||
if [ -s "$WEB_JS" ] && ! grep -q NoMoreNagging "$WEB_JS"; then
|
||||
sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' "$WEB_JS"
|
||||
fi
|
||||
|
||||
cat >/etc/apt/apt.conf.d/no-nag-script-pmgmanagerlib-mobile <<'EOF'
|
||||
DPkg::Post-Invoke { "if [ -s /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; then sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; fi"; };
|
||||
MOBILE_JS=/usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js
|
||||
if [ -s "$MOBILE_JS" ] && ! grep -q NoMoreNagging "$MOBILE_JS"; then
|
||||
sed -i '/data\.status/{s/\!//;s/active/NoMoreNagging/}' "$MOBILE_JS"
|
||||
fi
|
||||
|
||||
MOBILE_TPL=/usr/share/pmg-mobile-quarantine-ui/pmg-mobile-index.html.tt
|
||||
if [ -s "$MOBILE_TPL" ] && ! grep -q NoMoreNagging "$MOBILE_TPL"; then
|
||||
sed -i '/<head>/r /dev/stdin' "$MOBILE_TPL" <<'HTML'
|
||||
<script>
|
||||
// NoMoreNagging
|
||||
const nativeFetch = window.fetch.bind(window);
|
||||
window.fetch = async (...args) => {
|
||||
const res = await nativeFetch(...args);
|
||||
if (!String(args[0]?.url ?? args[0]).includes('/nodes/localhost/subscription')) return res;
|
||||
const body = await res.clone().json().catch(() => null);
|
||||
if (!body?.data) return res;
|
||||
body.data.status = 'active';
|
||||
return new Response(JSON.stringify(body), { status: res.status, headers: res.headers });
|
||||
};
|
||||
</script>
|
||||
HTML
|
||||
fi
|
||||
EOF
|
||||
chmod 755 /usr/local/bin/pmg-remove-nag.sh
|
||||
|
||||
cat >/etc/apt/apt.conf.d/no-nag-script <<'EOF'
|
||||
DPkg::Post-Invoke { "/usr/local/bin/pmg-remove-nag.sh"; };
|
||||
EOF
|
||||
rm -f /etc/apt/apt.conf.d/no-nag-script-pmgmanagerlib-mobile
|
||||
msg_ok "Disabled subscription nag (clear browser cache!)"
|
||||
;;
|
||||
no)
|
||||
msg_error "Selected no to Disabling subscription nag"
|
||||
rm -f /etc/apt/apt.conf.d/no-nag-script 2>/dev/null
|
||||
rm -f /etc/apt/apt.conf.d/no-nag-script /etc/apt/apt.conf.d/no-nag-script-pmgmanagerlib-mobile /usr/local/bin/pmg-remove-nag.sh
|
||||
;;
|
||||
esac
|
||||
apt --reinstall install proxmox-widget-toolkit pmg-gui &>/dev/null || msg_error "Widget toolkit reinstall failed"
|
||||
if dpkg -s pmg-mobile-quarantine-ui &>/dev/null; then
|
||||
apt --reinstall install pmg-mobile-quarantine-ui &>/dev/null || msg_error "Mobile quarantine UI reinstall failed"
|
||||
fi
|
||||
|
||||
# ---- UPDATE ----
|
||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu \
|
||||
|
||||
Reference in New Issue
Block a user