Files
postgres-ts-vectors/README.md
T
maxime.killinger a57c520610
🚀 Docker Build and Push / build-and-push (15) (push) Successful in 2m58s
🚀 Docker Build and Push / build-and-push (16) (push) Successful in 3m39s
🚀 Docker Build and Push / build-and-push (17) (push) Successful in 3m37s
🚀 Docker Build and Push / build-and-push (18) (push) Successful in 3m36s
TimescaleDB 2.30.2 pour PostgreSQL 16 à 18, 2.28.3 gardé pour PostgreSQL 15
- TIMESCALEDB_VERSION passe de 2.28.3 à 2.30.2. Vérifié pour 16, 17 et 18 :
  compilation, tests, et reprise d'une base créée par l'image publiée après
  `ALTER EXTENSION timescaledb UPDATE`.
- TimescaleDB 2.29 a retiré PostgreSQL 15 (`Unsupported PostgreSQL version` à la
  compilation) : `pg15` garde 2.28.3 par TIMESCALEDB_VERSION_PG15.
- Décision 0007, tableau et badge du README, procédure de changement de version.

Une base existante refuse toute requête sur la nouvelle image tant que
l'extension n'est pas mise à niveau : voir docs/exploitation/publication.md.
2026-10-02 18:02:35 +02:00

137 lines
6.1 KiB
Markdown

<h1 align="center">postgres-ts-vectors</h1>
<p align="center">Image Docker de PostgreSQL avec TimescaleDB, VectorChord, pgvector et PostGIS déjà installés.</p>
<p align="center">
<a href="https://gitea.killinger.fr/maxime.killinger/postgres-ts-vectors/actions?workflow=docker.yml"><img src="https://gitea.killinger.fr/maxime.killinger/postgres-ts-vectors/actions/workflows/docker.yml/badge.svg?branch=main" alt="CI"></a>
<img src="https://img.shields.io/badge/PostgreSQL-15%20%C2%B7%2016%20%C2%B7%2017%20%C2%B7%2018-4169E1?style=flat-square&logo=postgresql&logoColor=white" alt="PostgreSQL 15, 16, 17 et 18">
<img src="https://img.shields.io/badge/TimescaleDB-2.30.2-FDB515?style=flat-square&logo=timescale&logoColor=black" alt="TimescaleDB 2.30.2">
<img src="https://img.shields.io/badge/VectorChord-1.1.1-6E56CF?style=flat-square" alt="VectorChord 1.1.1">
<img src="https://img.shields.io/badge/pgvector-0.8-336791?style=flat-square" alt="pgvector 0.8">
<img src="https://img.shields.io/badge/PostGIS-3-5CAE58?style=flat-square" alt="PostGIS 3">
<img src="https://img.shields.io/badge/Docker-une%20image%20par%20version-2496ED?style=flat-square&logo=docker&logoColor=white" alt="Docker, une image par version de PostgreSQL">
</p>
## Présentation
Une image par version majeure de PostgreSQL, prête à servir des séries temporelles, de la
recherche vectorielle et des données géographiques dans la même base :
- **[TimescaleDB](https://www.timescale.com/)** : séries temporelles (hypertables) ;
- **[VectorChord](https://vectorchord.ai/)** et **[pgvector](https://github.com/pgvector/pgvector)** :
type `vector` et index de recherche par similarité ;
- **[PostGIS](https://postgis.net/)** : objets géographiques.
Les extensions sont créées au premier démarrage, dans la base du conteneur. L'image part de
celle de VectorChord, mise à niveau à la construction : [docs/architecture.md](docs/architecture.md).
## Images
Publiées sous `gitea.killinger.fr/maxime.killinger/postgres-ts-vectors`.
| Étiquette | PostgreSQL | TimescaleDB | VectorChord | pgvector | PostGIS |
|---|---|---|---|---|---|
| `pg15` | 15 | 2.28.3 | 1.1.1 | 0.8 | 3 |
| `pg16` | 16 | 2.30.2 | 1.1.1 | 0.8 | 3 |
| `pg17`, `latest` | 17 | 2.30.2 | 1.1.1 | 0.8 | 3 |
| `pg18` | 18 | 2.30.2 | 1.1.1 | 0.8 | 3 |
TimescaleDB et VectorChord sont épinglés ; `pg15` garde la dernière version de TimescaleDB
qui gère PostgreSQL 15
([0007](docs/decisions/0007-postgresql-15-garde-timescaledb-2-28.md)). PostgreSQL, pgvector et PostGIS suivent leurs
versions mineures : les images sont reconstruites dès qu'apt en propose
([Mises à jour](#mises-à-jour)). Les versions exactes se lisent dans un conteneur :
```bash
docker exec ma-base psql -U postgres -Atc "select version()" \
-c "select extname, extversion from pg_extension"
```
## Démarrage rapide
```bash
docker run -d \
--name ma-base \
-e POSTGRES_PASSWORD=motdepasse \
-v donnees_pg:/var/lib/postgresql \
-p 5432:5432 \
gitea.killinger.fr/maxime.killinger/postgres-ts-vectors:pg18
```
Le point de montage du volume dépend de la version de PostgreSQL :
| Étiquette | Monter le volume sur |
|---|---|
| `pg15`, `pg16`, `pg17`, `latest` | `/var/lib/postgresql/data` |
| `pg18` | `/var/lib/postgresql` |
Sur l'autre chemin, les données d'une image jusqu'à PostgreSQL 17 partent dans un volume
anonyme, perdu quand le conteneur est recréé, et l'image `pg18` refuse de démarrer.
## Configuration
| Variable | Rôle | Défaut |
|---|---|---|
| `POSTGRES_PASSWORD` | Mot de passe, obligatoire | aucun |
| `POSTGRES_USER` | Utilisateur | `postgres` |
| `POSTGRES_DB` | Base, où les extensions sont créées | le nom de l'utilisateur |
Ce sont les variables de l'image officielle `postgres`. Une commande qui remplace celle de
l'image doit garder `-c shared_preload_libraries=timescaledb,vchord`, sans quoi TimescaleDB
et VectorChord ne sont pas chargés.
## Utilisation
```sql
-- Série temporelle
CREATE TABLE mesures (time TIMESTAMPTZ NOT NULL, capteur INTEGER, temperature DOUBLE PRECISION);
SELECT create_hypertable('mesures', 'time');
-- Recherche vectorielle
CREATE TABLE documents (id SERIAL PRIMARY KEY, contenu TEXT, embedding vector(1536));
CREATE INDEX ON documents USING vchordrq (embedding vector_l2_ops);
SELECT * FROM documents ORDER BY embedding <-> '[0.1, 0.2, ...]' LIMIT 10;
-- Géographie
CREATE TABLE lieux (id SERIAL PRIMARY KEY, geom geometry(Point, 4326));
SELECT ST_Distance(a.geom, b.geom) FROM lieux a, lieux b WHERE a.id = 1 AND b.id = 2;
```
## Mises à jour
Chaque nuit, la CI teste les images publiées et reconstruit celles pour lesquelles apt
propose des mises à jour : versions mineures de PostgreSQL, pgvector, PostGIS, correctifs
Debian. Une version de TimescaleDB ou de VectorChord se change à la main, car une base
existante doit alors être mise à niveau :
[docs/exploitation/publication.md](docs/exploitation/publication.md).
## Tests
```bash
docker build --build-arg PG_VERSION=18 -t postgres-ts-vectors:pg18 .
./tests.sh postgres-ts-vectors:pg18
```
`tests.sh` démarre l'image, vérifie les extensions, les exerce, redémarre le serveur et,
avec une seconde image en argument, reprend une base créée par celle-ci. La CI lance la même
commande avant de publier. Détail dans [CLAUDE.md](CLAUDE.md).
## Documentation
- [CLAUDE.md](CLAUDE.md) : commandes, conventions, pièges connus.
- [docs/architecture.md](docs/architecture.md) : étapes de construction, démarrage du
conteneur, emplacement des données.
- [docs/exploitation/publication.md](docs/exploitation/publication.md) : CI, mises à jour,
changement de version.
- [docs/decisions/](docs/decisions/) : choix de conception.
- [docs/a-faire.md](docs/a-faire.md) : points ouverts.
## Licences
Le dépôt est sous licence Apache 2.0. Les extensions gardent la leur :
[TimescaleDB](https://github.com/timescale/timescaledb/blob/main/LICENSE),
[VectorChord](https://github.com/tensorchord/VectorChord/blob/main/LICENSE),
[pgvector](https://github.com/pgvector/pgvector/blob/master/LICENSE),
[PostGIS](https://postgis.net/) (GPL v2 ou ultérieure).
Image réalisée par [Maxime Killinger](https://www.linkedin.com/in/maxime-killinger-8504b7b6).