TimescaleDB + Grafana
TimescaleDB time-series database built on PostgreSQL with Grafana for visualization.
[i]Overview
TimescaleDB extends PostgreSQL with specialized time-series capabilities, combining the reliability and SQL compatibility of PostgreSQL with automatic time-based partitioning, continuous aggregates, and up to 90% data compression. Originally developed by Timescale Inc. to address the limitations of traditional databases when handling massive volumes of time-stamped data, TimescaleDB has become a leading solution for IoT applications, financial markets, and infrastructure monitoring where you need both time-series performance and relational data features. Grafana complements TimescaleDB by providing rich visualization capabilities specifically designed for time-series data, creating dynamic dashboards that can display metrics, events, and trends stored in TimescaleDB hypertables. This combination leverages PostgreSQL's mature ecosystem while delivering the performance characteristics needed for high-volume time-series workloads, with Grafana's templating and alerting features providing operational insights. Organizations managing IoT sensor networks, financial trading systems, or infrastructure monitoring benefit from this stack because it offers the analytical power of SQL joins between time-series and relational data, automatic data lifecycle management through retention policies, and professional-grade visualizations that can handle millions of data points without sacrificing query performance.
[*]Key Features
- [+]Automatic time-based partitioning (hypertables) for optimal query performance across large datasets
- [+]Full PostgreSQL compatibility allowing use of existing PostgreSQL tools, extensions, and ORMs
- [+]Continuous aggregates for real-time materialized views that automatically update as new data arrives
- [+]Data compression achieving 90%+ storage reduction using TimescaleDB's columnar compression
- [+]Native PostgreSQL data source integration in Grafana with optimized time-series query support
- [+]Advanced Grafana templating with dashboard variables for dynamic filtering across time ranges and dimensions
- [+]Built-in data retention policies for automatic deletion of old data based on time or storage constraints
- [+]Time_bucket() functions for efficient time-based aggregations and downsampling in visualizations
[#]Common Use Cases
- [1]IoT sensor data collection and monitoring with contextual device metadata and real-time dashboards
- [2]Financial market data storage combining tick data with reference information and trading analytics
- [3]Infrastructure monitoring for long-term storage of Prometheus metrics with custom business dashboards
- [4]Application performance monitoring with database-backed alerting and historical trend analysis
- [5]Energy management systems tracking consumption patterns with billing integration and forecasting
- [6]Manufacturing process monitoring combining sensor readings with production schedules and quality metrics
- [7]Smart city applications aggregating traffic, weather, and utility data with public-facing dashboards
[!]Prerequisites
- [!]Minimum 2.5GB available RAM (2GB for TimescaleDB, 512MB for Grafana) for production workloads
- [!]Docker and Docker Compose installed with sufficient disk space for time-series data growth
- [!]Ports 3000 (Grafana) and 5432 (TimescaleDB) available on the host system
- [!]Basic SQL knowledge for creating hypertables and time-series queries in TimescaleDB
- [!]Understanding of time-series data concepts like timestamps, metrics, and aggregation windows
- [!]Familiarity with PostgreSQL connection parameters for configuring Grafana data sources
[!]
WARNING: For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms
[$]docker-compose.yml
[docker-compose.yml]
1services: 2 timescaledb: 3 image: timescale/timescaledb:latest-pg164 container_name: timescaledb5 restart: unless-stopped6 environment: 7 POSTGRES_USER: ${POSTGRES_USER}8 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}9 POSTGRES_DB: ${POSTGRES_DB}10 volumes: 11 - timescale_data:/var/lib/postgresql/data12 ports: 13 - "5432:5432"14 networks: 15 - timescale-network1617 grafana: 18 image: grafana/grafana:latest19 container_name: grafana20 restart: unless-stopped21 environment: 22 GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}23 volumes: 24 - grafana_data:/var/lib/grafana25 ports: 26 - "3000:3000"27 depends_on: 28 - timescaledb29 networks: 30 - timescale-network3132volumes: 33 timescale_data: 34 grafana_data: 3536networks: 37 timescale-network: 38 driver: bridge[$].env Template
[.env]
1POSTGRES_USER=postgres2POSTGRES_PASSWORD=changeme3POSTGRES_DB=timeseries4GRAFANA_PASSWORD=admin[i]Usage Notes
- [1]Docs: https://docs.timescale.com/
- [2]Grafana at http://localhost:3000 (admin/admin) | TimescaleDB on port 5432
- [3]Create hypertable: SELECT create_hypertable('metrics', 'time');
- [4]Full PostgreSQL compatibility - use any PostgreSQL client/ORM
- [5]Add Grafana data source: PostgreSQL, host=timescaledb:5432
- [6]Compression: ALTER TABLE metrics SET (timescaledb.compress);
Individual Services(2 services)
Copy individual services to mix and match with your existing compose files.
timescaledb
timescaledb:
image: timescale/timescaledb:latest-pg16
container_name: timescaledb
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- timescale_data:/var/lib/postgresql/data
ports:
- "5432:5432"
networks:
- timescale-network
grafana
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
environment:
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}
volumes:
- grafana_data:/var/lib/grafana
ports:
- "3000:3000"
depends_on:
- timescaledb
networks:
- timescale-network
[>]Quick Start
[terminal]
1# 1. Create the compose file2cat > docker-compose.yml << 'EOF'3services:4 timescaledb:5 image: timescale/timescaledb:latest-pg166 container_name: timescaledb7 restart: unless-stopped8 environment:9 POSTGRES_USER: ${POSTGRES_USER}10 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}11 POSTGRES_DB: ${POSTGRES_DB}12 volumes:13 - timescale_data:/var/lib/postgresql/data14 ports:15 - "5432:5432"16 networks:17 - timescale-network1819 grafana:20 image: grafana/grafana:latest21 container_name: grafana22 restart: unless-stopped23 environment:24 GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}25 volumes:26 - grafana_data:/var/lib/grafana27 ports:28 - "3000:3000"29 depends_on:30 - timescaledb31 networks:32 - timescale-network3334volumes:35 timescale_data:36 grafana_data:3738networks:39 timescale-network:40 driver: bridge41EOF4243# 2. Create the .env file44cat > .env << 'EOF'45POSTGRES_USER=postgres46POSTGRES_PASSWORD=changeme47POSTGRES_DB=timeseries48GRAFANA_PASSWORD=admin49EOF5051# 3. Start the services52docker compose up -d5354# 4. View logs55docker compose logs -f[>]One-Liner
Run this command to download and set up the recipe in one step:
[terminal]
1curl -fsSL https://docker.recipes/api/recipes/timescaledb/run | bash[?]Troubleshooting
- [!]Grafana shows 'database connection failed': Verify POSTGRES_USER and POSTGRES_PASSWORD match in both services and TimescaleDB container is fully started
- [!]TimescaleDB queries are slow on large tables: Ensure tables are converted to hypertables using SELECT create_hypertable('table_name', 'time_column') before inserting data
- [!]Grafana dashboards timeout on large time ranges: Use time_bucket() aggregation functions instead of raw data queries and enable TimescaleDB compression
- [!]TimescaleDB container fails to start with 'data directory not empty': Remove the timescale_data volume or check for conflicting PostgreSQL installations on port 5432
- [!]Grafana shows 'plugin not found' for PostgreSQL: Restart Grafana container as the PostgreSQL data source plugin is built-in and may need reinitialization
- [!]High memory usage in TimescaleDB: Tune shared_buffers and effective_cache_size in postgresql.conf, or add custom configuration via volume mount
Community Notes
Loading...
Loading notes...
## Download Recipe Kit
Get all files in a ready-to-deploy package
Includes docker-compose.yml, .env template, README, and license
## Components
timescaledbgrafana
## Tags
#timescaledb#time-series#postgres#iot#metrics
## Category
Database StacksShortcuts: C CopyF FavoriteD Download