Files
postgres-ts-vectors/docs/exploitation/publication.md
T
maxime.killinger 7de55c5655
🚀 Docker Build and Push / build-and-push (15) (push) Successful in 5m29s
🚀 Docker Build and Push / build-and-push (16) (push) Successful in 6m10s
🚀 Docker Build and Push / build-and-push (17) (push) Successful in 5m20s
🚀 Docker Build and Push / build-and-push (18) (push) Successful in 5m21s
PG18 de retour, mises à jour nocturnes, tests de reprise et documentation
Image
- Étape `base` commune : tous les paquets sont mis à niveau (PostgreSQL à la
  dernière mineure, pgvector, Debian). L'image de base de VectorChord restait
  figée à la version de sa publication.
- En-têtes du serveur épinglés sur la version du serveur installé. PG18 avait
  été retiré parce que TimescaleDB, compilé avec des en-têtes 18.6, était chargé
  par un serveur 18.3 (`undefined symbol: palloc0_mul`).
- Sonde de santé avec l'utilisateur et la base du conteneur : en `postgres`,
  elle écrivait une erreur FATAL au journal dès que POSTGRES_USER était défini.
- Label `base.name` corrigé : il reprenait la version du paquet au lieu de la
  version majeure.

CI
- PG18 ajouté à la matrice.
- Exécution nocturne : apt est interrogé dans l'image publiée ; elle n'est
  reconstruite et republiée que s'il lui reste des mises à jour, sinon elle est
  seulement testée. Lancement manuel possible.
- `docker-build.yml` supprimé : l'ancien workflow à actions externes tournait
  encore à chaque push, en double de `docker.yml`.
- `paths-ignore` : un push de documentation seule ne lance pas la CI.
- Labels `version`, `url` et `fr.killinger.apt-refresh`.

Tests
- `tests.sh`, la même commande en local et en CI : utilisateur et base autres
  que `postgres`, version majeure du serveur, présence des cinq extensions,
  redémarrage, et reprise d'une base créée par l'image publiée.

Documentation
- README en vitrine, CLAUDE.md, docs/architecture.md,
  docs/exploitation/publication.md, six décisions, docs/a-faire.md.
2026-10-02 17:55:42 +02:00

5.5 KiB

Publication et mises à jour

Les images sont construites, testées et publiées par la CI (.gitea/workflows/docker.yml), jamais à la main. Un push sur main est une publication : il remplace les quatre images, dont latest. Personne ne pousse sans demande explicite de l'utilisateur.

Déclencheurs

Déclencheur Effet
Push sur main Construction, tests et publication des quatre versions. Sans effet si tous les fichiers modifiés sont des .md ou sous docs/
Chaque nuit, 3 h 30 UTC Tests des images publiées ; reconstruction et publication de celles qui ont des mises à jour
Lancement manuel (workflow_dispatch) Comme un push

Chaîne de publication

Un job par version de PostgreSQL (15, 16, 17, 18), sans action externe (0004) :

  1. Récupération du seul commit concerné et connexion au registre.
  2. Recherche des mises à jour. L'image publiée est tirée, et apt y simule une mise à niveau. S'il reste des paquets à mettre à niveau, ou si l'image n'a jamais été publiée, une nouvelle clé APT_REFRESH est tirée de l'heure. Sinon la clé de l'image publiée, lue dans son label fr.killinger.apt-refresh, est reprise (0005).
  3. Construction avec docker build --pull, par le démon Docker du runner. Avec une clé reprise, tout sort du cache. Avec une clé nouvelle, les paquets sont mis à niveau et TimescaleDB est recompilé. La nuit, cette étape est sautée quand l'image est à jour.
  4. Tests par tests.sh, avec l'image publiée comme image précédente : la nouvelle image doit reprendre une base créée par celle qu'elle remplace. La nuit, sans reconstruction, c'est l'image publiée elle-même qui est testée.
  5. Publication de pgN, seulement si les tests passent, puis de latest pour PostgreSQL 17 (0006).
  6. Nettoyage : cache de construction borné à 8 Go, images sans étiquette supprimées.

La CI ne déclenche aucun déploiement. Un conteneur passe à la nouvelle image quand son exploitant la tire et le recrée.

Secret du dépôt Usage
secrets.DOCKER_TOKEN Connexion au registre Gitea (compte maxime.killinger)

Ce qui se met à jour seul, et ce qui ne le fait pas

Composant Mise à jour
PostgreSQL (version mineure), pgvector, PostGIS, paquets Debian Automatique, la nuit qui suit leur arrivée dans apt
TimescaleDB, VectorChord À la main, dans le Dockerfile (0003)
Nouvelle version majeure de PostgreSQL À la main, dans la matrice de la CI

Une mise à jour automatique ne demande rien à l'exploitant d'une base : le conteneur recréé repart sur ses données. Les extensions installées gardent la version de leurs objets SQL tant qu'on ne les met pas à niveau, ce qui reste facultatif pour pgvector et PostGIS :

ALTER EXTENSION vector UPDATE;
SELECT postgis_extensions_upgrade();

Changer la version de TimescaleDB

  1. Construire et tester en local contre l'image publiée, pour chaque version de PostgreSQL :
    docker build --build-arg PG_VERSION=17 --build-arg TIMESCALEDB_VERSION=2.30.2 -t postgres-ts-vectors:essai .
    docker pull gitea.killinger.fr/maxime.killinger/postgres-ts-vectors:pg17
    ./tests.sh postgres-ts-vectors:essai gitea.killinger.fr/maxime.killinger/postgres-ts-vectors:pg17
    
    Une version de TimescaleDB qui abandonne une version de PostgreSQL échoue à la compilation : cette version de PostgreSQL sort alors de la matrice, ou garde l'ancienne version de TimescaleDB.
  2. Changer TIMESCALEDB_VERSION dans le Dockerfile, le tableau et le badge du README.md.
  3. Prévenir les exploitants avant de pousser. Dès qu'un conteneur est recréé sur la nouvelle image, sa base refuse toute requête jusqu'à l'exécution de :
    docker exec -it <conteneur> psql -X -U <utilisateur> -d <base> -c 'ALTER EXTENSION timescaledb UPDATE'
    
    La commande est à passer dans chaque base qui a l'extension. -X et une session neuve sont nécessaires : l'instruction doit être la première de la session.

Changer la version de VectorChord

Elle fait partie de l'étiquette de l'image de base. Vérifier que TensorChord publie tensorchord/vchord-postgres:pgN-vX.Y.Z pour les quatre versions de PostgreSQL, changer VCHORD_VERSION dans le Dockerfile, le tableau et le badge du README.md, puis tester comme pour TimescaleDB. Côté base : ALTER EXTENSION vchord UPDATE.

Vérifier une image publiée

IMAGE=gitea.killinger.fr/maxime.killinger/postgres-ts-vectors:pg17
docker pull "$IMAGE"

# Commit, date de construction, clé de mise à jour, image de base
docker image inspect "$IMAGE" -f '{{json .Config.Labels}}'

# Version du serveur et des paquets d'extensions
docker run --rm --entrypoint sh "$IMAGE" -c \
  'postgres --version; dpkg-query -W -f "\${Package} \${Version}\n" "postgresql-$PG_MAJOR-*" | grep " ."'

# La suite de tests, sur l'image publiée
./tests.sh "$IMAGE"
Label Contenu
org.opencontainers.image.revision Commit du dépôt qui a construit l'image
org.opencontainers.image.created Date de construction
org.opencontainers.image.version Étiquette pgN
org.opencontainers.image.base.name Image de VectorChord dont elle part
fr.killinger.apt-refresh Clé de la dernière mise à niveau des paquets, à l'heure UTC