// 환경설정 로더. 프로젝트 루트(.env)를 읽어 데몬 전역 설정으로 노출한다. import dotenv from 'dotenv'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const ROOT = path.resolve(__dirname, '..', '..'); // /home/opc/sundol dotenv.config({ path: path.join(ROOT, '.env') }); function required(name) { const v = process.env[name]; if (v === undefined || v === null || v === '') { throw new Error(`필수 환경변수 누락: ${name}`); } return v; } export const config = { root: ROOT, oracle: { user: required('ORACLE_USERNAME'), password: required('ORACLE_PASSWORD'), connectString: required('ORACLE_TNS_NAME'), walletPath: required('ORACLE_WALLET_PATH'), // thick 모드: Instant Client 라이브러리 + sso 지갑을 읽을 net 설정 디렉터리 icLibDir: process.env.ORACLE_IC_LIB_DIR || '/home/opc/oracle-ic/instantclient_23_26', netConfigDir: process.env.ORACLE_NET_CONFIG_DIR || path.join(ROOT, 'government', 'oracle-net'), }, dataGoKr: { apiKey: process.env.DATA_GO_KR_API_KEY || '', }, bizinfo: { crtfcKey: process.env.BIZINFO_CRTFC_KEY || '', }, jina: { apiKey: process.env.JINA_READER_API_KEY || '', }, cdpUrl: process.env.GOV_CDP_URL || 'http://127.0.0.1:9222', pollIntervalMinutes: Number(process.env.GOV_POLL_INTERVAL_MINUTES || 60), };