From 33a1f84d3484990f70c260372d74992f717c54a6 Mon Sep 17 00:00:00 2001 From: Miroslav Pejic Date: Thu, 25 May 2023 21:49:19 +0200 Subject: [PATCH] [mirotlak] - cosemtic --- kubernetes/Makefile | 4 +++- kubernetes/README.md | 21 ++++++++++++++------- public/images/k8s.png | Bin 0 -> 13642 bytes 3 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 public/images/k8s.png diff --git a/kubernetes/Makefile b/kubernetes/Makefile index 3d33dee4..2e2c2f54 100644 --- a/kubernetes/Makefile +++ b/kubernetes/Makefile @@ -1,7 +1,10 @@ DOMAIN_NAME := $(shell sed -e '/HOST=/!d;s/HOST=//g' env.txt) + DOMAIN_NAME_DASHED := $(shell echo $(DOMAIN_NAME)|sed -e 's/[.]/-/g') + all: env.txt @echo "default file env.txt created please run prepare and deploy if you adapted values in env.txt" + prepare: @mkdir -p output sed -e "s@__DOMAIN_NAME__@$(DOMAIN_NAME)@g;s@__DOMAIN_NAME_DASHED__@$(DOMAIN_NAME_DASHED)@g" *.yaml > output/mirotalk-k8s.yaml @@ -22,4 +25,3 @@ delete: kubectl delete configmap p2p || : kubectl delete -f output/mirotalk-k8s.yaml rm -rf env.txt output - \ No newline at end of file diff --git a/kubernetes/README.md b/kubernetes/README.md index 681e0780..fa668fe6 100644 --- a/kubernetes/README.md +++ b/kubernetes/README.md @@ -1,24 +1,28 @@ # Kubernetes deployment +![k8s](../public/images/k8s.png) + ## TLDR; and do not care way -``` + +```bash make sed -i s/localhost/myshinydomain.tld/g env.txt make prepare -# or make prepare-minikube -# for testing purposes make deploy ``` # Understanding way + If you would like to deploy Mirotalk to kubernetes this set of files can help you in that task Bellow is explanation of files in this folder which will form one output file in `output` folder ## ../.env.template and your file env.txt that you should prepare + Configuration file that is for now used to configure deployment you should copy `../.env.template` to current directory as `env.txt` and edit values inside to your liking + ``` cp ../.env.template env.txt ``` @@ -31,18 +35,23 @@ sed -i s/localhost/myshinydomain.tld/g env.txt ``` ## p2p-deployment.yaml -Main deployment file where you change image file if you would like to use yours if not official one (`image`: tag) + +Main deployment file where you change image file if you would like to use yours if not official one (`image`: tag) ## p2p-cert.yaml + This file represent definition of certificate (request) when using [Cert Manager](cert-manager.io) to generate letsencrypt or private certificates for your domain will be pulled out from `env.txt` ## p2p-ingress.yaml + This is generic ingress object in kubernetes that is responsible to route external traffic to mirotalk deployed application and if used in conjuction with p2p-cert.yaml (default) will provide TLS enabled access to your mirotalk instance ## p2p-service.yaml + Service required for ingress to be able to know how to access deployment ## Makefile + Helper file that allows running it to configure application how you would like after creating and changing configuration file (`env.txt`) run these two tasks, prepare will create deployment file @@ -50,11 +59,9 @@ and deployment will create configMap from prepared `env.txt` file. Please run after reading all this: -``` +```bash make # edit env.txt or use sed as in TLDR section :) make prepare make deploy ``` - - diff --git a/public/images/k8s.png b/public/images/k8s.png new file mode 100644 index 0000000000000000000000000000000000000000..b1efe85ec4f466c00c54b776a6c4e0b94a2eb651 GIT binary patch literal 13642 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⁣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