Base de données

Extensions PostgreSQL

Kuunda Cloud s’aligne sur le modèle que les équipes attendent d’un Postgres managé : image riche, preload minimal, activation à la demande. Le tenant est un schéma proj_* — pas une base isolée. Cela change où l’on peut installer une extension.

PostgreSQL 16Schéma extensionsCORE inclusDedicated : à la demande

1. Trois couches (à ne pas confondre)

1 · Image

Paquet présent

L’extension apparaît dans pg_available_extensions. Elle n’est pas encore créée dans la base.

2 · Preload

Démarrage Postgres

Seul pg_stat_statements est préchargé. Pas de pg_cron par défaut.

3 · CREATE

Activation

CORE et optionnelles au provisionnement. Le reste : bouton console sur instance dédiée, jamais via l’éditeur SQL.

2. Pool partagé vs instance dédiée

Une extension PostgreSQL est au niveau de la base, pas du schéma. Sur le pool partagé, plusieurs projets proj_* partagent la même base : un CREATE EXTENSION les toucherait tous.

OffreCatalogueInstallation
Pool partagéLecture : CORE + optionnelles déjà crééesRefusée (contactez le support pour une instance dédiée)
Dédié / clusterIntersection allowlist ∩ paquets de l’instanceDatabase → Extensions, une extension à la fois

Pourquoi le bouton est grisé

Sur un projet partagé, l’UI affiche le catalogue mais n’installe rien. Ce n’est pas un oubli : c’est la frontière d’isolation entre tenants.

3. Dans la console

  1. Projet → Database → Extensions
  2. Consulter les extensions déjà installées (schéma extensions sauf exception ci-dessous)
  3. Instance dédiée : choisir une extension packagée, puis installer. Les dépendances (ex. PostGIS avant raster) sont posées sans CASCADE

Éditeur SQL

CREATE EXTENSION et DROP EXTENSION sont refusés dans l’éditeur. Passez par l’écran Extensions. Ne créez pas de tables dans le schéma extensions.

4. SQL, search_path et API

Après création, les types et fonctions sont en général dans extensions. Le search_path du projet est :

proj_<id_sans_tirets>, public, extensions

L’API REST ajoute le même extra-search-path (public, extensions). Vous pouvez donc écrire citext ou vector sans préfixe, comme sur un projet Supabase.

-- Exemple une fois citext activée (instance dédiée)
CREATE TABLE contacts (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  email citext NOT NULL UNIQUE
);

Schémas hors API REST

L’API REST n’expose que public et proj_*. Jamais extensions, graphql, topology, tiger, cron et net dans pgrst.db_schemas. GraphQL et PostGIS restent utilisables en SQL ; ils ne deviennent pas des collections REST.

plpgsql est le langage natif de PostgreSQL : il n’apparaît pas comme une ligne du catalogue UI.

5. Catalogue

La console ne propose que les noms packagés sur l’instance et autorisés. Une extension absente de pg_available_extensions n’est pas listée.

Toujours là (CORE)

Créées au provisionnement (le projet n’est pas livré sans elles). Présentes sur le pool partagé comme sur le dédié. Pas de bouton « installer » : elles le sont déjà.

ExtensionRôle
uuid-osspGénération d’UUID (uuid_generate_v4, etc.).
pgcryptoHachage, chiffrement, gen_random_uuid().
pg_trgmSimilarité trigramme, index GIN/GiST pour la recherche floue.

Optionnelles (provisionneur)

Posées si le paquet est disponible. pg_stat_statements exige le preload (déjà en place). pg_graphql vit dans son propre schéma.

ExtensionRôle
vectorEmbeddings et recherche de similarité (pgvector).
pg_stat_statementsStatistiques d’exécution SQL (préchargée au démarrage).
pg_graphqlAPI GraphQL (schéma graphql, hors API REST).

À la demande — contrib (instance dédiée)

Extensions du PostgreSQL 16 standard, activables depuis la console sur dédié / cluster.

ExtensionRôle
amcheckVérification d’intégrité des index B-tree.
autoincTrigger de compteur automatique (contrib historique).
bloomIndex Bloom pour filtres d’égalité multi-colonnes.
btree_ginClasses d’opérateurs B-tree pour les index GIN.
btree_gistClasses d’opérateurs B-tree pour les index GiST.
citextTexte insensible à la casse (e-mails, identifiants).
cubeType cube multidimensionnel (requis par earthdistance).
dict_intDictionnaire de recherche plein texte pour les entiers.
dict_xsynDictionnaire de synonymes pour le plein texte.
earthdistanceDistance entre points sur la sphère (dépend de cube).
fuzzystrmatchSoundex, Levenshtein, metaphone (requis par tiger).
hstorePaires clé/valeur dans une colonne.
insert_usernameTrigger qui enregistre l’utilisateur courant.
intaggAgrégats d’entiers (historique).
intarrayOpérations et index sur les tableaux d’entiers.
isnTypes ISBN / ISSN / EAN et contrôles associés.
ltreeChemins hiérarchiques (catégories, arbres).
moddatetimeTrigger updated_at automatique.
old_snapshotInspection des snapshots MVCC anciens.
pageinspectInspection bas niveau des pages (admin).
pg_buffercacheContenu du cache de tampons PostgreSQL.
pg_freespacemapCarte de l’espace libre.
pg_prewarmPréchargement de relations en cache.
pg_visibilityCarte de visibilité des tuples.
pg_walinspectInspection du WAL.
pgrowlocksVerrous de lignes en cours.
pgstattupleStatistiques de fragmentation des tables.
refintTriggers d’intégrité référentielle (historique).
segType intervalle / segment de nombres.
sslinfoInformations sur la session SSL.
tablefunccrosstab et fonctions de tableau croisé.
tcnTriggered change notification.
tsm_system_rowsTABLESAMPLE SYSTEM_ROWS.
tsm_system_timeTABLESAMPLE SYSTEM_TIME.
unaccentSuppression des accents pour la recherche.

À la demande — image Kuunda (PostGIS, etc.)

Paquets de l’image tenants. PostGIS peut prendre 1 à 2 minutes et de la RAM. Ne l’installez pas sur le pool partagé (l’UI refuse).

ExtensionRôle
postgisTypes et fonctions géographiques (schéma extensions).
postgis_rasterRasters PostGIS (dépend de postgis).
postgis_sfcgalGéométrie 3D SFCGAL si le paquet est présent sur l’instance.
postgis_topologyTopologie PostGIS (schéma topology, hors API REST).
postgis_tiger_geocoderGéocodeur TIGER (USA). Schémas tiger / tiger_data.
address_standardizerNormalisation d’adresses postales.
address_standardizer_data_usJeu de règles US (dépend de address_standardizer).
hypopgIndex hypothétiques pour EXPLAIN.
pg_repackRéorganisation de tables sans verrou exclusif long.

Packagées, pas d’UI (dormantes)

ExtensionRôle
pg_cronJobs SQL planifiés. Pas d’UI. Preload uniquement sur demande ops.
pgauditAudit SQL. Packagé, pas d’activation console.

Jamais proposées

Isolation, surface d’attaque ou boot. Absentes de l’allowlist, y compris en SQL éditeur.

ExtensionRôle
dblinkRequêtes vers une autre base (fuite d’isolation).
postgres_fdwForeign Data Wrapper PostgreSQL.
file_fdwLecture de fichiers du serveur.
httpAppels HTTP depuis SQL.
pg_netHTTP asynchrone (Supabase).
wrappersWrappers FDW Supabase.
pgsodiumCrypto / vault historique Supabase.
supabase_vaultCoffre de secrets Supabase.
plv8JavaScript dans le serveur.
pljavaJava dans le serveur.
pllsLiveScript dans le serveur.
plcoffeeCoffeeScript dans le serveur.
adminpackOutils admin pgAdmin.
loLarge objects côté serveur.
xml2XML historique (risques).
pg_surgeryRéparation destructive de pages.
pg_plan_filterFiltrage de plans (non supporté).
safeupdateGarde UPDATE/DELETE sans WHERE (non packagée).
supautilsUtilitaires internes d’image tierce.

Volontairement absentes de l’image

Pas de clone « tout Supabase ». Parmi les absents : pgroongarumpgroutingpgjwtpgmqindex_advisorpg_partmanpg_jsonschemapg_hashidspg_tle*_wrapper.

6. Dépendances et schémas imposés

Kuunda installe les dépendances listées, sans CASCADE.

ExtensionAvant
postgis_topologypostgis
postgis_rasterpostgis
postgis_sfcgalpostgis
postgis_tiger_geocoderpostgis, fuzzystrmatch
address_standardizer_data_usaddress_standardizer
earthdistancecube

Certaines extensions ne sont pas relogeables dans extensions (fichier .control) :

ExtensionSchéma(s)
pg_graphqlgraphql, graphql_public
postgis_topologytopology
postgis_tiger_geocodertiger, tiger_data
pg_croncron (si activé ops)

postgis_tiger_geocoder

Le script d’install lit le search_path par défaut de la base pour trouver le type geometry (PostGIS dans extensions). La console gère cet ordre. Géocodage US uniquement.

7. Import depuis Supabase / pg_dump

L’import réécrit les références extensions.* pour coller au search_path Kuunda. Les CREATE EXTENSION du dump ne sont pas rejoués tels quels : installez d’abord via Database → Extensions (dédié) les pièces nécessaires (pgcrypto est déjà CORE).

Guide : Migration Supabase · Import de données.

8. Questions fréquentes

Puis-je coller CREATE EXTENSION vector comme chez Supabase ?

Sur dédié : utilisez l’UI (équivalent sûr). Sur le pool partagé : vector est déjà posé au provisionnement ; un second CREATE depuis l’éditeur est bloqué.

Où sont uuid-ossp / pgcrypto si je viens de public ?

Les nouvelles créations vont dans extensions. Kuunda ne déplace pas une extension déjà créée dans public. Le search_path couvre les deux.

Combien de temps pour PostGIS ?

Jusqu’à environ deux minutes. Un seul CREATE à la fois ; un verrou côté plateforme évite les courses.

Comment obtenir citext / PostGIS sur un projet actuel ?

Les projets du pool partagé restent en lecture catalogue. Il faut une instance dédiée (support / évolution d’offre), puis l’écran Extensions.

Ouvrir la console