앱에 로그인·글·주문 같은 저장할 데이터가 있으면 DB가 필요해요. Onpod에서 만들면 1~2분 안에 켜지고 자동 백업이 바로 시작돼요. 외부 DB 서비스를 따로 가입할 필요 없이 앱과 같은 곳에서 같이 실행돼요.
“이 앱에 쓸 Postgres DB 하나 만들어서 앱에 연결해줘”
에이전트가 DB를 만들고, 접속 정보를 앱에 자동으로 넣어줘요(직접 복사·붙여넣기 안 해도 돼요).
요금제 (필요한 만큼만)
- Dev — 무료 (계정당 1개). 글·회원·주문 저장 연습·소규모 앱에 충분.
- Basic / Pro / Business — 더 큰 RAM·저장. 항상 켜져 있고 시간당으로 청구돼요. 잠시 멈춤은 무료 Dev만 되고, 유료 플랜은 삭제해야 요금이 끝나요.
처음엔 무료 Dev로 시작하고, 트래픽·데이터가 늘면 더 큰 플랜으로 올리면 돼요 (데이터 그대로). 단가는 /pricing 페이지 참고.
대기 서버 — 플랜을 바꿔도, 서버에 문제가 생겨도 20~30초 안에 이어져요
Pro 이상 플랜은 대기 서버를 한 대 더 둘 수 있어요. 주 서버의 변경 내용이 실시간으로 복제되고, 플랜을 바꾸거나 서버에 문제가 생기면 대기 서버로 「전환」해요. 전환할 때 쓰기가 20~30초 멈추는 것 말고는 앱 재시작도, 접속 주소 변경도 없어요. 대기 서버가 있으면 플랜 변경도 이 경로로 돌아가서 몇 분씩 멈추지 않아요.
- 켜 둔 시간 동안 요금은 플랜의 2배예요(서버 한 대 값 그대로 · Pro ₩810/시간 · Business ₩1,620/시간). 끄면 바로 원래 요금으로 돌아와요.
- 켜는 순간 붙어 있는 앱이 한 번 다시 시작돼요(새 주소를 받기 위해). 그 뒤 전환·플랜 변경에는 재시작이 없어요.
- 전환은 자동으로 일어나지 않아요. 사용자·에이전트·콘솔이 시작할 때만 해요. DB 상세 화면의 「대기 서버」 카드에서 켜기·전환·끄기를 할 수 있어요.
“이 DB는 서비스 중이라 끊기면 안 돼. 대기 서버 켜고, 플랜 올릴 땐 무중단으로 해줘”
에이전트가 플랜을 확인하고 요금(2배)을 알려준 뒤 대기 서버를 켜요. 이후 플랜 변경은 20~30초 끊김으로 끝나요.
앱에 연결
앱을 올릴 때 “DB 붙여서” 라고 하면, 접속 정보가 앱에 자동으로 들어가요. DB 비밀번호을 새로 바꿔도 붙어 있는 앱은 자동으로 다시 시작돼서 끊김이 거의 없어요. 내 노트북·DBeaver 같은 외부 도구로 직접 붙고 싶으면, 보안상 기본은 차단이라 내 IP를 먼저 허용해야 해요.
“내 노트북에서 이 DB에 DBeaver로 붙을 수 있게 내 IP 허용하고 접속 주소 알려줘”
Node.js 앱이면 한 가지 더 (Directus·Strapi·Payload 등)
Onpod DB는 자체 서명 TLS 인증서를 써요. 연결은 항상 암호화되지만 공인 인증기관이 서명한 건 아니에요. psql·Python·Go·Java·Prisma는 이걸 그대로 받아들이는데, Node.js의 pg 드라이버만 인증서 검증에 실패해서 앱이 아예 시작되지 않아요. 로그에 DEPTH_ZERO_SELF_SIGNED_CERT가 찍히면 이거예요.
고치는 법은 한 줄이에요 — 접속 주소 끝의 ?sslmode=require를 ?sslmode=no-verify로 바꾸거나, Directus면 환경변수 DB_SSL__REJECT_UNAUTHORIZED=false를 같이 주면 돼요. 암호화는 그대로 유지되고 인증서 확인만 꺼져요.
“Directus 올리는데 DEPTH_ZERO_SELF_SIGNED_CERT 나면서 안 떠. 고쳐줘”
에이전트가 접속 설정만 바꿔서 다시 올려줘요. 미리 말해두면 처음부터 안 겪어요.
표(테이블) 만들기 — 마이그레이션
앱이 쓸 표를 만드는 건 앱이 직접 하는 일이라 Onpod에 따로 명령이 없어요. Directus·Prisma·Django 같은 도구는 앱이 처음 켜질 때 자동으로 만들어요. 잘 안 되면 로그를 보면 이유가 나오는데, 대부분 위의 인증서 문제이거나 DB 비밀번호이 만료된(옛 비밀번호인) 경우예요.
“앱은 떴는데 표가 안 만들어진 것 같아. 로그 보고 원인 찾아서 고쳐줘”
SQL 을 직접 돌려야 할 때 (조회·마이그레이션 파일)
가장 빠른 방법은 내 컴퓨터의 psql이에요. DB 비밀번호는 서버가 따로 보관하지 않고 앱에 넣어 준 접속 문자열 안에만 있어서, 에이전트가 앱에서 그 값을 읽어 외부 주소로만 바꿔 쓰면 돼요(내 IP 허용은 한 번만). 비밀번호를 새로 발급받는 방법은 붙어 있는 앱이 전부 끊기니 SQL 실행용으로는 쓰지 마세요.
psql 이 없으면 앱 컨테이너 안에서 실행할 수도 있는데, 한 문장마다 몇 초씩 걸리고 45초 제한이 있어요. 조회 몇 번은 괜찮지만 긴 마이그레이션이나 반복 실행은 psql 로 하는 게 맞아요. 앱이 켜질 때마다 실행돼야 하는 마이그레이션은 앱 시작 명령 앞에 넣는 게 정석이에요.
“이 DB 에 migrations 폴더의 SQL 을 순서대로 실행해줘. 내 컴퓨터 psql 로.”
에이전트가 내 IP 를 허용하고, 앱의 접속 정보로 psql 을 실행해요.
리전 — 자동으로 가까운 리전에 배치해요 (보통 신경 안 써도 돼요)
DB는 연결될 앱과 같은 곳에 자동 배치돼요(같은 데이터센터라 빠르고 저렴). 따로 정하지 않으면 자동으로 맞춰주고, 그 외엔 서울이 기본이에요. ⚠️ DNS 조회는 되는데 접속이 자꾸 끊기면 앱과 DB가 다른 지역일 수 있으니 에이전트한테 “DB랑 앱 같은 지역에 맞춰줘” 라고 하면 돼요.
처음부터 켜져 있는 기능들
- AI 임베딩(pgvector) · 지리 데이터(postgis) · 암호화(pgcrypto)
- 한국어 검색(pg_trgm) · UUID 생성 · 운영 모니터링(pg_stat_statements · 전용 DB 만 — 공유 DB 에선 옆 DB 통계까지 보여 켜지 않아요)
이 기능들은 DB 를 만들 때 그 DB 안에 자동으로 켜져요(작은 요금제도 같아요). 앱이 “extension vector does not exist” 나 “permission denied to create extension” 으로 멈추면 앱 계정 권한 문제예요 — 에이전트한테 “이 DB 확장 켜줘” 라고 하면onpod db extensions 한 번으로 바로 풀려요(데이터·재시작 영향 없음). 그 외 확장이 필요하면 “hstore 확장 켜줘” 처럼 이름을 말하면 돼요(서버 파일·네트워크에 닿는 확장은 안전을 위해 켤 수 없어요).
“앱이 vector 확장 권한 오류로 안 떠. 이 DB 확장 켜줘”
백업·복구 (자동)
매분 자동 백업 + 매일 전체 스냅샷이 실행돼요. 큰 변경 전에 “지금 백업 한 번 떠줘” 라고 하거나, 사고가 나면 “어제 오후 3시 상태로 되돌려줘” 처럼 최근 7일 안 원하는 시점으로 복구할 수 있어요. 삭제해도 7일 안에는 복구할 수 있어요(그 뒤엔 영구 삭제).
복구는 새 DB 로 만들어져요 — 쓰던 DB를 덮어쓰지 않아서, 잘못된 시점을 고르더라도 원본은 안전해요. 보통 10~40분 걸리고, 끝나면 에이전트가 새 접속 정보를 알려줘요.
“배포 전에 DB 백업 한 번 떠줘 (라벨: v1.2 릴리스 전)”
“방금 데이터 날렸어, 30분 전 상태로 복구해줘”
“어제 지운 DB를 지우기 전 상태로 되살려줘”
자동으로 확장돼요
- 디스크 자동 확장(기본 켜짐) — 사용량이 80%에 닿으면 다운타임 없이 백그라운드로 늘어나요. 디스크가 꽉 차서 앱이 멈추는 일을 막아줘요.
- 플랜 자동 상향(선택, 기본 꺼짐) — 부하가 높아지면 다음 플랜으로 자동 업그레이드. 잠깐 끊김이 있어 기본은 꺼져 있고, 원하면 켤 수 있어요.
사용자가 DB 서버를 직접 늘릴 일은 없어요 — 설정만 정해두면 실제 인프라 작업은 Onpod가 자동으로 처리해요.
동시 접속이 수백~수천으로 늘어 연결 한도에 걸리면 onpod db pool 로 연결 풀링을 켤 수 있어요 — 여러 앱이 적은 수의 실제 연결을 나눠 써서 연결 한도를 넘지 않아요.