diff --git a/README.md b/README.md index 44e5101..0df8c60 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Personal website / portfolio [https://www.ironoc.net/](https://www.ironoc.net/) ## Tech Stack -Java 21 (LTS), Spring Boot 3.3, ReactJs 18, Maven 3.8, HTML5+CSS, +Java 21 (LTS), Spring Boot 3.4, ReactJs 18, Maven 3.8 or later, HTML5+CSS, Docker / Bash, AWS, minikube, & kubectl. ## Run without cloning project: @@ -25,15 +25,28 @@ Java 21 (LTS), Spring Boot 3.3, ReactJs 18, Maven 3.8, HTML5+CSS, docker run -d --restart=always -p 8080:8080 conorheffron/ironoc ``` +## AWS CLI to pull required svc / user account credentials. +### Configure account, verify details & then generate ID/Keys/Tokens. +```shell +% aws configure + +% aws iam get-user + +% aws sts get-session-token +``` + +## Add localhost proxy to frontend config (do not commit - only for local runs). +![ui-config-screenshot](screen-grabs/local-ui-proxy.png) + ## Run after project checkout (JDK 21 & Maven 3.8.3 required) Build / Run App: ``` mvn clean package -mvn -DAWS_ACCESS_KEY_ID= \ +mvn -DAWS_ACCESS_KEY_ID="" \ -DAWS_REGION= \ - -DAWS_SECRET_ACCESS_KEY= \ - -DAWS_SESSION_TOKEN= \ + -DAWS_SECRET_ACCESS_KEY="" \ + -DAWS_SESSION_TOKEN="" \ spring-boot:run ``` @@ -67,7 +80,7 @@ brew install virtualbox brew install minikube ``` -``` +```shell Oracle VirtualBox Manager v7.1.4 % kubectl version @@ -91,45 +104,153 @@ Context: desktop-linux ``` - Open terminal -``` -cd k8s/ - -# (clean-up & again after local testing complete) -minikube delete - -minikube start --driver=docker -kubectl cluster-info - -minikube dashboard +```shell +% minikube start --driver=docker +😄 minikube v1.34.0 on Darwin 15.1.1 +❗ Both driver=docker and vm-driver=virtualbox have been set. + + Since vm-driver is deprecated, minikube will default to driver=docker. + + If vm-driver is set in the global config, please run "minikube config unset vm-driver" to resolve this warning. + +✨ Using the docker driver based on user configuration +📌 Using Docker Desktop driver with root privileges +👍 Starting "minikube" primary control-plane node in "minikube" cluster +🚜 Pulling base image v0.0.45 ... +🔥 Creating docker container (CPUs=2, Memory=4000MB) ... +🐳 Preparing Kubernetes v1.31.0 on Docker 27.2.0 ... + ▪ Generating certificates and keys ... + ▪ Booting up control plane ... + ▪ Configuring RBAC rules ... +🔗 Configuring bridge CNI (Container Networking Interface) ... +🔎 Verifying Kubernetes components... + ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5 +🌟 Enabled addons: storage-provisioner, default-storageclass +🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default + + +% kubectl cluster-info +Kubernetes control plane is running at https://127.0.0.1:62645 +CoreDNS is running at https://127.0.0.1:62645/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy + +To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. + + +% minikube dashboard +🔌 Enabling dashboard ... + ▪ Using image docker.io/kubernetesui/dashboard:v2.7.0 + ▪ Using image docker.io/kubernetesui/metrics-scraper:v1.0.8 +💡 Some dashboard features require the metrics-server addon. To enable all features please run: + + minikube addons enable metrics-server + +🤔 Verifying dashboard health ... +🚀 Launching proxy ... +🤔 Verifying proxy health ... +🎉 Opening http://127.0.0.1:62706/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser... ``` ### Then change namespace in browser from default to ironoc-ns -- i.e. http://127.0.0.1:56414/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/pod?namespace=ironoc-ns +- i.e. http://127.0.0.1:62706/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/pod?namespace=ironoc-ns ### Open New tab in terminal & create deployment -``` -docker image build -t ironoc . -minikube image load ironoc:latest +```shell +% docker image build -t ironoc . +[+] Building 100.5s (11/11) FINISHED docker:desktop-linux + => [internal] load build definition from Dockerfile 0.0s + => => transferring dockerfile: 284B 0.0s + => [internal] load metadata for docker.io/library/eclipse-temurin:21-jdk 2.0s + => [auth] library/eclipse-temurin:pull token for registry-1.docker.io 0.0s + => [internal] load .dockerignore 0.0s + => => transferring context: 2B 0.0s +. +. +. + + +% minikube image load ironoc:latest -kubectl create ns ironoc-ns -kubectl apply -f k8s/ironoc.yaml --namespace=ironoc-ns +% kubectl create ns ironoc-ns +namespace/ironoc-ns created -kubectl get pods --namespace=ironoc-ns -kubectl get deployment --namespace=ironoc-ns -kubectl expose deployment ironoc-app-deployment --type=NodePort --namespace=ironoc-ns +% kubectl apply -f k8s/ironoc.yaml --namespace=ironoc-ns +deployment.apps/ironoc-app-deployment created +horizontalpodautoscaler.autoscaling/ironoc-app-deployment-hpa-kbij created -kubectl get svc --namespace=ironoc-ns -minikube service ironoc-app-deployment --url --namespace=ironoc-ns +% kubectl get pods --namespace=ironoc-ns +NAME READY STATUS RESTARTS AGE +ironoc-app-deployment-6d84f75b44-5xvgj 1/1 Running 0 8s + + +% kubectl get deployment --namespace=ironoc-ns +NAME READY UP-TO-DATE AVAILABLE AGE +ironoc-app-deployment 1/1 1 1 105s + + +% kubectl expose deployment ironoc-app-deployment --type=NodePort --namespace=ironoc-ns + +service/ironoc-app-deployment exposed + + +% kubectl get svc --namespace=ironoc-ns +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +ironoc-app-deployment NodePort 10.98.229.246 8080:31602/TCP 6s + + +% minikube service ironoc-app-deployment --url --namespace=ironoc-ns +http://127.0.0.1:63455 +❗ Because you are using a Docker driver on darwin, the terminal needs to be open to run it. ``` ### Open New tab in terminal & tail logs -``` +```shell % kubectl get pods --namespace=ironoc-ns NAME READY STATUS RESTARTS AGE -ironoc-app-deployment-6d84f75b44-kpqpj 1/1 Running 0 3m37s +ironoc-app-deployment-6d84f75b44-5xvgj 1/1 Running 0 3m28s + + +% kubectl logs ironoc-app-deployment-6d84f75b44-5xvgj -f --namespace=ironoc-ns + +java -jar /app.war + +Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + + :: Spring Boot :: (v3.4.0) + +2024-12-14T17:50:40.926Z INFO 7 --- [ main] n.i.p.App : Starting App v5.4.6 using Java 21.0.5 with PID 7 (/app.war started by root in /) +2024-12-14T17:50:41.028Z INFO 7 --- [ main] n.i.p.App : No active profile set, falling back to 1 default profile: "default" +2024-12-14T17:50:48.042Z INFO 7 --- [ main] o.s.b.w.e.t.TomcatWebServer : Tomcat initialized with port 8080 (http) +2024-12-14T17:50:48.109Z INFO 7 --- [ main] o.a.c.c.StandardService : Starting service [Tomcat] +2024-12-14T17:50:48.112Z INFO 7 --- [ main] o.a.c.c.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.33] +2024-12-14T17:51:26.598Z INFO 7 --- [ main] o.a.j.s.TldScanner : At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. +2024-12-14T17:51:27.320Z INFO 7 --- [ main] o.a.c.c.C.[.[.[/] : Initializing Spring embedded WebApplicationContext +2024-12-14T17:51:27.323Z INFO 7 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 45872 ms +2024-12-14T17:51:28.210Z INFO 7 --- [ main] n.i.p.l.AbstractLogger : GitDetailsRunnable running for userIds=[conorheffron] +2024-12-14T17:51:28.696Z INFO 7 --- [ main] n.i.p.l.AbstractLogger : Triggering GET request: url=https://api.github.com/users/conorheffron/repos?per_page=100&page=1 +2024-12-14T17:51:34.776Z WARN 7 --- [ main] n.i.p.c.GitClient : GIT token not set, the lower request rate will apply +2024-12-14T17:51:35.912Z WARN 7 --- [ main] n.i.p.l.AbstractLogger : Input stream already closed. +2024-12-14T17:51:35.912Z INFO 7 --- [ main] n.i.p.l.AbstractLogger : Running GIT details job for userIds=[conorheffron], repositoryDetailDtos=[] +2024-12-14T17:51:35.914Z INFO 7 --- [ main] n.i.p.l.AbstractLogger : GitDetailsRunnable completed for userIds=[conorheffron] +2024-12-14T17:51:36.925Z INFO 7 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html] +2024-12-14T17:51:40.857Z INFO 7 --- [ main] o.s.b.w.e.t.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' +2024-12-14T17:51:40.911Z INFO 7 --- [ main] n.i.p.App : Started App in 62.867 seconds (process running for 68.625) +``` -kubectl logs ironoc-app-deployment-6d84f75b44-kpqpj -f --namespace=ironoc-ns +### (clean-up & again after local testing complete) +```shell +% minikube delete +🔥 Deleting "minikube" in docker ... +🔥 Deleting container "minikube" ... +🔥 Removing /Users/conorheffron/.minikube/machines/minikube ... +💀 Removed all traces of the "minikube" cluster. ```