From 0a322bafa3607bb84c5c361c64e982a1016d7eb4 Mon Sep 17 00:00:00 2001 From: chpark Date: Fri, 27 Mar 2026 01:23:32 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20DB=20=EC=97=B0=EA=B2=B0=20=EC=9E=AC?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20+=20git=20=EC=9D=B8=EC=A6=9D=20+=20?= =?UTF-8?q?=EB=B3=BC=EB=A5=A8=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - db.js: waitForDB() 추가 (최대 10회, 3초 간격 재시도) - app.js: DB 연결 시 waitForDB 사용 - start-server.sh: git 유저명 @를 %40으로 인코딩 - docker-compose.yml: 볼륨 상대경로로 변경 (./data/) - 디렉토리 권한 문제 해결 Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitignore | 1 + docker-compose.yml | 4 ++-- setup-server.sh | 6 +++--- src/app.js | 4 ++-- src/db.js | 18 ++++++++++++++++++ start-server.sh | 10 ++++++---- 6 files changed, 32 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 605a06c..10229be 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ crawl-pgdata/ +data/ diff --git a/docker-compose.yml b/docker-compose.yml index c91365f..e000d69 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,7 @@ services: crawl-manager-db: condition: service_healthy volumes: - - /home/crawl-manager/app_data:/app/data + - ./data/app:/app/data labels: - traefik.enable=true - traefik.http.routers.crawl-manager.rule=Host(`admin.startover.co.kr`) @@ -29,7 +29,7 @@ services: env_file: - .env.production volumes: - - /home/crawl-manager/postgres_data:/var/lib/postgresql/data + - ./data/postgres:/var/lib/postgresql/data - ./src/migrations/init.sql:/docker-entrypoint-initdb.d/01-init.sql ports: - "11137:5432" diff --git a/setup-server.sh b/setup-server.sh index a66986d..29a9e63 100644 --- a/setup-server.sh +++ b/setup-server.sh @@ -8,7 +8,7 @@ # chmod +x setup-server.sh && ./setup-server.sh # ========================================== -GIT_USER="chpark" +GIT_USER="chpark%40wace.me" GIT_PASS="chpark" GIT_REPO="39.117.244.52:3000/chpark/admin_st.git" GIT_URL="http://${GIT_USER}:${GIT_PASS}@${GIT_REPO}" @@ -38,8 +38,8 @@ fi echo "[OK] 소스 준비 완료" # 데이터 디렉토리 -mkdir -p "$INSTALL_DIR/postgres_data" -mkdir -p "$INSTALL_DIR/app_data" +mkdir -p "$INSTALL_DIR/data/postgres" +mkdir -p "$INSTALL_DIR/data/app" # 실행 권한 chmod +x start-server.sh diff --git a/src/app.js b/src/app.js index 234ecf2..9742b96 100644 --- a/src/app.js +++ b/src/app.js @@ -75,8 +75,8 @@ app.use('/', publicRouter); // ===== 시작 ===== async function start() { try { - // DB 연결 확인 - await db.query('SELECT 1'); + // DB 연결 대기 (재시도) + await db.waitForDB(); console.log('[DB] PostgreSQL 연결 성공'); // 스케줄러 초기화 diff --git a/src/db.js b/src/db.js index 3e5cb04..0c587e9 100644 --- a/src/db.js +++ b/src/db.js @@ -8,13 +8,31 @@ const pool = new Pool({ password: process.env.DB_PASSWORD || '', max: 20, idleTimeoutMillis: 30000, + connectionTimeoutMillis: 10000, }); pool.on('error', (err) => { console.error('[DB] Unexpected error on idle client', err); }); +/** + * DB 연결 재시도 (최대 10회, 3초 간격) + */ +async function waitForDB(retries = 10, delay = 3000) { + for (let i = 1; i <= retries; i++) { + try { + await pool.query('SELECT 1'); + return true; + } catch (err) { + console.log(`[DB] 연결 대기 중... (${i}/${retries}) - ${err.message}`); + if (i === retries) throw new Error('DB 연결 실패: 최대 재시도 횟수 초과'); + await new Promise(r => setTimeout(r, delay)); + } + } +} + module.exports = { query: (text, params) => pool.query(text, params), pool, + waitForDB, }; diff --git a/start-server.sh b/start-server.sh index 31ddcb9..c40c7f3 100644 --- a/start-server.sh +++ b/start-server.sh @@ -41,7 +41,8 @@ docker system prune -af docker image prune -af # Git 설정 - 인증정보 URL에 포함시켜 비밀번호 입력 생략 -GIT_USER="chpark" +# @는 %40으로 인코딩 +GIT_USER="chpark%40wace.me" GIT_PASS="chpark" GIT_REPO="39.117.244.52:3000/chpark/admin_st.git" GIT_URL="http://${GIT_USER}:${GIT_PASS}@${GIT_REPO}" @@ -67,11 +68,12 @@ fi echo "[OK] 최신 소스 적용 완료" git log --oneline -3 -# 데이터 디렉토리 생성 +# 데이터 디렉토리 생성 (현재 위치 기준) echo "" echo "[4/5] 데이터 디렉토리 준비..." -mkdir -p /home/crawl-manager/postgres_data -mkdir -p /home/crawl-manager/app_data +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +mkdir -p "${SCRIPT_DIR}/data/postgres" +mkdir -p "${SCRIPT_DIR}/data/app" # Docker 빌드 & 실행 echo ""