Docs/ Bases de données/ Chaînes de connexion

Chaînes de connexion

Connectez vos applications aux bases de données avec des variables d'environnement auto-injectées. sh0 gère le réseau interne pour que votre application puisse atteindre sa base de données par nom d'hôte.

Trouver les chaînes de connexion

Chaque base de données créée dans sh0 dispose de ses informations de connexion dans le tableau de bord. Accédez à la page de détail de la base de données et cliquez sur l'onglet Connexion pour voir toutes les informations de connexion.

Database connection tab -- showing the full connection string, host, port, username, password, and database name

L'onglet connexion affiche :

  • URL de connexion complète -- Prête à copier-coller dans la configuration de votre application.
  • Champs individuels -- Hôte, port, nom d'utilisateur, mot de passe et nom de la base de données en tant que valeurs séparées.
  • Commande de connexion -- Une commande CLI pour se connecter directement (par ex., psql, mysql).

Par exemple, une chaîne de connexion PostgreSQL ressemble à :

PostgreSQL Connection URL
postgresql://myuser:secretpass@mydb:5432/myapp

Variables d'environnement auto-injectées

Lorsque vous créez une base de données dans un stack, sh0 injecte automatiquement les variables d'environnement de connexion dans tous les services applicatifs du même stack. Votre application peut lire ces variables à l'exécution sans aucune configuration manuelle.

Environment variables panel -- showing auto-injected database variables with a badge indicating they are managed by sh0

Convention de nommage des variables

Les variables auto-injectées suivent un schéma de nommage cohérent basé sur le nom de la base de données et le moteur :

PostgreSQL (database named 'mydb')
DATABASE_URL=postgresql://sh0:generated_pass@mydb:5432/sh0
MYDB_HOST=mydb
MYDB_PORT=5432
MYDB_USER=sh0
MYDB_PASSWORD=generated_pass
MYDB_DATABASE=sh0
MySQL (database named 'maindb')
DATABASE_URL=mysql://sh0:generated_pass@maindb:3306/sh0
MAINDB_HOST=maindb
MAINDB_PORT=3306
MAINDB_USER=sh0
MAINDB_PASSWORD=generated_pass
MAINDB_DATABASE=sh0
Redis (database named 'cache')
REDIS_URL=redis://:generated_pass@cache:6379
CACHE_HOST=cache
CACHE_PORT=6379
CACHE_PASSWORD=generated_pass
MongoDB (database named 'docs')
MONGO_URL=mongodb://sh0:generated_pass@docs:27017/sh0
DOCS_HOST=docs
DOCS_PORT=27017
DOCS_USER=sh0
DOCS_PASSWORD=generated_pass
DOCS_DATABASE=sh0
Tip
Si votre stack possède une seule base de données, sh0 définit également DATABASE_URL (ou REDIS_URL / MONGO_URL) par commodité. Si vous avez plusieurs bases de données du même moteur, utilisez les variables préfixées par le nom pour éviter les conflits.

Connexion depuis le même stack

Les services au sein du même stack partagent un réseau Docker. Cela signifie que votre application peut se connecter à la base de données en utilisant le nom du conteneur de la base de données comme nom d'hôte. Pas d'adresses IP, pas de mappage de port -- juste le nom du conteneur.

Node.js example
// The DATABASE_URL is auto-injected by sh0
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
});
Python / Django example
# settings.py
import dj_database_url

DATABASES = {
    'default': dj_database_url.config(
        default=os.environ['DATABASE_URL']
    )
}
Stack network diagram -- showing an app container and database container connected on the same internal Docker network
Note
Les connexions internes entre conteneurs du même stack ne quittent pas le réseau Docker. Le trafic n'est pas chiffré via TLS car il ne transite jamais par l'Internet public. C'est le comportement standard du réseau Docker.

Accès externe

Par défaut, les bases de données ne sont accessibles que depuis le réseau du stack. Pour vous connecter depuis votre machine locale (par exemple, en utilisant un outil graphique comme pgAdmin, TablePlus ou DBeaver), vous devez activer l'accès externe.

  1. Ouvrez les paramètres de la base de données.
  2. Activez Accès public.
  3. sh0 mappe le port du conteneur sur un port haut aléatoire de l'hôte (par ex., 54321).
  4. Connectez-vous en utilisant votre-ip-serveur:54321 avec vos identifiants de base de données.
External access toggle and the resulting public connection string with the mapped port
Warning
Activer l'accès externe expose votre base de données à Internet. Utilisez toujours des mots de passe forts et envisagez de restreindre l'accès par adresse IP à l'aide de règles de pare-feu.

Pooling de connexions

La plupart des bases de données ont une limite sur le nombre de connexions simultanées. Le pooling de connexions vous aide à rester dans ces limites tout en servant de nombreuses requêtes.

Bonnes pratiques pour le pooling de connexions dans sh0 :

  • Utilisez le pool intégré de votre framework -- La plupart des ORM et pilotes de base de données prennent en charge le pooling de connexions. Configurez la taille du pool en fonction des limites de votre base de données.
  • Adaptez la taille du pool aux connexions disponibles -- PostgreSQL a par défaut 100 connexions maximum. Si vous avez 3 réplicas d'application, définissez chaque pool à environ 30 connexions.
  • Définissez des délais de connexion -- Configurez des délais d'expiration pour les connexions inactives afin d'éviter que des connexions obsolètes ne consomment des emplacements.
  • Surveillez le nombre de connexions -- Utilisez le tableau de bord des métriques de la base de données pour suivre les connexions actives au fil du temps.
Node.js pool configuration
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  max: 20,              // Maximum connections in the pool
  idleTimeoutMillis: 30000,  // Close idle connections after 30s
  connectionTimeoutMillis: 5000, // Fail if connection takes > 5s
});

Exemples pour les frameworks courants

Voici des exemples de connexion pour les frameworks populaires. Tous utilisent la variable d'environnement DATABASE_URL que sh0 injecte automatiquement.

Ruby on Rails (config/database.yml)
production:
  url: <%= ENV['DATABASE_URL'] %>
Laravel (.env)
DB_CONNECTION=pgsql
DB_HOST=${{ MYDB_HOST }}
DB_PORT=${{ MYDB_PORT }}
DB_DATABASE=${{ MYDB_DATABASE }}
DB_USERNAME=${{ MYDB_USER }}
DB_PASSWORD=${{ MYDB_PASSWORD }}
Rust / SQLx
let pool = PgPoolOptions::new()
    .max_connections(20)
    .connect(&std::env::var("DATABASE_URL")?)
    .await?;
Go / pgx
pool, err := pgxpool.New(ctx, os.Getenv("DATABASE_URL"))
Tip
La plupart des frameworks modernes détectent automatiquement DATABASE_URL. Si le vôtre le fait, vous n'avez rien à configurer -- déployez simplement sur sh0 et ça fonctionne immédiatement.