Skip to content

Commit 2175fd1

Browse files
authored
v0.4.4: database config updates
2 parents cae0e85 + 10692b5 commit 2175fd1

File tree

7 files changed

+22
-214
lines changed

7 files changed

+22
-214
lines changed

apps/sim/.env.example

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
# Database (Required)
22
DATABASE_URL="postgresql://postgres:password@localhost:5432/postgres"
3-
# DATABASE_SSL=disable # Optional: SSL mode (disable, prefer, require, verify-ca, verify-full)
4-
# DATABASE_SSL_CA= # Optional: Base64-encoded CA certificate (required for verify-ca/verify-full)
5-
# To generate: cat your-ca.crt | base64 | tr -d '\n'
63

74
# PostgreSQL Port (Optional) - defaults to 5432 if not specified
85
# POSTGRES_PORT=5432

apps/sim/socket-server/database/operations.ts

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { ConnectionOptions } from 'node:tls'
21
import * as schema from '@sim/db'
32
import { workflow, workflowBlocks, workflowEdges, workflowSubflows } from '@sim/db'
43
import { and, eq, or, sql } from 'drizzle-orm'
@@ -11,34 +10,6 @@ import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers'
1110
const logger = createLogger('SocketDatabase')
1211

1312
const connectionString = env.DATABASE_URL
14-
15-
const getSSLConfig = () => {
16-
const sslMode = env.DATABASE_SSL
17-
18-
if (!sslMode) return undefined
19-
if (sslMode === 'disable') return false
20-
if (sslMode === 'prefer') return 'prefer'
21-
22-
const sslConfig: ConnectionOptions = {}
23-
24-
if (sslMode === 'require') {
25-
sslConfig.rejectUnauthorized = false
26-
} else if (sslMode === 'verify-ca' || sslMode === 'verify-full') {
27-
sslConfig.rejectUnauthorized = true
28-
if (env.DATABASE_SSL_CA) {
29-
try {
30-
const ca = Buffer.from(env.DATABASE_SSL_CA, 'base64').toString('utf-8')
31-
sslConfig.ca = ca
32-
} catch (error) {
33-
logger.error('Failed to parse DATABASE_SSL_CA:', error)
34-
}
35-
}
36-
}
37-
38-
return sslConfig
39-
}
40-
41-
const sslConfig = getSSLConfig()
4213
const socketDb = drizzle(
4314
postgres(connectionString, {
4415
prepare: false,
@@ -47,7 +18,6 @@ const socketDb = drizzle(
4718
max: 25,
4819
onnotice: () => {},
4920
debug: false,
50-
...(sslConfig !== undefined && { ssl: sslConfig }),
5121
}),
5222
{ schema }
5323
)
@@ -162,6 +132,7 @@ export async function getWorkflowState(workflowId: string) {
162132
const finalState = {
163133
// Default values for expected properties
164134
deploymentStatuses: {},
135+
hasActiveWebhook: false,
165136
// Data from normalized tables
166137
blocks: normalizedData.blocks,
167138
edges: normalizedData.edges,
@@ -195,7 +166,23 @@ export async function persistWorkflowOperation(workflowId: string, operation: an
195166
try {
196167
const { operation: op, target, payload, timestamp, userId } = operation
197168

169+
// Log high-frequency operations for monitoring
170+
if (op === 'update-position' && Math.random() < 0.01) {
171+
// Log 1% of position updates
172+
logger.debug('Socket DB operation sample:', {
173+
operation: op,
174+
target,
175+
workflowId: `${workflowId.substring(0, 8)}...`,
176+
})
177+
}
178+
198179
await db.transaction(async (tx) => {
180+
// Update the workflow's last modified timestamp first
181+
await tx
182+
.update(workflow)
183+
.set({ updatedAt: new Date(timestamp) })
184+
.where(eq(workflow.id, workflowId))
185+
199186
// Handle different operation types within the transaction
200187
switch (target) {
201188
case 'block':
@@ -213,13 +200,6 @@ export async function persistWorkflowOperation(workflowId: string, operation: an
213200
default:
214201
throw new Error(`Unknown operation target: ${target}`)
215202
}
216-
217-
if (op !== 'update-position') {
218-
await tx
219-
.update(workflow)
220-
.set({ updatedAt: new Date(timestamp) })
221-
.where(eq(workflow.id, workflowId))
222-
}
223203
})
224204

225205
// Log slow operations for monitoring

apps/sim/socket-server/rooms/manager.ts

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { ConnectionOptions } from 'node:tls'
21
import * as schema from '@sim/db/schema'
32
import { workflowBlocks, workflowEdges } from '@sim/db/schema'
43
import { and, eq, isNull } from 'drizzle-orm'
@@ -9,42 +8,13 @@ import { env } from '@/lib/env'
98
import { createLogger } from '@/lib/logs/console/logger'
109

1110
const connectionString = env.DATABASE_URL
12-
13-
const getSSLConfig = () => {
14-
const sslMode = env.DATABASE_SSL
15-
16-
if (!sslMode) return undefined
17-
if (sslMode === 'disable') return false
18-
if (sslMode === 'prefer') return 'prefer'
19-
20-
const sslConfig: ConnectionOptions = {}
21-
22-
if (sslMode === 'require') {
23-
sslConfig.rejectUnauthorized = false
24-
} else if (sslMode === 'verify-ca' || sslMode === 'verify-full') {
25-
sslConfig.rejectUnauthorized = true
26-
if (env.DATABASE_SSL_CA) {
27-
try {
28-
const ca = Buffer.from(env.DATABASE_SSL_CA, 'base64').toString('utf-8')
29-
sslConfig.ca = ca
30-
} catch (error) {
31-
console.error('Failed to parse DATABASE_SSL_CA:', error)
32-
}
33-
}
34-
}
35-
36-
return sslConfig
37-
}
38-
39-
const sslConfig = getSSLConfig()
4011
const db = drizzle(
4112
postgres(connectionString, {
4213
prepare: false,
4314
idle_timeout: 15,
4415
connect_timeout: 20,
4516
max: 5,
4617
onnotice: () => {},
47-
...(sslConfig !== undefined && { ssl: sslConfig }),
4818
}),
4919
{ schema }
5020
)

packages/db/index.ts

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { ConnectionOptions } from 'node:tls'
21
import { drizzle, type PostgresJsDatabase } from 'drizzle-orm/postgres-js'
32
import postgres from 'postgres'
43
import * as schema from './schema'
@@ -11,52 +10,12 @@ if (!connectionString) {
1110
throw new Error('Missing DATABASE_URL environment variable')
1211
}
1312

14-
const getSSLConfig = () => {
15-
const sslMode = process.env.DATABASE_SSL?.toLowerCase()
16-
17-
if (!sslMode) {
18-
return undefined
19-
}
20-
21-
if (sslMode === 'disable') {
22-
return false
23-
}
24-
25-
if (sslMode === 'prefer') {
26-
return 'prefer'
27-
}
28-
29-
const sslConfig: ConnectionOptions = {}
30-
31-
if (sslMode === 'require') {
32-
sslConfig.rejectUnauthorized = false
33-
} else if (sslMode === 'verify-ca' || sslMode === 'verify-full') {
34-
sslConfig.rejectUnauthorized = true
35-
if (process.env.DATABASE_SSL_CA) {
36-
try {
37-
const ca = Buffer.from(process.env.DATABASE_SSL_CA, 'base64').toString('utf-8')
38-
sslConfig.ca = ca
39-
} catch (error) {
40-
console.error('Failed to parse DATABASE_SSL_CA:', error)
41-
}
42-
}
43-
} else {
44-
throw new Error(
45-
`Invalid DATABASE_SSL mode: ${sslMode}. Must be one of: disable, prefer, require, verify-ca, verify-full`
46-
)
47-
}
48-
49-
return sslConfig
50-
}
51-
52-
const sslConfig = getSSLConfig()
5313
const postgresClient = postgres(connectionString, {
5414
prepare: false,
5515
idle_timeout: 20,
5616
connect_timeout: 30,
5717
max: 80,
5818
onnotice: () => {},
59-
...(sslConfig !== undefined && { ssl: sslConfig }),
6019
})
6120

6221
const drizzleClient = drizzle(postgresClient, { schema })

packages/db/scripts/deregister-sso-provider.ts

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
* SSO_PROVIDER_ID=provider-id (optional, if not provided will remove all providers for user)
1414
*/
1515

16-
import type { ConnectionOptions } from 'node:tls'
1716
import { and, eq } from 'drizzle-orm'
1817
import { drizzle } from 'drizzle-orm/postgres-js'
1918
import postgres from 'postgres'
@@ -45,50 +44,18 @@ const logger = {
4544
}
4645

4746
// Get database URL from environment
48-
const CONNECTION_STRING = process.env.DATABASE_URL
47+
const CONNECTION_STRING = process.env.POSTGRES_URL ?? process.env.DATABASE_URL
4948
if (!CONNECTION_STRING) {
50-
console.error('❌ DATABASE_URL environment variable is required')
49+
console.error('❌ POSTGRES_URL or DATABASE_URL environment variable is required')
5150
process.exit(1)
5251
}
5352

54-
const getSSLConfig = () => {
55-
const sslMode = process.env.DATABASE_SSL?.toLowerCase()
56-
57-
if (!sslMode) return undefined
58-
if (sslMode === 'disable') return false
59-
if (sslMode === 'prefer') return 'prefer'
60-
61-
const sslConfig: ConnectionOptions = {}
62-
63-
if (sslMode === 'require') {
64-
sslConfig.rejectUnauthorized = false
65-
} else if (sslMode === 'verify-ca' || sslMode === 'verify-full') {
66-
sslConfig.rejectUnauthorized = true
67-
if (process.env.DATABASE_SSL_CA) {
68-
try {
69-
const ca = Buffer.from(process.env.DATABASE_SSL_CA, 'base64').toString('utf-8')
70-
sslConfig.ca = ca
71-
} catch (error) {
72-
console.error('Failed to parse DATABASE_SSL_CA:', error)
73-
}
74-
}
75-
} else {
76-
throw new Error(
77-
`Invalid DATABASE_SSL mode: ${sslMode}. Must be one of: disable, prefer, require, verify-ca, verify-full`
78-
)
79-
}
80-
81-
return sslConfig
82-
}
83-
84-
const sslConfig = getSSLConfig()
8553
const postgresClient = postgres(CONNECTION_STRING, {
8654
prepare: false,
8755
idle_timeout: 20,
8856
connect_timeout: 30,
8957
max: 10,
9058
onnotice: () => {},
91-
...(sslConfig !== undefined && { ssl: sslConfig }),
9259
})
9360
const db = drizzle(postgresClient)
9461

packages/db/scripts/migrate-deployment-versions.ts

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
// This script is intentionally self-contained for execution in the migrations image.
44
// Do not import from the main app code; duplicate minimal schema and DB setup here.
55

6-
import type { ConnectionOptions } from 'node:tls'
76
import { sql } from 'drizzle-orm'
87
import { drizzle } from 'drizzle-orm/postgres-js'
98
import postgres from 'postgres'
@@ -118,44 +117,12 @@ const workflowDeploymentVersion = pgTable(
118117
)
119118

120119
// ---------- DB client ----------
121-
const getSSLConfig = () => {
122-
const sslMode = process.env.DATABASE_SSL?.toLowerCase()
123-
124-
if (!sslMode) return undefined
125-
if (sslMode === 'disable') return false
126-
if (sslMode === 'prefer') return 'prefer'
127-
128-
const sslConfig: ConnectionOptions = {}
129-
130-
if (sslMode === 'require') {
131-
sslConfig.rejectUnauthorized = false
132-
} else if (sslMode === 'verify-ca' || sslMode === 'verify-full') {
133-
sslConfig.rejectUnauthorized = true
134-
if (process.env.DATABASE_SSL_CA) {
135-
try {
136-
const ca = Buffer.from(process.env.DATABASE_SSL_CA, 'base64').toString('utf-8')
137-
sslConfig.ca = ca
138-
} catch (error) {
139-
console.error('Failed to parse DATABASE_SSL_CA:', error)
140-
}
141-
}
142-
} else {
143-
throw new Error(
144-
`Invalid DATABASE_SSL mode: ${sslMode}. Must be one of: disable, prefer, require, verify-ca, verify-full`
145-
)
146-
}
147-
148-
return sslConfig
149-
}
150-
151-
const sslConfig = getSSLConfig()
152120
const postgresClient = postgres(CONNECTION_STRING, {
153121
prepare: false,
154122
idle_timeout: 20,
155123
connect_timeout: 30,
156124
max: 10,
157125
onnotice: () => {},
158-
...(sslConfig !== undefined && { ssl: sslConfig }),
159126
})
160127
const db = drizzle(postgresClient)
161128

packages/db/scripts/register-sso-provider.ts

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
* SSO_SAML_WANT_ASSERTIONS_SIGNED=true (optional, defaults to false)
3333
*/
3434

35-
import type { ConnectionOptions } from 'node:tls'
3635
import { eq } from 'drizzle-orm'
3736
import { drizzle } from 'drizzle-orm/postgres-js'
3837
import postgres from 'postgres'
@@ -135,50 +134,19 @@ const logger = {
135134
}
136135

137136
// Get database URL from environment
138-
const CONNECTION_STRING = process.env.DATABASE_URL
137+
const CONNECTION_STRING = process.env.POSTGRES_URL ?? process.env.DATABASE_URL
139138
if (!CONNECTION_STRING) {
140-
console.error('❌ DATABASE_URL environment variable is required')
139+
console.error('❌ POSTGRES_URL or DATABASE_URL environment variable is required')
141140
process.exit(1)
142141
}
143142

144-
const getSSLConfig = () => {
145-
const sslMode = process.env.DATABASE_SSL?.toLowerCase()
146-
147-
if (!sslMode) return undefined
148-
if (sslMode === 'disable') return false
149-
if (sslMode === 'prefer') return 'prefer'
150-
151-
const sslConfig: ConnectionOptions = {}
152-
153-
if (sslMode === 'require') {
154-
sslConfig.rejectUnauthorized = false
155-
} else if (sslMode === 'verify-ca' || sslMode === 'verify-full') {
156-
sslConfig.rejectUnauthorized = true
157-
if (process.env.DATABASE_SSL_CA) {
158-
try {
159-
const ca = Buffer.from(process.env.DATABASE_SSL_CA, 'base64').toString('utf-8')
160-
sslConfig.ca = ca
161-
} catch (error) {
162-
console.error('Failed to parse DATABASE_SSL_CA:', error)
163-
}
164-
}
165-
} else {
166-
throw new Error(
167-
`Invalid DATABASE_SSL mode: ${sslMode}. Must be one of: disable, prefer, require, verify-ca, verify-full`
168-
)
169-
}
170-
171-
return sslConfig
172-
}
173-
174-
const sslConfig = getSSLConfig()
143+
// Initialize database connection (following migration script pattern)
175144
const postgresClient = postgres(CONNECTION_STRING, {
176145
prepare: false,
177146
idle_timeout: 20,
178147
connect_timeout: 30,
179148
max: 10,
180149
onnotice: () => {},
181-
...(sslConfig !== undefined && { ssl: sslConfig }),
182150
})
183151
const db = drizzle(postgresClient)
184152

0 commit comments

Comments
 (0)