Task: Add dockerfile and kube
This commit is contained in:
parent
c72ee8968f
commit
2779aef185
10
.dockerignore
Normal file
10
.dockerignore
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
.gradle/
|
||||||
|
.github/
|
||||||
|
.idea/
|
||||||
|
.m2/
|
||||||
|
.settings
|
||||||
|
.settings.xml
|
||||||
|
.settings.gradle
|
||||||
|
apps/
|
||||||
|
.k8s/
|
||||||
|
README.md
|
12
Dockerfile
12
Dockerfile
@ -1,3 +1,13 @@
|
|||||||
|
FROM cubetiq/openjdk:11u-ubuntu as builder
|
||||||
|
LABEL maintainer="sombochea@cubetiqs.com"
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
RUN apt-get update && apt-get install -y git
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN sh gradlew clean bootJar
|
||||||
|
|
||||||
FROM cubetiq/calpine-openjdk11:latest
|
FROM cubetiq/calpine-openjdk11:latest
|
||||||
LABEL maintainer="sombochea@cubetiqs.com"
|
LABEL maintainer="sombochea@cubetiqs.com"
|
||||||
|
|
||||||
@ -8,7 +18,7 @@ WORKDIR /opt/cubetiq
|
|||||||
VOLUME ["/opt/cubetiq/data"]
|
VOLUME ["/opt/cubetiq/data"]
|
||||||
|
|
||||||
# Copy build source to container
|
# Copy build source to container
|
||||||
COPY api/build/libs/*.jar ./api.jar
|
COPY --from=builder /app/api/build/libs/*.jar ./api.jar
|
||||||
|
|
||||||
ENV APP_DATA_DIR "/opt/cubetiq/data"
|
ENV APP_DATA_DIR "/opt/cubetiq/data"
|
||||||
|
|
||||||
|
@ -32,6 +32,8 @@ springBoot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
|
||||||
|
|
||||||
// Migrating from SpringFox
|
// Migrating from SpringFox
|
||||||
implementation("org.springdoc:springdoc-openapi-ui:1.5.13")
|
implementation("org.springdoc:springdoc-openapi-ui:1.5.13")
|
||||||
|
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package com.cubetiqs.web.config
|
package com.cubetiqs.web.config
|
||||||
|
|
||||||
import com.cubetiqs.web.property.AppProperties
|
import com.cubetiqs.web.property.AppProperties
|
||||||
|
import io.swagger.v3.oas.annotations.OpenAPIDefinition
|
||||||
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType
|
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType
|
||||||
import io.swagger.v3.oas.annotations.security.SecurityScheme
|
import io.swagger.v3.oas.annotations.security.SecurityScheme
|
||||||
|
import io.swagger.v3.oas.annotations.servers.Server
|
||||||
import io.swagger.v3.oas.models.OpenAPI
|
import io.swagger.v3.oas.models.OpenAPI
|
||||||
import io.swagger.v3.oas.models.info.Info
|
import io.swagger.v3.oas.models.info.Info
|
||||||
import io.swagger.v3.oas.models.info.License
|
import io.swagger.v3.oas.models.info.License
|
||||||
@ -18,11 +20,15 @@ import org.springframework.context.annotation.Configuration
|
|||||||
scheme = "bearer",
|
scheme = "bearer",
|
||||||
bearerFormat = "JWT",
|
bearerFormat = "JWT",
|
||||||
)
|
)
|
||||||
|
@OpenAPIDefinition(
|
||||||
|
servers = [
|
||||||
|
Server(url = "/")
|
||||||
|
],
|
||||||
|
)
|
||||||
class OpenApiDocConfig @Autowired constructor(
|
class OpenApiDocConfig @Autowired constructor(
|
||||||
val appProperties: AppProperties,
|
val appProperties: AppProperties,
|
||||||
) {
|
) {
|
||||||
companion object {
|
companion object {
|
||||||
private val ADMIN_API_PATH get() = "/admin/**"
|
|
||||||
private val DEFAULT_API_PATH get() = "/**"
|
private val DEFAULT_API_PATH get() = "/**"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,19 +37,10 @@ class OpenApiDocConfig @Autowired constructor(
|
|||||||
return GroupedOpenApi.builder()
|
return GroupedOpenApi.builder()
|
||||||
.group("default")
|
.group("default")
|
||||||
.pathsToMatch(DEFAULT_API_PATH)
|
.pathsToMatch(DEFAULT_API_PATH)
|
||||||
.pathsToExclude("/error", ADMIN_API_PATH)
|
|
||||||
.packagesToScan("com.cubetiqs.web")
|
.packagesToScan("com.cubetiqs.web")
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
|
||||||
fun adminApi(): GroupedOpenApi {
|
|
||||||
return GroupedOpenApi.builder()
|
|
||||||
.group("admin")
|
|
||||||
.pathsToMatch(ADMIN_API_PATH)
|
|
||||||
.build()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
fun cubetiqOpenAPI(): OpenAPI {
|
fun cubetiqOpenAPI(): OpenAPI {
|
||||||
return OpenAPI()
|
return OpenAPI()
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
package com.cubetiqs.web.controller
|
||||||
|
|
||||||
|
import com.cubetiqs.web.infrastructure.data.Customer
|
||||||
|
import com.cubetiqs.web.infrastructure.repository.CustomerRepository
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
|
import org.springframework.web.bind.annotation.*
|
||||||
|
|
||||||
|
@Tag(name = "Customer")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/customers")
|
||||||
|
class CustomerController @Autowired constructor(
|
||||||
|
private val customerRepository: CustomerRepository,
|
||||||
|
) {
|
||||||
|
@GetMapping
|
||||||
|
fun getAll(): List<Customer> = customerRepository.findAll()
|
||||||
|
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
fun getById(@PathVariable id: String): Customer = customerRepository.findById(id).orElse(null)
|
||||||
|
|
||||||
|
@PostMapping
|
||||||
|
fun create(@RequestBody customer: Customer) = customerRepository.save(customer)
|
||||||
|
|
||||||
|
@DeleteMapping("/{id}")
|
||||||
|
fun delete(@PathVariable id: String) = customerRepository.deleteById(id)
|
||||||
|
|
||||||
|
@PutMapping("/{id}")
|
||||||
|
fun update(@PathVariable id: String, @RequestBody customer: Customer) = customerRepository.save(customer)
|
||||||
|
}
|
@ -12,6 +12,7 @@ import org.springframework.http.ResponseEntity
|
|||||||
import org.springframework.web.bind.annotation.GetMapping
|
import org.springframework.web.bind.annotation.GetMapping
|
||||||
import org.springframework.web.bind.annotation.RequestMapping
|
import org.springframework.web.bind.annotation.RequestMapping
|
||||||
import org.springframework.web.bind.annotation.RestController
|
import org.springframework.web.bind.annotation.RestController
|
||||||
|
import java.net.InetAddress
|
||||||
|
|
||||||
@Tag(name = "Miscellaneous")
|
@Tag(name = "Miscellaneous")
|
||||||
@RestController
|
@RestController
|
||||||
@ -26,14 +27,16 @@ class IndexController @Autowired constructor(
|
|||||||
ApiInfoAuthorResponse(name = "Sambo Chea", email = "sombochea@cubetiqs.com"),
|
ApiInfoAuthorResponse(name = "Sambo Chea", email = "sombochea@cubetiqs.com"),
|
||||||
ApiInfoAuthorResponse(name = "CUBETIQ OSS", email = "oss@cubetiqs.com"),
|
ApiInfoAuthorResponse(name = "CUBETIQ OSS", email = "oss@cubetiqs.com"),
|
||||||
)
|
)
|
||||||
|
val hostname = InetAddress.getLocalHost().hostName
|
||||||
val response = ApiInfoResponse(
|
val response = ApiInfoResponse(
|
||||||
info = "API Operation is running normally on ${environment.activeProfiles.joinToString(separator = ",")}",
|
info = "API Operation is running normally on ${environment.activeProfiles.joinToString(separator = ",")}",
|
||||||
name = buildProperties.name,
|
name = environment.getProperty("spring.application.name") ?: buildProperties.name,
|
||||||
service = buildProperties.artifact,
|
service = buildProperties.artifact,
|
||||||
version = buildProperties.version,
|
version = buildProperties.version,
|
||||||
date = buildProperties.time.toString(),
|
date = buildProperties.time.toString(),
|
||||||
commit = buildProperties["commitId"],
|
commit = buildProperties["commitId"],
|
||||||
authors = authors,
|
authors = authors,
|
||||||
|
hostname = hostname,
|
||||||
)
|
)
|
||||||
return response(response)
|
return response(response)
|
||||||
}
|
}
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
package com.cubetiqs.web.controller.admin
|
|
||||||
|
|
||||||
import com.cubetiqs.web.annotation.ApiBearerAuth
|
|
||||||
import com.cubetiqs.web.controller.BaseController
|
|
||||||
import com.cubetiqs.web.util.RouteConstants
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag
|
|
||||||
import org.springframework.web.bind.annotation.GetMapping
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping
|
|
||||||
import org.springframework.web.bind.annotation.RestController
|
|
||||||
|
|
||||||
@Tag(name = "Admin")
|
|
||||||
@RestController
|
|
||||||
@RequestMapping(RouteConstants.ADMIN)
|
|
||||||
class AdminController : BaseController {
|
|
||||||
@ApiBearerAuth
|
|
||||||
@GetMapping
|
|
||||||
fun getAdmin(): String {
|
|
||||||
return "Admin"
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.cubetiqs.web.infrastructure.data
|
||||||
|
|
||||||
|
import org.springframework.data.annotation.Id
|
||||||
|
import org.springframework.data.mongodb.core.mapping.Document
|
||||||
|
|
||||||
|
@Document(collection = "customer")
|
||||||
|
data class Customer(
|
||||||
|
@Id
|
||||||
|
var id: String? = null,
|
||||||
|
var name: String? = null,
|
||||||
|
var email: String? = null,
|
||||||
|
var phone: String? = null,
|
||||||
|
var address: String? = null,
|
||||||
|
)
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.cubetiqs.web.infrastructure.repository
|
||||||
|
|
||||||
|
import com.cubetiqs.web.infrastructure.data.Customer
|
||||||
|
import org.springframework.data.mongodb.repository.MongoRepository
|
||||||
|
import org.springframework.stereotype.Repository
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
interface CustomerRepository : MongoRepository<Customer, String>
|
@ -1,7 +1,9 @@
|
|||||||
package com.cubetiqs.web.model.response
|
package com.cubetiqs.web.model.response
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude
|
||||||
import io.swagger.v3.oas.annotations.media.Schema
|
import io.swagger.v3.oas.annotations.media.Schema
|
||||||
|
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
@Schema(name = "ApiInfoResponse", description = "ApiInfoResponse")
|
@Schema(name = "ApiInfoResponse", description = "ApiInfoResponse")
|
||||||
data class ApiInfoResponse(
|
data class ApiInfoResponse(
|
||||||
val name: String,
|
val name: String,
|
||||||
@ -10,6 +12,7 @@ data class ApiInfoResponse(
|
|||||||
val version: String,
|
val version: String,
|
||||||
val date: String,
|
val date: String,
|
||||||
val commit: String,
|
val commit: String,
|
||||||
|
val hostname: String? = null,
|
||||||
val authors: Collection<ApiInfoAuthorResponse> = listOf(),
|
val authors: Collection<ApiInfoAuthorResponse> = listOf(),
|
||||||
) : BaseRequestModel
|
) : BaseRequestModel
|
||||||
|
|
||||||
|
@ -2,8 +2,10 @@ spring:
|
|||||||
profiles:
|
profiles:
|
||||||
active: ${APP_PROFILE:dev}
|
active: ${APP_PROFILE:dev}
|
||||||
application:
|
application:
|
||||||
name: cubetiq-api-service
|
name: ${APP_NAME:cubetiq-api-service}
|
||||||
|
data:
|
||||||
|
mongodb:
|
||||||
|
uri: ${MONGODB_URI:mongodb://192.168.0.202:27017/spring-web-api-db}
|
||||||
cubetiq:
|
cubetiq:
|
||||||
app:
|
app:
|
||||||
data-dir: ${APP_DATA_DIR:${user.home}/${spring.application.name}}
|
data-dir: ${APP_DATA_DIR:${user.home}/${spring.application.name}}
|
||||||
|
6
k8s/1-namespace.yaml
Normal file
6
k8s/1-namespace.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: spring-dev
|
||||||
|
name: spring-dev
|
9
k8s/2-secret.yaml
Normal file
9
k8s/2-secret.yaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
namespace: spring-dev
|
||||||
|
name: registry-secret
|
||||||
|
stringData:
|
||||||
|
.dockerconfigjson: |
|
||||||
|
{"auths":{"registry.kh.cubetiqs.com":{"auth":"c29tYm9jaGVhOm1z"}}}
|
||||||
|
type: kubernetes.io/dockerconfigjson
|
50
k8s/3-mongo.yaml
Normal file
50
k8s/3-mongo.yaml
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
namespace: spring-dev
|
||||||
|
name: mongo-pvc
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 256Mi
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
namespace: spring-dev
|
||||||
|
name: mongo
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: mongo
|
||||||
|
ports:
|
||||||
|
- port: 27017
|
||||||
|
targetPort: 27017
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
namespace: spring-dev
|
||||||
|
name: mongo
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: mongo
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: mongo
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: mongo
|
||||||
|
image: mongo
|
||||||
|
ports:
|
||||||
|
- containerPort: 27017
|
||||||
|
volumeMounts:
|
||||||
|
- name: storage
|
||||||
|
mountPath: /data/db
|
||||||
|
volumes:
|
||||||
|
- name: storage
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: mongo-pvc
|
41
k8s/app.yaml
Normal file
41
k8s/app.yaml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
namespace: spring-dev
|
||||||
|
name: spring-web-service
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: spring-web-api
|
||||||
|
ports:
|
||||||
|
- port: 8080
|
||||||
|
targetPort: 8080
|
||||||
|
type: ClusterIP
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
namespace: spring-dev
|
||||||
|
name: spring-web-api
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: spring-web-api
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: spring-web-api
|
||||||
|
spec:
|
||||||
|
imagePullSecrets:
|
||||||
|
- name: registry-secret
|
||||||
|
containers:
|
||||||
|
- name: spring-web-app
|
||||||
|
image: registry.kh.cubetiqs.com/spring-web-api:latest
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
||||||
|
env:
|
||||||
|
- name: MONGODB_URI
|
||||||
|
value: mongodb://mongo:27017/spring-web-api
|
||||||
|
- name: APP_NAME
|
||||||
|
value: spring-web-api-hello
|
||||||
|
imagePullPolicy: Always
|
Loading…
Reference in New Issue
Block a user