From ffde44ae5789ef05f0b81feaf267a1de3d0d9dd3 Mon Sep 17 00:00:00 2001 From: Patrice Ferlet Date: Sun, 13 Jul 2025 12:15:12 +0200 Subject: [PATCH] chore(katenary): Use the new organization repository --- .posthtmlrc | 6 + Makefile | 24 ++ add-domain.py | 74 +++++ compose.katenary.yaml | 14 + compose.yaml | 17 ++ src/bg-head.webp | Bin 0 -> 48892 bytes src/icon.ico | Bin 0 -> 24838 bytes src/index.html | 49 +++ src/links.js | 60 ++++ src/main.css | 535 +++++++++++++++++++++++++++++++++ src/partials/features.html | 41 +++ src/partials/footer.html | 53 ++++ src/partials/get-started.html | 12 + src/partials/header.html | 12 + src/partials/how-it-works.html | 45 +++ src/partials/how-to-use.html | 92 ++++++ src/partials/navbar.html | 24 ++ src/partials/tutorials.html | 22 ++ 18 files changed, 1080 insertions(+) create mode 100644 .posthtmlrc create mode 100644 Makefile create mode 100644 add-domain.py create mode 100644 compose.katenary.yaml create mode 100644 compose.yaml create mode 100644 src/bg-head.webp create mode 100644 src/icon.ico create mode 100644 src/index.html create mode 100644 src/links.js create mode 100644 src/main.css create mode 100644 src/partials/features.html create mode 100644 src/partials/footer.html create mode 100644 src/partials/get-started.html create mode 100644 src/partials/header.html create mode 100644 src/partials/how-it-works.html create mode 100644 src/partials/how-to-use.html create mode 100644 src/partials/navbar.html create mode 100644 src/partials/tutorials.html diff --git a/.posthtmlrc b/.posthtmlrc new file mode 100644 index 0000000..6537f5d --- /dev/null +++ b/.posthtmlrc @@ -0,0 +1,6 @@ +{ + "plugins": { + "posthtml-doctype": { "doctype": "HTML 5" }, + "posthtml-include": {} + } +} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5aa686a --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +RELEASE=website +NS=katenary + +build: dist chart + +chart: dist + katenary convert -f -p deploy + +dist: $(wildcard src/* compose.yaml) + rm -rf dist + podman run --rm -it -u $(id -u):$(id -g) -v $(PWD):/app -w /app node:alpine sh -c "yarn install && yarn parcel build --no-source-maps" + +deploy: + helm -n $(NS) upgrade --install $(RELEASE) ./chart/ -f override.yaml --create-namespace + sleep 1 + $(MAKE) add-redirect + kubectl -n $(NS) rollout restart deployment $(RELEASE)-server + +add-redirect: + kubectl -n $(NS) apply -f <(./venv/bin/python add-domain.py) + +serve: + rm -rf dist + podman compose up diff --git a/add-domain.py b/add-domain.py new file mode 100644 index 0000000..b86d376 --- /dev/null +++ b/add-domain.py @@ -0,0 +1,74 @@ +"""Script to add a domain without tht "www" and force redirect to www with TLS + +To apply the changes to the cluster, you can use the following command: + + kubectl -n apply -f <(python add-domain.py) + + +""" + +import os +import subprocess + +import yaml + + +def get_ingress(ns: str, name: str) -> dict: + """Get the ingress object from the cluster""" + process = subprocess.Popen( + ["kubectl", "get", "ingress", "-n", ns, name, "-o", "yaml"], + stdout=subprocess.PIPE, + ) + stdout, _ = process.communicate() + return yaml.safe_load(stdout) + + +def tranform(name: str, ns: str, domain: str) -> dict: + """Return the transformed ingress object""" + + # get the ingress content + ingress = get_ingress(ns, name) + + # remove all nginx annotations + ingress["metadata"]["annotations"] = { + k: v for k, v in ingress["metadata"]["annotations"].items() if "nginx" not in k + } + + # change the name of the ingress + ingress["metadata"]["name"] = f"{name}-redirect" + + # add nginx.ingress.kubernetes.io/permanent-redirect annotation + ingress["metadata"]["annotations"].update( + {"nginx.ingress.kubernetes.io/permanent-redirect": f"https://www.{domain}"} + ) + + # change hostname + ingress["spec"]["tls"][0]["hosts"] = [domain] + ingress["spec"]["rules"][0]["host"] = domain + + # change the secret name + ingress["spec"]["tls"][0]["secretName"] = f"{name}-redirect" + + # cleanup the metadata + ingress.pop("status") + to_remove = [ + "creationTimestamp", + "generation", + "resourceVersion", + "selfLink", + "uid", + ] + for meta in to_remove: + ingress["metadata"].pop(meta) if meta in ingress["metadata"] else None + + # print the new yaml content + return ingress + + +if __name__ == "__main__": + name = os.getenv("NAME", "website-server") # name of the ingress + ns = os.getenv("NAMESPACE", "katenary") # namespace + domain = os.getenv("DOMAIN", "katenary.org") # domain name without www + transformed = tranform(name, ns, domain) + + print(yaml.dump(transformed)) diff --git a/compose.katenary.yaml b/compose.katenary.yaml new file mode 100644 index 0000000..81631b9 --- /dev/null +++ b/compose.katenary.yaml @@ -0,0 +1,14 @@ +services: + server: + image: docker.io/nginx + ports: + - 8080:80 + volumes: + - ./dist:/usr/share/nginx/html + labels: + katenary.v3/ingress: |- + hostname: katenary.org + port: 80 + + katenary.v3/configmap-files: |- + - ./dist diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..a6b2f0d --- /dev/null +++ b/compose.yaml @@ -0,0 +1,17 @@ +services: + dev: + image: docker.io/node:alpine + volumes: + - ./:/app:z + working_dir: /app + user: ${UID}:${GROUPS} + command: + - sh + - -c + - |- + yarn install + yarn parcel serve --dist-dir /tmp/dist + ports: + - 1234:1234 + labels: + katenary.v3/ignore: true diff --git a/src/bg-head.webp b/src/bg-head.webp new file mode 100644 index 0000000000000000000000000000000000000000..fc0a0b30fc1ade22a1d44aafc459b8e181b6fc6a GIT binary patch literal 48892 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 literal 0 HcmV?d00001 diff --git a/src/icon.ico b/src/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0a4b332d3d64579050451639ef6122d1a16a745b GIT binary patch literal 24838 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 VVR*r|)6TS=w%vC1-`zhH`hPJge)IqU literal 0 HcmV?d00001 diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..bee68e8 --- /dev/null +++ b/src/index.html @@ -0,0 +1,49 @@ + + + + + + + + + + Katenary - Effortless Helm Chart Conversion + + + + + + + + + + + + + + +

+ + + + + +
+ + + + diff --git a/src/links.js b/src/links.js new file mode 100644 index 0000000..97c5660 --- /dev/null +++ b/src/links.js @@ -0,0 +1,60 @@ +document.addEventListener("DOMContentLoaded", () => { + const sections = document.querySelectorAll("main > section, body > header"); + const links = document.querySelectorAll("nav a:not([target=_blank])"); + const linksArray = Array.from(links); + + let scrollingOnClick = false; // Deactivate the observer if the scroll is on a link click + + // Intersection Observer + const observer = new IntersectionObserver( + (entries) => { + if (scrollingOnClick) return; // ignore if the scroll is manual + + entries.forEach((entry) => { + if (entry.isIntersecting) { + const id = entry.target.id; + const link = linksArray.find((link) => link.href.includes(`#${id}`)); + + linksArray.forEach((link) => link.classList.remove("active")); + if (link) link.classList.add("active"); + + // update URL + history.replaceState(null, null, `#${id}`); + } + }); + }, + { rootMargin: "-50% 0px -50% 0px" }, + ); + + sections.forEach((section) => observer.observe(section)); + + // Gestion du clic sur un lien + linksArray.forEach((link) => { + link.addEventListener("click", (e) => { + e.preventDefault(); // avoid default navigation + + const targetId = link.getAttribute("href").slice(1); + const targetSection = document.getElementById(targetId); + + // deactivate observer temporarily + scrollingOnClick = true; + + // scroll to the target + targetSection.scrollIntoView({ behavior: "smooth" }); + + // update link state + linksArray.forEach((link) => link.classList.remove("active")); + link.classList.add("active"); + + // update URL + history.replaceState(null, null, `#${targetId}`); + + // on scroll end, reactivate the observer + const onScrollEnd = () => { + scrollingOnClick = false; + window.removeEventListener("scroll", onScrollEnd); // Nettoyage + }; + window.addEventListener("scroll", onScrollEnd); + }); + }); +}); diff --git a/src/main.css b/src/main.css new file mode 100644 index 0000000..11f98ec --- /dev/null +++ b/src/main.css @@ -0,0 +1,535 @@ +/* styles.css */ +:root { + --primary-color: #2a1827; + --secondary-color: #6c757d; + --dark-color: #343a40; + --light-color: #f4f4f4; + --white: #fff; + --danger-color: #dc3545; + --covered: 50%; +} + +html { + scroll-behavior: smooth; +} + +body { + font-family: Arial, sans-serif; + line-height: 1.6; + margin: 0; + padding: 0; + color: #333; + overflow-x: hidden; +} + +img { + max-width: 100%; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +.header { + background: var(--dark-color); + background-image: url(./bg-head.webp); + background-size: cover; + background-repeat: no-repeat; + background-position: bottom; + background-attachment: fixed; + background-blend-mode: multiply; + color: #fff; + text-align: center; + padding: 50px 20px; +} + +.header .container { + display: flex; + flex-direction: column; + justify-content: space-evenly; + display: flex; + height: 100%; +} + +@media (min-width: 768px) { + .header { + display: flex; + align-items: center; + height: 100vh; + padding: 0; + padding-bottom: 115px; + } + + main>section { + flex: 1; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + } +} + +.header h1 { + font-size: 3rem; + margin: 0; + background-image: url("https://github.com/Katenary/katenary/raw/refs/heads/develop/doc/docs/statics/logo-vertical.svg"); + color: transparent; + background-size: contain; + background-repeat: no-repeat; + background-position: center; + height: 265px; +} + +.header p { + font-size: 1.2rem; + margin: 20px 0; +} + +.btn-primary { + display: inline-block; + background: #fff; + color: var(--primary-color); + padding: 10px 20px; + border-radius: 5px; + text-decoration: none; + font-weight: bold; + margin-top: 20px; +} + +.btn-primary:hover { + background: #0056b3; + color: #fff; +} + +.features { + background: var(--light-color); + padding: 50px 20px; + text-align: center; +} + +.features h2 { + font-size: 2.5rem; + margin-bottom: 20px; +} + +.feature-grid { + /* + display: grida; + gap: 20px; + margin-top: 20px; + grid-auto-rows: 200px; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + */ + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 20px; +} + +@keyframes slidingLeft { + from { + transform: translateX(-100vw); + filter: opacity(0) blur(10px); + } + + to { + transform: translateX(0); + filter: opacity(1) blur(0); + } +} + +@keyframes slidingRight { + from { + transform: translateX(100vw); + filter: opacity(0) blur(10px); + } + + to { + transform: translateX(0); + filter: opacity(1) blur(0); + } +} + +.feature-item { + background: var(--white); + border: 1px solid #ddd; + flex: 1 1 200px; + padding: 20px; + border-radius: 8px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); +} + +@media (min-width: 768px) { + :root { + --animation-slide: entry 0% contain 0%; + } + + .from-left { + view-timeline: --reveal-blockl; + view-timeline-axis: block; + animation: linear slidingLeft forwards; + animation-range: var(--animation-slide); + animation-timeline: --reveal-blockl; + } + + .from-right { + view-timeline: --reveal-blockr; + view-timeline-axis: block; + animation: linear slidingRight forwards; + animation-range: var(--animation-slide); + animation-timeline: --reveal-blockr; + } +} + +.how-it-works { + padding: 50px 20px; + text-align: center; +} + +.how-to-use { + padding: 50px 20px; + text-align: center; +} + +.tutorials { + padding: 50px 20px; + text-align: center; +} + +h2 { + font-size: 2.5rem; + margin-bottom: 20px; + text-align: center; +} + +.how-it-works ol { + list-style: decimal inside; + text-align: left; + max-width: 800px; + margin: 0 auto; + padding: 0; +} + +.image-placeholder { + margin: 30px auto; + height: 200px; + width: 100%; + max-width: 800px; + display: flex; + justify-content: center; + align-items: center; + font-size: 1.2rem; + border-radius: 8px; +} + +.image-placeholder img { + margin: 10px; + width: 100%; + height: 100%; + object-fit: cover; + border-radius: 8px; +} + +.get-started { + background: var(--primary-color); + color: var(--white); + padding: 50px 20px; + text-align: center; +} + +.get-started pre { + background: var(--white); + color: #333; + padding: 10px; + margin: 20px 0; + border-radius: 5px; +} + +div.video { + padding-top: 25px; +} + +pre { + text-align: left; +} + +@media (min-width: 768px) { + .example { + display: flex; + justify-content: space-between; + align-items: center; + gap: 20px; + } + + iframe { + width: 100%; + height: 500px; + } +} + +iframe { + max-width: 100%; +} + +section { + width: 100%; +} + +section:nth-child(even) .example { + text-align: right; + flex-direction: row-reverse !important; +} + +section:nth-child(odd) .example { + text-align: left; + flex-direction: row; +} + +section:nth-child(even) .example h3 { + text-align: right; +} + +.example>div { + flex: 1 1 200px; + align-content: center; +} + +code.hljs { + border-radius: 5px; + box-shadow: 0 6px 15px rgba(0, 0, 0, 0.5); +} + +p code { + background: var(--dark-color); + color: var(--light-color); + padding: 1px 5px; + border-radius: 5px; + display: inline-block; +} + +section.alternate:nth-child(odd) { + background: var(--light-color); + color: var(--dark-color); +} + +section.alternate:nth-child(even) { + background: var(--dark-color); + color: var(--light-color); +} + +#menu-toggle { + position: fixed; + z-index: 11; + margin: 0; +} + +@media (min-width: 768px) { + #menu-toggle { + display: none; + } + + .navbar { + background: var(--white); + color: var(--dark-color); + display: flex; + justify-content: space-evenly; + align-items: center; + position: fixed; + top: 0px; + z-index: 10; + width: 100%; + } + + .navbar .container { + padding: 0; + } + + nav ul { + display: flex; + flex-wrap: wrap; + list-style: none; + } + + nav ul li { + margin: 0 10px; + } + + nav ul li a { + color: var(--dark-color); + text-decoration: none; + display: block; + padding: 10px; + } + + nav ul li a:hover { + color: var(--light-color); + background: var(--dark-color); + } + + nav ul li a.active { + color: var(--light-color) !important; + background: var(--dark-color) !important; + } +} + +@media (max-width: 768px) { + .navbar { + display: none !important; + } + + .navbar:hover, + #menu-toggle:focus~.navbar { + display: block !important; + } + + .navbar { + opacity: 0.8; + position: fixed; + top: 10px; + left: 0px; + color: var(--white); + font-size: 1rem; + cursor: pointer; + background: var(--dark-color); + color: var(--white); + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 20px; + border: 1px solid var(--dark-color); + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + border-radius: 5px; + } + + .navbar:has(a:active) { + display: none; + } + + nav ul { + display: block; + list-style: none; + padding: 0; + margin: 0; + } + + nav ul li { + margin: 0; + } + + nav ul li a { + color: var(--white); + text-decoration: none; + display: block; + padding: 10px; + } +} + +footer { + display: flex; + flex-wrap: wrap; + background: #333; + color: #fff; + text-align: center; + padding: 20px 0; + font-size: 0.9rem; + flex-wrap: wrap; +} + +footer section { + padding: 20px; + text-align: center; + flex: 1 1 250px; +} + +footer section p { + font-weight: bold; +} + +footer ul { + list-style: none; + padding: 0; +} + +footer ul li { + margin: 5px 0; +} + +footer a { + color: var(--white); +} + +footer .container { + display: flex; + flex: 1 1 auto; + justify-content: space-between; + align-items: start; + width: 100%; + flex-wrap: wrap; +} + +footer .container>p { + flex: 1 1 auto; + text-align: center; +} + +footer section { + flex: 1 1 auto; + align-self: normal; + position: relative; +} + +@media (min-width: 768px) { + footer section:after { + content: " "; + display: block; + background: #fff; + position: absolute; + right: 0; + top: 5%; + height: 90%; + width: 1px; + filter: opacity(0.5) blur(1px); + } + + footer section:last-child:after { + display: none; + } +} + +.large-icon { + font-size: 3rem; +} + +@keyframes bouncing { + 0% { + transform: translateY(0); + } + + 50% { + transform: translateY(-20px); + } + + 100% { + transform: translateY(0); + } +} + +.down { + position: relative; + bottom: 0; +} + +a.down { + background: var(--white); + color: var(--dark-color); + width: 120px; + height: 120px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + align-self: center; + animation: bouncing 2s infinite; +} diff --git a/src/partials/features.html b/src/partials/features.html new file mode 100644 index 0000000..a6d8330 --- /dev/null +++ b/src/partials/features.html @@ -0,0 +1,41 @@ +
+
+

Why Katenary?

+

+ Simplify your deployment workflow by converting Compose files into + production-ready Helm Charts with ease. +

+
+
+

Automated Conversion

+

+ Generate complete Helm Charts from your Compose files effortlessly. +

+
+
+

Flexible Configuration

+

Customize deployments with `values.yaml` and environment labels.

+
+
+

Dependency Management

+

+ Ensure proper service startup sequences using `depends_on` support. +

+
+
+

Open Source

+

Free, opensource, under the MIT license!

+
+
+
+ +
+
+
diff --git a/src/partials/footer.html b/src/partials/footer.html new file mode 100644 index 0000000..7119f96 --- /dev/null +++ b/src/partials/footer.html @@ -0,0 +1,53 @@ +
+
+
+
+

Special thanks

+

Content creation:

+
    +
  • + Blender that helps a lot to create + videos and animations +
  • +
  • + Highlight.js for the code + syntax highlighting +
  • +
+

For graphical elements

+ +
    +
  • + Inkscape for the icons and images +
  • +
  • + The Gimp for many others image + manipulation +
  • +
+
+
+
+
+

Links

+

For this website:

+ +
+
+
+
+

© 2024, 2025 Katenary. Open Source Project under MIT License.

+
+
diff --git a/src/partials/get-started.html b/src/partials/get-started.html new file mode 100644 index 0000000..4017c56 --- /dev/null +++ b/src/partials/get-started.html @@ -0,0 +1,12 @@ +
+
+

Get Started

+

Download Katenary’s binary and start using it today.

+
sh <(curl -sSL https://raw.githubusercontent.com/Katenary/katenary/master/install.sh)
+

+ Go to GitHub +

+
+
diff --git a/src/partials/header.html b/src/partials/header.html new file mode 100644 index 0000000..8ae7203 --- /dev/null +++ b/src/partials/header.html @@ -0,0 +1,12 @@ +
+
+

Katenary

+

Effortless Helm Chart Conversion for Kubernetes Deployments

+ +
+
diff --git a/src/partials/how-it-works.html b/src/partials/how-it-works.html new file mode 100644 index 0000000..702ab6e --- /dev/null +++ b/src/partials/how-it-works.html @@ -0,0 +1,45 @@ +
+
+

How It Works

+

+ Katenary simply read your compose.yaml file (or + docker-compose.yaml) and use + official libraries to read it and generate Kubernetes + resources as YAML. +

+

+ Then, it adds templating conditions, values file, define a + Chart.yaml file, adapt dependencies if needed, and many + others things. +

+

+ Using configuration files to be mounted? No problem, + Katenary will create ConfigMaps if you declared that thes + directories or files are statics. +
+ (Do not do this for sources of your project, use it for simple + configuration files) +

+

+ The result is a complete "Helm Chart" that can be installed, configured, + packaged and shared. +

+
+ Katenary Workflow +
+

+ Almost everything can be overriden as Ingresses, Dependencies, values, + environment variables, secrets... +

+
    +
  1. Add optional labels to your Compose files.
  2. +
  3. Run katenary convert from the command line.
  4. +
  5. Deploy the generated Helm Chart in Kubernetes.
  6. +
+
+
diff --git a/src/partials/how-to-use.html b/src/partials/how-to-use.html new file mode 100644 index 0000000..b4400a8 --- /dev/null +++ b/src/partials/how-to-use.html @@ -0,0 +1,92 @@ +
+
+

How to use?

+

+ Install the binary, and use katenar convert command line + inside your project directory +

+

+ You can adapt your compose YAML file with labels, or add a + compose.katenary.yaml file to override your project. +

+

+ You may also use a specific katenary.yaml file that accepts + the directives without using labels. +

+
+
+
+

Only add labels! (if needed!)

+

+ You can adapt, configure, or change the conversion behaviour addind + labels. +

+

+ It + doesn't change the docker compose or + podman compose + behaviour. It is only used while using + katenary compose command line +

+

+ There are + plenty of labels + to help you to customize and adapt the resulting Helm Chart. +

+
+
+

+# your "docker-compose.yml", or "compose.yaml"
+services:
+web:
+  image: docker.io/nginx:latest
+  ports:
+    - "80:80"
+  labels:
+    # generate an ingress resource in the Helm Chart
+    katenary.io/ingress: |-
+      hostname: example.com
+      port: 80
+          
+
+
+
+ +
+
+
+

Ease the deployment

+

+ Kubernetes somtimes lacks of automation. Katenary helps you to add + what is needed, like having a + depends_on feature. +

+
+
+

+# your "docker-compose.yml", or "compose.yaml"
+services:
+  db:
+    image: docker.io/postgres:latest
+    # ...
+    labels:
+      katenary.v3/ports: |-
+        - 5432
+      
+  web:
+    image: php:fpm
+    # ...
+    depends_on:
+      - db
+            
+
+
+
+
+
diff --git a/src/partials/navbar.html b/src/partials/navbar.html new file mode 100644 index 0000000..7956c7b --- /dev/null +++ b/src/partials/navbar.html @@ -0,0 +1,24 @@ + + diff --git a/src/partials/tutorials.html b/src/partials/tutorials.html new file mode 100644 index 0000000..bd013ac --- /dev/null +++ b/src/partials/tutorials.html @@ -0,0 +1,22 @@ +
+
+

Watch the Tutorials

+

+ A playlist + is progressivelly filled to help the Katenary adoption. Take a look and + learn how it is simple. +

+ +
+