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.
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://myuser:secretpass@mydb:5432/myappVariables 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.
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:
DATABASE_URL=postgresql://sh0:generated_pass@mydb:5432/sh0
MYDB_HOST=mydb
MYDB_PORT=5432
MYDB_USER=sh0
MYDB_PASSWORD=generated_pass
MYDB_DATABASE=sh0DATABASE_URL=mysql://sh0:generated_pass@maindb:3306/sh0
MAINDB_HOST=maindb
MAINDB_PORT=3306
MAINDB_USER=sh0
MAINDB_PASSWORD=generated_pass
MAINDB_DATABASE=sh0REDIS_URL=redis://:generated_pass@cache:6379
CACHE_HOST=cache
CACHE_PORT=6379
CACHE_PASSWORD=generated_passMONGO_URL=mongodb://sh0:generated_pass@docs:27017/sh0
DOCS_HOST=docs
DOCS_PORT=27017
DOCS_USER=sh0
DOCS_PASSWORD=generated_pass
DOCS_DATABASE=sh0DATABASE_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.
// The DATABASE_URL is auto-injected by sh0
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});# settings.py
import dj_database_url
DATABASES = {
'default': dj_database_url.config(
default=os.environ['DATABASE_URL']
)
}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.
- Abre la configuración de la base de datos.
- Activa Acceso público.
- sh0 asigna el puerto del contenedor a un puerto alto aleatorio en el host (por ejemplo,
54321). - Conéctate usando
ip-de-tu-servidor:54321con las credenciales de tu base de datos.
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.
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.
production:
url: <%= ENV['DATABASE_URL'] %>DB_CONNECTION=pgsql
DB_HOST=${{ MYDB_HOST }}
DB_PORT=${{ MYDB_PORT }}
DB_DATABASE=${{ MYDB_DATABASE }}
DB_USERNAME=${{ MYDB_USER }}
DB_PASSWORD=${{ MYDB_PASSWORD }}let pool = PgPoolOptions::new()
.max_connections(20)
.connect(&std::env::var("DATABASE_URL")?)
.await?;pool, err := pgxpool.New(ctx, os.Getenv("DATABASE_URL"))DATABASE_URL. Si el tuyo lo hace, no necesitas configurar nada -- solo despliega en sh0 y funciona de inmediato.