Destiny · 배포 구성
Destiny 배포 구성도
비공개 베타는 팀원 집 기기로 올리고, 공개할 때는 집 기기를 빼고 Oracle Cloud의 A1 서버 한 대로 옮깁니다. 어느 단계든 DB는 API와 같은 곳에 둡니다.
1 · 지금
비공개 베타
웹: 팀원 집 기기 · API와 DB: 집 기기 한 대
2
무료 공개
웹·API·DB 전부 Oracle A1 서버 한 대
3
유료 판매
같은 서버 + DB 시점 복구 (방식 미정)
지금 올릴 구성 · 비공개 베타
비용 없이 팀원 기기만으로 올립니다. 기본 인증을 걸고 초대한 사람만 씁니다.
방문자는 주소에 맞는 터널로 집 기기에 들어갑니다. 다른 집의 웹은 Tailscale로 API 기기에만 붙고, DB는 API와 같은 기기 안에서만 열립니다. 어느 앱을 어느 기기에 올릴지는 예시입니다.
Cloudflare
팀원 집 기기
기기 사이 비공개 연결
- 집 공유기 포트는 열지 않습니다. 터널은 기기에서 Cloudflare 쪽으로 먼저 연결해 두고, 들어온 요청을 그 연결로 받습니다.
- 주소마다 터널이 하나씩 있고, 각 기기의 Caddy가 Host를 보고 앱으로 나눕니다. Caddy는
127.0.0.1에서만 받아서 집 LAN에도 드러나지 않습니다.
- API에는 공개 주소가 없습니다. 웹 기기만 Tailscale 접근 규칙으로 7001번에 들어갈 수 있습니다.
- DB는 API 기기의 내부망에만 있고, 매일 암호화한 백업을 기기 밖에 올립니다. 하루치 데이터 손실과 4시간 안 복구가 이 단계의 목표입니다.
옮겨 갈 구성 · 무료 공개와 유료 판매
공개할 때는 집 기기를 쓰지 않습니다. 웹 3개, API, DB를 Oracle Cloud의 A1 서버 한 대에 함께 올립니다. 기기 사이 연결이 없어지고, 배포 묶음은 서버 한 대 기준으로 만들어져 있어 거의 그대로 씁니다.
집 기기와 기기 사이 연결이 모두 빠집니다. 웹은 같은 서버의 api:7001을 부르고, API와 DB는 서버 안의 내부망으로만 이어집니다. 유료 판매 전에 시점 복구를 더하는 부분만 아직 방식이 정해지지 않았습니다.
Cloudflare
Oracle Cloud
유료 판매 전에 더할 것
- 서버가 데이터센터에 있어 집 정전이나 회선 문제와 무관합니다. 고정 IP가 있어 모델 호출 토큰을 서버 IP로 묶을 수 있습니다.
- 앞단은 베타와 같은 Cloudflare 터널을 씁니다. 인바운드 포트를 열지 않아도 되고, 집 기기의 터널은 공개 주소에서 떼어 냅니다.
- 무료 서버라 지켜야 할 조건이 있습니다. 7일 동안 CPU, 네트워크, 메모리 사용률이 모두 20% 미만이면 회수될 수 있고, SLA가 없습니다. 이미지도 ARM용으로 서버에서 빌드합니다.
- 가입 화면에 한국 리전이 없어 DB가 해외에 저장됩니다. 개인정보 처리방침에 국외 이전으로 적어야 합니다.
- 유료 판매에서는 결제 승인 뒤에 주문을 기록합니다. 하루 전 백업으로 되돌리면 돈은 받았는데 주문이 없는 상태가 되므로, 시점 복구가 필요합니다.
단계별로 바뀌는 것
모델 호출 비용은 따로입니다.
| 비공개 베타 | 무료 공개 | 유료 판매 |
| 웹 | 팀원 집 기기, 기기마다 터널 | Oracle A1 서버 | 같음 |
| API와 DB | 집 기기 한 대에 함께 | 같은 A1 서버에 함께 | 같음DB를 관리형으로 옮길 수도 있음 |
| 웹 → API | Tailscale | 서버 내부망 | 서버 내부망 |
| 백업 | 매일 암호화 dump → 기기 밖14일 보관 | 매일 dump → Object Storage30일 보관 | + 시점 복구WAL 보관 또는 관리형 DB |
| 복구 목표 | 데이터 손실 24시간 이내복구 4시간 이내 | 같음 | 데이터 손실 1시간 이내복구 2시간 이내 |
| 데이터 위치 | 한국 (팀원 집) | 해외 리전국외 이전 고지 | 같음 |
| 월 비용 | 0원 | 0원Always Free 한도 안 | 0원~관리형 DB를 쓰면 추가 |
| 넘어가는 때 | 지금 | 누구나 쓰게 열기 전 | 결제를 열기 전 |
구성 원칙
DB는 API와 같은 곳에 둡니다
API는 DB 없이 시작하지 못합니다. API와 DB를 다른 집이나 다른 클라우드로 나누면 쿼리마다 인터넷을 오가고, 장애 지점이 둘로 늘어납니다.
API는 한 대만 돌립니다
상담 진행 상태와 풀이책 작업을 메모리에 두기 때문입니다. 여러 대로 늘리는 일은 이 상태를 DB나 Redis로 옮긴 뒤에 합니다. 결제 중복을 막는 잠금은 그 전에 DB 잠금으로 바꿉니다.
API에는 공개 주소를 만들지 않습니다
API에는 자체 인증이 없습니다. 브라우저는 웹 주소의 /api를 부르고, 웹 서버가 안쪽에서 API로 전달합니다.
터널은 입구일 뿐 기기끼리 잇지 않습니다
같은 계정, 같은 터널의 replica끼리도 서로 통신하지 못합니다. 베타처럼 기기가 나뉠 때만 Tailscale로 잇고, 서버 한 대로 옮기면 이 연결은 없어집니다.
API를 먼저, 웹을 나중에 배포합니다
API를 바꿀 때는 새 것을 먼저 추가하고, 웹이 따라온 뒤에 옛 것을 지웁니다. 베타에서 웹 기기가 나뉘어 있을 때 특히 지킵니다.
요청 하나는 125초 안에 끝나야 합니다
Cloudflare는 응답을 125초까지만 기다리고, 터널 주소에서는 이 제한을 끌 수 없습니다. 모델 기능을 켜기 전에 대기 시간을 90초 이하로 줄이거나 작업 번호를 받고 나중에 조회하는 방식으로 바꿉니다.
팀이 정할 것
- 베타의 API 기기를 무엇으로 할지, 그 기기가 멈추면 누가 대응할지. 집 노트북이라면 Ubuntu 22.04 이상으로 다시 설치해야 최신 Docker를 쓸 수 있습니다.
- Oracle 계정을 누구 명의로 만들고 홈 리전을 어디로 할지. 홈 리전은 나중에 바꿀 수 없고, 그곳이 DB의 저장 위치가 됩니다.
- Oracle 가입이 끝내 안 되면 무엇으로 갈지. 유료 서버 한 대(예: 서울 리전 4GB급 월 약 $24)로 같은 구성을 올리는 것이 가장 가까운 대안입니다.
- 유료 판매의 시점 복구를 서버에서 직접 운영할지(WAL을 Object Storage에 보관), 관리형 DB로 옮길지. 고른 쪽에 맞춰 Postgres 버전을 미리 고정합니다.
- 해외 리전에 DB를 두는 것을 개인정보 처리방침에 어떻게 적을지. 변호사 확인이 필요합니다.
준비 작업
저장소에서 할 일
- 베타용으로 배포 묶음을 API·DB용과 웹용으로 나눕니다. 웹용은 앱 하나와 Caddy만 띄우고,
api라는 이름이 API 기기의 Tailscale 주소를 가리키게 합니다. 서버 한 대로 옮길 때는 원래 묶음을 그대로 씁니다.
- Caddy가 터널 뒤에서 HTTP로 받고, Cloudflare가 넘겨주는 방문자 IP를 믿도록 설정합니다. 이걸 빼면 청연당 무료 풀이 제한이 모든 방문자에게 하나로 묶입니다.
- 서버 준비 스크립트에 터널 방식을 넣습니다. 터널을 쓰면 80, 443 포트를 열지 않습니다.
- 백업 업로드 대상을 베타 동안 쓸 저장소로도 보낼 수 있게 합니다.
사람이 할 일
- destiny.io.kr 네임서버를 팀 Cloudflare 계정으로 옮깁니다.
- 베타 동안 Tailscale 팀을 만들고 "웹 기기 → API 7001번"만 허용합니다.
- API 기기의 OS를 정리하고 절전을 끈 뒤 재부팅 시험을 합니다.
- Oracle 계정을 만들고 A1 서버와 Object Storage 버킷을 준비합니다.
- 서버로 옮긴 뒤 공개 주소를 서버의 터널로 바꾸고, 집 기기의 터널에서는 떼어 냅니다.
근거
- 앱의 DB는 PostgreSQL 13~18 어디서나 그대로 돌아갑니다. 테이블은 기본 타입만 쓰고, 지금 백업 파일은 약 14KB입니다. 용량보다 가용성과 보관 위치가 결정 기준입니다.
- 배포 묶음(웹 3개, API, Postgres, Caddy)의 메모리 상한 합계는 약 5.5GB라 A1 서버 12GB에 들어갑니다.
- Oracle Always Free의 A1 서버, 디스크 200GB, 월 10TB 전송, Object Storage 20GB는 무료입니다. 오래 쓰지 않으면 회수될 수 있습니다. Always Free 자원
- Cloudflare 터널의 replica는 가장 가까운 기기로 보내고 분배 규칙을 지원하지 않습니다. 터널 가용성 문서
- Cloudflare는 응답을 125초까지 기다린 뒤 524 오류를 돌려줍니다. 집 노트북 터널로 130초 요청은 125초에 524, 100초 요청은 정상으로 실측했습니다.
- Tailscale 무료 플랜은 사용자 6명까지입니다. Tailscale 요금