Skip to content

Commit 13fbedd

Browse files
committed
Implement proper PostgreSQL SSL configuration with CA certificate support
- Parse DATABASE_URL manually for better SSL control - Add support for CA_CERT/CACERT environment variables - Include SSL debugging information - Fix self-signed certificate issues with DigitalOcean managed databases
1 parent 818751b commit 13fbedd

File tree

2 files changed

+61
-10
lines changed

2 files changed

+61
-10
lines changed

client/src/cyber-forensics-platform/scripts/init-db-postgres.js

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,27 @@ async function initializeDatabase() {
88
throw new Error('DATABASE_URL is required for PostgreSQL initialization');
99
}
1010

11-
const pool = new Pool({
12-
connectionString: process.env.DATABASE_URL,
13-
ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false
14-
});
11+
// Parse DATABASE_URL to get individual components for better SSL handling
12+
let config;
13+
14+
if (process.env.DATABASE_URL) {
15+
const url = new URL(process.env.DATABASE_URL);
16+
config = {
17+
user: url.username,
18+
password: url.password,
19+
host: url.hostname,
20+
port: parseInt(url.port),
21+
database: url.pathname.slice(1), // Remove leading slash
22+
ssl: process.env.NODE_ENV === 'production' ? {
23+
rejectUnauthorized: false,
24+
ca: process.env.CA_CERT || process.env.CACERT
25+
} : false
26+
};
27+
} else {
28+
throw new Error('DATABASE_URL is required');
29+
}
30+
31+
const pool = new Pool(config);
1532

1633
try {
1734
console.log('🚀 Initializing PostgreSQL database...');

client/src/cyber-forensics-platform/src/lib/database-postgres.js

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,51 @@ const { Pool } = require('pg');
22

33
class PostgresDatabaseManager {
44
constructor() {
5-
this.pool = new Pool({
6-
connectionString: process.env.DATABASE_URL,
7-
ssl: process.env.NODE_ENV === 'production' ? {
8-
rejectUnauthorized: false
9-
} : false
10-
});
5+
// Parse DATABASE_URL to get individual components
6+
let config;
7+
8+
if (process.env.DATABASE_URL) {
9+
const url = new URL(process.env.DATABASE_URL);
10+
config = {
11+
user: url.username,
12+
password: url.password,
13+
host: url.hostname,
14+
port: parseInt(url.port),
15+
database: url.pathname.slice(1), // Remove leading slash
16+
ssl: process.env.NODE_ENV === 'production' ? {
17+
rejectUnauthorized: false,
18+
ca: process.env.CA_CERT || process.env.CACERT
19+
} : false
20+
};
21+
} else {
22+
// Fallback to individual environment variables
23+
config = {
24+
user: process.env.PGUSER,
25+
password: process.env.PGPASSWORD,
26+
host: process.env.PGHOST,
27+
port: process.env.PGPORT,
28+
database: process.env.PGDATABASE,
29+
ssl: process.env.NODE_ENV === 'production' ? {
30+
rejectUnauthorized: false,
31+
ca: process.env.CA_CERT || process.env.CACERT
32+
} : false
33+
};
34+
}
35+
36+
this.pool = new Pool(config);
1137
}
1238

1339
// Initialize database connection
1440
async connect() {
1541
try {
42+
// Debug: Log available cert environment variables
43+
console.log('🔍 SSL Debug:', {
44+
CA_CERT_available: !!process.env.CA_CERT,
45+
CACERT_available: !!process.env.CACERT,
46+
NODE_ENV: process.env.NODE_ENV,
47+
DATABASE_URL_present: !!process.env.DATABASE_URL
48+
});
49+
1650
await this.pool.query('SELECT NOW()');
1751
console.log('📊 Connected to PostgreSQL database');
1852
} catch (err) {

0 commit comments

Comments
 (0)