SaaS 구독비 월 70만 원을 8만 원으로 줄인 개발자의 선택 — Plausible·Listmonk·MinIO 셀프호스팅 전환 1년 기록
월 65만 원이 넘는 SaaS 구독비를 VPS 하나로 8만 원대로 줄인 개발자 사례를 분석한다. Plausible Analytics로 Mixpanel을 교체하고, Listmonk와 Amazon SES로 Mailchimp를 대체했다. MinIO 셀프호스팅으로 S3 스토리지 비용을 사실상 0으로 만들고, GlitchTip으로 Sentry를 교체한 결과다. 처음 실패한 이유부터 도커 컴포즈 재설계, 1년 운영 후 결과까지 오픈소스 셀프호스팅 전환의 실전 기록을 공유한다. VPS 선택, 공유 PostgreSQL 구조, 백업 설계 포함.
클라우드 스토리지 비용이 생각보다 많이 나오고, 분석 도구 구독비가 쌓이고, 뉴스레터 발송 서비스 요금까지 합산하니 월 65만 원이 넘었다. 1인 개발자로 웹 SaaS를 운영하던 A씨는 2025년 초 이 숫자를 보고 결심했다. "다음 달부터는 직접 올린다." 1년이 지난 지금, 월 구독비는 8만 원대다. 처음 시도에서 왜 실패했고, 어떻게 인프라를 다시 설계했으며, 지금은 어떻게 돌아가고 있는지 — 오픈소스 셀프호스팅 전환의 실전 기록이다.
배경: SaaS 구독비가 서버 비용의 두 배를 넘었다
A씨가 2024년 말 매달 결제하던 서비스 목록은 다음과 같다.
Mixpanel 분석: $89 (약 13만 원)
Mailchimp 이메일 발송(구독자 12,000명 기준): $159 (약 23만 원)
AWS S3 + CloudFront(월 400GB 기준): $62 (약 9만 원)
Sentry 에러 추적(팀 플랜): $29 (약 4만 원)
Datadog 로그(호스트 1대): $36 (약 5만 원)
기타 소소한 구독 몇 가지: $50+
합계: 월 약 $425, 원화 기준 65~70만 원이었다. 그것도 환율이 오르면서 점점 더 늘어나는 구조였다. 같은 기간 VPS와 데이터베이스 서버 비용은 월 $30 수준이었다. 도구에 내는 돈이 서버 비용의 열 배를 넘었다.
A씨는 각 서비스가 "왜 이만큼 비싼가"를 하나씩 따져봤다. Mixpanel은 고급 코호트 분석 기능을 쓰지 않고 있었다. Mailchimp는 구독자 수 기반 과금 구조라 구독자가 늘수록 비용이 급등했다. S3는 트래픽 비용이 저장 용량 비용보다 더 많이 나왔다.
결론은 단순했다. "쓰는 기능 대비 내는 돈이 너무 크다."
1단계 실패: 처음 시도가 왜 무너졌나
A씨의 첫 시도는 "일단 다 설치해보자"였다. 기존에 쓰던 VPS에 도커(Docker) 컨테이너 여러 개를 올리고 각 서비스를 독립 실행했다. 처음 이틀은 문제없이 돌아갔다. 그런데 3일째 Plausible Analytics가 올라가 있던 데이터베이스 컨테이너가 디스크 풀로 다운됐다.
원인은 단순했다. 각 서비스마다 별도 PostgreSQL 인스턴스를 올렸고, 쌓이는 로그와 데이터로 200GB짜리 VPS 디스크가 꽉 찼다. 이어서 Listmonk 이메일 서버가 SMTP 인증 문제로 발송에 실패했고, MinIO 오브젝트 스토리지는 볼륨 마운트 경로 문제로 파일이 일부 유실됐다.
이 실패에서 얻은 교훈은 세 가지였다.
서비스마다 독립 데이터베이스를 올리면 리소스와 관리 부담이 배로 늘어난다
볼륨 마운트 경로와 백업 정책을 처음부터 설계해야 한다
SMTP 릴레이 설정은 분리해서 별도 검증이 필요하다
A씨는 첫 시도를 전부 초기화하고, 설계부터 다시 시작했다.
재설계: 공유 데이터베이스와 리버스 프록시 구조
재설계의 핵심은 두 가지였다. 첫째, 데이터베이스를 단일 PostgreSQL 인스턴스로 통합한다. 각 앱은 같은 데이터베이스 서버 안에서 자체 스키마를 분리해 쓴다. 둘째, Nginx 리버스 프록시를 앞에 두고 각 서비스는 서브도메인으로 라우팅한다.
VPS는 Vultr의 $24/월 플랜(4코어, 8GB 메모리, 160GB NVMe)을 선택했다. 한국 서버 리전이 있고, I/O 속도가 이전에 쓰던 저가형 VPS보다 체감상 빠른 편이었다.
이 구조에서 postgres 서비스 하나가 Plausible과 Listmonk의 데이터베이스를 모두 담당한다. Nginx 리버스 프록시가 stats.example.com, mail.example.com, cdn.example.com 같은 서브도메인을 각 컨테이너로 라우팅한다. Let's Encrypt 인증서는 Certbot 컨테이너로 자동 갱신한다.
백업은 cron으로 하루 한 번 PostgreSQL 덤프를 MinIO에 업로드하는 방식이다. 주 1회는 VPS 스냅샷을 수동으로 찍는다. A씨가 첫 시도에서 놓쳤던 부분을 여기서 반드시 짚었다 — 백업만 설정하고 복구 테스트를 하지 않으면 의미가 없다. 재설계 후 첫 주에 전체 데이터를 실제로 복구해보는 연습을 했다고 한다.
서브도메인별 리버스 프록시와 공유 PostgreSQL을 기반으로 한 셀프호스팅 구조
Plausible Analytics — Mixpanel과 구글 애널리틱스를 동시에 교체하다
Plausible은 오픈소스 웹 분석 도구다. 측정 스크립트 크기가 1KB 미만이라 로딩 속도에 영향이 거의 없고, 쿠키를 사용하지 않아 GDPR 동의 배너 없이 운영할 수 있다. 구글 애널리틱스(GA4)의 개인정보 친화적 대안으로 자주 언급된다.
A씨가 Mixpanel을 쓴 이유는 이벤트 기반 트래킹 때문이었다. 그러나 실제로 Mixpanel에서 자주 보던 리포트는 세 가지뿐이었다 — 페이지뷰, 유니크 방문자, 소스별 유입. 이 세 가지는 Plausible에서 전부 제공됐다.
설치는 도커 컨테이너 기준 20분이 채 안 걸렸다. 기존 GA4·Mixpanel 스크립트를 지우고 Plausible 1줄로 교체했다.
Plausible 스크립트 삽입 (Next.js Script 태그)
// pages/_document.js 또는 app/layout.js
import Script from 'next/script';
<Script
defer
data-domain="example.com"
src="https://stats.example.com/js/script.js"
strategy="afterInteractive"
/>
전환 후 2주 동안 GA4와 Plausible을 병행 운영하며 수치를 비교했다. 세션 수와 유니크 방문자 수는 거의 일치했다. 이탈률(Bounce Rate) 정의가 달라 수치 자체는 달랐지만, 트렌드 방향은 동일했다.
A씨는 Plausible로 완전히 전환하면서 Mixpanel 구독을 해지했다. 절감액은 월 $89이고, 관리 대시보드가 단순해져 분석을 확인하는 데 걸리는 시간도 줄었다.
단, Plausible에는 한계가 있다. 사용자 단위 이벤트 히스토리, 코호트 분석, 리타겟팅 픽셀 연동이 없다. "내 사이트에 사람이 얼마나 오고 어디서 왔는지" 보는 용도로는 충분하지만, 정교한 사용자 행동 분석이 필요하다면 Posthog 셀프호스팅이나 Umami를 함께 검토할 만하다.
Listmonk + Amazon SES — Mailchimp 월 $159를 $1.2로 줄이다
Listmonk는 Go 언어로 작성된 오픈소스 뉴스레터·메일링 리스트 관리 도구다. 단일 바이너리로 실행되고, 도커 이미지 크기가 20MB 수준이다. A씨의 구독자는 12,000명이었고, Mailchimp Essential 플랜 기준 월 $159를 내고 있었다.
Listmonk로 전환할 때 핵심 결정은 SMTP 서비스 선택이었다. Listmonk는 뉴스레터 관리 도구이지 메일 발송 서버가 아니다. 발송 자체는 외부 SMTP 서비스에 연결해야 한다.
A씨는 Amazon SES(이메일 발송 서비스)를 선택했다. 이메일 1,000통당 $0.10이며, 12,000통 발송 기준으로 월 약 $1.2밖에 안 든다. Mailchimp 대비 99% 이상 절감이다.
구독자 마이그레이션은 Mailchimp CSV 내보내기를 Listmonk 가져오기 형식에 맞게 변환하는 작업이었다. 필드 이름이 달라 간단한 파이썬 스크립트를 작성했고, 30분 만에 12,000명 데이터를 이전했다.
전환 후 첫 발송에서 문제가 하나 생겼다. 발송 속도가 너무 빨라 Amazon SES 샌드박스 모드 제한에 걸린 것이다. SES는 프로덕션 승인 전 초당 1건 발송 제한이 있다. SES 콘솔에서 프로덕션 접근 승인을 신청하면 영업일 기준 하루 안에 해제된다. 이 절차를 미리 밟지 않은 게 실수였다.
이후 1년간 발송 성공률은 99.7% 수준이었다. 발송 속도도 Mailchimp보다 빨랐다. 12,000통 발송에 Mailchimp는 40~60분 걸렸는데, Listmonk+SES 조합은 15분 내외였다.
Listmonk 관리 화면. 캠페인 작성, 구독자 목록, 발송 통계를 한 곳에서 관리한다.
MinIO 오브젝트 스토리지 — S3 API 그대로, 비용만 제거하다
A씨의 AWS S3 비용은 월 $62였다. 400GB 정도의 사용자 업로드 파일(이미지, 문서)과 CloudFront 트래픽 비용이 포함된 수치다.
MinIO는 S3 호환 API를 제공하는 오픈소스 오브젝트 스토리지다. AWS SDK를 그대로 사용하면서 엔드포인트만 자신의 MinIO 서버로 바꾸면 된다. 코드 변경량이 예상보다 훨씬 적었다.
AWS S3 SDK에서 MinIO로 전환 (Node.js)
const { S3Client } = require('@aws-sdk/client-s3');
// 기존 AWS S3 설정
const s3 = new S3Client({
region: 'ap-northeast-2',
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
}
});
// MinIO 전환 후 — endpoint와 forcePathStyle만 추가
const s3 = new S3Client({
region: 'us-east-1', // MinIO는 리전 임의 지정 가능
endpoint: 'https://cdn.example.com',
forcePathStyle: true, // MinIO에서는 반드시 true
credentials: {
accessKeyId: 'minioadmin',
secretAccessKey: process.env.MINIO_SECRET
}
});
// 이후 업로드·다운로드 코드는 변경 없음
// PutObjectCommand, GetObjectCommand 등 동일하게 작동
코드 수정은 두 줄(엔드포인트, forcePathStyle)이 전부였다. 기존 업로드·다운로드 코드는 그대로 작동했다.
문제는 CDN이었다. S3는 CloudFront와 연동이 자연스럽지만, 셀프호스팅 MinIO는 자체 CDN이 없다. A씨는 클라우드플레어(Cloudflare) 무료 플랜을 MinIO 앞에 두는 방식으로 해결했다. 클라우드플레어가 정적 파일을 캐싱하므로 VPS 실제 트래픽이 크게 줄었다.
월 400GB 유출 트래픽이 클라우드플레어 캐시 적중률 기준 약 80GB로 감소했다. Vultr VPS의 경우 월 1TB까지 트래픽 무료라 스토리지 운영 비용이 사실상 0이 됐다.
단점도 있다. VPS 디스크 용량에 상한이 생긴다. 저장 데이터가 1TB를 초과하면 VPS 볼륨을 추가해야 하는데, 이 시점부터 S3와의 비용 비교가 다시 필요하다. A씨는 현재 500GB 수준이라 아직 여유가 있다.
GlitchTip — Sentry $29를 대체하는 오픈소스 에러 추적
GlitchTip은 Sentry 호환 API를 제공하는 오픈소스 에러 추적 도구다. Sentry SDK를 그대로 사용하면서 DSN 엔드포인트 한 줄만 바꾸면 된다.
Sentry SDK에서 GlitchTip으로 전환 (JavaScript)
import * as Sentry from '@sentry/nextjs';
// 기존 Sentry DSN
Sentry.init({
dsn: 'https://abc123@o12345.ingest.sentry.io/67890'
});
// GlitchTip으로 전환 — DSN만 교체
Sentry.init({
dsn: 'https://공개키@errors.example.com/1'
});
GlitchTip은 Sentry의 전체 기능을 대체하지 않는다. 성능 모니터링(Performance), 세션 리플레이, AI 기반 인사이트 기능이 없다. 순수 에러 추적과 이슈 관리 기능만 제공한다. A씨는 성능 모니터링을 별도 도구로 관리하고 있었기 때문에 이 제약이 크지 않았다.
GlitchTip도 PostgreSQL을 사용하기 때문에, 앞서 구성한 공유 PostgreSQL에 데이터베이스만 추가해서 운영했다. 도커 컨테이너 하나 더 추가로 에러 추적 서버가 생겼다.
GlitchTip 에러 대시보드. Sentry SDK 코드를 그대로 유지하면서 셀프호스팅으로 전환할 수 있다.
1년 후 결과 — 비용, 안정성, 예상 밖이었던 것들
전환 1년이 지난 시점에서 월간 인프라 비용 구조는 다음과 같이 바뀌었다.
항목
전환 전
전환 후
분석 (Mixpanel → Plausible)
$89
$0
이메일 (Mailchimp → Listmonk + SES)
$159
$1.2
스토리지 (S3 + CloudFront → MinIO + 클라우드플레어)
$62
$0
에러 추적 (Sentry → GlitchTip)
$29
$0
VPS (Vultr, 4코어 8GB)
$0
$24
합계
$339+
$25.2
원화 기준으로 월 47만 원 이상이 절감됐다. 절감분은 제품 마케팅 실험과 콘텐츠 제작 예산으로 돌렸다.
예상 밖이었던 점들
VPS 운영 부담이 생각보다 낮았다. 도커 컨테이너가 자동 재시작(restart: always)으로 설정되어 있어, 1년간 수동 개입이 필요한 다운타임은 한 번뿐이었다(VPS 강제 재부팅 사건, 약 2시간).
Listmonk의 발송 속도가 Mailchimp보다 빠른 편이었다. 12,000통 발송에 Mailchimp는 40~60분이었는데, Listmonk+SES는 15분 내외였다.
Plausible 대시보드가 GA4보다 훨씬 빨리 뜨니 데이터를 확인하는 빈도 자체가 늘었다.
처음 설정한 백업이 실제 복구 테스트에서 오류가 났다. 백업만 하고 복구 절차를 연습하지 않으면 장애 시 의미가 없다는 걸 직접 경험했다. 이후 분기별 복구 연습을 루틴으로 넣었다.
이 방식이 맞는 팀과 맞지 않는 팀
셀프호스팅이 모두에게 유리한 선택은 아니다. A씨의 사례에서 추출할 수 있는 기준이다.
셀프호스팅이 유리한 상황
도구 비용 합산이 VPS 1대($20~30/월)를 이미 넘어선 경우
리눅스 서버와 도커에 익숙한 개발자가 있는 경우
데이터를 자사 서버에 두어야 하는 정책 요건이 있는 경우
구독자·사용자 수가 늘수록 SaaS 과금이 급격히 오르는 서비스를 쓰는 경우
SaaS를 그대로 쓰는 게 나은 상황
서버 관리에 시간을 쓸 여유가 없는 초기 단계 팀
Sentry 성능 모니터링, Mailchimp 고급 자동화 같은 SaaS 고유 기능에 의존하는 경우
VPS가 다운되면 분석 수집 중단, 이메일 발송 중단, 파일 접근 불가가 동시에 발생합니다. A씨의 경우 1년 동안 예상치 못한 다운타임이 한 번 있었고 약 2시간 중단됐습니다. 높은 가용성이 필수인 서비스라면 셀프호스팅보다 관리형 SaaS가 낫습니다. 분석·뉴스레터 도구처럼 몇 시간 중단을 허용할 수 있는 경우라면 셀프호스팅이 현실적인 선택입니다. VPS 업체별로 SLA를 확인하면 참고가 됩니다.
VPS는 어느 업체가 좋나요?
A씨는 Vultr(아시아 리전 포함)를 선택했지만, Hetzner(독일 기반, 가격 경쟁력 높음), DigitalOcean(관리 도구 편의성 우수), Linode(Akamai), 국내 업체로는 카페24 서버호스팅·네이버 클라우드 등도 대안입니다. 한국 사용자를 주 대상으로 하는 서비스라면 서버 위치를 도쿄, 서울, 싱가포르 중에서 선택해 응답 속도를 줄이는 게 중요합니다. MinIO 파일 제공 속도가 서버 위치에 직접 영향을 받기 때문입니다.
MinIO와 S3 중 언제 무엇을 선택해야 하나요?
저장 데이터가 1TB를 초과하거나 빠르게 늘어나는 상황이라면 S3가 유리합니다. VPS에 볼륨을 추가하면 추가 요금이 붙어 S3 대비 이점이 줄어들기 때문입니다. 반면 수백 GB 수준으로 비교적 고정된 정적 파일(이미지, 문서)이라면 MinIO + 클라우드플레어 조합으로 비용을 사실상 0에 가깝게 유지할 수 있습니다. 데이터 규모와 증가 속도를 먼저 파악하고 결정하는 것이 좋습니다.
Amazon SES 도메인 발신 설정이 복잡하지 않나요?
SPF, DKIM, DMARC 세 가지 DNS 레코드를 추가해야 합니다. SES 콘솔에서 도메인 인증 절차를 따라가면 추가해야 할 DNS 값을 직접 안내해주기 때문에 도메인 DNS 관리 화면에 복사·붙여넣기만 하면 됩니다. 클라우드플레어 DNS를 사용한다면 해당 레코드에 프록시(오렌지 구름)가 아닌 DNS Only(회색 구름)로 설정해야 인증이 완료됩니다. 설정 완료 후 최대 72시간 이내에 전파됩니다. 이후 발신 도메인 신뢰도가 Mailchimp 공유 도메인보다 높아지는 경우가 많습니다.
Plausible에서 커스텀 이벤트 추적도 되나요?
됩니다. Plausible 커스텀 이벤트(Custom Events) 기능으로 버튼 클릭, 폼 제출, 특정 페이지 도달 등을 수집할 수 있습니다. 다만 Mixpanel의 사용자 단위 세분화(사용자별 전체 이벤트 히스토리, 코호트 분석, 깔때기 분석)는 지원하지 않습니다. 전환율 기본 측정 수준에서는 Plausible이 충분하지만, 사용자 행동 심층 분석이 필요하다면 Posthog 셀프호스팅도 같이 검토할 만합니다.
셀프호스팅 서버 보안은 어떻게 관리하나요?
A씨가 실천한 최소 보안 설정입니다. SSH 키 인증만 허용하고 비밀번호 로그인은 비활성화했습니다. UFW 방화벽으로 22(SSH), 80, 443 포트만 개방했습니다. 도커 컨테이너의 각 서비스 포트(예: PostgreSQL 5432, Listmonk 9000)는 외부에 직접 노출하지 않고 Nginx 리버스 프록시가 외부 트래픽만 처리합니다. 어드민 패널은 기본 인증(Basic Auth) 또는 IP 화이트리스트로 추가 보호했습니다. unattended-upgrades로 우분투 보안 패치를 자동 적용합니다. Fail2ban으로 SSH 로그인 반복 실패를 차단하는 것도 기본입니다.
셀프호스팅오픈소스PlausibleListmonkMinIO비용절감DockerVPSGlitchTipAmazon SES