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.
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.
| Offre | Catalogue | Installation |
|---|---|---|
| Pool partagé | Lecture : CORE + optionnelles déjà créées | Refusée (contactez le support pour une instance dédiée) |
| Dédié / cluster | Intersection allowlist ∩ paquets de l’instance | Database → Extensions, une extension à la fois |
Pourquoi le bouton est grisé
3. Dans la console
- Projet → Database → Extensions
- Consulter les extensions déjà installées (schéma
extensionssauf exception ci-dessous) - 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, extensionsL’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
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à.
| Extension | Rôle |
|---|---|
| uuid-ossp | Génération d’UUID (uuid_generate_v4, etc.). |
| pgcrypto | Hachage, chiffrement, gen_random_uuid(). |
| pg_trgm | Similarité 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.
| Extension | Rôle |
|---|---|
| vector | Embeddings et recherche de similarité (pgvector). |
| pg_stat_statements | Statistiques d’exécution SQL (préchargée au démarrage). |
| pg_graphql | API 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.
| Extension | Rôle |
|---|---|
| amcheck | Vérification d’intégrité des index B-tree. |
| autoinc | Trigger de compteur automatique (contrib historique). |
| bloom | Index Bloom pour filtres d’égalité multi-colonnes. |
| btree_gin | Classes d’opérateurs B-tree pour les index GIN. |
| btree_gist | Classes d’opérateurs B-tree pour les index GiST. |
| citext | Texte insensible à la casse (e-mails, identifiants). |
| cube | Type cube multidimensionnel (requis par earthdistance). |
| dict_int | Dictionnaire de recherche plein texte pour les entiers. |
| dict_xsyn | Dictionnaire de synonymes pour le plein texte. |
| earthdistance | Distance entre points sur la sphère (dépend de cube). |
| fuzzystrmatch | Soundex, Levenshtein, metaphone (requis par tiger). |
| hstore | Paires clé/valeur dans une colonne. |
| insert_username | Trigger qui enregistre l’utilisateur courant. |
| intagg | Agrégats d’entiers (historique). |
| intarray | Opérations et index sur les tableaux d’entiers. |
| isn | Types ISBN / ISSN / EAN et contrôles associés. |
| ltree | Chemins hiérarchiques (catégories, arbres). |
| moddatetime | Trigger updated_at automatique. |
| old_snapshot | Inspection des snapshots MVCC anciens. |
| pageinspect | Inspection bas niveau des pages (admin). |
| pg_buffercache | Contenu du cache de tampons PostgreSQL. |
| pg_freespacemap | Carte de l’espace libre. |
| pg_prewarm | Préchargement de relations en cache. |
| pg_visibility | Carte de visibilité des tuples. |
| pg_walinspect | Inspection du WAL. |
| pgrowlocks | Verrous de lignes en cours. |
| pgstattuple | Statistiques de fragmentation des tables. |
| refint | Triggers d’intégrité référentielle (historique). |
| seg | Type intervalle / segment de nombres. |
| sslinfo | Informations sur la session SSL. |
| tablefunc | crosstab et fonctions de tableau croisé. |
| tcn | Triggered change notification. |
| tsm_system_rows | TABLESAMPLE SYSTEM_ROWS. |
| tsm_system_time | TABLESAMPLE SYSTEM_TIME. |
| unaccent | Suppression 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).
| Extension | Rôle |
|---|---|
| postgis | Types et fonctions géographiques (schéma extensions). |
| postgis_raster | Rasters PostGIS (dépend de postgis). |
| postgis_sfcgal | Géométrie 3D SFCGAL si le paquet est présent sur l’instance. |
| postgis_topology | Topologie PostGIS (schéma topology, hors API REST). |
| postgis_tiger_geocoder | Géocodeur TIGER (USA). Schémas tiger / tiger_data. |
| address_standardizer | Normalisation d’adresses postales. |
| address_standardizer_data_us | Jeu de règles US (dépend de address_standardizer). |
| hypopg | Index hypothétiques pour EXPLAIN. |
| pg_repack | Réorganisation de tables sans verrou exclusif long. |
Packagées, pas d’UI (dormantes)
| Extension | Rôle |
|---|---|
| pg_cron | Jobs SQL planifiés. Pas d’UI. Preload uniquement sur demande ops. |
| pgaudit | Audit SQL. Packagé, pas d’activation console. |
Jamais proposées
Isolation, surface d’attaque ou boot. Absentes de l’allowlist, y compris en SQL éditeur.
| Extension | Rôle |
|---|---|
| dblink | Requêtes vers une autre base (fuite d’isolation). |
| postgres_fdw | Foreign Data Wrapper PostgreSQL. |
| file_fdw | Lecture de fichiers du serveur. |
| http | Appels HTTP depuis SQL. |
| pg_net | HTTP asynchrone (Supabase). |
| wrappers | Wrappers FDW Supabase. |
| pgsodium | Crypto / vault historique Supabase. |
| supabase_vault | Coffre de secrets Supabase. |
| plv8 | JavaScript dans le serveur. |
| pljava | Java dans le serveur. |
| plls | LiveScript dans le serveur. |
| plcoffee | CoffeeScript dans le serveur. |
| adminpack | Outils admin pgAdmin. |
| lo | Large objects côté serveur. |
| xml2 | XML historique (risques). |
| pg_surgery | Réparation destructive de pages. |
| pg_plan_filter | Filtrage de plans (non supporté). |
| safeupdate | Garde UPDATE/DELETE sans WHERE (non packagée). |
| supautils | Utilitaires 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.
| Extension | Avant |
|---|---|
| postgis_topology | postgis |
| postgis_raster | postgis |
| postgis_sfcgal | postgis |
| postgis_tiger_geocoder | postgis, fuzzystrmatch |
| address_standardizer_data_us | address_standardizer |
| earthdistance | cube |
Certaines extensions ne sont pas relogeables dans extensions (fichier .control) :
| Extension | Schéma(s) |
|---|---|
| pg_graphql | graphql, graphql_public |
| postgis_topology | topology |
| postgis_tiger_geocoder | tiger, tiger_data |
| pg_cron | cron (si activé ops) |
postgis_tiger_geocoder
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.