From a09a5bc6aef40afd5089d2eed8853ce485c31736 Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 14:06:35 +0100 Subject: [PATCH] tracearr (#11079) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add tracearr (ct) * Apply suggestion from @tremor021 --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com> --- ct/headers/tracearr | 6 ++ ct/tracearr.sh | 90 +++++++++++++++++ frontend/public/json/tracearr.json | 35 +++++++ install/tracearr-install.sh | 152 +++++++++++++++++++++++++++++ 4 files changed, 283 insertions(+) create mode 100644 ct/headers/tracearr create mode 100644 ct/tracearr.sh create mode 100644 frontend/public/json/tracearr.json create mode 100644 install/tracearr-install.sh diff --git a/ct/headers/tracearr b/ct/headers/tracearr new file mode 100644 index 000000000..aee118c88 --- /dev/null +++ b/ct/headers/tracearr @@ -0,0 +1,6 @@ + ______ + /_ __/________ _________ ____ ___________ + / / / ___/ __ `/ ___/ _ \/ __ `/ ___/ ___/ + / / / / / /_/ / /__/ __/ /_/ / / / / +/_/ /_/ \__,_/\___/\___/\__,_/_/ /_/ + diff --git a/ct/tracearr.sh b/ct/tracearr.sh new file mode 100644 index 000000000..1c4994ca3 --- /dev/null +++ b/ct/tracearr.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: durzo +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/connorgallopo/Tracearr + +APP="Tracearr" +var_tags="${var_tags:-media}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-5}" +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/systemd/system/tracearr.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "tracearr" "connorgallopo/Tracearr"; then + msg_info "Stopping Services" + systemctl stop tracearr postgresql redis + msg_ok "Stopped Services" + + msg_info "Updating pnpm" + PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/connorgallopo/Tracearr/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]' | cut -d'+' -f1)" + export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 + $STD corepack prepare pnpm@${PNPM_VERSION} --activate + msg_ok "Updated pnpm" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tracearr" "connorgallopo/Tracearr" "tarball" "latest" "/opt/tracearr.build" + + msg_info "Building Tracearr" + export TZ=$(cat /etc/timezone) + cd /opt/tracearr.build + $STD pnpm install --frozen-lockfile --force + $STD pnpm turbo telemetry disable + $STD pnpm turbo run build --no-daemon --filter=@tracearr/shared --filter=@tracearr/server --filter=@tracearr/web + rm -rf /opt/tracearr + mkdir -p /opt/tracearr/{packages/shared,apps/server,apps/web,apps/server/src/db} + cp -rf package.json /opt/tracearr/ + cp -rf pnpm-workspace.yaml /opt/tracearr/ + cp -rf pnpm-lock.yaml /opt/tracearr/ + cp -rf apps/server/package.json /opt/tracearr/apps/server/ + cp -rf apps/server/dist /opt/tracearr/apps/server/dist + cp -rf apps/web/dist /opt/tracearr/apps/web/dist + cp -rf packages/shared/package.json /opt/tracearr/packages/shared/ + cp -rf packages/shared/dist /opt/tracearr/packages/shared/dist + cp -rf apps/server/src/db/migrations /opt/tracearr/apps/server/src/db/migrations + cp -rf data /opt/tracearr/data + mkdir -p /opt/tracearr/data/image-cache + rm -rf /opt/tracearr.build + cd /opt/tracearr + $STD pnpm install --prod --frozen-lockfile --ignore-scripts + $STD chown -R tracearr:tracearr /opt/tracearr + msg_ok "Built Tracearr" + + msg_info "Configuring Tracearr" + sed -i "s/^APP_VERSION=.*/APP_VERSION=$(cat /root/.tracearr)/" /data/tracearr/.env + chmod 600 /data/tracearr/.env + chown -R tracearr:tracearr /data/tracearr + msg_ok "Configured Tracearr" + + msg_info "Starting Services" + systemctl start postgresql redis tracearr + msg_ok "Started Services" + msg_ok "Updated successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/frontend/public/json/tracearr.json b/frontend/public/json/tracearr.json new file mode 100644 index 000000000..458ec538b --- /dev/null +++ b/frontend/public/json/tracearr.json @@ -0,0 +1,35 @@ +{ + "name": "Tracearr", + "slug": "tracearr", + "categories": [ + 14 + ], + "date_created": "2025-12-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://github.com/connorgallopo/Tracearr#readme", + "config_path": "", + "website": "https://github.com/connorgallopo/Tracearr", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/tracearr.webp", + "description": "Tracearr is a streaming access manager for Plex, Jellyfin and Emby servers. It answers the question every server owner eventually asks: \"Who's actually using my server, and are they sharing their login?\"", + "install_methods": [ + { + "type": "default", + "script": "ct/tracearr.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 5, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/install/tracearr-install.sh b/install/tracearr-install.sh new file mode 100644 index 000000000..3f75b4c17 --- /dev/null +++ b/install/tracearr-install.sh @@ -0,0 +1,152 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: durzo +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/connorgallopo/Tracearr + +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 redis-server +msg_ok "Installed Dependencies" + +NODE_VERSION="22" setup_nodejs +PG_VERSION="18" setup_postgresql + +msg_info "Installing pnpm" +PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/connorgallopo/Tracearr/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]' | cut -d'+' -f1)" +export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 +$STD corepack enable pnpm +$STD corepack prepare pnpm@${PNPM_VERSION} --activate +msg_ok "Installed pnpm" + +msg_info "Installing TimescaleDB" +setup_deb822_repo \ + "timescaledb" \ + "https://packagecloud.io/timescale/timescaledb/gpgkey" \ + "https://packagecloud.io/timescale/timescaledb/debian" \ + "$(get_os_info codename)" + +$STD apt install -y \ + timescaledb-2-postgresql-18 \ + timescaledb-tools \ + timescaledb-toolkit-postgresql-18 +total_ram_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}') +ram_for_tsdb=$((total_ram_kb / 1024 / 2)) +$STD timescaledb-tune -yes -memory "$ram_for_tsdb"MB +$STD systemctl restart postgresql +msg_ok "Installed TimescaleDB" + +PG_DB_NAME="tracearr_db" PG_DB_USER="tracearr" PG_DB_EXTENSIONS="timescaledb,timescaledb_toolkit" setup_postgresql_db +fetch_and_deploy_gh_release "tracearr" "connorgallopo/Tracearr" "tarball" "latest" "/opt/tracearr.build" + +msg_info "Building Tracearr" +export TZ=$(cat /etc/timezone) +cd /opt/tracearr.build +$STD pnpm install --frozen-lockfile --force +$STD pnpm turbo telemetry disable +$STD pnpm turbo run build --no-daemon --filter=@tracearr/shared --filter=@tracearr/server --filter=@tracearr/web +mkdir -p /opt/tracearr/{packages/shared,apps/server,apps/web,apps/server/src/db} +cp -rf package.json /opt/tracearr/ +cp -rf pnpm-workspace.yaml /opt/tracearr/ +cp -rf pnpm-lock.yaml /opt/tracearr/ +cp -rf apps/server/package.json /opt/tracearr/apps/server/ +cp -rf apps/server/dist /opt/tracearr/apps/server/dist +cp -rf apps/web/dist /opt/tracearr/apps/web/dist +cp -rf packages/shared/package.json /opt/tracearr/packages/shared/ +cp -rf packages/shared/dist /opt/tracearr/packages/shared/dist +cp -rf apps/server/src/db/migrations /opt/tracearr/apps/server/src/db/migrations +cp -rf data /opt/tracearr/data +mkdir -p /opt/tracearr/data/image-cache +rm -rf /opt/tracearr.build +cd /opt/tracearr +$STD pnpm install --prod --frozen-lockfile --ignore-scripts +msg_ok "Built Tracearr" + +msg_info "Configuring Tracearr" +$STD useradd -r -s /bin/false -U tracearr +$STD chown -R tracearr:tracearr /opt/tracearr +install -d -m 750 -o tracearr -g tracearr /data/tracearr +export JWT_SECRET=$(openssl rand -hex 32) +export COOKIE_SECRET=$(openssl rand -hex 32) +cat </data/tracearr/.env +DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME} +REDIS_URL=redis://127.0.0.1:6379 +PORT=3000 +HOST=0.0.0.0 +NODE_ENV=production +TZ=${TZ} +LOG_LEVEL=info +JWT_SECRET=$JWT_SECRET +COOKIE_SECRET=$COOKIE_SECRET +APP_VERSION=$(cat /root/.tracearr) +#CORS_ORIGIN=http://localhost:5173 +#MOBILE_BETA_MODE=true +EOF +chmod 600 /data/tracearr/.env +chown -R tracearr:tracearr /data/tracearr +msg_ok "Configured Tracearr" + +msg_info "Creating Services" +cat </data/tracearr/prestart.sh +#!/usr/bin/env bash +# ============================================================================= +# Tune PostgreSQL for available resources (runs every startup) +# ============================================================================= +# timescaledb-tune automatically optimizes PostgreSQL settings based on +# available RAM and CPU. Safe to run repeatedly - recalculates if resources change. +if command -v timescaledb-tune &> /dev/null; then + total_ram_kb=\$(grep MemTotal /proc/meminfo | awk '{print \$2}') + ram_for_tsdb=\$((total_ram_kb / 1024 / 2)) + timescaledb-tune -yes -memory "\$ram_for_tsdb"MB --quiet 2>/dev/null \ + || echo "Warning: timescaledb-tune failed (non-fatal)" +fi +# ============================================================================= +# Ensure TimescaleDB decompression limit is set (for existing databases) +# ============================================================================= +# This setting allows migrations to modify compressed hypertable data. +# Without it, bulk UPDATEs on compressed sessions will fail with +# "tuple decompression limit exceeded" errors. +pg_config_file="/etc/postgresql/18/main/postgresql.conf" +if [ -f \$pg_config_file ]; then + if ! grep -q "max_tuples_decompressed_per_dml_transaction" \$pg_config_file; then + echo "" >> \$pg_config_file + echo "# Allow unlimited tuple decompression for migrations on compressed hypertables" >> \$pg_config_file + echo "timescaledb.max_tuples_decompressed_per_dml_transaction = 0" >> \$pg_config_file + fi +fi +systemctl restart postgresql +EOF +chmod +x /data/tracearr/prestart.sh +cat </lib/systemd/system/tracearr.service +[Unit] +Description=Tracearr Web Server +After=network.target postgresql.service redis-server.service + +[Service] +Type=simple +KillMode=control-group +EnvironmentFile=/data/tracearr/.env +WorkingDirectory=/opt/tracearr +ExecStartPre=+/data/tracearr/prestart.sh +ExecStart=node /opt/tracearr/apps/server/dist/index.js +Restart=on-failure +RestartSec=10 +User=tracearr + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now postgresql redis-server tracearr +msg_ok "Created Services" + +motd_ssh +customize +cleanup_lxc