Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/bake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ jobs:
postgis:
- 'postgis/**'
- *shared
timescaledb:
- 'timescaledb/**'
- *shared
pgaudit:
- 'pgaudit/**'
- *shared
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ they are maintained by their respective authors, and PostgreSQL Debian Group
| **[pgAudit](pgaudit)** | PostgreSQL audit extension | [https://github.com/pgaudit/pgaudit](https://github.com/pgaudit/pgaudit) |
| **[pgvector](pgvector)** | Vector similarity search for PostgreSQL | [https://github.com/pgvector/pgvector](https://github.com/pgvector/pgvector) |
| **[PostGIS](postgis)** | Geospatial database extension for PostgreSQL | [https://postgis.net/](https://postgis.net/) |
| **[Timescaledb](timescaledb)** | Time-series database for PostgreSQL | [https://github.com/timescale/timescaledb/](https://github.com/timescale/timescaledb/) |


Extensions are provided only for the OS versions already built by the
Expand Down
36 changes: 36 additions & 0 deletions timescaledb/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# SPDX-FileCopyrightText: Copyright © contributors to CloudNativePG, established as CloudNativePG a Series of LF Projects, LLC.
# SPDX-License-Identifier: Apache-2.0

ARG BASE=ghcr.io/cloudnative-pg/postgresql:18-minimal-trixie
FROM $BASE AS builder

ARG PG_MAJOR
ARG EXT_VERSION

USER 0
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends gnupg postgresql-common apt-transport-https lsb-release wget ca-certificates; \
# Add TimescaleDB package repository
echo "deb https://packagecloud.io/timescale/timescaledb/debian/ $(lsb_release -c -s) main" > /etc/apt/sources.list.d/timescaledb.list; \
wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | gpg --dearmor -o /etc/apt/trusted.gpg.d/timescaledb.gpg; \
apt-get update; \
apt-get install -y --no-install-recommends \
timescaledb-2-oss-postgresql-${PG_MAJOR}=${EXT_VERSION}*
######################################################################
# Final SCRATCH image
######################################################################
FROM scratch
ARG PG_MAJOR

# Licenses
COPY --from=builder /usr/share/doc/timescaledb-2-oss-postgresql-${PG_MAJOR}/copyright /licenses/timescaledb/

# Libraries — .so and bitcode for TimescaleDB
COPY --from=builder /usr/lib/postgresql/${PG_MAJOR}/lib/timescaledb* /lib/
COPY --from=builder /usr/lib/postgresql/${PG_MAJOR}/lib/timescaledb-2* /lib/

# Extension SQL + control files
COPY --from=builder /usr/share/postgresql/${PG_MAJOR}/extension/timescaledb* /share/extension/

USER 65532:65532
104 changes: 104 additions & 0 deletions timescaledb/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# TimescaleDB (Apache 2.0 Edition)

[TimescaleDB](https://github.com/timescale/timescaledb) is an open-source time-series database built on PostgreSQL. It enables fast analytics, efficient storage, and powerful querying for time-series workloads.

**Note**: This image contains only the Apache 2.0 licensed components of TimescaleDB to ensure CNCF licensing compliance. Advanced features requiring the Timescale License (TSL) are not included.

This image provides a convenient way to deploy and manage the open-source core of `TimescaleDB` with
[CloudNativePG](https://cloudnative-pg.io/).

## Usage

### 1. Add the TimescaleDB extension image to your Cluster

Define the `timescaledb` extension under the `postgresql.extensions` section of
your `Cluster` resource. For example:

```yaml
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: cluster-timescaledb
spec:
imageName: ghcr.io/cloudnative-pg/postgresql:18-minimal-trixie
instances: 1

storage:
size: 1Gi

postgresql:
shared_preload_libraries:
- "timescaledb"
parameters:
timescaledb.telemetry_level: 'off'
max_locks_per_transaction: '128'

extensions:
- name: timescaledb
image:
reference: ghcr.io/cloudnative-pg/timescaledb:2.24.0-18-trixie
```

### 2. Enable the extension in a database

You can install `timescaledb` in a specific database by creating or updating a
`Database` resource. For example, to enable it in the `app` database:

```yaml
apiVersion: postgresql.cnpg.io/v1
kind: Database
metadata:
name: cluster-timescaledb-app
spec:
name: app
owner: app
cluster:
name: cluster-timescaledb
extensions:
- name: timescaledb
version: '2.24.0'
```

### 3. Verify installation

Once the database is ready, connect to it with `psql` and run:

```sql
\dx
```

You should see `timescaledb` listed among the installed extensions.

### 4. Create a hypertable

To use TimescaleDB's time-series features, create a hypertable:

```sql
-- Create a regular table
CREATE TABLE sensor_data (
time TIMESTAMPTZ NOT NULL,
sensor_id INTEGER,
temperature DOUBLE PRECISION,
humidity DOUBLE PRECISION
);

-- Convert it to a hypertable
SELECT create_hypertable('sensor_data', 'time');

-- Insert some data
INSERT INTO sensor_data VALUES (NOW(), 1, 21.5, 45.0);
```

## License

This image contains only the Apache 2.0 licensed components of TimescaleDB. Features requiring the Timescale License (TSL) are not included to ensure compliance with CNCF licensing requirements.

All relevant license and copyright information for the `timescaledb` extension
and its dependencies are bundled within the image at:

```text
/licenses/
```

By using this image, you agree to comply with the terms of the licenses
contained therein.
24 changes: 24 additions & 0 deletions timescaledb/metadata.hcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# SPDX-FileCopyrightText: Copyright © contributors to CloudNativePG, established as CloudNativePG a Series of LF Projects, LLC.
# SPDX-License-Identifier: Apache-2.0
metadata = {
name = "timescaledb"
sql_name = "timescaledb"
image_name = "timescaledb"
shared_preload_libraries = ["timescaledb"]
extension_control_path = []
dynamic_library_path = []
ld_library_path = []
auto_update_os_libs = false
required_extensions = []
create_extension = true
versions = {
trixie = {
// renovate: datasource=postgresql depName=timescaledb-2-oss-postgresql-18 versioning=deb
"18" = "2.24.0~debian13-1801"
}
bookworm = {
// renovate: datasource=postgresql depName=timescaledb-2-oss-postgresql-18 versioning=deb
"18" = "2.24.0~debian12-1801"
}
}
}
28 changes: 28 additions & 0 deletions timescaledb/test/chainsaw-test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
apiVersion: chainsaw.kyverno.io/v1alpha1
kind: Test
metadata:
name: verify-timescaledb-extension
spec:
timeouts:
apply: 5s
assert: 3m
delete: 30s
description: Verify TimescaleDB extension is properly installed
steps:
- name: Create a Cluster with the extension
try:
- apply:
file: cluster.yaml
- apply:
file: database.yaml
- assert:
file: cluster-assert.yaml
- assert:
file: database-assert.yaml

- name: Verify extension is installed
try:
- apply:
file: check-extension.yaml
- assert:
file: check-extension-assert.yaml
6 changes: 6 additions & 0 deletions timescaledb/test/check-extension-assert.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
apiVersion: batch/v1
kind: Job
metadata:
name: extension-installed
status:
succeeded: 1
29 changes: 29 additions & 0 deletions timescaledb/test/check-extension.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
apiVersion: batch/v1
kind: Job
metadata:
name: extension-installed
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: data-test
env:
- name: EXT_VERSION
value: ($values.version)
- name: DB_URI
valueFrom:
secretKeyRef:
name: (join('-', [$values.name, 'app']))
key: uri
image: alpine/psql:latest
command: ['sh', '-c']
args:
- |
set -e
DB_URI=$(echo $DB_URI | sed "s|/\*|/|")
test "$(psql "$DB_URI" -tAc "SELECT EXISTS (SELECT FROM pg_catalog.pg_extension WHERE extname = 'timescaledb' AND extversion = '${EXT_VERSION}')" -q)" = "t"
psql "$DB_URI" -c "CREATE TABLE test_hypertable (time TIMESTAMPTZ NOT NULL, value DOUBLE PRECISION);"
psql "$DB_URI" -c "SELECT create_hypertable('test_hypertable', 'time');"
psql "$DB_URI" -c "INSERT INTO test_hypertable VALUES (NOW(), 1.0);"
test "$(psql "$DB_URI" -tAc "SELECT COUNT(*) FROM test_hypertable" -q)" = "1"
8 changes: 8 additions & 0 deletions timescaledb/test/cluster-assert.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: ($values.name)
status:
readyInstances: 1
phase: Cluster in healthy state
image: ($values.pg_image)
14 changes: 14 additions & 0 deletions timescaledb/test/cluster.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: ($values.name)
spec:
imageName: ($values.pg_image)
instances: 1

storage:
size: 1Gi

postgresql:
shared_preload_libraries: ($values.shared_preload_libraries)
extensions: ($values.extensions)
10 changes: 10 additions & 0 deletions timescaledb/test/database-assert.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
apiVersion: postgresql.cnpg.io/v1
kind: Database
metadata:
name: (join('-', [$values.name, 'app']))
status:
applied: true
extensions:
- applied: true
name: ($values.sql_name)
observedGeneration: 1
12 changes: 12 additions & 0 deletions timescaledb/test/database.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: postgresql.cnpg.io/v1
kind: Database
metadata:
name: (join('-', [$values.name, 'app']))
spec:
name: app
owner: app
cluster:
name: ($values.name)
extensions:
- name: ($values.sql_name)
version: ($values.version)