# 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 '<비밀번호>';
GRANT ALL PRIVILEGES ON DATABASE rb8001_db TO robeings;
GRANT ALL PRIVILEGES ON DATABASE rb10508_micro_db TO robeings;
\q
```

#### .env 파일 업데이트
```bash
# 기존
DATABASE_URL=postgresql://user:password@localhost/ivada_db

# 수정
DATABASE_URL=postgresql://robeings:<비밀번호>@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_micro도 동일한 방식으로 설정
2. 운영 환경에서의 네트워크 보안 검토
3. 로그 모니터링을 통한 연결 안정성 확인
