pg.
Dans ce guide, vous allez créer une nouvelle application Rails, la connecter à ClickHouse Managed Postgres via une connexion TLS vérifiée, exécuter une migration, puis servir une ressource Post générée par scaffolding.
Prérequis
- Ruby 3.2 ou version ultérieure. Ce guide a été testé avec Ruby 4.0.7, Rails 8.1.4 et
pg1.6.3. - Un compte ClickHouse Cloud.
pg est distribuée avec des builds précompilés pour Linux, macOS et Windows qui incluent libpq : il n’est donc pas nécessaire d’installer PostgreSQL en local.
Créer un service ClickHouse Managed Postgres
Dans la console ClickHouse Cloud, cliquez sur New service et sélectionnez Postgres. L’instance est prête en quelques minutes. Pour une présentation pas à pas, consultez le guide de démarrage rapide.Obtenir vos informations de connexion
Ouvrez votre service et cliquez sur Connect dans la barre latérale gauche. Laissez l’option Directly sélectionnée et activez Use SSL. Copiez le mot de passe et le nom d’hôte du serveur, puis cliquez sur Download CA certificate. Le certificat de CA est propre à votre service. Vous pouvez également le télécharger plus tard depuis Settings → CA Certificate. Connexion directe ou PgBouncer ? Un serveur Rails est un processus de longue durée qui maintient son propre pool de connexions (max_connections dans config/database.yml, cinq par processus par défaut) ; ce guide se connecte donc directement à Postgres sur le port 5432.
Si vous exécutez de nombreux processus et atteignez la limite de connexions, consultez Utiliser PgBouncer.
Créer une application Rails
Installez Rails et créez une application utilisant PostgreSQL :Configurer la connexion à la base de données
Déplacez le certificat de CA que vous avez téléchargé dans le répertoireconfig de l’application, puis renommez-le en ca-certificate.pem.
Le fichier téléchargé porte le nom de votre service, par exemple your-service-ca-certificate.pem :
config/database.yml, remplacez la section development par :
sslmode: verify-full impose à libpq de vérifier que le certificat du serveur est signé par l’autorité de certification (CA) de votre service et qu’il correspond au nom d’hôte. Rails.root.join renvoie un path absolu : le paramètre fonctionne donc quel que soit le répertoire depuis lequel vous démarrez Rails.
Configurez DATABASE_URL pour qu’elle pointe vers votre service, avec un nouveau nom de base de données. Ce guide utilise guide_rails :
N’incluez pas de query string dans
DATABASE_URL. Les paramètres de l’URL remplacent les clés de database.yml : un sslrootcert=your-service-ca-certificate.pem copié tel quel écraserait ainsi votre paramètre avec un path relatif au répertoire courant.db:create crée uniquement la base de données indiquée dans DATABASE_URL. La commande se connecte à la base de données postgres par défaut pour exécuter CREATE DATABASE, mais ne la modifie pas. Lorsque DATABASE_URL est défini, Rails ne crée pas non plus la base de données de test locale.
Générer un modèle et exécuter la migration
Générez un scaffold pour une ressourcePost et appliquez sa migration. Dans une application existante, bin/rails db:migrate crée également les tables existantes de votre application dans la nouvelle base de données. Ces tables sont d’abord vides, car les données stockées dans SQLite ne sont pas copiées :
Interroger la base de données
Créez le fichierscript/posts_demo.rb contenant quelques appels Active Record :
bin/rails runner :
pg_stat_ssl pour la connexion en cours, ce qui confirme que la session est chiffrée.
Lancer l’application
Démarrez le serveur de développement :guide_rails, puis sélectionnez la table posts.
Rails crée également les tables schema_migrations et ar_internal_metadata pour assurer le suivi des migrations.
La table posts contient les deux lignes créées par script/posts_demo.rb :
Utiliser PgBouncer
Chaque processus Rails ouvre jusqu’àmax_connections connexions directes. Si, cumulés, de nombreux processus approchent la limite de connexions de Postgres, connectez-vous plutôt via le PgBouncer intégré : sélectionnez via PgBouncer dans la fenêtre modale Connect et utilisez le port 6432 dans DATABASE_URL.
PgBouncer fonctionne en mode pool de connexions par transaction :
-
Les prepared statements fonctionnent avec la configuration par défaut de Rails si la gem
pgest en version 1.6 ou ultérieure et utiliselibpq17 ou ultérieure. Les gemspg1.6 précompilées embarquentlibpq18. Avec ces versions, lorsque Rails évince un statement de son cache, il le libère au moyen d’un messageCloseau niveau du protocole, que le PgBouncer intégré sait gérer. Les versions plus anciennes depgou delibpqenvoient à la place l’instruction SQLDEALLOCATE, qui échoue via PgBouncer avec l’erreurprepared statement "a1" does not exist. Si cela se produit au sein d’une transaction, celle-ci est annulée (PG::InFailedSqlTransaction). Pour vérifier vos versions, exécutez :Il vous faut au minimum1.6.0et170000. Si vous ne pouvez pas effectuer la mise à niveau, ajoutezprepared_statements: falseà la sectiondevelopment. Rails active les prepared statements enproduction, mais endevelopmentils sont désactivés par défaut, carquery_log_tags_enabledy est activé. -
Les migrations posent un verrou consultatif (advisory lock) au niveau de la session (
pg_try_advisory_lock) afin d’empêcher les exécutions simultanées. En mode pool de connexions par transaction, la libération du verrou peut aboutir sur une autre connexion Postgres : elle échoue alors avecFailed to release advisory locket le verrou reste détenu, si bien que les exécutions suivantes échouent avecCannot run migrations because another migration process is currently running. Exécutezbin/rails db:migrateavec uneDATABASE_URLdirecte sur le port5432, ou désactivez le verrou :
advisory_locks: false, veillez à ce qu’un seul déploiement exécute les migrations à la fois.
Dépannage
SSL error: certificate verify failed:sslrootcertne pointe pas vers le certificat de CA de votre service. Téléchargez-le à nouveau depuis Settings → CA Certificate. Chaque service dispose de sa propre CA : les bundles de CA publics ne fonctionnent pas.root certificate file "..." does not exist: le path indiqué danssslrootcertest incorrect. Vérifiez que le fichierconfig/ca-certificate.pemexiste bien.
Étapes suivantes
- Utilisez les mêmes paramètres
sslmodeetsslrootcertdans votre configurationproduction. - Connexion : chaînes de connexion, PgBouncer et TLS.
- Paramètres : modifiez les paramètres de Postgres et de PgBouncer, comme
max_connections. - Répliques en lecture : faites monter en charge les lectures, par exemple avec les bases de données multiples de Rails.
- Sync to ClickHouse : répliquez vos tables Rails vers ClickHouse pour l’analytique.