Initial commit: mushroom, zetikettes
With basic config to have TLS certs with ACME. It works! TODO: - gitea - bar-jupyter
This commit is contained in:
22
jenova/ingress.yaml
Normal file
22
jenova/ingress.yaml
Normal file
@@ -0,0 +1,22 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: jenova.ponteilla.net
|
||||
annotations:
|
||||
traefik.ingress.kubernetes.io/router.tls.certresolver: "default"
|
||||
spec:
|
||||
rules:
|
||||
- host: jenova.ponteilla.net
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: jenova
|
||||
port:
|
||||
number: 80
|
||||
tls:
|
||||
- hosts:
|
||||
- jenova.ponteilla.net
|
||||
secretName: jenova-tls
|
||||
13
jenova/nginx-config.yaml
Normal file
13
jenova/nginx-config.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: nginx-config
|
||||
data:
|
||||
default.conf: |
|
||||
server {
|
||||
listen 80;
|
||||
root /usr/share/nginx/html;
|
||||
location /zetikettes {
|
||||
return 301 https://zetikettes.jenova.ponteilla.net;
|
||||
}
|
||||
}
|
||||
81
jenova/web.yaml
Normal file
81
jenova/web.yaml
Normal file
@@ -0,0 +1,81 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
app: web
|
||||
name: web
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: web
|
||||
strategy: {}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: web
|
||||
spec:
|
||||
containers:
|
||||
- image: nginx
|
||||
name: nginx
|
||||
ports:
|
||||
- containerPort: 80
|
||||
volumeMounts:
|
||||
- name: index
|
||||
mountPath: /usr/share/nginx/html/index.html
|
||||
subPath: index.html
|
||||
- name: nginx-config
|
||||
mountPath: /etc/nginx/conf.d/default.conf
|
||||
subPath: default.conf
|
||||
volumes:
|
||||
- name: index
|
||||
configMap:
|
||||
name: jenova-index-html
|
||||
- name: nginx-config
|
||||
configMap:
|
||||
name: nginx-config
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: jenova-index-html
|
||||
data:
|
||||
index.html: |
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>P</title>
|
||||
</head>
|
||||
<body>
|
||||
<div align="center">
|
||||
<div>
|
||||
<pre>
|
||||
.----------------.
|
||||
| .--------------. |
|
||||
| | ______ | |
|
||||
| | |_ __ \ | |
|
||||
| | | |__) | | |
|
||||
| | | ___/ | |
|
||||
| | _| |_ | |
|
||||
| | |_____| | |
|
||||
| | | |
|
||||
| '--------------' |
|
||||
'----------------'
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: jenova
|
||||
spec:
|
||||
selector:
|
||||
app: web
|
||||
ports:
|
||||
- port: 80
|
||||
13
mushroom/Makefile
Normal file
13
mushroom/Makefile
Normal file
@@ -0,0 +1,13 @@
|
||||
.PHONY: lint
|
||||
lint: ## Lint the helm chart
|
||||
helm lint helm
|
||||
|
||||
.PHONY: deploy
|
||||
deploy: ## Deploy the helm chart on a running cluster
|
||||
helm upgrade --install mushroom ./helm
|
||||
|
||||
.PHONY: help
|
||||
help: ## Show this help
|
||||
@echo Noteworthy targets:
|
||||
@egrep '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
||||
.DEFAULT_GOAL := help
|
||||
23
mushroom/helm/.helmignore
Normal file
23
mushroom/helm/.helmignore
Normal file
@@ -0,0 +1,23 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
||||
6
mushroom/helm/Chart.yaml
Normal file
6
mushroom/helm/Chart.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
apiVersion: v2
|
||||
name: mushroom
|
||||
description: mushroom server and web front-end
|
||||
type: application
|
||||
version: 0.1.0
|
||||
appVersion: "0.3"
|
||||
211
mushroom/helm/index.html
Normal file
211
mushroom/helm/index.html
Normal file
@@ -0,0 +1,211 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>A simple netcat client</title>
|
||||
<link rel="icon">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<style>
|
||||
body {
|
||||
background-color: rgb(4, 18, 0);
|
||||
color: rgb(199, 224, 192);
|
||||
}
|
||||
|
||||
.container {
|
||||
padding: 32px;
|
||||
width: 800px;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 480px) {
|
||||
body {
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 100%;
|
||||
padding: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.console {
|
||||
height: 480px;
|
||||
border: solid;
|
||||
border-radius: 8px;
|
||||
border-color: rgb(76, 75, 83);
|
||||
padding: 10px;
|
||||
|
||||
background-color: rgb(8, 36, 0);
|
||||
|
||||
margin-bottom: 10px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.console-text {
|
||||
overflow: auto;
|
||||
max-height: calc(100% - 20px);
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.echo {
|
||||
font-size: 80%;
|
||||
color: rgb(133, 199, 170);
|
||||
}
|
||||
|
||||
.online-status {
|
||||
font-weight: bold;
|
||||
color: greenyellow;
|
||||
font-size: larger;
|
||||
display: none;
|
||||
text-align: center;
|
||||
width: 120px;
|
||||
}
|
||||
</style>
|
||||
<script src="https://code.jquery.com/jquery-3.7.0.slim.min.js"></script>
|
||||
<script>
|
||||
$(() => {
|
||||
let ws;
|
||||
const history = [];
|
||||
let history_cursor;
|
||||
|
||||
function colorize(input) {
|
||||
var mapObj = {
|
||||
30: '#000000',
|
||||
31: '#cc0000',
|
||||
32: '#4e9a06',
|
||||
33: '#c4a000',
|
||||
34: '#729fcf',
|
||||
35: '#75507b',
|
||||
36: '#06989a',
|
||||
37: '#d3d7cf',
|
||||
|
||||
90: '#555753',
|
||||
91: '#ef2929',
|
||||
92: '#8ae234',
|
||||
93: '#fce94f',
|
||||
94: '#32afff',
|
||||
95: '#ad7fa8',
|
||||
96: '#34e2e2',
|
||||
97: '#ffffff',
|
||||
};
|
||||
const colored = input.replace(/\033\[(?:0;)?(\d+)m/g, function (_, color) {
|
||||
return `</span><span style="color:${mapObj[color]}">`;
|
||||
}).replace(/\033\[0m/g, '</span><span>');
|
||||
|
||||
return `<span>${colored}</span>`;
|
||||
}
|
||||
|
||||
document.addEventListener("visibilitychange", () => {
|
||||
if (!document.hidden) {
|
||||
$('link')[0].href = document.createElement('canvas').toDataURL();
|
||||
}
|
||||
});
|
||||
|
||||
function notifyActivity() {
|
||||
if (document.hasFocus()) {
|
||||
return;
|
||||
}
|
||||
|
||||
let c = document.createElement('canvas');
|
||||
c.width = 16;
|
||||
c.height = 16;
|
||||
let ctx = c.getContext('2d');
|
||||
ctx.fillStyle = "red";
|
||||
ctx.beginPath();
|
||||
ctx.arc(7, 7, 3, 0, 2*Math.PI);
|
||||
ctx.fill();
|
||||
$('link')[0].href = c.toDataURL();
|
||||
}
|
||||
|
||||
$('.input').keydown(e => {
|
||||
if (e.key == "ArrowUp") {
|
||||
if (history_cursor === undefined) {
|
||||
history_cursor = history.length;
|
||||
} else if (history_cursor === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
history_cursor--;
|
||||
$('.input').val(history[history_cursor]);
|
||||
return false;
|
||||
} else if (e.key == "ArrowDown" && history_cursor !== undefined) {
|
||||
if (history_cursor >= history.length - 1) {
|
||||
history_cursor = undefined;
|
||||
$('.input').val('');
|
||||
return false;
|
||||
}
|
||||
history_cursor++;
|
||||
$('.input').val(history[history_cursor]);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
$('.input').keypress(e => {
|
||||
if (e.key == "Enter") {
|
||||
if (ws === undefined || ws.readyState !== 1) {
|
||||
return true;
|
||||
}
|
||||
const sh = $('.console-text').get(0).scrollHeight;
|
||||
const line = $('.input').val()
|
||||
$('.console-text').append('<br /> <span class="echo">> ' + line + '</span><br />').scrollTop(sh);
|
||||
$('.input').val('');
|
||||
|
||||
history.push(line);
|
||||
history_cursor = undefined;
|
||||
|
||||
ws.send(`${line}\n`);
|
||||
|
||||
return false; //<---- Add this line
|
||||
}
|
||||
});
|
||||
|
||||
function connect() {
|
||||
ws = new WebSocket($('input[name=wshost]').val());
|
||||
ws.onerror = console.log;
|
||||
ws.onclose = e => {
|
||||
$('.online-status').hide();
|
||||
$('input[type=button]').prop('value', 'Connect');
|
||||
};
|
||||
ws.onopen = e => {
|
||||
$('.online-status').show();
|
||||
$('.input').focus();
|
||||
};
|
||||
ws.onmessage = m => {
|
||||
m.data.text().then(text => {
|
||||
text = text
|
||||
.replaceAll('&', '&')
|
||||
.replaceAll('<', '<')
|
||||
.replaceAll('>', '>');
|
||||
const sh = $('.console-text').get(0).scrollHeight;
|
||||
$('.console-text').append(colorize(text)).scrollTop(sh);
|
||||
});
|
||||
notifyActivity();
|
||||
};
|
||||
$('input[type=button]').prop('value', 'Disconnect');
|
||||
}
|
||||
|
||||
function disconnect() {
|
||||
ws.close();
|
||||
}
|
||||
|
||||
$('input[type=button]').click(() => {
|
||||
if (ws && ws.readyState !== WebSocket.CLOSED) {
|
||||
disconnect();
|
||||
} else {
|
||||
connect();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container">
|
||||
<input name="wshost" value="wss://mushroom.jenova.ponteilla.net/ws"><input type="button" value="Connect">
|
||||
<span class="online-status">online</span>
|
||||
<div class="console">
|
||||
<pre class="console-text"></pre>
|
||||
</div>
|
||||
<input class="input" style="width:100%">
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
24
mushroom/helm/nginx-default.conf
Normal file
24
mushroom/helm/nginx-default.conf
Normal file
@@ -0,0 +1,24 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
location / {
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm;
|
||||
}
|
||||
|
||||
location /ws {
|
||||
proxy_pass http://127.0.0.1:1338;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $host;
|
||||
|
||||
proxy_read_timeout 10h;
|
||||
}
|
||||
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
location = /50x.html {
|
||||
root /usr/share/nginx/html;
|
||||
}
|
||||
}
|
||||
51
mushroom/helm/templates/_helpers.tpl
Normal file
51
mushroom/helm/templates/_helpers.tpl
Normal file
@@ -0,0 +1,51 @@
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "mushroom.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "mushroom.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "mushroom.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "mushroom.labels" -}}
|
||||
helm.sh/chart: {{ include "mushroom.chart" . }}
|
||||
{{ include "mushroom.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "mushroom.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "mushroom.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
36
mushroom/helm/templates/ingress.yaml
Normal file
36
mushroom/helm/templates/ingress.yaml
Normal file
@@ -0,0 +1,36 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ include "mushroom.fullname" . }}
|
||||
labels:
|
||||
{{- include "mushroom.labels" . | nindent 4 }}
|
||||
{{- with .Values.ingress.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.ingress.className }}
|
||||
ingressClassName: {{ . }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.tls }}
|
||||
tls:
|
||||
- hosts:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- host: {{ . | quote }}
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: {{ include "mushroom.fullname" $ }}
|
||||
port:
|
||||
number: {{ $.Values.service.port }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
15
mushroom/helm/templates/service.yaml
Normal file
15
mushroom/helm/templates/service.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "mushroom.fullname" . }}
|
||||
labels:
|
||||
{{- include "mushroom.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.service.port }}
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
{{- include "mushroom.selectorLabels" . | nindent 4 }}
|
||||
70
mushroom/helm/templates/statefulset.yaml
Normal file
70
mushroom/helm/templates/statefulset.yaml
Normal file
@@ -0,0 +1,70 @@
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: {{ include "mushroom.fullname" . }}
|
||||
labels:
|
||||
{{- include "mushroom.labels" . | nindent 4 }}
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "mushroom.selectorLabels" . | nindent 6 }}
|
||||
serviceName: {{ include "mushroom.fullname" . }}
|
||||
template:
|
||||
metadata:
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "mushroom.labels" . | nindent 8 }}
|
||||
{{- with .Values.podLabels }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
containers:
|
||||
- name: mushroomd
|
||||
image: "{{ .Values.images.server.repository }}:{{ .Values.images.server.tag | default .Chart.AppVersion }}"
|
||||
ports:
|
||||
- containerPort: 1337
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /data
|
||||
- name: webproxy
|
||||
image: "{{ .Values.images.proxy.repository }}:{{ .Values.images.proxy.tag | default .Chart.AppVersion }}"
|
||||
ports:
|
||||
- containerPort: 1338
|
||||
- name: nginx
|
||||
image: "{{ .Values.images.nginx.repository }}:{{ .Values.images.nginx.tag | default "1.29.5" }}"
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.service.port }}
|
||||
protocol: TCP
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /usr/share/nginx/html/index.html
|
||||
subPath: index.html
|
||||
- name: config
|
||||
mountPath: /etc/nginx/conf.d/default.conf
|
||||
subPath: default.conf
|
||||
volumes:
|
||||
- name: config
|
||||
configMap:
|
||||
name: {{ .Chart.Name }}-nginx
|
||||
volumeClaimTemplates:
|
||||
- metadata:
|
||||
name: data
|
||||
spec:
|
||||
accessModes: [ "ReadWriteOnce" ]
|
||||
resources:
|
||||
requests:
|
||||
storage: 32Mi
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ .Chart.Name }}-nginx
|
||||
data:
|
||||
index.html: |
|
||||
{{ .Files.Get "index.html" | indent 4 }}
|
||||
default.conf: |
|
||||
{{ .Files.Get "nginx-default.conf" | indent 4 }}
|
||||
15
mushroom/helm/templates/tests/test-connection.yaml
Normal file
15
mushroom/helm/templates/tests/test-connection.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: "{{ include "mushroom.fullname" . }}-test-connection"
|
||||
labels:
|
||||
{{- include "mushroom.labels" . | nindent 4 }}
|
||||
annotations:
|
||||
"helm.sh/hook": test
|
||||
spec:
|
||||
containers:
|
||||
- name: wget
|
||||
image: busybox
|
||||
command: ['wget']
|
||||
args: ['{{ include "mushroom.fullname" . }}:{{ .Values.service.port }}']
|
||||
restartPolicy: Never
|
||||
31
mushroom/helm/values.yaml
Normal file
31
mushroom/helm/values.yaml
Normal file
@@ -0,0 +1,31 @@
|
||||
# Default values for mushroom.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
images:
|
||||
server:
|
||||
repository: mushroom
|
||||
# tag: latest
|
||||
proxy:
|
||||
repository: mushroom-proxy
|
||||
# tag: latest
|
||||
nginx:
|
||||
repository: nginx
|
||||
tag: 1.29.5
|
||||
|
||||
# This is for setting up a service more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/
|
||||
service:
|
||||
# This sets the service type more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types
|
||||
type: ClusterIP
|
||||
# This sets the ports more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#field-spec-ports
|
||||
port: 80
|
||||
|
||||
# This block is for setting up the ingress for more information can be found here: https://kubernetes.io/docs/concepts/services-networking/ingress/
|
||||
ingress:
|
||||
enabled: true
|
||||
className: "traefik"
|
||||
annotations:
|
||||
traefik.ingress.kubernetes.io/router.tls.certresolver: "default"
|
||||
hosts:
|
||||
- mushroom.jenova.ponteilla.net
|
||||
tls: true
|
||||
19
traefik-helmchartconfig.yaml
Normal file
19
traefik-helmchartconfig.yaml
Normal file
@@ -0,0 +1,19 @@
|
||||
apiVersion: helm.cattle.io/v1
|
||||
kind: HelmChartConfig
|
||||
metadata:
|
||||
name: traefik
|
||||
namespace: kube-system
|
||||
spec:
|
||||
failurePolicy: reinstall
|
||||
valuesContent: |-
|
||||
additionalArguments:
|
||||
- "--certificatesresolvers.default.acme.email=paul@ponteilla.net"
|
||||
- "--certificatesresolvers.default.acme.storage=/data/acme.json"
|
||||
- "--certificatesresolvers.default.acme.httpchallenge.entrypoint=web"
|
||||
ports:
|
||||
web:
|
||||
redirections:
|
||||
entryPoint:
|
||||
to: websecure
|
||||
scheme: https
|
||||
permanent: true
|
||||
15
zetikettes/Makefile
Normal file
15
zetikettes/Makefile
Normal file
@@ -0,0 +1,15 @@
|
||||
namespace := zetikettes
|
||||
|
||||
.PHONY: deploy
|
||||
deploy: ## Deploy the service on a running cluster
|
||||
kubectl -n $(namespace) apply \
|
||||
-f app.yaml \
|
||||
-f ingress.yaml \
|
||||
-f nginx-config.yaml \
|
||||
-f service.yaml
|
||||
|
||||
.PHONY: help
|
||||
help: ## Show this help
|
||||
@echo Noteworthy targets:
|
||||
@egrep '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
||||
.DEFAULT_GOAL := help
|
||||
52
zetikettes/app.yaml
Normal file
52
zetikettes/app.yaml
Normal file
@@ -0,0 +1,52 @@
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: zetikettes-app
|
||||
spec:
|
||||
serviceName: "zetikettes"
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: zetikettes
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: zetikettes
|
||||
spec:
|
||||
containers:
|
||||
# --- The Backend (Stateful) ---
|
||||
- name: backend
|
||||
image: pol/zetikettes:latest
|
||||
imagePullPolicy: Never
|
||||
ports:
|
||||
- containerPort: 8000
|
||||
volumeMounts:
|
||||
- name: var-lib-zetikettes
|
||||
mountPath: /data
|
||||
subPath: data
|
||||
env:
|
||||
- name: CSRF_TRUSTED_ORIGINS
|
||||
value: https://zetikettes.jenova.ponteilla.net
|
||||
- name: STATIC_URL
|
||||
value: /zetikettes/srv/static/
|
||||
|
||||
# --- The Frontend (Nginx Sidecar) ---
|
||||
- name: nginx-sidecar
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- containerPort: 80
|
||||
volumeMounts:
|
||||
- name: var-lib-zetikettes
|
||||
mountPath: /var/lib/zetikettes
|
||||
- name: config-volume
|
||||
mountPath: /etc/nginx/conf.d/default.conf
|
||||
subPath: default.conf
|
||||
|
||||
volumes:
|
||||
- name: config-volume
|
||||
configMap:
|
||||
name: nginx-config
|
||||
- name: var-lib-zetikettes
|
||||
hostPath:
|
||||
path: /var/lib/zetikettes
|
||||
type: DirectoryOrCreate
|
||||
21
zetikettes/ingress.yaml
Normal file
21
zetikettes/ingress.yaml
Normal file
@@ -0,0 +1,21 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: zetikettes
|
||||
annotations:
|
||||
traefik.ingress.kubernetes.io/router.tls.certresolver: default
|
||||
spec:
|
||||
tls:
|
||||
- hosts:
|
||||
- zetikettes.jenova.ponteilla.net
|
||||
rules:
|
||||
- host: zetikettes.jenova.ponteilla.net
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: zetikettes
|
||||
port:
|
||||
number: 80
|
||||
26
zetikettes/nginx-config.yaml
Normal file
26
zetikettes/nginx-config.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: nginx-config
|
||||
data:
|
||||
default.conf: |
|
||||
server {
|
||||
listen 80;
|
||||
root /var/lib/zetikettes/frontend;
|
||||
location /zetikettes/srv/static {
|
||||
alias /var/lib/zetikettes/www_static;
|
||||
}
|
||||
location /zetikettes/srv/data {
|
||||
alias /var/lib/zetikettes/data;
|
||||
}
|
||||
location ^~ /zetikettes/srv {
|
||||
proxy_pass http://127.0.0.1:8000;
|
||||
proxy_set_header SCRIPT_NAME /zetikettes/srv;
|
||||
proxy_set_header Host $http_host;
|
||||
|
||||
# generating stuff takes time
|
||||
proxy_read_timeout 10m;
|
||||
|
||||
client_max_body_size 10M;
|
||||
}
|
||||
}
|
||||
12
zetikettes/service.yaml
Normal file
12
zetikettes/service.yaml
Normal file
@@ -0,0 +1,12 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: zetikettes
|
||||
spec:
|
||||
selector:
|
||||
app: zetikettes
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 80
|
||||
targetPort: 80
|
||||
type: ClusterIP
|
||||
Reference in New Issue
Block a user