create-entity-server 0.0.9

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 (63) hide show
  1. package/bin/create.js +280 -0
  2. package/package.json +42 -0
  3. package/template/.env.example +14 -0
  4. package/template/configs/cache.json +22 -0
  5. package/template/configs/cors.json +7 -0
  6. package/template/configs/database.json +23 -0
  7. package/template/configs/jwt.json +7 -0
  8. package/template/configs/logging.json +45 -0
  9. package/template/configs/security.json +21 -0
  10. package/template/configs/server.json +10 -0
  11. package/template/entities/Account/account_audit.json +17 -0
  12. package/template/entities/Auth/account.json +60 -0
  13. package/template/entities/Auth/api_keys.json +26 -0
  14. package/template/entities/Auth/license.json +36 -0
  15. package/template/entities/Auth/rbac_roles.json +76 -0
  16. package/template/entities/README.md +380 -0
  17. package/template/entities/System/system_audit_log.json +65 -0
  18. package/template/entities/company.json +22 -0
  19. package/template/entities/product.json +36 -0
  20. package/template/entities/todo.json +16 -0
  21. package/template/samples/README.md +65 -0
  22. package/template/samples/flutter/lib/entity_server_client.dart +218 -0
  23. package/template/samples/flutter/pubspec.yaml +14 -0
  24. package/template/samples/java/EntityServerClient.java +304 -0
  25. package/template/samples/java/EntityServerExample.java +49 -0
  26. package/template/samples/kotlin/EntityServerClient.kt +194 -0
  27. package/template/samples/node/package.json +16 -0
  28. package/template/samples/node/src/EntityServerClient.js +246 -0
  29. package/template/samples/node/src/example.js +39 -0
  30. package/template/samples/php/ci4/Controllers/ProductController.php +141 -0
  31. package/template/samples/php/ci4/Libraries/EntityServer.php +260 -0
  32. package/template/samples/php/laravel/Http/Controllers/ProductController.php +62 -0
  33. package/template/samples/php/laravel/Services/EntityServerService.php +210 -0
  34. package/template/samples/python/entity_server.py +225 -0
  35. package/template/samples/python/example.py +50 -0
  36. package/template/samples/react/src/api/entityServerClient.ts +290 -0
  37. package/template/samples/react/src/example.tsx +127 -0
  38. package/template/samples/react/src/hooks/useEntity.ts +105 -0
  39. package/template/samples/swift/EntityServerClient.swift +221 -0
  40. package/template/scripts/api-key.ps1 +123 -0
  41. package/template/scripts/api-key.sh +130 -0
  42. package/template/scripts/cleanup-history.ps1 +69 -0
  43. package/template/scripts/cleanup-history.sh +54 -0
  44. package/template/scripts/cli.ps1 +24 -0
  45. package/template/scripts/cli.sh +27 -0
  46. package/template/scripts/entity.ps1 +70 -0
  47. package/template/scripts/entity.sh +72 -0
  48. package/template/scripts/generate-env-keys.ps1 +125 -0
  49. package/template/scripts/generate-env-keys.sh +148 -0
  50. package/template/scripts/install-systemd.sh +222 -0
  51. package/template/scripts/normalize-entities.ps1 +87 -0
  52. package/template/scripts/normalize-entities.sh +132 -0
  53. package/template/scripts/rbac-role.ps1 +124 -0
  54. package/template/scripts/rbac-role.sh +127 -0
  55. package/template/scripts/remove-systemd.sh +158 -0
  56. package/template/scripts/reset-all.ps1 +83 -0
  57. package/template/scripts/reset-all.sh +95 -0
  58. package/template/scripts/run.ps1 +239 -0
  59. package/template/scripts/run.sh +315 -0
  60. package/template/scripts/sync.ps1 +145 -0
  61. package/template/scripts/sync.sh +178 -0
  62. package/template/scripts/update-server.ps1 +117 -0
  63. package/template/scripts/update-server.sh +165 -0
@@ -0,0 +1,239 @@
1
+ # Entity Server - Run Script (Windows PowerShell)
2
+ param(
3
+ [Parameter(Position=0)]
4
+ [string]$Mode = ""
5
+ )
6
+
7
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
8
+ $ProjectRoot = Split-Path -Parent $ScriptDir
9
+
10
+ Set-Location $ProjectRoot
11
+
12
+ $ServerConfig = Join-Path $ProjectRoot "configs\server.json"
13
+ $DatabaseConfig = Join-Path $ProjectRoot "configs\database.json"
14
+ $RunDir = Join-Path $ProjectRoot ".run"
15
+ $PidFile = Join-Path $RunDir "entity-server.pid"
16
+ $StdoutLog = Join-Path $ProjectRoot "logs\server.out.log"
17
+
18
+ if (-not (Test-Path $RunDir)) { New-Item -ItemType Directory -Path $RunDir | Out-Null }
19
+ if (-not (Test-Path (Join-Path $ProjectRoot "logs"))) { New-Item -ItemType Directory -Path (Join-Path $ProjectRoot "logs") | Out-Null }
20
+
21
+ # Load language from .env
22
+ $Language = "ko"
23
+ $EnvFile = Join-Path $ProjectRoot ".env"
24
+ if (Test-Path $EnvFile) {
25
+ $LangLine = Get-Content $EnvFile | Where-Object { $_ -match '^LANGUAGE=' } | Select-Object -First 1
26
+ if ($LangLine) { $Language = $LangLine -replace '^LANGUAGE=', '' }
27
+ }
28
+
29
+ function Is-Running {
30
+ if (-not (Test-Path $PidFile)) { return $false }
31
+ $pid = (Get-Content $PidFile -ErrorAction SilentlyContinue).Trim()
32
+ if (-not $pid) { return $false }
33
+ try {
34
+ $proc = Get-Process -Id ([int]$pid) -ErrorAction Stop
35
+ return $true
36
+ } catch { return $false }
37
+ }
38
+
39
+ function Stop-Server {
40
+ if (-not (Test-Path $PidFile)) {
41
+ if ($Language -eq "en") { Write-Host "i Server is not running (pid file not found)." }
42
+ else { Write-Host "i 서버가 실행 중이 아닙니다 (pid 파일 없음)." }
43
+ return
44
+ }
45
+ $pid = (Get-Content $PidFile -ErrorAction SilentlyContinue).Trim()
46
+ if (-not $pid) {
47
+ Remove-Item $PidFile -Force
48
+ if ($Language -eq "en") { Write-Host "i Empty pid file removed." }
49
+ else { Write-Host "i 비어있는 pid 파일을 정리했습니다." }
50
+ return
51
+ }
52
+ try {
53
+ $proc = Get-Process -Id ([int]$pid) -ErrorAction Stop
54
+ $procInfo = "$($proc.Id) $($proc.UserName) $($proc.StartTime) $($proc.ProcessName)"
55
+ if ($Language -eq "en") {
56
+ Write-Host "Running process:"
57
+ Write-Host " PID ELAPSED COMMAND"
58
+ Write-Host " $procInfo"
59
+ Write-Host ""
60
+ $input = Read-Host "Stop this process? [y/N]"
61
+ } else {
62
+ Write-Host "실행 중인 프로세스:"
63
+ Write-Host " PID 실행시간 COMMAND"
64
+ Write-Host " $procInfo"
65
+ Write-Host ""
66
+ $input = Read-Host "이 프로세스를 중지할까요? [y/N]"
67
+ }
68
+ if ($input -notmatch '^[Yy](es)?$') {
69
+ if ($Language -eq "en") { Write-Host "Canceled." }
70
+ else { Write-Host "취소되었습니다." }
71
+ return
72
+ }
73
+ Stop-Process -Id ([int]$pid) -Force
74
+ Remove-Item $PidFile -Force
75
+ if ($Language -eq "en") { Write-Host "OK Server stopped (pid: $pid)" }
76
+ else { Write-Host "OK 서버가 중지되었습니다 (pid: $pid)" }
77
+ } catch {
78
+ Remove-Item $PidFile -Force -ErrorAction SilentlyContinue
79
+ if ($Language -eq "en") { Write-Host "i Stale pid file removed (process not found)." }
80
+ else { Write-Host "i 실행 중인 프로세스가 없어 stale pid 파일을 정리했습니다." }
81
+ }
82
+ }
83
+
84
+ function Show-Status {
85
+ $ServerBin = Join-Path $ProjectRoot "bin\entity-server.exe"
86
+ if (Is-Running) {
87
+ & $ServerBin banner-status RUNNING
88
+ if ($Language -eq "en") { Write-Host "Stop: .\run.ps1 stop" }
89
+ else { Write-Host "중지: .\run.ps1 stop" }
90
+ } else {
91
+ & $ServerBin banner-status STOPPED
92
+ if ($Language -eq "en") { Write-Host "Start: .\run.ps1 start" }
93
+ else { Write-Host "시작: .\run.ps1 start" }
94
+ }
95
+ }
96
+
97
+ if (-not $Mode) {
98
+ if ($Language -eq "en") {
99
+ Write-Host "Entity Server - Run Script"
100
+ Write-Host "=========================="
101
+ Write-Host ""
102
+ Write-Host "Force configs/server.json environment and configs/database.json default group, then start compiled server binary."
103
+ Write-Host ""
104
+ Write-Host "Usage: .\run.ps1 <mode>"
105
+ Write-Host ""
106
+ Write-Host "Modes:"
107
+ Write-Host " dev environment=development, database.default=development, then run binary"
108
+ Write-Host " start environment=production, database.default=production, then run in background"
109
+ Write-Host " stop stop background server started by this script"
110
+ Write-Host " status show server status"
111
+ Write-Host ""
112
+ Write-Host "Examples:"
113
+ Write-Host " .\run.ps1 dev"
114
+ Write-Host " .\run.ps1 start"
115
+ Write-Host " .\run.ps1 stop"
116
+ Write-Host " .\run.ps1 status"
117
+ } else {
118
+ Write-Host "Entity Server - 실행 스크립트"
119
+ Write-Host "==========================="
120
+ Write-Host ""
121
+ Write-Host "configs/server.json의 environment와 configs/database.json의 default를 강제 설정하고 바이너리를 실행합니다."
122
+ Write-Host ""
123
+ Write-Host "사용법: .\run.ps1 <모드>"
124
+ Write-Host ""
125
+ Write-Host "모드:"
126
+ Write-Host " dev environment=development, database.default=development 강제 후 바이너리 실행"
127
+ Write-Host " start environment=production, database.default=production 강제 후 백그라운드 실행"
128
+ Write-Host " stop run.ps1로 백그라운드 실행한 서버 중지"
129
+ Write-Host " status 서버 상태 조회"
130
+ Write-Host ""
131
+ Write-Host "예제:"
132
+ Write-Host " .\run.ps1 dev"
133
+ Write-Host " .\run.ps1 start"
134
+ Write-Host " .\run.ps1 stop"
135
+ Write-Host " .\run.ps1 status"
136
+ }
137
+ exit 0
138
+ }
139
+
140
+ if (-not (Test-Path $ServerConfig)) {
141
+ if ($Language -eq "en") { Write-Host "X configs/server.json not found" }
142
+ else { Write-Host "X configs/server.json 파일이 없습니다" }
143
+ exit 1
144
+ }
145
+ if (-not (Test-Path $DatabaseConfig)) {
146
+ if ($Language -eq "en") { Write-Host "X configs/database.json not found" }
147
+ else { Write-Host "X configs/database.json 파일이 없습니다" }
148
+ exit 1
149
+ }
150
+ $ServerBin = Join-Path $ProjectRoot "bin\entity-server.exe"
151
+ if (-not (Test-Path $ServerBin)) {
152
+ if ($Language -eq "en") { Write-Host "X bin/entity-server.exe not found" }
153
+ else { Write-Host "X bin/entity-server.exe 파일이 없습니다" }
154
+ exit 1
155
+ }
156
+
157
+ function Update-JsonField {
158
+ param([string]$File, [string]$Key, [string]$Value)
159
+ $content = Get-Content $File -Raw
160
+ $content = $content -replace "(`"$Key`"\s*:\s*`")[^`"]+(`")", "`${1}$Value`${2}"
161
+ Set-Content $File $content -NoNewline
162
+ }
163
+
164
+ switch ($Mode) {
165
+ { $_ -in @("dev", "development") } {
166
+ if (Is-Running) {
167
+ $pid = (Get-Content $PidFile).Trim()
168
+ if ($Language -eq "en") { Write-Host "X Server already running (pid: $pid). Stop first: .\run.ps1 stop" }
169
+ else { Write-Host "X 이미 서버가 실행 중입니다 (pid: $pid). 먼저 중지하세요: .\run.ps1 stop" }
170
+ exit 1
171
+ }
172
+ $dbContent = Get-Content $DatabaseConfig -Raw
173
+ if ($dbContent -notmatch '"development"\s*:') {
174
+ if ($Language -eq "en") { Write-Host "X database group 'development' not found in configs/database.json" }
175
+ else { Write-Host "X configs/database.json에 'development' 그룹이 없습니다" }
176
+ exit 1
177
+ }
178
+ Update-JsonField $ServerConfig "environment" "development"
179
+ Update-JsonField $DatabaseConfig "default" "development"
180
+ & $ServerBin
181
+ }
182
+
183
+ "start" {
184
+ if (Is-Running) {
185
+ $pid = (Get-Content $PidFile).Trim()
186
+ if ($Language -eq "en") { Write-Host "X Server already running (pid: $pid). Stop first: .\run.ps1 stop" }
187
+ else { Write-Host "X 이미 서버가 실행 중입니다 (pid: $pid). 먼저 중지하세요: .\run.ps1 stop" }
188
+ exit 1
189
+ }
190
+ $dbContent = Get-Content $DatabaseConfig -Raw
191
+ if ($dbContent -notmatch '"production"\s*:') {
192
+ if ($Language -eq "en") { Write-Host "X database group 'production' not found in configs/database.json" }
193
+ else { Write-Host "X configs/database.json에 'production' 그룹이 없습니다" }
194
+ exit 1
195
+ }
196
+ Update-JsonField $ServerConfig "environment" "production"
197
+ Update-JsonField $DatabaseConfig "default" "production"
198
+ & $ServerBin banner
199
+ $proc = Start-Process -FilePath $ServerBin -RedirectStandardOutput $StdoutLog -RedirectStandardError $StdoutLog -WindowStyle Hidden -PassThru
200
+ $proc.Id | Set-Content $PidFile
201
+ Start-Sleep -Milliseconds 300
202
+ try {
203
+ $check = Get-Process -Id $proc.Id -ErrorAction Stop
204
+ if ($Language -eq "en") {
205
+ Write-Host "OK Entity Server started in background (pid: $($proc.Id))"
206
+ Write-Host "Status: .\run.ps1 status"
207
+ } else {
208
+ Write-Host "OK Entity Server가 백그라운드에서 시작되었습니다 (pid: $($proc.Id))"
209
+ Write-Host "상태: .\run.ps1 status"
210
+ Write-Host "중지: .\run.ps1 stop"
211
+ }
212
+ } catch {
213
+ Remove-Item $PidFile -Force
214
+ if ($Language -eq "en") {
215
+ Write-Host "X Failed to start Entity Server in background"
216
+ Write-Host "Check logs: $StdoutLog"
217
+ } else {
218
+ Write-Host "X Entity Server 백그라운드 시작에 실패했습니다"
219
+ Write-Host "로그 확인: $StdoutLog"
220
+ }
221
+ exit 1
222
+ }
223
+ }
224
+
225
+ "stop" { Stop-Server }
226
+
227
+ "status" { Show-Status }
228
+
229
+ default {
230
+ if ($Language -eq "en") {
231
+ Write-Host "X Unknown mode: $Mode"
232
+ Write-Host "Run '.\run.ps1' for usage information"
233
+ } else {
234
+ Write-Host "X 알 수 없는 모드: $Mode"
235
+ Write-Host "'.\run.ps1'로 사용법을 확인하세요"
236
+ }
237
+ exit 1
238
+ }
239
+ }
@@ -0,0 +1,315 @@
1
+ #!/bin/bash
2
+ # Entity Server - Run Script
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
6
+
7
+ cd "$PROJECT_ROOT"
8
+
9
+ SERVER_CONFIG="$PROJECT_ROOT/configs/server.json"
10
+ DATABASE_CONFIG="$PROJECT_ROOT/configs/database.json"
11
+ RUN_DIR="$PROJECT_ROOT/.run"
12
+ PID_FILE="$RUN_DIR/entity-server.pid"
13
+ STDOUT_LOG="$PROJECT_ROOT/logs/server.out.log"
14
+
15
+ mkdir -p "$RUN_DIR" "$PROJECT_ROOT/logs"
16
+
17
+ # Load language from .env
18
+ if [ -f .env ]; then
19
+ LANGUAGE=$(grep '^LANGUAGE=' .env | cut -d '=' -f2)
20
+ fi
21
+ LANGUAGE=${LANGUAGE:-ko}
22
+
23
+ get_server_value() {
24
+ local key="$1"
25
+ local fallback="$2"
26
+ local value
27
+
28
+ value=$(grep -E "\"$key\"[[:space:]]*:" "$SERVER_CONFIG" | head -n 1 | sed -E 's/.*:[[:space:]]*"?([^",}]+)"?.*/\1/')
29
+ value=$(echo "$value" | tr -d '[:space:]')
30
+ if [ -z "$value" ]; then
31
+ echo "$fallback"
32
+ else
33
+ echo "$value"
34
+ fi
35
+ }
36
+
37
+ is_running() {
38
+ if [ ! -f "$PID_FILE" ]; then
39
+ return 1
40
+ fi
41
+ local pid
42
+ pid=$(cat "$PID_FILE" 2>/dev/null)
43
+ if [ -z "$pid" ]; then
44
+ return 1
45
+ fi
46
+ kill -0 "$pid" 2>/dev/null
47
+ }
48
+
49
+ stop_server() {
50
+ if [ ! -f "$PID_FILE" ]; then
51
+ if [ "$LANGUAGE" = "en" ]; then
52
+ echo "ℹ️ Server is not running (pid file not found)."
53
+ else
54
+ echo "ℹ️ 서버가 실행 중이 아닙니다 (pid 파일 없음)."
55
+ fi
56
+ return 0
57
+ fi
58
+
59
+ local pid
60
+ pid=$(cat "$PID_FILE" 2>/dev/null)
61
+ if [ -z "$pid" ]; then
62
+ rm -f "$PID_FILE"
63
+ if [ "$LANGUAGE" = "en" ]; then
64
+ echo "ℹ️ Empty pid file removed."
65
+ else
66
+ echo "ℹ️ 비어있는 pid 파일을 정리했습니다."
67
+ fi
68
+ return 0
69
+ fi
70
+
71
+ if ! kill -0 "$pid" 2>/dev/null; then
72
+ rm -f "$PID_FILE"
73
+ if [ "$LANGUAGE" = "en" ]; then
74
+ echo "ℹ️ Stale pid file removed (process not found)."
75
+ else
76
+ echo "ℹ️ 실행 중인 프로세스가 없어 stale pid 파일을 정리했습니다."
77
+ fi
78
+ return 0
79
+ fi
80
+
81
+ # 실행 중인 프로세스 정보 표시 후 확인
82
+ local proc_info
83
+ proc_info=$(ps -p "$pid" -o pid,user,etime,args --no-headers 2>/dev/null | head -1)
84
+ if [ "$LANGUAGE" = "en" ]; then
85
+ echo "Running process:"
86
+ echo " PID USER ELAPSED COMMAND"
87
+ echo " $proc_info"
88
+ echo ""
89
+ read -r -p "Stop this process? [y/N]: " input
90
+ else
91
+ echo "실행 중인 프로세스:"
92
+ echo " PID USER 실행시간 COMMAND"
93
+ echo " $proc_info"
94
+ echo ""
95
+ read -r -p "이 프로세스를 중지할까요? [y/N]: " input
96
+ fi
97
+ input=$(echo "$input" | tr '[:upper:]' '[:lower:]')
98
+ if [ "$input" != "y" ] && [ "$input" != "yes" ]; then
99
+ if [ "$LANGUAGE" = "en" ]; then
100
+ echo "Canceled."
101
+ else
102
+ echo "취소되었습니다."
103
+ fi
104
+ return 0
105
+ fi
106
+
107
+ kill "$pid" 2>/dev/null
108
+ for _ in $(seq 1 30); do
109
+ if ! kill -0 "$pid" 2>/dev/null; then
110
+ rm -f "$PID_FILE"
111
+ if [ "$LANGUAGE" = "en" ]; then
112
+ echo "✅ Server stopped (pid: $pid)"
113
+ else
114
+ echo "✅ 서버가 중지되었습니다 (pid: $pid)"
115
+ fi
116
+ return 0
117
+ fi
118
+ sleep 0.1
119
+ done
120
+
121
+ kill -9 "$pid" 2>/dev/null
122
+ rm -f "$PID_FILE"
123
+ if [ "$LANGUAGE" = "en" ]; then
124
+ echo "⚠️ Server force-stopped (pid: $pid)"
125
+ else
126
+ echo "⚠️ 서버를 강제 종료했습니다 (pid: $pid)"
127
+ fi
128
+ return 0
129
+ }
130
+
131
+ show_status() {
132
+ if is_running; then
133
+ ./bin/entity-server banner-status RUNNING
134
+ if [ "$LANGUAGE" = "en" ]; then
135
+ echo "Stop: ./run.sh stop"
136
+ else
137
+ echo "중지: ./run.sh stop"
138
+ fi
139
+ else
140
+ ./bin/entity-server banner-status STOPPED
141
+ if [ "$LANGUAGE" = "en" ]; then
142
+ echo "Start: ./run.sh start"
143
+ else
144
+ echo "시작: ./run.sh start"
145
+ fi
146
+ fi
147
+ }
148
+
149
+ # Show usage if no arguments
150
+ if [ $# -eq 0 ]; then
151
+ if [ "$LANGUAGE" = "en" ]; then
152
+ echo "Entity Server - Run Script"
153
+ echo "=========================="
154
+ echo ""
155
+ echo "Force configs/server.json environment and configs/database.json default group, then start compiled server binary."
156
+ echo ""
157
+ echo "Usage: $0 <mode>"
158
+ echo ""
159
+ echo "Modes:"
160
+ echo " dev environment=development, database.default=development, then run binary"
161
+ echo " start environment=production, database.default=production, then run in background"
162
+ echo " stop stop background server started by this script"
163
+ echo " status show server status"
164
+ echo ""
165
+ echo "Examples:"
166
+ echo " $0 dev # Start in development mode"
167
+ echo " $0 start # Start in production mode (background)"
168
+ echo " $0 stop # Stop server"
169
+ echo " $0 status # Show status"
170
+ else
171
+ echo "Entity Server - 실행 스크립트"
172
+ echo "==========================="
173
+ echo ""
174
+ echo "configs/server.json의 environment와 configs/database.json의 default를 강제 설정하고 바이너리를 실행합니다."
175
+ echo ""
176
+ echo "사용법: $0 <모드>"
177
+ echo ""
178
+ echo "모드:"
179
+ echo " dev environment=development, database.default=development 강제 후 바이너리 실행"
180
+ echo " start environment=production, database.default=production 강제 후 백그라운드 실행"
181
+ echo " stop run.sh로 백그라운드 실행한 서버 중지"
182
+ echo " status 서버 상태 조회"
183
+ echo ""
184
+ echo "예제:"
185
+ echo " $0 dev # 개발 모드로 시작"
186
+ echo " $0 start # 프로덕션 모드로 시작(백그라운드)"
187
+ echo " $0 stop # 서버 중지"
188
+ echo " $0 status # 상태 조회"
189
+ fi
190
+ exit 0
191
+ fi
192
+
193
+ MODE="$1"
194
+
195
+ if [ ! -f "$SERVER_CONFIG" ]; then
196
+ if [ "$LANGUAGE" = "en" ]; then
197
+ echo "❌ configs/server.json not found"
198
+ else
199
+ echo "❌ configs/server.json 파일이 없습니다"
200
+ fi
201
+ exit 1
202
+ fi
203
+
204
+ if [ ! -f "$DATABASE_CONFIG" ]; then
205
+ if [ "$LANGUAGE" = "en" ]; then
206
+ echo "❌ configs/database.json not found"
207
+ else
208
+ echo "❌ configs/database.json 파일이 없습니다"
209
+ fi
210
+ exit 1
211
+ fi
212
+
213
+ if [ ! -f bin/entity-server ]; then
214
+ if [ "$LANGUAGE" = "en" ]; then
215
+ echo "❌ bin/entity-server not found"
216
+ else
217
+ echo "❌ bin/entity-server 파일이 없습니다"
218
+ fi
219
+ exit 1
220
+ fi
221
+
222
+ case "$MODE" in
223
+ dev|development)
224
+ if is_running; then
225
+ if [ "$LANGUAGE" = "en" ]; then
226
+ echo "❌ Server already running (pid: $(cat "$PID_FILE")). Stop first: ./run.sh stop"
227
+ else
228
+ echo "❌ 이미 서버가 실행 중입니다 (pid: $(cat "$PID_FILE")). 먼저 중지하세요: ./run.sh stop"
229
+ fi
230
+ exit 1
231
+ fi
232
+
233
+ if ! grep -Eq '"development"[[:space:]]*:' "$DATABASE_CONFIG"; then
234
+ if [ "$LANGUAGE" = "en" ]; then
235
+ echo "❌ database group 'development' not found in configs/database.json"
236
+ else
237
+ echo "❌ configs/database.json에 'development' 그룹이 없습니다"
238
+ fi
239
+ exit 1
240
+ fi
241
+
242
+ sed -E -i 's/("environment"[[:space:]]*:[[:space:]]*")[^"]+(")/\1development\2/' "$SERVER_CONFIG"
243
+ sed -E -i 's/("default"[[:space:]]*:[[:space:]]*")[^"]+(")/\1development\2/' "$DATABASE_CONFIG"
244
+ ./bin/entity-server
245
+ ;;
246
+
247
+ start)
248
+ if is_running; then
249
+ if [ "$LANGUAGE" = "en" ]; then
250
+ echo "❌ Server already running (pid: $(cat "$PID_FILE")). Stop first: ./run.sh stop"
251
+ else
252
+ echo "❌ 이미 서버가 실행 중입니다 (pid: $(cat "$PID_FILE")). 먼저 중지하세요: ./run.sh stop"
253
+ fi
254
+ exit 1
255
+ fi
256
+
257
+ if ! grep -Eq '"production"[[:space:]]*:' "$DATABASE_CONFIG"; then
258
+ if [ "$LANGUAGE" = "en" ]; then
259
+ echo "❌ database group 'production' not found in configs/database.json"
260
+ else
261
+ echo "❌ configs/database.json에 'production' 그룹이 없습니다"
262
+ fi
263
+ exit 1
264
+ fi
265
+
266
+ sed -E -i 's/("environment"[[:space:]]*:[[:space:]]*")[^"]+(")/\1production\2/' "$SERVER_CONFIG"
267
+ sed -E -i 's/("default"[[:space:]]*:[[:space:]]*")[^"]+(")/\1production\2/' "$DATABASE_CONFIG"
268
+
269
+ ./bin/entity-server banner
270
+ nohup ./bin/entity-server >> "$STDOUT_LOG" 2>&1 &
271
+ SERVER_PID=$!
272
+ echo "$SERVER_PID" > "$PID_FILE"
273
+
274
+ sleep 0.3
275
+ if kill -0 "$SERVER_PID" 2>/dev/null; then
276
+ if [ "$LANGUAGE" = "en" ]; then
277
+ echo "✅ Entity Server started in background (pid: $SERVER_PID)"
278
+ echo "Status: ./run.sh status"
279
+ else
280
+ echo "✅ Entity Server가 백그라운드에서 시작되었습니다 (pid: $SERVER_PID)"
281
+ echo "상태: ./run.sh status"
282
+ echo "중지: ./run.sh stop"
283
+ fi
284
+ else
285
+ rm -f "$PID_FILE"
286
+ if [ "$LANGUAGE" = "en" ]; then
287
+ echo "❌ Failed to start Entity Server in background"
288
+ echo "Check logs: $STDOUT_LOG"
289
+ else
290
+ echo "❌ Entity Server 백그라운드 시작에 실패했습니다"
291
+ echo "로그 확인: $STDOUT_LOG"
292
+ fi
293
+ exit 1
294
+ fi
295
+ ;;
296
+
297
+ stop)
298
+ stop_server
299
+ ;;
300
+
301
+ status)
302
+ show_status
303
+ ;;
304
+
305
+ *)
306
+ if [ "$LANGUAGE" = "en" ]; then
307
+ echo "❌ Unknown mode: $MODE"
308
+ echo "Run '$0' for usage information"
309
+ else
310
+ echo "❌ 알 수 없는 모드: $MODE"
311
+ echo "'$0'로 사용법을 확인하세요"
312
+ fi
313
+ exit 1
314
+ ;;
315
+ esac