{"id":26972774,"url":"https://github.com/rapter1990/footballteamapi","last_synced_at":"2026-06-30T20:31:27.036Z","repository":{"id":282290215,"uuid":"945783515","full_name":"Rapter1990/footballteamapi","owner":"Rapter1990","description":"Case Study - Football Team Api with Hexagonal Architecture (Java 21, Spring Boot, Postgres, JUnit, Spring Security, JWT, Docker, Kubernetes, Prometheus, Grafana, Loki, Sonarqube, Github Actions (CI/CD), TestContainer)","archived":false,"fork":false,"pushed_at":"2025-07-19T17:21:17.000Z","size":7182,"stargazers_count":24,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-29T19:47:41.234Z","etag":null,"topics":["docker","docker-compose","github-actions","grafana","hexagonal-architecture","java","java21","junit","kubernetes","loki","postgres","prometheus","sonarqube","spring-security","sprng-boot","swagger","testcontainers"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Rapter1990.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-10T05:48:21.000Z","updated_at":"2025-10-22T20:52:48.000Z","dependencies_parsed_at":"2025-03-13T19:42:47.565Z","dependency_job_id":"87c38e8d-307f-437e-b393-021404beacd7","html_url":"https://github.com/Rapter1990/footballteamapi","commit_stats":null,"previous_names":["rapter1990/footballteamapi"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Rapter1990/footballteamapi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rapter1990%2Ffootballteamapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rapter1990%2Ffootballteamapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rapter1990%2Ffootballteamapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rapter1990%2Ffootballteamapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Rapter1990","download_url":"https://codeload.github.com/Rapter1990/footballteamapi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rapter1990%2Ffootballteamapi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34983170,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-30T02:00:05.919Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","github-actions","grafana","hexagonal-architecture","java","java21","junit","kubernetes","loki","postgres","prometheus","sonarqube","spring-security","sprng-boot","swagger","testcontainers"],"created_at":"2025-04-03T09:18:58.681Z","updated_at":"2026-06-30T20:31:27.027Z","avatar_url":"https://github.com/Rapter1990.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Case Study - Football Team Api (Hexagonal Architecture)\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"screenshots/main.png\" alt=\"Main Information\" width=\"800\" height=\"500\"\u003e\n\u003c/p\u003e\n\n### 📖 Information\n\n\u003cul style=\"list-style-type:disc\"\u003e\n   \u003cli\u003e\n      \u003cb\u003eFootball Team Management Service:\u003c/b\u003e\n      \u003cul\u003e\n         \u003cli\u003e\n            Implement a Spring Boot-based service through hexagonal architecture for managing football teams and their associated players, encompassing functionalities for team listing, player retrieval by team ID, and support for team and player updates or deletions\n         \u003c/li\u003e\n         \u003cli\u003e\n            \u003cb\u003eFunctional Features:\u003c/b\u003e\n            \u003cul\u003e\n               \u003cli\u003eList all football teams.\u003c/li\u003e\n               \u003cli\u003eList players of a selected football team using the team’s ID.\u003c/li\u003e\n               \u003cli\u003eDelete or update a football team using its ID.\u003c/li\u003e\n               \u003cli\u003eDelete players from a football team or add a new player to the team.\u003c/li\u003e\n            \u003c/ul\u003e\n         \u003c/li\u003e\n         \u003cli\u003e\n            \u003cb\u003eBusiness Rules:\u003c/b\u003e\n            \u003cul\u003e\n               \u003cli\u003eA football team can have a maximum of 18 players.\u003c/li\u003e\n               \u003cli\u003eOnly up to 6 players on a team can be foreigners.\u003c/li\u003e\n               \u003cli\u003eA maximum of 2 goalkeepers can be defined per team.\u003c/li\u003e\n            \u003c/ul\u003e\n         \u003c/li\u003e\n      \u003c/ul\u003e\n   \u003c/li\u003e\n\u003c/ul\u003e\n\n\n\n### Explore Rest APIs\n\nEndpoints Summary\n\u003ctable style=\"width:100%;\"\u003e\n    \u003ctr\u003e\n        \u003cth\u003eMethod\u003c/th\u003e\n        \u003cth\u003eUrl\u003c/th\u003e\n        \u003cth\u003eDescription\u003c/th\u003e\n        \u003cth\u003eRequest Body\u003c/th\u003e\n        \u003cth\u003ePath Variable\u003c/th\u003e\n        \u003cth\u003eResponse\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/api/v1/authentication/user/register\u003c/td\u003e\n        \u003ctd\u003eRegister for Admin or User\u003c/td\u003e\n        \u003ctd\u003eRegisterRequest\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;Void\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/api/v1/authentication/user/login\u003c/td\u003e\n        \u003ctd\u003eLogin for Admin or User\u003c/td\u003e\n        \u003ctd\u003eLoginRequest\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;TokenResponse\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/api/v1/authentication/user/refresh-token\u003c/td\u003e\n        \u003ctd\u003eRefresh Token for Admin or User\u003c/td\u003e\n        \u003ctd\u003eTokenRefreshRequest\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;TokenResponse\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/api/v1/authentication/user/logout\u003c/td\u003e\n        \u003ctd\u003eLogout for Admin or User\u003c/td\u003e\n        \u003ctd\u003eTokenInvalidateRequest\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;Void\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n        \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/api/v1/football-teams\u003c/td\u003e\n        \u003ctd\u003eCreate a new football team\u003c/td\u003e\n        \u003ctd\u003eCreateFootballTeamRequest\u003c/td\u003e\n        \u003ctd\u003e-\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;FootballTeamResponse\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePUT\u003c/td\u003e\n        \u003ctd\u003e/api/v1/football-teams/{teamId}\u003c/td\u003e\n        \u003ctd\u003eUpdate an existing football team's name\u003c/td\u003e\n        \u003ctd\u003eUpdateFootballTeamRequest\u003c/td\u003e\n        \u003ctd\u003eteamId (UUID)\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;FootballTeamResponse\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eGET\u003c/td\u003e\n        \u003ctd\u003e/api/v1/football-teams/{teamId}\u003c/td\u003e\n        \u003ctd\u003eRetrieve a football team's details by ID\u003c/td\u003e\n        \u003ctd\u003e-\u003c/td\u003e\n        \u003ctd\u003eteamId (UUID)\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;FootballTeamResponse\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eDELETE\u003c/td\u003e\n        \u003ctd\u003e/api/v1/football-teams/{teamId}\u003c/td\u003e\n        \u003ctd\u003eDelete a football team by ID\u003c/td\u003e\n        \u003ctd\u003e-\u003c/td\u003e\n        \u003ctd\u003eteamId (UUID)\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;Void\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/api/v1/football-teams/teamsList\u003c/td\u003e\n        \u003ctd\u003eRetrieve a paginated list of football teams\u003c/td\u003e\n        \u003ctd\u003eFootballTeamPagingRequest\u003c/td\u003e\n        \u003ctd\u003e-\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;CustomPagingResponse\u0026lt;FootballTeamResponse\u0026gt;\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/api/v1/football-teams/{teamId}/players\u003c/td\u003e\n        \u003ctd\u003eAdd a new player to a team\u003c/td\u003e\n        \u003ctd\u003eAddPlayerRequest\u003c/td\u003e\n        \u003ctd\u003eteamId (UUID)\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;PlayerResponse\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePUT\u003c/td\u003e\n        \u003ctd\u003e/api/v1/football-teams/{teamId}/players/{playerId}\u003c/td\u003e\n        \u003ctd\u003eUpdate an existing player on a team\u003c/td\u003e\n        \u003ctd\u003eUpdatePlayerRequest\u003c/td\u003e\n        \u003ctd\u003eteamId (UUID), playerId (UUID)\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;PlayerResponse\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eDELETE\u003c/td\u003e\n        \u003ctd\u003e/api/v1/football-teams/{teamId}/players/{playerId}\u003c/td\u003e\n        \u003ctd\u003eDelete a player from a team\u003c/td\u003e\n        \u003ctd\u003e-\u003c/td\u003e\n        \u003ctd\u003eteamId (UUID), playerId (UUID)\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;Void\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eGET\u003c/td\u003e\n        \u003ctd\u003e/api/v1/football-teams/{teamId}/players\u003c/td\u003e\n        \u003ctd\u003eRetrieve a paginated list of players for a team\u003c/td\u003e\n        \u003ctd\u003ePlayerPagingRequest\u003c/td\u003e\n        \u003ctd\u003eteamId (UUID)\u003c/td\u003e\n        \u003ctd\u003eCustomResponse\u0026lt;CustomPagingResponse\u0026lt;PlayerResponse\u0026gt;\u0026gt;\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\n### Technologies\n\n---\n- Java 21\n- Spring Boot 3.0\n- Restful API\n- Open Api (Swagger)\n- Maven\n- Junit5\n- Mockito\n- Integration Tests\n- TestContainers\n- Docker\n- Docker Compose\n- CI/CD (Github Actions)\n- Postman\n- Prometheus\n- Grafana\n- Kubernetes\n- JaCoCo (Test Report)\n- Sonarqube\n- Loki (Log Aggregation System)\n\n### Postman\n\n```\nImport postman collection under postman_collection folder\n```\n\n\n### Prerequisites\n\n#### Define Variable in .env file\n\n```\nFOOTBALL_TEAM_DB_IP=localhost\nFOOTBALL_TEAM_DB_PORT=5432\nPOSTGRES_USER={POSTGRES_USER}\nPOSTGRES_PASSWORD={POSTGRES_PASSWORD}\n```\n\n### Open Api (Swagger)\n\n```\nhttp://localhost:3112/swagger-ui/index.html\n```\n\n---\n\n### JaCoCo (Test Report)\n\nAfter the command named `mvn clean install` completes, the JaCoCo report will be available at:\n```\ntarget/site/jacoco/index.html\n```\nNavigate to the `target/site/jacoco/` directory.\n\nOpen the `index.html` file in your browser to view the detailed coverage report.\n\n---\n\n### Maven, Docker and Kubernetes Running Process\n\n\n### Maven Run\nTo build and run the application with `Maven`, please follow the directions shown below;\n\n```sh\n$ cd footballteamapi\n$ mvn clean install\n$ mvn spring-boot:run\n```\n\n---\n\n### Docker Run\nThe application can be built and run by the `Docker` engine. The `Dockerfile` has multistage build, so you do not need to build and run separately.\n\nPlease follow directions shown below in order to build and run the application with Docker Compose file;\n\n```sh\n$ cd footballteamapi\n$ docker-compose up -d\n```\n\nIf you change anything in the project and run it on Docker, you can also use this command shown below\n\n```sh\n$ cd footballteamapi\n$ docker-compose up --build\n```\n\nTo monitor the application, you can use the following tools:\n\n- **Prometheus**:  \n  Open in your browser at [http://localhost:9090](http://localhost:9090)  \n  Prometheus collects and stores application metrics.\n\n- **Grafana**:  \n  Open in your browser at [http://localhost:3000](http://localhost:3000)  \n  Grafana provides a dashboard for visualizing the metrics.  \n  **Default credentials**:\n    - Username: `admin`\n    - Password: `admin`\n\n- Define prometheus data source url, use this link shown below\n\n```\nhttp://prometheus:9090\n```\n\n- Define loki data source url, use this link shown below\n\n```\nhttp://loki:3100\n```\n\n---\n\n### Kubernetes Run\nTo build and run the application with `Maven`, please follow the directions shown below;\n\n- Start Minikube\n\n```sh\n$ minikube start\n```\n\n- Open Minikube Dashboard\n\n```sh\n$ minikube dashboard\n```\n\n- To deploy the application on Kubernetes, apply the Kubernetes configuration file underneath k8s folder\n\n```sh\n$ kubectl apply -f k8s\n```\n\n- To open Prometheus, click tunnel url link provided by the command shown below to reach out Prometheus\n\n```sh\nminikube service prometheus-service\n```\n\n- To open Grafana, click tunnel url link provided by the command shown below to reach out Prometheus\n\n```sh\nminikube service grafana-service\n```\n\n- Define prometheus data source url, use this link shown below\n\n```\nhttp://prometheus-service.default.svc.cluster.local:9090\n```\n\n- Define loki data source url, use this link shown below\n\n```\nhttp://loki-service.default.svc.cluster.local:3100\n```\n\n---\n### Docker Image Location\n\n```\nhttps://hub.docker.com/repository/docker/noyandocker/footballteamapi/general\n```\n\n### Define Loki through Grafana\n\n- Define Loki Dashboard\n- Define `query` after selecting data source as `Loki`\n- Define `Label Filter` as `app` and its value `footballteamapi`\n- Run the `query`\n- Show the result in the Dashboard\n\n### Sonarqube\n\n- Go to `localhost:9000` for Docker and Go there through `minikube service sonarqube` for Kubernetes\n- Enter username and password as `admin`\n- Change password\n- Click `Create Local Project`\n- Choose the baseline for this code for the project as `Use the global setting`\n- Click `Locally` in Analyze Method\n- Define Token\n- Click `Continue`\n- Copy `sonar.host.url` and `sonar.token` (`sonar.login`) in the `properties` part in  `pom.xml`\n- Run `mvn sonar:sonar` to show code analysis\n\n\n### Screenshots\n\n\u003cdetails\u003e\n\u003csummary\u003eClick here to show the screenshots of project\u003c/summary\u003e\n    \u003cp\u003e Figure 1 \u003c/p\u003e\n    \u003cimg src =\"screenshots/swagger.PNG\"\u003e\n    \u003cp\u003e Figure 2 \u003c/p\u003e\n    \u003cimg src =\"screenshots/jacoco_test_report.PNG\"\u003e\n    \u003cp\u003e Figure 3 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_main.PNG\"\u003e\n    \u003cp\u003e Figure 4 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_prometheus_1.PNG\"\u003e\n    \u003cp\u003e Figure 5 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_grafana_prometheus_1.PNG\"\u003e\n    \u003cp\u003e Figure 6 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_grafana_prometheus_2.PNG\"\u003e\n    \u003cp\u003e Figure 7 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_grafana_jvm_1.PNG\"\u003e\n    \u003cp\u003e Figure 8 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_grafana_jvm_2.PNG\"\u003e\n    \u003cp\u003e Figure 9 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_loki_1.PNG\"\u003e\n    \u003cp\u003e Figure 10 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_loki_2.PNG\"\u003e\n    \u003cp\u003e Figure 11 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_grafana_loki_1.PNG\"\u003e\n    \u003cp\u003e Figure 12 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_grafana_loki_2.PNG\"\u003e\n    \u003cp\u003e Figure 13 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_grafana_loki_3.PNG\"\u003e\n    \u003cp\u003e Figure 14 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_grafana_loki_4.PNG\"\u003e\n    \u003cp\u003e Figure 15 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_sonarqube_1.PNG\"\u003e\n    \u003cp\u003e Figure 16 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_sonarqube_2.PNG\"\u003e\n    \u003cp\u003e Figure 17 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_sonarqube_3.PNG\"\u003e\n    \u003cp\u003e Figure 18 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_sonarqube_4.PNG\"\u003e\n    \u003cp\u003e Figure 19 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_sonarqube_5.PNG\"\u003e\n    \u003cp\u003e Figure 20 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_sonarqube_6.PNG\"\u003e\n    \u003cp\u003e Figure 21 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_sonarqube_7.PNG\"\u003e\n    \u003cp\u003e Figure 22 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_sonarqube_8.PNG\"\u003e\n    \u003cp\u003e Figure 23 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_sonarqube_9.PNG\"\u003e\n    \u003cp\u003e Figure 24 \u003c/p\u003e\n    \u003cimg src =\"screenshots/docker_sonarqube_10.PNG\"\u003e\n    \u003cp\u003e Figure 25 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_kubernetes_1.PNG\"\u003e\n    \u003cp\u003e Figure 26 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_kubernetes_prometheus_1.PNG\"\u003e\n    \u003cp\u003e Figure 27 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_kubernetes_grafana_1.PNG\"\u003e\n    \u003cp\u003e Figure 28 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_kubernetes_grafana_2.PNG\"\u003e\n    \u003cp\u003e Figure 29 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_kubernetes_grafana_3.PNG\"\u003e\n    \u003cp\u003e Figure 30 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_kubernetes_grafana_4.PNG\"\u003e\n    \u003cp\u003e Figure 31 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_kubernetes_grafana_5.PNG\"\u003e\n    \u003cp\u003e Figure 32 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_kubernetes_grafana_6.PNG\"\u003e\n    \u003cp\u003e Figure 33 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_kubernetes_grafana_7.PNG\"\u003e\n    \u003cp\u003e Figure 34 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_kubernetes_grafana_8.PNG\"\u003e\n    \u003cp\u003e Figure 35 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_sonarqube_1.PNG\"\u003e\n    \u003cp\u003e Figure 36 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_sonarqube_2.PNG\"\u003e\n    \u003cp\u003e Figure 37 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_sonarqube_3.PNG\"\u003e\n    \u003cp\u003e Figure 38 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_sonarqube_4.PNG\"\u003e\n    \u003cp\u003e Figure 39 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_sonarqube_5.PNG\"\u003e\n    \u003cp\u003e Figure 40 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_sonarqube_6.PNG\"\u003e\n    \u003cp\u003e Figure 41 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_sonarqube_7.PNG\"\u003e\n    \u003cp\u003e Figure 42 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_sonarqube_8.PNG\"\u003e\n    \u003cp\u003e Figure 43 \u003c/p\u003e\n    \u003cimg src =\"screenshots/minikube_sonarqube_9.PNG\"\u003e\n\u003c/details\u003e\n\n\n### Contributors\n\n- [Sercan Noyan Germiyanoğlu](https://github.com/Rapter1990)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frapter1990%2Ffootballteamapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frapter1990%2Ffootballteamapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frapter1990%2Ffootballteamapi/lists"}