Skip to content

[Weekly Report] Week of 11/27 #7

Description

@jihodoo

Render 배포 트러블슈팅 가이드

Render로 DRS를 배포하면서 발생한 문제들과 해결 방법을 기록합니다.


문제 1: ModuleNotFoundError: No module named 'psycopg2'

증상

ModuleNotFoundError: No module named 'psycopg2'

원인

  • requirements.txtpsycopg2-binary 패키지가 누락됨
  • Render 배포 시 필요한 패키지가 설치되지 않음

해결 방법

  1. requirements.txtpsycopg2-binary 추가:

    psycopg2-binary
  2. 변경사항 커밋 및 푸시:

    git add requirements.txt
    git commit -m "fix: add psycopg2-binary dependency"
    git push origin main
  3. Render가 자동으로 재배포하거나 수동으로 "Deploy latest commit" 실행


문제 2: SSL connection has been closed unexpectedly

증상

Failed to initialize connection pool: connection to server at "dpg-xxxxx.oregon-postgres.render.com"
(35.227.164.209), port 5432 failed: SSL connection has been closed unexpectedly

원인

  • Render PostgreSQL은 SSL 연결을 요구함
  • 코드에 SSL 설정이 누락됨

해결 방법

  1. app/db_io.pyinit_pool() 함수에 sslmode='require' 추가:

    _pool = SimpleConnectionPool(
        minconn,
        maxconn,
        host=host,
        port=port,
        database=database,
        user=user,
        password=password,
        sslmode='require'  # 추가
    )
  2. 변경사항 커밋 및 푸시:

    git add app/db_io.py
    git commit -m "fix: add SSL support for Render PostgreSQL connection"
    git push origin main

문제 3: Connection pool not initialized

증상

DB 유사도 검색 실패: Connection pool not initialized. Call init_pool() first.

원인

  • Render 웹 서비스에 PostgreSQL 환경 변수가 설정되지 않음
  • app/main.pywarmup() 함수가 PostgreSQL 연결 초기화에 실패함

해결 방법

  1. Render PostgreSQL 데이터베이스 생성:

    • Render 대시보드 → "New +" → "PostgreSQL"
    • Name: drs-postgres
    • Database: drs_db_iji8 (자동 생성됨)
    • Plan: Free
  2. 연결 정보 확인:

    • PostgreSQL 페이지 → "Connections" 섹션
    • Internal Database URL 및 개별 값 확인
  3. Render 웹 서비스에 환경 변수 설정:

    • 웹 서비스 (drs-api) → "Environment" 탭
    • 다음 환경 변수 추가:
    DATA_SOURCE=postgresql
    
    PG_HOST=dpg-d4ji276uk2gs73bln7c0-a
    PG_PORT=5432
    PG_DATABASE=drs_db_iji8
    PG_USER=drs_user
    PG_PASSWORD=tnCRCHXlO7Ugu3eLzoZub5ME2HBUJz75
    
    # 추가 설정
    API_HOST=0.0.0.0
    LOG_LEVEL=INFO
    TARGET_LEN=200
    PG_MIN_CONN=1
    PG_MAX_CONN=10
    
  4. "Save Changes" 클릭 → 자동 재배포

확인 방법

배포 로그에서 다음 메시지 확인:

PostgreSQL connection pool initialized: drs_db_iji8@dpg-xxxxx:5432
PostgreSQL connection initialized: XXX segments available

문제 4: relation "graph_segments" does not exist

증상

ERROR - Failed to initialize PostgreSQL connection: relation "graph_segments" does not exist

원인

  • Render PostgreSQL 데이터베이스가 비어있음 (테이블 없음)
  • 로컬 DB의 데이터가 Render DB로 마이그레이션되지 않음

이해

  • 로컬 PostgreSQL (localhost:5433): 모든 데이터 저장됨 (로컬 컴퓨터)
  • Render PostgreSQL (클라우드): 비어있음 (Render 서버)
  • Render 웹 서비스는 클라우드에서 실행되므로 로컬 DB에 접근 불가
  • 따라서 Render DB로 데이터 복사 필요

해결 방법: 로컬 DB → Render DB 마이그레이션

방법 1: pg_dump + pg_restore (추천, 가장 빠름)

# 1. 로컬 DB 전체 덤프
pg_dump -h 172.17.240.1 -p 5433 -U postgres -d drs_db -Fp -f drs_backup.sql
# Password: [로컬 PostgreSQL postgres 유저 비밀번호]

# 2. Render DB에 복원
PGPASSWORD=tnCRCHXlO7Ugu3eLzoZub5ME2HBUJz75 psql \
  -h dpg-d4ji276uk2gs73bln7c0-a.singapore-postgres.render.com \
  -p 5432 -U drs_user -d drs_db_iji8 \
  -f drs_backup.sql

방법 2: DB 스크립트 재실행 (시간 더 걸림)

# 1. DB/.env 파일 생성 (Render DB 정보)
cat > DB/.env << 'EOF'
PG_HOST=dpg-d4ji276uk2gs73bln7c0-a.singapore-postgres.render.com
PG_PORT=5432
PG_DB=drs_db_iji8
PG_USER=drs_user
PG_PASSWORD=tnCRCHXlO7Ugu3eLzoZub5ME2HBUJz75
EOF

# 2. 가상 환경 활성화 및 패키지 설치
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# 3. 테이블 생성
PGPASSWORD=tnCRCHXlO7Ugu3eLzoZub5ME2HBUJz75 psql \
  -h dpg-d4ji276uk2gs73bln7c0-a.singapore-postgres.render.com \
  -p 5432 -U drs_user -d drs_db_iji8 \
  -f DB/init_tables.sql

# 4. 데이터 수집 스크립트 실행
python3 DB/ingest_prices.py
python3 DB/build_segments.py

문제 5: PostgreSQL 버전 불일치 (pg_dump)

증상

pg_dump: error: aborting because of server version mismatch
pg_dump: detail: server version: 18.1; pg_dump version: 16.10

원인

  • 로컬 PostgreSQL 서버 버전(18.1)과 pg_dump 클라이언트 버전(16.10) 불일치

해결 방법

옵션 1: Docker 사용 (추천)

docker run --rm \
  -v $(pwd):/backup \
  postgres:18 \
  pg_dump -h 172.17.240.1 -p 5433 -U postgres -d drs_db -Fp -f /backup/drs_backup.sql

옵션 2: Plain text 형식 사용

pg_dump -h 172.17.240.1 -p 5433 -U postgres -d drs_db -f drs_backup.sql

환경 변수 체크리스트

Render 웹 서비스 (drs-api)

변수명 예시 값 설명
DATA_SOURCE postgresql 데이터 소스 (반드시 postgresql)
PG_HOST dpg-xxxxx-a Internal hostname 사용 (더 빠름)
PG_PORT 5432 PostgreSQL 포트
PG_DATABASE drs_db_iji8 Render DB 이름
PG_USER drs_user Render DB 유저
PG_PASSWORD tnCRCHXl... Render DB 비밀번호
API_HOST 0.0.0.0 API 호스트
LOG_LEVEL INFO 로그 레벨

DB 스크립트용 (.env 파일)

DB/.env 파일:

PG_HOST=dpg-xxxxx.singapore-postgres.render.com
PG_PORT=5432
PG_DB=drs_db_iji8
PG_USER=drs_user
PG_PASSWORD=tnCRCHXlO7Ugu3eLzoZub5ME2HBUJz75

주의:

  • 웹 서비스 환경 변수는 PG_DATABASE 사용
  • DB 스크립트는 PG_DB 사용 (다름!)
  • External hostname: 외부 접속용 (pgAdmin, 로컬 스크립트)
  • Internal hostname: Render 서비스 간 연결용 (더 빠름)

배포 성공 확인

1. 배포 로그 확인

==> Your service is live 🎉
Available at: https://drs-le2r.onrender.com

2. PostgreSQL 연결 확인

PostgreSQL connection pool initialized: drs_db_iji8@dpg-xxxxx:5432
PostgreSQL connection initialized: 896 segments available

3. API 테스트

# Health check
curl https://drs-le2r.onrender.com/health

# API 문서
https://drs-le2r.onrender.com/docs

# 유사도 검색 테스트
https://drs-le2r.onrender.com/web/index.html

추가 팁

Render Free Tier 제한사항

  • 15분간 요청 없으면 슬립 모드
  • 첫 요청 시 콜드 스타트 (~30초)
  • PostgreSQL: 90일 후 삭제 (정기적으로 접속 필요)

로컬 개발 vs 배포

  • 로컬: localhost:5433 PostgreSQL, .env 파일 사용
  • Render: Render PostgreSQL, 환경 변수로 설정

데이터 업데이트

로컬에서 데이터를 업데이트한 후:

  1. 로컬 DB 덤프
  2. Render DB에 복원
  3. 또는 Render DB에 직접 스크립트 실행

문제가 계속되면?

  1. 배포 로그 확인: Render 대시보드 → Logs 탭
  2. 환경 변수 재확인: Environment 탭에서 모든 값 확인
  3. Manual Deploy: 강제로 최신 커밋 재배포
  4. Clear build cache: Render Settings → "Clear build cache & deploy"

작성일: 2025-11-26

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions