Data Sources
Connect to external databases, data warehouses, and cloud storage services. Once configured, these connections are available in your workflows via the STRONGLY_SERVICES environment variable.
Supported Data Source Types
Choose from over 60 supported data source types across 9 categories:
| Category | Providers | Use Cases |
|---|---|---|
| Relational | MySQL, PostgreSQL, MSSQL, Oracle, Redshift, Snowflake, BigQuery, CockroachDB, CrateDB, TimescaleDB, QuestDB, ClickHouse, SingleStore, Greenplum | Transactional data, structured queries, analytics |
| Document/NoSQL | MongoDB, Elasticsearch, DynamoDB, Firestore, Supabase, CouchDB, Couchbase | Document storage, search, flexible schemas |
| Key-Value/Cache | Redis, Memcached | Caching, session storage, real-time data |
| Graph | Neo4j, Amazon Neptune, ArangoDB, TigerGraph | Graph relationships, knowledge graphs |
| Vector | Milvus, Pinecone, Weaviate, Qdrant, Chroma, pgvector, LanceDB, Vespa, Marqo | AI embeddings, semantic search, RAG systems |
| Multi-Model | SurrealDB, FaunaDB | Multi-paradigm data modeling |
| Spreadsheet | Airtable, Google Sheets, Baserow, NocoDB, SeaTable, Grist | Low-code databases, spreadsheet data |
| Cloud Storage | Amazon S3, Google Cloud Storage, MinIO, Azure Blob Storage | File storage, data lakes, backups |
| Message Queue | RabbitMQ, Apache Kafka, Amazon SQS, Apache Pulsar | Event streaming, message brokering |
| Generic | JDBC, ODBC | Any JDBC/ODBC-compatible database |
Quick Links
- How to Connect Data Sources
- PostgreSQL Configuration
- MySQL Configuration
- MongoDB Configuration
- Snowflake Configuration
- BigQuery Configuration
- Amazon S3 Configuration
- Redis Configuration
Dedicated configuration pages exist for the most commonly used types listed above. All other types (MSSQL, Oracle, Redshift, Elasticsearch, DynamoDB, Neo4j, Pinecone, Kafka, etc.) follow the same general creation workflow described in How to Connect Data Sources. The creation form dynamically renders the correct credential fields for every supported type.
Using Data Sources in Workflows
When you attach a data source to your workflow during deployment, its credentials are automatically injected via the STRONGLY_SERVICES environment variable. Credentials are decrypted server-side and included as top-level fields (not nested under a credentials key). A connectionString is also included for supported types (MySQL, PostgreSQL, MongoDB, Redis, MSSQL, Oracle, Redshift, Snowflake, Neo4j, ClickHouse).
STRONGLY_SERVICES Structure
{
"datasources": {
"prod_postgres": {
"type": "postgres",
"name": "prod-postgres",
"host": "postgres.example.com",
"port": 5432,
"database": "myapp",
"username": "app_user",
"password": "actual_password",
"ssl": true,
"connectionString": "postgresql://app_user:actual_password@postgres.example.com:5432/myapp"
}
}
}
The data source key is the data source name sanitized to lowercase with non-alphanumeric characters replaced by underscores (e.g., prod-postgres becomes prod_postgres).
Each data source entry contains:
type-- the data source type string (e.g.,postgres,mysql,s3)name-- the display label of the data source- All credential fields spread at the top level (e.g.,
host,port,username,password,accessKeyId, etc.) connectionString-- auto-generated connection string (only for supported types)
Python Example -- PostgreSQL
import os, json
import psycopg2
# Parse STRONGLY_SERVICES environment variable
services = json.loads(os.getenv('STRONGLY_SERVICES', '{}'))
datasources = services.get('datasources', {})
# Get your data source by its sanitized name
pg = datasources['prod_postgres']
# Connect using top-level credential fields
conn = psycopg2.connect(
host=pg['host'],
port=pg['port'],
database=pg['database'],
user=pg['username'],
password=pg['password'],
sslmode='require' if pg.get('ssl') else 'prefer'
)
# Or use the connection string directly
conn = psycopg2.connect(pg['connectionString'])
# Execute queries
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE active = true")
users = cursor.fetchall()
Node.js Example -- MongoDB
const { MongoClient } = require('mongodb');
// Parse STRONGLY_SERVICES environment variable
const services = JSON.parse(process.env.STRONGLY_SERVICES || '{}');
const datasources = services.datasources || {};
// Get MongoDB data source (fields are at the top level)
const mongo = datasources['prod_mongodb'];
// Build connection string from top-level fields
const authPart = mongo.username ? `${mongo.username}:${mongo.password}@` : '';
const url = `mongodb://${authPart}${mongo.host}:${mongo.port}/${mongo.database}`;
// Connect
const client = new MongoClient(url);
await client.connect();
const db = client.db(mongo.database);
// Query
const users = await db.collection('users').find({ active: true }).toArray();
Security
Credential Encryption
All credentials are encrypted at rest. The encryption key is configured via the API_KEY_ENCRYPTION_SECRET environment variable (minimum 32 characters required). Credentials are never sent to the client -- they are excluded from all publications and only decrypted server-side when needed for connection testing, metadata fetching, or building STRONGLY_SERVICES.
Permission Model
Data sources support three levels of access control:
- Private (default): Only the owner can access the data source
- All Users (
allowAllUsers): All users in the organization can use the connection - Specific Users (
allowedUsers): Only selected users can access the data source
Permissions are managed through the datasources.updatePermissions, datasources.share, and datasources.unshare methods. In multi-tenant (SaaS) mode, sharing is restricted to users within the same organization.
Managing Data Sources
View Connection Details
- Click data source name to view details page
- See connection string (passwords masked)
- View metadata: tables, schemas, databases, collections, buckets
- Check last tested time and status
Test Connection
The platform automatically tests the connection when creating or updating a data source. You can also manually trigger a test using the Test Connection button on the data source details page. The test result updates the data source status to connected or error.
For types with native driver support (MySQL, PostgreSQL, MongoDB, Redis, S3/MinIO, Snowflake, BigQuery, Oracle, MSSQL, Neo4j, Elasticsearch, Redshift, ClickHouse, QuestDB, DynamoDB, SQS, GCS), the platform performs an actual connection test (e.g., SELECT 1, ping, ListBuckets). For other types, credentials are saved with a message indicating verification will happen at runtime.
Schema Discovery
After connecting, use Refresh Metadata to discover the structure of your data source. Depending on the type, this returns:
- Tables/Collections: Available tables or collections
- Schemas: Database schemas (PostgreSQL, Snowflake, Redshift, Oracle, etc.)
- Databases: Available databases
- Buckets: S3/cloud storage buckets
- Size and row counts: Approximate storage size and row counts
Full native metadata connectors are available for: MySQL, PostgreSQL, MongoDB, Redis, S3, MinIO, Snowflake, BigQuery, Oracle, Redshift, Neo4j, and PostgreSQL-compatible databases (CockroachDB, CrateDB, TimescaleDB, Greenplum, pgvector, QuestDB) and MySQL-compatible databases (SingleStore). Other types use a generic HTTP-based connector that returns empty metadata.
Additionally, you can fetch column-level metadata for individual tables using the table columns feature (supported for MySQL, PostgreSQL, Oracle, Redshift, Snowflake, BigQuery, and MongoDB).
Update Credentials
- Click Edit button
- Update label, description, credentials, or tags
- Connection is re-tested automatically when credentials change
- Click Save to apply changes
Usage Tracking
- View usage count and last used timestamp
- Usage count increments when data sources are used in workflows
Delete Data Source
- Click Delete button
- Confirm deletion (irreversible)
- Associated permissions are also removed
- Workflows using this source will lose connection
All credentials are encrypted at rest and never transmitted to the client. Passwords are never displayed in plaintext after initial entry.