# rb8001 PostgreSQL 연결 문제 해결 **날짜**: 2025-07-16 **작업자**: Claude & happybell ## 개요 rb8001 컨테이너에서 호스트의 PostgreSQL 서버에 연결할 수 없는 문제를 해결하는 과정 ## 문제 상황 ### 초기 증상 - Health check 성공 (`{"status":"healthy"}`) - 컨테이너 정상 실행 중 - PostgreSQL 서버는 정상 작동 - **문제**: 컨테이너에서 `localhost:5432`로 PostgreSQL 접근 불가 ### 에러 메시지 ```bash # 컨테이너 내부에서 psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory # 또는 psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused ``` ## 원인 분석 ### Docker 네트워크 격리 - Docker 컨테이너는 기본적으로 격리된 네트워크에서 실행 - 컨테이너 내부의 `localhost`는 컨테이너 자체를 의미 - 호스트의 `localhost`와 다름 ### 기존 설정 ```yaml # docker-compose.yml (문제 있던 버전) services: rb8001: build: . ports: - "8001:8001" # 포트 매핑만 있음 # network_mode 없음 ``` ## 해결 과정 ### 1. 로컬 코드 수정 #### docker-compose.yml 수정 ```yaml services: rb8001: build: . container_name: rb8001 network_mode: host # 추가 env_file: - .env # ports 설정 제거 (host 모드와 충돌) ``` ### 2. 서버 인프라 설정 #### PostgreSQL 사용자 생성 ```bash sudo -u postgres psql CREATE USER robeings WITH PASSWORD 'robeing2025!'; GRANT ALL PRIVILEGES ON DATABASE rb8001_db TO robeings; GRANT ALL PRIVILEGES ON DATABASE rb10508_test_db TO robeings; \q ``` #### .env 파일 업데이트 ```bash # 기존 DATABASE_URL=postgresql://user:password@localhost/ivada_db # 수정 DATABASE_URL=postgresql://robeings:robeing2025!@localhost/rb8001_db ``` ### 3. 불필요한 파일 정리 ```bash # ivada.db 디렉토리 삭제 rm -rf /home/admin/rb8001/ivada.db ``` ## 해결 방법 비교 ### 방법 1: network_mode: host (채택) ```yaml network_mode: host ``` **장점:** - 설정 간단 - 호스트 네트워크 직접 사용 - localhost로 바로 접근 가능 **단점:** - 포트 충돌 가능성 - 네트워크 격리 해제 ### 방법 2: host.docker.internal 사용 ```yaml environment: - DATABASE_URL=postgresql://user:pass@host.docker.internal/rb8001_db ``` **장점:** - 네트워크 격리 유지 - 크로스 플랫폼 호환성 **단점:** - Linux에서 기본 지원 안됨 - 추가 설정 필요 ### 방법 3: 별도 PostgreSQL 컨테이너 ```yaml services: postgres: image: postgres:14 environment: POSTGRES_DB: rb8001_db ``` **장점:** - 완전한 격리 - 개발환경 일관성 **단점:** - 리소스 중복 - 기존 DB 활용 불가 ## 검증 결과 ### 연결 테스트 ```bash # 컨테이너 내부에서 psql -h localhost -U robeings -d rb8001_db -c "SELECT version();" # 성공: PostgreSQL 15.x 정보 출력 ``` ### 애플리케이션 테스트 ```bash curl http://localhost:8001/health # 응답: {"status":"healthy"} # 데이터베이스 작업 테스트 curl -X POST http://localhost:8001/api/test/db # 성공적으로 DB 연결 및 쿼리 실행 ``` ## 교훈 ### 1. Docker 네트워크 이해 - 컨테이너의 localhost ≠ 호스트의 localhost - network_mode: host는 간단하지만 격리 해제 - 환경에 따른 네트워크 전략 필요 ### 2. 데이터베이스 사용자 관리 - 개발/운영 환경별 사용자 분리 - 최소 권한 원칙 적용 - 비밀번호 정책 수립 ### 3. 컨테이너 설정 일관성 - ports와 network_mode: host 충돌 주의 - 환경변수와 기본값 우선순위 이해 - 설정 변경 시 전체적 영향도 고려 ## 관련 파일 - `/home/happybell/projects/ivada/rb8001/docker-compose.yml` - `/home/admin/rb8001/.env` - PostgreSQL 설정: `/etc/postgresql/15/main/postgresql.conf` ## 다음 단계 1. rb10508_test도 동일한 방식으로 설정 2. 운영 환경에서의 네트워크 보안 검토 3. 로그 모니터링을 통한 연결 안정성 확인