단일 Docker 컨테이너에서 실행되는 자체 호스팅 PostgreSQL Control Plane을 구축했습니다
Source: Dev.to
내가 해결하고 싶었던 문제
새로운 사이드 프로젝트를 시작할 때마다 Postgres와 같은 벽에 부딪힙니다:
- Docker에서
postgres:latest는 괜찮지만, 버그를 재현하기 위해 프로덕션 복제본을 만들거나 PR당 미리보기를 만들고 싶을 때는 어려워집니다. - 관리형 서비스(Neon, Supabase, RDS)는 이 문제를 아름답게 해결합니다 — 몇 초 만에 브랜치를 만들고, 기본적으로 PITR을 제공하지만, 장난 프로젝트를 넘어서는 순간 실제 비용이 발생하고 제어권을 잃게 됩니다.
- 지연 시간은 언제나 큰 문제였습니다. 대부분의 프로젝트를 폴란드 바르샤바에 있는 전용 서버에 호스팅하지만, 클라우드 제공업체는 이 지역을 자주 지원하지 않습니다.
Neon과 같은 개발자 경험—즉시 브랜치 생성, 깔끔한 UI, 브랜치당 하나의 연결 문자열—을 $10 Hetzner 박스에서 원했습니다. 바로 그 격차를 NeonD가 메우려 합니다.
NeonD는 오픈소스 neondatabase/neon 스토리지 엔진 위에 얹히는 컨트롤 플레인입니다. Neon 팀이 핵심 부분(pageserver, safekeeper, compute)을 오픈소스로 공개했으며, NeonD는 이를 5분 안에 배포할 수 있는 형태로 감쌉니다.
기능
- 웹 UI에서 v14, v15, v16, 혹은 v17 버전의 Postgres 인스턴스를 띄울 수 있습니다.
- 어떤 타임라인이든 브랜치화 — 프로덕션을 개발,
pr-142,bug-repro등으로 몇 초 만에 포크할 수 있습니다. 스토리지 레이어에서 복사‑온‑라이트 방식이기 때문입니다. - 초 단위까지 가능한 시점 복구(Point‑in‑time recovery).
- S3 체크포인트 — 데이터는 S3 버킷에 영구적으로 저장되고, 로컬 디스크는 단지 캐시 역할을 합니다.
- TLS SNI 라우팅 —
{instance‑slug}.yourcompany.com같은 서브도메인 아래에 컴퓨트 엔드포인트를 공개합니다. - 다중 테넌시 — 조직, 프로젝트, 사용자, 역할 관리.
- 서버 간 간단한 마이그레이션:
docker compose down, 디렉터리 하나를 rsync, 새 박스에서docker compose up.
Note: NeonD는 미션‑크리티컬 프로덕션용이 아닙니다. 아키텍처가 의도적으로 강하게 결합돼 있어 — 하나의 컨테이너, 하나의 서버, 하나의 장애 지점만 존재합니다. HA, 자동 페일오버, 다중 지역 지원은 없습니다.
배포
docker-compose.yaml 파일을 생성합니다:
services:
neond:
image: neond/neond:latest
environment:
PORT: 3000
SERVER_SECRET: "SuperSecret" # you should change this
PORT_RANGE: 50000-50010
ports:
- "3000:3000"
- "50000-50010:50000-50010"
restart: unless-stopped
volumes:
- ./neond_data:/neond
그 다음 실행합니다:
docker compose up -d
브라우저에서 http://your-server:3000에 접속합니다.
사용 방법
- UI에서 조직과 프로젝트를 생성합니다.
- 프로덕션 브랜치에 엔드포인트를 시작합니다.
- 연결 문자열을 복사하고
psql로 연결합니다. - 브랜치를 오른쪽 클릭 → **“Create branch from here”**를 선택하면 새로운 연결 문자열을 가진 즉시 격리된 데이터 복사본이 생성됩니다.
docker compose up부터 브랜치된 데이터베이스에 쿼리하기까지 걸리는 총 시간: 5분 이하.
피드백 요청
이 프로젝트는 아직 초기 단계이며(작성 시 17개의 스타) 거친 부분이 많습니다. 특히 다음 부분에 대한 의견을 환영합니다:
- 브랜칭 UX — Neon을 한 번도 사용해보지 않은 사용자에게 직관적인가요?
- S3 설정 — AWS에 익숙하지 않은 사람들에게 문서가 이해하기 쉬운가요?
- 제가 생각하지 못한 사용 사례 — 여러분이 직접 박스에서 브랜칭 Postgres를 사용하고 싶다면 어떤 것이 있을까요?
저장소
Neon 팀이 스토리지 엔진을 오픈소스로 공개해 준 덕분에 이 프로젝트가 가능했습니다. NeonD는 그 위에 얇게 얹힌 컨트롤 플레인일 뿐이며, 그들이 만든 것이 없었다면 존재하지 않았을 것입니다.