Documentación/ Bases de datos/ Cadenas de conexión

Cadenas de conexión

Conecta tus aplicaciones a bases de datos con variables de entorno inyectadas automáticamente. sh0 gestiona las redes internas para que tu aplicación pueda acceder a su base de datos por nombre de host.

Encontrar cadenas de conexión

Cada base de datos creada en sh0 tiene sus detalles de conexión disponibles en el panel de control. Navega a la página de detalle de la base de datos y haz clic en la pestaña Conexión para ver toda la información de conexión.

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

La pestaña de conexión muestra:

  • URL de conexión completa -- Lista para copiar y pegar en la configuración de tu aplicación.
  • Campos individuales -- Host, puerto, usuario, contraseña y nombre de la base de datos como valores separados.
  • Comando de conexión -- Un comando CLI para conectarte directamente (por ejemplo, psql, mysql).

Por ejemplo, una cadena de conexión de base de datos PostgreSQL se ve así:

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

Variables de entorno inyectadas automáticamente

Cuando creas una base de datos en un stack, sh0 inyecta automáticamente variables de entorno de conexión en todos los servicios de aplicación del mismo stack. Tu aplicación puede leer estas variables en tiempo de ejecución sin ninguna configuración manual.

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

Convención de nomenclatura de variables

Las variables inyectadas automáticamente siguen un patrón de nomenclatura consistente basado en el nombre de la base de datos y el motor:

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 tu stack tiene una sola base de datos, sh0 también establece DATABASE_URL (o REDIS_URL / MONGO_URL) como conveniencia. Si tienes múltiples bases de datos del mismo motor, usa las variables con prefijo de nombre para evitar conflictos.

Conexión desde el mismo stack

Los servicios dentro del mismo stack comparten una red Docker. Esto significa que tu aplicación puede conectarse a la base de datos usando el nombre del contenedor de la base de datos como nombre de host. Sin direcciones IP, sin mapeo de puertos -- solo el nombre del contenedor.

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
Las conexiones internas entre contenedores del mismo stack no salen de la red Docker. El tráfico no se cifra mediante TLS porque nunca toca la internet pública. Este es el comportamiento estándar de redes Docker.

Acceso externo

Por defecto, las bases de datos solo son accesibles desde dentro de la red del stack. Para conectarte desde tu máquina local (por ejemplo, usando una herramienta GUI como pgAdmin, TablePlus o DBeaver), necesitas habilitar el acceso externo.

  1. Abre la configuración de la base de datos.
  2. Activa Acceso público.
  3. sh0 asigna el puerto del contenedor a un puerto alto aleatorio en el host (por ejemplo, 54321).
  4. Conéctate usando ip-de-tu-servidor:54321 con las credenciales de tu base de datos.
External access toggle and the resulting public connection string with the mapped port
Warning
Habilitar el acceso externo expone tu base de datos a internet. Siempre usa contraseñas fuertes y considera restringir el acceso por dirección IP mediante reglas de firewall.

Pooling de conexiones

La mayoría de las bases de datos tienen un límite en el número de conexiones concurrentes. El pooling de conexiones te ayuda a mantenerte dentro de estos límites mientras atiendes muchas solicitudes.

Mejores prácticas para pooling de conexiones en sh0:

  • Usa el pool integrado de tu framework -- La mayoría de los ORM y controladores de bases de datos soportan pooling de conexiones. Configura el tamaño del pool según los límites de tu base de datos.
  • Ajusta el tamaño del pool a las conexiones disponibles -- PostgreSQL tiene un máximo predeterminado de 100 conexiones. Si tienes 3 réplicas de la aplicación, configura cada pool a ~30 conexiones.
  • Establece tiempos de espera de conexión -- Configura tiempos de espera de conexión inactiva para evitar que las conexiones obsoletas consuman ranuras.
  • Monitorea el conteo de conexiones -- Usa el panel de métricas de la base de datos para rastrear las conexiones activas a lo largo del tiempo.
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
});

Ejemplos para frameworks comunes

Estos son ejemplos de conexión para frameworks populares. Todos usan la variable de entorno DATABASE_URL que sh0 inyecta automáticamente.

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 mayoría de los frameworks modernos detectan automáticamente DATABASE_URL. Si el tuyo lo hace, no necesitas configurar nada -- solo despliega en sh0 y funciona de inmediato.