diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..43cf4ce --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.txt +*.xml diff --git a/apps/blahaj-common/app.mjs b/apps/blahaj-common/app.mjs new file mode 100644 index 0000000..038d99b --- /dev/null +++ b/apps/blahaj-common/app.mjs @@ -0,0 +1,31 @@ +// bun, es modules, minimal deps; one file serves all three services +import http from 'http'; + +const serviceName = process.env.SERVICE_NAME || 'blahaj'; +const emoji = process.env.SERVICE_EMOJI || '🦈'; +const friend = process.env.FRIEND_NAME || 'sea-friend'; +const port = Number(process.env.PORT || 8080); + +const ascii = ` + __ + _.-' \\ + _.-' _.-'\\) ${emoji} // ascii blahaj says hi! + (____.-' ~ waves ~ +`; + +const server = http.createServer((req, res) => { + const path = req.url || '/'; + const message = { + service: serviceName, + says: `hello, ${friend}! i am ${serviceName} ✨`, + path, + mascot: 'BLÅHAJ', + fun: 'soft, cuddly shark energy', + }; + res.setHeader('content-type', 'application/json; charset=utf-8'); + res.end(JSON.stringify({ message, ascii })); +}); + +server.listen(port, () => { + console.log(`${serviceName} listening on ${port};`); +}); diff --git a/apps/blahaj-common/bun.Dockerfile b/apps/blahaj-common/bun.Dockerfile new file mode 100644 index 0000000..8df934d --- /dev/null +++ b/apps/blahaj-common/bun.Dockerfile @@ -0,0 +1,6 @@ +FROM oven/bun:1.1.31-alpine AS base +WORKDIR /app +COPY app.mjs ./ +EXPOSE 8080 +ENV NODE_ENV=production +CMD ["bun", "run", "app.mjs"] diff --git a/apps/bubbles/deployment.yaml b/apps/bubbles/deployment.yaml new file mode 100644 index 0000000..8a54965 --- /dev/null +++ b/apps/bubbles/deployment.yaml @@ -0,0 +1,30 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: bubbles + namespace: demo +spec: + replicas: 2 + selector: { matchLabels: { app: bubbles } } + template: + metadata: + labels: { app: bubbles } + spec: + containers: + - name: app + image: blahaj-bun:dev + imagePullPolicy: IfNotPresent + ports: [{ containerPort: 8080, name: http }] + env: + - { name: SERVICE_NAME, value: "bubbles" } + - { name: SERVICE_EMOJI, value: "🫧" } + - { name: FRIEND_NAME, value: "coral" } +--- +apiVersion: v1 +kind: Service +metadata: + name: bubbles + namespace: demo +spec: + selector: { app: bubbles } + ports: [{ name: http, port: 80, targetPort: 8080 }] diff --git a/apps/bubbles/kustomization.yaml b/apps/bubbles/kustomization.yaml new file mode 100644 index 0000000..492f0af --- /dev/null +++ b/apps/bubbles/kustomization.yaml @@ -0,0 +1,3 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: [deployment.yaml, service.yaml] diff --git a/apps/coral/deployment.yaml b/apps/coral/deployment.yaml new file mode 100644 index 0000000..8b0d5b6 --- /dev/null +++ b/apps/coral/deployment.yaml @@ -0,0 +1,30 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: coral + namespace: demo +spec: + replicas: 2 + selector: { matchLabels: { app: coral } } + template: + metadata: + labels: { app: coral } + spec: + containers: + - name: app + image: blahaj-bun:dev + imagePullPolicy: IfNotPresent + ports: [{ containerPort: 8080, name: http }] + env: + - { name: SERVICE_NAME, value: "coral" } + - { name: SERVICE_EMOJI, value: "🪸" } + - { name: FRIEND_NAME, value: "kelp" } +--- +apiVersion: v1 +kind: Service +metadata: + name: coral + namespace: demo +spec: + selector: { app: coral } + ports: [{ name: http, port: 80, targetPort: 8080 }] diff --git a/apps/coral/kustomization.yaml b/apps/coral/kustomization.yaml new file mode 100644 index 0000000..492f0af --- /dev/null +++ b/apps/coral/kustomization.yaml @@ -0,0 +1,3 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: [deployment.yaml, service.yaml] diff --git a/apps/kelp/deployment.yaml b/apps/kelp/deployment.yaml new file mode 100644 index 0000000..03a0d07 --- /dev/null +++ b/apps/kelp/deployment.yaml @@ -0,0 +1,30 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: kelp + namespace: demo +spec: + replicas: 2 + selector: { matchLabels: { app: kelp } } + template: + metadata: + labels: { app: kelp } + spec: + containers: + - name: app + image: blahaj-bun:dev + imagePullPolicy: IfNotPresent + ports: [{ containerPort: 8080, name: http }] + env: + - { name: SERVICE_NAME, value: "kelp" } + - { name: SERVICE_EMOJI, value: "🌿" } + - { name: FRIEND_NAME, value: "blahaj" } +--- +apiVersion: v1 +kind: Service +metadata: + name: kelp + namespace: demo +spec: + selector: { app: kelp } + ports: [{ name: http, port: 80, targetPort: 8080 }] diff --git a/apps/kelp/kustomization.yaml b/apps/kelp/kustomization.yaml new file mode 100644 index 0000000..ab948eb --- /dev/null +++ b/apps/kelp/kustomization.yaml @@ -0,0 +1,5 @@ +# eh I wanted to try it + +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: [deployment.yaml, service.yaml] diff --git a/apps/reef/Dockerfile b/apps/reef/Dockerfile new file mode 100644 index 0000000..7a042fd --- /dev/null +++ b/apps/reef/Dockerfile @@ -0,0 +1,6 @@ +FROM oven/bun:1.1.31-alpine +WORKDIR /app +COPY server.mjs ./server.mjs +COPY public ./public +EXPOSE 8080 +CMD ["bun", "run", "server.mjs"] diff --git a/apps/reef/deployment.yaml b/apps/reef/deployment.yaml new file mode 100644 index 0000000..2db7ee0 --- /dev/null +++ b/apps/reef/deployment.yaml @@ -0,0 +1,26 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: reef + namespace: demo +spec: + replicas: 1 + selector: { matchLabels: { app: reef } } + template: + metadata: + labels: { app: reef } + spec: + containers: + - name: app + image: blahaj-bun:dev + imagePullPolicy: IfNotPresent + ports: [{ name: http, containerPort: 8080 }] +--- +apiVersion: v1 +kind: Service +metadata: + name: reef + namespace: demo +spec: + selector: { app: reef } + ports: [{ name: http, port: 80, targetPort: 8080 }] diff --git a/apps/reef/kustomization.yaml b/apps/reef/kustomization.yaml new file mode 100644 index 0000000..6cb0a5d --- /dev/null +++ b/apps/reef/kustomization.yaml @@ -0,0 +1,3 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: [deployment.yaml] diff --git a/apps/reef/public/app.js b/apps/reef/public/app.js new file mode 100644 index 0000000..cb2d54b --- /dev/null +++ b/apps/reef/public/app.js @@ -0,0 +1,44 @@ +const endpoints = [ + { path: '/blahaj', title: 'bubbles greeter (blahaj)' }, + { path: '/kelp', title: 'kelp' }, + { path: '/coral', title: 'coral' }, + { path: '/bubbles', title: 'bubbles' }, +]; + +const cards = document.querySelector('#cards'); + +function cardDOM({ title, ok, data, error }) { + const el = document.createElement('article'); + el.className = `card ${ok ? 'ok' : 'err'}`; + + const h2 = document.createElement('h2'); + h2.textContent = title; + el.appendChild(h2); + + const pre = document.createElement('pre'); + pre.textContent = ok ? JSON.stringify(data, null, 2) : String(error || 'error'); + el.appendChild(pre); + + return el; +} + +async function fetchOne(path) { + const r = await fetch(path, { headers: { 'accept': 'application/json' } }); + if (!r.ok) throw new Error(`${path} -> ${r.status}`); + return r.json(); +} + +async function refresh() { + cards.textContent = ''; // clear + for (const ep of endpoints) { + try { + const data = await fetchOne(ep.path); + cards.appendChild(cardDOM({ title: ep.title, ok: true, data })); + } catch (err) { + cards.appendChild(cardDOM({ title: ep.title, ok: false, error: err.message })); + } + } +} + +document.querySelector('#refresh').addEventListener('click', () => refresh()); +refresh(); diff --git a/apps/reef/public/index.html b/apps/reef/public/index.html new file mode 100644 index 0000000..c8b7ee8 --- /dev/null +++ b/apps/reef/public/index.html @@ -0,0 +1,23 @@ + + +
+ +cute sea-friends saying hi (live from your mesh)
+