suthep 1.0.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 (83) hide show
  1. package/.editorconfig +17 -0
  2. package/.github/workflows/publish.yml +42 -0
  3. package/.prettierignore +6 -0
  4. package/.prettierrc +7 -0
  5. package/.scannerwork/.sonar_lock +0 -0
  6. package/.scannerwork/report-task.txt +6 -0
  7. package/.vscode/settings.json +19 -0
  8. package/LICENSE +21 -0
  9. package/README.md +317 -0
  10. package/dist/commands/deploy.js +371 -0
  11. package/dist/commands/deploy.js.map +1 -0
  12. package/dist/commands/down.js +179 -0
  13. package/dist/commands/down.js.map +1 -0
  14. package/dist/commands/init.js +188 -0
  15. package/dist/commands/init.js.map +1 -0
  16. package/dist/commands/setup.js +90 -0
  17. package/dist/commands/setup.js.map +1 -0
  18. package/dist/commands/up.js +213 -0
  19. package/dist/commands/up.js.map +1 -0
  20. package/dist/index.js +66 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/utils/certbot.js +64 -0
  23. package/dist/utils/certbot.js.map +1 -0
  24. package/dist/utils/config-loader.js +127 -0
  25. package/dist/utils/config-loader.js.map +1 -0
  26. package/dist/utils/deployment.js +85 -0
  27. package/dist/utils/deployment.js.map +1 -0
  28. package/dist/utils/docker.js +425 -0
  29. package/dist/utils/docker.js.map +1 -0
  30. package/dist/utils/env-loader.js +53 -0
  31. package/dist/utils/env-loader.js.map +1 -0
  32. package/dist/utils/nginx.js +378 -0
  33. package/dist/utils/nginx.js.map +1 -0
  34. package/docs/README.md +38 -0
  35. package/docs/english/01-introduction.md +84 -0
  36. package/docs/english/02-installation.md +200 -0
  37. package/docs/english/03-quick-start.md +258 -0
  38. package/docs/english/04-configuration.md +433 -0
  39. package/docs/english/05-commands.md +336 -0
  40. package/docs/english/06-examples.md +456 -0
  41. package/docs/english/07-troubleshooting.md +417 -0
  42. package/docs/english/08-advanced.md +411 -0
  43. package/docs/english/README.md +48 -0
  44. package/docs/thai/01-introduction.md +84 -0
  45. package/docs/thai/02-installation.md +200 -0
  46. package/docs/thai/03-quick-start.md +258 -0
  47. package/docs/thai/04-configuration.md +433 -0
  48. package/docs/thai/05-commands.md +336 -0
  49. package/docs/thai/06-examples.md +456 -0
  50. package/docs/thai/07-troubleshooting.md +417 -0
  51. package/docs/thai/08-advanced.md +411 -0
  52. package/docs/thai/README.md +48 -0
  53. package/example/suthep-complete.yml +103 -0
  54. package/example/suthep-docker-only.yml +71 -0
  55. package/example/suthep-env-example.yml +113 -0
  56. package/example/suthep-no-docker.yml +51 -0
  57. package/example/suthep-path-routing.yml +62 -0
  58. package/example/suthep.example.yml +88 -0
  59. package/package.json +51 -0
  60. package/src/commands/deploy.ts +488 -0
  61. package/src/commands/down.ts +240 -0
  62. package/src/commands/init.ts +214 -0
  63. package/src/commands/setup.ts +112 -0
  64. package/src/commands/up.ts +271 -0
  65. package/src/index.ts +109 -0
  66. package/src/types/config.ts +52 -0
  67. package/src/utils/__tests__/certbot.test.ts +222 -0
  68. package/src/utils/__tests__/config-loader.test.ts +419 -0
  69. package/src/utils/__tests__/deployment.test.ts +243 -0
  70. package/src/utils/__tests__/nginx.test.ts +412 -0
  71. package/src/utils/certbot.ts +144 -0
  72. package/src/utils/config-loader.ts +184 -0
  73. package/src/utils/deployment.ts +157 -0
  74. package/src/utils/docker.ts +768 -0
  75. package/src/utils/env-loader.ts +135 -0
  76. package/src/utils/nginx.ts +443 -0
  77. package/suthep-1.0.0.tgz +0 -0
  78. package/suthep.example.yml +98 -0
  79. package/suthep.yml +39 -0
  80. package/todo.md +6 -0
  81. package/tsconfig.json +26 -0
  82. package/vite.config.ts +46 -0
  83. package/vitest.config.ts +21 -0
@@ -0,0 +1,433 @@
1
+ # คู่มือการตั้งค่า
2
+
3
+ คู่มือนี้ครอบคลุมตัวเลือกการตั้งค่าทั้งหมดที่มีในไฟล์ `suthep.yml` ของ Suthep
4
+
5
+ ## โครงสร้างไฟล์การตั้งค่า
6
+
7
+ ไฟล์ `suthep.yml` ใช้รูปแบบ YAML และประกอบด้วยหลายส่วน:
8
+
9
+ ```yaml
10
+ project:
11
+ # ข้อมูลโปรเจกต์
12
+
13
+ services:
14
+ # คำจำกัดความบริการ
15
+
16
+ nginx:
17
+ # การตั้งค่า Nginx
18
+
19
+ certbot:
20
+ # การตั้งค่าใบรับรอง SSL
21
+
22
+ deployment:
23
+ # การตั้งค่ากลยุทธ์การ deploy
24
+ ```
25
+
26
+ ## การตั้งค่าโปรเจกต์
27
+
28
+ ส่วน `project` ประกอบด้วยข้อมูลเกี่ยวกับโปรเจกต์ของคุณ:
29
+
30
+ ```yaml
31
+ project:
32
+ name: my-app # ชื่อโปรเจกต์
33
+ version: 1.0.0 # เวอร์ชันโปรเจกต์
34
+ ```
35
+
36
+ ### ฟิลด์
37
+
38
+ | ฟิลด์ | จำเป็น | คำอธิบาย |
39
+ |-------|--------|----------|
40
+ | `name` | ใช่ | ตัวระบุเฉพาะสำหรับโปรเจกต์ของคุณ |
41
+ | `version` | ใช่ | เวอร์ชันโปรเจกต์ (สำหรับการติดตาม) |
42
+
43
+ ## การตั้งค่าบริการ
44
+
45
+ อาร์เรย์ `services` กำหนดบริการทั้งหมดที่จะ deploy แต่ละบริการสามารถมีการตั้งค่าหลายอย่าง
46
+
47
+ ### บริการพื้นฐาน
48
+
49
+ ```yaml
50
+ services:
51
+ - name: api
52
+ port: 3000
53
+ domains:
54
+ - api.example.com
55
+ ```
56
+
57
+ ### ฟิลด์บริการ
58
+
59
+ | ฟิลด์ | จำเป็น | ประเภท | คำอธิบาย |
60
+ |-------|--------|--------|----------|
61
+ | `name` | ใช่ | string | ตัวระบุบริการเฉพาะ |
62
+ | `port` | ใช่ | number | หมายเลขพอร์ตที่บริการรัน (host port) |
63
+ | `domains` | ใช่ | array | อาร์เรย์ของชื่อโดเมนสำหรับบริการนี้ |
64
+ | `path` | ไม่ | string | คำนำหน้า URL path (ค่าเริ่มต้น: `/`) |
65
+ | `docker` | ไม่ | object | การตั้งค่า Docker (ดูด้านล่าง) |
66
+ | `healthCheck` | ไม่ | object | การตั้งค่า health check (ดูด้านล่าง) |
67
+ | `environment` | ไม่ | object | ตัวแปรสภาพแวดล้อมเป็นคู่ key-value |
68
+
69
+ ### การตั้งค่า Docker
70
+
71
+ ตั้งค่า deployment ของ Docker container:
72
+
73
+ ```yaml
74
+ services:
75
+ - name: webapp
76
+ port: 8080
77
+ docker:
78
+ image: nginx:latest # Docker image ที่จะ pull
79
+ container: webapp-container # ชื่อ container
80
+ port: 80 # พอร์ตภายใน container
81
+ ```
82
+
83
+ #### ฟิลด์ Docker
84
+
85
+ | ฟิลด์ | จำเป็น | คำอธิบาย |
86
+ |-------|--------|----------|
87
+ | `image` | ไม่* | Docker image ที่จะ pull และรัน |
88
+ | `container` | ใช่ | ชื่อสำหรับ Docker container |
89
+ | `port` | ใช่ | พอร์ตภายในที่ container ฟัง |
90
+
91
+ \* `image` ไม่บังคับหากเชื่อมต่อกับ container ที่มีอยู่แล้ว
92
+
93
+ #### เชื่อมต่อกับ Container ที่มีอยู่
94
+
95
+ เพื่อเชื่อมต่อกับ container ที่กำลังรันอยู่แล้ว ให้ละเว้นฟิลด์ `image`:
96
+
97
+ ```yaml
98
+ services:
99
+ - name: database-proxy
100
+ port: 5432
101
+ docker:
102
+ container: postgres-container
103
+ port: 5432
104
+ ```
105
+
106
+ ### การตั้งค่า Health Check
107
+
108
+ ตั้งค่าการตรวจสอบสุขภาพสำหรับบริการของคุณ:
109
+
110
+ ```yaml
111
+ services:
112
+ - name: api
113
+ healthCheck:
114
+ path: /health # Health check endpoint
115
+ interval: 30 # ช่วงเวลาการตรวจสอบเป็นวินาที
116
+ ```
117
+
118
+ #### ฟิลด์ Health Check
119
+
120
+ | ฟิลด์ | จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
121
+ |-------|--------|------------|----------|
122
+ | `path` | ใช่ | - | HTTP endpoint path สำหรับ health checks |
123
+ | `interval` | ไม่ | 30 | เวลาระหว่าง health checks (วินาที) |
124
+
125
+ ### ตัวแปรสภาพแวดล้อม
126
+
127
+ ตั้งค่าตัวแปรสภาพแวดล้อมสำหรับบริการของคุณ:
128
+
129
+ ```yaml
130
+ services:
131
+ - name: api
132
+ environment:
133
+ NODE_ENV: production
134
+ DATABASE_URL: postgresql://localhost:5432/mydb
135
+ API_KEY: your-api-key
136
+ ```
137
+
138
+ #### การแทนที่ตัวแปรสภาพแวดล้อม
139
+
140
+ Suthep รองรับการแทนที่ตัวแปรสภาพแวดล้อมในไฟล์การตั้งค่าโดยใช้ไวยากรณ์ `${VAR_NAME}` คุณยังสามารถใช้ไฟล์ `.env` เพื่อเก็บค่าที่ละเอียดอ่อน
141
+
142
+ **การใช้ไฟล์ .env:**
143
+
144
+ Suthep จะโหลดไฟล์ `.env` อัตโนมัติจากไดเรกทอรีเดียวกับไฟล์การตั้งค่าของคุณ มันจะค้นหาไฟล์ตามลำดับนี้ (ไฟล์ที่มาทีหลังจะแทนที่ไฟล์ที่มาก่อน):
145
+
146
+ 1. `.env.local` (ลำดับความสำคัญสูงสุด ควรอยู่ใน gitignore)
147
+ 2. `.env`
148
+
149
+ ตัวอย่างไฟล์ `.env`:
150
+
151
+ ```bash
152
+ # .env
153
+ DATABASE_URL=postgresql://localhost:5432/mydb
154
+ API_KEY=secret-key-123
155
+ DOMAIN=example.com
156
+ ```
157
+
158
+ **ไวยากรณ์การแทนที่ตัวแปร:**
159
+
160
+ คุณสามารถใช้ตัวแปรสภาพแวดล้อมในไฟล์การตั้งค่าของคุณด้วยไวยากรณ์ต่อไปนี้:
161
+
162
+ ```yaml
163
+ services:
164
+ - name: api
165
+ port: 3000
166
+ domains:
167
+ - ${DOMAIN}
168
+ - api.${DOMAIN}
169
+ environment:
170
+ DATABASE_URL: ${DATABASE_URL}
171
+ API_KEY: ${API_KEY}
172
+ NODE_ENV: ${NODE_ENV:-production} # พร้อมค่าเริ่มต้น
173
+ ```
174
+
175
+ **ไวยากรณ์ที่รองรับ:**
176
+
177
+ - `${VAR_NAME}` - ถูกแทนที่ด้วยค่าของ `VAR_NAME` จากไฟล์ `.env` หรือ `process.env`
178
+ - `${VAR_NAME:-default}` - ใช้ `default` หาก `VAR_NAME` ไม่ได้ถูกตั้งค่า
179
+ - ตัวแปรจะถูกแทนที่แบบ recursive ตลอดทั้งการตั้งค่า
180
+
181
+ **ลำดับความสำคัญ:**
182
+
183
+ ตัวแปรสภาพแวดล้อมจะถูกแก้ไขตามลำดับนี้ (สูงสุดถึงต่ำสุด):
184
+
185
+ 1. ตัวแปรสภาพแวดล้อมจาก CLI (ผ่านแฟล็ก `-e` หรือ `--env`)
186
+ 2. ตัวแปรสภาพแวดล้อมเฉพาะบริการ (จากส่วน `environment`)
187
+ 3. ตัวแปรจากไฟล์ `.env`
188
+ 4. ตัวแปรสภาพแวดล้อมของระบบ (`process.env`)
189
+
190
+ **ตัวอย่าง:**
191
+
192
+ ```yaml
193
+ # suthep.yml
194
+ services:
195
+ - name: api
196
+ port: ${API_PORT:-3000}
197
+ domains:
198
+ - ${API_DOMAIN:-api.example.com}
199
+ environment:
200
+ NODE_ENV: ${NODE_ENV:-production}
201
+ DATABASE_URL: ${DATABASE_URL}
202
+ ```
203
+
204
+ ```bash
205
+ # .env
206
+ API_PORT=3001
207
+ API_DOMAIN=api.myapp.com
208
+ DATABASE_URL=postgresql://localhost:5432/mydb
209
+ ```
210
+
211
+ **หมายเหตุ:** ควรเพิ่ม `.env.local` ลงในไฟล์ `.gitignore` ของคุณเสมอเพื่อรักษาค่าที่ละเอียดอ่อนให้ปลอดภัย
212
+
213
+ ### Path-Based Routing
214
+
215
+ กำหนดเส้นทางบริการต่างๆ บนโดเมนเดียวกันโดยใช้ paths:
216
+
217
+ ```yaml
218
+ services:
219
+ # บริการ API บน path /api
220
+ - name: api
221
+ port: 3001
222
+ path: /api
223
+ domains:
224
+ - example.com
225
+
226
+ # บริการ UI บน root path
227
+ - name: ui
228
+ port: 3000
229
+ path: /
230
+ domains:
231
+ - example.com
232
+ ```
233
+
234
+ ## การตั้งค่า Nginx
235
+
236
+ ตั้งค่าการตั้งค่า Nginx:
237
+
238
+ ```yaml
239
+ nginx:
240
+ configPath: /etc/nginx/sites-available
241
+ reloadCommand: sudo nginx -t && sudo systemctl reload nginx
242
+ ```
243
+
244
+ ### ฟิลด์ Nginx
245
+
246
+ | ฟิลด์ | จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
247
+ |-------|--------|------------|----------|
248
+ | `configPath` | ไม่ | `/etc/nginx/sites-available` | Path ที่เก็บ configs ของ Nginx |
249
+ | `reloadCommand` | ไม่ | `sudo nginx -t && sudo systemctl reload nginx` | คำสั่งเพื่อ reload Nginx |
250
+
251
+ ## การตั้งค่า Certbot
252
+
253
+ ตั้งค่าการตั้งค่าใบรับรอง SSL:
254
+
255
+ ```yaml
256
+ certbot:
257
+ email: admin@example.com # อีเมลสำหรับ Let's Encrypt
258
+ staging: false # ใช้สภาพแวดล้อม staging (สำหรับการทดสอบ)
259
+ ```
260
+
261
+ ### ฟิลด์ Certbot
262
+
263
+ | ฟิลด์ | จำเป็น | คำอธิบาย |
264
+ |-------|--------|----------|
265
+ | `email` | ใช่ | ที่อยู่อีเมลสำหรับการแจ้งเตือน Let's Encrypt |
266
+ | `staging` | ไม่ | ใช้สภาพแวดล้อม staging (ค่าเริ่มต้น: `false`) |
267
+
268
+ **หมายเหตุ:** ใช้ `staging: true` สำหรับการทดสอบเพื่อหลีกเลี่ยง rate limits
269
+
270
+ ## การตั้งค่า Deployment
271
+
272
+ ตั้งค่ากลยุทธ์การ deploy:
273
+
274
+ ```yaml
275
+ deployment:
276
+ strategy: rolling # กลยุทธ์การ deploy
277
+ healthCheckTimeout: 30000 # Health check timeout (ms)
278
+ ```
279
+
280
+ ### ฟิลด์ Deployment
281
+
282
+ | ฟิลด์ | จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
283
+ |-------|--------|------------|----------|
284
+ | `strategy` | ไม่ | `rolling` | กลยุทธ์การ deploy (`rolling` หรือ `blue-green`) |
285
+ | `healthCheckTimeout` | ไม่ | `30000` | เวลาสูงสุดในการรอ health check (มิลลิวินาที) |
286
+
287
+ ### กลยุทธ์การ Deploy
288
+
289
+ #### Rolling Deployment
290
+
291
+ แทนที่ containers เก่าด้วยใหม่ทีละน้อย:
292
+
293
+ ```yaml
294
+ deployment:
295
+ strategy: rolling
296
+ ```
297
+
298
+ #### Blue-Green Deployment
299
+
300
+ สร้าง containers ใหม่, สลับ traffic, จากนั้นลบ containers เก่า:
301
+
302
+ ```yaml
303
+ deployment:
304
+ strategy: blue-green
305
+ ```
306
+
307
+ ## ตัวอย่างการตั้งค่าที่สมบูรณ์
308
+
309
+ นี่คือตัวอย่างที่สมบูรณ์พร้อมตัวเลือกทั้งหมด:
310
+
311
+ ```yaml
312
+ project:
313
+ name: my-app
314
+ version: 1.0.0
315
+
316
+ services:
317
+ # บริการ API แบบง่าย
318
+ - name: api
319
+ port: 3000
320
+ domains:
321
+ - api.example.com
322
+ healthCheck:
323
+ path: /health
324
+ interval: 30
325
+ environment:
326
+ NODE_ENV: production
327
+
328
+ # Docker webapp
329
+ - name: webapp
330
+ port: 8080
331
+ docker:
332
+ image: nginx:latest
333
+ container: webapp-container
334
+ port: 80
335
+ domains:
336
+ - example.com
337
+ - www.example.com
338
+ healthCheck:
339
+ path: /
340
+ interval: 30
341
+
342
+ # หลายบริการบนโดเมนเดียวกัน
343
+ - name: api-v2
344
+ port: 3001
345
+ path: /api
346
+ domains:
347
+ - example.com
348
+ docker:
349
+ image: myapp/api:latest
350
+ container: api-v2-container
351
+ port: 3001
352
+
353
+ nginx:
354
+ configPath: /etc/nginx/sites-available
355
+ reloadCommand: sudo nginx -t && sudo systemctl reload nginx
356
+
357
+ certbot:
358
+ email: admin@example.com
359
+ staging: false
360
+
361
+ deployment:
362
+ strategy: rolling
363
+ healthCheckTimeout: 30000
364
+ ```
365
+
366
+ ## วิธีปฏิบัติที่ดีในการตั้งค่า
367
+
368
+ ### 1. ใช้ชื่อบริการที่อธิบายได้
369
+
370
+ ```yaml
371
+ # ดี
372
+ - name: user-api
373
+ - name: payment-service
374
+
375
+ # หลีกเลี่ยง
376
+ - name: service1
377
+ - name: app
378
+ ```
379
+
380
+ ### 2. ตั้งค่าช่วงเวลา Health Check ที่เหมาะสม
381
+
382
+ ```yaml
383
+ # สำหรับบริการที่สำคัญ
384
+ healthCheck:
385
+ interval: 15 # ตรวจสอบทุก 15 วินาที
386
+
387
+ # สำหรับบริการที่สำคัญน้อยกว่า
388
+ healthCheck:
389
+ interval: 60 # ตรวจสอบทุกนาที
390
+ ```
391
+
392
+ ### 3. ใช้ Staging สำหรับการทดสอบ
393
+
394
+ ```yaml
395
+ certbot:
396
+ staging: true # ใช้ staging สำหรับการทดสอบ
397
+ ```
398
+
399
+ ### 4. จัดระเบียบบริการตามโดเมน
400
+
401
+ จัดกลุ่มบริการที่เกี่ยวข้องกันในการตั้งค่าของคุณ:
402
+
403
+ ```yaml
404
+ services:
405
+ # บริการ API
406
+ - name: api
407
+ domains: [api.example.com]
408
+ - name: api-v2
409
+ domains: [api-v2.example.com]
410
+
411
+ # บริการเว็บ
412
+ - name: webapp
413
+ domains: [example.com, www.example.com]
414
+ ```
415
+
416
+ ## การตรวจสอบความถูกต้อง
417
+
418
+ Suthep ตรวจสอบความถูกต้องของการตั้งค่าของคุณก่อน deploy ข้อผิดพลาดการตรวจสอบที่พบบ่อย:
419
+
420
+ - **ฟิลด์ที่จำเป็นหายไป** - ตรวจสอบว่าฟิลด์ที่จำเป็นทั้งหมดมีอยู่
421
+ - **หมายเลขพอร์ตไม่ถูกต้อง** - พอร์ตต้องอยู่ระหว่าง 1 และ 65535
422
+ - **ชื่อบริการซ้ำ** - แต่ละบริการต้องมีชื่อเฉพาะ
423
+ - **รูปแบบโดเมนไม่ถูกต้อง** - โดเมนต้องเป็น hostname ที่ถูกต้อง
424
+
425
+ ## ขั้นตอนถัดไป
426
+
427
+ - [คำสั่งอ้างอิง](./05-commands.md) - เรียนรู้เกี่ยวกับคำสั่งทั้งหมดที่มี
428
+ - [ตัวอย่าง](./06-examples.md) - ดูตัวอย่างการตั้งค่าในโลกจริง
429
+
430
+ ---
431
+
432
+ **ก่อนหน้า:** [เริ่มต้นใช้งาน](./03-quick-start.md) | **ถัดไป:** [คำสั่งอ้างอิง →](./05-commands.md)
433
+