Merge branch 'LocalAGI' of https://github.com/BillyOutlast/ProxmoxVED into LocalAGI
This commit is contained in:
113
ct/booklore.sh
113
ct/booklore.sh
@@ -1,113 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/booklore-app/BookLore
|
|
||||||
|
|
||||||
APP="BookLore"
|
|
||||||
var_tags="${var_tags:-books;library}"
|
|
||||||
var_cpu="${var_cpu:-3}"
|
|
||||||
var_ram="${var_ram:-3072}"
|
|
||||||
var_disk="${var_disk:-7}"
|
|
||||||
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/booklore ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "booklore" "booklore-app/BookLore"; then
|
|
||||||
JAVA_VERSION="25" setup_java
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
|
||||||
setup_mariadb
|
|
||||||
setup_yq
|
|
||||||
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop booklore
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
if grep -qE "^BOOKLORE_(DATA_PATH|BOOKDROP_PATH|BOOKS_PATH|PORT)=" /opt/booklore_storage/.env 2>/dev/null; then
|
|
||||||
msg_info "Migrating old environment variables"
|
|
||||||
sed -i 's/^BOOKLORE_DATA_PATH=/APP_PATH_CONFIG=/g' /opt/booklore_storage/.env
|
|
||||||
sed -i 's/^BOOKLORE_BOOKDROP_PATH=/APP_BOOKDROP_FOLDER=/g' /opt/booklore_storage/.env
|
|
||||||
sed -i '/^BOOKLORE_BOOKS_PATH=/d' /opt/booklore_storage/.env
|
|
||||||
sed -i '/^BOOKLORE_PORT=/d' /opt/booklore_storage/.env
|
|
||||||
msg_ok "Migrated old environment variables"
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Backing up old installation"
|
|
||||||
mv /opt/booklore /opt/booklore_bak
|
|
||||||
msg_ok "Backed up old installation"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "booklore" "booklore-app/BookLore" "tarball"
|
|
||||||
|
|
||||||
msg_info "Building Frontend"
|
|
||||||
cd /opt/booklore/booklore-ui
|
|
||||||
$STD npm install --force
|
|
||||||
$STD npm run build --configuration=production
|
|
||||||
msg_ok "Built Frontend"
|
|
||||||
|
|
||||||
msg_info "Embedding Frontend into Backend"
|
|
||||||
mkdir -p /opt/booklore/booklore-api/src/main/resources/static
|
|
||||||
cp -r /opt/booklore/booklore-ui/dist/booklore/browser/* /opt/booklore/booklore-api/src/main/resources/static/
|
|
||||||
msg_ok "Embedded Frontend into Backend"
|
|
||||||
|
|
||||||
msg_info "Building Backend"
|
|
||||||
cd /opt/booklore/booklore-api
|
|
||||||
APP_VERSION=$(get_latest_github_release "booklore-app/BookLore")
|
|
||||||
yq eval ".app.version = \"${APP_VERSION}\"" -i src/main/resources/application.yaml
|
|
||||||
$STD ./gradlew clean build -x test --no-daemon
|
|
||||||
mkdir -p /opt/booklore/dist
|
|
||||||
JAR_PATH=$(find /opt/booklore/booklore-api/build/libs -maxdepth 1 -type f -name "booklore-api-*.jar" ! -name "*plain*" | head -n1)
|
|
||||||
if [[ -z "$JAR_PATH" ]]; then
|
|
||||||
msg_error "Backend JAR not found"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
cp "$JAR_PATH" /opt/booklore/dist/app.jar
|
|
||||||
msg_ok "Built Backend"
|
|
||||||
|
|
||||||
if systemctl is-active --quiet nginx 2>/dev/null; then
|
|
||||||
msg_info "Removing Nginx (no longer needed)"
|
|
||||||
systemctl disable --now nginx
|
|
||||||
$STD apt-get purge -y nginx nginx-common
|
|
||||||
msg_ok "Removed Nginx"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! grep -q "^SERVER_PORT=" /opt/booklore_storage/.env 2>/dev/null; then
|
|
||||||
echo "SERVER_PORT=6060" >>/opt/booklore_storage/.env
|
|
||||||
fi
|
|
||||||
|
|
||||||
sed -i 's|ExecStart=/usr/bin/java -jar|ExecStart=/usr/bin/java -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+UseCompactObjectHeaders -jar|' /etc/systemd/system/booklore.service
|
|
||||||
systemctl daemon-reload
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start booklore
|
|
||||||
rm -rf /opt/booklore_bak
|
|
||||||
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}:6060${CL}"
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: mitchscobell
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://ddclient.net/
|
|
||||||
|
|
||||||
APP="ddclient"
|
|
||||||
var_tags="${var_tags:-network}"
|
|
||||||
var_cpu="${var_cpu:-1}"
|
|
||||||
var_ram="${var_ram:-512}"
|
|
||||||
var_disk="${var_disk:-2}"
|
|
||||||
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 [[ ! -f /etc/ddclient.conf ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Updating ddclient"
|
|
||||||
$STD apt update
|
|
||||||
$STD apt install --only-upgrade -y ddclient
|
|
||||||
$STD systemctl restart ddclient
|
|
||||||
msg_ok "Updated ddclient"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed successfully!\n"
|
|
||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Authors: MickLesk (CanbiZ) | Co-Author: remz1337
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://frigate.video/
|
|
||||||
|
|
||||||
APP="Frigate"
|
|
||||||
var_tags="${var_tags:-nvr}"
|
|
||||||
var_cpu="${var_cpu:-4}"
|
|
||||||
var_ram="${var_ram:-4096}"
|
|
||||||
var_disk="${var_disk:-20}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-12}"
|
|
||||||
var_unprivileged="${var_unprivileged:-0}"
|
|
||||||
var_gpu="${var_gpu:-yes}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
if [[ ! -f /etc/systemd/system/frigate.service ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
msg_error "To update Frigate, create a new container and transfer your configuration."
|
|
||||||
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}:5000${CL}"
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
_ __ __ ____ _ __
|
|
||||||
/ | / /__ / /_/ __ )(_)________/ /
|
|
||||||
/ |/ / _ \/ __/ __ / / ___/ __ /
|
|
||||||
/ /| / __/ /_/ /_/ / / / / /_/ /
|
|
||||||
/_/ |_/\___/\__/_____/_/_/ \__,_/
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
____
|
|
||||||
/ __ \____ _____ _________ _
|
|
||||||
/ /_/ / __ `/ __ \/ ___/ __ `/
|
|
||||||
/ ____/ /_/ / /_/ / / / /_/ /
|
|
||||||
/_/ \__,_/ .___/_/ \__,_/
|
|
||||||
/_/
|
|
||||||
408
ct/immich.sh
408
ct/immich.sh
@@ -1,408 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: vhsdream
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://immich.app
|
|
||||||
|
|
||||||
APP="immich"
|
|
||||||
var_tags="${var_tags:-photos}"
|
|
||||||
var_disk="${var_disk:-20}"
|
|
||||||
var_cpu="${var_cpu:-4}"
|
|
||||||
var_ram="${var_ram:-6144}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
var_gpu="${var_gpu:-yes}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
if [[ ! -d /opt/immich ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
if [[ -f /etc/apt/sources.list.d/immich.list ]]; then
|
|
||||||
msg_error "Wrong Debian version detected!"
|
|
||||||
msg_error "You must upgrade your LXC to Debian Trixie before updating."
|
|
||||||
msg_error "Please visit https://github.com/community-scripts/ProxmoxVE/discussions/7726 for details."
|
|
||||||
echo "${TAB3} If you have upgraded your LXC to Trixie and you still see this message, please open an Issue in the Community-Scripts repo."
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
setup_uv
|
|
||||||
PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')"
|
|
||||||
NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs
|
|
||||||
|
|
||||||
if [[ ! -f /etc/apt/preferences.d/preferences ]]; then
|
|
||||||
msg_info "Adding Debian Testing repo"
|
|
||||||
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
|
||||||
cat <<EOF >/etc/apt/preferences.d/preferences
|
|
||||||
Package: *
|
|
||||||
Pin: release a=unstable
|
|
||||||
Pin-Priority: 450
|
|
||||||
|
|
||||||
Package: *
|
|
||||||
Pin:release a=testing
|
|
||||||
Pin-Priority: 450
|
|
||||||
EOF
|
|
||||||
if [[ -f /etc/apt/preferences.d/immich ]]; then
|
|
||||||
rm /etc/apt/preferences.d/immich
|
|
||||||
fi
|
|
||||||
$STD apt update
|
|
||||||
msg_ok "Added Debian Testing repo"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! dpkg -l "libmimalloc3" | grep -q '3.1' || ! dpkg -l "libde265-dev" | grep -q '1.0.16'; then
|
|
||||||
msg_info "Installing/upgrading Testing repo packages"
|
|
||||||
$STD apt install -t testing libmimalloc3 libde265-dev -y
|
|
||||||
msg_ok "Installed/upgraded Testing repo packages"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ! -f /etc/apt/sources.list.d/mise.list ]]; then
|
|
||||||
msg_info "Installing Mise"
|
|
||||||
curl -fSs https://mise.jdx.dev/gpg-key.pub | tee /etc/apt/keyrings/mise-archive-keyring.pub 1>/dev/null
|
|
||||||
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" >/etc/apt/sources.list.d/mise.list
|
|
||||||
$STD apt update
|
|
||||||
$STD apt install -y mise
|
|
||||||
msg_ok "Installed Mise"
|
|
||||||
fi
|
|
||||||
|
|
||||||
STAGING_DIR=/opt/staging
|
|
||||||
BASE_DIR=${STAGING_DIR}/base-images
|
|
||||||
SOURCE_DIR=${STAGING_DIR}/image-source
|
|
||||||
cd /tmp
|
|
||||||
if [[ -f ~/.intel_version ]]; then
|
|
||||||
curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile
|
|
||||||
readarray -t INTEL_URLS < <(
|
|
||||||
sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{print $2}'
|
|
||||||
sed -n "/libigdgmm12/p" ./Dockerfile | awk '{print $3}'
|
|
||||||
)
|
|
||||||
INTEL_RELEASE="$(grep "intel-opencl-icd_" ./Dockerfile | awk -F '_' '{print $2}')"
|
|
||||||
if [[ "$INTEL_RELEASE" != "$(cat ~/.intel_version)" ]]; then
|
|
||||||
msg_info "Updating Intel iGPU dependencies"
|
|
||||||
for url in "${INTEL_URLS[@]}"; do
|
|
||||||
curl -fsSLO "$url"
|
|
||||||
done
|
|
||||||
$STD apt-mark unhold libigdgmm12
|
|
||||||
$STD apt install -y ./libigdgmm12*.deb
|
|
||||||
rm ./libigdgmm12*.deb
|
|
||||||
$STD apt install -y ./*.deb
|
|
||||||
rm ./*.deb
|
|
||||||
$STD apt-mark hold libigdgmm12
|
|
||||||
dpkg-query -W -f='${Version}\n' intel-opencl-icd >~/.intel_version
|
|
||||||
msg_ok "Intel iGPU dependencies updated"
|
|
||||||
fi
|
|
||||||
rm ./Dockerfile
|
|
||||||
fi
|
|
||||||
if [[ -f ~/.immich_library_revisions ]]; then
|
|
||||||
libraries=("libjxl" "libheif" "libraw" "imagemagick" "libvips")
|
|
||||||
cd "$BASE_DIR"
|
|
||||||
msg_info "Checking for updates to custom image-processing libraries"
|
|
||||||
$STD git pull
|
|
||||||
for library in "${libraries[@]}"; do
|
|
||||||
compile_"$library"
|
|
||||||
done
|
|
||||||
msg_ok "Image-processing libraries up to date"
|
|
||||||
fi
|
|
||||||
|
|
||||||
RELEASE="v2.5.2"
|
|
||||||
if check_for_gh_tag "immich" "immich-app/immich" "${RELEASE}"; then
|
|
||||||
msg_info "Stopping Services"
|
|
||||||
systemctl stop immich-web
|
|
||||||
systemctl stop immich-ml
|
|
||||||
msg_ok "Stopped Services"
|
|
||||||
VCHORD_RELEASE="0.5.3"
|
|
||||||
if [[ ! -f ~/.vchord_version ]] || [[ "$VCHORD_RELEASE" != "$(cat ~/.vchord_version)" ]]; then
|
|
||||||
msg_info "Upgrading VectorChord"
|
|
||||||
curl -fsSL "https://github.com/tensorchord/vectorchord/releases/download/${VCHORD_RELEASE}/postgresql-16-vchord_${VCHORD_RELEASE}-1_amd64.deb" -o vchord.deb
|
|
||||||
$STD apt install -y ./vchord.deb
|
|
||||||
systemctl restart postgresql
|
|
||||||
$STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vector UPDATE;"
|
|
||||||
$STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vchord UPDATE;"
|
|
||||||
$STD sudo -u postgres psql -d immich -c "REINDEX INDEX face_index;"
|
|
||||||
$STD sudo -u postgres psql -d immich -c "REINDEX INDEX clip_index;"
|
|
||||||
echo "$VCHORD_RELEASE" >~/.vchord_version
|
|
||||||
rm ./vchord.deb
|
|
||||||
msg_ok "Upgraded VectorChord to v${VCHORD_RELEASE}"
|
|
||||||
fi
|
|
||||||
if ! dpkg -l | grep -q ccache; then
|
|
||||||
$STD apt install -yqq ccache
|
|
||||||
fi
|
|
||||||
|
|
||||||
INSTALL_DIR="/opt/${APP}"
|
|
||||||
UPLOAD_DIR="$(sed -n '/^IMMICH_MEDIA_LOCATION/s/[^=]*=//p' /opt/immich/.env)"
|
|
||||||
SRC_DIR="${INSTALL_DIR}/source"
|
|
||||||
APP_DIR="${INSTALL_DIR}/app"
|
|
||||||
PLUGIN_DIR="${APP_DIR}/corePlugin"
|
|
||||||
ML_DIR="${APP_DIR}/machine-learning"
|
|
||||||
GEO_DIR="${INSTALL_DIR}/geodata"
|
|
||||||
|
|
||||||
cp "$ML_DIR"/ml_start.sh "$INSTALL_DIR"
|
|
||||||
if grep -qs "set -a" "$APP_DIR"/bin/start.sh; then
|
|
||||||
cp "$APP_DIR"/bin/start.sh "$INSTALL_DIR"
|
|
||||||
else
|
|
||||||
cat <<EOF >"$INSTALL_DIR"/start.sh
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -a
|
|
||||||
. ${INSTALL_DIR}/.env
|
|
||||||
set +a
|
|
||||||
|
|
||||||
/usr/bin/node ${APP_DIR}/dist/main.js "\$@"
|
|
||||||
EOF
|
|
||||||
chmod +x "$INSTALL_DIR"/start.sh
|
|
||||||
fi
|
|
||||||
|
|
||||||
(
|
|
||||||
shopt -s dotglob
|
|
||||||
rm -rf "${APP_DIR:?}"/*
|
|
||||||
)
|
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "immich" "immich-app/immich" "tag" "${RELEASE}" "$SRC_DIR"
|
|
||||||
|
|
||||||
msg_info "Updating Immich web and microservices"
|
|
||||||
cd "$SRC_DIR"/server
|
|
||||||
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
|
||||||
export CI=1
|
|
||||||
corepack enable
|
|
||||||
|
|
||||||
# server build
|
|
||||||
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
|
|
||||||
$STD pnpm --filter immich --frozen-lockfile build
|
|
||||||
unset SHARP_IGNORE_GLOBAL_LIBVIPS
|
|
||||||
export SHARP_FORCE_GLOBAL_LIBVIPS=true
|
|
||||||
$STD pnpm --filter immich --frozen-lockfile --prod --no-optional deploy "$APP_DIR"
|
|
||||||
cp "$APP_DIR"/package.json "$APP_DIR"/bin
|
|
||||||
sed -i 's|^start|./start|' "$APP_DIR"/bin/immich-admin
|
|
||||||
|
|
||||||
# openapi & web build
|
|
||||||
cd "$SRC_DIR"
|
|
||||||
echo "packageImportMethod: hardlink" >>./pnpm-workspace.yaml
|
|
||||||
$STD pnpm --filter @immich/sdk --filter immich-web --frozen-lockfile --force install
|
|
||||||
unset SHARP_FORCE_GLOBAL_LIBVIPS
|
|
||||||
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
|
|
||||||
$STD pnpm --filter @immich/sdk --filter immich-web build
|
|
||||||
cp -a web/build "$APP_DIR"/www
|
|
||||||
cp LICENSE "$APP_DIR"
|
|
||||||
|
|
||||||
# cli build
|
|
||||||
$STD pnpm --filter @immich/sdk --filter @immich/cli --frozen-lockfile install
|
|
||||||
$STD pnpm --filter @immich/sdk --filter @immich/cli build
|
|
||||||
$STD pnpm --filter @immich/cli --prod --no-optional deploy "$APP_DIR"/cli
|
|
||||||
cd "$APP_DIR"
|
|
||||||
mv "$INSTALL_DIR"/start.sh "$APP_DIR"/bin
|
|
||||||
|
|
||||||
# plugins
|
|
||||||
cd "$SRC_DIR"
|
|
||||||
$STD mise trust --ignore ./mise.toml
|
|
||||||
$STD mise trust ./plugins/mise.toml
|
|
||||||
cd plugins
|
|
||||||
$STD mise install
|
|
||||||
$STD mise run build
|
|
||||||
mkdir -p "$PLUGIN_DIR"
|
|
||||||
cp -r ./dist "$PLUGIN_DIR"/dist
|
|
||||||
cp ./manifest.json "$PLUGIN_DIR"
|
|
||||||
msg_ok "Updated Immich server, web, cli and plugins"
|
|
||||||
|
|
||||||
cd "$SRC_DIR"/machine-learning
|
|
||||||
mkdir -p "$ML_DIR" && chown -R immich:immich "$ML_DIR"
|
|
||||||
chown immich:immich ./uv.lock
|
|
||||||
export VIRTUAL_ENV="${ML_DIR}"/ml-venv
|
|
||||||
if [[ -f ~/.openvino ]]; then
|
|
||||||
msg_info "Updating HW-accelerated machine-learning"
|
|
||||||
# Remove old venv if Python version changed (3.12 -> 3.13)
|
|
||||||
if [[ -d "${VIRTUAL_ENV}" ]] && ! "${VIRTUAL_ENV}/bin/python3" --version 2>/dev/null | grep -q "3.13"; then
|
|
||||||
rm -rf "${VIRTUAL_ENV}"
|
|
||||||
fi
|
|
||||||
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra openvino --no-dev --active --link-mode copy -n -p python3.13 --managed-python
|
|
||||||
patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.13/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-313-x86_64-linux-gnu.so"
|
|
||||||
# Add workaround for onnxruntime-openvino 1.23.x crash if not present
|
|
||||||
if ! grep -q "MACHINE_LEARNING_OPENVINO_NUM_THREADS" "$INSTALL_DIR/.env" 2>/dev/null; then
|
|
||||||
sed -i '/MACHINE_LEARNING_CACHE_FOLDER/a ## - For OpenVINO only - workaround for onnxruntime-openvino 1.23.x crash\n## - See: https://github.com/immich-app/immich/pull/11240\nMACHINE_LEARNING_OPENVINO_NUM_THREADS=$(nproc)' "$INSTALL_DIR/.env"
|
|
||||||
fi
|
|
||||||
msg_ok "Updated HW-accelerated machine-learning"
|
|
||||||
else
|
|
||||||
msg_info "Updating machine-learning"
|
|
||||||
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra cpu --no-dev --active --link-mode copy -n -p python3.11 --managed-python
|
|
||||||
msg_ok "Updated machine-learning"
|
|
||||||
fi
|
|
||||||
cd "$SRC_DIR"
|
|
||||||
cp -a machine-learning/{ann,immich_ml} "$ML_DIR"
|
|
||||||
mv "$INSTALL_DIR"/ml_start.sh "$ML_DIR"
|
|
||||||
if [[ -f ~/.openvino ]]; then
|
|
||||||
sed -i "/intra_op/s/int = 0/int = os.cpu_count() or 0/" "$ML_DIR"/immich_ml/config.py
|
|
||||||
fi
|
|
||||||
ln -sf "$APP_DIR"/resources "$INSTALL_DIR"
|
|
||||||
cd "$APP_DIR"
|
|
||||||
grep -rl /usr/src | xargs -n1 sed -i "s|\/usr/src|$INSTALL_DIR|g"
|
|
||||||
grep -rlE "'/build'" | xargs -n1 sed -i "s|'/build'|'$APP_DIR'|g"
|
|
||||||
sed -i "s@\"/cache\"@\"$INSTALL_DIR/cache\"@g" "$ML_DIR"/immich_ml/config.py
|
|
||||||
ln -s "${UPLOAD_DIR:-/opt/immich/upload}" "$APP_DIR"/upload
|
|
||||||
ln -s "${UPLOAD_DIR:-/opt/immich/upload}" "$ML_DIR"/upload
|
|
||||||
ln -s "$GEO_DIR" "$APP_DIR"
|
|
||||||
|
|
||||||
chown -R immich:immich "$INSTALL_DIR"
|
|
||||||
systemctl restart immich-ml immich-web
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
function compile_libjxl() {
|
|
||||||
SOURCE=${SOURCE_DIR}/libjxl
|
|
||||||
JPEGLI_LIBJPEG_LIBRARY_SOVERSION="62"
|
|
||||||
JPEGLI_LIBJPEG_LIBRARY_VERSION="62.3.0"
|
|
||||||
: "${LIBJXL_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libjxl.json)}"
|
|
||||||
if [[ "$LIBJXL_REVISION" != "$(grep 'libjxl' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
|
||||||
msg_info "Recompiling libjxl"
|
|
||||||
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
|
||||||
$STD git clone https://github.com/libjxl/libjxl.git "$SOURCE"
|
|
||||||
cd "$SOURCE"
|
|
||||||
$STD git reset --hard "$LIBJXL_REVISION"
|
|
||||||
$STD git submodule update --init --recursive --depth 1 --recommend-shallow
|
|
||||||
$STD git apply "$BASE_DIR"/server/sources/libjxl-patches/jpegli-empty-dht-marker.patch
|
|
||||||
$STD git apply "$BASE_DIR"/server/sources/libjxl-patches/jpegli-icc-warning.patch
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
$STD cmake \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DBUILD_TESTING=OFF \
|
|
||||||
-DJPEGXL_ENABLE_DOXYGEN=OFF \
|
|
||||||
-DJPEGXL_ENABLE_MANPAGES=OFF \
|
|
||||||
-DJPEGXL_ENABLE_PLUGIN_GIMP210=OFF \
|
|
||||||
-DJPEGXL_ENABLE_BENCHMARK=OFF \
|
|
||||||
-DJPEGXL_ENABLE_EXAMPLES=OFF \
|
|
||||||
-DJPEGXL_FORCE_SYSTEM_BROTLI=ON \
|
|
||||||
-DJPEGXL_FORCE_SYSTEM_HWY=ON \
|
|
||||||
-DJPEGXL_ENABLE_JPEGLI=ON \
|
|
||||||
-DJPEGXL_ENABLE_JPEGLI_LIBJPEG=ON \
|
|
||||||
-DJPEGXL_INSTALL_JPEGLI_LIBJPEG=ON \
|
|
||||||
-DJPEGXL_ENABLE_PLUGINS=ON \
|
|
||||||
-DJPEGLI_LIBJPEG_LIBRARY_SOVERSION="$JPEGLI_LIBJPEG_LIBRARY_SOVERSION" \
|
|
||||||
-DJPEGLI_LIBJPEG_LIBRARY_VERSION="$JPEGLI_LIBJPEG_LIBRARY_VERSION" \
|
|
||||||
-DLIBJPEG_TURBO_VERSION_NUMBER=2001005 \
|
|
||||||
..
|
|
||||||
$STD cmake --build . -- -j"$(nproc)"
|
|
||||||
$STD cmake --install .
|
|
||||||
ldconfig /usr/local/lib
|
|
||||||
$STD make clean
|
|
||||||
cd "$STAGING_DIR"
|
|
||||||
rm -rf "$SOURCE"/{build,third_party}
|
|
||||||
sed -i "s/libjxl: .*$/libjxl: $LIBJXL_REVISION/" ~/.immich_library_revisions
|
|
||||||
msg_ok "Recompiled libjxl"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function compile_libheif() {
|
|
||||||
SOURCE=${SOURCE_DIR}/libheif
|
|
||||||
if ! dpkg -l | grep -q libaom; then
|
|
||||||
$STD apt install -y libaom-dev
|
|
||||||
local update="required"
|
|
||||||
fi
|
|
||||||
: "${LIBHEIF_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libheif.json)}"
|
|
||||||
if [[ "${update:-}" ]] || [[ "$LIBHEIF_REVISION" != "$(grep 'libheif' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
|
||||||
msg_info "Recompiling libheif"
|
|
||||||
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
|
||||||
$STD git clone https://github.com/strukturag/libheif.git "$SOURCE"
|
|
||||||
cd "$SOURCE"
|
|
||||||
$STD git reset --hard "$LIBHEIF_REVISION"
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
$STD cmake --preset=release-noplugins \
|
|
||||||
-DWITH_DAV1D=ON \
|
|
||||||
-DENABLE_PARALLEL_TILE_DECODING=ON \
|
|
||||||
-DWITH_LIBSHARPYUV=ON \
|
|
||||||
-DWITH_LIBDE265=ON \
|
|
||||||
-DWITH_AOM_DECODER=OFF \
|
|
||||||
-DWITH_AOM_ENCODER=ON \
|
|
||||||
-DWITH_X265=OFF \
|
|
||||||
-DWITH_EXAMPLES=OFF \
|
|
||||||
..
|
|
||||||
$STD make install -j "$(nproc)"
|
|
||||||
ldconfig /usr/local/lib
|
|
||||||
$STD make clean
|
|
||||||
cd "$STAGING_DIR"
|
|
||||||
rm -rf "$SOURCE"/build
|
|
||||||
sed -i "s/libheif: .*$/libheif: $LIBHEIF_REVISION/" ~/.immich_library_revisions
|
|
||||||
msg_ok "Recompiled libheif"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function compile_libraw() {
|
|
||||||
SOURCE=${SOURCE_DIR}/libraw
|
|
||||||
: "${LIBRAW_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libraw.json)}"
|
|
||||||
if [[ "$LIBRAW_REVISION" != "$(grep 'libraw' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
|
||||||
msg_info "Recompiling libraw"
|
|
||||||
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
|
||||||
$STD git clone https://github.com/libraw/libraw.git "$SOURCE"
|
|
||||||
cd "$SOURCE"
|
|
||||||
$STD git reset --hard "$LIBRAW_REVISION"
|
|
||||||
$STD autoreconf --install
|
|
||||||
$STD ./configure --disable-examples
|
|
||||||
$STD make -j"$(nproc)"
|
|
||||||
$STD make install
|
|
||||||
ldconfig /usr/local/lib
|
|
||||||
$STD make clean
|
|
||||||
cd "$STAGING_DIR"
|
|
||||||
sed -i "s/libraw: .*$/libraw: $LIBRAW_REVISION/" ~/.immich_library_revisions
|
|
||||||
msg_ok "Recompiled libraw"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function compile_imagemagick() {
|
|
||||||
SOURCE=$SOURCE_DIR/imagemagick
|
|
||||||
: "${IMAGEMAGICK_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/imagemagick.json)}"
|
|
||||||
if [[ "$IMAGEMAGICK_REVISION" != "$(grep 'imagemagick' ~/.immich_library_revisions | awk '{print $2}')" ]] ||
|
|
||||||
! grep -q 'DMAGICK_LIBRAW' /usr/local/lib/ImageMagick-7*/config-Q16HDRI/configure.xml; then
|
|
||||||
msg_info "Recompiling ImageMagick"
|
|
||||||
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
|
||||||
$STD git clone https://github.com/ImageMagick/ImageMagick.git "$SOURCE"
|
|
||||||
cd "$SOURCE"
|
|
||||||
$STD git reset --hard "$IMAGEMAGICK_REVISION"
|
|
||||||
$STD ./configure --with-modules CPPFLAGS="-DMAGICK_LIBRAW_VERSION_TAIL=202502"
|
|
||||||
$STD make -j"$(nproc)"
|
|
||||||
$STD make install
|
|
||||||
ldconfig /usr/local/lib
|
|
||||||
$STD make clean
|
|
||||||
cd "$STAGING_DIR"
|
|
||||||
sed -i "s/imagemagick: .*$/imagemagick: $IMAGEMAGICK_REVISION/" ~/.immich_library_revisions
|
|
||||||
msg_ok "Recompiled ImageMagick"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function compile_libvips() {
|
|
||||||
SOURCE=$SOURCE_DIR/libvips
|
|
||||||
: "${LIBVIPS_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libvips.json)}"
|
|
||||||
if [[ "$LIBVIPS_REVISION" != "$(grep 'libvips' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
|
||||||
msg_info "Recompiling libvips"
|
|
||||||
if [[ -d "$SOURCE" ]]; then rm -rf "$SOURCE"; fi
|
|
||||||
$STD git clone https://github.com/libvips/libvips.git "$SOURCE"
|
|
||||||
cd "$SOURCE"
|
|
||||||
$STD git reset --hard "$LIBVIPS_REVISION"
|
|
||||||
$STD meson setup build --buildtype=release --libdir=lib -Dintrospection=disabled -Dtiff=disabled
|
|
||||||
cd build
|
|
||||||
$STD ninja install
|
|
||||||
ldconfig /usr/local/lib
|
|
||||||
cd "$STAGING_DIR"
|
|
||||||
rm -rf "$SOURCE"/build
|
|
||||||
sed -i "s/libvips: .*$/libvips: $LIBVIPS_REVISION/" ~/.immich_library_revisions
|
|
||||||
msg_ok "Recompiled libvips"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
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}:2283${CL}"
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: TechHutTV
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://netbird.io/
|
|
||||||
|
|
||||||
APP="NetBird"
|
|
||||||
var_tags="${var_tags:-network;vpn}"
|
|
||||||
var_cpu="${var_cpu:-1}"
|
|
||||||
var_ram="${var_ram:-512}"
|
|
||||||
var_disk="${var_disk:-4}"
|
|
||||||
var_os="${var_os:-debian}"
|
|
||||||
var_version="${var_version:-13}"
|
|
||||||
var_unprivileged="${var_unprivileged:-1}"
|
|
||||||
var_tun="${var_tun:-yes}"
|
|
||||||
|
|
||||||
header_info "$APP"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
check_container_storage
|
|
||||||
check_container_resources
|
|
||||||
|
|
||||||
if [[ ! -f /etc/netbird/config.json ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Updating Netbird"
|
|
||||||
$STD apt update
|
|
||||||
$STD apt upgrade -y
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
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 NetBird by entering the container and running:${CL}"
|
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}netbird up${CL}"
|
|
||||||
63
ct/papra.sh
63
ct/papra.sh
@@ -1,63 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/papra-hq/papra
|
|
||||||
|
|
||||||
APP="Papra"
|
|
||||||
var_tags="${var_tags:-document-management}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-10}"
|
|
||||||
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/papra ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/papra-hq/papra/releases | grep -oP '"tag_name":\s*"\K@papra/app@[^"]+' | head -n1)
|
|
||||||
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt 2>/dev/null)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop papra
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
msg_info "Updating ${APP} to ${RELEASE}"
|
|
||||||
cd /opt/papra
|
|
||||||
fetch_and_deploy_gh_release "papra" "papra-hq/papra" "tarball" "${RELEASE}" "/opt/papra"
|
|
||||||
$STD pnpm install --frozen-lockfile
|
|
||||||
$STD pnpm --filter "@papra/app-client..." run build
|
|
||||||
$STD pnpm --filter "@papra/app-server..." run build
|
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
|
||||||
msg_ok "Updated ${APP} to ${RELEASE}"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start papra
|
|
||||||
msg_ok "Started Service"
|
|
||||||
msg_ok "Updated successfully!"
|
|
||||||
else
|
|
||||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
|
||||||
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}:1221${CL}"
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func)
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/seaweedfs/seaweedfs
|
|
||||||
|
|
||||||
APP="SeaweedFS"
|
|
||||||
var_tags="${var_tags:-storage;s3;filesystem}"
|
|
||||||
var_cpu="${var_cpu:-2}"
|
|
||||||
var_ram="${var_ram:-2048}"
|
|
||||||
var_disk="${var_disk:-16}"
|
|
||||||
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 [[ ! -f /opt/seaweedfs/weed ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_for_gh_release "seaweedfs" "seaweedfs/seaweedfs"; then
|
|
||||||
msg_info "Stopping Service"
|
|
||||||
systemctl stop seaweedfs
|
|
||||||
msg_ok "Stopped Service"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "seaweedfs" "seaweedfs/seaweedfs" "prebuild" "latest" "/opt/seaweedfs" "linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Starting Service"
|
|
||||||
systemctl start seaweedfs
|
|
||||||
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}:9333${CL}"
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "CronMaster",
|
|
||||||
"slug": "cronmaster",
|
|
||||||
"categories": [
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"date_created": "2026-02-17",
|
|
||||||
"type": "pve",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 3000,
|
|
||||||
"documentation": "https://github.com/fccview/cronmaster",
|
|
||||||
"website": "https://github.com/fccview/cronmaster",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/cr-nmaster.webp",
|
|
||||||
"config_path": "/opt/cronmaster/.env",
|
|
||||||
"description": "Self-hosted cron job scheduler with web UI, live logs, auth and prebuilt binaries provided upstream.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "tools/addon/cronmaster.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": null,
|
|
||||||
"ram": null,
|
|
||||||
"hdd": null,
|
|
||||||
"os": null,
|
|
||||||
"version": null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": []
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "ddclient",
|
|
||||||
"slug": "ddclient",
|
|
||||||
"categories": [
|
|
||||||
4
|
|
||||||
],
|
|
||||||
"date_created": "2026-01-31",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": null,
|
|
||||||
"documentation": "https://ddclient.net/",
|
|
||||||
"website": "https://ddclient.net/",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/ddclient.webp",
|
|
||||||
"config_path": "/etc/ddclient.conf",
|
|
||||||
"description": "ddclient is a Perl client used to update dynamic DNS entries for accounts on a wide range of dynamic DNS service providers. It supports multiple protocols and providers, allowing automatic IP address updates for your domain names.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/ddclient.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 1,
|
|
||||||
"ram": 512,
|
|
||||||
"hdd": 2,
|
|
||||||
"os": "debian",
|
|
||||||
"version": "13"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": [
|
|
||||||
{
|
|
||||||
"type": "info",
|
|
||||||
"text": "After installation, edit `/etc/ddclient.conf` with your dynamic DNS provider credentials"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "info",
|
|
||||||
"text": "Sample configuration is created for Namecheap but can be modified for other providers"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Frigate",
|
|
||||||
"slug": "frigate",
|
|
||||||
"categories": [
|
|
||||||
15
|
|
||||||
],
|
|
||||||
"date_created": "2025-07-02",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"config_path": "/config/config.yml",
|
|
||||||
"interface_port": 5000,
|
|
||||||
"documentation": "https://docs.frigate.video/",
|
|
||||||
"website": "https://frigate.video/",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/frigate-light.webp",
|
|
||||||
"description": "Frigate is an open-source NVR built around real-time AI object detection for IP cameras.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/frigate.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 4,
|
|
||||||
"ram": 4096,
|
|
||||||
"hdd": 20,
|
|
||||||
"os": "Debian",
|
|
||||||
"version": "12"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": []
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "NetBird",
|
|
||||||
"slug": "netbird",
|
|
||||||
"categories": [4],
|
|
||||||
"date_created": "2025-12-02",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": null,
|
|
||||||
"documentation": "https://docs.netbird.io/",
|
|
||||||
"website": "https://netbird.io/",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/netbird.webp",
|
|
||||||
"config_path": "/etc/netbird/config.json",
|
|
||||||
"description": "NetBird is an open source VPN management platform that creates secure peer-to-peer networks using WireGuard. It enables secure connectivity between devices anywhere in the world without complex firewall configurations or port forwarding. NetBird offers features like zero-configuration networking, SSO integration, access control policies, and a centralized management dashboard. It's designed to be simple to deploy and manage, making it ideal for connecting remote teams, securing IoT devices, or building secure infrastructure networks.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/netbird.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 1,
|
|
||||||
"ram": 512,
|
|
||||||
"hdd": 4,
|
|
||||||
"os": "debian",
|
|
||||||
"version": "13"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": [
|
|
||||||
{
|
|
||||||
"text": "The NetBird client (agent) allows a peer to join a pre-existing NetBird deployment. If a NetBird deployment is not yet available, there are both managed and self-hosted options available.",
|
|
||||||
"type": "info"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "After installation, enter the container and run `netbird` to view the commands.",
|
|
||||||
"type": "info"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Use a Setup Key from your NetBird dashboard or SSO login to authenticate during setup or in the container.",
|
|
||||||
"type": "info"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Check connection status with `netbird status`.",
|
|
||||||
"type": "info"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "Papra",
|
|
||||||
"slug": "papra",
|
|
||||||
"categories": [
|
|
||||||
12
|
|
||||||
],
|
|
||||||
"date_created": "2025-12-30",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 1221,
|
|
||||||
"documentation": "https://github.com/CorentinTh/papra",
|
|
||||||
"website": "https://github.com/CorentinTh/papra",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/papra.webp",
|
|
||||||
"config_path": "/opt/papra/.env",
|
|
||||||
"description": "Papra is a modern, self-hosted document management system with full-text search, OCR support, and automatic document processing. Built with Node.js and featuring a clean web interface for organizing and managing your documents.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/papra.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 2,
|
|
||||||
"ram": 2048,
|
|
||||||
"hdd": 10,
|
|
||||||
"os": "debian",
|
|
||||||
"version": "13"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": [
|
|
||||||
{
|
|
||||||
"text": "First visit will prompt you to create an account",
|
|
||||||
"type": "info"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Tesseract OCR is pre-installed for all languages",
|
|
||||||
"type": "info"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Documents are stored in /opt/papra/app-data/documents",
|
|
||||||
"type": "info"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Ingestion folder available at /opt/papra/ingestion for automatic document import",
|
|
||||||
"type": "info"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Email functionality runs in dry-run mode by default",
|
|
||||||
"type": "warning"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "SeaweedFS",
|
|
||||||
"slug": "seaweedfs",
|
|
||||||
"categories": [
|
|
||||||
11
|
|
||||||
],
|
|
||||||
"date_created": "2026-02-22",
|
|
||||||
"type": "ct",
|
|
||||||
"updateable": true,
|
|
||||||
"privileged": false,
|
|
||||||
"interface_port": 9333,
|
|
||||||
"documentation": "https://github.com/seaweedfs/seaweedfs/wiki",
|
|
||||||
"website": "https://seaweedfs.com/",
|
|
||||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/seaweedfs.webp",
|
|
||||||
"config_path": "",
|
|
||||||
"description": "SeaweedFS is a fast distributed storage system for blobs, objects, files, and data lakes, with O(1) disk seek, S3 API, FUSE mount, WebDAV, and cloud tiering support.",
|
|
||||||
"install_methods": [
|
|
||||||
{
|
|
||||||
"type": "default",
|
|
||||||
"script": "ct/seaweedfs.sh",
|
|
||||||
"resources": {
|
|
||||||
"cpu": 2,
|
|
||||||
"ram": 2048,
|
|
||||||
"hdd": 16,
|
|
||||||
"os": "Debian",
|
|
||||||
"version": "13"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"default_credentials": {
|
|
||||||
"username": null,
|
|
||||||
"password": null
|
|
||||||
},
|
|
||||||
"notes": [
|
|
||||||
{
|
|
||||||
"text": "Master UI available at port 9333, Filer UI at port 8888, S3 API at port 8333.",
|
|
||||||
"type": "info"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "Data is stored in /opt/seaweedfs-data.",
|
|
||||||
"type": "info"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "FUSE mounting requires fuse3 (pre-installed).",
|
|
||||||
"type": "info"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
#!/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/booklore-app/BookLore
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
JAVA_VERSION="25" setup_java
|
|
||||||
NODE_VERSION="22" setup_nodejs
|
|
||||||
setup_mariadb
|
|
||||||
setup_yq
|
|
||||||
MARIADB_DB_NAME="booklore_db" MARIADB_DB_USER="booklore_user" MARIADB_DB_EXTRA_GRANTS="GRANT SELECT ON \`mysql\`.\`time_zone_name\`" setup_mariadb_db
|
|
||||||
fetch_and_deploy_gh_release "booklore" "booklore-app/BookLore" "tarball"
|
|
||||||
|
|
||||||
msg_info "Building Frontend"
|
|
||||||
cd /opt/booklore/booklore-ui
|
|
||||||
$STD npm ci
|
|
||||||
$STD npm run build --configuration=production
|
|
||||||
msg_ok "Built Frontend"
|
|
||||||
|
|
||||||
msg_info "Embedding Frontend into Backend"
|
|
||||||
mkdir -p /opt/booklore/booklore-api/src/main/resources/static
|
|
||||||
cp -r /opt/booklore/booklore-ui/dist/booklore/browser/* /opt/booklore/booklore-api/src/main/resources/static/
|
|
||||||
msg_ok "Embedded Frontend into Backend"
|
|
||||||
|
|
||||||
msg_info "Creating Environment"
|
|
||||||
mkdir -p /opt/booklore_storage/{data,books,bookdrop}
|
|
||||||
cat <<EOF >/opt/booklore_storage/.env
|
|
||||||
# Database Configuration
|
|
||||||
DATABASE_URL=jdbc:mariadb://localhost:3306/${MARIADB_DB_NAME}
|
|
||||||
DATABASE_USERNAME=${MARIADB_DB_USER}
|
|
||||||
DATABASE_PASSWORD=${MARIADB_DB_PASS}
|
|
||||||
|
|
||||||
# App Configuration (Spring Boot mapping from app.* properties)
|
|
||||||
APP_PATH_CONFIG=/opt/booklore_storage/data
|
|
||||||
APP_BOOKDROP_FOLDER=/opt/booklore_storage/bookdrop
|
|
||||||
SERVER_PORT=6060
|
|
||||||
EOF
|
|
||||||
msg_ok "Created Environment"
|
|
||||||
|
|
||||||
msg_info "Building Backend"
|
|
||||||
cd /opt/booklore/booklore-api
|
|
||||||
APP_VERSION=$(get_latest_github_release "booklore-app/BookLore")
|
|
||||||
yq eval ".app.version = \"${APP_VERSION}\"" -i src/main/resources/application.yaml
|
|
||||||
$STD ./gradlew clean build -x test --no-daemon
|
|
||||||
mkdir -p /opt/booklore/dist
|
|
||||||
JAR_PATH=$(find /opt/booklore/booklore-api/build/libs -maxdepth 1 -type f -name "booklore-api-*.jar" ! -name "*plain*" | head -n1)
|
|
||||||
if [[ -z "$JAR_PATH" ]]; then
|
|
||||||
msg_error "Backend JAR not found"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
cp "$JAR_PATH" /opt/booklore/dist/app.jar
|
|
||||||
msg_ok "Built Backend"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
cat <<EOF >/etc/systemd/system/booklore.service
|
|
||||||
[Unit]
|
|
||||||
Description=BookLore Java Service
|
|
||||||
After=network.target mariadb.service
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
User=root
|
|
||||||
WorkingDirectory=/opt/booklore/dist
|
|
||||||
ExecStart=/usr/bin/java -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+UseCompactObjectHeaders -jar /opt/booklore/dist/app.jar
|
|
||||||
EnvironmentFile=/opt/booklore_storage/.env
|
|
||||||
SuccessExitStatus=143
|
|
||||||
TimeoutStopSec=10
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=5
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now booklore
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 mitchscobell
|
|
||||||
# Author: mitchscobell
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://ddclient.net/
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing ddclient"
|
|
||||||
DEBIAN_FRONTEND=noninteractive $STD apt -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install -y ddclient
|
|
||||||
msg_ok "Installed ddclient"
|
|
||||||
|
|
||||||
msg_info "Creating ddclient service"
|
|
||||||
cat << EOF >/etc/ddclient.conf
|
|
||||||
protocol=namecheap
|
|
||||||
use=web, web=dynamicdns.park-your-domain.com/getip
|
|
||||||
protocol=namecheap
|
|
||||||
use=web, web=dynamicdns.park-your-domain.com/getip
|
|
||||||
server=dynamicdns.park-your-domain.com
|
|
||||||
login=yourdomain.com
|
|
||||||
password='your-ddns-password'
|
|
||||||
@,www
|
|
||||||
EOF
|
|
||||||
chmod 600 /etc/ddclient.conf
|
|
||||||
systemctl enable -q --now ddclient
|
|
||||||
msg_ok "Created ddclient service"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -1,401 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Authors: MickLesk (CanbiZ)
|
|
||||||
# Co-Authors: remz1337
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://frigate.video/ | Github: https://github.com/blakeblackshear/frigate
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
source /etc/os-release
|
|
||||||
if [[ "$VERSION_ID" != "12" ]]; then
|
|
||||||
msg_error "Frigate requires Debian 12 (Bookworm) due to Python 3.11 dependencies"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Converting APT sources to DEB822 format"
|
|
||||||
if [ -f /etc/apt/sources.list ]; then
|
|
||||||
cat >/etc/apt/sources.list.d/debian.sources <<'EOF'
|
|
||||||
Types: deb
|
|
||||||
URIs: http://deb.debian.org/debian
|
|
||||||
Suites: bookworm
|
|
||||||
Components: main contrib
|
|
||||||
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
|
|
||||||
|
|
||||||
Types: deb
|
|
||||||
URIs: http://deb.debian.org/debian
|
|
||||||
Suites: bookworm-updates
|
|
||||||
Components: main contrib
|
|
||||||
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
|
|
||||||
|
|
||||||
Types: deb
|
|
||||||
URIs: http://security.debian.org
|
|
||||||
Suites: bookworm-security
|
|
||||||
Components: main contrib
|
|
||||||
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
|
|
||||||
EOF
|
|
||||||
mv /etc/apt/sources.list /etc/apt/sources.list.bak
|
|
||||||
$STD apt update
|
|
||||||
fi
|
|
||||||
msg_ok "Converted APT sources"
|
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apt install -y \
|
|
||||||
xz-utils \
|
|
||||||
python3 \
|
|
||||||
python3-dev \
|
|
||||||
python3-pip \
|
|
||||||
gcc \
|
|
||||||
pkg-config \
|
|
||||||
libhdf5-dev \
|
|
||||||
build-essential \
|
|
||||||
automake \
|
|
||||||
libtool \
|
|
||||||
ccache \
|
|
||||||
libusb-1.0-0-dev \
|
|
||||||
apt-transport-https \
|
|
||||||
cmake \
|
|
||||||
git \
|
|
||||||
libgtk-3-dev \
|
|
||||||
libavcodec-dev \
|
|
||||||
libavformat-dev \
|
|
||||||
libswscale-dev \
|
|
||||||
libv4l-dev \
|
|
||||||
libxvidcore-dev \
|
|
||||||
libx264-dev \
|
|
||||||
libjpeg-dev \
|
|
||||||
libpng-dev \
|
|
||||||
libtiff-dev \
|
|
||||||
gfortran \
|
|
||||||
openexr \
|
|
||||||
libssl-dev \
|
|
||||||
libtbbmalloc2 \
|
|
||||||
libtbb-dev \
|
|
||||||
libdc1394-dev \
|
|
||||||
libopenexr-dev \
|
|
||||||
libgstreamer-plugins-base1.0-dev \
|
|
||||||
libgstreamer1.0-dev \
|
|
||||||
tclsh \
|
|
||||||
libopenblas-dev \
|
|
||||||
liblapack-dev \
|
|
||||||
libgomp1 \
|
|
||||||
make \
|
|
||||||
moreutils
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
setup_hwaccel
|
|
||||||
|
|
||||||
export TARGETARCH="amd64"
|
|
||||||
export CCACHE_DIR=/root/.ccache
|
|
||||||
export CCACHE_MAXSIZE=2G
|
|
||||||
export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
|
|
||||||
export PIP_BREAK_SYSTEM_PACKAGES=1
|
|
||||||
export NVIDIA_VISIBLE_DEVICES=all
|
|
||||||
export NVIDIA_DRIVER_CAPABILITIES="compute,video,utility"
|
|
||||||
export TOKENIZERS_PARALLELISM=true
|
|
||||||
export TRANSFORMERS_NO_ADVISORY_WARNINGS=1
|
|
||||||
export OPENCV_FFMPEG_LOGLEVEL=8
|
|
||||||
export PYTHONWARNINGS="ignore:::numpy.core.getlimits"
|
|
||||||
export HAILORT_LOGGER_PATH=NONE
|
|
||||||
export TF_CPP_MIN_LOG_LEVEL=3
|
|
||||||
export TF_CPP_MIN_VLOG_LEVEL=3
|
|
||||||
export TF_ENABLE_ONEDNN_OPTS=0
|
|
||||||
export AUTOGRAPH_VERBOSITY=0
|
|
||||||
export GLOG_minloglevel=3
|
|
||||||
export GLOG_logtostderr=0
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "frigate" "blakeblackshear/frigate" "tarball" "v0.17.0" "/opt/frigate"
|
|
||||||
|
|
||||||
msg_info "Building Nginx"
|
|
||||||
$STD bash /opt/frigate/docker/main/build_nginx.sh
|
|
||||||
sed -e '/s6-notifyoncheck/ s/^#*/#/' -i /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run
|
|
||||||
ln -sf /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
|
|
||||||
msg_ok "Built Nginx"
|
|
||||||
|
|
||||||
msg_info "Building SQLite Extensions"
|
|
||||||
$STD bash /opt/frigate/docker/main/build_sqlite_vec.sh
|
|
||||||
msg_ok "Built SQLite Extensions"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "go2rtc" "AlexxIT/go2rtc" "singlefile" "latest" "/usr/local/go2rtc/bin" "go2rtc_linux_amd64"
|
|
||||||
|
|
||||||
msg_info "Installing Tempio"
|
|
||||||
sed -i 's|/rootfs/usr/local|/usr/local|g' /opt/frigate/docker/main/install_tempio.sh
|
|
||||||
$STD bash /opt/frigate/docker/main/install_tempio.sh
|
|
||||||
ln -sf /usr/local/tempio/bin/tempio /usr/local/bin/tempio
|
|
||||||
msg_ok "Installed Tempio"
|
|
||||||
|
|
||||||
msg_info "Building libUSB"
|
|
||||||
fetch_and_deploy_gh_release "libusb" "libusb/libusb" "tarball" "v1.0.26" "/opt/libusb"
|
|
||||||
cd /opt/libusb
|
|
||||||
$STD ./bootstrap.sh
|
|
||||||
$STD ./configure CC='ccache gcc' CCX='ccache g++' --disable-udev --enable-shared
|
|
||||||
$STD make -j "$(nproc)"
|
|
||||||
cd /opt/libusb/libusb
|
|
||||||
mkdir -p /usr/local/lib /usr/local/include/libusb-1.0 /usr/local/lib/pkgconfig
|
|
||||||
$STD bash ../libtool --mode=install /usr/bin/install -c libusb-1.0.la /usr/local/lib
|
|
||||||
install -c -m 644 libusb.h /usr/local/include/libusb-1.0
|
|
||||||
cd /opt/libusb/
|
|
||||||
install -c -m 644 libusb-1.0.pc /usr/local/lib/pkgconfig
|
|
||||||
ldconfig
|
|
||||||
msg_ok "Built libUSB"
|
|
||||||
|
|
||||||
msg_info "Bootstrapping pip"
|
|
||||||
wget -q https://bootstrap.pypa.io/get-pip.py -O /tmp/get-pip.py
|
|
||||||
sed -i 's/args.append("setuptools")/args.append("setuptools==77.0.3")/' /tmp/get-pip.py
|
|
||||||
$STD python3 /tmp/get-pip.py "pip"
|
|
||||||
rm -f /tmp/get-pip.py
|
|
||||||
msg_ok "Bootstrapped pip"
|
|
||||||
|
|
||||||
msg_info "Installing Python Dependencies"
|
|
||||||
$STD pip3 install -r /opt/frigate/docker/main/requirements.txt
|
|
||||||
msg_ok "Installed Python Dependencies"
|
|
||||||
|
|
||||||
msg_info "Building Python Wheels (Patience)"
|
|
||||||
mkdir -p /wheels
|
|
||||||
$STD bash /opt/frigate/docker/main/build_pysqlite3.sh
|
|
||||||
for i in {1..3}; do
|
|
||||||
$STD pip3 wheel --wheel-dir=/wheels -r /opt/frigate/docker/main/requirements-wheels.txt --default-timeout=300 --retries=3 && break
|
|
||||||
[[ $i -lt 3 ]] && sleep 10
|
|
||||||
done
|
|
||||||
msg_ok "Built Python Wheels"
|
|
||||||
|
|
||||||
NODE_VERSION="20" setup_nodejs
|
|
||||||
|
|
||||||
msg_info "Downloading Inference Models"
|
|
||||||
mkdir -p /models /openvino-model
|
|
||||||
wget -q -O /edgetpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite
|
|
||||||
wget -q -O /models/cpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite
|
|
||||||
cp /opt/frigate/labelmap.txt /labelmap.txt
|
|
||||||
msg_ok "Downloaded Inference Models"
|
|
||||||
|
|
||||||
msg_info "Downloading Audio Model"
|
|
||||||
wget -q -O /tmp/yamnet.tar.gz https://www.kaggle.com/api/v1/models/google/yamnet/tfLite/classification-tflite/1/download
|
|
||||||
$STD tar xzf /tmp/yamnet.tar.gz -C /
|
|
||||||
mv /1.tflite /cpu_audio_model.tflite
|
|
||||||
cp /opt/frigate/audio-labelmap.txt /audio-labelmap.txt
|
|
||||||
rm -f /tmp/yamnet.tar.gz
|
|
||||||
msg_ok "Downloaded Audio Model"
|
|
||||||
|
|
||||||
msg_info "Installing HailoRT Runtime"
|
|
||||||
$STD bash /opt/frigate/docker/main/install_hailort.sh
|
|
||||||
cp -a /opt/frigate/docker/main/rootfs/. /
|
|
||||||
sed -i '/^.*unset DEBIAN_FRONTEND.*$/d' /opt/frigate/docker/main/install_deps.sh
|
|
||||||
echo "libedgetpu1-max libedgetpu/accepted-eula boolean true" | debconf-set-selections
|
|
||||||
echo "libedgetpu1-max libedgetpu/install-confirm-max boolean true" | debconf-set-selections
|
|
||||||
# Allow Frigate's Intel media packages to overwrite files from system GPU driver packages
|
|
||||||
echo 'force-overwrite' >/etc/dpkg/dpkg.cfg.d/force-overwrite
|
|
||||||
$STD bash /opt/frigate/docker/main/install_deps.sh
|
|
||||||
rm -f /etc/dpkg/dpkg.cfg.d/force-overwrite
|
|
||||||
$STD pip3 install -U /wheels/*.whl
|
|
||||||
ldconfig
|
|
||||||
msg_ok "Installed HailoRT Runtime"
|
|
||||||
|
|
||||||
msg_info "Installing MemryX Runtime"
|
|
||||||
$STD bash /opt/frigate/docker/main/install_memryx.sh
|
|
||||||
msg_ok "Installed MemryX Runtime"
|
|
||||||
|
|
||||||
msg_info "Installing OpenVino"
|
|
||||||
$STD pip3 install -r /opt/frigate/docker/main/requirements-ov.txt
|
|
||||||
msg_ok "Installed OpenVino"
|
|
||||||
|
|
||||||
msg_info "Building OpenVino Model"
|
|
||||||
cd /models
|
|
||||||
wget -q http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz
|
|
||||||
$STD tar -zxf ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz --no-same-owner
|
|
||||||
if $STD python3 /opt/frigate/docker/main/build_ov_model.py; then
|
|
||||||
cp /models/ssdlite_mobilenet_v2.xml /openvino-model/
|
|
||||||
cp /models/ssdlite_mobilenet_v2.bin /openvino-model/
|
|
||||||
wget -q https://github.com/openvinotoolkit/open_model_zoo/raw/master/data/dataset_classes/coco_91cl_bkgr.txt -O /openvino-model/coco_91cl_bkgr.txt
|
|
||||||
sed -i 's/truck/car/g' /openvino-model/coco_91cl_bkgr.txt
|
|
||||||
msg_ok "Built OpenVino Model"
|
|
||||||
else
|
|
||||||
msg_warn "OpenVino build failed (CPU may not support required instructions). Frigate will use CPU model."
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg_info "Building Frigate Application (Patience)"
|
|
||||||
cd /opt/frigate
|
|
||||||
$STD pip3 install -r /opt/frigate/docker/main/requirements-dev.txt
|
|
||||||
$STD bash /opt/frigate/.devcontainer/initialize.sh
|
|
||||||
$STD make version
|
|
||||||
cd /opt/frigate/web
|
|
||||||
$STD npm install
|
|
||||||
$STD npm run build
|
|
||||||
mv /opt/frigate/web/dist/BASE_PATH/monacoeditorwork/* /opt/frigate/web/dist/assets/
|
|
||||||
rm -rf /opt/frigate/web/dist/BASE_PATH
|
|
||||||
cp -r /opt/frigate/web/dist/* /opt/frigate/web/
|
|
||||||
sed -i '/^s6-svc -O \.$/s/^/#/' /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run
|
|
||||||
msg_ok "Built Frigate Application"
|
|
||||||
|
|
||||||
msg_info "Configuring Frigate"
|
|
||||||
mkdir -p /config /media/frigate
|
|
||||||
cp -r /opt/frigate/config/. /config
|
|
||||||
|
|
||||||
curl -fsSL "https://github.com/intel-iot-devkit/sample-videos/raw/master/person-bicycle-car-detection.mp4" -o "/media/frigate/person-bicycle-car-detection.mp4"
|
|
||||||
|
|
||||||
echo "tmpfs /tmp/cache tmpfs defaults 0 0" >>/etc/fstab
|
|
||||||
|
|
||||||
cat <<EOF >/etc/frigate.env
|
|
||||||
DEFAULT_FFMPEG_VERSION="7.0"
|
|
||||||
INCLUDED_FFMPEG_VERSIONS="7.0:5.0"
|
|
||||||
NVIDIA_VISIBLE_DEVICES=all
|
|
||||||
NVIDIA_DRIVER_CAPABILITIES="compute,video,utility"
|
|
||||||
TOKENIZERS_PARALLELISM=true
|
|
||||||
TRANSFORMERS_NO_ADVISORY_WARNINGS=1
|
|
||||||
OPENCV_FFMPEG_LOGLEVEL=8
|
|
||||||
PYTHONWARNINGS="ignore:::numpy.core.getlimits"
|
|
||||||
HAILORT_LOGGER_PATH=NONE
|
|
||||||
TF_CPP_MIN_LOG_LEVEL=3
|
|
||||||
TF_CPP_MIN_VLOG_LEVEL=3
|
|
||||||
TF_ENABLE_ONEDNN_OPTS=0
|
|
||||||
AUTOGRAPH_VERBOSITY=0
|
|
||||||
GLOG_minloglevel=3
|
|
||||||
GLOG_logtostderr=0
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat <<EOF >/config/config.yml
|
|
||||||
mqtt:
|
|
||||||
enabled: false
|
|
||||||
cameras:
|
|
||||||
test:
|
|
||||||
ffmpeg:
|
|
||||||
inputs:
|
|
||||||
- path: /media/frigate/person-bicycle-car-detection.mp4
|
|
||||||
input_args: -re -stream_loop -1 -fflags +genpts
|
|
||||||
roles:
|
|
||||||
- detect
|
|
||||||
detect:
|
|
||||||
height: 1080
|
|
||||||
width: 1920
|
|
||||||
fps: 5
|
|
||||||
auth:
|
|
||||||
enabled: false
|
|
||||||
detect:
|
|
||||||
enabled: false
|
|
||||||
EOF
|
|
||||||
|
|
||||||
if grep -q -o -m1 -E 'avx[^ ]*|sse4_2' /proc/cpuinfo; then
|
|
||||||
cat <<EOF >>/config/config.yml
|
|
||||||
ffmpeg:
|
|
||||||
hwaccel_args: auto
|
|
||||||
detectors:
|
|
||||||
detector01:
|
|
||||||
type: openvino
|
|
||||||
device: AUTO
|
|
||||||
model:
|
|
||||||
width: 300
|
|
||||||
height: 300
|
|
||||||
input_tensor: nhwc
|
|
||||||
input_pixel_format: bgr
|
|
||||||
path: /openvino-model/ssdlite_mobilenet_v2.xml
|
|
||||||
labelmap_path: /openvino-model/coco_91cl_bkgr.txt
|
|
||||||
EOF
|
|
||||||
else
|
|
||||||
cat <<EOF >>/config/config.yml
|
|
||||||
ffmpeg:
|
|
||||||
hwaccel_args: auto
|
|
||||||
model:
|
|
||||||
path: /cpu_model.tflite
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
msg_ok "Configured Frigate"
|
|
||||||
|
|
||||||
msg_info "Creating Services"
|
|
||||||
cat <<EOF >/etc/systemd/system/create_directories.service
|
|
||||||
[Unit]
|
|
||||||
Description=Create necessary directories for Frigate logs
|
|
||||||
Before=frigate.service go2rtc.service nginx.service
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=oneshot
|
|
||||||
ExecStart=/bin/bash -c '/bin/mkdir -p /dev/shm/logs/{frigate,go2rtc,nginx} && /bin/touch /dev/shm/logs/{frigate/current,go2rtc/current,nginx/current} && /bin/chmod -R 777 /dev/shm/logs'
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat <<EOF >/etc/systemd/system/go2rtc.service
|
|
||||||
[Unit]
|
|
||||||
Description=go2rtc streaming service
|
|
||||||
After=network.target create_directories.service
|
|
||||||
StartLimitIntervalSec=0
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
Restart=always
|
|
||||||
RestartSec=1
|
|
||||||
User=root
|
|
||||||
EnvironmentFile=/etc/frigate.env
|
|
||||||
ExecStartPre=+rm -f /dev/shm/logs/go2rtc/current
|
|
||||||
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
|
|
||||||
StandardOutput=file:/dev/shm/logs/go2rtc/current
|
|
||||||
StandardError=file:/dev/shm/logs/go2rtc/current
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat <<EOF >/etc/systemd/system/frigate.service
|
|
||||||
[Unit]
|
|
||||||
Description=Frigate NVR service
|
|
||||||
After=go2rtc.service create_directories.service
|
|
||||||
StartLimitIntervalSec=0
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
Restart=always
|
|
||||||
RestartSec=1
|
|
||||||
User=root
|
|
||||||
EnvironmentFile=/etc/frigate.env
|
|
||||||
ExecStartPre=+rm -f /dev/shm/logs/frigate/current
|
|
||||||
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
|
|
||||||
StandardOutput=file:/dev/shm/logs/frigate/current
|
|
||||||
StandardError=file:/dev/shm/logs/frigate/current
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat <<EOF >/etc/systemd/system/nginx.service
|
|
||||||
[Unit]
|
|
||||||
Description=Nginx reverse proxy for Frigate
|
|
||||||
After=frigate.service create_directories.service
|
|
||||||
StartLimitIntervalSec=0
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
Restart=always
|
|
||||||
RestartSec=1
|
|
||||||
User=root
|
|
||||||
ExecStartPre=+rm -f /dev/shm/logs/nginx/current
|
|
||||||
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
|
|
||||||
StandardOutput=file:/dev/shm/logs/nginx/current
|
|
||||||
StandardError=file:/dev/shm/logs/nginx/current
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
systemctl daemon-reload
|
|
||||||
systemctl enable -q --now create_directories
|
|
||||||
sleep 2
|
|
||||||
systemctl enable -q --now go2rtc
|
|
||||||
sleep 2
|
|
||||||
systemctl enable -q --now frigate
|
|
||||||
sleep 2
|
|
||||||
systemctl enable -q --now nginx
|
|
||||||
msg_ok "Created Services"
|
|
||||||
|
|
||||||
msg_info "Cleaning Up"
|
|
||||||
rm -rf /opt/libusb /wheels /models/*.tar.gz
|
|
||||||
msg_ok "Cleaned Up"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -1,488 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: vhsdream
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://immich.app
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo ""
|
|
||||||
echo -e "🤖 ${BL}Immich Machine Learning Options${CL}"
|
|
||||||
echo "─────────────────────────────────────────"
|
|
||||||
echo "Please choose your machine-learning type:"
|
|
||||||
echo ""
|
|
||||||
echo " 1) CPU only (default)"
|
|
||||||
echo " 2) Intel OpenVINO (requires GPU passthrough)"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
read -r -p "${TAB3}Select machine-learning type [1]: " ML_TYPE
|
|
||||||
ML_TYPE="${ML_TYPE:-1}"
|
|
||||||
if [[ "$ML_TYPE" == "2" ]]; then
|
|
||||||
msg_info "Installing OpenVINO dependencies"
|
|
||||||
touch ~/.openvino
|
|
||||||
$STD apt install -y --no-install-recommends patchelf
|
|
||||||
tmp_dir=$(mktemp -d)
|
|
||||||
$STD pushd "$tmp_dir"
|
|
||||||
curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile
|
|
||||||
readarray -t INTEL_URLS < <(
|
|
||||||
sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{print $2}'
|
|
||||||
sed -n "/libigdgmm12/p" ./Dockerfile | awk '{print $3}'
|
|
||||||
)
|
|
||||||
for url in "${INTEL_URLS[@]}"; do
|
|
||||||
curl -fsSLO "$url"
|
|
||||||
done
|
|
||||||
$STD apt install -y ./libigdgmm12*.deb
|
|
||||||
rm ./libigdgmm12*.deb
|
|
||||||
$STD apt install -y ./*.deb
|
|
||||||
$STD apt-mark hold libigdgmm12
|
|
||||||
$STD popd
|
|
||||||
rm -rf "$tmp_dir"
|
|
||||||
dpkg-query -W -f='${Version}\n' intel-opencl-icd >~/.intel_version
|
|
||||||
msg_ok "Installed OpenVINO dependencies"
|
|
||||||
fi
|
|
||||||
|
|
||||||
setup_uv
|
|
||||||
|
|
||||||
msg_info "Installing dependencies"
|
|
||||||
$STD apt install --no-install-recommends -y \
|
|
||||||
git \
|
|
||||||
redis \
|
|
||||||
autoconf \
|
|
||||||
build-essential \
|
|
||||||
python3-dev \
|
|
||||||
automake \
|
|
||||||
cmake \
|
|
||||||
jq \
|
|
||||||
libtool \
|
|
||||||
libltdl-dev \
|
|
||||||
libgdk-pixbuf-2.0-dev \
|
|
||||||
libbrotli-dev \
|
|
||||||
libexif-dev \
|
|
||||||
libexpat1-dev \
|
|
||||||
libglib2.0-dev \
|
|
||||||
libgsf-1-dev \
|
|
||||||
libjpeg62-turbo-dev \
|
|
||||||
libspng-dev \
|
|
||||||
liblcms2-dev \
|
|
||||||
libopenexr-dev \
|
|
||||||
libgif-dev \
|
|
||||||
librsvg2-dev \
|
|
||||||
libexpat1 \
|
|
||||||
libgcc-s1 \
|
|
||||||
libgomp1 \
|
|
||||||
liblqr-1-0 \
|
|
||||||
libltdl7 \
|
|
||||||
libopenjp2-7 \
|
|
||||||
meson \
|
|
||||||
ninja-build \
|
|
||||||
pkg-config \
|
|
||||||
mesa-utils \
|
|
||||||
mesa-va-drivers \
|
|
||||||
mesa-vulkan-drivers \
|
|
||||||
ocl-icd-libopencl1 \
|
|
||||||
tini \
|
|
||||||
zlib1g \
|
|
||||||
libio-compress-brotli-perl \
|
|
||||||
libwebp7 \
|
|
||||||
libwebpdemux2 \
|
|
||||||
libwebpmux3 \
|
|
||||||
libhwy1t64 \
|
|
||||||
libdav1d-dev \
|
|
||||||
libhwy-dev \
|
|
||||||
libwebp-dev \
|
|
||||||
libaom-dev \
|
|
||||||
ccache
|
|
||||||
|
|
||||||
setup_deb822_repo \
|
|
||||||
"jellyfin" \
|
|
||||||
"https://repo.jellyfin.org/jellyfin_team.gpg.key" \
|
|
||||||
"https://repo.jellyfin.org/debian" \
|
|
||||||
"$(get_os_info codename)"
|
|
||||||
$STD apt install -y jellyfin-ffmpeg7
|
|
||||||
ln -sf /usr/lib/jellyfin-ffmpeg/ffmpeg /usr/bin/ffmpeg
|
|
||||||
ln -sf /usr/lib/jellyfin-ffmpeg/ffprobe /usr/bin/ffprobe
|
|
||||||
|
|
||||||
# Set permissions for /dev/dri (only in privileged containers and if /dev/dri exists)
|
|
||||||
if [[ "$CTTYPE" == "0" && -d /dev/dri ]]; then
|
|
||||||
chgrp video /dev/dri 2>/dev/null || true
|
|
||||||
chmod 755 /dev/dri 2>/dev/null || true
|
|
||||||
chmod 660 /dev/dri/* 2>/dev/null || true
|
|
||||||
$STD adduser "$(id -u -n)" video 2>/dev/null || true
|
|
||||||
$STD adduser "$(id -u -n)" render 2>/dev/null || true
|
|
||||||
fi
|
|
||||||
msg_ok "Dependencies Installed"
|
|
||||||
|
|
||||||
msg_info "Installing Mise"
|
|
||||||
curl -fSs https://mise.jdx.dev/gpg-key.pub | tee /etc/apt/keyrings/mise-archive-keyring.pub 1>/dev/null
|
|
||||||
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" >/etc/apt/sources.list.d/mise.list
|
|
||||||
$STD apt update
|
|
||||||
$STD apt install -y mise
|
|
||||||
msg_ok "Installed Mise"
|
|
||||||
|
|
||||||
msg_info "Configuring Debian Testing Repo"
|
|
||||||
sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources
|
|
||||||
cat <<EOF >/etc/apt/preferences.d/preferences
|
|
||||||
Package: *
|
|
||||||
Pin: release a=unstable
|
|
||||||
Pin-Priority: 450
|
|
||||||
|
|
||||||
Package: *
|
|
||||||
Pin:release a=testing
|
|
||||||
Pin-Priority: 450
|
|
||||||
EOF
|
|
||||||
$STD apt update
|
|
||||||
msg_ok "Configured Debian Testing repo"
|
|
||||||
msg_info "Installing packages from Debian Testing repo"
|
|
||||||
$STD apt install -t testing --no-install-recommends -yqq libmimalloc3 libde265-dev
|
|
||||||
msg_ok "Installed packages from Debian Testing repo"
|
|
||||||
|
|
||||||
PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')"
|
|
||||||
NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs
|
|
||||||
PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql
|
|
||||||
|
|
||||||
VCHORD_RELEASE="0.5.3"
|
|
||||||
msg_info "Installing Vectorchord v${VCHORD_RELEASE}"
|
|
||||||
curl -fsSL "https://github.com/tensorchord/VectorChord/releases/download/${VCHORD_RELEASE}/postgresql-16-vchord_${VCHORD_RELEASE}-1_amd64.deb" -o vchord.deb
|
|
||||||
$STD apt install -y ./vchord.deb
|
|
||||||
rm vchord.deb
|
|
||||||
echo "$VCHORD_RELEASE" >~/.vchord_version
|
|
||||||
msg_ok "Installed Vectorchord v${VCHORD_RELEASE}"
|
|
||||||
|
|
||||||
sed -i -e "/^#shared_preload/s/^#//;/^shared_preload/s/''/'vchord.so'/" /etc/postgresql/16/main/postgresql.conf
|
|
||||||
systemctl restart postgresql.service
|
|
||||||
PG_DB_NAME="immich" PG_DB_USER="immich" PG_DB_GRANT_SUPERUSER="true" PG_DB_SKIP_ALTER_ROLE="true" setup_postgresql_db
|
|
||||||
|
|
||||||
msg_info "Compiling Custom Photo-processing Library (extreme patience)"
|
|
||||||
LD_LIBRARY_PATH=/usr/local/lib
|
|
||||||
export LD_RUN_PATH=/usr/local/lib
|
|
||||||
STAGING_DIR=/opt/staging
|
|
||||||
BASE_REPO="https://github.com/immich-app/base-images"
|
|
||||||
BASE_DIR=${STAGING_DIR}/base-images
|
|
||||||
SOURCE_DIR=${STAGING_DIR}/image-source
|
|
||||||
$STD git clone -b main "$BASE_REPO" "$BASE_DIR"
|
|
||||||
mkdir -p "$SOURCE_DIR"
|
|
||||||
|
|
||||||
msg_info "(1/5) Compiling libjxl"
|
|
||||||
cd "$STAGING_DIR"
|
|
||||||
SOURCE=${SOURCE_DIR}/libjxl
|
|
||||||
JPEGLI_LIBJPEG_LIBRARY_SOVERSION="62"
|
|
||||||
JPEGLI_LIBJPEG_LIBRARY_VERSION="62.3.0"
|
|
||||||
: "${LIBJXL_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libjxl.json)}"
|
|
||||||
$STD git clone https://github.com/libjxl/libjxl.git "$SOURCE"
|
|
||||||
cd "$SOURCE"
|
|
||||||
$STD git reset --hard "$LIBJXL_REVISION"
|
|
||||||
$STD git submodule update --init --recursive --depth 1 --recommend-shallow
|
|
||||||
$STD git apply "$BASE_DIR"/server/sources/libjxl-patches/jpegli-empty-dht-marker.patch
|
|
||||||
$STD git apply "$BASE_DIR"/server/sources/libjxl-patches/jpegli-icc-warning.patch
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
$STD cmake \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DBUILD_TESTING=OFF \
|
|
||||||
-DJPEGXL_ENABLE_DOXYGEN=OFF \
|
|
||||||
-DJPEGXL_ENABLE_MANPAGES=OFF \
|
|
||||||
-DJPEGXL_ENABLE_PLUGIN_GIMP210=OFF \
|
|
||||||
-DJPEGXL_ENABLE_BENCHMARK=OFF \
|
|
||||||
-DJPEGXL_ENABLE_EXAMPLES=OFF \
|
|
||||||
-DJPEGXL_FORCE_SYSTEM_BROTLI=ON \
|
|
||||||
-DJPEGXL_FORCE_SYSTEM_HWY=ON \
|
|
||||||
-DJPEGXL_ENABLE_JPEGLI=ON \
|
|
||||||
-DJPEGXL_ENABLE_JPEGLI_LIBJPEG=ON \
|
|
||||||
-DJPEGXL_INSTALL_JPEGLI_LIBJPEG=ON \
|
|
||||||
-DJPEGXL_ENABLE_PLUGINS=ON \
|
|
||||||
-DJPEGLI_LIBJPEG_LIBRARY_SOVERSION="$JPEGLI_LIBJPEG_LIBRARY_SOVERSION" \
|
|
||||||
-DJPEGLI_LIBJPEG_LIBRARY_VERSION="$JPEGLI_LIBJPEG_LIBRARY_VERSION" \
|
|
||||||
-DLIBJPEG_TURBO_VERSION_NUMBER=2001005 \
|
|
||||||
..
|
|
||||||
$STD cmake --build . -- -j"$(nproc)"
|
|
||||||
$STD cmake --install .
|
|
||||||
ldconfig /usr/local/lib
|
|
||||||
$STD make clean
|
|
||||||
cd "$STAGING_DIR"
|
|
||||||
rm -rf "$SOURCE"/{build,third_party}
|
|
||||||
msg_ok "(1/5) Compiled libjxl"
|
|
||||||
|
|
||||||
msg_info "(2/5) Compiling libheif"
|
|
||||||
SOURCE=${SOURCE_DIR}/libheif
|
|
||||||
: "${LIBHEIF_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libheif.json)}"
|
|
||||||
$STD git clone https://github.com/strukturag/libheif.git "$SOURCE"
|
|
||||||
cd "$SOURCE"
|
|
||||||
$STD git reset --hard "$LIBHEIF_REVISION"
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
$STD cmake --preset=release-noplugins \
|
|
||||||
-DWITH_DAV1D=ON \
|
|
||||||
-DENABLE_PARALLEL_TILE_DECODING=ON \
|
|
||||||
-DWITH_LIBSHARPYUV=ON \
|
|
||||||
-DWITH_LIBDE265=ON \
|
|
||||||
-DWITH_AOM_DECODER=OFF \
|
|
||||||
-DWITH_AOM_ENCODER=ON \
|
|
||||||
-DWITH_X265=OFF \
|
|
||||||
-DWITH_EXAMPLES=OFF \
|
|
||||||
..
|
|
||||||
$STD make install -j "$(nproc)"
|
|
||||||
ldconfig /usr/local/lib
|
|
||||||
$STD make clean
|
|
||||||
cd "$STAGING_DIR"
|
|
||||||
rm -rf "$SOURCE"/build
|
|
||||||
msg_ok "(2/5) Compiled libheif"
|
|
||||||
|
|
||||||
msg_info "(3/5) Compiling libraw"
|
|
||||||
SOURCE=${SOURCE_DIR}/libraw
|
|
||||||
: "${LIBRAW_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libraw.json)}"
|
|
||||||
$STD git clone https://github.com/libraw/libraw.git "$SOURCE"
|
|
||||||
cd "$SOURCE"
|
|
||||||
$STD git reset --hard "$LIBRAW_REVISION"
|
|
||||||
$STD autoreconf --install
|
|
||||||
$STD ./configure --disable-examples
|
|
||||||
$STD make -j"$(nproc)"
|
|
||||||
$STD make install
|
|
||||||
ldconfig /usr/local/lib
|
|
||||||
$STD make clean
|
|
||||||
cd "$STAGING_DIR"
|
|
||||||
msg_ok "(3/5) Compiled libraw"
|
|
||||||
|
|
||||||
msg_info "(4/5) Compiling imagemagick"
|
|
||||||
SOURCE=$SOURCE_DIR/imagemagick
|
|
||||||
: "${IMAGEMAGICK_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/imagemagick.json)}"
|
|
||||||
$STD git clone https://github.com/ImageMagick/ImageMagick.git "$SOURCE"
|
|
||||||
cd "$SOURCE"
|
|
||||||
$STD git reset --hard "$IMAGEMAGICK_REVISION"
|
|
||||||
$STD ./configure --with-modules CPPFLAGS="-DMAGICK_LIBRAW_VERSION_TAIL=202502"
|
|
||||||
$STD make -j"$(nproc)"
|
|
||||||
$STD make install
|
|
||||||
ldconfig /usr/local/lib
|
|
||||||
$STD make clean
|
|
||||||
cd "$STAGING_DIR"
|
|
||||||
msg_ok "(4/5) Compiled imagemagick"
|
|
||||||
|
|
||||||
msg_info "(5/5) Compiling libvips"
|
|
||||||
SOURCE=$SOURCE_DIR/libvips
|
|
||||||
: "${LIBVIPS_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libvips.json)}"
|
|
||||||
$STD git clone https://github.com/libvips/libvips.git "$SOURCE"
|
|
||||||
cd "$SOURCE"
|
|
||||||
$STD git reset --hard "$LIBVIPS_REVISION"
|
|
||||||
$STD meson setup build --buildtype=release --libdir=lib -Dintrospection=disabled -Dtiff=disabled
|
|
||||||
cd build
|
|
||||||
$STD ninja install
|
|
||||||
ldconfig /usr/local/lib
|
|
||||||
cd "$STAGING_DIR"
|
|
||||||
rm -rf "$SOURCE"/build
|
|
||||||
msg_ok "(5/5) Compiled libvips"
|
|
||||||
{
|
|
||||||
echo "imagemagick: $IMAGEMAGICK_REVISION"
|
|
||||||
echo "libheif: $LIBHEIF_REVISION"
|
|
||||||
echo "libjxl: $LIBJXL_REVISION"
|
|
||||||
echo "libraw: $LIBRAW_REVISION"
|
|
||||||
echo "libvips: $LIBVIPS_REVISION"
|
|
||||||
} >~/.immich_library_revisions
|
|
||||||
msg_ok "Custom Photo-processing Libraries Compiled Successfully"
|
|
||||||
|
|
||||||
INSTALL_DIR="/opt/${APPLICATION}"
|
|
||||||
UPLOAD_DIR="${INSTALL_DIR}/upload"
|
|
||||||
SRC_DIR="${INSTALL_DIR}/source"
|
|
||||||
APP_DIR="${INSTALL_DIR}/app"
|
|
||||||
PLUGIN_DIR="${APP_DIR}/corePlugin"
|
|
||||||
ML_DIR="${APP_DIR}/machine-learning"
|
|
||||||
GEO_DIR="${INSTALL_DIR}/geodata"
|
|
||||||
mkdir -p "$INSTALL_DIR"
|
|
||||||
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tag" "v2.5.2" "$SRC_DIR"
|
|
||||||
|
|
||||||
msg_info "Installing Immich (patience)"
|
|
||||||
|
|
||||||
cd "$SRC_DIR"/server
|
|
||||||
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
|
||||||
export CI=1
|
|
||||||
corepack enable
|
|
||||||
|
|
||||||
# server build
|
|
||||||
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
|
|
||||||
$STD pnpm --filter immich --frozen-lockfile build
|
|
||||||
unset SHARP_IGNORE_GLOBAL_LIBVIPS
|
|
||||||
export SHARP_FORCE_GLOBAL_LIBVIPS=true
|
|
||||||
$STD pnpm --filter immich --frozen-lockfile --prod --no-optional deploy "$APP_DIR"
|
|
||||||
cp "$APP_DIR"/package.json "$APP_DIR"/bin
|
|
||||||
sed -i 's|^start|./start|' "$APP_DIR"/bin/immich-admin
|
|
||||||
|
|
||||||
# openapi & web build
|
|
||||||
cd "$SRC_DIR"
|
|
||||||
echo "packageImportMethod: hardlink" >>./pnpm-workspace.yaml
|
|
||||||
$STD pnpm --filter @immich/sdk --filter immich-web --frozen-lockfile --force install
|
|
||||||
unset SHARP_FORCE_GLOBAL_LIBVIPS
|
|
||||||
export SHARP_IGNORE_GLOBAL_LIBVIPS=true
|
|
||||||
$STD pnpm --filter @immich/sdk --filter immich-web build
|
|
||||||
cp -a web/build "$APP_DIR"/www
|
|
||||||
cp LICENSE "$APP_DIR"
|
|
||||||
|
|
||||||
# cli build
|
|
||||||
$STD pnpm --filter @immich/sdk --filter @immich/cli --frozen-lockfile install
|
|
||||||
$STD pnpm --filter @immich/sdk --filter @immich/cli build
|
|
||||||
$STD pnpm --filter @immich/cli --prod --no-optional deploy "$APP_DIR"/cli
|
|
||||||
|
|
||||||
# plugins
|
|
||||||
cd "$SRC_DIR"
|
|
||||||
$STD mise trust --ignore ./mise.toml
|
|
||||||
$STD mise trust ./plugins/mise.toml
|
|
||||||
cd plugins
|
|
||||||
$STD mise install
|
|
||||||
$STD mise run build
|
|
||||||
mkdir -p "$PLUGIN_DIR"
|
|
||||||
cp -r ./dist "$PLUGIN_DIR"/dist
|
|
||||||
cp ./manifest.json "$PLUGIN_DIR"
|
|
||||||
msg_ok "Installed Immich Server, Web and Plugin Components"
|
|
||||||
|
|
||||||
cd "$SRC_DIR"/machine-learning
|
|
||||||
$STD useradd -U -s /usr/sbin/nologin -r -M -d "$INSTALL_DIR" immich
|
|
||||||
mkdir -p "$ML_DIR" && chown -R immich:immich "$INSTALL_DIR"
|
|
||||||
export VIRTUAL_ENV="${ML_DIR}/ml-venv"
|
|
||||||
if [[ -f ~/.openvino ]]; then
|
|
||||||
msg_info "Installing HW-accelerated machine-learning"
|
|
||||||
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra openvino --no-dev --active --link-mode copy -n -p python3.13 --managed-python
|
|
||||||
patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.13/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-313-x86_64-linux-gnu.so"
|
|
||||||
msg_ok "Installed HW-accelerated machine-learning"
|
|
||||||
else
|
|
||||||
msg_info "Installing machine-learning"
|
|
||||||
$STD sudo --preserve-env=VIRTUAL_ENV -nu immich uv sync --extra cpu --no-dev --active --link-mode copy -n -p python3.11 --managed-python
|
|
||||||
msg_ok "Installed machine-learning"
|
|
||||||
fi
|
|
||||||
cd "$SRC_DIR"
|
|
||||||
cp -a machine-learning/{ann,immich_ml} "$ML_DIR"
|
|
||||||
if [[ -f ~/.openvino ]]; then
|
|
||||||
sed -i "/intra_op/s/int = 0/int = os.cpu_count() or 0/" "$ML_DIR"/immich_ml/config.py
|
|
||||||
fi
|
|
||||||
ln -sf "$APP_DIR"/resources "$INSTALL_DIR"
|
|
||||||
|
|
||||||
cd "$APP_DIR"
|
|
||||||
grep -rl /usr/src | xargs -n1 sed -i "s|\/usr/src|$INSTALL_DIR|g"
|
|
||||||
grep -rlE "'/build'" | xargs -n1 sed -i "s|'/build'|'$APP_DIR'|g"
|
|
||||||
sed -i "s@\"/cache\"@\"$INSTALL_DIR/cache\"@g" "$ML_DIR"/immich_ml/config.py
|
|
||||||
ln -s "$UPLOAD_DIR" "$APP_DIR"/upload
|
|
||||||
ln -s "$UPLOAD_DIR" "$ML_DIR"/upload
|
|
||||||
|
|
||||||
msg_info "Installing GeoNames data"
|
|
||||||
cd "$GEO_DIR"
|
|
||||||
curl -fsSLZ -O "https://download.geonames.org/export/dump/admin1CodesASCII.txt" \
|
|
||||||
-O "https://download.geonames.org/export/dump/admin2Codes.txt" \
|
|
||||||
-O "https://download.geonames.org/export/dump/cities500.zip" \
|
|
||||||
-O "https://raw.githubusercontent.com/nvkelso/natural-earth-vector/v5.1.2/geojson/ne_10m_admin_0_countries.geojson"
|
|
||||||
unzip -q cities500.zip
|
|
||||||
date --iso-8601=seconds | tr -d "\n" >geodata-date.txt
|
|
||||||
rm cities500.zip
|
|
||||||
cd "$INSTALL_DIR"
|
|
||||||
ln -s "$GEO_DIR" "$APP_DIR"
|
|
||||||
msg_ok "Installed GeoNames data"
|
|
||||||
|
|
||||||
mkdir -p /var/log/immich
|
|
||||||
touch /var/log/immich/{web.log,ml.log}
|
|
||||||
msg_ok "Installed Immich"
|
|
||||||
|
|
||||||
msg_info "Modifying user, creating env file, scripts & services"
|
|
||||||
usermod -aG video,render immich
|
|
||||||
|
|
||||||
cat <<EOF >"${INSTALL_DIR}"/.env
|
|
||||||
TZ=$(cat /etc/timezone)
|
|
||||||
IMMICH_VERSION=release
|
|
||||||
NODE_ENV=production
|
|
||||||
IMMICH_ALLOW_SETUP=true
|
|
||||||
|
|
||||||
DB_HOSTNAME=127.0.0.1
|
|
||||||
DB_USERNAME=${PG_DB_USER}
|
|
||||||
DB_PASSWORD=${PG_DB_PASS}
|
|
||||||
DB_DATABASE_NAME=${PG_DB_NAME}
|
|
||||||
DB_VECTOR_EXTENSION=vectorchord
|
|
||||||
|
|
||||||
REDIS_HOSTNAME=127.0.0.1
|
|
||||||
IMMICH_MACHINE_LEARNING_URL=http://127.0.0.1:3003
|
|
||||||
MACHINE_LEARNING_CACHE_FOLDER=${INSTALL_DIR}/cache
|
|
||||||
## - For OpenVINO only - workaround for onnxruntime-openvino 1.23.x crash
|
|
||||||
## - See: https://github.com/immich-app/immich/pull/11240
|
|
||||||
MACHINE_LEARNING_OPENVINO_NUM_THREADS=$(nproc)
|
|
||||||
## - Uncomment below to increase inference speed while reducing accuracy
|
|
||||||
# MACHINE_LEARNING_OPENVINO_PRECISION=FP16
|
|
||||||
|
|
||||||
IMMICH_MEDIA_LOCATION=${UPLOAD_DIR}
|
|
||||||
EOF
|
|
||||||
cat <<EOF >"${ML_DIR}"/ml_start.sh
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
cd ${ML_DIR}
|
|
||||||
. ${VIRTUAL_ENV}/bin/activate
|
|
||||||
|
|
||||||
set -a
|
|
||||||
. ${INSTALL_DIR}/.env
|
|
||||||
set +a
|
|
||||||
|
|
||||||
python3 -m immich_ml
|
|
||||||
EOF
|
|
||||||
cat <<EOF >"$APP_DIR"/bin/start.sh
|
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -a
|
|
||||||
. ${INSTALL_DIR}/.env
|
|
||||||
set +a
|
|
||||||
|
|
||||||
/usr/bin/node ${APP_DIR}/dist/main.js "\$@"
|
|
||||||
EOF
|
|
||||||
chmod +x "$ML_DIR"/ml_start.sh "$APP_DIR"/bin/start.sh
|
|
||||||
cat <<EOF >/etc/systemd/system/"${APPLICATION}"-web.service
|
|
||||||
[Unit]
|
|
||||||
Description=${APPLICATION} Web Service
|
|
||||||
After=network.target
|
|
||||||
Requires=redis-server.service
|
|
||||||
Requires=postgresql.service
|
|
||||||
Requires=immich-ml.service
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
User=immich
|
|
||||||
Group=immich
|
|
||||||
UMask=0077
|
|
||||||
WorkingDirectory=${APP_DIR}
|
|
||||||
EnvironmentFile=${INSTALL_DIR}/.env
|
|
||||||
ExecStart=/usr/bin/node ${APP_DIR}/dist/main
|
|
||||||
Restart=on-failure
|
|
||||||
SyslogIdentifier=immich-web
|
|
||||||
StandardOutput=append:/var/log/immich/web.log
|
|
||||||
StandardError=append:/var/log/immich/web.log
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
cat <<EOF >/etc/systemd/system/"${APPLICATION}"-ml.service
|
|
||||||
[Unit]
|
|
||||||
Description=${APPLICATION} Machine-Learning
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
UMask=0077
|
|
||||||
User=immich
|
|
||||||
Group=immich
|
|
||||||
WorkingDirectory=${APP_DIR}
|
|
||||||
EnvironmentFile=${INSTALL_DIR}/.env
|
|
||||||
ExecStart=${ML_DIR}/ml_start.sh
|
|
||||||
Restart=on-failure
|
|
||||||
SyslogIdentifier=immich-machine-learning
|
|
||||||
StandardOutput=append:/var/log/immich/ml.log
|
|
||||||
StandardError=append:/var/log/immich/ml.log
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
chown -R immich:immich "$INSTALL_DIR" /var/log/immich
|
|
||||||
systemctl enable -q --now "$APPLICATION"-ml.service "$APPLICATION"-web.service
|
|
||||||
msg_ok "Modified user, created env file, scripts and services"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: TechHutTV
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://netbird.io/
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Setting up NetBird Repository"
|
|
||||||
setup_deb822_repo \
|
|
||||||
"netbird" \
|
|
||||||
"https://pkgs.netbird.io/debian/public.key" \
|
|
||||||
"https://pkgs.netbird.io/debian" \
|
|
||||||
"stable"
|
|
||||||
msg_ok "Set up NetBird Repository"
|
|
||||||
|
|
||||||
msg_info "Installing NetBird"
|
|
||||||
$STD apt install -y netbird
|
|
||||||
msg_ok "Installed NetBird"
|
|
||||||
|
|
||||||
msg_info "Enabling NetBird Service"
|
|
||||||
$STD systemctl enable -q --now netbird
|
|
||||||
msg_ok "Enabled NetBird Service"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo ""
|
|
||||||
echo -e "${BL}NetBird Deployment Type${CL}"
|
|
||||||
echo "─────────────────────────────────────────"
|
|
||||||
echo "Are you using NetBird Managed or Self-Hosted?"
|
|
||||||
echo ""
|
|
||||||
echo " 1) NetBird Managed (default) - Use NetBird's managed service"
|
|
||||||
echo " 2) Self-Hosted - Use your own NetBird management server"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
read -r -p "${TAB3}Select deployment type [1]: " DEPLOYMENT_TYPE
|
|
||||||
DEPLOYMENT_TYPE="${DEPLOYMENT_TYPE:-1}"
|
|
||||||
|
|
||||||
NETBIRD_MGMT_URL=""
|
|
||||||
case "$DEPLOYMENT_TYPE" in
|
|
||||||
1)
|
|
||||||
msg_ok "Using NetBird Managed service"
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
echo ""
|
|
||||||
echo -e "${BL}Self-Hosted Configuration${CL}"
|
|
||||||
echo "─────────────────────────────────────────"
|
|
||||||
echo "Enter your NetBird management server URL."
|
|
||||||
echo "Example: https://management.example.com"
|
|
||||||
echo ""
|
|
||||||
read -r -p "Management URL: " NETBIRD_MGMT_URL
|
|
||||||
|
|
||||||
if [[ -z "$NETBIRD_MGMT_URL" ]]; then
|
|
||||||
msg_warn "No management URL provided. Run 'netbird up --management-url <url>' to connect."
|
|
||||||
else
|
|
||||||
NETBIRD_MGMT_URL="${NETBIRD_MGMT_URL%/}"
|
|
||||||
msg_ok "Management URL configured: ${NETBIRD_MGMT_URL}"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
msg_warn "Invalid selection. Using NetBird Managed service."
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo ""
|
|
||||||
echo -e "${BL}NetBird Connection Setup${CL}"
|
|
||||||
echo "─────────────────────────────────────────"
|
|
||||||
echo "Choose how to connect to your NetBird network:"
|
|
||||||
echo ""
|
|
||||||
if [[ "$DEPLOYMENT_TYPE" == "1" ]]; then
|
|
||||||
echo " 1) Setup Key (default) - Use a pre-generated setup key"
|
|
||||||
echo " 2) SSO Login - Authenticate via browser with your identity provider"
|
|
||||||
echo " 3) Skip - Configure later with 'netbird up'"
|
|
||||||
else
|
|
||||||
echo " 1) Setup Key (default) - Use a pre-generated setup key"
|
|
||||||
echo " 2) Skip - Configure later with 'netbird up'"
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
read -r -p "Select authentication method [1]: " AUTH_METHOD
|
|
||||||
AUTH_METHOD="${AUTH_METHOD:-1}"
|
|
||||||
|
|
||||||
if [[ "$DEPLOYMENT_TYPE" == "1" ]]; then
|
|
||||||
case "$AUTH_METHOD" in
|
|
||||||
1)
|
|
||||||
echo ""
|
|
||||||
echo "Enter your NetBird setup key from the NetBird dashboard."
|
|
||||||
echo ""
|
|
||||||
read -r -p "Setup key: " NETBIRD_SETUP_KEY
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
if [[ -z "$NETBIRD_SETUP_KEY" ]]; then
|
|
||||||
msg_warn "No setup key provided. Run 'netbird up -k <key>' to connect."
|
|
||||||
else
|
|
||||||
msg_info "Connecting to NetBird with setup key"
|
|
||||||
if $STD netbird up -k "$NETBIRD_SETUP_KEY"; then
|
|
||||||
msg_ok "Connected to NetBird"
|
|
||||||
else
|
|
||||||
msg_warn "Connection failed. Run 'netbird up -k <key>' to retry."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
echo ""
|
|
||||||
echo -e "${BL}SSO Authentication${CL}"
|
|
||||||
echo "─────────────────────────────────────────"
|
|
||||||
echo "A login URL will appear below."
|
|
||||||
echo "Copy the URL and open it in your browser to authenticate."
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
msg_info "Starting SSO login"
|
|
||||||
netbird login 2>&1 || true
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
msg_info "Connecting to NetBird"
|
|
||||||
if $STD netbird up; then
|
|
||||||
msg_ok "Connected to NetBird"
|
|
||||||
else
|
|
||||||
msg_warn "Connection failed. Run 'netbird up' to retry."
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
3)
|
|
||||||
msg_ok "Skipped. Run 'netbird up' to connect."
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
msg_warn "Invalid selection. Run 'netbird up' to connect."
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
case "$AUTH_METHOD" in
|
|
||||||
1)
|
|
||||||
echo ""
|
|
||||||
echo "Enter your NetBird setup key from the NetBird dashboard."
|
|
||||||
echo ""
|
|
||||||
read -r -p "Setup key: " NETBIRD_SETUP_KEY
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
if [[ -z "$NETBIRD_SETUP_KEY" ]]; then
|
|
||||||
if [[ -z "$NETBIRD_MGMT_URL" ]]; then
|
|
||||||
msg_warn "No setup key provided. Run 'netbird up -k <key> --management-url <url>' to connect."
|
|
||||||
else
|
|
||||||
msg_warn "No setup key provided. Run 'netbird up -k <key> --management-url $NETBIRD_MGMT_URL' to connect."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [[ -z "$NETBIRD_MGMT_URL" ]]; then
|
|
||||||
msg_error "Management URL is required for self-hosted deployments. Please configure it first."
|
|
||||||
else
|
|
||||||
msg_info "Connecting to NetBird with setup key"
|
|
||||||
if $STD netbird up -k "$NETBIRD_SETUP_KEY" --management-url "$NETBIRD_MGMT_URL"; then
|
|
||||||
msg_ok "Connected to NetBird"
|
|
||||||
else
|
|
||||||
msg_warn "Connection failed. Run 'netbird up -k <key> --management-url $NETBIRD_MGMT_URL' to retry."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
if [[ -z "$NETBIRD_MGMT_URL" ]]; then
|
|
||||||
msg_ok "Skipped. Run 'netbird up --management-url <url>' to connect."
|
|
||||||
else
|
|
||||||
msg_ok "Skipped. Run 'netbird up --management-url $NETBIRD_MGMT_URL' to connect."
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
if [[ -z "$NETBIRD_MGMT_URL" ]]; then
|
|
||||||
msg_warn "Invalid selection. Run 'netbird up --management-url <url>' to connect."
|
|
||||||
else
|
|
||||||
msg_warn "Invalid selection. Run 'netbird up --management-url $NETBIRD_MGMT_URL' to connect."
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/papra-hq/papra
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apt-get install -y \
|
|
||||||
build-essential \
|
|
||||||
tesseract-ocr \
|
|
||||||
tesseract-ocr-all
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/papra-hq/papra/releases | grep -oP '"tag_name":\s*"\K@papra/app@[^"]+' | head -n1)
|
|
||||||
fetch_and_deploy_gh_release "papra" "papra-hq/papra" "tarball" "${RELEASE}" "/opt/papra"
|
|
||||||
|
|
||||||
pnpm_version=$(grep -oP '"packageManager":\s*"pnpm@\K[^"]+' /opt/papra/package.json)
|
|
||||||
NODE_VERSION="24" NODE_MODULE="pnpm@$pnpm_version" setup_nodejs
|
|
||||||
|
|
||||||
msg_info "Installing Papra (Patience)"
|
|
||||||
cd /opt/papra
|
|
||||||
$STD pnpm install --frozen-lockfile
|
|
||||||
$STD pnpm --filter "@papra/app-client..." run build
|
|
||||||
$STD pnpm --filter "@papra/app-server..." run build
|
|
||||||
ln -sf /opt/papra/apps/papra-client/dist /opt/papra/apps/papra-server/public
|
|
||||||
msg_ok "Installed Papra"
|
|
||||||
|
|
||||||
msg_info "Configuring Papra"
|
|
||||||
mkdir -p /opt/papra_data/{db,documents,ingestion}
|
|
||||||
[[ ! -f /opt/papra_data/.secret ]] && openssl rand -hex 32 >/opt/papra_data/.secret
|
|
||||||
cat <<EOF >/opt/papra/apps/papra-server/.env
|
|
||||||
NODE_ENV=production
|
|
||||||
SERVER_SERVE_PUBLIC_DIR=true
|
|
||||||
PORT=1221
|
|
||||||
DATABASE_URL=file:/opt/papra_data/db/db.sqlite
|
|
||||||
DOCUMENT_STORAGE_FILESYSTEM_ROOT=/opt/papra_data/documents
|
|
||||||
PAPRA_CONFIG_DIR=/opt/papra_data
|
|
||||||
AUTH_SECRET=$(cat /opt/papra_data/.secret)
|
|
||||||
BETTER_AUTH_SECRET=$(cat /opt/papra_data/.secret)
|
|
||||||
BETTER_AUTH_TELEMETRY=0
|
|
||||||
CLIENT_BASE_URL=http://${LOCAL_IP}:1221
|
|
||||||
SERVER_BASE_URL=http://${LOCAL_IP}:1221
|
|
||||||
EMAILS_DRY_RUN=true
|
|
||||||
INGESTION_FOLDER_IS_ENABLED=true
|
|
||||||
INGESTION_FOLDER_ROOT_PATH=/opt/papra_data/ingestion
|
|
||||||
EOF
|
|
||||||
msg_ok "Configured Papra"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
cat <<EOF >/etc/systemd/system/papra.service
|
|
||||||
[Unit]
|
|
||||||
Description=Papra Document Management
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
WorkingDirectory=/opt/papra/apps/papra-server
|
|
||||||
EnvironmentFile=/opt/papra/apps/papra-server/.env
|
|
||||||
ExecStartPre=/usr/bin/pnpm run migrate:up
|
|
||||||
ExecStart=/usr/bin/node dist/index.js
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now papra
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -45,6 +45,7 @@ MAIN_URL=http://${LOCAL_IP}
|
|||||||
FRONTEND_URL=http://${LOCAL_IP}
|
FRONTEND_URL=http://${LOCAL_IP}
|
||||||
NEXT_PUBLIC_BACKEND_URL=http://${LOCAL_IP}/api
|
NEXT_PUBLIC_BACKEND_URL=http://${LOCAL_IP}/api
|
||||||
BACKEND_INTERNAL_URL=http://localhost:3000
|
BACKEND_INTERNAL_URL=http://localhost:3000
|
||||||
|
NOT_SECURED=true
|
||||||
TEMPORAL_ADDRESS=localhost:7233
|
TEMPORAL_ADDRESS=localhost:7233
|
||||||
IS_GENERAL=true
|
IS_GENERAL=true
|
||||||
STORAGE_PROVIDER=local
|
STORAGE_PROVIDER=local
|
||||||
@@ -159,6 +160,9 @@ server {
|
|||||||
|
|
||||||
client_max_body_size 100M;
|
client_max_body_size 100M;
|
||||||
|
|
||||||
|
gzip on;
|
||||||
|
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
||||||
|
|
||||||
location /api/ {
|
location /api/ {
|
||||||
proxy_pass http://127.0.0.1:3000/;
|
proxy_pass http://127.0.0.1:3000/;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
@@ -168,14 +172,21 @@ server {
|
|||||||
proxy_set_header X-Real-IP \$remote_addr;
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto \$scheme;
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||||
|
proxy_set_header Reload \$http_reload;
|
||||||
|
proxy_set_header Onboarding \$http_onboarding;
|
||||||
|
proxy_set_header Activate \$http_activate;
|
||||||
|
proxy_set_header Auth \$http_auth;
|
||||||
|
proxy_set_header Showorg \$http_showorg;
|
||||||
|
proxy_set_header Impersonate \$http_impersonate;
|
||||||
|
proxy_set_header Accept-Language \$http_accept_language;
|
||||||
}
|
}
|
||||||
|
|
||||||
location /uploads {
|
location /uploads/ {
|
||||||
alias /opt/postiz/uploads;
|
alias /opt/postiz/uploads/;
|
||||||
}
|
}
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
proxy_pass http://127.0.0.1:4200;
|
proxy_pass http://127.0.0.1:4200/;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Upgrade \$http_upgrade;
|
proxy_set_header Upgrade \$http_upgrade;
|
||||||
proxy_set_header Connection "upgrade";
|
proxy_set_header Connection "upgrade";
|
||||||
@@ -183,13 +194,22 @@ server {
|
|||||||
proxy_set_header X-Real-IP \$remote_addr;
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto \$scheme;
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||||
|
proxy_set_header Reload \$http_reload;
|
||||||
|
proxy_set_header Onboarding \$http_onboarding;
|
||||||
|
proxy_set_header Activate \$http_activate;
|
||||||
|
proxy_set_header Auth \$http_auth;
|
||||||
|
proxy_set_header Showorg \$http_showorg;
|
||||||
|
proxy_set_header Impersonate \$http_impersonate;
|
||||||
|
proxy_set_header Accept-Language \$http_accept_language;
|
||||||
|
proxy_set_header i18next \$http_i18next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
ln -sf /etc/nginx/sites-available/postiz /etc/nginx/sites-enabled/postiz
|
ln -sf /etc/nginx/sites-available/postiz /etc/nginx/sites-enabled/postiz
|
||||||
rm -f /etc/nginx/sites-enabled/default
|
rm -f /etc/nginx/sites-enabled/default
|
||||||
$STD nginx -t
|
$STD nginx -t
|
||||||
$STD systemctl enable --now nginx
|
systemctl enable -q nginx
|
||||||
|
systemctl reload -q nginx
|
||||||
msg_ok "Configured Nginx"
|
msg_ok "Configured Nginx"
|
||||||
|
|
||||||
motd_ssh
|
motd_ssh
|
||||||
|
|||||||
@@ -1,51 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 community-scripts ORG
|
|
||||||
# Author: MickLesk (CanbiZ)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/seaweedfs/seaweedfs
|
|
||||||
|
|
||||||
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 \
|
|
||||||
fuse3
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "seaweedfs" "seaweedfs/seaweedfs" "prebuild" "latest" "/opt/seaweedfs" "linux_amd64.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Setting up SeaweedFS"
|
|
||||||
mkdir -p /opt/seaweedfs-data
|
|
||||||
ln -sf /opt/seaweedfs/weed /usr/local/bin/weed
|
|
||||||
msg_ok "Set up SeaweedFS"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
cat <<EOF >/etc/systemd/system/seaweedfs.service
|
|
||||||
[Unit]
|
|
||||||
Description=SeaweedFS Server
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
User=root
|
|
||||||
WorkingDirectory=/opt/seaweedfs
|
|
||||||
ExecStart=/opt/seaweedfs/weed server -dir=/opt/seaweedfs-data -master.port=9333 -volume.port=8080 -filer -s3
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=5
|
|
||||||
LimitNOFILE=65536
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now seaweedfs
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
@@ -42,7 +42,16 @@ msg_info "Installing SimpleLogin (Patience)"
|
|||||||
cd /opt/simplelogin
|
cd /opt/simplelogin
|
||||||
$STD uv venv
|
$STD uv venv
|
||||||
$STD uv pip install setuptools hatchling editables
|
$STD uv pip install setuptools hatchling editables
|
||||||
$STD uv sync --locked --no-dev --no-build-isolation
|
$STD uv sync --locked --no-dev --no-build-isolation --no-install-package newrelic
|
||||||
|
|
||||||
|
VENV_SITE=$(/opt/simplelogin/.venv/bin/python -c "import site; print(site.getsitepackages()[0])")
|
||||||
|
mkdir -p "${VENV_SITE}/newrelic"
|
||||||
|
cat <<'STUB' >"${VENV_SITE}/newrelic/__init__.py"
|
||||||
|
STUB
|
||||||
|
cat <<'STUB' >"${VENV_SITE}/newrelic/agent.py"
|
||||||
|
def record_custom_event(*a, **kw): pass
|
||||||
|
def initialize(*a, **kw): pass
|
||||||
|
STUB
|
||||||
|
|
||||||
if [[ -f /opt/simplelogin/static/package.json ]]; then
|
if [[ -f /opt/simplelogin/static/package.json ]]; then
|
||||||
cd /opt/simplelogin/static
|
cd /opt/simplelogin/static
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ msg_info "Configuring Nginx"
|
|||||||
rm -f /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default
|
rm -f /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default
|
||||||
cp /opt/yamtrack/nginx.conf /etc/nginx/nginx.conf
|
cp /opt/yamtrack/nginx.conf /etc/nginx/nginx.conf
|
||||||
sed -i 's|user abc;|user www-data;|' /etc/nginx/nginx.conf
|
sed -i 's|user abc;|user www-data;|' /etc/nginx/nginx.conf
|
||||||
|
sed -i 's|pid /tmp/nginx.pid;|pid /run/nginx.pid;|' /etc/nginx/nginx.conf
|
||||||
sed -i 's|/yamtrack/staticfiles/|/opt/yamtrack/src/staticfiles/|' /etc/nginx/nginx.conf
|
sed -i 's|/yamtrack/staticfiles/|/opt/yamtrack/src/staticfiles/|' /etc/nginx/nginx.conf
|
||||||
sed -i 's|error_log /dev/stderr|error_log /var/log/nginx/error.log|' /etc/nginx/nginx.conf
|
sed -i 's|error_log /dev/stderr|error_log /var/log/nginx/error.log|' /etc/nginx/nginx.conf
|
||||||
sed -i 's|access_log /dev/stdout|access_log /var/log/nginx/access.log|' /etc/nginx/nginx.conf
|
sed -i 's|access_log /dev/stdout|access_log /var/log/nginx/access.log|' /etc/nginx/nginx.conf
|
||||||
|
|||||||
Reference in New Issue
Block a user