ERP-node/backend-node/scripts/add-external-db-connection.ts

175 lines
5.1 KiB
TypeScript

/**
* 외부 DB 연결 정보 추가 스크립트
* 비밀번호를 암호화하여 안전하게 저장
*/
import { Pool } from "pg";
import { CredentialEncryption } from "../src/utils/credentialEncryption";
async function addExternalDbConnection() {
const pool = new Pool({
host: process.env.DB_HOST || "localhost",
port: parseInt(process.env.DB_PORT || "5432"),
database: process.env.DB_NAME || "plm",
user: process.env.DB_USER || "postgres",
password: process.env.DB_PASSWORD || "ph0909!!",
});
// 환경 변수에서 암호화 키 가져오기 (없으면 기본값 사용)
const encryptionKey =
process.env.ENCRYPTION_SECRET_KEY || "default-secret-key-for-development";
const encryption = new CredentialEncryption(encryptionKey);
try {
// 외부 DB 연결 정보 (실제 사용할 외부 DB 정보를 여기에 입력)
const externalDbConnections = [
{
name: "운영_외부_PostgreSQL",
description: "운영용 외부 PostgreSQL 데이터베이스",
dbType: "postgresql",
host: "39.117.244.52",
port: 11132,
databaseName: "plm",
username: "postgres",
password: "ph0909!!", // 이 값은 암호화되어 저장됩니다
sslEnabled: false,
isActive: true,
},
// 필요한 경우 추가 외부 DB 연결 정보를 여기에 추가
// {
// name: "테스트_MySQL",
// description: "테스트용 MySQL 데이터베이스",
// dbType: "mysql",
// host: "test-mysql.example.com",
// port: 3306,
// databaseName: "testdb",
// username: "testuser",
// password: "testpass",
// sslEnabled: true,
// isActive: true,
// },
];
for (const conn of externalDbConnections) {
// 비밀번호 암호화
const encryptedPassword = encryption.encrypt(conn.password);
// 중복 체크 (이름 기준)
const existingResult = await pool.query(
"SELECT id FROM flow_external_db_connection WHERE name = $1",
[conn.name]
);
if (existingResult.rows.length > 0) {
console.log(
`⚠️ 이미 존재하는 연결: ${conn.name} (ID: ${existingResult.rows[0].id})`
);
// 기존 연결 업데이트
await pool.query(
`UPDATE flow_external_db_connection
SET description = $1,
db_type = $2,
host = $3,
port = $4,
database_name = $5,
username = $6,
password_encrypted = $7,
ssl_enabled = $8,
is_active = $9,
updated_at = NOW(),
updated_by = 'system'
WHERE name = $10`,
[
conn.description,
conn.dbType,
conn.host,
conn.port,
conn.databaseName,
conn.username,
encryptedPassword,
conn.sslEnabled,
conn.isActive,
conn.name,
]
);
console.log(`✅ 연결 정보 업데이트 완료: ${conn.name}`);
} else {
// 새 연결 추가
const result = await pool.query(
`INSERT INTO flow_external_db_connection (
name,
description,
db_type,
host,
port,
database_name,
username,
password_encrypted,
ssl_enabled,
is_active,
created_by
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, 'system')
RETURNING id`,
[
conn.name,
conn.description,
conn.dbType,
conn.host,
conn.port,
conn.databaseName,
conn.username,
encryptedPassword,
conn.sslEnabled,
conn.isActive,
]
);
console.log(
`✅ 새 연결 추가 완료: ${conn.name} (ID: ${result.rows[0].id})`
);
}
// 연결 테스트
console.log(`🔍 연결 테스트 중: ${conn.name}...`);
const testPool = new Pool({
host: conn.host,
port: conn.port,
database: conn.databaseName,
user: conn.username,
password: conn.password,
ssl: conn.sslEnabled,
connectionTimeoutMillis: 5000,
});
try {
const client = await testPool.connect();
await client.query("SELECT 1");
client.release();
console.log(`✅ 연결 테스트 성공: ${conn.name}`);
} catch (testError: any) {
console.error(`❌ 연결 테스트 실패: ${conn.name}`, testError.message);
} finally {
await testPool.end();
}
}
console.log("\n✅ 모든 외부 DB 연결 정보 처리 완료");
} catch (error) {
console.error("❌ 외부 DB 연결 정보 추가 오류:", error);
throw error;
} finally {
await pool.end();
}
}
// 스크립트 실행
addExternalDbConnection()
.then(() => {
console.log("✅ 스크립트 완료");
process.exit(0);
})
.catch((error) => {
console.error("❌ 스크립트 실패:", error);
process.exit(1);
});