M
MESSAGE FOR LOVE AND PEACE

Meslap 디지털 사역
시스템 설계 · 운영 백서

meslap.ecolab-x.com · 기술 · 운영 문서
LIVE · 배포 검증 완료 작성 2026-06-26 대상: 운영자 · 차기 유지보수자

0 문서의 목적

이 백서는 meslap.ecolab-x.com실제 배포된 시스템 구조와 운영 절차를 기록한 기술 문서입니다. 성도용 나레이션 백서(meslap-whitepaper)와 짝을 이루는 시스템 설계·운영 짝입니다.

1 한눈에 보기 — 배포 검증

2026-06-26 실측. 모든 구성요소 라이브 확인.

항목검증
공개 사이트https://meslap.ecolab-x.com200 · 69,233 B ✅
구사이트 미러https://meslap-old.ecolab-x.com200 ✅
API 공개 암송구절/api/public/verse정상 응답 ✅
API 인증 보호/api/me401 ✅
백엔드 서비스meslap-api.serviceactive/running ✅
자동연동youtube.json · blog.json12:17 / 12:22 갱신 ✅

2 인프라 아키텍처

                  인터넷 (HTTPS)
                       │
   ┌───────────────────┴────────────────────┐
   │  오라클 클라우드 ARM 서버                  │ 168.107.25.230 (4코어/23GB)
   │  Ubuntu · SSH 별칭 `arm`                 │
   │                                         │
   │  ┌────────────── nginx ──────────────┐   │
   │  │ :443 ssl (와일드카드 SSL)           │   │ ecolab-x.com-0001
   │  │ server_name meslap.ecolab-x.com    │   │
   │  │                                    │   │
   │  │ location /    ─────────────────────┼───┼─▶ /var/www/meslap/index.html
   │  │   try_files … /index.html (SPA)    │   │   (정적 단일 HTML)
   │  │ location /api/ ────────────────────┼───┼─▶ 127.0.0.1:3001 (proxy_pass)
   │  └────────────────────────────────────┘   │
   │                                         │
   │  ┌─ systemd: meslap-api ─────────────┐   │
   │  │ node --experimental-sqlite        │   │ User=ubuntu · Restart=always
   │  │ /opt/meslap-api/server.js  :3001  │   │ Node v22.23.1 · 의존성 0개
   │  │   └─ meslap.db (SQLite, 내장)      │   │
   │  └───────────────────────────────────┘   │
   │                                         │
   │  ┌─ cron: /etc/cron.d/meslap-youtube ─┐   │
   │  │ 00:17,12:17 fetch_youtube.py ──────┼───┼─▶ data/youtube.json
   │  │ 00:22,12:22 fetch_blog.py    ──────┼───┼─▶ data/blog.json
   │  └────────────────────────────────────┘   │
   └─────────────────────────────────────────┘

핵심 설계 원칙

  1. 무의존(zero-dependency) 백엔드 — Node 내장 http + node:sqlite + crypto만. npm 패키지 0개 → 공급망 위험·버전 깨짐 없음.
  2. 정적 + API 분리 — 공개층은 단일 정적 HTML(빠름·견고), 동적 기능만 /api 프록시.
  3. 로컬 바인딩 — API는 127.0.0.1:3001 에만, 외부 노출·TLS는 nginx 전담.
  4. 자가 치유Restart=always / RestartSec=3 로 프로세스 죽어도 자동 복구.
  5. 올리면 채워짐 — cron이 유튜브·블로그를 정적 JSON으로 떨궈, 프론트가 동일 도메인에서 읽음(CORS 불필요).

3 파일 · 경로 지도

경로역할소유/권한
/var/www/meslap/index.html공개 SPA (69KB 단일 파일)root
/var/www/meslap/data/youtube.json유튜브 최신 영상 캐시ubuntu
/var/www/meslap/data/blog.json네이버 블로그 본문 캐시ubuntu
/var/www/meslap/data/bulletins/주보 이미지/PDF 저장소ubuntu
/opt/meslap-api/server.js멤버존 API 본체ubuntu
/opt/meslap-api/meslap.dbSQLite DB (전 데이터)ubuntu rw
/opt/meslap-api/secretPIN 해시 솔트 (0600) — 백업·비공개 필수ubuntu
/opt/meslap/fetch_youtube.py유튜브 RSS 수집기ubuntu
/opt/meslap/fetch_blog.py블로그 본문 수집기ubuntu
/etc/nginx/conf.d/meslap.conf공개 사이트 + /api 프록시root
/etc/nginx/conf.d/meslap-old.conf구사이트 미러root
/etc/cron.d/meslap-youtube자동연동 스케줄root

4 멤버존 백엔드 설계 (server.js)

4.1 인증

4.2 권한 4단계 (위 단계는 아래 포함)

레벨역할대표 권한
1member 성도조회, 본인 주차·출결·가정예배, 성경공부 기록
2officer 재직+ 보고서 작성, 공람 게시
3pastor 목회자+ 암송구절·재정 입력, 주보 업로드
4admin 관리자+ 계정·역할 지정, 명단 관리
안전장치: 마지막 관리자 강등/삭제 차단 (setrole·remove 가드).

4.3 데이터 모델 — SQLite 12 테이블

members · sessions · parking · attendance · families · fam_worship · bible_study · reports · board · finance · settings · bulletins

4.4 API 엔드포인트

메서드 · 경로권한기능
POST /api/login ·/logout · GET /api/me— / 1인증
GET /api/public/verse ·/public/bulletins공개홈 화면용(무인증)
POST /api/admin/verse3금주 암송구절 등록
GET /api/parking · POST /claim ·/release1주차 11칸 (claim은 지정 운전자만)
POST /api/attendance1주일 출석
GET /api/family · POST /toggle ·/admin/family1 / 4가정예배
GET·POST /api/bible ·/bible/remove1성경공부(멘토·멘티·진행·기도)
GET·POST /api/reports ·/remove1 / 2보고서
GET·POST /api/board ·/remove1 / 2공람
GET /api/roster1요람(명단)
GET /api/finance · POST /admin/finance1 / 3재정
GET /api/bulletins · POST /admin/bulletin ·/remove1 / 3주보 업로드(≤25MB) + OCR
/api/admin/member·setdriver·setrole·resetpin·remove4계정 관리

4.5 주보 OCR → 암송구절 자동추출

5 자동연동 (cron)

/etc/cron.d/meslap-youtube — 실행 사용자 ubuntu, 하루 2회:

시각작업출력로그
00:17 / 12:17fetch_youtube.pydata/youtube.json/tmp/meslap_yt.log
00:22 / 12:22fetch_blog.pydata/blog.json/tmp/meslap_blog.log

6 운영 가이드

6.1 최초 셋업

  1. 관리자 로그인 관리자 / 1234즉시 PIN 변경.
  2. 요람에서 실제 성도 명단 등록, 역할 지정(목사=pastor, 집사·부장=officer).
  3. 주차 지정 운전자 표시(setdriver).

6.2 일상 운영 — 손댈 것 없음

6.3 점검 · 복구 명령 (SSH arm)

# 상태
systemctl status meslap-api
curl -s https://meslap.ecolab-x.com/api/public/verse

# 재시작 / 로그
sudo systemctl restart meslap-api
journalctl -u meslap-api -n 50 --no-pager

# 자동연동 수동 실행·로그
sudo -u ubuntu python3 /opt/meslap/fetch_youtube.py
cat /tmp/meslap_yt.log /tmp/meslap_blog.log

# 백업 (DB + 솔트 + 주보) — 반드시 함께
tar czf meslap-backup-$(date +%F).tgz \
  /opt/meslap-api/meslap.db /opt/meslap-api/secret \
  /var/www/meslap/data/bulletins

6.4 백업 정책 (권장)

7 보안 점검표

8 알려진 한계 / 향후 (2차 이후)

9 운영 인프라 의존성

제작 · 호스팅: ecolab-x.com 개척교회 디지털 사역
Meslap — Message For Love And Peace · 2026