From 2ace9c4ced1e699a94b0df34d4865b8bff6e1ca2 Mon Sep 17 00:00:00 2001 From: mrfzy Date: Fri, 17 Nov 2023 21:31:57 +0700 Subject: [PATCH] change readme to complete explanation --- README.md | 36 ++++++++++++ api-laravel-crud/README.md | 64 --------------------- docker-compose.yml | 5 +- infra-local-diagram.png | Bin 0 -> 43020 bytes laravel-minikube/templates/deployment.yaml | 14 +++++ laravel-minikube/templates/hpa.yaml | 20 +++++++ laravel-minikube/values.yaml | 8 +++ 7 files changed, 81 insertions(+), 66 deletions(-) delete mode 100644 api-laravel-crud/README.md create mode 100644 infra-local-diagram.png create mode 100644 laravel-minikube/templates/hpa.yaml diff --git a/README.md b/README.md index e69de29..e500c51 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,36 @@ +## Laravel App - CRUD Services + +This application run the service of Laravel CRUD Application with the database server. Include with the monitoring services using Prometheus and Grafana. + +The application it self contain of : +- Laravel Apps Directory +- Dockerfile and Docker compose script +- Helm chart for deploying locally +- Github Actions Workflow + +The configuration of the deployment to Kubernetes, it's using such as: +- Health Checks +- Horizontal Pod Autoscaling; While the container down, there are some backup to make the pods running up again. + +The monitoring setup with the Helm chart using Prometheus and Grafana, which that also could monitor the Laravel apps +Default of the dashboard itself using Laravel App Metrics. + +The monitoring process its using the default of Kubernetes system, with health checks to show the process of the pods itself + +To run this app, you can try with: + +`helm install .` + +If you want to run separately, such as to work with the container itself and database container, you can try with: + +`docker pull mrfzy00/crud_laravel_api-sre-test-app:latest` +`docker run -d -p 8000:8000 --name crud_laravel_api-sre-test-app` + +Or you would try with run the app combined with docker compose its okay + +To run the database you can start: +`docker-compose up -d` + +The database will start the service itself + +![Local Infrastructure Kubernetes Diagram](infra-local-diagram.png "Local Infrastructure Diagram") \ No newline at end of file diff --git a/api-laravel-crud/README.md b/api-laravel-crud/README.md deleted file mode 100644 index 1b6397c..0000000 --- a/api-laravel-crud/README.md +++ /dev/null @@ -1,64 +0,0 @@ -

- -

-Build Status -Total Downloads -Latest Stable Version -License -

- -## About Laravel - -Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: - -- [Simple, fast routing engine](https://laravel.com/docs/routing). -- [Powerful dependency injection container](https://laravel.com/docs/container). -- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. -- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). -- Database agnostic [schema migrations](https://laravel.com/docs/migrations). -- [Robust background job processing](https://laravel.com/docs/queues). -- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). - -Laravel is accessible, powerful, and provides tools required for large, robust applications. - -## Learning Laravel - -Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. - -If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains over 1500 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. - -## Laravel Sponsors - -We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the Laravel [Patreon page](https://patreon.com/taylorotwell). - -### Premium Partners - -- **[Vehikl](https://vehikl.com/)** -- **[Tighten Co.](https://tighten.co)** -- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** -- **[64 Robots](https://64robots.com)** -- **[Cubet Techno Labs](https://cubettech.com)** -- **[Cyber-Duck](https://cyber-duck.co.uk)** -- **[Many](https://www.many.co.uk)** -- **[Webdock, Fast VPS Hosting](https://www.webdock.io/en)** -- **[DevSquad](https://devsquad.com)** -- **[Curotec](https://www.curotec.com/services/technologies/laravel/)** -- **[OP.GG](https://op.gg)** -- **[WebReinvent](https://webreinvent.com/?utm_source=laravel&utm_medium=github&utm_campaign=patreon-sponsors)** -- **[Lendio](https://lendio.com)** - -## Contributing - -Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). - -## Code of Conduct - -In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). - -## Security Vulnerabilities - -If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. - -## License - -The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/docker-compose.yml b/docker-compose.yml index b2a1ff3..5fa948a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,9 +5,10 @@ services: image: mysql:5.7-oracle command: --default-authentication-plugin=mysql_native_password ports: - - '33060:3306' + - 3306:3306 environment: - MYSQL_DATABASE=db_laravel - MYSQL_ROOT_PASSWORD=Ch4ng3me!@ volumes: - - ./db:/var/lib/mysql \ No newline at end of file + - ./db:/var/lib/mysql + network_mode: host \ No newline at end of file diff --git a/infra-local-diagram.png b/infra-local-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..954c6bf584cca218a051c5ed0028d4eeca84e2d5 GIT binary patch literal 43020 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 literal 0 HcmV?d00001 diff --git a/laravel-minikube/templates/deployment.yaml b/laravel-minikube/templates/deployment.yaml index 1ea2a5c..8ffae8f 100644 --- a/laravel-minikube/templates/deployment.yaml +++ b/laravel-minikube/templates/deployment.yaml @@ -28,6 +28,18 @@ spec: - name: http containerPort: 80 protocol: TCP + # livenessProbe: + # httpGet: + # path: / + # port: http + # initialDelaySeconds: 3 + # periodSeconds: 3 + # readinessProbe: + # httpGet: + # path: / + # port: http + # initialDelaySeconds: 5 + # periodSeconds: 5 env: - name: APP_KEY valueFrom: @@ -46,3 +58,5 @@ spec: value: {{ .Values.database.user }} - name: DB_PASSWORD value: {{ .Values.database.password }} + + diff --git a/laravel-minikube/templates/hpa.yaml b/laravel-minikube/templates/hpa.yaml new file mode 100644 index 0000000..424dfb0 --- /dev/null +++ b/laravel-minikube/templates/hpa.yaml @@ -0,0 +1,20 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "laravel-minikube.fullname" . }} + labels: + app: {{ include "laravel-minikube.name" . }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "laravel-minikube.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} diff --git a/laravel-minikube/values.yaml b/laravel-minikube/values.yaml index 1d659f4..fd4bb3b 100644 --- a/laravel-minikube/values.yaml +++ b/laravel-minikube/values.yaml @@ -9,6 +9,13 @@ service: type: ClusterIP port: 80 +autoscaling: + enabled: true + minReplicas: 1 + maxReplicas: 5 + targetCPUUtilizationPercentage: 50 + + ingress: enabled: false annotations: {} @@ -23,6 +30,7 @@ appKey: database: enabled: true + version: "5.7-oracle" type: mysql name: laraveldb user: root