Docker 파일
This commit is contained in:
@@ -1,18 +1,15 @@
|
|||||||
import { initPrivnetTables, shouldAutoStartScheduler } from '../utils/db'
|
import { shouldAutoStartScheduler } from '../utils/db'
|
||||||
import { privnetScheduler } from '../utils/privnet-scheduler'
|
import { privnetScheduler } from '../utils/privnet-scheduler'
|
||||||
|
|
||||||
export default defineNitroPlugin(async (nitroApp) => {
|
export default defineNitroPlugin(async (nitroApp) => {
|
||||||
console.log('[Plugin] privnet-init starting...')
|
console.log('[Plugin] privnet-init starting...')
|
||||||
|
|
||||||
// DB 테이블 초기화
|
|
||||||
await initPrivnetTables()
|
|
||||||
|
|
||||||
// 스케줄러 자동 시작 (환경에 따라)
|
// 스케줄러 자동 시작 (환경에 따라)
|
||||||
if (shouldAutoStartScheduler()) {
|
if (shouldAutoStartScheduler()) {
|
||||||
privnetScheduler.start()
|
privnetScheduler.start()
|
||||||
console.log('[Plugin] privnet scheduler auto-started (production mode)')
|
console.log('[Plugin] privnet scheduler auto-started (production mode)')
|
||||||
} else {
|
} else {
|
||||||
console.log('[Plugin] privnet scheduler NOT started (development mode - use API to start)')
|
console.log('[Plugin] privnet scheduler NOT started (development mode)')
|
||||||
}
|
}
|
||||||
|
|
||||||
// 서버 종료 시 클린업
|
// 서버 종료 시 클린업
|
||||||
|
|||||||
@@ -1,18 +1,15 @@
|
|||||||
import { initPubnetTables, shouldAutoStartScheduler } from '../utils/db'
|
import { shouldAutoStartScheduler } from '../utils/db'
|
||||||
import { pubnetScheduler } from '../utils/pubnet-scheduler'
|
import { pubnetScheduler } from '../utils/pubnet-scheduler'
|
||||||
|
|
||||||
export default defineNitroPlugin(async (nitroApp) => {
|
export default defineNitroPlugin(async (nitroApp) => {
|
||||||
console.log('[Plugin] pubnet-init starting...')
|
console.log('[Plugin] pubnet-init starting...')
|
||||||
|
|
||||||
// DB 테이블 초기화
|
|
||||||
await initPubnetTables()
|
|
||||||
|
|
||||||
// 스케줄러 자동 시작 (환경에 따라)
|
// 스케줄러 자동 시작 (환경에 따라)
|
||||||
if (shouldAutoStartScheduler()) {
|
if (shouldAutoStartScheduler()) {
|
||||||
pubnetScheduler.start()
|
pubnetScheduler.start()
|
||||||
console.log('[Plugin] pubnet scheduler auto-started (production mode)')
|
console.log('[Plugin] pubnet scheduler auto-started (production mode)')
|
||||||
} else {
|
} else {
|
||||||
console.log('[Plugin] pubnet scheduler NOT started (development mode - use API to start)')
|
console.log('[Plugin] pubnet scheduler NOT started (development mode)')
|
||||||
}
|
}
|
||||||
|
|
||||||
// 서버 종료 시 클린업
|
// 서버 종료 시 클린업
|
||||||
|
|||||||
@@ -63,121 +63,13 @@ export async function execute(sql: string, params?: any[]): Promise<number> {
|
|||||||
* 스케줄러 자동시작 여부
|
* 스케줄러 자동시작 여부
|
||||||
*/
|
*/
|
||||||
export function shouldAutoStartScheduler(): boolean {
|
export function shouldAutoStartScheduler(): boolean {
|
||||||
// 환경변수로 명시적 설정된 경우
|
|
||||||
const envValue = process.env.AUTO_START_SCHEDULER
|
const envValue = process.env.AUTO_START_SCHEDULER
|
||||||
if (envValue !== undefined) {
|
if (envValue !== undefined) {
|
||||||
return envValue === 'true'
|
return envValue === 'true'
|
||||||
}
|
}
|
||||||
// 기본값: production=true, development=false
|
|
||||||
return !isDev
|
return !isDev
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* pubnet 테이블 초기화 (PostgreSQL용)
|
|
||||||
*/
|
|
||||||
export async function initPubnetTables(): Promise<void> {
|
|
||||||
const pool = getPool()
|
|
||||||
|
|
||||||
// pubnet_targets
|
|
||||||
await pool.query(`
|
|
||||||
CREATE TABLE IF NOT EXISTS pubnet_targets (
|
|
||||||
id SERIAL PRIMARY KEY,
|
|
||||||
name TEXT NOT NULL,
|
|
||||||
url TEXT NOT NULL UNIQUE,
|
|
||||||
is_active INTEGER DEFAULT 1,
|
|
||||||
sort_order INTEGER DEFAULT 0,
|
|
||||||
created_at TEXT DEFAULT to_char(NOW(), 'YYYY-MM-DD HH24:MI:SS'),
|
|
||||||
updated_at TEXT DEFAULT to_char(NOW(), 'YYYY-MM-DD HH24:MI:SS')
|
|
||||||
)
|
|
||||||
`)
|
|
||||||
|
|
||||||
// pubnet_logs
|
|
||||||
await pool.query(`
|
|
||||||
CREATE TABLE IF NOT EXISTS pubnet_logs (
|
|
||||||
id SERIAL PRIMARY KEY,
|
|
||||||
target_id INTEGER NOT NULL,
|
|
||||||
is_success INTEGER NOT NULL,
|
|
||||||
checked_at TEXT DEFAULT to_char(NOW(), 'YYYY-MM-DD HH24:MI:SS'),
|
|
||||||
FOREIGN KEY (target_id) REFERENCES pubnet_targets(id)
|
|
||||||
)
|
|
||||||
`)
|
|
||||||
|
|
||||||
// pubnet_status (싱글톤 패턴)
|
|
||||||
await pool.query(`
|
|
||||||
CREATE TABLE IF NOT EXISTS pubnet_status (
|
|
||||||
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
||||||
current_index INTEGER DEFAULT 0,
|
|
||||||
check_interval INTEGER DEFAULT 300000,
|
|
||||||
is_healthy INTEGER DEFAULT 1,
|
|
||||||
last_target_id INTEGER,
|
|
||||||
last_checked_at TEXT,
|
|
||||||
scheduler_running INTEGER DEFAULT 0,
|
|
||||||
updated_at TEXT DEFAULT to_char(NOW(), 'YYYY-MM-DD HH24:MI:SS')
|
|
||||||
)
|
|
||||||
`)
|
|
||||||
|
|
||||||
// 상태 행 존재 확인 및 생성
|
|
||||||
const statusExists = await queryOne<{ cnt: number }>('SELECT COUNT(*) as cnt FROM pubnet_status')
|
|
||||||
if (!statusExists || statusExists.cnt === 0) {
|
|
||||||
await pool.query('INSERT INTO pubnet_status (id) VALUES (1)')
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('[DB] pubnet tables initialized')
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* privnet 테이블 초기화 (PostgreSQL용)
|
|
||||||
*/
|
|
||||||
export async function initPrivnetTables(): Promise<void> {
|
|
||||||
const pool = getPool()
|
|
||||||
|
|
||||||
// privnet_targets
|
|
||||||
await pool.query(`
|
|
||||||
CREATE TABLE IF NOT EXISTS privnet_targets (
|
|
||||||
id SERIAL PRIMARY KEY,
|
|
||||||
name TEXT NOT NULL,
|
|
||||||
url TEXT NOT NULL UNIQUE,
|
|
||||||
is_active INTEGER DEFAULT 1,
|
|
||||||
sort_order INTEGER DEFAULT 0,
|
|
||||||
created_at TEXT DEFAULT to_char(NOW(), 'YYYY-MM-DD HH24:MI:SS'),
|
|
||||||
updated_at TEXT DEFAULT to_char(NOW(), 'YYYY-MM-DD HH24:MI:SS')
|
|
||||||
)
|
|
||||||
`)
|
|
||||||
|
|
||||||
// privnet_logs
|
|
||||||
await pool.query(`
|
|
||||||
CREATE TABLE IF NOT EXISTS privnet_logs (
|
|
||||||
id SERIAL PRIMARY KEY,
|
|
||||||
target_id INTEGER NOT NULL,
|
|
||||||
is_success INTEGER NOT NULL,
|
|
||||||
checked_at TEXT DEFAULT to_char(NOW(), 'YYYY-MM-DD HH24:MI:SS'),
|
|
||||||
FOREIGN KEY (target_id) REFERENCES privnet_targets(id)
|
|
||||||
)
|
|
||||||
`)
|
|
||||||
|
|
||||||
// privnet_status (싱글톤 패턴)
|
|
||||||
await pool.query(`
|
|
||||||
CREATE TABLE IF NOT EXISTS privnet_status (
|
|
||||||
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
||||||
current_index INTEGER DEFAULT 0,
|
|
||||||
check_interval INTEGER DEFAULT 300000,
|
|
||||||
is_healthy INTEGER DEFAULT 1,
|
|
||||||
last_target_id INTEGER,
|
|
||||||
last_checked_at TEXT,
|
|
||||||
scheduler_running INTEGER DEFAULT 0,
|
|
||||||
updated_at TEXT DEFAULT to_char(NOW(), 'YYYY-MM-DD HH24:MI:SS')
|
|
||||||
)
|
|
||||||
`)
|
|
||||||
|
|
||||||
// 상태 행 존재 확인 및 생성
|
|
||||||
const statusExists = await queryOne<{ cnt: number }>('SELECT COUNT(*) as cnt FROM privnet_status')
|
|
||||||
if (!statusExists || statusExists.cnt === 0) {
|
|
||||||
await pool.query('INSERT INTO privnet_status (id) VALUES (1)')
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('[DB] privnet tables initialized')
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 연결 풀 종료
|
* 연결 풀 종료
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user