Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions apps/sim/.env.example
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
# Database (Required)
DATABASE_URL="postgresql://postgres:password@localhost:5432/postgres"
# DATABASE_SSL=disable # Optional: SSL mode (disable, prefer, require, verify-ca, verify-full)
# DATABASE_SSL_CA= # Optional: Base64-encoded CA certificate (required for verify-ca/verify-full)
# To generate: cat your-ca.crt | base64 | tr -d '\n'

# PostgreSQL Port (Optional) - defaults to 5432 if not specified
# POSTGRES_PORT=5432
Expand Down
33 changes: 0 additions & 33 deletions apps/sim/drizzle.config.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,11 @@
import type { Config } from 'drizzle-kit'
import { env } from './lib/env'

const getSSLConfig = () => {
const sslMode = env.DATABASE_SSL?.toLowerCase()

if (!sslMode || sslMode === 'disable') {
return undefined
}

if (sslMode === 'prefer') {
return 'prefer' as const
}

const sslConfig: any = {}

if (sslMode === 'require') {
sslConfig.rejectUnauthorized = false
} else if (sslMode === 'verify-ca' || sslMode === 'verify-full') {
sslConfig.rejectUnauthorized = true
if (env.DATABASE_SSL_CA) {
try {
const ca = Buffer.from(env.DATABASE_SSL_CA, 'base64').toString('utf-8')
sslConfig.ca = ca
} catch (error) {
console.error('Failed to parse DATABASE_SSL_CA:', error)
}
}
}

return sslConfig
}

const sslConfig = getSSLConfig()

export default {
schema: '../../packages/db/schema.ts',
out: '../../packages/db/migrations',
dialect: 'postgresql',
dbCredentials: {
url: env.DATABASE_URL,
...(sslConfig !== undefined && { ssl: sslConfig }),
},
} satisfies Config
54 changes: 17 additions & 37 deletions apps/sim/socket-server/database/operations.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import type { ConnectionOptions } from 'node:tls'
import * as schema from '@sim/db'
import { workflow, workflowBlocks, workflowEdges, workflowSubflows } from '@sim/db'
import { and, eq, or, sql } from 'drizzle-orm'
Expand All @@ -11,34 +10,6 @@ import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers'
const logger = createLogger('SocketDatabase')

const connectionString = env.DATABASE_URL

const getSSLConfig = () => {
const sslMode = env.DATABASE_SSL

if (!sslMode) return undefined
if (sslMode === 'disable') return false
if (sslMode === 'prefer') return 'prefer'

const sslConfig: ConnectionOptions = {}

if (sslMode === 'require') {
sslConfig.rejectUnauthorized = false
} else if (sslMode === 'verify-ca' || sslMode === 'verify-full') {
sslConfig.rejectUnauthorized = true
if (env.DATABASE_SSL_CA) {
try {
const ca = Buffer.from(env.DATABASE_SSL_CA, 'base64').toString('utf-8')
sslConfig.ca = ca
} catch (error) {
logger.error('Failed to parse DATABASE_SSL_CA:', error)
}
}
}

return sslConfig
}

const sslConfig = getSSLConfig()
const socketDb = drizzle(
postgres(connectionString, {
prepare: false,
Expand All @@ -47,7 +18,6 @@ const socketDb = drizzle(
max: 25,
onnotice: () => {},
debug: false,
...(sslConfig !== undefined && { ssl: sslConfig }),
}),
{ schema }
)
Expand Down Expand Up @@ -162,6 +132,7 @@ export async function getWorkflowState(workflowId: string) {
const finalState = {
// Default values for expected properties
deploymentStatuses: {},
hasActiveWebhook: false,
// Data from normalized tables
blocks: normalizedData.blocks,
edges: normalizedData.edges,
Expand Down Expand Up @@ -195,7 +166,23 @@ export async function persistWorkflowOperation(workflowId: string, operation: an
try {
const { operation: op, target, payload, timestamp, userId } = operation

// Log high-frequency operations for monitoring
if (op === 'update-position' && Math.random() < 0.01) {
// Log 1% of position updates
logger.debug('Socket DB operation sample:', {
operation: op,
target,
workflowId: `${workflowId.substring(0, 8)}...`,
})
}

await db.transaction(async (tx) => {
// Update the workflow's last modified timestamp first
await tx
.update(workflow)
.set({ updatedAt: new Date(timestamp) })
.where(eq(workflow.id, workflowId))

// Handle different operation types within the transaction
switch (target) {
case 'block':
Expand All @@ -213,13 +200,6 @@ export async function persistWorkflowOperation(workflowId: string, operation: an
default:
throw new Error(`Unknown operation target: ${target}`)
}

if (op !== 'update-position') {
await tx
.update(workflow)
.set({ updatedAt: new Date(timestamp) })
.where(eq(workflow.id, workflowId))
}
})

// Log slow operations for monitoring
Expand Down
30 changes: 0 additions & 30 deletions apps/sim/socket-server/rooms/manager.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import type { ConnectionOptions } from 'node:tls'
import * as schema from '@sim/db/schema'
import { workflowBlocks, workflowEdges } from '@sim/db/schema'
import { and, eq, isNull } from 'drizzle-orm'
Expand All @@ -9,42 +8,13 @@ import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'

const connectionString = env.DATABASE_URL

const getSSLConfig = () => {
const sslMode = env.DATABASE_SSL

if (!sslMode) return undefined
if (sslMode === 'disable') return false
if (sslMode === 'prefer') return 'prefer'

const sslConfig: ConnectionOptions = {}

if (sslMode === 'require') {
sslConfig.rejectUnauthorized = false
} else if (sslMode === 'verify-ca' || sslMode === 'verify-full') {
sslConfig.rejectUnauthorized = true
if (env.DATABASE_SSL_CA) {
try {
const ca = Buffer.from(env.DATABASE_SSL_CA, 'base64').toString('utf-8')
sslConfig.ca = ca
} catch (error) {
console.error('Failed to parse DATABASE_SSL_CA:', error)
}
}
}

return sslConfig
}

const sslConfig = getSSLConfig()
const db = drizzle(
postgres(connectionString, {
prepare: false,
idle_timeout: 15,
connect_timeout: 20,
max: 5,
onnotice: () => {},
...(sslConfig !== undefined && { ssl: sslConfig }),
}),
{ schema }
)
Expand Down
33 changes: 0 additions & 33 deletions packages/db/drizzle.config.ts
Original file line number Diff line number Diff line change
@@ -1,43 +1,10 @@
import type { Config } from 'drizzle-kit'

const getSSLConfig = () => {
const sslMode = process.env.DATABASE_SSL?.toLowerCase()

if (!sslMode || sslMode === 'disable') {
return undefined
}

if (sslMode === 'prefer') {
return 'prefer' as const
}

const sslConfig: any = {}

if (sslMode === 'require') {
sslConfig.rejectUnauthorized = false
} else if (sslMode === 'verify-ca' || sslMode === 'verify-full') {
sslConfig.rejectUnauthorized = true
if (process.env.DATABASE_SSL_CA) {
try {
const ca = Buffer.from(process.env.DATABASE_SSL_CA, 'base64').toString('utf-8')
sslConfig.ca = ca
} catch (error) {
console.error('Failed to parse DATABASE_SSL_CA:', error)
}
}
}

return sslConfig
}

const sslConfig = getSSLConfig()

export default {
schema: './schema.ts',
out: './migrations',
dialect: 'postgresql',
dbCredentials: {
url: process.env.DATABASE_URL!,
...(sslConfig !== undefined && { ssl: sslConfig }),
},
} satisfies Config
41 changes: 0 additions & 41 deletions packages/db/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import type { ConnectionOptions } from 'node:tls'
import { drizzle, type PostgresJsDatabase } from 'drizzle-orm/postgres-js'
import postgres from 'postgres'
import * as schema from './schema'
Expand All @@ -11,52 +10,12 @@ if (!connectionString) {
throw new Error('Missing DATABASE_URL environment variable')
}

const getSSLConfig = () => {
const sslMode = process.env.DATABASE_SSL?.toLowerCase()

if (!sslMode) {
return undefined
}

if (sslMode === 'disable') {
return false
}

if (sslMode === 'prefer') {
return 'prefer'
}

const sslConfig: ConnectionOptions = {}

if (sslMode === 'require') {
sslConfig.rejectUnauthorized = false
} else if (sslMode === 'verify-ca' || sslMode === 'verify-full') {
sslConfig.rejectUnauthorized = true
if (process.env.DATABASE_SSL_CA) {
try {
const ca = Buffer.from(process.env.DATABASE_SSL_CA, 'base64').toString('utf-8')
sslConfig.ca = ca
} catch (error) {
console.error('Failed to parse DATABASE_SSL_CA:', error)
}
}
} else {
throw new Error(
`Invalid DATABASE_SSL mode: ${sslMode}. Must be one of: disable, prefer, require, verify-ca, verify-full`
)
}

return sslConfig
}

const sslConfig = getSSLConfig()
const postgresClient = postgres(connectionString, {
prepare: false,
idle_timeout: 20,
connect_timeout: 30,
max: 80,
onnotice: () => {},
...(sslConfig !== undefined && { ssl: sslConfig }),
})

const drizzleClient = drizzle(postgresClient, { schema })
Expand Down
37 changes: 2 additions & 35 deletions packages/db/scripts/deregister-sso-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
* SSO_PROVIDER_ID=provider-id (optional, if not provided will remove all providers for user)
*/

import type { ConnectionOptions } from 'node:tls'
import { and, eq } from 'drizzle-orm'
import { drizzle } from 'drizzle-orm/postgres-js'
import postgres from 'postgres'
Expand Down Expand Up @@ -45,50 +44,18 @@ const logger = {
}

// Get database URL from environment
const CONNECTION_STRING = process.env.DATABASE_URL
const CONNECTION_STRING = process.env.POSTGRES_URL ?? process.env.DATABASE_URL
if (!CONNECTION_STRING) {
console.error('❌ DATABASE_URL environment variable is required')
console.error('❌ POSTGRES_URL or DATABASE_URL environment variable is required')
process.exit(1)
}

const getSSLConfig = () => {
const sslMode = process.env.DATABASE_SSL?.toLowerCase()

if (!sslMode) return undefined
if (sslMode === 'disable') return false
if (sslMode === 'prefer') return 'prefer'

const sslConfig: ConnectionOptions = {}

if (sslMode === 'require') {
sslConfig.rejectUnauthorized = false
} else if (sslMode === 'verify-ca' || sslMode === 'verify-full') {
sslConfig.rejectUnauthorized = true
if (process.env.DATABASE_SSL_CA) {
try {
const ca = Buffer.from(process.env.DATABASE_SSL_CA, 'base64').toString('utf-8')
sslConfig.ca = ca
} catch (error) {
console.error('Failed to parse DATABASE_SSL_CA:', error)
}
}
} else {
throw new Error(
`Invalid DATABASE_SSL mode: ${sslMode}. Must be one of: disable, prefer, require, verify-ca, verify-full`
)
}

return sslConfig
}

const sslConfig = getSSLConfig()
const postgresClient = postgres(CONNECTION_STRING, {
prepare: false,
idle_timeout: 20,
connect_timeout: 30,
max: 10,
onnotice: () => {},
...(sslConfig !== undefined && { ssl: sslConfig }),
})
const db = drizzle(postgresClient)

Expand Down
Loading