pgAdmin
20+ 프로젝트의 PostgreSQL을 단일 웹 UI에서 통합 관리하는 도구입니다.
개요
| 항목 | 내용 |
|---|---|
| 위치 | workspace/_devtools/pgadmin/ |
| 용도 | 모든 프로젝트의 PostgreSQL 통합 관리 (쿼리/백업/사용자) |
| 기반 이미지 | dpage/pgadmin4 |
| 포트 | 7050 |
| 어드민 도메인 | db.devtools.codebase.how (🔒 Tailscale 제한) |
| 랜딩 도메인 | db.codebase.how (🌐 공개 소개) |
주요 기능
- 다중 서버 등록 — 20+ PostgreSQL 인스턴스 트리 구조로 관리
- SQL 에디터 — 쿼리 작성/실행/결과 내보내기 (CSV, JSON)
- ERD 다이어그램 — 스키마 시각화
- 백업/복원 — pg_dump / pg_restore GUI
- 사용자/권한 관리 — Role, Grant, RLS 확인
- Explain Visual — 쿼리 플랜 시각화
시작하기
make up NAME=_devtools/pgadmin
make status NAME=_devtools/pgadmin
make logs NAME=_devtools/pgadmin
접속
| 용도 | URL | 비고 |
|---|---|---|
| 운영 어드민 | https://db.devtools.codebase.how | Tailscale 내부망 |
| 운영 랜딩 | https://db.codebase.how | 공개 소개 |
| 로컬 개발 | http://localhost:7050 | 직접 포트 접근 |
첫 로그인
- Email/Password:
.env의PGADMIN_DEFAULT_EMAIL/PGADMIN_DEFAULT_PASSWORD - 첫 로그인 후 Master Password 설정 (서버 연결 정보 암호화에 사용)
서버 등록 (자동 설정)
pgAdmin은 servers.json을 통해 컨테이너 시작 시 자동으로 서버를 등록할 수 있습니다.
servers.json 예시
{
"Servers": {
"1": {
"Name": "demo.codebase.how",
"Group": "Codebase Projects",
"Host": "msk-demo-postgres",
"Port": 5432,
"MaintenanceDB": "postgres",
"Username": "postgres",
"SSLMode": "prefer"
},
"2": {
"Name": "quant.how",
"Group": "Codebase Projects",
"Host": "msk-quant-how-postgres",
"Port": 5432,
"Username": "postgres"
}
}
}
각 프로젝트의 PostgreSQL 컨테이너 이름을 Host에 지정하면 Docker DNS가 shared-network 내에서 자동 해석합니다.
네트워크 구성
┌────────────────────────────────────────────────┐
│ ${PLATFORM_NAME}-shared-network │
│ │
│ msk-pgadmin │
│ │ │
│ ├──▶ msk-demo-postgres:5432 │
│ ├──▶ msk-quant-how-postgres:5432 │
│ ├──▶ msk-apis-how-postgres:5432 │
│ └──▶ ... (20+ 프로젝트) │
└────────────────────────────────────────────────┘
권한 설정
pgAdmin 컨테이너는 UID 5050으로 실행됩니다. 호스트 볼륨 마운트 시 권한 주의:
sudo chown -R 5050:5050 data/pgadmin/
Makefile이 자동으로 권한을 체크하고 안내합니다.
환경변수 (.env)
DEVTOOLS_PGADMIN_PORT=7050
PLATFORM_DB_ADMIN_URL=https://db.devtools.codebase.how
PLATFORM_DB_URL=https://db.codebase.how
PGADMIN_DEFAULT_EMAIL=admin@codebase.how
PGADMIN_DEFAULT_PASSWORD=...
PGADMIN_CONFIG_SERVER_MODE=False
보안
| 항목 | 설정 |
|---|---|
| 어드민 URL 접근 | NPM Access List — Tailscale 100.64.0.0/10 IP만 허용 |
| 로그인 | pgAdmin 자체 인증 + Master Password (이중 보호) |
| 서버 비밀번호 | Master Password로 AES 암호화 저장 |
db.devtools.codebase.how는 반드시 NPM Access List + Tailscale IP 제한을 적용하세요. pgAdmin에는 모든 프로젝트의 DB 비밀번호가 저장됩니다.
주요 사용 시나리오
1. SQL 쿼리 실행
좌측 트리 → 프로젝트 → Databases → 스키마 → Tables → 우클릭 → Query Tool → SQL 실행
2. 백업
Database 우클릭 → Backup → 포맷 선택 (plain/custom) → 경로 지정 → pg_dump 실행
3. ERD 보기
Database 우클릭 → ERD For Database → 시각화된 스키마 다이어그램
4. RLS 정책 확인
Schemas → public → Policies → 각 테이블의 Row Level Security 정책 조회
5. Explain Visual
쿼리 탭 → 쿼리 입력 → F7 (Explain) 또는 Shift+F7 (Explain Analyze) → 시각적 플랜 트리로 병목 파악
자주 묻는 질문
Q. 서버 목록이 나타나지 않습니다.
A. servers.json은 컨테이너 첫 시작 시에만 로드됩니다. 이미 실행된 컨테이너에 반영하려면:
make down NAME=_devtools/pgadmin
make up NAME=_devtools/pgadmin
Q. 특정 프로젝트 DB 연결이 실패합니다.
A. 해당 PostgreSQL 컨테이너가 shared-network에 속해있는지 확인:
docker network inspect ${PLATFORM_NAME}-shared-network | grep msk-{project}-postgres
없으면 프로젝트 _docker/docker-compose.*.yml의 postgres 서비스에 networks 추가:
postgres:
networks:
- default
- shared