diff --git a/Dockerfile b/Dockerfile index 079acabe..e62bb4f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,37 +1,12 @@ -#---------------------------------- -# Stage 1 -#---------------------------------- - -# Import docker image with maven installed -FROM maven:3.8.3-openjdk-17 as builder - -# Add maintainer, so that new user will understand who had written this Dockerfile -MAINTAINER Madhup Pandey - -# Add labels to the image to filter out if we have multiple application running -LABEL app=bankapp - -# Set working directory -WORKDIR /src - -# Copy source code from local to container -COPY . /src - -# Build application and skip test cases +#---------------------------------stage1----------------------------------------- +FROM maven:3.9.6-eclipse-temurin-17-alpine AS builder +WORKDIR /app +COPY . . RUN mvn clean install -DskipTests=true - -#-------------------------------------- -# Stage 2 -#-------------------------------------- - -# Import small size java image -FROM openjdk:17-alpine as deployer - -# Copy build from stage 1 (builder) -COPY --from=builder /src/target/*.jar /src/target/bankapp.jar - -# Expose application port -EXPOSE 8080 - -# Start the application -ENTRYPOINT ["java", "-jar", "/src/target/bankapp.jar"] + +#---------------------------------stage2----------------------------------------- +FROM openjdk:17-slim +WORKDIR /app +COPY --from=builder /app/target/*.jar /app/target/bank.jar +EXPOSE 8081 +CMD ["java","-jar","/app/target/bank.jar"] diff --git a/docker-compose.yml b/docker-compose.yml index 34642a09..4fb348a4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,43 +4,34 @@ services: image: mysql:latest container_name: mysql environment: - - MYSQL_ROOT_PASSWORD=Test@123 - - MYSQL_DATABASE=BankDB + MYSQL_ROOT_PASSWORD: Test@123 + MYSQL_DATABASE: bankappdb + ports: + - "3306:3306" volumes: - bankapp-volume:/var/lib/mysql networks: - bankapp - healthcheck: - test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] - interval: 10s - timeout: 5s - retries: 3 - start_period: 30s + mainapp: - image: ${DUSER}/${IMAGE} - container_name: Bankapp + image: bankapp:latest + container_name: "Bankapp" environment: - - SPRING_DATASOURCE_USERNAME=root - - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/BankDB?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC - - SPRING_DATASOURCE_PASSWORD=Test@123 + SPRING_DATASOURCE_USERNAME: root + SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/bankappdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC + SPRING_DATASOURCE_PASSWORD: Test@123 ports: - "8080:8080" depends_on: - mysql: - condition: service_healthy + - mysql networks: - bankapp restart: always - healthcheck: - test: ["CMD-SHELL", "curl -f http://localhost:8080/actuator/health || exit 1"] - interval: 10s - timeout: 5s - retries: 5 - start_period: 30s + networks: bankapp: volumes: - bankapp-volume: \ No newline at end of file + bankapp-volume: diff --git a/kubernetes/bankapp-deployment.yml b/kubernetes/bankapp-deployment.yml index 45a35b6f..59621173 100644 --- a/kubernetes/bankapp-deployment.yml +++ b/kubernetes/bankapp-deployment.yml @@ -1,58 +1,63 @@ -apiVersion: apps/v1 kind: Deployment +apiVersion: apps/v1 metadata: + name: bank-deployment + namespace: bank labels: - app: bankapp-deploy - name: bankapp-deploy - namespace: bankapp-namespace + app: bankapp spec: - replicas: 2 # Keep replicas >= 2 for high availability + replicas: 3 selector: matchLabels: - app: bankapp-deploy + app: bankapp template: metadata: labels: - app: bankapp-deploy + app: bankapp spec: containers: - - name: bankapp - image: trainwithshubham/bankapp-eks:v2 + - name: bank-pod + image: swayamnakshane/mybank:latest ports: - - containerPort: 8080 + - containerPort: 8080 + + env: - - name: SPRING_DATASOURCE_URL + - name: SPRING_DATASOURCE_PASSWORD valueFrom: - configMapKeyRef: - name: bankapp-config - key: SPRING_DATASOURCE_URL + secretKeyRef: + name: bank-secret + key: SPRING_DATASOURCE_PASSWORD + - name: SPRING_DATASOURCE_USERNAME valueFrom: configMapKeyRef: - name: bankapp-config + name: bank-configmap key: SPRING_DATASOURCE_USERNAME - - name: MYSQL_DATABASE + + - name: SPRING_DATASOURCE_URL valueFrom: configMapKeyRef: - name: bankapp-config - key: MYSQL_DATABASE - - name: SPRING_DATASOURCE_PASSWORD - valueFrom: - secretKeyRef: - name: mysql-secret - key: SPRING_DATASOURCE_PASSWORD - # readinessProbe: - # httpGet: - # path: /actuator/health # Update this based on your app's health endpoint - # port: 8080 - # initialDelaySeconds: 10 - # periodSeconds: 5 - # livenessProbe: - # httpGet: - # path: /actuator/health # Update this based on your app's health endpoint - # port: 8080 - # initialDelaySeconds: 30 - # periodSeconds: 10 + name: bank-configmap + key: SPRING_DATASOURCE_URL + + +# livenessProbe: +# httpGet: +# path: /actuator/health +# port: 8080 +# initialDelaySeconds: 10 +# periodSeconds: 5 +# failureThreshold: 3 +# +# readinessProbe: +# httpGet: +# path: /actuator/health +# port: 8080 +# initialDelaySeconds: 5 +# periodSeconds: 5 +# failureThreshold: 3 + resources: requests: memory: "512Mi" @@ -60,4 +65,3 @@ spec: limits: memory: "1Gi" cpu: "500m" - diff --git a/kubernetes/bankapp-hpa.yml b/kubernetes/bankapp-hpa.yml deleted file mode 100644 index 6c030161..00000000 --- a/kubernetes/bankapp-hpa.yml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: bankapp-hpa - namespace: bankapp-namespace -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: bankapp-deploy - minReplicas: 1 - maxReplicas: 5 - metrics: - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: 40 diff --git a/kubernetes/bankapp-ingress.yml b/kubernetes/bankapp-ingress.yml deleted file mode 100644 index e1b8f06e..00000000 --- a/kubernetes/bankapp-ingress.yml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: bankapp-ingress - namespace: bankapp-namespace - annotations: - nginx.ingress.kubernetes.io/rewrite-target: / - nginx.ingress.kubernetes.io/proxy-body-size: "50m" - nginx.ingress.kubernetes.io/ssl-redirect: "true" # Force HTTPS - cert-manager.io/cluster-issuer: letsencrypt-prod # Use Let's Encrypt -spec: - ingressClassName: nginx - tls: - - hosts: - - megaproject.trainwithshubham.com - secretName: bankapp-tls-secret # Cert-Manager will manage this - rules: - - host: megaproject.trainwithshubham.com - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: bankapp-service - port: - number: 8080 - diff --git a/kubernetes/bankapp-namespace.yaml b/kubernetes/bankapp-namespace.yaml index 3a4a5170..7c039a5d 100644 --- a/kubernetes/bankapp-namespace.yaml +++ b/kubernetes/bankapp-namespace.yaml @@ -1,6 +1,4 @@ -apiVersion: v1 kind: Namespace +apiVersion: v1 metadata: - name: bankapp-namespace - labels: - name: bankapp-namespace + name: bank diff --git a/kubernetes/bankapp-service.yaml b/kubernetes/bankapp-service.yaml index c63175da..b13ba96d 100644 --- a/kubernetes/bankapp-service.yaml +++ b/kubernetes/bankapp-service.yaml @@ -1,15 +1,15 @@ -apiVersion: v1 kind: Service +apiVersion: v1 metadata: - name: bankapp-service - namespace: bankapp-namespace - labels: - app: bankapp + name: bank-svc + namespace: bank spec: selector: - app: bankapp-deploy + app: bankapp ports: - - protocol: TCP - port: 8080 - targetPort: 8080 + - protocol: TCP + targetPort: 8080 + port: 8080 + nodePort: 30080 + type: NodePort diff --git a/kubernetes/configmap.yaml b/kubernetes/configmap.yaml index f2acc025..82c0a13a 100644 --- a/kubernetes/configmap.yaml +++ b/kubernetes/configmap.yaml @@ -1,9 +1,9 @@ -apiVersion: v1 kind: ConfigMap +apiVersion: v1 metadata: - name: bankapp-config - namespace: bankapp-namespace + name: bank-configmap + namespace: bank data: - MYSQL_DATABASE: BankDB - SPRING_DATASOURCE_URL: jdbc:mysql://mysql-svc.bankapp-namespace.svc.cluster.local:3306/BankDB?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC + MYSQL_DATABASE: bankappdb SPRING_DATASOURCE_USERNAME: root + SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/bankappdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC diff --git a/kubernetes/letsencrypt-clusterissuer.yaml b/kubernetes/letsencrypt-clusterissuer.yaml deleted file mode 100644 index 959db1b9..00000000 --- a/kubernetes/letsencrypt-clusterissuer.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: cert-manager.io/v1 -kind: ClusterIssuer -metadata: - name: letsencrypt-prod -spec: - acme: - server: https://acme-v02.api.letsencrypt.org/directory - email: trainwithshubham@gmail.com - privateKeySecretRef: - name: letsencrypt-prod-key - solvers: - - http01: - ingress: - class: nginx - diff --git a/kubernetes/mysql-deployment.yml b/kubernetes/mysql-deployment.yml index c9baa53a..90779073 100644 --- a/kubernetes/mysql-deployment.yml +++ b/kubernetes/mysql-deployment.yml @@ -1,12 +1,14 @@ +# StatefulSet for MySQL apiVersion: apps/v1 -kind: Deployment +kind: StatefulSet metadata: - name: mysql - namespace: bankapp-namespace + name: mysql-dep + namespace: bank labels: app: mysql spec: - replicas: 1 + serviceName: mysql + replicas: 2 selector: matchLabels: app: mysql @@ -16,27 +18,45 @@ spec: app: mysql spec: containers: - - name: mysql - image: mysql:8.0 # Use a specific, stable version for production + - name: mysql-pod + image: mysql:latest ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: - name: mysql-secret + name: bank-secret key: MYSQL_ROOT_PASSWORD - name: MYSQL_DATABASE valueFrom: configMapKeyRef: - name: bankapp-config + name: bank-configmap key: MYSQL_DATABASE volumeMounts: - - name: mysql-pv-storage + - name: mysql-data mountPath: /var/lib/mysql - subPath: mysql-data # Optional: Ensure a subdirectory is used for better volume organization - volumes: - - name: mysql-pv-storage - persistentVolumeClaim: - claimName: mysql-pvc - + livenessProbe: + exec: + command: + - mysqladmin + - ping + initialDelaySeconds: 30 + periodSeconds: 10 + readinessProbe: + exec: + command: + - mysqladmin + - ping + initialDelaySeconds: 10 + periodSeconds: 5 + volumeClaimTemplates: + - metadata: + name: mysql-data + spec: + accessModes: + - ReadWriteOnce + storageClassName: standard + resources: + requests: + storage: 5Gi diff --git a/kubernetes/mysql-service.yaml b/kubernetes/mysql-service.yaml index 607a8ef2..93d45edb 100644 --- a/kubernetes/mysql-service.yaml +++ b/kubernetes/mysql-service.yaml @@ -1,14 +1,15 @@ -apiVersion: v1 kind: Service +apiVersion: v1 metadata: - name: mysql-svc - namespace: bankapp-namespace + name: mysql + namespace: bank labels: app: mysql spec: + clusterIP: None selector: - app: mysql + app: mysql ports: - - protocol: TCP - port: 3306 - targetPort: 3306 + - protocol: TCP + targetPort: 3306 + port: 3306 diff --git a/kubernetes/persistent-volume-claim.yaml b/kubernetes/persistent-volume-claim.yaml index ff23dbd1..3dc945e8 100644 --- a/kubernetes/persistent-volume-claim.yaml +++ b/kubernetes/persistent-volume-claim.yaml @@ -1,12 +1,12 @@ -apiVersion: v1 kind: PersistentVolumeClaim +apiVersion: v1 metadata: - name: mysql-pvc - namespace: bankapp-namespace + name: bank-pvc + namespace: bank spec: + storageClassName: standard accessModes: - ReadWriteOnce resources: requests: - storage: 10Gi - storageClassName: standard + storage: 5Gi diff --git a/kubernetes/persistent-volume.yaml b/kubernetes/persistent-volume.yaml index efbda4d3..74c9dfd0 100644 --- a/kubernetes/persistent-volume.yaml +++ b/kubernetes/persistent-volume.yaml @@ -1,16 +1,16 @@ -apiVersion: v1 kind: PersistentVolume +apiVersion: v1 metadata: - name: mysql-pv - namespace: bankapp-namespace + name: bank-pv + namespace: bank spec: capacity: - storage: 10Gi - volumeMode: Filesystem + storage: 5Gi accessModes: - ReadWriteOnce - persistentVolumeReclaimPolicy: Retain # Keeps the PV after the PVC is deleted - storageClassName: standard # Make sure this matches your cluster's default storage class + storageClassName: standard hostPath: - path: /mnt/data/mysql - type: DirectoryOrCreate + path: "/mnt/data" + + + diff --git a/kubernetes/secrets.yaml b/kubernetes/secrets.yaml index c6596fdb..98edd56f 100644 --- a/kubernetes/secrets.yaml +++ b/kubernetes/secrets.yaml @@ -1,10 +1,11 @@ -apiVersion: v1 kind: Secret +apiVersion: v1 metadata: - name: mysql-secret - namespace: bankapp-namespace -type: Opaque + name: bank-secret + namespace: bank + +type: opaque data: - MYSQL_ROOT_PASSWORD: VGVzdEAxMjM= # Base64 for "Test@123" - SPRING_DATASOURCE_PASSWORD: VGVzdEAxMjM= # Base64 for "Test@123" - + MYSQL_ROOT_PASSWORD: VGVzdEAxMjM= + SPRING_DATASOURCE_PASSWORD: VGVzdEAxMjM= +