diff --git a/ct/headers/tracearr b/ct/headers/tracearr new file mode 100644 index 000000000..cec64cede --- /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..cf77b25ec --- /dev/null +++ b/ct/tracearr.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/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" + + PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/connorgallopo/Tracearr/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')" + NODE_VERSION="22" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs + 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" + 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..0e729d977 --- /dev/null +++ b/frontend/public/json/tracearr.json @@ -0,0 +1,35 @@ +{ + "name": "Tracearr", + "slug": "tracearr", + "categories": [ + 13 + ], + "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..57c71d715 --- /dev/null +++ b/install/tracearr-install.sh @@ -0,0 +1,151 @@ +#!/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" + +PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/connorgallopo/Tracearr/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')" +NODE_VERSION="22" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs +PG_VERSION="18" setup_postgresql + +msg_info "Installing TimescaleDB" +setup_deb822_repo \ + "timescaledb" \ + "https://packagecloud.io/timescale/timescaledb/gpgkey" \ + "https://packagecloud.io/timescale/timescaledb/debian" \ + "$(get_os_info codename)" \ + "main" +$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" + +msg_info "Creating PostgreSQL Database" +PG_DB_NAME="tracearr" PG_DB_USER="tracearr" PG_DB_EXTENSIONS="timescaledb,timescaledb_toolkit" setup_postgresql_db +msg_ok "Created PostgreSQL Database" + +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 +systemctl enable -q --now redis-server +systemctl enable -q --now tracearr +msg_ok "Created Services" + +motd_ssh +customize +cleanup_lxc