# ๐Ÿ—๏ธ ๆžถๆž„ๆ–‡ๆกฃ ## ็›ฎๅฝ• - [2.1.1 ้œ€ๆฑ‚ๆ่ฟฐ](#211-้œ€ๆฑ‚ๆ่ฟฐ) - [้กน็›ฎ่ƒŒๆ™ฏ](#้กน็›ฎ่ƒŒๆ™ฏ) - [ๆ ธๅฟƒ้œ€ๆฑ‚](#ๆ ธๅฟƒ้œ€ๆฑ‚) - [ๅŠŸ่ƒฝ้œ€ๆฑ‚](#ๅŠŸ่ƒฝ้œ€ๆฑ‚) - [้žๅŠŸ่ƒฝ้œ€ๆฑ‚](#้žๅŠŸ่ƒฝ้œ€ๆฑ‚) - [2.1.2 ไธšๅŠกๅปบๆจก](#212-ไธšๅŠกๅปบๆจก) - [ไธšๅŠก้ข†ๅŸŸ](#ไธšๅŠก้ข†ๅŸŸ) - [ๆ ธๅฟƒๅฎžไฝ“](#ๆ ธๅฟƒๅฎžไฝ“) - [ไธšๅŠกๆต็จ‹](#ไธšๅŠกๆต็จ‹) - [็”จไพ‹ๅœบๆ™ฏ](#็”จไพ‹ๅœบๆ™ฏ) - [2.1.3 ๆŠ€ๆœฏๅปบๆจก](#213-ๆŠ€ๆœฏๅปบๆจก) - [2.1.3.1 ๅ…ญ่พนๅฝขๆžถๆž„](#2131-ๅ…ญ่พนๅฝขๆžถๆž„) - [2.1.3.2 ๆŠ€ๆœฏ้€‰ๅž‹](#2132-ๆŠ€ๆœฏ้€‰ๅž‹) --- # 2.1.1 ้œ€ๆฑ‚ๆ่ฟฐ ## ้กน็›ฎ่ƒŒๆ™ฏ ### ้—ฎ้ข˜้™ˆ่ฟฐ ๅœจไบ‘ๅŽŸ็”Ÿๆ—ถไปฃ๏ผŒKubernetes ๅทฒๆˆไธบๅฎนๅ™จ็ผ–ๆŽ’็š„ไบ‹ๅฎžๆ ‡ๅ‡†๏ผŒHelm ๆ˜ฏ Kubernetes ็š„ๅŒ…็ฎก็†ๅทฅๅ…ทใ€‚็„ถ่€Œ๏ผŒๅฝ“ๅ‰ไผไธšๅœจไฝฟ็”จ Helm ่ฟ›่กŒๅบ”็”จ้ƒจ็ฝฒๆ—ถ้ขไธดไปฅไธ‹ๆŒ‘ๆˆ˜๏ผš 1. **ๅคš้›†็พค็ฎก็†ๅคๆ‚** - ไผไธš้€šๅธธๆœ‰ๅคšไธช Kubernetes ้›†็พค๏ผˆๅผ€ๅ‘ใ€ๆต‹่ฏ•ใ€็”Ÿไบง๏ผ‰๏ผŒ้œ€่ฆ็ปŸไธ€็š„็ฎก็†็•Œ้ข 2. **ๅˆถๅ“ไป“ๅบ“ๅˆ†ๆ•ฃ** - Helm Chart ๅฏ่ƒฝๅˆ†ๅธƒๅœจๅคšไธช OCI Registry๏ผˆHarborใ€Docker Hubใ€GHCR๏ผ‰ไธญ๏ผŒ้šพไปฅ็ปŸไธ€ๆต่งˆ 3. **้ƒจ็ฝฒๆต็จ‹็น็** - ้œ€่ฆๆ‰‹ๅŠจ็ผ–ๅ†™ `helm install` ๅ‘ฝไปค๏ผŒ้…็ฝฎๅคๆ‚็š„ values.yaml 4. **็ผบไนๅฏ่ง†ๅŒ–** - ๅ‘ฝไปค่กŒๆ“ไฝœๅฏน้žๆŠ€ๆœฏไบบๅ‘˜ไธๅ‹ๅฅฝ๏ผŒ็ผบๅฐ‘็›ด่ง‚็š„ UI 5. **็‰ˆๆœฌ็ฎก็†ๅ›ฐ้šพ** - ๅบ”็”จๅ‡็บง้œ€่ฆ่ฎฐไฝๅކๅฒ็‰ˆๆœฌ๏ผŒๅฎนๆ˜“ๅ‡บ้”™ 6. **็›‘ๆŽงไฟกๆฏๅˆ†ๆ•ฃ** - ้œ€่ฆๅ•็‹ฌ่ฎฟ้—ฎ Kubernetes Dashboard ๆŸฅ็œ‹ๅบ”็”จ็Šถๆ€ ### ่งฃๅ†ณๆ–นๆกˆ OCDP Backend ๆไพ›็ปŸไธ€็š„ๅŽ็ซฏ API ๆœๅŠก๏ผŒๅฎž็Žฐ๏ผš - โœ… **็ปŸไธ€็ฎก็†** - ้›†ไธญ็ฎก็†ๅคšไธช Kubernetes ้›†็พคๅ’Œ OCI Registry - โœ… **ๅฏ่ง†ๅŒ–้ƒจ็ฝฒ** - ้€š่ฟ‡ API ็ฎ€ๅŒ– Helm Chart ็š„ๆต่งˆๅ’Œ้ƒจ็ฝฒๆต็จ‹ - โœ… **็‰ˆๆœฌๆŽงๅˆถ** - ๅฎŒๆ•ด็š„ๅบ”็”จ็”Ÿๅ‘ฝๅ‘จๆœŸ็ฎก็†๏ผˆๅฎ‰่ฃ…ใ€ๅ‡็บงใ€ๅธ่ฝฝ๏ผ‰ - โœ… **ๅฎžๆ—ถ็›‘ๆŽง** - ้›†ๆˆ Kubernetes API๏ผŒๅฎžๆ—ถ่Žทๅ–ๅบ”็”จ็Šถๆ€ๅ’Œ่ต„ๆบไฝฟ็”จๆƒ…ๅ†ต - โœ… **ๅฎ‰ๅ…จ่ฎค่ฏ** - ๆ”ฏๆŒ็”จๆˆท่ฎค่ฏๅ’Œๆ•ๆ„Ÿๆ•ฐๆฎๅŠ ๅฏ†ๅญ˜ๅ‚จ --- ## ๆ ธๅฟƒ้œ€ๆฑ‚ ### ไธšๅŠก้œ€ๆฑ‚ | ้œ€ๆฑ‚ ID | ้œ€ๆฑ‚ๆ่ฟฐ | ไผ˜ๅ…ˆ็บง | |---------|---------|--------| | BR-001 | ๆ”ฏๆŒ็ฎก็†ๅคšไธช Kubernetes ้›†็พค | P0 | | BR-002 | ๆ”ฏๆŒ็ฎก็†ๅคšไธช OCI Registry | P0 | | BR-003 | ๆต่งˆๅ’Œๆœ็ดข Helm Chart ๅˆถๅ“ | P0 | | BR-004 | ้ƒจ็ฝฒ Helm Chart ๅˆฐ Kubernetes ้›†็พค | P0 | | BR-005 | ๅ‡็บงๅทฒ้ƒจ็ฝฒ็š„ๅบ”็”จ | P0 | | BR-006 | ๆŸฅ็œ‹ๅบ”็”จๅฎžๆ—ถ็Šถๆ€ๅ’Œ่ต„ๆบไฝฟ็”จ | P1 | | BR-007 | ็”จๆˆท่ฎค่ฏๅ’Œๆƒ้™็ฎก็† | P1 | | BR-008 | ๅฎก่ฎกๆ—ฅๅฟ—่ฎฐๅฝ• | P2 | ### ็”จๆˆท่ง’่‰ฒ 1. **ๅนณๅฐ็ฎก็†ๅ‘˜** - ็ฎก็†้›†็พคใ€Registryใ€็”จๆˆท 2. **ๅผ€ๅ‘่€…** - ้ƒจ็ฝฒๅ’Œ็ฎก็†่‡ชๅทฑ็š„ๅบ”็”จ 3. **่ฟ็ปดไบบๅ‘˜** - ็›‘ๆŽงๅ’Œ็ปดๆŠคๅบ”็”จ็Šถๆ€ 4. **่ฎฟๅฎข** - ๅช่ฏปๆŸฅ็œ‹ๅบ”็”จๅˆ—่กจๅ’Œ็Šถๆ€ --- ## ๅŠŸ่ƒฝ้œ€ๆฑ‚ ### F1. ้›†็พค็ฎก็† **ๆ่ฟฐ**: ็ฎก็†ๅคšไธช Kubernetes ้›†็พค็š„่ฟžๆŽฅ้…็ฝฎ **ๅŠŸ่ƒฝ็‚น**: - ๆทปๅŠ ้›†็พค๏ผˆ้…็ฝฎ API Server ๅœฐๅ€ใ€่ฏไนฆ๏ผ‰ - ๆŸฅ็œ‹้›†็พคๅˆ—่กจๅ’Œ่ฏฆๆƒ… - ๆต‹่ฏ•้›†็พค่ฟžๆŽฅๅฅๅบท็Šถๆ€ - ๆ›ดๆ–ฐๅ’Œๅˆ ้™ค้›†็พค้…็ฝฎ - ๆŸฅ็œ‹้›†็พค่ต„ๆบไฝฟ็”จๆƒ…ๅ†ต๏ผˆCPUใ€ๅ†…ๅญ˜ใ€่Š‚็‚นๆ•ฐ๏ผ‰ **้ชŒๆ”ถๆ ‡ๅ‡†**: - โœ… ๆ”ฏๆŒ่ฏไนฆ่ฎค่ฏๅ’Œ Token ่ฎค่ฏ - โœ… ๆ•ๆ„Ÿไฟกๆฏ๏ผˆ่ฏไนฆใ€ๅฏ†้’ฅ๏ผ‰ๅŠ ๅฏ†ๅญ˜ๅ‚จ - โœ… ่ฟžๆŽฅๅคฑ่ดฅๆ—ถ็ป™ๅ‡บๆธ…ๆ™ฐ็š„้”™่ฏฏๆ็คบ - โœ… ๆ”ฏๆŒๆต‹่ฏ•่ฟžๆŽฅๅŠŸ่ƒฝ --- ### F2. Registry ็ฎก็† **ๆ่ฟฐ**: ็ฎก็†ๅคšไธช OCI Registry ็š„่ฟžๆŽฅ้…็ฝฎ **ๅŠŸ่ƒฝ็‚น**: - ๆทปๅŠ  Registry๏ผˆHarborใ€Docker Hubใ€GHCR ็ญ‰๏ผ‰ - ้…็ฝฎ่ฎค่ฏไฟกๆฏ๏ผˆ็”จๆˆทๅ/ๅฏ†็ ๏ผ‰ - ๆŸฅ็œ‹ Registry ๅˆ—่กจๅ’Œ่ฏฆๆƒ… - ๆต‹่ฏ• Registry ่ฟžๆŽฅๅฅๅบท็Šถๆ€ - ๆ›ดๆ–ฐๅ’Œๅˆ ้™ค Registry ้…็ฝฎ **้ชŒๆ”ถๆ ‡ๅ‡†**: - โœ… ๆ”ฏๆŒ Basic Auth ๅ’Œ Bearer Token - โœ… ๅฏ†็ ๅŠ ๅฏ†ๅญ˜ๅ‚จ - โœ… ๆ”ฏๆŒ HTTP/HTTPS ๅ’Œ่‡ช็ญพๅ่ฏไนฆ - โœ… ่ฟžๆŽฅๆต‹่ฏ•่ฟ”ๅ›žๅ“ๅบ”ๆ—ถ้—ด --- ### F3. Artifact ๆต่งˆ **ๆ่ฟฐ**: ๆต่งˆๅ’Œๆœ็ดข OCI Registry ไธญ็š„ Helm Chart **ๅŠŸ่ƒฝ็‚น**: - ๅˆ—ๅ‡บ Registry ไธญ็š„ๆ‰€ๆœ‰ไป“ๅบ“ - ๅˆ—ๅ‡บไป“ๅบ“ไธญ็š„ๆ‰€ๆœ‰ๅˆถๅ“๏ผˆtags๏ผ‰ - ๆŸฅ็œ‹ๅˆถๅ“่ฏฆๆƒ…๏ผˆๅคงๅฐใ€ๅˆ›ๅปบๆ—ถ้—ดใ€annotations๏ผ‰ - ่‡ชๅŠจ่ฏ†ๅˆซๅˆถๅ“็ฑปๅž‹๏ผˆHelm Chartใ€Docker Image๏ผ‰ - ่Žทๅ– Helm Chart ็š„ values schema **้ชŒๆ”ถๆ ‡ๅ‡†**: - โœ… ็ฌฆๅˆ OCI Distribution Specification - โœ… ๆ”ฏๆŒ URL ็ผ–็ ็š„ไป“ๅบ“ๅ็งฐ๏ผˆๅฆ‚ `charts/app`๏ผ‰ - โœ… ๆญฃ็กฎ่งฃๆž manifest ๅ’Œ config - โœ… ่ฎก็ฎ—ๅˆถๅ“ๆ€ปๅคงๅฐ๏ผˆๅŒ…ๅซๆ‰€ๆœ‰ layers๏ผ‰ --- ### F4. ๅบ”็”จ้ƒจ็ฝฒ **ๆ่ฟฐ**: ้ƒจ็ฝฒ Helm Chart ๅˆฐ Kubernetes ้›†็พค **ๅŠŸ่ƒฝ็‚น**: - ้€‰ๆ‹ฉ้›†็พคใ€Registryใ€Chart ๅ’Œ็‰ˆๆœฌ - ้…็ฝฎ values๏ผˆJSON ๆˆ– YAML๏ผ‰ - ๅฎ‰่ฃ…ๅบ”็”จๅˆฐๆŒ‡ๅฎš namespace - ๆŸฅ็œ‹ๅฎ‰่ฃ…่ฟ›ๅบฆๅ’Œ็Šถๆ€ - ่Žทๅ–ๅบ”็”จ่ฎฟ้—ฎ็ซฏ็‚น **้ชŒๆ”ถๆ ‡ๅ‡†**: - โœ… ๆ”ฏๆŒ่‡ชๅฎšไน‰ Release ๅ็งฐ - โœ… ๆ”ฏๆŒ JSON ๅ’Œ YAML ๆ ผๅผ็š„ values - โœ… ่ฎฐๅฝ•้ƒจ็ฝฒๅކๅฒ --- ### F5. ๅบ”็”จ็”Ÿๅ‘ฝๅ‘จๆœŸ็ฎก็† **ๆ่ฟฐ**: ็ฎก็†ๅทฒ้ƒจ็ฝฒๅบ”็”จ็š„ๅฎŒๆ•ด็”Ÿๅ‘ฝๅ‘จๆœŸ **ๅŠŸ่ƒฝ็‚น**: - ๆŸฅ็œ‹ๅบ”็”จๅˆ—่กจๅ’Œ่ฏฆๆƒ… - ๅ‡็บงๅบ”็”จๅˆฐๆ–ฐ็‰ˆๆœฌ - ๆŸฅ็œ‹้ƒจ็ฝฒๅކๅฒ - ๅธ่ฝฝๅบ”็”จ **้ชŒๆ”ถๆ ‡ๅ‡†**: - โœ… ๅ‡็บงๆ—ถไฟ็•™้…็ฝฎ - โœ… ๅธ่ฝฝๆ—ถๅฏ้€‰ไฟ็•™ๅކๅฒ - โœ… ๆ˜พ็คบๆฏๆฌก้ƒจ็ฝฒ็š„ๆ่ฟฐไฟกๆฏ --- ### F6. ็›‘ๆŽงๅ’Œ็Šถๆ€ **ๆ่ฟฐ**: ๅฎžๆ—ถ็›‘ๆŽงๅบ”็”จๅ’Œ้›†็พค็Šถๆ€ **ๅŠŸ่ƒฝ็‚น**: - ๆŸฅ็œ‹ๅบ”็”จๅฎžๆ—ถ็Šถๆ€๏ผˆRunningใ€Failed ็ญ‰๏ผ‰ - ๆŸฅ็œ‹ๅบ”็”จ่ต„ๆบไฝฟ็”จ๏ผˆCPUใ€ๅ†…ๅญ˜๏ผ‰ - ๆŸฅ็œ‹้›†็พคๆ•ดไฝ“็›‘ๆŽง - ๆŸฅ็œ‹่Š‚็‚น่ต„ๆบไฝฟ็”จ - ็›‘ๆŽงๆ‘˜่ฆ็ปŸ่ฎก **้ชŒๆ”ถๆ ‡ๅ‡†**: - โœ… ๅฎžๆ—ถ่Žทๅ– Kubernetes ่ต„ๆบ็Šถๆ€ - โœ… ๆ”ฏๆŒ Prometheus ๆŒ‡ๆ ‡้›†ๆˆ - โœ… ๆ˜พ็คบ Pod ็Šถๆ€ๅ’Œไบ‹ไปถ - โœ… ่ต„ๆบไฝฟ็”จ็™พๅˆ†ๆฏ”ๆ˜พ็คบ --- ### F7. ่ฎค่ฏๅ’ŒๆŽˆๆƒ **ๆ่ฟฐ**: ็”จๆˆท่บซไปฝ่ฎค่ฏๅ’Œ่ฎฟ้—ฎๆŽงๅˆถ **ๅŠŸ่ƒฝ็‚น**: - ็”จๆˆทๆณจๅ†Œๅ’Œ็™ปๅฝ• - JWT Token ่ฎค่ฏ - Token ๅˆทๆ–ฐๆœบๅˆถ - ๅฏ†็ ๅŠ ๅฏ†ๅญ˜ๅ‚จ **้ชŒๆ”ถๆ ‡ๅ‡†**: - โœ… ไฝฟ็”จ bcrypt ๅ“ˆๅธŒๅฏ†็  - โœ… JWT Token ๆœ‰ๆ•ˆๆœŸ้…็ฝฎ - โœ… Refresh Token ๆ”ฏๆŒ - โœ… ๅฏ†็ ๅผบๅบฆ้ชŒ่ฏ --- ## ้žๅŠŸ่ƒฝ้œ€ๆฑ‚ ### NFR1. ๆ€ง่ƒฝ่ฆๆฑ‚ | ๆŒ‡ๆ ‡ | ่ฆๆฑ‚ | |------|------| | API ๅ“ๅบ”ๆ—ถ้—ด | P95 < 500ms | | ๅนถๅ‘็”จๆˆทๆ•ฐ | ๆ”ฏๆŒ 100+ ๅนถๅ‘ | | ๆ•ฐๆฎๅบ“่ฟžๆŽฅๆฑ  | 25 ไธช่ฟžๆŽฅ | | Helm ๆ“ไฝœ่ถ…ๆ—ถ | 5 ๅˆ†้’Ÿ | ### NFR2. ๅฏ็”จๆ€ง - **็ณป็ปŸๅฏ็”จๆ€ง**: 99.5% - **ๆ•…้šœๆขๅคๆ—ถ้—ด**: < 5 ๅˆ†้’Ÿ - **ๆ•ฐๆฎๅค‡ไปฝ**: ๆฏๆ—ฅๅค‡ไปฝ - **ๅฅๅบทๆฃ€ๆŸฅ**: ๆไพ› `/health` ็ซฏ็‚น ### NFR3. ๅฎ‰ๅ…จๆ€ง - **ๆ•ฐๆฎๅŠ ๅฏ†**: AES-256 ๅŠ ๅฏ†ๆ•ๆ„Ÿๆ•ฐๆฎ - **ไผ ่พ“ๅฎ‰ๅ…จ**: ๆ”ฏๆŒ HTTPS - **่ฎค่ฏๆ–นๅผ**: JWT Token - **ๅฏ†็ ็ญ–็•ฅ**: ๆœ€ๅฐ้•ฟๅบฆ 8 ไฝ - **ๅฎก่ฎกๆ—ฅๅฟ—**: ่ฎฐๅฝ•ๆ‰€ๆœ‰ๆ“ไฝœ๏ผˆๆœชๆฅ๏ผ‰ ### NFR4. ๅฏๆ‰ฉๅฑ•ๆ€ง - **ๆฐดๅนณๆ‰ฉๅฑ•**: ๆ”ฏๆŒๅคšๅฎžไพ‹้ƒจ็ฝฒ - **ๆ•ฐๆฎๅบ“**: PostgreSQL ๆ”ฏๆŒไธปไปŽๅคๅˆถ - **ๆ— ็Šถๆ€่ฎพ่ฎก**: API ๆœๅŠกๆ— ็Šถๆ€ - **็ผ“ๅญ˜็ญ–็•ฅ**: ๆ”ฏๆŒ Redis๏ผˆๆœชๆฅ๏ผ‰ ### NFR5. ๅฏ็ปดๆŠคๆ€ง - **ไปฃ็ ่ดจ้‡**: ้ตๅพช Go ๆœ€ไฝณๅฎž่ทต - **ๆต‹่ฏ•่ฆ†็›–**: > 70% - **ๆ–‡ๆกฃๅฎŒๆ•ด**: API ๆ–‡ๆกฃใ€ๆžถๆž„ๆ–‡ๆกฃใ€้ƒจ็ฝฒๆ–‡ๆกฃ - **ๆ—ฅๅฟ—่ฎฐๅฝ•**: ็ป“ๆž„ๅŒ–ๆ—ฅๅฟ— - **็›‘ๆŽงๆŒ‡ๆ ‡**: Prometheus ๆŒ‡ๆ ‡๏ผˆๆœชๆฅ๏ผ‰ ### NFR6. ๅ…ผๅฎนๆ€ง - **Kubernetes ็‰ˆๆœฌ**: 1.24+ - **Helm ็‰ˆๆœฌ**: 3.x - **OCI Registry**: ็ฌฆๅˆ OCI Distribution Spec - **ๆ•ฐๆฎๅบ“**: PostgreSQL 15+ - **Go ็‰ˆๆœฌ**: 1.21+ --- # 2.1.2 ไธšๅŠกๅปบๆจก ## ไธšๅŠก้ข†ๅŸŸ OCDP Backend ๅฑžไบŽ**ไบ‘ๅŽŸ็”Ÿๅบ”็”จ็ฎก็†**้ข†ๅŸŸ๏ผŒไธป่ฆๆถ‰ๅŠไปฅไธ‹ๅญๅŸŸ๏ผš 1. **ๅˆถๅ“็ฎก็†ๅŸŸ** - OCI Registryใ€Helm Chartใ€Docker Image 2. **้›†็พค็ฎก็†ๅŸŸ** - Kubernetes Clusterใ€Nodeใ€Namespace 3. **ๅบ”็”จ้ƒจ็ฝฒๅŸŸ** - Helm Releaseใ€Application Instance 4. **็›‘ๆŽง่ฟ็ปดๅŸŸ** - Metricsใ€Logsใ€Events --- ## ๆ ธๅฟƒๅฎžไฝ“ ### ้ข†ๅŸŸๆจกๅž‹ๅ›พ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Core Domain Entities โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ User โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ Cluster โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ Instance โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ–ผ โ–ผ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Auth โ”‚ โ”‚ Health โ”‚ โ”‚ Status โ”‚ โ”‚ Token โ”‚ โ”‚ Check โ”‚ โ”‚ Resource โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Registry โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚Artifact โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ Chart โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ–ผ โ–ผ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Health โ”‚ โ”‚Repositoryโ”‚ โ”‚ Values โ”‚ โ”‚ Check โ”‚ โ”‚ โ”‚ โ”‚ Schema โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### ๅฎžไฝ“่ฏฆ่งฃ #### 1. User๏ผˆ็”จๆˆท๏ผ‰ **่Œ่ดฃ**: ่กจ็คบ็ณป็ปŸ็”จๆˆท๏ผŒ่ดŸ่ดฃ่บซไปฝ่ฎค่ฏ **ๅฑžๆ€ง**: - `ID`: ๅ”ฏไธ€ๆ ‡่ฏ†็ฌฆ - `Username`: ็”จๆˆทๅ๏ผˆๅ”ฏไธ€๏ผ‰ - `Email`: ้‚ฎ็ฎฑ - `PasswordHash`: ๅฏ†็ ๅ“ˆๅธŒ๏ผˆbcrypt๏ผ‰ - `CreatedAt`: ๅˆ›ๅปบๆ—ถ้—ด - `UpdatedAt`: ๆ›ดๆ–ฐๆ—ถ้—ด **ไธšๅŠก่ง„ๅˆ™**: - ็”จๆˆทๅๅ”ฏไธ€ - ้‚ฎ็ฎฑๆ ผๅผ้ชŒ่ฏ - ๅฏ†็ ๆœ€ๅฐ้•ฟๅบฆ 8 ไฝ --- #### 2. Cluster๏ผˆ้›†็พค๏ผ‰ **่Œ่ดฃ**: ่กจ็คบ Kubernetes ้›†็พค่ฟžๆŽฅ้…็ฝฎ **ๅฑžๆ€ง**: - `ID`: ๅ”ฏไธ€ๆ ‡่ฏ†็ฌฆ - `Name`: ้›†็พคๅ็งฐ - `Host`: API Server ๅœฐๅ€ - `Description`: ๆ่ฟฐ - `CAData`: CA ่ฏไนฆ๏ผˆๅŠ ๅฏ†ๅญ˜ๅ‚จ๏ผ‰ - `CertData`: ๅฎขๆˆท็ซฏ่ฏไนฆ๏ผˆๅŠ ๅฏ†ๅญ˜ๅ‚จ๏ผ‰ - `KeyData`: ๅฎขๆˆท็ซฏๅฏ†้’ฅ๏ผˆๅŠ ๅฏ†ๅญ˜ๅ‚จ๏ผ‰ - `Token`: Bearer Token๏ผˆๅฏ้€‰๏ผ‰ - `CreatedAt`: ๅˆ›ๅปบๆ—ถ้—ด - `UpdatedAt`: ๆ›ดๆ–ฐๆ—ถ้—ด **ไธšๅŠก่ง„ๅˆ™**: - ้›†็พคๅ็งฐๅ”ฏไธ€ - ๅฟ…้กปๆไพ›่ฏไนฆๆˆ– Token - Host ๅฟ…้กปๆ˜ฏๆœ‰ๆ•ˆ็š„ HTTPS URL --- #### 3. Registry๏ผˆ้•œๅƒไป“ๅบ“๏ผ‰ **่Œ่ดฃ**: ่กจ็คบ OCI Registry ่ฟžๆŽฅ้…็ฝฎ **ๅฑžๆ€ง**: - `ID`: ๅ”ฏไธ€ๆ ‡่ฏ†็ฌฆ - `Name`: Registry ๅ็งฐ - `URL`: Registry URL - `Description`: ๆ่ฟฐ - `Username`: ็”จๆˆทๅ - `Password`: ๅฏ†็ ๏ผˆๅŠ ๅฏ†ๅญ˜ๅ‚จ๏ผ‰ - `Insecure`: ๆ˜ฏๅฆ่ทณ่ฟ‡ SSL ้ชŒ่ฏ - `CreatedAt`: ๅˆ›ๅปบๆ—ถ้—ด - `UpdatedAt`: ๆ›ดๆ–ฐๆ—ถ้—ด **ไธšๅŠก่ง„ๅˆ™**: - Registry ๅ็งฐๅ”ฏไธ€ - URL ๅฟ…้กปๆ˜ฏๆœ‰ๆ•ˆ็š„ HTTP/HTTPS URL - ๅฏ†็ ๅŠ ๅฏ†ๅญ˜ๅ‚จ --- #### 4. Instance๏ผˆๅบ”็”จๅฎžไพ‹๏ผ‰ **่Œ่ดฃ**: ่กจ็คบ้ƒจ็ฝฒๅœจ Kubernetes ไธญ็š„ Helm Release **ๅฑžๆ€ง**: - `ID`: ๅ”ฏไธ€ๆ ‡่ฏ†็ฌฆ - `Name`: Release ๅ็งฐ - `Namespace`: Kubernetes namespace - `ClusterID`: ๆ‰€ๅฑž้›†็พค - `RegistryID`: Chart ๆฅๆบ Registry - `Repository`: Chart ไป“ๅบ“ๅ - `Chart`: Chart ๅ็งฐ - `Version`: Chart ็‰ˆๆœฌ - `Status`: ้ƒจ็ฝฒ็Šถๆ€ - `Revision`: ๅฝ“ๅ‰็‰ˆๆœฌๅท - `Values`: ้…็ฝฎๅ€ผ๏ผˆJSON๏ผ‰ - `Description`: ๆ่ฟฐ - `CreatedAt`: ๅˆ›ๅปบๆ—ถ้—ด - `UpdatedAt`: ๆ›ดๆ–ฐๆ—ถ้—ด **ไธšๅŠก่ง„ๅˆ™**: - ๅŒไธ€้›†็พคๅ’Œ namespace ไธ‹ Release ๅ็งฐๅ”ฏไธ€ - ๅฟ…้กปๅ…ณ่”ๆœ‰ๆ•ˆ็š„ Cluster ๅ’Œ Registry - Values ๅฟ…้กปๆ˜ฏๆœ‰ๆ•ˆ็š„ JSON ๆˆ– YAML --- #### 5. Artifact๏ผˆๅˆถๅ“๏ผ‰ **่Œ่ดฃ**: ่กจ็คบ OCI Registry ไธญ็š„ๅˆถๅ“๏ผˆHelm Chartใ€Docker Image ็ญ‰๏ผ‰ **ๅฑžๆ€ง**: - `RepositoryName`: ไป“ๅบ“ๅ็งฐ - `Tag`: ๆ ‡็ญพ - `Digest`: SHA256 ๆ‘˜่ฆ - `Type`: ๅˆถๅ“็ฑปๅž‹๏ผˆhelmใ€dockerใ€oci๏ผ‰ - `Size`: ๆ€ปๅคงๅฐ - `MediaType`: ๅช’ไฝ“็ฑปๅž‹ - `Annotations`: ๅ…ƒๆ•ฐๆฎ - `CreatedAt`: ๅˆ›ๅปบๆ—ถ้—ด **ไธšๅŠก่ง„ๅˆ™**: - Tag ๆˆ– Digest ่‡ณๅฐ‘ๆไพ›ไธ€ไธช - ่‡ชๅŠจ่ฏ†ๅˆซๅˆถๅ“็ฑปๅž‹ - ่ฎก็ฎ—ๆ‰€ๆœ‰ layers ็š„ๆ€ปๅคงๅฐ --- ## ไธšๅŠกๆต็จ‹ ### ๆต็จ‹ 1: ็”จๆˆทๆณจๅ†Œๅ’Œ็™ปๅฝ• ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ User โ”‚ โ”‚ Handler โ”‚ โ”‚ Service โ”‚ โ”‚ Repo โ”‚ โ””โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Register โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Create User โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Hash Password โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ Save User โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Login โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Authenticate โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Verify Pwd โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ Gen JWT โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค Return Token โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ``` --- ### ๆต็จ‹ 2: ้ƒจ็ฝฒๅบ”็”จ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ User โ”‚ โ”‚ Handler โ”‚ โ”‚ Service โ”‚ โ”‚HelmClientโ”‚ โ”‚Kubernetesโ”‚ โ””โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Deploy App โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Create Inst โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Validate โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Pull Chart โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ โ”‚ Install Chart โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Apply K8s โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ โ”‚ Save Instance โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค Return Status โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ``` --- ### ๆต็จ‹ 3: ๆต่งˆๅˆถๅ“ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ User โ”‚ โ”‚ Handler โ”‚ โ”‚ Service โ”‚ โ”‚OCIClient โ”‚ โ”‚ Registry โ”‚ โ””โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚List Repos โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Get Repos โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ List Catalog โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ GET _catalog โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚List Tags โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Get Artifacts โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ List Tags โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ GET tags/list โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ Get Manifest โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ GET manifest โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>โ”‚ โ”‚ โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚<โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ ``` --- ## ็”จไพ‹ๅœบๆ™ฏ ### UC1: ๅผ€ๅ‘่€…้ƒจ็ฝฒๆต‹่ฏ•ๅบ”็”จ **ไธป่ง’**: ๅผ€ๅ‘่€… Alice **ๅ‰็ฝฎๆกไปถ**: - Alice ๅทฒ็™ปๅฝ•็ณป็ปŸ - ็ณป็ปŸไธญๅทฒ้…็ฝฎๅผ€ๅ‘็Žฏๅขƒ้›†็พค - ็ณป็ปŸไธญๅทฒ้…็ฝฎ Harbor Registry **ๅŸบๆœฌๆต็จ‹**: 1. Alice ้€‰ๆ‹ฉ"ๅผ€ๅ‘้›†็พค" 2. Alice ๆต่งˆ Harbor ไธญ็š„"charts/nginx"ไป“ๅบ“ 3. Alice ้€‰ๆ‹ฉ nginx 1.0.0 ็‰ˆๆœฌ 4. Alice ้…็ฝฎ values: `{"replicaCount": 2}` 5. Alice ็‚นๅ‡ป"้ƒจ็ฝฒ" 6. ็ณป็ปŸๆ˜พ็คบ้ƒจ็ฝฒ่ฟ›ๅบฆ 7. ้ƒจ็ฝฒๆˆๅŠŸ๏ผŒๆ˜พ็คบๅบ”็”จ่ฎฟ้—ฎๅœฐๅ€ **ๅŽ็ฝฎๆกไปถ**: - nginx ๅบ”็”จๆˆๅŠŸ้ƒจ็ฝฒๅˆฐๅผ€ๅ‘้›†็พค - ๅบ”็”จ็Šถๆ€ไธบ "deployed" - Alice ๅฏไปฅ่ฎฟ้—ฎๅบ”็”จ **ๅผ‚ๅธธๆต็จ‹**: - 3a. Chart ็‰ˆๆœฌไธๅญ˜ๅœจ โ†’ ๆ˜พ็คบ้”™่ฏฏๆ็คบ - 5a. ้ƒจ็ฝฒๅคฑ่ดฅ โ†’ ๆ˜พ็คบ้”™่ฏฏๆ—ฅๅฟ— --- ### UC2: ่ฟ็ปดไบบๅ‘˜ๅ‡็บง็”Ÿไบงๅบ”็”จ **ไธป่ง’**: ่ฟ็ปด Bob **ๅ‰็ฝฎๆกไปถ**: - Bob ๅทฒ็™ปๅฝ•็ณป็ปŸ - ็”Ÿไบง็Žฏๅขƒๆœ‰่ฟ่กŒไธญ็š„ nginx ๅบ”็”จ๏ผˆ็‰ˆๆœฌ 1.0.0๏ผ‰ **ๅŸบๆœฌๆต็จ‹**: 1. Bob ่ฟ›ๅ…ฅ"็”Ÿไบง้›†็พค"ๅบ”็”จๅˆ—่กจ 2. Bob ้€‰ๆ‹ฉ nginx ๅบ”็”จ 3. Bob ๆŸฅ็œ‹ๅฝ“ๅ‰็‰ˆๆœฌๅ’Œ้…็ฝฎ 4. Bob ็‚นๅ‡ป"ๅ‡็บง" 5. Bob ้€‰ๆ‹ฉๆ–ฐ็‰ˆๆœฌ 1.1.0 6. Bob ๆ›ดๆ–ฐ้…็ฝฎ: `{"replicaCount": 3}` 7. Bob ๆทปๅŠ ๅ‡็บง่ฏดๆ˜Ž 8. Bob ็กฎ่ฎคๅ‡็บง 9. ็ณป็ปŸๆ‰ง่กŒๆปšๅŠจๅ‡็บง 10. ๅ‡็บงๆˆๅŠŸ๏ผŒRevision ๅขžๅŠ ๅˆฐ 2 **ๅŽ็ฝฎๆกไปถ**: - nginx ๅบ”็”จๅ‡็บงๅˆฐ 1.1.0 - ๅ‰ฏๆœฌๆ•ฐๅขžๅŠ ๅˆฐ 3 - ๅކๅฒ่ฎฐๅฝ•ไธญไฟ็•™ไบ† Revision 1 **ๅผ‚ๅธธๆต็จ‹**: - 9a. ๅ‡็บงๅคฑ่ดฅ โ†’ ๆ˜พ็คบ้”™่ฏฏไฟกๆฏ๏ผŒไฟๆŒๅŽŸ็Šถๆ€ - 9b. ่ถ…ๆ—ถ โ†’ ๅ–ๆถˆๅ‡็บง๏ผŒไฟๆŒๅŽŸ็Šถๆ€ --- ### UC3: ็ฎก็†ๅ‘˜ๆทปๅŠ ๆ–ฐ้›†็พค **ไธป่ง’**: ็ฎก็†ๅ‘˜ Charlie **ๅ‰็ฝฎๆกไปถ**: - Charlie ๅทฒ็™ปๅฝ•็ณป็ปŸ - Charlie ๆœ‰้›†็พค็š„ kubeconfig ๆ–‡ไปถ **ๅŸบๆœฌๆต็จ‹**: 1. Charlie ่ฟ›ๅ…ฅ"้›†็พค็ฎก็†"้กต้ข 2. Charlie ็‚นๅ‡ป"ๆทปๅŠ ้›†็พค" 3. Charlie ๅกซๅ†™้›†็พคไฟกๆฏ: - ๅ็งฐ: "Production Cluster" - API Server: "https://k8s.prod.com:6443" - ๆ่ฟฐ: "็”Ÿไบง็Žฏๅขƒ้›†็พค" 4. Charlie ไปŽ kubeconfig ๆๅ–่ฏไนฆๆ•ฐๆฎ 5. Charlie ็ฒ˜่ดด CAใ€Certใ€Key ๆ•ฐๆฎ 6. Charlie ็‚นๅ‡ป"ๆต‹่ฏ•่ฟžๆŽฅ" 7. ็ณป็ปŸๆ˜พ็คบ"่ฟžๆŽฅๆˆๅŠŸ" 8. Charlie ไฟๅญ˜้…็ฝฎ **ๅŽ็ฝฎๆกไปถ**: - ๆ–ฐ้›†็พคๆทปๅŠ ๅˆฐ็ณป็ปŸ - ้›†็พค่ฏไนฆๅŠ ๅฏ†ๅญ˜ๅ‚จ - ๅ…ถไป–็”จๆˆทๅฏไปฅไฝฟ็”จๆญค้›†็พค **ๅผ‚ๅธธๆต็จ‹**: - 6a. ่ฟžๆŽฅๅคฑ่ดฅ โ†’ ๆ˜พ็คบๅ…ทไฝ“้”™่ฏฏไฟกๆฏ - 6b. ่ฏไนฆๆ ผๅผ้”™่ฏฏ โ†’ ๆ็คบๆญฃ็กฎ็š„ๆ ผๅผ --- # 2.1.3 ๆŠ€ๆœฏๅปบๆจก ## 2.1.3.1 ๅ…ญ่พนๅฝขๆžถๆž„ ### ๆžถๆž„ๆฆ‚่ฟฐ OCDP Backend ้‡‡็”จ**ๅ…ญ่พนๅฝขๆžถๆž„**๏ผˆHexagonal Architecture๏ผŒไนŸ็งฐไธบ็ซฏๅฃๅ’Œ้€‚้…ๅ™จๆžถๆž„๏ผ‰๏ผŒ่ฟ™ๆ˜ฏไธ€็งๅˆ†ๅฑ‚ๆžถๆž„ๆจกๅผ๏ผŒๅผบ่ฐƒไธšๅŠก้€ป่พ‘ไธŽๅค–้ƒจไพ่ต–็š„ๅˆ†็ฆปใ€‚ ### ๆ ธๅฟƒๅŽŸๅˆ™ 1. **ไพ่ต–ๅ€’็ฝฎ** - ๆ‰€ๆœ‰ๅฑ‚ไพ่ต– Domain๏ผŒDomain ๆ— ๅค–้ƒจไพ่ต– 2. **็ซฏๅฃๅ’Œ้€‚้…ๅ™จ** - ้€š่ฟ‡ๆŽฅๅฃ๏ผˆPort๏ผ‰ๅฎšไน‰ไบคไบ’ๅ่ฎฎ๏ผŒ้€š่ฟ‡้€‚้…ๅ™จ๏ผˆAdapter๏ผ‰ๅฎž็Žฐๅ…ทไฝ“ๆŠ€ๆœฏ 3. **ๅฏๆต‹่ฏ•ๆ€ง** - ไธšๅŠก้€ป่พ‘ๅฏ็‹ฌ็ซ‹ๆต‹่ฏ•๏ผŒๆ— ้œ€ๅค–้ƒจไพ่ต– 4. **ๅฏๆ›ฟๆขๆ€ง** - ้€‚้…ๅ™จๅฏ่ฝปๆพๆ›ฟๆข๏ผˆMock โ†” Production๏ผ‰ ### ๆžถๆž„ๅˆ†ๅฑ‚ๅ›พ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Input Adapters โ”‚ โ”‚ (HTTP REST API) โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Auth Handler โ”‚ โ”‚Cluster Handl โ”‚ โ”‚Instance Handlโ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ DTO / Request โ†“ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Domain Layer โ”‚ โ”‚ (Business Logic) โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Entities โ”‚ โ”‚ โ”‚ โ”‚ User | Cluster | Registry | Instance | Artifact โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Services โ”‚ โ”‚ โ”‚ โ”‚ AuthService | ClusterService | InstanceService โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Repository Interfaces (Ports) โ”‚ โ”‚ โ”‚ โ”‚ UserRepo | ClusterRepo | OCIClient | HelmClient โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ Interface Contract โ†“ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Output Adapters โ”‚ โ”‚ (Infrastructure Implementations) โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Database โ”‚ โ”‚ OCI Client โ”‚ โ”‚ Helm Client โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ Mock: Memory โ”‚ โ”‚ Mock: Static โ”‚ โ”‚ Mock: Fake โ”‚ โ”‚ โ”‚ โ”‚ Prod:Postgresโ”‚ โ”‚ Prod: ORAS โ”‚ โ”‚ Prod: Helm โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### ็›ฎๅฝ•็ป“ๆž„ ``` internal/ โ”œโ”€โ”€ domain/ # ๐ŸŽฏ ้ข†ๅŸŸๅฑ‚๏ผˆๆ ธๅฟƒ๏ผ‰ โ”‚ โ”œโ”€โ”€ entity/ # ้ข†ๅŸŸๅฎžไฝ“ โ”‚ โ”‚ โ”œโ”€โ”€ user.go โ”‚ โ”‚ โ”œโ”€โ”€ cluster.go โ”‚ โ”‚ โ”œโ”€โ”€ registry.go โ”‚ โ”‚ โ”œโ”€โ”€ instance.go โ”‚ โ”‚ โ””โ”€โ”€ artifact.go โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ service/ # ไธšๅŠก้€ป่พ‘ๆœๅŠก โ”‚ โ”‚ โ”œโ”€โ”€ auth_service.go โ”‚ โ”‚ โ”œโ”€โ”€ cluster_service.go โ”‚ โ”‚ โ”œโ”€โ”€ registry_service.go โ”‚ โ”‚ โ”œโ”€โ”€ artifact_service.go โ”‚ โ”‚ โ”œโ”€โ”€ instance_service.go โ”‚ โ”‚ โ””โ”€โ”€ monitoring_service.go โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ repository/ # ๆŽฅๅฃๅฎšไน‰๏ผˆOutput Ports๏ผ‰ โ”‚ โ”œโ”€โ”€ user_repository.go โ”‚ โ”œโ”€โ”€ cluster_repository.go โ”‚ โ”œโ”€โ”€ registry_repository.go โ”‚ โ”œโ”€โ”€ instance_repository.go โ”‚ โ”œโ”€โ”€ oci_client.go โ”‚ โ”œโ”€โ”€ helm_client.go โ”‚ โ””โ”€โ”€ metrics_client.go โ”‚ โ”œโ”€โ”€ adapter/ โ”‚ โ”œโ”€โ”€ input/ # ๐Ÿ“ฅ ่พ“ๅ…ฅ้€‚้…ๅ™จ โ”‚ โ”‚ โ””โ”€โ”€ http/ โ”‚ โ”‚ โ”œโ”€โ”€ rest/ # REST API Handlers โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ auth_handler.go โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ cluster_handler.go โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ registry_handler.go โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ artifact_handler.go โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ instance_handler.go โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ monitoring_handler.go โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ utils.go โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ dto/ # ๆ•ฐๆฎไผ ่พ“ๅฏน่ฑก โ”‚ โ”‚ โ”œโ”€โ”€ auth_dto.go โ”‚ โ”‚ โ”œโ”€โ”€ cluster_dto.go โ”‚ โ”‚ โ”œโ”€โ”€ registry_dto.go โ”‚ โ”‚ โ””โ”€โ”€ instance_dto.go โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ output/ # ๐Ÿ“ค ่พ“ๅ‡บ้€‚้…ๅ™จ โ”‚ โ”œโ”€โ”€ persistence/ โ”‚ โ”‚ โ”œโ”€โ”€ mock/ # โœ… Mock ๅฎž็Žฐ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ user_repository_mock.go โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ cluster_repository_mock.go โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ registry_repository_mock.go โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ instance_repository_mock.go โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ postgres/ # ๐Ÿ˜ PostgreSQL ๅฎž็Žฐ โ”‚ โ”‚ โ”œโ”€โ”€ user_repository.go โ”‚ โ”‚ โ”œโ”€โ”€ cluster_repository.go โ”‚ โ”‚ โ”œโ”€โ”€ registry_repository.go โ”‚ โ”‚ โ””โ”€โ”€ instance_repository.go โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ oci/ โ”‚ โ”‚ โ”œโ”€โ”€ mock/ # โœ… Mock OCI Client โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ oci_client_mock.go โ”‚ โ”‚ โ””โ”€โ”€ oras_client.go # ORAS SDK ๅฎž็Žฐ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ helm/ โ”‚ โ”‚ โ”œโ”€โ”€ mock/ # โœ… Mock Helm Client โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ helm_client_mock.go โ”‚ โ”‚ โ””โ”€โ”€ helm_client.go # Helm SDK ๅฎž็Žฐ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ metrics/ โ”‚ โ”‚ โ”œโ”€โ”€ mock/ # โœ… Mock Metrics Client โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ metrics_client_mock.go โ”‚ โ”‚ โ””โ”€โ”€ prometheus_client.go โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ factory.go # ๐Ÿญ ้€‚้…ๅ™จๅทฅๅŽ‚ โ”‚ โ”œโ”€โ”€ bootstrap/ # Bootstrap ้ข„ๆณจๅ…ฅๆจกๅ— โ”‚ โ”œโ”€โ”€ config.go โ”‚ โ””โ”€โ”€ seeder.go โ”‚ โ””โ”€โ”€ pkg/ # ๐Ÿ”ง ๅทฅๅ…ทๅŒ… โ”œโ”€โ”€ jwt/ # JWT ๅทฅๅ…ท โ”œโ”€โ”€ password/ # ๅฏ†็ ๅ“ˆๅธŒ โ””โ”€โ”€ encryption/ # AES ๅŠ ๅฏ† ``` ### ๆ•ฐๆฎๆต ``` 1. HTTP Request โ†“ 2. [REST Handler] (Input Adapter) - ้ชŒ่ฏ่ฏทๆฑ‚ๅ‚ๆ•ฐ - ่ฝฌๆขไธบ Domain ๅฏน่ฑก๏ผˆEntity๏ผ‰ โ†“ 3. [Domain Service] (Business Logic) - ๆ‰ง่กŒไธšๅŠก้€ป่พ‘ - ่ฐƒ็”จ Repository ๆŽฅๅฃ๏ผˆPort๏ผ‰ โ†“ 4. [Repository Implementation] (Output Adapter) - Mock: ๆ“ไฝœๅ†…ๅญ˜ๆ•ฐๆฎ - PostgreSQL: ๆ“ไฝœๆ•ฐๆฎๅบ“ - ORAS: ไธŽ OCI Registry ไบคไบ’ - Helm: ไธŽ Kubernetes ไบคไบ’ โ†“ 5. Response - ่ฟ”ๅ›ž็ป“ๆžœๅˆฐ Service - Service ่ฟ”ๅ›žๅˆฐ Handler - Handler ่ฝฌๆขไธบ HTTP ๅ“ๅบ” ``` ### ไพ่ต–ๆณจๅ…ฅ ๅœจ `cmd/api/main.go` ไธญ็ป„่ฃ…ๆ‰€ๆœ‰็ป„ไปถ๏ผš ```go func main() { // 1. ๅŠ ่ฝฝ้…็ฝฎ config := loadConfig() // 2. ๅˆ›ๅปบ้€‚้…ๅ™จๅทฅๅŽ‚ factory := output.NewAdapterFactory( config.AdapterMode, config.DatabaseURL, ) // 3. ๅˆ›ๅปบ Output Adapters repos, _ := factory.CreateAllRepositories() ociClient, _ := factory.CreateOCIClient() helmClient, _ := factory.CreateHelmClient() // 4. ๅˆ›ๅปบๅทฅๅ…ท็ฑป hasher := password.NewBcryptHasher() jwtGen := jwt.NewJWTGenerator(config.JWTSecret) // 5. ๅˆ›ๅปบ Domain Services authService := service.NewAuthService(repos.UserRepo, hasher, jwtGen) clusterService := service.NewClusterService(repos.ClusterRepo) registryService := service.NewRegistryService(repos.RegistryRepo) instanceService := service.NewInstanceService( repos.InstanceRepo, repos.ClusterRepo, repos.RegistryRepo, helmClient, ) // 6. ๅˆ›ๅปบ Input Adapters (REST Handlers) authHandler := rest.NewAuthHandler(authService) clusterHandler := rest.NewClusterHandler(clusterService) instanceHandler := rest.NewInstanceHandler(instanceService) // 7. ่ฎพ็ฝฎ่ทฏ็”ฑ router := setupRouter( authHandler, clusterHandler, instanceHandler, ) // 8. ๅฏๅŠจๆœๅŠกๅ™จ http.ListenAndServe(":8080", router) } ``` ### ้€‚้…ๅ™จๆจกๅผ #### ้€‚้…ๅ™จๅทฅๅŽ‚ ```go // internal/adapter/output/factory.go type AdapterMode string const ( ModeMock AdapterMode = "mock" ModeProduction AdapterMode = "production" ) type AdapterFactory struct { mode AdapterMode dbConnString string } func (f *AdapterFactory) CreateUserRepository() (repository.UserRepository, error) { switch f.mode { case ModeMock: return mock.NewUserRepositoryMock(), nil case ModeProduction: return postgres.NewUserRepository(f.dbConnString) default: return nil, fmt.Errorf("unknown adapter mode: %s", f.mode) } } ``` #### Mock vs Production | ๆŽฅๅฃ | Mock ๆจกๅผ | Production ๆจกๅผ | |------|----------|----------------| | UserRepository | โœ… ๅ†…ๅญ˜ map | ๐Ÿ˜ PostgreSQL | | ClusterRepository | โœ… ๅ†…ๅญ˜ map | ๐Ÿ˜ PostgreSQL | | RegistryRepository | โœ… ๅ†…ๅญ˜ map | ๐Ÿ˜ PostgreSQL | | InstanceRepository | โœ… ๅ†…ๅญ˜ map | ๐Ÿ˜ PostgreSQL | | OCIClient | โœ… ้™ๆ€ๆ•ฐๆฎ | ๐ŸŒ ORAS SDK v2 | | HelmClient | โœ… ๆจกๆ‹Ÿ้ƒจ็ฝฒ | โ˜ธ๏ธ Helm SDK | | MetricsClient | โœ… ๅ‡ๆ•ฐๆฎ | ๐Ÿ“Š Prometheus | --- ## 2.1.3.2 ๆŠ€ๆœฏ้€‰ๅž‹ ### ็ผ–็จ‹่ฏญ่จ€ **Go 1.21+** **้€‰ๅž‹็†็”ฑ**: - โœ… ้ซ˜ๆ€ง่ƒฝ๏ผŒๅŽŸ็”Ÿๅนถๅ‘ๆ”ฏๆŒ - โœ… ้™ๆ€็ฑปๅž‹๏ผŒ็ผ–่ฏ‘ๆ—ถๆฃ€ๆŸฅ - โœ… ไธฐๅฏŒ็š„ไบ‘ๅŽŸ็”Ÿ็”Ÿๆ€๏ผˆKubernetes client-goใ€Helm SDKใ€ORAS๏ผ‰ - โœ… ็ฎ€ๅ•ๆ˜“็ปดๆŠค๏ผŒ้ƒจ็ฝฒๆ–นไพฟ๏ผˆๅ•ไธ€ไบŒ่ฟ›ๅˆถๆ–‡ไปถ๏ผ‰ - โœ… ๅนฟๆณ›ๅบ”็”จไบŽไบ‘ๅŽŸ็”Ÿ้ข†ๅŸŸ **ๆ›ฟไปฃๆ–นๆกˆ**: Java/Spring Boot, Python/FastAPI --- ### Web ๆก†ๆžถ **gorilla/mux** **้€‰ๅž‹็†็”ฑ**: - โœ… ่ฝป้‡็บง๏ผŒๆ€ง่ƒฝๅฅฝ - โœ… ็ตๆดป็š„่ทฏ็”ฑๅŒน้…๏ผˆๆ”ฏๆŒๆญฃๅˆ™่กจ่พพๅผ๏ผ‰ - โœ… ไธŽๆ ‡ๅ‡†ๅบ“ `net/http` ๅฎŒ็พŽๅ…ผๅฎน - โœ… ๆดป่ทƒ็š„็คพๅŒบๆ”ฏๆŒ **ไฝฟ็”จ็คบไพ‹**: ```go router := mux.NewRouter() api := router.PathPrefix("/api/v1").Subrouter() api.HandleFunc("/clusters", handler.CreateCluster).Methods(http.MethodPost) api.HandleFunc("/clusters/{clusterId}", handler.GetCluster).Methods(http.MethodGet) ``` **ๆ›ฟไปฃๆ–นๆกˆ**: Gin, Echo, Fiber --- ### ๆ•ฐๆฎๅบ“ **PostgreSQL 15+** **้€‰ๅž‹็†็”ฑ**: - โœ… ๅผ€ๆบใ€ๆˆ็†Ÿใ€ๅฏ้  - โœ… ๆ”ฏๆŒๅคๆ‚ๆŸฅ่ฏขๅ’Œไบ‹ๅŠก - โœ… JSONB ็ฑปๅž‹้€‚ๅˆๅญ˜ๅ‚จๅŠจๆ€้…็ฝฎ - โœ… ไธปไปŽๅคๅˆถใ€้ซ˜ๅฏ็”จๆ”ฏๆŒ - โœ… ไธŽ Go ็”Ÿๆ€้›†ๆˆ่‰ฏๅฅฝ **ๆ•ฐๆฎๅบ“้ฉฑๅŠจ**: `lib/pq` ๆˆ– `pgx` **ๆ›ฟไปฃๆ–นๆกˆ**: MySQL, MongoDB --- ### OCI Registry ๅฎขๆˆท็ซฏ **ORAS Go SDK v2** **้€‰ๅž‹็†็”ฑ**: - โœ… ็ฌฆๅˆ OCI Distribution Specification - โœ… ๅฎ˜ๆ–น็ปดๆŠค๏ผŒ่ดจ้‡ๅฏ้  - โœ… ๆ”ฏๆŒๆ‰€ๆœ‰ OCI ๅ…ผๅฎน็š„ Registry - โœ… ๅฎŒๆ•ด็š„ manifestใ€blob ๆ“ไฝœ **ไฝฟ็”จ็คบไพ‹**: ```go repo, err := remote.NewRepository("harbor.example.com/charts/nginx") repo.Client = &auth.Client{ Credential: auth.StaticCredential("username", "password"), } tags, err := repo.Tags(ctx) manifest, err := repo.FetchReference(ctx, "1.0.0") ``` **ๅฎ˜็ฝ‘**: https://oras.land/ **ๆ›ฟไปฃๆ–นๆกˆ**: containerd, go-containerregistry --- ### Kubernetes ๅฎขๆˆท็ซฏ **client-go** **้€‰ๅž‹็†็”ฑ**: - โœ… Kubernetes ๅฎ˜ๆ–น Go ๅฎขๆˆท็ซฏ - โœ… ๅฎŒๆ•ด็š„ API ๆ”ฏๆŒ - โœ… ๅŠจๆ€ๅฎขๆˆท็ซฏๆ”ฏๆŒ - โœ… ไธŽ Helm SDK ้›†ๆˆ **ไฝฟ็”จ็คบไพ‹**: ```go config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) clientset, err := kubernetes.NewForConfig(config) pods, err := clientset.CoreV1().Pods("default").List(ctx, metav1.ListOptions{}) ``` **ๆ›ฟไปฃๆ–นๆกˆ**: ๆ— ๏ผˆๆ ‡ๅ‡†ๅบ“๏ผ‰ --- ### Helm ๅฎขๆˆท็ซฏ **Helm SDK (helm.sh/helm/v3)** **้€‰ๅž‹็†็”ฑ**: - โœ… Helm ๅฎ˜ๆ–น SDK - โœ… ๅฎŒๆ•ด็š„ Helm ๆ“ไฝœๆ”ฏๆŒ - โœ… Chart ่งฃๆžๅ’ŒๆธฒๆŸ“ - โœ… Release ็”Ÿๅ‘ฝๅ‘จๆœŸ็ฎก็† **ไฝฟ็”จ็คบไพ‹**: ```go actionConfig := new(action.Configuration) actionConfig.Init(settings.RESTClientGetter(), namespace, os.Getenv("HELM_DRIVER"), log.Printf) install := action.NewInstall(actionConfig) install.ReleaseName = "my-release" install.Namespace = "default" chart, err := loader.Load(chartPath) release, err := install.Run(chart, values) ``` **ๆ›ฟไปฃๆ–นๆกˆ**: ๅ‘ฝไปค่กŒ่ฐƒ็”จ helm๏ผˆไธๆŽจ่๏ผ‰ --- ### ่ฎค่ฏๅ’ŒๆŽˆๆƒ **JWT (golang-jwt/jwt)** **้€‰ๅž‹็†็”ฑ**: - โœ… ๆ— ็Šถๆ€๏ผŒๆ˜“ๆ‰ฉๅฑ• - โœ… ๆ ‡ๅ‡†ๅŒ–๏ผˆRFC 7519๏ผ‰ - โœ… ๆ”ฏๆŒ่ฟ‡ๆœŸๆ—ถ้—ดๅ’Œๅˆทๆ–ฐ - โœ… ๅนฟๆณ›ๅบ”็”จ **ไฝฟ็”จ็คบไพ‹**: ```go token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "user_id": user.ID, "exp": time.Now().Add(time.Hour * 24).Unix(), }) tokenString, err := token.SignedString([]byte(jwtSecret)) ``` **ๆ›ฟไปฃๆ–นๆกˆ**: OAuth 2.0, Session --- ### ๅฏ†็ ๅ“ˆๅธŒ **bcrypt (golang.org/x/crypto/bcrypt)** **้€‰ๅž‹็†็”ฑ**: - โœ… ๅฎ‰ๅ…จใ€ๆŠ—ๆšดๅŠ›็ ด่งฃ - โœ… ่‡ชๅŠจๅŠ ็› - โœ… ่ฎก็ฎ—ๆˆๆœฌๅฏ่ฐƒ - โœ… Go ๆ ‡ๅ‡†ๆ‰ฉๅฑ•ๅบ“ **ไฝฟ็”จ็คบไพ‹**: ```go hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) err = bcrypt.CompareHashAndPassword(hash, []byte(password)) ``` **ๆ›ฟไปฃๆ–นๆกˆ**: argon2, scrypt --- ### ๆ•ฐๆฎๅŠ ๅฏ† **AES-256 (crypto/aes + crypto/cipher)** **้€‰ๅž‹็†็”ฑ**: - โœ… ๅฏน็งฐๅŠ ๅฏ†๏ผŒๆ€ง่ƒฝๅฅฝ - โœ… 256 ไฝๅฏ†้’ฅ๏ผŒๅฎ‰ๅ…จๆ€ง้ซ˜ - โœ… Go ๆ ‡ๅ‡†ๅบ“ๆ”ฏๆŒ - โœ… ้€‚ๅˆๆ•ๆ„Ÿๆ•ฐๆฎๅŠ ๅฏ†๏ผˆ่ฏไนฆใ€ๅฏ†็ ๏ผ‰ **ไฝฟ็”จๆจกๅผ**: GCM๏ผˆGalois/Counter Mode๏ผ‰ **ไฝฟ็”จ็คบไพ‹**: ```go block, err := aes.NewCipher(key) // 32 bytes key gcm, err := cipher.NewGCM(block) nonce := make([]byte, gcm.NonceSize()) ciphertext := gcm.Seal(nonce, nonce, plaintext, nil) ``` **ๆ›ฟไปฃๆ–นๆกˆ**: RSA (้žๅฏน็งฐๅŠ ๅฏ†๏ผŒๆ€ง่ƒฝ่พƒๅทฎ) --- ### ๅฎนๅ™จๅŒ– **Docker + Docker Compose** **้€‰ๅž‹็†็”ฑ**: - โœ… ๆ ‡ๅ‡†ๅŒ–ๅฎนๅ™จๆŠ€ๆœฏ - โœ… ็ฎ€ๅŒ–้ƒจ็ฝฒๅ’Œ็Žฏๅขƒไธ€่‡ดๆ€ง - โœ… ไธฐๅฏŒ็š„้•œๅƒ็”Ÿๆ€ - โœ… Docker Compose ็ฎ€ๅŒ–ๅคšๅฎนๅ™จ็ผ–ๆŽ’ **Dockerfile ็คบไพ‹**: ```dockerfile FROM golang:1.21-alpine AS builder WORKDIR /app COPY . . RUN go build -o ocdp-backend cmd/api/main.go FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /app/ocdp-backend . EXPOSE 8080 CMD ["./ocdp-backend"] ``` **ๆ›ฟไปฃๆ–นๆกˆ**: Podman, containerd --- ### ๆ—ฅๅฟ—่ฎฐๅฝ• **ๆ ‡ๅ‡†ๅบ“ log + ็ป“ๆž„ๅŒ–ๆ—ฅๅฟ—๏ผˆๆœชๆฅ๏ผšzerolog/zap๏ผ‰** **ๅฝ“ๅ‰ๅฎž็Žฐ**: ```go log.Printf("โœ… User created: %s", user.Username) log.Printf("โš ๏ธ Warning: %v", err) log.Printf("โŒ Error: %v", err) ``` **ๆœชๆฅไผ˜ๅŒ–**: ```go logger.Info(). Str("user_id", user.ID). Str("username", user.Username). Msg("User created") ``` --- ### ๆต‹่ฏ•ๆก†ๆžถ **testify** **้€‰ๅž‹็†็”ฑ**: - โœ… ไธฐๅฏŒ็š„ๆ–ญ่จ€ๅ‡ฝๆ•ฐ - โœ… Mock ๆ”ฏๆŒ - โœ… ๆต‹่ฏ•ๅฅ—ไปถๆ”ฏๆŒ - โœ… ๆดป่ทƒ็š„็คพๅŒบ **ไฝฟ็”จ็คบไพ‹**: ```go import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestCreateUser(t *testing.T) { user, err := service.CreateUser(ctx, "test", "password") require.NoError(t, err) assert.NotEmpty(t, user.ID) assert.Equal(t, "test", user.Username) } ``` --- ### ็ƒญ้‡่ฝฝ๏ผˆๅผ€ๅ‘๏ผ‰ **Air** **้€‰ๅž‹็†็”ฑ**: - โœ… Go ้กน็›ฎ็ƒญ้‡่ฝฝ - โœ… ็›‘ๅฌๆ–‡ไปถๅ˜ๅŒ–่‡ชๅŠจ้‡ๅฏ - โœ… ้…็ฝฎ็ฎ€ๅ• **้…็ฝฎๆ–‡ไปถ**: `.air.toml` ```toml [build] cmd = "go build -o ./tmp/main cmd/api/main.go" bin = "./tmp/main" include_ext = ["go", "yaml", "json"] exclude_dir = ["tmp", "vendor"] ``` **ๅฏๅŠจ**: `air -c .air.toml` --- ### ๆŠ€ๆœฏๆ ˆๆ€ป็ป“่กจ | ็ป„ไปถ | ๆŠ€ๆœฏ | ็‰ˆๆœฌ | ็”จ้€” | |------|------|------|------| | **่ฏญ่จ€** | Go | 1.21+ | ไธป่ฆ็ผ–็จ‹่ฏญ่จ€ | | **Web ๆก†ๆžถ** | gorilla/mux | latest | HTTP ่ทฏ็”ฑ | | **ๆ•ฐๆฎๅบ“** | PostgreSQL | 15+ | ๆŒไน…ๅŒ–ๅญ˜ๅ‚จ | | **ๆ•ฐๆฎๅบ“้ฉฑๅŠจ** | lib/pq ๆˆ– pgx | latest | Go ๆ•ฐๆฎๅบ“้ฉฑๅŠจ | | **OCI ๅฎขๆˆท็ซฏ** | ORAS Go SDK | v2 | OCI Registry ๆ“ไฝœ | | **Kubernetes** | client-go | latest | K8s API ไบคไบ’ | | **Helm** | Helm SDK | v3 | Helm ๆ“ไฝœ | | **JWT** | golang-jwt/jwt | v5 | ่ฎค่ฏ Token | | **ๅฏ†็ ๅ“ˆๅธŒ** | bcrypt | latest | ๅฏ†็ ๅŠ ๅฏ† | | **ๆ•ฐๆฎๅŠ ๅฏ†** | AES-256 | stdlib | ๆ•ๆ„Ÿๆ•ฐๆฎๅŠ ๅฏ† | | **ๅฎนๅ™จๅŒ–** | Docker | latest | ๅบ”็”จๅฎนๅ™จๅŒ– | | **็ผ–ๆŽ’** | Docker Compose | latest | ๅคšๅฎนๅ™จ็ผ–ๆŽ’ | | **ๆต‹่ฏ•** | testify | latest | ๅ•ๅ…ƒๆต‹่ฏ• | | **็ƒญ้‡่ฝฝ** | Air | latest | ๅผ€ๅ‘็Žฏๅขƒ | --- ### Bootstrap ้ข„ๆณจๅ…ฅ **ๆฆ‚่ฟฐ**: ๅœจๅบ”็”จๅฏๅŠจๆ—ถ่‡ชๅŠจๅˆๅง‹ๅŒ–็”จๆˆทใ€Registryใ€Cluster ็ญ‰ๆ•ฐๆฎใ€‚ **้…็ฝฎๆ–‡ไปถ**: `config/bootstrap.json` ```json { "enabled": true, "users": [ { "username": "admin", "password": "admin123", "email": "admin@example.com" } ], "registries": [ { "name": "Harbor Production", "url": "https://harbor.example.com", "username": "admin", "password": "secret" } ], "clusters": [ { "name": "Production Cluster", "host": "https://k8s.example.com:6443", "caData": "LS0tLS...", "certData": "LS0tLS...", "keyData": "LS0tLS..." } ] } ``` **็‰นๆ€ง**: - โœ… ่‡ชๅŠจๅŠ ๅฏ†ๆ•ๆ„Ÿๆ•ฐๆฎ - โœ… ๅน‚็ญ‰ๆ€ง๏ผˆ้‡ๅคๅฏๅŠจไธไผš้‡ๅคๅˆ›ๅปบ๏ผ‰ - โœ… ๅฏ้€š่ฟ‡็Žฏๅขƒๅ˜้‡้…็ฝฎ - โœ… ๆ”ฏๆŒ็ฆ็”จ **ไปŽ kubeconfig ๆๅ–่ฏไนฆ**: ```bash kubectl config view --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' kubectl config view --raw -o jsonpath='{.users[0].user.client-certificate-data}' kubectl config view --raw -o jsonpath='{.users[0].user.client-key-data}' ``` --- ### ๅผ€ๅ‘ๆŒ‡ๅ— #### ๆทปๅŠ ๆ–ฐๅŠŸ่ƒฝ็š„ๆญฅ้ชค 1. **ๅฎšไน‰ Entity** (`internal/domain/entity/`) 2. **ๅฎšไน‰ Repository ๆŽฅๅฃ** (`internal/domain/repository/`) 3. **ๅฎž็Žฐ Domain Service** (`internal/domain/service/`) 4. **ๅฎž็Žฐ Mock Adapter** (`internal/adapter/output/persistence/mock/`) 5. **ๅฎž็Žฐ Production Adapter** (`internal/adapter/output/persistence/postgres/`) 6. **ๆทปๅŠ ๅˆฐ Factory** (`internal/adapter/output/factory.go`) 7. **ๅˆ›ๅปบ REST Handler** (`internal/adapter/input/http/rest/`) 8. **ๆณจๅ†Œ่ทฏ็”ฑ** (`cmd/api/main.go`) #### ไพ่ต–ๆ–นๅ‘่ง„ๅˆ™ - โœ… Input Adapters โ†’ Domain Layer - โœ… Domain Layer โ†’ Repository Interfaces - โœ… Output Adapters โ†’ Domain Layer (ๅฎž็ŽฐๆŽฅๅฃ) - โŒ Domain Layer โ†’ Output Adapters๏ผˆ็ฆๆญข๏ผ‰ #### ๆต‹่ฏ•็ญ–็•ฅ - **ๅ•ๅ…ƒๆต‹่ฏ•**: ๆต‹่ฏ• Domain Service๏ผŒไฝฟ็”จ Mock Repository - **้›†ๆˆๆต‹่ฏ•**: ๆต‹่ฏ• Handler + Service๏ผŒไฝฟ็”จ Mock Adapters - **E2E ๆต‹่ฏ•**: ๅฎŒๆ•ดๆต็จ‹ๆต‹่ฏ•๏ผŒไฝฟ็”จ็œŸๅฎž็Žฏๅขƒ --- ## ็›ธๅ…ณๆ–‡ๆกฃ - [API ไธŽๆต‹่ฏ•](api-and-test.md) - [้ƒจ็ฝฒๆ–‡ๆกฃ](deployment.md) - [ไธป README](../README.md) --- **Last Updated**: 2025-11-09