feat: add platform deployment artifacts
This commit is contained in:
86
catalog-info.yaml
Normal file
86
catalog-info.yaml
Normal file
@@ -0,0 +1,86 @@
|
||||
apiVersion: backstage.io/v1alpha1
|
||||
kind: Component
|
||||
metadata:
|
||||
annotations:
|
||||
backstage.io/kubernetes-label-selector: app=mohamed-node-mod-1
|
||||
backstage.io/kubernetes-namespace: dev
|
||||
backstage.io/techdocs-ref: dir:.
|
||||
gitea.kyndemo.live/repo-slug: demo-platform/mohamed-node-mod-1
|
||||
grafana/alert-label-selector: app=mohamed-node-mod-1
|
||||
grafana/dashboard-selector: uid == 'app-mohamed-node-mod-1'
|
||||
grafana/grafana-instance: default
|
||||
humanitec.dev/orgId: skillful-wild-chicken-2617
|
||||
humanitec.dev/projectId: mohamed-node-mod-1
|
||||
prometheus.io/path: /metrics
|
||||
prometheus.io/port: '3000'
|
||||
prometheus.io/scrape: 'true'
|
||||
description: Modernized mohamed-node-mod-1 service
|
||||
links:
|
||||
- icon: web
|
||||
title: Live API
|
||||
url: https://mohamed-node-mod-1.kyndemo.live
|
||||
- icon: code
|
||||
title: API Specification
|
||||
url: https://gitea.kyndemo.live/demo-platform/mohamed-node-mod-1/raw/branch/main/openapi.yaml
|
||||
- icon: github
|
||||
title: Source Repository
|
||||
url: https://gitea.kyndemo.live/demo-platform/mohamed-node-mod-1
|
||||
- icon: dashboard
|
||||
title: Humanitec Console
|
||||
url: https://console.humanitec.dev/orgs/skillful-wild-chicken-2617/projects/mohamed-node-mod-1/environments/dev
|
||||
- icon: code
|
||||
title: CI/CD Pipelines
|
||||
url: https://gitea.kyndemo.live/demo-platform/mohamed-node-mod-1/actions
|
||||
- icon: dashboard
|
||||
title: Grafana Dashboard
|
||||
url: https://grafana.kyndemo.live/d/app-mohamed-node-mod-1
|
||||
name: mohamed-node-mod-1
|
||||
tags:
|
||||
- nodejs
|
||||
- express
|
||||
- golden-path
|
||||
- humanitec-v2
|
||||
- platform-orchestrator
|
||||
- score
|
||||
spec:
|
||||
lifecycle: production
|
||||
owner: group:default/platform-engineering
|
||||
providesApis:
|
||||
- api:default/mohamed-node-mod-1-api
|
||||
system: mohamed-node-mod-1-system
|
||||
type: service
|
||||
---
|
||||
apiVersion: backstage.io/v1alpha1
|
||||
kind: System
|
||||
metadata:
|
||||
annotations:
|
||||
humanitec.dev/orgId: skillful-wild-chicken-2617
|
||||
humanitec.dev/projectId: mohamed-node-mod-1
|
||||
description: System grouping for the mohamed-node-mod-1 application
|
||||
name: mohamed-node-mod-1-system
|
||||
spec:
|
||||
domain: platform
|
||||
owner: group:default/platform-engineering
|
||||
---
|
||||
apiVersion: backstage.io/v1alpha1
|
||||
kind: API
|
||||
metadata:
|
||||
annotations:
|
||||
backstage.io/techdocs-ref: dir:.
|
||||
gitea.kyndemo.live/repo-slug: demo-platform/mohamed-node-mod-1
|
||||
description: OpenAPI definition for mohamed-node-mod-1
|
||||
name: mohamed-node-mod-1-api
|
||||
tags:
|
||||
- nodejs
|
||||
- express
|
||||
- golden-path
|
||||
- humanitec-v2
|
||||
- platform-orchestrator
|
||||
- score
|
||||
spec:
|
||||
definition:
|
||||
$text: https://gitea.kyndemo.live/demo-platform/mohamed-node-mod-1/raw/branch/main/openapi.yaml
|
||||
lifecycle: production
|
||||
owner: group:default/platform-engineering
|
||||
system: mohamed-node-mod-1-system
|
||||
type: openapi
|
||||
25
docs/api.md
Normal file
25
docs/api.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# API Reference
|
||||
|
||||
## Endpoints
|
||||
|
||||
### Health Check
|
||||
|
||||
```
|
||||
GET /health
|
||||
```
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{"status": "UP", "service": "mohamed-node-mod-1"}
|
||||
```
|
||||
|
||||
### Root
|
||||
|
||||
```
|
||||
GET /
|
||||
```
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{"service": "mohamed-node-mod-1", "description": "Modernized mohamed-node-mod-1 service", "version": "1.0.0"}
|
||||
```
|
||||
15
docs/architecture.md
Normal file
15
docs/architecture.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Architecture
|
||||
|
||||
## Service Design
|
||||
|
||||
mohamed-node-mod-1 is a microservice following cloud-native patterns.
|
||||
|
||||
## Technology Stack
|
||||
|
||||
- **Runtime**: Node.js Express
|
||||
- **Deployment**: Humanitec Platform Orchestrator
|
||||
- **CI/CD**: Gitea Actions → ACR → Humanitec
|
||||
|
||||
## Dependencies
|
||||
|
||||
See `score.yaml` for external resource dependencies.
|
||||
32
docs/index.md
Normal file
32
docs/index.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# mohamed-node-mod-1
|
||||
|
||||
Modernized mohamed-node-mod-1 service
|
||||
|
||||
## Overview
|
||||
|
||||
This service is built with **Node.js Express** and follows the Golden Path architecture patterns.
|
||||
|
||||
### Key Features
|
||||
|
||||
- 🚀 Production-ready configuration
|
||||
- 📊 Prometheus metrics exposed
|
||||
- 🏥 Health check endpoints
|
||||
- 🔒 Security scanning in CI/CD
|
||||
- 📦 Containerized deployment
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
git clone https://gitea.kyndemo.live/kyndryl-demos/mohamed-node-mod-1.git
|
||||
cd mohamed-node-mod-1
|
||||
```
|
||||
|
||||
## Monitoring
|
||||
|
||||
- **Metrics**: Prometheus metrics at `/metrics`
|
||||
- **Health**: `/health`
|
||||
- **Grafana**: [View Dashboard](https://grafana.kyndemo.live/d/app-mohamed-node-mod-1)
|
||||
|
||||
## Support
|
||||
|
||||
Contact the Platform Engineering team.
|
||||
51
docs/migration-plan.md
Normal file
51
docs/migration-plan.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# Modernization Plan for mohamed-node-mod-1
|
||||
|
||||
## Application Type
|
||||
Nodejs Application
|
||||
|
||||
## Selected Modernization Strategy
|
||||
- **Migration Approach**: containerize-optimize
|
||||
- **Target Platform**: kubernetes-humanitec
|
||||
- **Observability**: ENABLED (Prometheus metrics, health checks, tracing)
|
||||
- **Security Scanning**: ENABLED (Trivy vulnerability scanning)
|
||||
|
||||
## Discovery Summary
|
||||
### Discovery Report
|
||||
|
||||
#### Application Overview
|
||||
- **Path**: `/tmp/modernize_mj1ov94n`
|
||||
- **Type**: Node.js application
|
||||
- **Language**: TypeScript
|
||||
- **Build Tools**: npm
|
||||
- **Linting/Formatting**: ESLint, Prettier
|
||||
|
||||
#### Technology Stack
|
||||
- **Framework**: Express.js
|
||||
- **Database Client**: Prisma
|
||||
- **Authentication**: JSON Web Tokens (JWT)
|
||||
- **Other Utilities**:
|
||||
- Axios (HTTP client)
|
||||
- bcryptjs (Password hashing)
|
||||
- cors (Cross-Origin Resource Sharing)
|
||||
- body-parser (Request body parsing)
|
||||
- s...
|
||||
|
||||
## Generated Artifacts
|
||||
1. **Dockerfile**: Optimized with health checks and metrics endpoints
|
||||
2. **score.yaml**: Platform-agnostic environment intent optimized for kubernetes-humanitec with Prometheus metrics resources
|
||||
3. **CI Workflow**: Automated build/push to ACR with Trivy security scanning
|
||||
|
||||
## Next Steps
|
||||
1. Review and customize generated artifacts
|
||||
2. Test container build and run
|
||||
3. Deploy to development environment using score.yaml
|
||||
4. Validate application functionality
|
||||
5. Promote to staging/production via Humanitec
|
||||
|
||||
## Migration Strategy Details
|
||||
|
||||
### Containerize Optimize
|
||||
Add cloud-native patterns: health checks, metrics, optimized base images.
|
||||
|
||||
### Platform: kubernetes-humanitec
|
||||
score.yaml is the single environment intent. Use Humanitec Platform Orchestrator for deployment.
|
||||
13
mkdocs.yml
Normal file
13
mkdocs.yml
Normal file
@@ -0,0 +1,13 @@
|
||||
site_name: mohamed-node-mod-1
|
||||
site_description: Modernized mohamed-node-mod-1 service
|
||||
|
||||
nav:
|
||||
- Home: index.md
|
||||
- Architecture: architecture.md
|
||||
- API Reference: api.md
|
||||
|
||||
plugins:
|
||||
- techdocs-core
|
||||
|
||||
theme:
|
||||
name: material
|
||||
350
openapi.yaml
Normal file
350
openapi.yaml
Normal file
@@ -0,0 +1,350 @@
|
||||
openapi: 3.0.3
|
||||
info:
|
||||
title: mohamed-node-mod-1
|
||||
description: Modernized mohamed-node-mod-1 service
|
||||
version: 1.0.0
|
||||
servers:
|
||||
- url: https://mohamed-node-mod-1.kyndemo.live
|
||||
description: Production
|
||||
- url: http://localhost:3000
|
||||
description: Local development
|
||||
paths:
|
||||
/health:
|
||||
get:
|
||||
summary: Health check
|
||||
operationId: getHealth
|
||||
tags:
|
||||
- System
|
||||
responses:
|
||||
'200':
|
||||
description: Healthy
|
||||
/api/articles:
|
||||
get:
|
||||
summary: GET /api/articles
|
||||
operationId: getApi_articles
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
post:
|
||||
summary: POST /api/articles
|
||||
operationId: postApi_articles
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
/api/articles/feed:
|
||||
get:
|
||||
summary: GET /api/articles/feed
|
||||
operationId: getApi_articles_feed
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
/api/articles/{slug}:
|
||||
get:
|
||||
summary: GET /api/articles/{slug}
|
||||
operationId: getApi_articles_slug
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
parameters:
|
||||
- name: slug
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
put:
|
||||
summary: PUT /api/articles/{slug}
|
||||
operationId: putApi_articles_slug
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
parameters:
|
||||
- name: slug
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
delete:
|
||||
summary: DELETE /api/articles/{slug}
|
||||
operationId: deleteApi_articles_slug
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
parameters:
|
||||
- name: slug
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
/api/articles/{slug}/comments:
|
||||
get:
|
||||
summary: GET /api/articles/{slug}/comments
|
||||
operationId: getApi_articles_slug_comments
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
parameters:
|
||||
- name: slug
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
post:
|
||||
summary: POST /api/articles/{slug}/comments
|
||||
operationId: postApi_articles_slug_comments
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
parameters:
|
||||
- name: slug
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
/api/articles/{slug}/comments/{id}:
|
||||
delete:
|
||||
summary: DELETE /api/articles/{slug}/comments/{id}
|
||||
operationId: deleteApi_articles_slug_comments_id
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
parameters:
|
||||
- name: slug
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
/api/articles/{slug}/favorite:
|
||||
post:
|
||||
summary: POST /api/articles/{slug}/favorite
|
||||
operationId: postApi_articles_slug_favorite
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
parameters:
|
||||
- name: slug
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
delete:
|
||||
summary: DELETE /api/articles/{slug}/favorite
|
||||
operationId: deleteApi_articles_slug_favorite
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
parameters:
|
||||
- name: slug
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
/api/profiles/{username}:
|
||||
get:
|
||||
summary: GET /api/profiles/{username}
|
||||
operationId: getApi_profiles_username
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
parameters:
|
||||
- name: username
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
/api/profiles/{username}/follow:
|
||||
post:
|
||||
summary: POST /api/profiles/{username}/follow
|
||||
operationId: postApi_profiles_username_follow
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
parameters:
|
||||
- name: username
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
delete:
|
||||
summary: DELETE /api/profiles/{username}/follow
|
||||
operationId: deleteApi_profiles_username_follow
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
parameters:
|
||||
- name: username
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
/api/tags:
|
||||
get:
|
||||
summary: GET /api/tags
|
||||
operationId: getApi_tags
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
/api/user:
|
||||
get:
|
||||
summary: GET /api/user
|
||||
operationId: getApi_user
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
put:
|
||||
summary: PUT /api/user
|
||||
operationId: putApi_user
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
/api/users:
|
||||
post:
|
||||
summary: POST /api/users
|
||||
operationId: postApi_users
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
/api/users/login:
|
||||
post:
|
||||
summary: POST /api/users/login
|
||||
operationId: postApi_users_login
|
||||
responses:
|
||||
'200':
|
||||
description: Success
|
||||
'400':
|
||||
description: Bad request
|
||||
'401':
|
||||
description: Unauthorized
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
/metrics:
|
||||
get:
|
||||
summary: Prometheus metrics
|
||||
operationId: getMetrics
|
||||
tags:
|
||||
- System
|
||||
responses:
|
||||
'200':
|
||||
description: text/plain; Prometheus exposition format
|
||||
29
score.yaml
Normal file
29
score.yaml
Normal file
@@ -0,0 +1,29 @@
|
||||
apiVersion: score.dev/v1b1
|
||||
containers:
|
||||
mohamed-node-mod-1:
|
||||
image: .
|
||||
variables:
|
||||
DATABASE_URL: postgresql://${resources.db.username}:${resources.db.password}@${resources.db.host}:${resources.db.port}/${resources.db.name}
|
||||
NODE_ENV: production
|
||||
PORT: '3000'
|
||||
metadata:
|
||||
annotations:
|
||||
prometheus.io/path: /metrics
|
||||
prometheus.io/port: '3000'
|
||||
prometheus.io/scrape: 'true'
|
||||
labels:
|
||||
app: mohamed-node-mod-1
|
||||
backstage.io/kubernetes-id: mohamed-node-mod-1
|
||||
name: mohamed-node-mod-1
|
||||
resources:
|
||||
db:
|
||||
type: postgres
|
||||
dns:
|
||||
type: dns
|
||||
env:
|
||||
type: environment
|
||||
service:
|
||||
ports:
|
||||
http:
|
||||
port: 3000
|
||||
targetPort: 3000
|
||||
Reference in New Issue
Block a user