create-entity-app-server 0.1.16 → 0.2.0

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 (48) hide show
  1. package/dist-create/template/.gateway-version +1 -1
  2. package/dist-create/template/app/plugins/ocr/cache.ts +1 -1
  3. package/dist-create/template/app/plugins/ocr/config.ts +1 -1
  4. package/dist-create/template/app/plugins/ocr/direction.ts +1 -1
  5. package/dist-create/template/app/plugins/ocr/dispatch.ts +1 -1
  6. package/dist-create/template/app/plugins/ocr/entity-adapter.ts +1 -1
  7. package/dist-create/template/app/plugins/ocr/errors.ts +1 -1
  8. package/dist-create/template/app/plugins/ocr/handlers.ts +1 -1
  9. package/dist-create/template/app/plugins/ocr/index.ts +1 -1
  10. package/dist-create/template/app/plugins/ocr/llm-parser.ts +1 -1
  11. package/dist-create/template/app/plugins/ocr/parsing-pipeline.ts +1 -1
  12. package/dist-create/template/app/plugins/ocr/pdf-converter.ts +1 -1
  13. package/dist-create/template/app/plugins/ocr/preprocessor.ts +1 -1
  14. package/dist-create/template/app/plugins/ocr/providers/aws.ts +1 -1
  15. package/dist-create/template/app/plugins/ocr/providers/azure.ts +1 -1
  16. package/dist-create/template/app/plugins/ocr/providers/google.ts +1 -1
  17. package/dist-create/template/app/plugins/ocr/providers/index.ts +1 -1
  18. package/dist-create/template/app/plugins/ocr/providers/naver.ts +1 -1
  19. package/dist-create/template/app/plugins/ocr/providers/tesseract.ts +1 -1
  20. package/dist-create/template/app/plugins/ocr/providers/upstage.ts +1 -1
  21. package/dist-create/template/app/plugins/ocr/quota.ts +1 -1
  22. package/dist-create/template/app/plugins/ocr/refiner.ts +1 -1
  23. package/dist-create/template/app/plugins/ocr/routes.ts +1 -1
  24. package/dist-create/template/app/plugins/ocr/service.ts +1 -1
  25. package/dist-create/template/app/plugins/ocr/template-loader.ts +1 -1
  26. package/dist-create/template/app/plugins/ocr/template-matcher.ts +1 -1
  27. package/dist-create/template/app/plugins/ocr/types/config.ts +1 -1
  28. package/dist-create/template/app/plugins/ocr/types/driver.ts +1 -1
  29. package/dist-create/template/app/plugins/ocr/types/index.ts +1 -1
  30. package/dist-create/template/app/plugins/ocr/types/parsed.ts +1 -1
  31. package/dist-create/template/app/plugins/ocr/types/store.ts +1 -1
  32. package/dist-create/template/app/plugins/ocr/types/template.ts +1 -1
  33. package/dist-create/template/app/plugins/ocr/utils.ts +1 -1
  34. package/dist-create/template/app/plugins/smtp/config.ts +41 -1
  35. package/dist-create/template/app/plugins/smtp/handlers.ts +52 -1
  36. package/dist-create/template/app/plugins/smtp/index.ts +33 -1
  37. package/dist-create/template/app/plugins/smtp/routes.ts +19 -1
  38. package/dist-create/template/app/plugins/smtp/types/config.ts +8 -1
  39. package/dist-create/template/app/plugins/smtp/types/index.ts +1 -1
  40. package/dist-create/template/docs/configs.md +7 -7
  41. package/dist-create/template/docs/scripts-guide.md +49 -19
  42. package/dist-create/template/scripts/run.sh +3 -0
  43. package/dist-create/template/scripts/service-install.sh +174 -0
  44. package/dist-create/template/scripts/service-remove.sh +102 -0
  45. package/dist-create/template/scripts/update-server.sh +25 -20
  46. package/dist-create/template/system-api.js +1 -1
  47. package/dist-create/template/system.js +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,174 @@
1
+ #!/bin/bash
2
+
3
+ set -euo pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
7
+ SERVER_CONFIG="$PROJECT_ROOT/configs/server.json"
8
+
9
+ if [ -f "$PROJECT_ROOT/.env" ]; then
10
+ LANGUAGE=$(grep '^LANGUAGE=' "$PROJECT_ROOT/.env" | cut -d '=' -f2)
11
+ fi
12
+ LANGUAGE=${LANGUAGE:-ko}
13
+
14
+ SERVICE_NAME="entity-app-server"
15
+ RUN_USER="${SUDO_USER:-$(stat -c '%U' "$PROJECT_ROOT")}"
16
+ RUN_GROUP="$(id -gn "$RUN_USER" 2>/dev/null || true)"
17
+ START_NOW=true
18
+ INTERACTIVE=false
19
+
20
+ load_service_name() {
21
+ local namespace=""
22
+ if [ -f "$SERVER_CONFIG" ]; then
23
+ namespace=$(sed -n 's/.*"namespace"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$SERVER_CONFIG" | head -n 1)
24
+ fi
25
+
26
+ namespace=$(echo "$namespace" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9_-]/-/g')
27
+
28
+ if [ -z "$namespace" ]; then
29
+ SERVICE_NAME="entity-app-server"
30
+ elif [[ "$namespace" == "entity-app-server" ]] || [[ "$namespace" == *"-entity-app-server" ]]; then
31
+ SERVICE_NAME="$namespace"
32
+ else
33
+ SERVICE_NAME="${namespace}-entity-app-server"
34
+ fi
35
+ }
36
+
37
+ load_service_name
38
+
39
+ if [ $# -eq 0 ]; then
40
+ INTERACTIVE=true
41
+ fi
42
+
43
+ for arg in "$@"; do
44
+ case "$arg" in
45
+ --user=*)
46
+ RUN_USER="${arg#*=}"
47
+ ;;
48
+ --group=*)
49
+ RUN_GROUP="${arg#*=}"
50
+ ;;
51
+ --no-start)
52
+ START_NOW=false
53
+ ;;
54
+ *)
55
+ if [ "$LANGUAGE" = "en" ]; then
56
+ echo "❌ Unknown option: $arg"
57
+ else
58
+ echo "❌ 알 수 없는 옵션: $arg"
59
+ fi
60
+ exit 1
61
+ ;;
62
+ esac
63
+ done
64
+
65
+ if [ "$INTERACTIVE" = true ]; then
66
+ if [ "$LANGUAGE" = "en" ]; then
67
+ echo "[interactive] systemd service setup"
68
+ echo "service name: $SERVICE_NAME"
69
+ read -r -p "Run user [$RUN_USER]: " input
70
+ else
71
+ echo "[interactive] systemd 서비스 설정"
72
+ echo "서비스명: $SERVICE_NAME"
73
+ read -r -p "실행 사용자 [$RUN_USER]: " input
74
+ fi
75
+
76
+ if [ -n "$input" ]; then
77
+ RUN_USER="$input"
78
+ fi
79
+
80
+ if [ -z "$RUN_GROUP" ]; then
81
+ RUN_GROUP="$(id -gn "$RUN_USER" 2>/dev/null || true)"
82
+ fi
83
+
84
+ if [ "$LANGUAGE" = "en" ]; then
85
+ read -r -p "Run group [$RUN_GROUP]: " input
86
+ else
87
+ read -r -p "실행 그룹 [$RUN_GROUP]: " input
88
+ fi
89
+
90
+ if [ -n "$input" ]; then
91
+ RUN_GROUP="$input"
92
+ fi
93
+
94
+ if [ "$LANGUAGE" = "en" ]; then
95
+ read -r -p "Start service now? [Y/n]: " input
96
+ else
97
+ read -r -p "서비스를 즉시 시작할까요? [Y/n]: " input
98
+ fi
99
+
100
+ input=$(echo "$input" | tr '[:upper:]' '[:lower:]')
101
+ if [ "$input" = "n" ] || [ "$input" = "no" ]; then
102
+ START_NOW=false
103
+ fi
104
+ fi
105
+
106
+ if [ -z "$RUN_GROUP" ]; then
107
+ RUN_GROUP="$(id -gn "$RUN_USER")"
108
+ fi
109
+
110
+ if ! id -u "$RUN_USER" >/dev/null 2>&1; then
111
+ echo "❌ 사용자를 찾을 수 없습니다: $RUN_USER"
112
+ exit 1
113
+ fi
114
+
115
+ if ! getent group "$RUN_GROUP" >/dev/null 2>&1; then
116
+ echo "❌ 그룹을 찾을 수 없습니다: $RUN_GROUP"
117
+ exit 1
118
+ fi
119
+
120
+ if [ ! -x "$PROJECT_ROOT/scripts/run.sh" ]; then
121
+ chmod +x "$PROJECT_ROOT/scripts/run.sh"
122
+ fi
123
+
124
+ if [ ! -f "$PROJECT_ROOT/system.js" ]; then
125
+ echo "❌ system.js 파일이 없습니다. create-entity-app-server 로 생성된 프로젝트 루트인지 확인하세요."
126
+ exit 1
127
+ fi
128
+
129
+ UNIT_PATH="/etc/systemd/system/${SERVICE_NAME}.service"
130
+
131
+ if [ "$EUID" -ne 0 ]; then
132
+ if command -v sudo >/dev/null 2>&1; then
133
+ SUDO_ARGS=("--user=$RUN_USER" "--group=$RUN_GROUP")
134
+ if [ "$START_NOW" = false ]; then
135
+ SUDO_ARGS+=("--no-start")
136
+ fi
137
+ exec sudo "$0" "${SUDO_ARGS[@]}"
138
+ fi
139
+ echo "❌ 이 스크립트는 root 권한이 필요합니다"
140
+ exit 1
141
+ fi
142
+
143
+ cat > "$UNIT_PATH" <<EOF
144
+ [Unit]
145
+ Description=Entity App Server
146
+ After=network.target
147
+
148
+ [Service]
149
+ Type=simple
150
+ User=$RUN_USER
151
+ Group=$RUN_GROUP
152
+ WorkingDirectory=$PROJECT_ROOT
153
+ EnvironmentFile=-$PROJECT_ROOT/.env
154
+ ExecStart=$PROJECT_ROOT/scripts/run.sh start
155
+ Restart=always
156
+ RestartSec=3
157
+ LimitNOFILE=65535
158
+
159
+ [Install]
160
+ WantedBy=multi-user.target
161
+ EOF
162
+
163
+ systemctl daemon-reload
164
+ systemctl enable "$SERVICE_NAME"
165
+
166
+ if [ "$START_NOW" = true ]; then
167
+ systemctl restart "$SERVICE_NAME"
168
+ fi
169
+
170
+ echo "✅ 서비스 등록 완료: $SERVICE_NAME"
171
+ echo " Unit: $UNIT_PATH"
172
+ echo " 시작: sudo systemctl start $SERVICE_NAME"
173
+ echo " 중지: sudo systemctl stop $SERVICE_NAME"
174
+ echo " 상태: sudo systemctl status $SERVICE_NAME"
@@ -0,0 +1,102 @@
1
+ #!/bin/bash
2
+
3
+ set -euo pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
7
+ SERVER_CONFIG="$PROJECT_ROOT/configs/server.json"
8
+
9
+ if [ -f "$PROJECT_ROOT/.env" ]; then
10
+ LANGUAGE=$(grep '^LANGUAGE=' "$PROJECT_ROOT/.env" | cut -d '=' -f2)
11
+ fi
12
+ LANGUAGE=${LANGUAGE:-ko}
13
+
14
+ SERVICE_NAME="entity-app-server"
15
+ INTERACTIVE=false
16
+ CONFIRMED=false
17
+
18
+ load_service_name() {
19
+ local namespace=""
20
+ if [ -f "$SERVER_CONFIG" ]; then
21
+ namespace=$(sed -n 's/.*"namespace"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$SERVER_CONFIG" | head -n 1)
22
+ fi
23
+
24
+ namespace=$(echo "$namespace" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9_-]/-/g')
25
+
26
+ if [ -z "$namespace" ]; then
27
+ SERVICE_NAME="entity-app-server"
28
+ elif [[ "$namespace" == "entity-app-server" ]] || [[ "$namespace" == *"-entity-app-server" ]]; then
29
+ SERVICE_NAME="$namespace"
30
+ else
31
+ SERVICE_NAME="${namespace}-entity-app-server"
32
+ fi
33
+ }
34
+
35
+ load_service_name
36
+
37
+ if [ $# -eq 0 ]; then
38
+ INTERACTIVE=true
39
+ fi
40
+
41
+ for arg in "$@"; do
42
+ case "$arg" in
43
+ --yes|-y)
44
+ CONFIRMED=true
45
+ ;;
46
+ *)
47
+ echo "❌ 알 수 없는 옵션: $arg"
48
+ exit 1
49
+ ;;
50
+ esac
51
+ done
52
+
53
+ if [ "$INTERACTIVE" = true ] && [ "$CONFIRMED" = false ]; then
54
+ echo "[interactive] systemd 서비스 제거"
55
+ echo "서비스명: $SERVICE_NAME"
56
+ read -r -p "'$SERVICE_NAME' 서비스를 제거할까요? [y/N]: " input
57
+ input=$(echo "$input" | tr '[:upper:]' '[:lower:]')
58
+ if [ "$input" != "y" ] && [ "$input" != "yes" ]; then
59
+ echo "취소되었습니다."
60
+ exit 0
61
+ fi
62
+ fi
63
+
64
+ UNIT_PATH="/etc/systemd/system/${SERVICE_NAME}.service"
65
+
66
+ if [ "$EUID" -ne 0 ]; then
67
+ if command -v sudo >/dev/null 2>&1; then
68
+ exec sudo "$0" --yes
69
+ fi
70
+ echo "❌ 이 스크립트는 root 권한이 필요합니다"
71
+ exit 1
72
+ fi
73
+
74
+ SERVICE_EXISTS=false
75
+ if systemctl list-unit-files | grep -q "^${SERVICE_NAME}\.service"; then
76
+ SERVICE_EXISTS=true
77
+ fi
78
+
79
+ if [ ! -f "$UNIT_PATH" ] && [ "$SERVICE_EXISTS" = false ]; then
80
+ echo "ℹ️ '$SERVICE_NAME' 서비스가 등록되어 있지 않습니다."
81
+ echo " 제거할 항목이 없습니다."
82
+ echo ""
83
+ echo " 서비스를 등록하려면:"
84
+ echo " sudo $(dirname "$0")/service-install.sh"
85
+ exit 0
86
+ fi
87
+
88
+ if [ "$SERVICE_EXISTS" = true ]; then
89
+ systemctl stop "$SERVICE_NAME" 2>/dev/null || true
90
+ systemctl disable "$SERVICE_NAME" 2>/dev/null || true
91
+ fi
92
+
93
+ if [ -f "$UNIT_PATH" ]; then
94
+ rm -f "$UNIT_PATH"
95
+ fi
96
+
97
+ systemctl daemon-reload
98
+
99
+ echo "✅ 서비스 제거 완료: $SERVICE_NAME"
100
+ echo ""
101
+ echo " 서비스를 다시 등록하려면:"
102
+ echo " sudo $(dirname "$0")/service-install.sh"
@@ -2,8 +2,7 @@
2
2
  # update-server.sh — Entity App Server 코어 업데이트
3
3
  #
4
4
  # 사용법:
5
- # ./scripts/update-server.sh # 도움말
6
- # ./scripts/update-server.sh version # 현재 코어 버전 + 최신 태그 확인
5
+ # ./scripts/update-server.sh # 도움말 + 현재/최신 버전 확인
7
6
  # ./scripts/update-server.sh latest # 최신 태그로 업데이트
8
7
  # ./scripts/update-server.sh 0.0.8 # 특정 버전으로 업데이트
9
8
  # ./scripts/update-server.sh v0.0.8
@@ -15,7 +14,7 @@ PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
15
14
  PACKAGE_NAME="create-entity-app-server"
16
15
  VERSION_FILE="$PROJECT_ROOT/.gateway-version"
17
16
  PID_FILE="$PROJECT_ROOT/.gateway.pid"
18
- MANAGED_SCRIPTS=("run.sh" "entity.sh" "reset-all.sh" "update-server.sh")
17
+ MANAGED_SCRIPTS=("run.sh" "entity.sh" "reset-all.sh" "update-server.sh" "service-install.sh" "service-remove.sh")
19
18
  MANAGED_FILES=("system.js" "system-api.js" "tsconfig.json" ".env.example" ".gateway-version")
20
19
 
21
20
  cd "$PROJECT_ROOT"
@@ -113,6 +112,28 @@ latest_gateway_version() {
113
112
  echo "$latest"
114
113
  }
115
114
 
115
+ print_version_status() {
116
+ local current
117
+ local latest
118
+
119
+ echo "🔍 버전 확인 중..."
120
+ current="$(current_gateway_version)"
121
+ latest="$(latest_gateway_version)"
122
+
123
+ echo ""
124
+ echo " 현재 코어 버전: v${current}"
125
+ echo " 최신 패키지 버전: v${latest}"
126
+ echo ""
127
+
128
+ if [ "$current" = "$latest" ]; then
129
+ echo "✅ 최신 버전입니다."
130
+ elif is_semver "$current" && [ "$(compare_versions "$current" "$latest")" = "1" ]; then
131
+ echo "ℹ️ 현재 코어가 npm 최신 버전보다 더 새롭습니다."
132
+ else
133
+ echo "💡 업데이트 가능: ./scripts/update-server.sh latest"
134
+ fi
135
+ }
136
+
116
137
  package_tarball_url() {
117
138
  local version="$1"
118
139
  local tarball
@@ -370,29 +391,13 @@ case "$ARG" in
370
391
  echo "update-server.sh — Entity App Server 코어 업데이트"
371
392
  echo ""
372
393
  echo "사용법:"
373
- echo " ./scripts/update-server.sh version"
374
394
  echo " ./scripts/update-server.sh latest"
375
395
  echo " ./scripts/update-server.sh <버전>"
376
396
  echo ""
377
397
  echo "업데이트 대상: system.js / system-api.js / scripts / docs / tsconfig.json / .env.example / package.json(deps)"
378
398
  echo "보존 대상: app/ / configs/ / .env / package.json의 name/version/private"
379
- ;;
380
-
381
- "version")
382
- echo "🔍 버전 확인 중..."
383
- CURRENT="$(current_gateway_version)"
384
- LATEST="$(latest_gateway_version)"
385
399
  echo ""
386
- echo " 현재 코어 버전: v${CURRENT}"
387
- echo " 최신 패키지 버전: v${LATEST}"
388
- echo ""
389
- if [ "$CURRENT" = "$LATEST" ]; then
390
- echo "✅ 최신 버전입니다."
391
- elif is_semver "$CURRENT" && [ "$(compare_versions "$CURRENT" "$LATEST")" = "1" ]; then
392
- echo "ℹ️ 현재 코어가 npm 최신 버전보다 더 새롭습니다."
393
- else
394
- echo "💡 업데이트 가능: ./scripts/update-server.sh latest"
395
- fi
400
+ print_version_status
396
401
  ;;
397
402
 
398
403
  "latest")