Self-Hosting prompts.chat: 개인 정보 보호를 최우선으로 하는 프롬프트 라이브러리 구축기
요약
개인 프롬프트 라이브러리 prompts.chat을 외부 SaaS에 의존하지 않고 자체 호스팅하는 아키텍처를 구축한 경험담입니다. Traefik, Tailscale, Docker를 활용하여 제로 트러스트 네트워크 접근 방식을 구현하고, SQLite의 동시 쓰기 문제를 WAL 모드 활성화로 해결했습니다.
핵심 포인트
- Tailscale과 Traefik을 이용해 공용 인터넷 노출 없이 안전한 내부망에 배포하는 방법을 제시합니다.
- SQLite 데이터베이스가 잠기는 문제(database is locked)는 PRAGMA journal_mode=WAL;로 해결할 수 있습니다.
- 서비스를 공개하기 전, 모든 포트와 접근 경로에 대한 명시적인 제어 및 인증이 필수적입니다.
왜 prompts.chat을 홈랩에 두어야 하는가
f/prompts.chat — 과거 Awesome ChatGPT Prompts로 알려졌던 오픈 소스 프롬프트 라이브러리를 테스트하면서, 내부 프롬프트를 제3자 SaaS(Software as a Service)에 유출하지 않을 자체 호스팅 인스턴스가 필요했습니다. 이 프로젝트는 정적 사이트 형태로 배포되지만, 실제 프로덕션 환경에서는 다음이 필요합니다:
- 자동 HTTPS를 지원하는 리버스 프록시
- 제로 트러스트 네트워크 접근 (공개 노출 금지)
- 사용자 정의 프롬프트를 위한 영구 저장소
- 로컬 인증 계층
이것은 bare Nginx와 실수로 인한 공개 노출을 경험한 두 번의 실패 끝에 제가 구축하게 된 검증된 스택입니다.
아키텍처: Traefik + Tailscale + Docker
# docker-compose.yml
version: '3.8'
...
Tailscale ACL을 사용한 제로 트러스트 라우팅
포트 443을 인터넷에 직접 노출하는 대신, Traefik을 Tailscale 인터페이스에 바인딩합니다:
// tailscale-acl.json
{
"acls": [
...
정책 적용하기:
tailscale up --advertise-tags=tag:homelab
sudo ufw allow in on tailscale0 to any port 443
sudo ufw deny 443 # 공용 인터페이스 차단
배포 및 검증
# 스택 시작하기
docker-compose up -d
...
경험담: 부하 상태에서의 SQLite 손상
세 명의 동시 사용자가 프롬프트를 편집하는 초기 테스트 중, 앱이 다음 오류와 함께 충돌했습니다:
SQLite database is locked (5)
근본 원인: prompts.chat은 WAL(Write-Ahead Logging) 모드 없이 단일 SQLite 파일을 사용합니다. 해결책:
# 쓰기 전방 로깅 활성화
sqlite3 data/prompts.db "PRAGMA journal_mode=WAL;"
...
WAL을 활성화한 후, 잠김 현상 없이 10개 이상의 동시 쓰기 작업을 지속적으로 수행할 수 있었습니다.
실수로 인한 공개 노출 (그리고 해결책)
첫 배포 실수: 인증 없이 Traefik 대시보드를 :8080에서 노출했습니다. Shodan이 4시간 이내에 이를 색인화했습니다.
뼈아픈 교훈: 수신되는 모든 포트는 명시적인 접근 제어가 필요합니다.
수정된 설정:
# Traefik 동적 설정 (traefik-config.yml)
http:
middlewares:
...
이 설정을 마운트하세요:
volumes:
- ./traefik-config.yml:/etc/traefik/dynamic/config.yml:ro
성능 참고 사항 (Performance Notes)
- 콜드 스타트(Cold start): 약 2.3초 (Node.js SSR)
- 웜 응답(Warm response): <80ms (캐시된 정적 자산)
- 메모리 사용량(Memory footprint): 140MB (prompts.chat) + 95MB (Traefik)
- 디스크 I/O: WAL 모드 이후에는 무시할 수 있는 수준
자체 호스팅을 피해야 할 경우 (When NOT to Self-Host This)
다음과 같은 경우에는 이 설정을 건너뛰세요:
- 팀이 VPN 없이 분산되어 있는 경우 — Tailscale ACL 모델은 사설 네트워크 백본(private network backbone)을 가정합니다.
- 다중 리전 복제(multi-region replication)가 필요한 경우 — SQLite는 수평 확장(horizontally scale)되지 않습니다.
- 규정 준수(Compliance)에 감사 추적(audit trails)이 필요한 경우 — 이벤트 로깅 미들웨어(event logging middleware)를 추가해야 합니다.
다음 단계 (Next Steps)
프로덕션급 배포(production-grade deployments)를 위해 다음을 추가하세요:
- 자동 SQLite 백업 (
litestream을 S3로) - Traefik의 Prometheus 메트릭 내보내기
- 반복되는 인증 실패에 대한 Fail2ban 규칙
- 헬스 체크 엔드포인트 모니터링
전체 스택은 1GB RAM이 장착된 월 $5 VPS에서 실행됩니다. 전체 설정 시간: SQLite 잠금 문제 해결 후 18분입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기