mega-framework 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/package.json +1 -1
  2. package/sample/crud/.env +156 -8
  3. package/sample/crud/.env.example +153 -28
  4. package/sample/crud/mega.config.js +61 -2
  5. package/sample/crud/package.json +2 -2
  6. package/sample/crud/yarn.lock +1 -1
  7. package/src/cli/commands/new.js +115 -67
  8. package/src/cli/commands/scaffold.js +6 -12
  9. package/src/cli/index.js +133 -12
  10. package/src/core/boot.js +30 -1
  11. package/src/core/config-validator.js +25 -0
  12. package/src/core/mega-app.js +25 -21
  13. package/src/core/mega-cluster.js +50 -12
  14. package/src/core/scope-registry.js +0 -1
  15. package/src/lib/mega-logger.js +1 -1
  16. package/src/lib/mega-shutdown.js +51 -13
  17. package/sample/crud/test/apps/main/auth-flow.integration.test.js +0 -177
  18. package/sample/crud/test/apps/main/auth-service.test.js +0 -93
  19. package/sample/crud/test/apps/main/chat-channel.test.js +0 -149
  20. package/sample/crud/test/apps/main/cron-demo-service.test.js +0 -93
  21. package/sample/crud/test/apps/main/demo-flow.integration.test.js +0 -386
  22. package/sample/crud/test/apps/main/email-job.test.js +0 -76
  23. package/sample/crud/test/apps/main/guide-service.test.js +0 -68
  24. package/sample/crud/test/apps/main/hash-task.test.js +0 -30
  25. package/sample/crud/test/apps/main/jobs-demo-service.test.js +0 -88
  26. package/sample/crud/test/apps/main/logs-demo-service.test.js +0 -85
  27. package/sample/crud/test/apps/main/metrics-demo-service.test.js +0 -90
  28. package/sample/crud/test/apps/main/note-service.test.js +0 -68
  29. package/sample/crud/test/apps/main/perf-service.test.js +0 -121
  30. package/sample/crud/test/apps/main/perf.integration.test.js +0 -202
  31. package/sample/crud/test/apps/main/redis-demo-service.test.js +0 -98
  32. package/sample/crud/test/apps/main/tracing-demo-service.test.js +0 -90
  33. package/sample/crud/test/apps/main/upload-demo-service.test.js +0 -61
  34. package/sample/crud/test/apps/main/user-service.test.js +0 -65
  35. package/sample/crud/test/apps/main/ws-chat.integration.test.js +0 -233
  36. package/templates/project/app.config.tpl +0 -8
  37. package/templates/project/app.config.views.tpl +0 -37
  38. package/templates/project/ecosystem.config.tpl +0 -10
  39. package/templates/project/env.tpl +0 -12
  40. package/templates/project/gitignore.tpl +0 -8
  41. package/templates/project/locales/client/en.json.tpl +0 -3
  42. package/templates/project/locales/client/ko.json.tpl +0 -3
  43. package/templates/project/locales/server/en.json.tpl +0 -17
  44. package/templates/project/locales/server/ko.json.tpl +0 -17
  45. package/templates/project/mega.config.tpl +0 -11
  46. package/templates/project/package.tpl +0 -25
  47. package/templates/project/public/css/app.css +0 -101
  48. package/templates/project/public/js/app.js +0 -54
  49. package/templates/project/public/js/theme-init.js +0 -12
  50. package/templates/project/public/vendor/bootstrap/bootstrap.bundle.min.js +0 -7
  51. package/templates/project/public/vendor/bootstrap/bootstrap.min.css +0 -6
  52. package/templates/project/readme.tpl +0 -48
  53. package/templates/project/route.test.tpl +0 -13
  54. package/templates/project/route.test.views.tpl +0 -15
  55. package/templates/project/route.tpl +0 -10
  56. package/templates/project/route.views.tpl +0 -10
  57. package/templates/project/views/index.ejs.tpl +0 -58
  58. package/templates/project/views/layout.ejs.tpl +0 -73
  59. package/templates/project/vitest.config.tpl +0 -8
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mega-framework",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Node.js 마이크로프레임웍 + CLI — Slim의 가벼움 + Rails의 관례",
5
5
  "type": "module",
6
6
  "engines": {
package/sample/crud/.env CHANGED
@@ -1,27 +1,175 @@
1
+ # =============================================================================
2
+ # sample-crud 환경변수 (.env) — 프레임워크 전체 설정 참조
3
+ # =============================================================================
4
+ # CLI(`mega start`/`worker`/`scheduler`)가 부팅 전에 이 파일을 process.env 로
5
+ # 자동 로드한다(Node `process.loadEnvFile`, 20.6+, ADR-152). 이미 설정된 실제
6
+ # 환경변수는 덮어쓰지 않는다(실 env 우선 — `--env-file` 과 동일). 그 뒤 mega.config.js·
7
+ # apps/<app>/app.config.js 가 `process.env.X` 로 이 값들을 참조한다.
8
+ #
9
+ # [표기 규칙]
10
+ # KEY=value → 이 데모(crud)가 실제로 쓰는 값.
11
+ # # KEY=value → 프레임워크는 지원하지만 이 데모는 안 쓰는 옵션(참고용 — 필요 시 주석 해제).
12
+ #
13
+ # ⚠️ 아래 시크릿/비밀번호는 로컬 도커 데모 전용. 운영 배포 전 반드시 교체할 것.
14
+ # =============================================================================
15
+
16
+
17
+ # ── 실행 환경 ────────────────────────────────────────────────────────────────
18
+ # development | production | test. pretty 로깅·정적자산 캐싱·i18n 자동완성 등에 영향.
19
+ # 보통 npm 스크립트(dev=development / start=production)가 설정하므로 .env 에선 생략 가능.
20
+ # NODE_ENV=development
21
+
22
+
23
+ # ── 서버 (mega.config.js > server) ───────────────────────────────────────────
24
+ # HTTP listen 포트 — server.port. CLI `--port N` 이 우선(ADR-146).
1
25
  PORT=3000
2
- DATABASE_URL=postgres://mega:dkTkqkfl12@localhost:5432/mega_test
3
- MEGA_CLUSTER_WORKERS=8
26
+ # 세션 쿠키 HMAC 서명 시크릿(필수) — server.sessionSecret. 32자 이상 랜덤 강제(ADR-129/155).
4
27
  SESSION_SECRET=Zz4VoSzf0sYMEoqASu8G_wx5l3uKi2MlHsxDK3MSkoE
28
+ # cluster 워커 프로세스 수(CLI 가 읽음, ADR-154) — 정수 N 또는 max(CPU 코어 수). 미설정/1=단일.
29
+ # 우선순위: `--cluster` 플래그 > MEGA_CLUSTER_WORKERS > server.cluster config.
30
+ MEGA_CLUSTER_WORKERS=8
31
+
32
+
33
+ # ── ASP: Application-layer Secure Protocol (mega.config.js > asp) ─────────────
34
+ # /ws/chat 의 E:/P: 프레임 키 유도 masterSecret(필수) — asp.masterSecret (ADR-127/158).
35
+ # 클라이언트(WASM MegaSocket)도 같은 secret 으로 키를 유도하는 공유키 구조라 데모 전용 값을 둔다.
36
+ ASP_MASTER_SECRET=demo-asp-master-7Qe2mWzR1tYbN8sLpKvX0cAfH4dG6jU
37
+
38
+
39
+ # ── 데이터베이스 (mega.config.js > services.databases) ────────────────────────
40
+ # Postgres(필수) — databases.primary.url. 모델·마이그레이션(mega migrate)·세션 사용자.
41
+ DATABASE_URL=postgres://mega:dkTkqkfl12@localhost:5432/mega_test
42
+ # MongoDB(필수) — databases.mongo.url. /demo/notes 컬렉션(ADR-108). url path 의 dbName 추출,
43
+ # authSource=인증 DB(보통 admin).
44
+ MONGO_URL=mongodb://mega:dkTkqkfl12@localhost:27017/mega_test?authSource=admin
45
+ # MariaDB(미사용) — 프레임워크는 mariadb 드라이버 지원. 쓰려면 mega.config 의 services.databases 에
46
+ # { driver:'mariadb', url: process.env.MARIA_URL } 추가. (url 은 query string 미지원)
47
+ # MARIA_URL=mariadb://mega:dkTkqkfl12@localhost:3306/mega_test
48
+
49
+
50
+ # ── Redis 캐시 (mega.config.js > services.caches, app.config > session) ───────
51
+ # 논리 DB 인덱스를 분리해 키 충돌 회피(/0 세션 · /1 demo · /2 rate · /3 lock).
52
+ # 세션 store(app.config.js session.store.url, ADR-129/155).
5
53
  REDIS_SESSION_URL=redis://:dkTkqkfl12@localhost:6379/0
54
+ # brute-force 카운터(ctx.bruteForce, ADR-049/130) — caches.rate.
6
55
  REDIS_RATE_URL=redis://:dkTkqkfl12@localhost:6379/2
56
+ # /demo/redis·cron·jobs 데모 캐시 — caches.demo.
7
57
  REDIS_DEMO_URL=redis://:dkTkqkfl12@localhost:6379/1
58
+ # 분산 락(redlock, ADR-113) — caches.lock(locks.main 이 빌려 씀). /demo/cron leader election.
8
59
  REDIS_LOCK_URL=redis://:dkTkqkfl12@localhost:6379/3
9
- MONGO_URL=mongodb://mega:dkTkqkfl12@localhost:27017/mega_test?authSource=admin
60
+ # 범용 캐시(미사용) — 별도 캐시 어댑터가 필요하면 services.caches 에 추가해 참조.
61
+ # REDIS_CACHE_URL=redis://:dkTkqkfl12@localhost:6379/4
62
+
63
+
64
+ # ── NATS 버스 (mega.config.js > services.buses) ──────────────────────────────
65
+ # 잡 큐(EmailJob JetStream, ADR-119) — buses.jobs.url. `mega worker` 가 소비, 웹이 enqueue.
66
+ # JetStream 활성 서버 필요(nats-server -js).
10
67
  NATS_JOBS_URL=nats://localhost:4222
11
- ASP_MASTER_SECRET=demo-asp-master-7Qe2mWzR1tYbN8sLpKvX0cAfH4dG6jU
68
+ # 이벤트 버스(미사용) — pub/sub 등 두 번째 버스가 필요하면 services.buses 에 추가.
69
+ # NATS_EVENTS_URL=nats://localhost:4222
70
+
12
71
 
72
+ # ── WS Hub: 클러스터 채팅 브릿지 (ADR-059/065/137/176) ────────────────────────
73
+ # crud 는 app.config.js 의 bridgeHub 로 /ws/chat 을 클러스터 전파한다. 허브는 `mega ws-hub`(scripts/
74
+ # start-ws-hub.sh)로 별도 프로세스 기동. 아래 MEGA_WSHUB_* 는 src/cli/ws-hub.js 가 읽는다.
75
+ # --- 허브 서버가 읽는 값 (`mega ws-hub`) ---
76
+ # 수락 토큰 CSV(필수) — 브릿지 인증. 빈 값이면 허브 기동 실패. 운영 교체.
13
77
  MEGA_WSHUB_TOKENS=dev-bridge-token-change-me
14
- MEGA_WSHUB_TOKEN=dev-bridge-token-change-me
15
78
  MEGA_WSHUB_PORT=3100
16
79
  MEGA_WSHUB_HOST=0.0.0.0
80
+ # 허브 튜닝(선택) — 미설정 시 코드 기본값(heartbeat 25000 / maxPayload 1 MiB / 압축 off).
81
+ MEGA_WSHUB_HEARTBEAT_MS=25000
82
+ MEGA_WSHUB_MAX_PAYLOAD=1048576
83
+ MEGA_WSHUB_COMPRESSION=false
84
+ MEGA_WSHUB_COMPRESSION_THRESHOLD=1024 # MEGA_WSHUB_COMPRESSION=true 일 때만 적용
85
+ # --- 앱(브릿지 클라이언트)이 읽는 값 (app.config.js > bridgeHub) ---
17
86
  MEGA_WSHUB_URL=ws://localhost:3100
87
+ MEGA_WSHUB_TOKEN=dev-bridge-token-change-me
88
+ # 이 노드(브릿지) 식별자 — bridgeHub.bridgeId. roster/로그 구분용(클러스터 워커는 -w{id} suffix 자동).
89
+ BRIDGE_ID=crud-1
90
+
18
91
 
92
+ # ── OpenTelemetry 분산 트레이싱 (선택, ADR-104/114/126/163) ───────────────────
93
+ # MegaTracing.fromEnv() 가 부팅 시 읽는다(boot.js). ENABLED!=='true' 면 0 비용 no-op.
94
+ # /demo/tracing 데모가 요청별 trace_id 를 만들고 Zipkin 딥링크로 잇는다. docker 의
95
+ # otel-collector(:4318 OTLP HTTP)·zipkin(:9411) 가동 시 true 로 켠다(collector 부재 시 export 실패 로그).
19
96
  MEGA_OTEL_ENABLED=true
20
97
  MEGA_OTEL_SERVICE_NAME=sample-crud
21
98
  MEGA_OTEL_ENDPOINT=http://localhost:4318/v1/traces
22
- MEGA_OTEL_EXPORTER=otlp
23
- MEGA_OTEL_SAMPLING_RATIO=1.0
99
+ MEGA_OTEL_EXPORTER=otlp # otlp | zipkin | console | inmemory
100
+ MEGA_OTEL_SAMPLING_RATIO=1.0 # 0.0~1.0 또는 always_on | always_off
101
+ # Zipkin UI API base — /demo/tracing 딥링크 base(앱 코드가 읽음).
24
102
  MEGA_OTEL_ZIPKIN_API=http://localhost:9411/api/v2
103
+ # resource 속성(선택) — 미설정 시 생략.
104
+ # MEGA_OTEL_VERSION=1.0.0
105
+ # MEGA_OTEL_ENVIRONMENT=local
106
+
107
+
108
+ # ── Prometheus 메트릭 (선택, ADR-072/131) ────────────────────────────────────
109
+ # crud 는 mega.config.js 의 health.exposeMetrics:true 로 /metrics 를 켠다(config 주도 — env 아님).
110
+ # 아래 env 는 MegaMetrics.fromEnv() 를 직접 호출하는 커스텀 부팅에서만 효과(기본 boot 는 config 사용).
111
+ # METRICS_ENABLED=true # 또는 MEGA_METRICS_ENABLED
112
+ # MEGA_METRICS_SERVICE_NAME=sample-crud
113
+ # MEGA_METRICS_ENVIRONMENT=local
114
+
115
+
116
+ # ── 로깅 (mega.config.js > logger, ADR-023/141) ──────────────────────────────
117
+ # pino 레벨 — logger.level. fatal | error | warn | info | debug | trace.
118
+ LOG_LEVEL=info
119
+ # (참고) 파일/텔레그램 sink 등은 .env 가 아니라 mega.config.js 의 logger.sinks 배열로 설정한다.
120
+
121
+
122
+ # ── 데모 (앱 코드가 읽음) ─────────────────────────────────────────────────────
123
+ # /demo/upload 저장 디렉터리. 상대경로=프로젝트 루트(cwd) 기준. 미설정 시 var/uploads.
25
124
  DEMO_UPLOAD_DIR=var/uploads
26
125
 
27
- BRIDGE_ID=crud-1
126
+
127
+ # =============================================================================
128
+ # Docker 인프라 (docker-compose.yml 이 읽음, ADR-103) — 전부 선택/주석
129
+ # =============================================================================
130
+ # 위 연결 문자열(DATABASE_URL 등)은 아래 도커 기본값과 정합한다. docker-compose.yml 에 인라인
131
+ # 디폴트가 있어 미설정이어도 컨테이너가 뜨지만, 포트/비번을 바꾸려면 아래를 켜고 위 URL 도 함께 맞춘다.
132
+ # 네이밍: MEGA_<SERVICE>_<FIELD>.
133
+ # MEGA_PG_PORT=5432
134
+ # MEGA_PG_USER=mega
135
+ # MEGA_PG_PASSWORD=dkTkqkfl12
136
+ # MEGA_PG_DB=mega_test
137
+ # MEGA_MONGO_PORT=27017
138
+ # MEGA_MONGO_USER=mega
139
+ # MEGA_MONGO_PASSWORD=dkTkqkfl12
140
+ # MEGA_MONGO_DB=mega_test
141
+ # MEGA_REDIS_PORT=6379
142
+ # MEGA_REDIS_PASSWORD=dkTkqkfl12
143
+ # MEGA_NATS_PORT=4222
144
+ # MEGA_NATS_MONITOR_PORT=8222
145
+ # MEGA_MARIA_PORT=3306
146
+ # MEGA_MARIA_ROOT_PASSWORD=dkTkqkfl12
147
+ # MEGA_MARIA_USER=mega
148
+ # MEGA_MARIA_PASSWORD=dkTkqkfl12
149
+ # MEGA_MARIA_DB=mega_test
150
+ # 컨테이너 restart 정책: 개발=unless-stopped / CI 일회성=no.
151
+ # MEGA_INFRA_RESTART=unless-stopped
152
+
153
+
154
+ # =============================================================================
155
+ # 어댑터 옵션 자동매핑 (ADR-109, 12-factor) — 전부 선택/주석
156
+ # =============================================================================
157
+ # services.<domain>.<key> 에 `envPrefix: 'PG'` 처럼 지정하면 MegaAdapterManager 가
158
+ # MEGA_<PREFIX>_<KEY> 를 읽어 어댑터 옵션에 병합(env 우선). url 직접 지정 대신 12-factor 분리용.
159
+ # (crud 는 url 직접 방식이라 미사용 — 아래는 문법 참고.)
160
+ # 문법: MEGA_<PREFIX>_<KEY>
161
+ # URL → url
162
+ # HOST / PORT / USER / PASSWORD → 연결필드 (PORT 만 정수, 나머지 문자열)
163
+ # DATABASE | DB → database / DBNAME → dbName(Mongo)
164
+ # POOL_<X> → pool.{camelCase(X)} (드라이버 공통, 값 자동 타입변환)
165
+ # OPTIONS_<X> → options.{드라이버 표기} (postgres/sqlite=snake, 그 외=camel; MS 대문자 보존)
166
+ # 공통 풀 인터페이스(min/max/idleTimeoutMs/acquireTimeoutMs/maxLifetimeMs) 예:
167
+ # MEGA_PG_POOL_MIN=0
168
+ # MEGA_PG_POOL_MAX=10
169
+ # MEGA_PG_POOL_IDLE_TIMEOUT_MS=10000
170
+ # 드라이버 특화 옵션 예:
171
+ # MEGA_PG_OPTIONS_SSL=true # → options.ssl
172
+ # MEGA_PG_OPTIONS_STATEMENT_TIMEOUT=30000 # → options.statement_timeout (pg=snake)
173
+ # MEGA_MONGO_OPTIONS_AUTH_SOURCE=admin # → options.authSource (mongo=camel)
174
+ # MEGA_MONGO_OPTIONS_SERVER_SELECTION_TIMEOUT_MS=5000 # → options.serverSelectionTimeoutMS
175
+ # MEGA_MARIA_OPTIONS_BIG_INT_STRATEGY=number # number(기본,2^53 초과 손실) | bigint | string
@@ -1,50 +1,175 @@
1
- # sample-crud 환경변수 (.env.example) — 복사해서 .env 로 쓰고 실제 값 채우기. .env 는 git 에 안 올림.
1
+ # =============================================================================
2
+ # sample-crud 환경변수 (.env.example) — 프레임워크 전체 설정 참조
3
+ # =============================================================================
4
+ # 복사해서 `.env` 로 쓰고 시크릿/비밀번호를 실제 값으로 채운다. CLI(`mega start`/`worker`/
5
+ # `scheduler`)가 부팅 전에 `.env` 를 process.env 로 자동 로드한다(Node `process.loadEnvFile`,
6
+ # 20.6+, ADR-152). 이미 설정된 실제 환경변수는 덮어쓰지 않는다(실 env 우선). 그 뒤 mega.config.js·
7
+ # apps/<app>/app.config.js 가 `process.env.X` 로 이 값들을 참조한다.
8
+ #
9
+ # [표기 규칙]
10
+ # KEY=value → 이 데모(crud)가 실제로 쓰는 값.
11
+ # # KEY=value → 프레임워크는 지원하지만 이 데모는 안 쓰는 옵션(참고용 — 필요 시 주석 해제).
12
+ #
13
+ # ⚠️ change-me 로 표시된 값은 반드시 교체할 것(시크릿은 32자 이상 랜덤 권장).
14
+ # =============================================================================
2
15
 
3
- # HTTP 포트
16
+
17
+ # ── 실행 환경 ────────────────────────────────────────────────────────────────
18
+ # development | production | test. pretty 로깅·정적자산 캐싱·i18n 자동완성 등에 영향.
19
+ # 보통 npm 스크립트(dev=development / start=production)가 설정하므로 .env 에선 생략 가능.
20
+ # NODE_ENV=development
21
+
22
+
23
+ # ── 서버 (mega.config.js > server) ───────────────────────────────────────────
24
+ # HTTP listen 포트 — server.port. CLI `--port N` 이 우선(ADR-146).
4
25
  PORT=3000
26
+ # 세션 쿠키 HMAC 서명 시크릿(필수) — server.sessionSecret. 32자 이상 랜덤 강제(ADR-129/155).
27
+ SESSION_SECRET=change-me-to-a-long-random-secret-at-least-32-chars
28
+ # cluster 워커 프로세스 수(CLI 가 읽음, ADR-154) — 정수 N 또는 max(CPU 코어 수). 미설정/1=단일.
29
+ # 우선순위: `--cluster` 플래그 > MEGA_CLUSTER_WORKERS > server.cluster config.
30
+ MEGA_CLUSTER_WORKERS=8
31
+
32
+
33
+ # ── ASP: Application-layer Secure Protocol (mega.config.js > asp) ─────────────
34
+ # /ws/chat 의 E:/P: 프레임 키 유도 masterSecret(필수) — asp.masterSecret (ADR-127/158).
35
+ # 클라이언트(WASM MegaSocket)도 같은 secret 으로 키를 유도하는 공유키 구조라 데모 전용 값을 둔다.
36
+ ASP_MASTER_SECRET=change-me-to-a-demo-asp-secret
5
37
 
6
- # cluster 워커 프로세스 수(ADR-154) — 정수 N 또는 max(CPU 코어 수). 미설정/1=단일 프로세스.
7
- # MEGA_CLUSTER_WORKERS=max
8
38
 
9
- # Postgres 연결 (필수) services.databases.primary.url 이 읽는다.
10
- # 예: docker compose postgres
39
+ # ── 데이터베이스 (mega.config.js > services.databases) ────────────────────────
40
+ # Postgres(필수) databases.primary.url. 모델·마이그레이션(mega migrate)·세션 사용자.
11
41
  DATABASE_URL=postgres://mega:change-me@localhost:5432/mega_test
42
+ # MongoDB(필수) — databases.mongo.url. /demo/notes 컬렉션(ADR-108). url path 의 dbName 추출,
43
+ # authSource=인증 DB(보통 admin).
44
+ MONGO_URL=mongodb://mega:change-me@localhost:27017/mega_test?authSource=admin
45
+ # MariaDB(미사용) — 프레임워크는 mariadb 드라이버 지원. 쓰려면 mega.config 의 services.databases 에
46
+ # { driver:'mariadb', url: process.env.MARIA_URL } 추가. (url 은 query string 미지원)
47
+ # MARIA_URL=mariadb://mega:change-me@localhost:3306/mega_test
12
48
 
13
- # 세션 쿠키 HMAC 서명 시크릿 (필수, ADR-155) — server.sessionSecret 이 읽는다. 충분히 긴 랜덤 문자열.
14
- SESSION_SECRET=change-me-to-a-long-random-secret
15
49
 
16
- # Redis 연결 (필수, ADR-155/157) 세션 store·brute-force·/demo/redis·cron·jobs 데모 캐시 + 분산 락(redlock).
17
- # DB 인덱스를 분리해 키 충돌을 피한다(/0 세션, /1 demo, /2 rate, /3 lock).
50
+ # ── Redis 캐시 (mega.config.js > services.caches, app.config > session) ───────
51
+ # 논리 DB 인덱스를 분리해 키 충돌 회피(/0 세션 · /1 demo · /2 rate · /3 lock).
52
+ # 세션 store(app.config.js session.store.url, ADR-129/155).
18
53
  REDIS_SESSION_URL=redis://:change-me@localhost:6379/0
54
+ # brute-force 카운터(ctx.bruteForce, ADR-049/130) — caches.rate.
19
55
  REDIS_RATE_URL=redis://:change-me@localhost:6379/2
56
+ # /demo/redis·cron·jobs 데모 캐시 — caches.demo.
20
57
  REDIS_DEMO_URL=redis://:change-me@localhost:6379/1
21
- # 분산 락(redlock, ADR-113) — services.caches.lock 이 읽는다. /demo/cron 스케줄의 클러스터 중복방지(leader election).
58
+ # 분산 락(redlock, ADR-113) — caches.lock(locks.main빌려 씀). /demo/cron leader election.
22
59
  REDIS_LOCK_URL=redis://:change-me@localhost:6379/3
60
+ # 범용 캐시(미사용) — 별도 캐시 어댑터가 필요하면 services.caches 에 추가해 참조.
61
+ # REDIS_CACHE_URL=redis://:change-me@localhost:6379/4
62
+
23
63
 
24
- # NATS 연결 (필수, ADR-119) services.buses.jobs.url 이 읽는다. /demo/jobs 잡 큐(EmailJob) JetStream 백엔드.
25
- # `mega worker` 프로세스가 소비하고 웹은 enqueue 한다. JetStream 활성 NATS 서버 필요(nats-server -js).
64
+ # ── NATS 버스 (mega.config.js > services.buses) ──────────────────────────────
65
+ # 큐(EmailJob JetStream, ADR-119) buses.jobs.url. `mega worker` 소비, 웹이 enqueue.
66
+ # JetStream 활성 서버 필요(nats-server -js).
26
67
  NATS_JOBS_URL=nats://localhost:4222
68
+ # 이벤트 버스(미사용) — pub/sub 등 두 번째 버스가 필요하면 services.buses 에 추가.
69
+ # NATS_EVENTS_URL=nats://localhost:4222
27
70
 
28
- # MongoDB 연결 (필수, ADR-157) — services.databases.mongo.url 이 읽는다. /demo/notes 데모 컬렉션의 백엔드.
29
- # url path 의 dbName(mega_test)을 어댑터가 추출한다. authSource 는 인증 DB(보통 admin).
30
- MONGO_URL=mongodb://mega:change-me@localhost:27017/mega_test?authSource=admin
31
71
 
32
- # ASP WebSocket 데모 masterSecret (필수, ADR-158) — asp.masterSecret 이 읽는다. /ws/chat 의 E:/P:
33
- # 프레임 유도에 쓰인다. ASP 클라이언트(WASM MegaSocket)도 같은 secret 으로 키를 만드는 공유-키
34
- # 구조라 데모 페이지가 값을 브라우저에 주입한다 운영 secret 과 섞이지 않게 데모 전용 값을 둔다.
35
- ASP_MASTER_SECRET=change-me-to-a-demo-asp-secret
72
+ # ── WS Hub: 클러스터 채팅 브릿지 (ADR-059/065/137/176) ────────────────────────
73
+ # crud app.config.js bridgeHub /ws/chat 클러스터 전파한다. 허브는 `mega ws-hub`(scripts/
74
+ # start-ws-hub.sh)로 별도 프로세스 기동. 아래 MEGA_WSHUB_* src/cli/ws-hub.js 읽는다.
75
+ # --- 허브 서버가 읽는 값 (`mega ws-hub`) ---
76
+ # 수락 토큰 CSV(필수) — 브릿지 인증. 빈 값이면 허브 기동 실패. 운영 교체.
77
+ MEGA_WSHUB_TOKENS=change-me-hub-token
78
+ MEGA_WSHUB_PORT=3100
79
+ MEGA_WSHUB_HOST=0.0.0.0
80
+ # 허브 튜닝(선택) — 미설정 시 코드 기본값(heartbeat 25000 / maxPayload 1 MiB / 압축 off).
81
+ # MEGA_WSHUB_HEARTBEAT_MS=25000
82
+ # MEGA_WSHUB_MAX_PAYLOAD=1048576
83
+ # MEGA_WSHUB_COMPRESSION=false
84
+ # MEGA_WSHUB_COMPRESSION_THRESHOLD=1024 # MEGA_WSHUB_COMPRESSION=true 일 때만 적용
85
+ # --- 앱(브릿지 클라이언트)이 읽는 값 (app.config.js > bridgeHub) ---
86
+ MEGA_WSHUB_URL=ws://localhost:3100
87
+ MEGA_WSHUB_TOKEN=change-me-hub-token
88
+ # 이 노드(브릿지) 식별자 — bridgeHub.bridgeId. roster/로그 구분용(클러스터 워커는 -w{id} suffix 자동).
89
+ BRIDGE_ID=crud-1
36
90
 
37
- # OpenTelemetry 트레이싱 (선택, ADR-104/126/163) — /demo/tracing 데모가 요청별 trace_id 를 만들고 Zipkin 으로
38
- # 잇는다. 미설정/false 트레이싱 OFF(데모는 비활성 안내를 보여줌). docker 의 otel-collector(:4318 OTLP HTTP)·
39
- # zipkin(:9411) 가동 시 true 켠다. exporter otlp → collector → zipkin 경로로 span 이 전달된다.
91
+
92
+ # ── OpenTelemetry 분산 트레이싱 (선택, ADR-104/114/126/163) ───────────────────
93
+ # MegaTracing.fromEnv() 부팅 읽는다(boot.js). ENABLED!=='true' 0 비용 no-op.
94
+ # /demo/tracing 데모가 요청별 trace_id 를 만들고 Zipkin 딥링크로 잇는다. docker 의
95
+ # otel-collector(:4318 OTLP HTTP)·zipkin(:9411) 가동 시 true 로 켠다(collector 부재 시 export 실패 로그).
40
96
  MEGA_OTEL_ENABLED=false
41
97
  MEGA_OTEL_SERVICE_NAME=sample-crud
42
98
  MEGA_OTEL_ENDPOINT=http://localhost:4318/v1/traces
43
- MEGA_OTEL_EXPORTER=otlp
44
- MEGA_OTEL_SAMPLING_RATIO=1.0
45
- # Zipkin UI API base — /demo/tracing 이 trace 딥링크 base(.../api/v2 떼 UI 루트)로 쓴다.
99
+ MEGA_OTEL_EXPORTER=otlp # otlp | zipkin | console | inmemory
100
+ MEGA_OTEL_SAMPLING_RATIO=1.0 # 0.0~1.0 또는 always_on | always_off
101
+ # Zipkin UI API base — /demo/tracing 딥링크 base( 코드가 읽음).
46
102
  MEGA_OTEL_ZIPKIN_API=http://localhost:9411/api/v2
103
+ # resource 속성(선택) — 미설정 시 생략.
104
+ # MEGA_OTEL_VERSION=1.0.0
105
+ # MEGA_OTEL_ENVIRONMENT=local
106
+
107
+
108
+ # ── Prometheus 메트릭 (선택, ADR-072/131) ────────────────────────────────────
109
+ # crud 는 mega.config.js 의 health.exposeMetrics:true 로 /metrics 를 켠다(config 주도 — env 아님).
110
+ # 아래 env 는 MegaMetrics.fromEnv() 를 직접 호출하는 커스텀 부팅에서만 효과(기본 boot 는 config 사용).
111
+ # METRICS_ENABLED=true # 또는 MEGA_METRICS_ENABLED
112
+ # MEGA_METRICS_SERVICE_NAME=sample-crud
113
+ # MEGA_METRICS_ENVIRONMENT=local
114
+
115
+
116
+ # ── 로깅 (mega.config.js > logger, ADR-023/141) ──────────────────────────────
117
+ # pino 레벨 — logger.level. fatal | error | warn | info | debug | trace.
118
+ LOG_LEVEL=info
119
+ # (참고) 파일/텔레그램 sink 등은 .env 가 아니라 mega.config.js 의 logger.sinks 배열로 설정한다.
47
120
 
48
- # 업로드 저장 디렉터리 (선택, ADR-163) — /demo/upload 이 파일을 저장할 위치. 상대경로는 프로젝트 루트
49
- # (cwd) 기준, 절대경로면 그대로. 미설정 시 var/uploads(.gitignore). 다운로드도 같은 위치에서 소스로 읽는다.
121
+
122
+ # ── 데모 (앱 코드가 읽음) ─────────────────────────────────────────────────────
123
+ # /demo/upload 저장 디렉터리. 상대경로=프로젝트 루트(cwd) 기준. 미설정 시 var/uploads.
50
124
  DEMO_UPLOAD_DIR=var/uploads
125
+
126
+
127
+ # =============================================================================
128
+ # Docker 인프라 (docker-compose.yml 이 읽음, ADR-103) — 전부 선택/주석
129
+ # =============================================================================
130
+ # 위 연결 문자열(DATABASE_URL 등)은 아래 도커 기본값과 정합한다. docker-compose.yml 에 인라인
131
+ # 디폴트가 있어 미설정이어도 컨테이너가 뜨지만, 포트/비번을 바꾸려면 아래를 켜고 위 URL 도 함께 맞춘다.
132
+ # 네이밍: MEGA_<SERVICE>_<FIELD>.
133
+ # MEGA_PG_PORT=5432
134
+ # MEGA_PG_USER=mega
135
+ # MEGA_PG_PASSWORD=change-me
136
+ # MEGA_PG_DB=mega_test
137
+ # MEGA_MONGO_PORT=27017
138
+ # MEGA_MONGO_USER=mega
139
+ # MEGA_MONGO_PASSWORD=change-me
140
+ # MEGA_MONGO_DB=mega_test
141
+ # MEGA_REDIS_PORT=6379
142
+ # MEGA_REDIS_PASSWORD=change-me
143
+ # MEGA_NATS_PORT=4222
144
+ # MEGA_NATS_MONITOR_PORT=8222
145
+ # MEGA_MARIA_PORT=3306
146
+ # MEGA_MARIA_ROOT_PASSWORD=change-me
147
+ # MEGA_MARIA_USER=mega
148
+ # MEGA_MARIA_PASSWORD=change-me
149
+ # MEGA_MARIA_DB=mega_test
150
+ # 컨테이너 restart 정책: 개발=unless-stopped / CI 일회성=no.
151
+ # MEGA_INFRA_RESTART=unless-stopped
152
+
153
+
154
+ # =============================================================================
155
+ # 어댑터 옵션 자동매핑 (ADR-109, 12-factor) — 전부 선택/주석
156
+ # =============================================================================
157
+ # services.<domain>.<key> 에 `envPrefix: 'PG'` 처럼 지정하면 MegaAdapterManager 가
158
+ # MEGA_<PREFIX>_<KEY> 를 읽어 어댑터 옵션에 병합(env 우선). url 직접 지정 대신 12-factor 분리용.
159
+ # (crud 는 url 직접 방식이라 미사용 — 아래는 문법 참고.)
160
+ # 문법: MEGA_<PREFIX>_<KEY>
161
+ # URL → url
162
+ # HOST / PORT / USER / PASSWORD → 연결필드 (PORT 만 정수, 나머지 문자열)
163
+ # DATABASE | DB → database / DBNAME → dbName(Mongo)
164
+ # POOL_<X> → pool.{camelCase(X)} (드라이버 공통, 값 자동 타입변환)
165
+ # OPTIONS_<X> → options.{드라이버 표기} (postgres/sqlite=snake, 그 외=camel; MS 대문자 보존)
166
+ # 공통 풀 인터페이스(min/max/idleTimeoutMs/acquireTimeoutMs/maxLifetimeMs) 예:
167
+ # MEGA_PG_POOL_MIN=0
168
+ # MEGA_PG_POOL_MAX=10
169
+ # MEGA_PG_POOL_IDLE_TIMEOUT_MS=10000
170
+ # 드라이버 특화 옵션 예:
171
+ # MEGA_PG_OPTIONS_SSL=true # → options.ssl
172
+ # MEGA_PG_OPTIONS_STATEMENT_TIMEOUT=30000 # → options.statement_timeout (pg=snake)
173
+ # MEGA_MONGO_OPTIONS_AUTH_SOURCE=admin # → options.authSource (mongo=camel)
174
+ # MEGA_MONGO_OPTIONS_SERVER_SELECTION_TIMEOUT_MS=5000 # → options.serverSelectionTimeoutMS
175
+ # MEGA_MARIA_OPTIONS_BIG_INT_STRATEGY=number # number(기본,2^53 초과 손실) | bigint | string
@@ -15,6 +15,13 @@ export default {
15
15
  port: Number(process.env.PORT ?? 3000),
16
16
  // 세션 쿠키 HMAC 서명 시크릿(global 스코프, ADR-129). boot 이 앱에 주입한다. .env 의 SESSION_SECRET.
17
17
  sessionSecret: process.env.SESSION_SECRET,
18
+ // (예시·미사용) listen 호스트 — 기본 '0.0.0.0'. `mega start --host H`(CLI)가 우선.
19
+ // host: '0.0.0.0',
20
+ // (예시·미사용) cluster 워커 수 — CLI `--cluster` > .env MEGA_CLUSTER_WORKERS > 이 값(ADR-154). 정수 N | 'max'.
21
+ // cluster: 'max',
22
+ // (예시·미사용) 메트릭/트레이싱 resource 의 service.name·version(health.serviceName 미지정 시 폴백).
23
+ // serviceName: 'sample-crud',
24
+ // version: '0.1.0',
18
25
  },
19
26
 
20
27
  // ASP(Application-layer Secure Protocol) masterSecret — global 스코프 시크릿(ADR-127, scope-registry).
@@ -24,6 +31,8 @@ export default {
24
31
  // 이 값을 브라우저에 주입한다 — 그래서 운영 secret 과 분리된 데모 전용 값을 .env 의 ASP_MASTER_SECRET 에 둔다.
25
32
  asp: {
26
33
  masterSecret: process.env.ASP_MASTER_SECRET,
34
+ // (예시·미사용) HTTP body/query 암호화 옵션(enabledPaths·driftMs·nonceCache 등)은 **앱 스코프** —
35
+ // apps/<app>/app.config.js 의 asp.http 에 둔다. 여기 global 블록엔 masterSecret 만(scope-registry).
27
36
  },
28
37
 
29
38
  // 전역 어댑터(ADR-102/106/109) — globalKey 로 선언, 앱은 app.config.js 의 별명으로 참조.
@@ -33,6 +42,11 @@ export default {
33
42
  primary: {
34
43
  driver: 'postgres',
35
44
  url: process.env.DATABASE_URL,
45
+ // (예시·미사용) url 대신 discrete 도 가능: { host, port, user, password, database } (url 과 상호배타).
46
+ // (예시·미사용) 공통 풀 인터페이스 — 드라이버별 키로 자동 매핑(ADR-109). 단위 *Ms=밀리초.
47
+ // pool: { min: 0, max: 10, idleTimeoutMs: 10_000 },
48
+ // (예시·미사용) 드라이버 네이티브 옵션 passthrough(pg=snake_case).
49
+ // options: { ssl: false, statement_timeout: 30_000 },
36
50
  },
37
51
  // DB 'mongo' — Document DB 어댑터(ADR-108). notes 데모 컬렉션(Note 모델 static adapter='mongo')의 공유
38
52
  // 인스턴스. url path 의 dbName(mega_test)을 어댑터가 추출한다. .env 의 MONGO_URL(authSource=admin).
@@ -40,6 +54,12 @@ export default {
40
54
  driver: 'mongodb',
41
55
  url: process.env.MONGO_URL,
42
56
  },
57
+ // (예시·미사용) MariaDB 어댑터(ADR-105). 쓰려면 주석 해제 + .env 의 MARIA_URL 설정.
58
+ // 모델은 static adapter='maria'(globalKey)로 닿고, app.config.js databases 에 별명 추가.
59
+ // maria: {
60
+ // driver: 'mariadb',
61
+ // url: process.env.MARIA_URL,
62
+ // },
43
63
  },
44
64
  caches: {
45
65
  // redis 캐시 'rate' — brute-force(ctx.bruteForce, ADR-049/130)의 원자적 INCR 백엔드. .env 의 REDIS_RATE_URL(db 2).
@@ -60,6 +80,12 @@ export default {
60
80
  driver: 'redis',
61
81
  url: process.env.REDIS_LOCK_URL,
62
82
  },
83
+ // (예시·미사용) 범용 캐시 — 일반 키/값 캐싱이 필요하면 주석 해제 + .env 의 REDIS_CACHE_URL 설정.
84
+ // 기존 캐시(rate/demo/lock)와 키 충돌을 피해 별도 논리 DB(/4 등)를 권장. app.config.js caches 에 별명 추가.
85
+ // cache: {
86
+ // driver: 'redis',
87
+ // url: process.env.REDIS_CACHE_URL,
88
+ // },
63
89
  },
64
90
  // NATS 버스 'jobs' — 잡 큐(EmailJob, ADR-119)의 JetStream 백엔드. producer(웹)는 ctx.bus('jobs').native(nc)로
65
91
  // enqueue, consumer(`mega worker`)는 같은 버스로 소비한다. .env 의 NATS_JOBS_URL.
@@ -68,6 +94,11 @@ export default {
68
94
  driver: 'nats',
69
95
  url: process.env.NATS_JOBS_URL,
70
96
  },
97
+ // (예시·미사용) 이벤트 버스 — pub/sub 등 두 번째 NATS 버스가 필요하면 주석 해제 + .env 의 NATS_EVENTS_URL.
98
+ // events: {
99
+ // driver: 'nats',
100
+ // url: process.env.NATS_EVENTS_URL,
101
+ // },
71
102
  },
72
103
  // 분산 락 'main' — redlock(ADR-113). caches.lock(Redis) 을 빌려 단일 노드 redlock 을 구성한다. /demo/cron
73
104
  // 스케줄(CronCounterSchedule.static lock)의 클러스터 중복방지(leader election)에 쓰인다.
@@ -79,6 +110,17 @@ export default {
79
110
  },
80
111
  },
81
112
 
113
+ // (예시·미사용) Embedded WS Hub(ADR-137) — `mega ws-hub` 별도 프로세스 대신 같은 프로세스에 허브를 띄움
114
+ // (single-node). 켜면 app.config.js bridgeHub.url 을 이 host:port 로 맞춘다. acceptedTokens 필수(빈 값=throw).
115
+ // wsHub: {
116
+ // enabled: true,
117
+ // port: 3100,
118
+ // host: '127.0.0.1',
119
+ // acceptedTokens: (process.env.MEGA_WSHUB_TOKENS ?? '').split(',').filter(Boolean),
120
+ // heartbeatMs: 25_000,
121
+ // // compression: { enabled: false },
122
+ // },
123
+
82
124
  // ── 클러스터 전송 선택(ADR-176, 앱당 하나·상호배타) ───────────────────────────────────────────
83
125
  // 이 샘플은 현재 **WS Hub**(app.config 의 bridgeHub → `mega ws-hub` 서버, localhost:3100)로 채팅을
84
126
  // 클러스터 전파한다. boot 가 bridgeHub 를 보고 app.connectHub 를 자동 호출한다(개발자 배선 불요).
@@ -101,11 +143,20 @@ export default {
101
143
  // CPU 워커 풀(ADR-124) — `mega start`(boot)가 ctx.workers['hash'] 로 배선한다(config.workers).
102
144
  workers: [HashWorker],
103
145
 
146
+ // (예시·미사용) 플러그인 — 명시 등록만(auto-discovery 없음, ADR-079). 문자열 또는 { name, options }.
147
+ // plugins: [{ name: 'my-plugin', options: {} }],
148
+
104
149
  // pino 로깅(ADR-023/141) — console sink, dev pretty. redact 로 민감필드를 sink 출력 전 메인스레드에서
105
150
  // 마스킹한다(token/password/secret/authorization). /demo/logs 데모가 이 마스킹을 시연한다(ADR-163).
106
151
  logger: {
107
- level: 'debug',
108
- sinks: [{ type: 'console', pretty: true }],
152
+ level: process.env.LOG_LEVEL ?? 'info',
153
+ // sinks 출력처 배열. console(dev pretty) 외에 file(pino-roll)·telegram sink 지원.
154
+ sinks: [
155
+ { type: 'console', pretty: true },
156
+ // (예시·미사용) 파일 sink — 날짜 로테이션 + keep N.
157
+ // { type: 'file', path: './logs/app.log', rotation: 'daily', keep: 14 },
158
+ // (예시·미사용) telegram sink — warn 이상 알림. botToken/chatId 는 .env 등 시크릿으로 주입(코드·git 직접 X).
159
+ ],
109
160
  redact: ['*.password', '*.token', '*.secret', '*.authorization', 'password', 'token', 'secret'],
110
161
  },
111
162
 
@@ -114,5 +165,13 @@ export default {
114
165
  exposeMetrics: true,
115
166
  metricsPath: '/metrics',
116
167
  metricsAllowList: ['127.0.0.1', '::1'],
168
+ // (예시·미사용) liveness/readiness 경로 — 기본 '/health' · '/health/ready'.
169
+ // paths: { live: '/health', ready: '/health/ready' },
170
+ // (예시·미사용) 메트릭 resource service.name — 미지정 시 server.serviceName → MEGA_OTEL_SERVICE_NAME 폴백.
171
+ // serviceName: 'sample-crud',
117
172
  },
173
+
174
+ // OpenTelemetry 분산 트레이싱 — **config 블록이 아니라 .env 의 MEGA_OTEL_\*** 로 설정한다
175
+ // (MegaTracing.fromEnv, boot.js). MEGA_OTEL_ENABLED='true' + MEGA_OTEL_SERVICE_NAME 필수.
176
+ // (`tracing` 키는 스키마엔 있으나 현재 부팅이 소비하지 않음 — 죽은 설정 회피 위해 블록을 두지 않음.)
118
177
  }
@@ -7,7 +7,7 @@
7
7
  "node": ">=20"
8
8
  },
9
9
  "scripts": {
10
- "dev": "NODE_ENV=development mega start",
10
+ "dev": "mega start --watch",
11
11
  "start": "NODE_ENV=production mega start",
12
12
  "migrate": "mega migrate",
13
13
  "migrate:down": "mega migrate:down",
@@ -25,4 +25,4 @@
25
25
  "concurrently": "^9.0.0",
26
26
  "vitest": "^4.0.0"
27
27
  }
28
- }
28
+ }
@@ -1234,7 +1234,7 @@ marked@^18.0.5:
1234
1234
  integrity sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==
1235
1235
 
1236
1236
  "mega-framework@file:../..":
1237
- version "0.1.3"
1237
+ version "0.1.5"
1238
1238
  dependencies:
1239
1239
  "@fastify/cookie" "^11.0.2"
1240
1240
  "@fastify/cors" "^11.2.0"