From 6fd643a3807db3cb343bb57a331457b00d97e870 Mon Sep 17 00:00:00 2001 From: Graham McIntie Date: Sat, 14 Feb 2026 10:20:11 -0600 Subject: [PATCH] feat: add TimescaleDB to nix dev shell - Use postgresql_16.withPackages to include timescaledb extension - Add shared_preload_libraries to PostgreSQL config - Enable TimescaleDB for both dev and test databases - Disable TimescaleDB telemetry in dev --- nix/shell.nix | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/nix/shell.nix b/nix/shell.nix index c4871a93..1723a504 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -26,6 +26,9 @@ }: let + # PostgreSQL with TimescaleDB extension + pg = postgresql_16.withPackages (ps: [ ps.timescaledb ]); + # PostgreSQL data directory (local to project) pgDataDir = ".nix-postgres"; pgPort = "5432"; @@ -53,7 +56,7 @@ let # Initialize PostgreSQL if needed if [ ! -d "${pgDataDir}" ]; then echo "📦 Initializing PostgreSQL database..." - ${postgresql_16}/bin/initdb -D ${pgDataDir} -U $USER --encoding=UTF8 --locale=en_US.UTF-8 + ${pg}/bin/initdb -D ${pgDataDir} -U $USER --encoding=UTF8 --locale=en_US.UTF-8 # Configure PostgreSQL cat >> ${pgDataDir}/postgresql.conf << EOF @@ -63,20 +66,23 @@ let fsync = off # Faster for development (DO NOT use in production) synchronous_commit = off full_page_writes = off + # TimescaleDB + shared_preload_libraries = 'timescaledb' + timescaledb.telemetry_level = off EOF fi # Check if PostgreSQL is already running on this port - if ${postgresql_16}/bin/pg_isready -h ${pgHost} -p ${pgPort} > /dev/null 2>&1; then + if ${pg}/bin/pg_isready -h ${pgHost} -p ${pgPort} > /dev/null 2>&1; then echo "✓ PostgreSQL already running on port ${pgPort}" else # Start PostgreSQL echo "🐘 Starting PostgreSQL on port ${pgPort}..." - ${postgresql_16}/bin/pg_ctl -D ${pgDataDir} -l ${pgDataDir}/logfile -o "-p ${pgPort}" start + ${pg}/bin/pg_ctl -D ${pgDataDir} -l ${pgDataDir}/logfile -o "-p ${pgPort}" start # Wait for PostgreSQL to be ready for i in {1..30}; do - if ${postgresql_16}/bin/pg_isready -h ${pgHost} -p ${pgPort} > /dev/null 2>&1; then + if ${pg}/bin/pg_isready -h ${pgHost} -p ${pgPort} > /dev/null 2>&1; then break fi if [ $i -eq 30 ]; then @@ -90,22 +96,24 @@ let fi # Create postgres role if it doesn't exist (needed by some tools) - ${postgresql_16}/bin/psql -h ${pgHost} -p ${pgPort} -U $USER -d postgres -tc \ + ${pg}/bin/psql -h ${pgHost} -p ${pgPort} -U $USER -d postgres -tc \ "SELECT 1 FROM pg_roles WHERE rolname='postgres'" | grep -q 1 || \ - ${postgresql_16}/bin/psql -h ${pgHost} -p ${pgPort} -U $USER -d postgres -c \ + ${pg}/bin/psql -h ${pgHost} -p ${pgPort} -U $USER -d postgres -c \ "CREATE ROLE postgres WITH SUPERUSER LOGIN;" # Create development and test databases for db in towerops_dev towerops_test; do - ${postgresql_16}/bin/psql -h ${pgHost} -p ${pgPort} -U $USER -d postgres -tc \ + ${pg}/bin/psql -h ${pgHost} -p ${pgPort} -U $USER -d postgres -tc \ "SELECT 1 FROM pg_database WHERE datname='$db'" | grep -q 1 || \ - ${postgresql_16}/bin/createdb -h ${pgHost} -p ${pgPort} -U $USER $db + ${pg}/bin/createdb -h ${pgHost} -p ${pgPort} -U $USER $db done - # Enable TimescaleDB extension (dev database only, test uses plain PostgreSQL) - ${postgresql_16}/bin/psql -h ${pgHost} -p ${pgPort} -U $USER -d towerops_dev -c \ - "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" 2>/dev/null || \ - echo "⚠️ TimescaleDB not available (optional for development)" + # Enable TimescaleDB extension for dev and test databases + for db in towerops_dev towerops_test; do + ${pg}/bin/psql -h ${pgHost} -p ${pgPort} -U $USER -d $db -c \ + "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" 2>/dev/null || \ + echo "⚠️ TimescaleDB not available for $db (optional)" + done echo "✓ PostgreSQL started successfully" @@ -155,7 +163,7 @@ let # Stop PostgreSQL if [ -d "${pgDataDir}" ]; then - ${postgresql_16}/bin/pg_ctl -D ${pgDataDir} stop -m fast 2>/dev/null || true + ${pg}/bin/pg_ctl -D ${pgDataDir} stop -m fast 2>/dev/null || true echo "✓ PostgreSQL stopped" fi @@ -211,8 +219,8 @@ mkShell { # Elixir/Erlang elixir - # Databases - postgresql_16 + # Databases (PostgreSQL with TimescaleDB) + pg redis # SNMP tools