From d0fea0cea6d221962fc1e1cf8f14994ea74c93ab Mon Sep 17 00:00:00 2001 From: Nathan Date: Sat, 18 Apr 2026 14:37:36 -0400 Subject: [PATCH] feat: add Tracearr PostgreSQL 18 deployment configuration with TimescaleDB and Redis services --- nodes/heimdall/tracearr/compose.yaml | 103 +++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 nodes/heimdall/tracearr/compose.yaml diff --git a/nodes/heimdall/tracearr/compose.yaml b/nodes/heimdall/tracearr/compose.yaml new file mode 100644 index 0000000..dbcda52 --- /dev/null +++ b/nodes/heimdall/tracearr/compose.yaml @@ -0,0 +1,103 @@ +# Tracearr - PostgreSQL 18 Deployment (Experimental) +# +# WARNING: NEW INSTALLATIONS ONLY +# Do NOT use with existing data volumes. PostgreSQL 18 data format is +# incompatible with PostgreSQL 15/16. Delete or rename old volumes first. +# +# Uses PostgreSQL 18 with TimescaleDB HA image (includes Toolkit extension). +# +# REQUIREMENTS: +# - ~1GB RAM for Tracearr container +# - Secrets must be generated manually (see below) +# +# DEPLOY: +# # 1. Generate secrets +# echo "JWT_SECRET=$(openssl rand -hex 32)" > .env +# echo "COOKIE_SECRET=$(openssl rand -hex 32)" >> .env +# +# # 2. Start +# docker compose -f docker-compose.pg18.yml up -d +# +# OPTIONAL ENVIRONMENT VARIABLES: +# PORT=3000 # External port mapping +# TZ=America/New_York # Timezone +# DB_PASSWORD=tracearr # Database password +# LOG_LEVEL=info # Log level (debug, info, warn, error) + +services: + tracearr: + image: ghcr.io/connorgallopo/tracearr:latest + container_name: tracearr + ports: + - "${PORT:-3000}:3000" + environment: + - NODE_ENV=production + - PORT=3000 + - HOST=0.0.0.0 + - TZ=${TZ:-UTC} + - DATABASE_URL=postgres://tracearr:${DB_PASSWORD:-tracearr}@timescale:5432/tracearr + - REDIS_URL=redis://redis:6379 + - JWT_SECRET=${JWT_SECRET} + - COOKIE_SECRET=${COOKIE_SECRET} + - CORS_ORIGIN=${CORS_ORIGIN:-*} + - LOG_LEVEL=${LOG_LEVEL:-info} + # - DATABASE_POOL_MAX=50 # Database connection pool size (default: 50) + depends_on: + timescale: + condition: service_healthy + redis: + condition: service_healthy + volumes: + - /mnt/appdata/tracearr/backups:/data/backup + restart: unless-stopped + networks: + - tracearr-network + - proxy-net + + timescale: + # TimescaleDB HA with PostgreSQL 18 - pinned for stability + image: timescale/timescaledb-ha:pg18.1-ts2.25.0 + container_name: tracearr-db + shm_size: 512mb # Required for PostgreSQL shared memory (increase for large imports) + ulimits: + nofile: + soft: 65536 + hard: 65536 # TimescaleDB chunks require many file descriptors + # Allow unlimited tuple decompression for migrations on compressed hypertables + # Increase lock table size for large imports (Tautulli imports with many TimescaleDB chunks) + command: postgres -c timescaledb.license=timescale -c timescaledb.max_tuples_decompressed_per_dml_transaction=0 -c max_locks_per_transaction=4096 -c timescaledb.telemetry_level=off + environment: + - POSTGRES_USER=tracearr + - POSTGRES_PASSWORD=${DB_PASSWORD:-tracearr} + - POSTGRES_DB=tracearr + volumes: + - /mnt/appdata/timescale/data:/home/postgres/pgdata/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U tracearr"] + interval: 10s + timeout: 5s + retries: 5 + restart: unless-stopped + networks: + - tracearr-network + + redis: + image: redis:8-alpine + container_name: tracearr-redis + command: redis-server --appendonly yes + volumes: + - /mnt/appdata/tracearr/redis-data:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + restart: unless-stopped + networks: + - tracearr-network + +networks: + tracearr-network: + driver: bridge + proxy-net: + external: true \ No newline at end of file