PILL_NEW / SERVER ARCHITECTURE
분석 시각: 2026-06-21 04:29 KST · 대상: /mnt/dsm/Plex/pill_new
understand 방식 해석 · 내용 보존판

NAS 폴더 안의
운영 서버 지도

pill_new는 단순 소스 폴더가 아니라 Payload CMS + Next.js 앱을 중심으로 MongoDB, Redis, Meilisearch, Caddy, n8n, Grafana/Prometheus/Loki, 백업 스크립트까지 묶은 Docker Compose 운영 스택입니다.

1. 위치와 현재 접근 상태

확인된 경로

  • 폴더: /mnt/dsm/Plex/pill_new
  • 마운트: 192.168.0.8:/volume1/Plex
  • 방식: NFS v3
  • 디스크: 5.3T 중 4.0T 사용, 1.3T 여유, 사용률 76%

현재 실행 상태

VM101에서 이 폴더는 RayNAS NFS 공유로 접근 가능했습니다. 다만 로컬 Docker에서 이 Compose 스택이 현재 떠 있는 상태는 아니었고, 관련 이름의 컨테이너도 잡히지 않았습니다.

2. 서버 구성 레이어

파일 기준 핵심 구성: docker-compose.yml, Caddyfile, Dockerfile, monitoring/*, scripts/backup/*.

App Layer

payload

Payload CMS Admin과 Next.js 프론트엔드를 실행하는 웹앱 본체입니다. 외부 포트는 3001:3000이고 MongoDB, Redis, Meilisearch, SMTP, OAuth 환경변수에 연결됩니다.

Data Layer

mongo / redis / meilisearch

MongoDB는 TLS/auth 기반 주 데이터베이스, Redis는 캐시와 임시 상태, Meilisearch는 사이트 검색 전용 엔진입니다. 실제 데이터는 storage/do-not-backup 아래에 있습니다.

Proxy Layer

caddy

pss.rayp.shop은 Payload와 모니터링 경로를, 8n8.rayp.shop은 n8n을 프록시합니다. 접근 로그는 GoAccess/Promtail의 입력이 됩니다.

Automation

n8n

외부 API, 알림, 반복 작업 자동화용 워크플로 서버입니다. 데이터는 ../n8n_data를 사용하므로 pill_new 내부에 완전히 갇힌 구조는 아닙니다.

Monitoring

Grafana / Prometheus / Loki

Prometheus가 메트릭을 수집하고 Alertmanager가 알림을 라우팅합니다. Promtail은 Docker/Caddy 로그를 Loki에 보내며 Grafana가 대시보드로 보여줍니다.

Backup

scripts/backup

Mongo, Redis, Meilisearch를 정식 백업 파일로 덤프하고 storage/backup에 저장합니다. 매월 1일 Mongo restore 검증도 설계되어 있습니다.

16운영 compose 서비스
3핵심 데이터 저장소
7모니터링/알림 구성 요소
04:30백업 문서상 일일 실행 시각

3. understand식 의존 그래프

Caddy
 ├─ serves → payload:3000
 ├─ serves → n8n:5678
 ├─ serves → grafana:3000
 ├─ serves → dozzle:8080
 ├─ serves → goaccess:7890/static
 ├─ serves → alertmanager:9093
 └─ serves → loki:3100

payload
 ├─ depends_on → mongo
 ├─ depends_on → redis
 ├─ depends_on → meilisearch
 ├─ reads/writes → storage/media
 └─ uses → SMTP/OAuth/Admin env

mongo
 ├─ stores → storage/do-not-backup/mongo
 └─ uses_tls → storage/mongo-tls

redis
 └─ stores → storage/do-not-backup/redis

meilisearch
 └─ stores → storage/do-not-backup/meili

promtail
 ├─ reads → Docker logs
 ├─ reads → Caddy access.log
 └─ writes_to → Loki

prometheus
 ├─ scrapes → node-exporter / cadvisor / loki / promtail / grafana / alertmanager
 └─ alerts_to → alertmanager

backup scripts
 ├─ dumps → mongo / redis / meilisearch
 └─ writes_to → storage/backup

4. 라우팅과 모니터링

pss.rayp.shop/는 Payload/Next.js, /monitor/grafana*는 Grafana, /monitor/dozzle/*는 Dozzle, /monitor/goaccess/*는 GoAccess, /monitor/loki/*는 Loki, /monitor/alertmanager*는 Alertmanager로 연결됩니다.
8n8.rayp.shop전체 요청이 n8n:5678로 프록시됩니다.
로컬/Tailscale192.168.0.9, 127.0.0.1, localhost, 100.80.214.64, pill.tail070b5c.ts.net가 모니터링 접근용 호스트로 잡혀 있습니다.
알림 조건CPU 85% 초과, 메모리 90% 초과, 루트 디스크 90% 초과, 모니터링 대상 down, API 5xx 5% 초과, API p95 1.5초 초과, API 트래픽 급감이 정의되어 있습니다.

5. 백업과 복구

설계 의도

  • 백업 스크립트: scripts/backup
  • 백업 결과: storage/backup
  • 원본 데이터: storage/do-not-backup
  • 보관 정책: 최근 30일 매일, 이후 월 1개
  • 매월 1일 Mongo restore 검증

최근 확인된 백업

  • Mongo: mongo-payload-20260618-043001.archive.gz
  • Redis: redis-20260618-043002.rdb
  • Meili: meili-20260617-193007579-20260618-043007.dump
  • 관찰: 6/18 이후 최신 파일이 보이지 않아 cron/운영 위치 확인이 필요합니다.

6. 바로 봐야 할 리스크

운영 .env 부재

.env는 없고 .env.generated, .env.example만 확인됐습니다. 그래서 compose 확인 시 운영 환경변수들이 다수 unset으로 나왔습니다.

민감 파일 권한 777

.env.generated, mongo.pem, mongo.key 등이 -rwxrwxrwx로 보였습니다. 백업 문서 기준으로는 private key와 운영 env는 600이 맞습니다.

운영 payload의 기동 순서

dev/recovery compose에는 depends_on이 있지만 운영 payload에는 없습니다. 재기동 시 DB보다 앱이 먼저 떠 초기 연결 실패가 날 수 있습니다.

도메인 기준

현재 구성은 rayp.shop 도메인 중심입니다. 앞으로 정리한다면 현재 선호 기준인 rayp.store로 DNS/프록시까지 함께 검토해야 합니다.

7. 결론

pill_new는 운영 가능한 풀스택 서비스 묶음입니다. 핵심은 Payload CMS + Next.js 웹앱이고, MongoDB/Redis/Meilisearch가 데이터 계층, Caddy가 프록시 계층, n8n이 자동화 계층, Prometheus/Grafana/Loki/GoAccess/Dozzle/Alertmanager가 관측 계층, scripts/backup이 백업 계층을 담당합니다.

다만 VM101에서 본 현재 상태 기준으로는 폴더는 RayNAS NFS로 접근 가능하지만 이 스택 자체가 여기서 실행 중인 것은 아닙니다. 운영 전에는 .env 위치, 민감 파일 권한, 백업 최신성, 실제 실행 호스트를 먼저 확인하는 편이 안전합니다.