Compare commits

...
54 Commits
Author SHA1 Message Date
khwezi 9a8805b976 Update docker-stacks/app-server/infisical.yml 2026-07-18 09:41:25 +02:00
khwezi b12bd4f6c0 Add docker-stacks/app-server/infisical.yml 2026-07-18 09:35:03 +02:00
khwezi 480a4fd28b Delete .vscode/settings.json 2026-07-18 09:22:07 +02:00
khwezi 4507db4d5a Changed port mappings of penpot frontend 2026-06-20 21:14:54 +02:00
khwezi c2204a345e Simplified frontend ebv var injection 2026-06-20 21:10:36 +02:00
khwezi b90103f503 Updated frontend env var injection 2026-06-20 21:09:11 +02:00
khwezi 1bfa151ff0 Refactored flags 2026-06-20 17:20:25 +02:00
khwezi 19653b0fdf Refactored penpot to use its own redis instance 2026-06-20 17:07:37 +02:00
khwezi 909f636cb0 Refactored penpot to use its own database 2026-06-20 17:02:40 +02:00
khwezi 5647189bba Added startup flag to backend 2026-06-20 16:55:00 +02:00
khwezi 1d78a1c148 Merged my code wih official compose file 2026-06-20 16:25:30 +02:00
khwezi dd3516bc13 Added email and s3 configs 2026-06-20 10:32:04 +02:00
khwezi c15b43b7b3 Refactored to handle schema migrations 2026-06-19 17:40:21 +02:00
khwezi 5910220bde Removed docuseal tag 2026-06-19 17:37:38 +02:00
khwezi 2231469493 Using latest image tag 2026-06-19 17:36:20 +02:00
khwezi 70c73bd4aa Using specific docuseal docker image 2026-06-19 17:35:16 +02:00
khwezi 6b518f310a Added chromim settings 2026-06-19 17:31:44 +02:00
khwezi 8bb6d3803f Added exporter secret key to backend 2026-06-19 17:27:36 +02:00
khwezi 979da4a20b Reverted exporter env mappings 2026-06-19 17:25:38 +02:00
khwezi 12d6613160 Added penpot chromium flags 2026-06-19 17:21:56 +02:00
khwezi 637d026103 Provided sanbox flag 2026-06-19 17:20:06 +02:00
khwezi a6c5471805 Refactored penpod exporter redis connection 2026-06-19 17:16:59 +02:00
khwezi 509608722b Added missing exporter env vars for penpot 2026-06-19 17:09:26 +02:00
khwezi 5abd91e66c Added shared penpot network 2026-06-19 17:01:26 +02:00
khwezi 88e3af666c Added shared network and exporter to penpot 2026-06-19 17:00:14 +02:00
khwezi 9e0324d9c3 Changed penpot port to 8084 2026-06-19 16:45:59 +02:00
khwezi 439feb92ef Changed docuseal port to 3001 2026-06-19 16:45:18 +02:00
= 7ba7e02534 Merge branch 'main' of https://gitea.khongisa.co.za/MngomaLab/automation 2026-06-19 14:24:20 +00:00
= 5cc9b4929a Refactored droneci 2026-06-19 14:21:51 +00:00
khwezi 72d1ddfce6 Added penpot.yml 2026-06-19 15:33:39 +02:00
khwezi c0e33e039d Added docuseal.yml 2026-06-19 15:32:56 +02:00
= 546e2f621c Garage Admin Ui works very stable, web access and object security is also in place 2026-05-18 21:22:58 +00:00
= 396e9e9e7e Added garag.yml as my s3 compatible object store 2026-05-18 19:32:21 +00:00
= 631ef583f5 Removed gitea and version lines 2026-05-09 08:39:44 +00:00
= d48abb626e Fixed sytax issue with service listing 2026-05-09 08:38:47 +00:00
= ef6df93bd2 Fixed typo 2026-05-09 08:36:01 +00:00
= b0dee982ac Refactored droneci user create to be a string literal 2026-05-09 08:13:52 +00:00
= c885cffdd2 Refactored DRONE_RPC_HOST=localhost 2026-05-09 08:08:22 +00:00
= e9862f7c3c Hardcoded rone username against gitea 2026-05-09 08:00:27 +00:00
= 5853440e1b Fixed droneci.yml syntax error 2026-05-09 07:55:29 +00:00
= 25506f6bd0 Added drone-ci to docker app server stacks 2026-05-09 07:31:51 +00:00
= 69c228997d added n8n 2026-05-02 16:50:55 +00:00
= 7e17336bcf Refactored to use v13 2026-05-02 10:46:51 +00:00
Khwezi Mngoma e5ef94def8 Changed dynamic config 2026-05-02 09:50:37 +02:00
Khwezi Mngoma 3b3f4139aa Changed oltp-http ingresroute 2026-05-02 09:49:57 +02:00
= 1c6c4cd747 fixed apire port addressing issue 2026-05-01 21:52:22 +00:00
= 609e0fbb76 added aspire dashboard 2026-05-01 21:05:26 +00:00
= dffb6cad31 Ensured docker repo access works 2026-05-01 14:08:07 +00:00
= 079b9f4c14 Added redis support 2026-05-01 13:00:19 +00:00
= a428260243 Migrated k3s manifests to use traefik ingres route 2026-05-01 11:09:52 +00:00
= 80715dc15a Fully functional mealie 2026-04-24 15:55:01 +00:00
= 859a8e8376 Added mealie recipes 2026-04-24 15:26:28 +00:00
= 3224a51727 Added bookstack and phpmyadmin 2026-04-24 06:24:51 +00:00
= fec005a904 Added drawio 2026-04-19 07:26:21 +00:00
25 changed files with 1378 additions and 228 deletions
-5
View File
@@ -1,5 +0,0 @@
{
"yaml.schemas": {
"kubernetes://schema/traefik.io/v1alpha1%40ingressroute": "file:///mnt/c/Users/Admin/source/repos/mngomalab/k3s/stacks/droneci.yml"
}
}
+24
View File
@@ -0,0 +1,24 @@
services:
docuseal:
image: docuseal/docuseal
restart: always
environment:
- DATABASE_URL=${DATABASE_URL}
- PORT=3000
- HOST=${PUBLIC_URL}
- SECRET_KEY_BASE=${SECRET_KEY_BASE}
- RAILS_ENV=production
- SKIP_MIGRATION_VALIDATION=true
- SMTP_USERNAME=${SMTP_USERNAME}
- SMTP_PASSWORD=${SMTP_PASSWORD}
- SMTP_ADDRESS=${SMTP_ADDRESS}
- SMTP_FROM=${SMTP_FROM}
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
- AWS_REGION=${AWS_REGION}
- S3_ATTACHMENTS_BUCKET=${S3_ATTACHMENTS_BUCKET}
ports:
- "3001:3000"
volumes:
- ./docuseal_data:/data
+43
View File
@@ -0,0 +1,43 @@
services:
drone:
image: drone/drone:2
container_name: drone
ports:
- "8080:80"
environment:
- DRONE_GITEA_SERVER=${GITEA_ADDRESS}
- DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID}
- DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET}
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
- DRONE_SERVER_HOST=${DRONE_SERVER_ADDRESS}
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO}
- DRONE_USER_CREATE=username:drone,admin:true
volumes:
- drone-data:/data
restart: unless-stopped
networks:
- droneci-network
drone-runner:
image: drone/drone-runner-docker:1
container_name: drone-runner
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=drone
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=local-runner
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- drone
restart: unless-stopped
networks:
- droneci-network
volumes:
drone-data:
networks:
droneci-network:
driver: bridge
+56
View File
@@ -0,0 +1,56 @@
version: "3"
services:
backend:
container_name: infisical-backend
restart: unless-stopped
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
image: infisical/infisical:latest # PIN THIS TO A SPECIFIC TAG
pull_policy: always
env_file: .env
ports:
- 80:8080
environment:
- NODE_ENV=production
networks:
- infisical
redis:
image: redis
container_name: infisical-dev-redis
env_file: .env
restart: always
environment:
- ALLOW_EMPTY_PASSWORD=yes
networks:
- infisical
volumes:
- redis_data:/data
db:
container_name: infisical-db
image: postgres:14-alpine
restart: always
env_file: .env
volumes:
- pg_data:/var/lib/postgresql/data
networks:
- infisical
healthcheck:
test: "pg_isready --username=${POSTGRES_USER} && psql --username=${POSTGRES_USER} --list"
interval: 5s
timeout: 10s
retries: 10
volumes:
pg_data:
driver: local
redis_data:
driver: local
networks:
infisical:
+135
View File
@@ -0,0 +1,135 @@
x-flags: &penpot-flags
# Merged disable-sandbox into the flags array to protect the headless engine
# PENPOT_FLAGS: disable-email-verification enable-smtp enable-prepl-server disable-secure-session-cookies enable-mcp disable-sandbox enable-login-with-password
PENPOT_FLAGS: disable-email-verification enable-smtp enable-prepl-server disable-secure-session-cookies disable-sandbox enable-login-with-password
x-uri: &penpot-public-uri
PENPOT_PUBLIC_URI: ${PENPOT_PUBLIC_URI}
x-body-size: &penpot-http-body-size
PENPOT_HTTP_SERVER_MAX_BODY_SIZE: 367001600
PENPOT_HTTP_SERVER_MAX_MULTIPART_BODY_SIZE: 367001600
x-secret-key: &penpot-secret-key
PENPOT_SECRET_KEY: ${PENPOT_SECRET_KEY}
networks:
penpot-net:
driver: bridge
volumes:
penpot_assets:
penpot_postgres_v15:
services:
penpot-frontend:
image: "penpotapp/frontend:${PENPOT_VERSION:-latest}"
restart: always
ports:
- "8084:8080"
volumes:
- penpot_assets:/opt/data/assets
depends_on:
- penpot-backend
- penpot-exporter
- penpot-mcp
networks:
- penpot-net
environment:
<<: [*penpot-flags, *penpot-http-body-size, *penpot-public-uri]
penpot-backend:
image: "penpotapp/backend:${PENPOT_VERSION:-latest}"
restart: always
volumes:
- penpot_assets:/opt/data/assets
networks:
- penpot-net
ports:
- "6060:6060"
depends_on:
penpot-postgres:
condition: service_healthy # Wait for database stability
penpot-valkey:
condition: service_healthy # Wait for internal caching layer stability
environment:
<< : [*penpot-flags, *penpot-public-uri, *penpot-http-body-size, *penpot-secret-key]
# Security Handshake Key for internal Exporter validation routines
PENPOT_EXPORTER_SECRET_KEY: ${PENPOT_EXPORTER_SECRET_KEY}
## Local Internal Database connection parameters
PENPOT_DATABASE_URI: postgresql://penpot-postgres/penpot
PENPOT_DATABASE_USERNAME: penpot
PENPOT_DATABASE_PASSWORD: penpot
## Local Caching Layer connection parameter
PENPOT_REDIS_URI: redis://penpot-valkey/0
## Storage Settings
PENPOT_OBJECTS_STORAGE_BACKEND: fs
PENPOT_OBJECTS_STORAGE_FS_DIRECTORY: /opt/data/assets
## Telemetry & Optional settings
PENPOT_TELEMETRY_ENABLED: "false"
penpot-mcp:
image: "penpotapp/mcp:${PENPOT_VERSION:-latest}"
restart: always
networks:
- penpot-net
penpot-exporter:
image: "penpotapp/exporter:${PENPOT_VERSION:-latest}"
restart: always
shm_size: '2gb' # Protects Puppeteer rendering processes from memory crashes
depends_on:
penpot-valkey:
condition: service_healthy
networks:
- penpot-net
environment:
<< : [*penpot-secret-key]
PENPOT_EXPORTER_SECRET_KEY: ${PENPOT_EXPORTER_SECRET_KEY}
PENPOT_PUBLIC_URI: http://penpot-frontend:8080
## Local Caching Layer connections for the exporter sub-engine
PENPOT_REDIS_URI: redis://penpot-valkey/0
PENPOT_REDIS_URL: redis://penpot-valkey/0
PENPOT_FLAGS: disable-sandbox
# Integrated isolated Database Service
penpot-postgres:
image: "postgres:15"
restart: always
stop_signal: SIGINT
networks:
- penpot-net
volumes:
- penpot_postgres_v15:/var/lib/postgresql/data
environment:
- POSTGRES_INITDB_ARGS=--data-checksums
- POSTGRES_DB=penpot
- POSTGRES_USER=penpot
- POSTGRES_PASSWORD=penpot
healthcheck:
test: ["CMD-SHELL", "pg_isready -U penpot"]
interval: 2s
timeout: 10s
retries: 5
start_period: 2s
# Integrated isolated Caching Engine (Valkey drop-in for Redis)
penpot-valkey:
image: valkey/valkey:8.1
restart: always
networks:
- penpot-net
environment:
- VALKEY_EXTRA_FLAGS=--maxmemory 128mb --maxmemory-policy volatile-lfu
healthcheck:
test: ["CMD-SHELL", "valkey-cli ping | grep PONG"]
interval: 1s
timeout: 3s
retries: 5
start_period: 3s
@@ -1,91 +0,0 @@
http:
middlewares:
nexus-buffer:
buffering:
maxRequestBodyBytes: 0
memRequestBodyBytes: 2097152 # 2MB
crowdsec:
plugin:
crowdsec:
crowdsecAppsecBodyLimit: 0
badger:
plugin:
badger:
disableForwardAuth: true
redirect-to-https:
redirectScheme:
scheme: https
routers:
nexus-docker-router:
rule: "Host(`nexus.khongisa.co.za`) && PathPrefix(`/v2`)"
service: api-service # Or whichever service points to Pangolin port 3000/3001
entryPoints:
- websecure
middlewares:
- nexus-buffer
- badger
tls:
certResolver: letsencrypt
# HTTP to HTTPS redirect router
main-app-router-redirect:
rule: "Host(`khongisa.co.za`)"
service: next-service
entryPoints:
- web
middlewares:
- redirect-to-https
- badger
# Next.js router (handles everything except API and WebSocket paths)
next-router:
rule: "Host(`khongisa.co.za`) && !PathPrefix(`/api/v1`)"
service: next-service
entryPoints:
- websecure
middlewares:
- badger
tls:
certResolver: letsencrypt
# API router (handles /api/v1 paths)
api-router:
rule: "Host(`khongisa.co.za`) && PathPrefix(`/api/v1`)"
service: api-service
entryPoints:
- websecure
middlewares:
- badger
tls:
certResolver: letsencrypt
# WebSocket router
ws-router:
rule: "Host(`khongisa.co.za`)"
service: api-service
entryPoints:
- websecure
middlewares:
- badger
tls:
certResolver: letsencrypt
services:
next-service:
loadBalancer:
servers:
- url: "http://pangolin:3002" # Next.js server
api-service:
loadBalancer:
servers:
- url: "http://pangolin:3000" # API/WebSocket server
tcp:
serversTransports:
pp-transport-v1:
proxyProtocol:
version: 1
pp-transport-v2:
proxyProtocol:
version: 2
File diff suppressed because one or more lines are too long
+73
View File
@@ -0,0 +1,73 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: drawio
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: drawio
namespace: drawio
spec:
replicas: 1
selector:
matchLabels:
app: drawio
template:
metadata:
labels:
app: drawio
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: DoesNotExist
containers:
- name: drawio
image: jgraph/drawio:latest
ports:
- containerPort: 8080
env:
- name: DRAWIO_SELF_CONTAINED
value: "1"
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
---
apiVersion: v1
kind: Service
metadata:
name: drawio-service
namespace: drawio
spec:
type: ClusterIP
selector:
app: drawio
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: drawio-web
namespace: drawio
spec:
entryPoints:
- websecure
routes:
- match: Host(`drawio.khongisa.co.za`)
kind: Rule
services:
- name: drawio-service
port: 80
+19 -6
View File
@@ -1,4 +1,4 @@
---
---
apiVersion: v1
kind: Namespace
metadata:
@@ -45,7 +45,7 @@ spec:
storageClassName: nfs-storage
resources:
requests:
storage: 5Gi
storage: 10Gi
---
apiVersion: v1
kind: Secret
@@ -90,11 +90,10 @@ spec:
cpu: "500m"
memory: "512Mi"
env:
# FIX: Explicitly bind the address to bypass port validation logic
- name: DRONE_SERVER_ADDR
value: ":80"
- name: DRONE_SERVER_HOST
value: "drone.khongisa.co.za"
value: "droneci.khongisa.co.za"
- name: DRONE_SERVER_PROTO
value: "https"
- name: DRONE_GITEA_SERVER
@@ -162,11 +161,25 @@ metadata:
name: drone-server
namespace: drone-ci
spec:
type: NodePort
type: ClusterIP
selector:
app: drone-server
ports:
- name: http
port: 80
targetPort: 80
nodePort: 31001
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: drone-web
namespace: drone-ci
spec:
entryPoints:
- websecure
routes:
- match: Host(`droneci.khongisa.co.za`)
kind: Rule
services:
- name: drone-server
port: 80
+18 -6
View File
@@ -1,3 +1,4 @@
---
apiVersion: v1
kind: Namespace
metadata:
@@ -10,7 +11,6 @@ metadata:
namespace: filebrowser
type: Opaque
data:
# Value: Blackstar2@home
admin-password: QmxhY2tzdGFyMkBob21l
---
apiVersion: v1
@@ -61,11 +61,9 @@ spec:
operator: DoesNotExist
containers:
- name: filebrowser
image: filebrowser/filebrowser:v2.30.0 # Using a specific version for stability
image: filebrowser/filebrowser:v2.30.0
ports:
- containerPort: 80
# We remove 'command' and 'args' that rely on /bin/sh
# and use the native environment variables
env:
- name: FB_DATABASE
value: "/config/database.db"
@@ -94,7 +92,7 @@ metadata:
name: filebrowser-service
namespace: filebrowser
spec:
type: NodePort
type: ClusterIP
selector:
app: filebrowser
ports:
@@ -102,4 +100,18 @@ spec:
protocol: TCP
port: 80
targetPort: 80
nodePort: 33003
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: filebrowser-web
namespace: filebrowser
spec:
entryPoints:
- websecure
routes:
- match: Host(`drive.khongisa.co.za`)
kind: Rule
services:
- name: filebrowser-service
port: 80
+207
View File
@@ -0,0 +1,207 @@
apiVersion: v1
kind: Namespace
metadata:
name: garage
---
apiVersion: v1
kind: Secret
metadata:
name: garage-secrets
namespace: garage
type: Opaque
data:
GARAGE_RPC_SECRET: "Yjk2YzRjZDE2ZDY4NDFjYTZhZTEwNDQxOGJiNTIxMDc4MTYyMzkyMzk4OGZiMWRmNWI0MmQzMmQzYmQwMGIwZQ=="
GARAGE_ADMIN_TOKEN: "c1dHNW8yc2E5eEp4NUVyM0NnWHF2T1VTSFhvZkZhejBwRWoyRzlyb1E1aERSRUdRVlZvQUZTRXY4aU1MUTZxTw=="
---
apiVersion: v1
kind: ConfigMap
metadata:
name: garage-config
namespace: garage
data:
garage.toml: |
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
replication_factor = 1
rpc_bind_addr = "[::]:3901"
rpc_public_addr = "garage.garage.svc.cluster.local:3901"
[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
# Leaving this blank removes the hostname restriction on the API port.
# This allows internal pods to use 'garage.garage.svc.cluster.local' AND
# external apps to use '192.168.1.177:30900' or 's3.khongisa.co.za' without signature errors.
root_domain = ""
[admin]
api_bind_addr = "[::]:3903"
admin_token = "sWG5o2sa9xJx5Er3CgXqvOUSHXofFaz0pEj2G9roQ5hDREGQVVoAFSEv8iMLQ6qO"
[s3_web]
bind_addr = "[::]:3902"
# This enforces that public web traffic matches 'test-bucket.s3.khongisa.co.za'
root_domain = ".cdn.khongisa.co.za"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: garage-data-pvc
namespace: garage
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: nfs-storage
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: garage
namespace: garage
spec:
serviceName: "garage"
replicas: 1
selector:
matchLabels:
app: garage
template:
metadata:
labels:
app: garage
spec:
securityContext:
fsGroup: 999
containers:
- name: garage
image: dxflrs/garage:v2.3.0
args: ["/garage", "server"]
env:
- name: GARAGE_RPC_SECRET
valueFrom:
secretKeyRef:
name: garage-secrets
key: GARAGE_RPC_SECRET
ports:
- containerPort: 3900
name: s3-api
- containerPort: 3903
name: admin-api
- containerPort: 3902
name: s3-web
volumeMounts:
- name: config
mountPath: /etc/garage.toml
subPath: garage.toml
- name: data
mountPath: /var/lib/garage
volumes:
- name: config
configMap:
name: garage-config
- name: data
persistentVolumeClaim:
claimName: garage-data-pvc
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: garage-ui
namespace: garage
spec:
replicas: 1
selector:
matchLabels:
app: garage-ui
template:
metadata:
labels:
app: garage-ui
spec:
containers:
- name: garage-ui
image: khairul169/garage-webui:latest
ports:
- containerPort: 3909
env:
- name: API_BASE_URL
value: "http://garage:3903"
- name: S3_ENDPOINT_URL
value: "http://garage:3900"
- name: API_ADMIN_KEY
valueFrom:
secretKeyRef:
name: garage-secrets
key: GARAGE_ADMIN_TOKEN
volumeMounts:
- name: config
mountPath: /etc/garage.toml
subPath: garage.toml
volumes:
- name: config
configMap:
name: garage-config
---
apiVersion: v1
kind: Service
metadata:
name: garage
namespace: garage
spec:
selector:
app: garage
ports:
- name: s3-api
port: 3900
- name: admin-api
port: 3903
- name: s3-web
port: 3902
---
apiVersion: v1
kind: Service
metadata:
name: garage-ui
namespace: garage
spec:
selector:
app: garage-ui
ports:
- name: http
port: 80
targetPort: 3909
---
apiVersion: v1
kind: Service
metadata:
name: garage-external-nodeport
namespace: garage
spec:
type: NodePort
selector:
app: garage
ports:
- name: s3-api-external
port: 3900
targetPort: 3900
nodePort: 30900
- name: s3-web-external
port: 3902
targetPort: 3902
nodePort: 30902
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: garage-ui-external
namespace: garage
spec:
entryPoints: ["websecure"]
routes:
- match: Host(`s3.khongisa.co.za`)
kind: Rule
services:
- name: garage-ui
port: 80
+17 -3
View File
@@ -1,3 +1,4 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
@@ -16,7 +17,6 @@ spec:
containers:
- name: headlamp
image: ghcr.io/headlamp-k8s/headlamp:latest
# We only use -in-cluster. No other flags allowed.
args:
- "-in-cluster"
ports:
@@ -29,11 +29,25 @@ metadata:
name: headlamp
namespace: kube-system
spec:
type: NodePort
type: ClusterIP
selector:
app.kubernetes.io/name: headlamp
ports:
- protocol: TCP
port: 80
targetPort: 4466
nodePort: 30001
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: headlamp-web
namespace: kube-system
spec:
entryPoints:
- websecure
routes:
- match: Host(`cluster.khongisa.co.za`)
kind: Rule
services:
- name: headlamp
port: 80
+122
View File
@@ -0,0 +1,122 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: mealie
---
apiVersion: v1
kind: Secret
metadata:
name: mealie-secrets
namespace: mealie
type: Opaque
data:
POSTGRES_PASSWORD: RmJsV0xPTlM4alVjNUE=
SMTP_PASSWORD: XylSUURvK2ZiXig0eF1eLg==
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mealie-config
namespace: mealie
data:
BASE_URL: "https://mealie.khongisa.co.za"
TRUSTED_PROXIES: "10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,169.255.58.144"
ALLOW_SIGNUP: "true"
PUID: "1000"
PGID: "1000"
TZ: "Africa/Johannesburg"
SMTP_HOST: "mail.mngoma.africa"
SMTP_PORT: "465"
SMTP_FROM_NAME: "Mealie Recipes"
SMTP_FROM_EMAIL: "mealie@mngoma.africa"
SMTP_USER: "mealie@mngoma.africa"
SMTP_AUTH_STRATEGY: "SSL"
DB_ENGINE: "postgres"
POSTGRES_USER: "mealie_user"
POSTGRES_DB: "mealie"
POSTGRES_SERVER: "192.168.1.170"
POSTGRES_PORT: "5432"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mealie-data-pvc
namespace: mealie
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mealie
namespace: mealie
spec:
replicas: 1
selector:
matchLabels:
app: mealie
template:
metadata:
labels:
app: mealie
annotations:
last-updated: "2026-04-24T17:52:00"
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: DoesNotExist
containers:
- name: mealie
image: ghcr.io/mealie-recipes/mealie:latest
ports:
- containerPort: 9000
envFrom:
- configMapRef:
name: mealie-config
- secretRef:
name: mealie-secrets
volumeMounts:
- name: mealie-data
mountPath: /app/data
volumes:
- name: mealie-data
persistentVolumeClaim:
claimName: mealie-data-pvc
---
apiVersion: v1
kind: Service
metadata:
name: mealie-service
namespace: mealie
spec:
type: ClusterIP
selector:
app: mealie
ports:
- protocol: TCP
port: 80
targetPort: 9000
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: mealie-web
namespace: mealie
spec:
entryPoints:
- websecure
routes:
- match: Host(`mealie.khongisa.co.za`)
kind: Rule
services:
- name: mealie-service
port: 80
+200
View File
@@ -0,0 +1,200 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: n8n
---
apiVersion: v1
kind: Secret
metadata:
name: n8n-secrets
namespace: n8n
type: Opaque
data:
# Base64 values from your previous manifest
N8N_ADMIN_USER: a2h3ZXpp
N8N_ADMIN_PASSWORD: cWVaVllWQ20wOEhaWmU=
POSTGRES_PASSWORD: RmJsV0xPTlM4alVjNUE=
N8N_ENCRYPTION_KEY: Tm90U2VjcmV0S2V5MTIzIQ==
N8N_TASKS_RUNNER_AUTH_TOKEN: bXktc2hhcmVkLXNlY3JldC10b2tlbi0xMjM=
---
apiVersion: v1
kind: ConfigMap
metadata:
name: n8n-config
namespace: n8n
data:
N8N_HOST: "n8n.khongisa.co.za"
N8N_PROTOCOL: "https"
NODE_ENV: "production"
WEBHOOK_URL: "https://n8n.khongisa.co.za/"
GENERIC_TIMEZONE: "Africa/Johannesburg"
DB_TYPE: "postgresdb"
DB_POSTGRESDB_HOST: "n8n-db-service"
DB_POSTGRESDB_PORT: "5432"
DB_POSTGRESDB_DATABASE: "n8n_db"
DB_POSTGRESDB_USER: "n8n_user"
N8N_PROXY_HOPS: "1"
# DEFINITIVE FIX: Force n8n to listen on all interfaces
N8N_LISTEN_ADDRESS: "0.0.0.0"
N8N_PORT: "5678"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: n8n-data-pvc
namespace: n8n
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: n8n-db-pvc
namespace: n8n
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
---
# Database Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: n8n-db
namespace: n8n
spec:
replicas: 1
selector:
matchLabels:
app: n8n-db
template:
metadata:
labels:
app: n8n-db
spec:
containers:
- name: postgres
image: postgres:14-alpine
env:
- name: POSTGRES_USER
value: "n8n_user"
- name: POSTGRES_DB
value: "n8n_db"
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: n8n-secrets
key: POSTGRES_PASSWORD
ports:
- containerPort: 5432
volumeMounts:
- name: db-storage
mountPath: /var/lib/postgresql/data
volumes:
- name: db-storage
persistentVolumeClaim:
claimName: n8n-db-pvc
---
# Database Internal Service
apiVersion: v1
kind: Service
metadata:
name: n8n-db-service
namespace: n8n
spec:
ports:
- port: 5432
selector:
app: n8n-db
---
# n8n Application Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: n8n
namespace: n8n
spec:
replicas: 1
selector:
matchLabels:
app: n8n-app # Standardized label selector
template:
metadata:
labels:
app: n8n-app # Matches selector and service
spec:
containers:
- name: n8n
image: docker.n8n.io/n8nio/n8n:latest
ports:
- containerPort: 5678
- containerPort: 5679 # Explicitly open the Task Broker port
envFrom:
- configMapRef:
name: n8n-config
env:
# DEFINITIVE FIX: Align communication between main process and Task Runner
- name: N8N_TASKS_RUNNER_BROKER_HOST
value: "127.0.0.1"
- name: N8N_TASKS_RUNNER_BROKER_PORT
value: "5679"
- name: N8N_TASKS_RUNNER_AUTH_TOKEN
valueFrom:
secretKeyRef:
name: n8n-secrets
key: N8N_TASKS_RUNNER_AUTH_TOKEN
# Database and Admin overrides
- name: DB_POSTGRESDB_PASSWORD
valueFrom:
secretKeyRef:
name: n8n-secrets
key: POSTGRES_PASSWORD
- name: N8N_ENCRYPTION_KEY
valueFrom:
secretKeyRef:
name: n8n-secrets
key: N8N_ENCRYPTION_KEY
- name: N8N_USER_MANAGEMENT_ADMIN_USER
valueFrom:
secretKeyRef:
name: n8n-secrets
key: N8N_ADMIN_USER
- name: N8N_USER_MANAGEMENT_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: n8n-secrets
key: N8N_ADMIN_PASSWORD
- name: N8N_SECURE_COOKIE
value: "false"
- name: N8N_COOKIES_SAME_SITE
value: "lax"
- name: N8N_PROXY_HOPS
value: "1"
volumeMounts:
- name: n8n-data
mountPath: /home/node/.n8n
volumes:
- name: n8n-data
persistentVolumeClaim:
claimName: n8n-data-pvc
---
# NodePort Service
apiVersion: v1
kind: Service
metadata:
name: n8n-service
namespace: n8n
spec:
type: NodePort
selector:
app: n8n-app # Correctly targets the refactored Deployment labels
ports:
- protocol: TCP
port: 5678
targetPort: 5678
nodePort: 30567
+41 -3
View File
@@ -24,8 +24,10 @@ metadata:
namespace: nexus
type: Opaque
data:
# Contains khongisa-key-2026
nexus.secrets.json: ewogICJhY3RpdmUiOiAia2hvbmdpc2Eta2V5LTIwMjYiLAogICJrZXlzIjogWwogICAgewogICAgICAiaWQiOiAia2hvbmdpc2Eta2V5LTIwMjYiLAogICAgICAia2V5IjogIk5tTmhZMll3TkdNMUltVXdOVGt4WkROa1l6a3habVk1WVRJek5UWTVOalE9IgogICAgfQogIF0KfQo=
postgres-password: TWd6dUxVakZianA5ZjQ=
redis-password: NjI4akZL
---
apiVersion: v1
kind: ConfigMap
@@ -37,6 +39,8 @@ data:
POSTGRES_PORT: "5432"
POSTGRES_USER: "nexus"
POSTGRES_DBNAME: "nexus"
REDIS_HOST: "redis-service.redis.svc.cluster.local"
REDIS_PORT: "6379"
JVM_PARAMS: "-Xms2g -Xmx2g -XX:MaxDirectMemorySize=2g -Dnexus.secrets.file=/nexus-data/nexus.secrets.json"
---
apiVersion: apps/v1
@@ -64,7 +68,7 @@ spec:
ports:
- containerPort: 8081
name: nexus-ui
- containerPort: 8082
- containerPort: 8082 # Match internal HTTP connector
name: docker-repo
env:
- name: INSTALL4J_ADD_VM_PARAMS
@@ -99,6 +103,24 @@ spec:
secretKeyRef:
name: nexus-secrets
key: postgres-password
# Redis Caching Layer
- name: NEXUS_CACHE_TYPE
value: "redis"
- name: NEXUS_CACHE_REDIS_HOST
valueFrom:
configMapKeyRef:
name: nexus-configs
key: REDIS_HOST
- name: NEXUS_CACHE_REDIS_PORT
valueFrom:
configMapKeyRef:
name: nexus-configs
key: REDIS_PORT
- name: NEXUS_CACHE_REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: nexus-secrets
key: redis-password
resources:
requests:
cpu: "500m"
@@ -140,6 +162,22 @@ spec:
nodePort: 31009
- name: docker
protocol: TCP
port: 8082
port: 8082 # Internal Nexus Port
targetPort: 8082
nodePort: 31010
nodePort: 31010 # External NodePort
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: nexus-web-ui
namespace: nexus
spec:
entryPoints:
- websecure
routes:
# Only for UI. Docker now uses direct NodePort 31010
- match: Host(`nexus.khongisa.co.za`)
kind: Rule
services:
- name: nexus-service
port: 8081
+16 -3
View File
@@ -101,7 +101,7 @@ metadata:
name: pgadmin-service
namespace: pgadmin
spec:
type: NodePort
type: ClusterIP
selector:
app: pgadmin
ports:
@@ -109,5 +109,18 @@ spec:
protocol: TCP
port: 80
targetPort: 80
nodePort: 32081
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: pgadmin-web
namespace: pgadmin
spec:
entryPoints:
- websecure
routes:
- match: Host(`pgadmin.khongisa.co.za`)
kind: Rule
services:
- name: pgadmin-service
port: 80
+34 -59
View File
@@ -10,48 +10,11 @@ metadata:
name: phpmyadmin-config
namespace: phpmyadmin
data:
database.address: "192.168.1.137"
database.port: "3306"
---
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
namespace: phpmyadmin
type: Opaque
data:
username: cm9vdA==
password: QmxhY2tzdGFyMkBob21l
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: phpmyadmin-sa
namespace: phpmyadmin
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: phpmyadmin-role
namespace: phpmyadmin
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: phpmyadmin-rolebinding
namespace: phpmyadmin
subjects:
- kind: ServiceAccount
name: phpmyadmin-sa
namespace: phpmyadmin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: phpmyadmin-role
PMA_HOST: "192.168.1.180"
PMA_PORT: "3306"
PMA_USER: "root"
PMA_ABSOLUTE_URI: "https://phpmyadmin.khongisa.co.za/"
ALLOW_NO_PASSWORD: "true"
---
apiVersion: apps/v1
kind: Deployment
@@ -68,7 +31,13 @@ spec:
labels:
app: phpmyadmin
spec:
serviceAccountName: phpmyadmin-sa
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: DoesNotExist
containers:
- name: phpmyadmin
image: phpmyadmin/phpmyadmin:latest
@@ -79,48 +48,54 @@ spec:
valueFrom:
configMapKeyRef:
name: phpmyadmin-config
key: database.address
key: PMA_HOST
- name: PMA_PORT
valueFrom:
configMapKeyRef:
name: phpmyadmin-config
key: database.port
key: PMA_PORT
- name: PMA_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: username
- name: PMA_PASSWORD
configMapKeyRef:
name: phpmyadmin-config
key: PMA_USER
- name: ALLOW_NO_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
configMapKeyRef:
name: phpmyadmin-config
key: ALLOW_NO_PASSWORD
- name: PMA_ABSOLUTE_URI
valueFrom:
configMapKeyRef:
name: phpmyadmin-config
key: PMA_ABSOLUTE_URI
---
apiVersion: v1
kind: Service
metadata:
name: phpmyadmin
name: phpmyadmin-service
namespace: phpmyadmin
spec:
type: ClusterIP
selector:
app: phpmyadmin
ports:
- port: 80
- name: http
protocol: TCP
port: 80
targetPort: 80
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: phpmyadmin-ingress
name: phpmyadmin-web
namespace: phpmyadmin
spec:
entryPoints:
- websecure
routes:
- match: Host(`phpmyadmin.apps.mngoma.lab`)
- match: Host(`phpmyadmin.khongisa.co.za`)
kind: Rule
services:
- name: phpmyadmin
port: 80
tls: {}
- name: phpmyadmin-service
port: 80
+85
View File
@@ -0,0 +1,85 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: redis
---
apiVersion: v1
kind: Secret
metadata:
name: redis-secret
namespace: redis
type: Opaque
data:
password: NjI4akZL
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-data-pvc
namespace: redis
spec:
accessModes: ["ReadWriteMany"]
storageClassName: nfs-storage
resources:
requests:
storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: DoesNotExist
containers:
- name: redis
image: redis:7-alpine
command: ["redis-server", "--requirepass", "$(REDIS_PASSWORD)", "--appendonly", "yes"]
ports:
- containerPort: 6379
name: redis
env:
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: redis-secret
key: password
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: redis-data-pvc
---
apiVersion: v1
kind: Service
metadata:
name: redis-service
namespace: redis
spec:
type: NodePort
selector:
app: redis
ports:
- name: redis
protocol: TCP
port: 6379
targetPort: 6379
nodePort: 36379
+16 -31
View File
@@ -1,3 +1,4 @@
---
apiVersion: v1
kind: Namespace
metadata:
@@ -9,7 +10,8 @@ metadata:
name: redisinsight-config
namespace: redisinsight
data:
database.host: "192.168.1.137"
# Pointing to the internal service name of the new Redis instance
database.host: "redis-service.redis.svc.cluster.local"
database.port: "6379"
database.instance: "redis"
RI_LOG_LEVEL: "info"
@@ -56,36 +58,13 @@ roleRef:
name: redisinsight-role
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redisinsight-pv
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
storageClassName: local-pvs
local:
path: /home/ansible/k3s/makhiwane/redisinsight
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- lead
persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redisinsight-pvc
namespace: redisinsight
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-pvs
accessModes: ["ReadWriteMany"]
storageClassName: nfs-storage
resources:
requests:
storage: 2Gi
@@ -106,6 +85,13 @@ spec:
app: redisinsight
spec:
serviceAccountName: redisinsight-sa
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: DoesNotExist
containers:
- name: redisinsight
image: redislabs/redisinsight:latest
@@ -170,20 +156,19 @@ spec:
app: redisinsight
ports:
- port: 8001
targetPort: 8001 # maybe 5540
targetPort: 8001
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: redisinsight-ingress
name: redisinsight-web
namespace: redisinsight
spec:
entryPoints:
- websecure
routes:
- match: Host(`redisinsight.apps.mngoma.lab`)
- match: Host(`redisinsight.khongisa.co.za`)
kind: Rule
services:
- name: redisinsight
port: 8001
tls: {}
port: 8001
+8 -4
View File
@@ -38,6 +38,9 @@ spec:
value: "0.0.0.0"
- name: SEARXNG_SERVER_PORT
value: "8080"
# Ensures the application generates internal links correctly for the public URL
- name: SEARXNG_BASE_URL
value: "https://search.khongisa.co.za"
resources:
requests:
cpu: "100m"
@@ -52,7 +55,8 @@ metadata:
name: searxng-server
namespace: searxng
spec:
type: NodePort
# Internal-only service; nodePort 32080 is no longer required
type: ClusterIP
selector:
app.kubernetes.io/name: searxng-server
ports:
@@ -60,7 +64,6 @@ spec:
protocol: TCP
port: 8080
targetPort: 8080
nodePort: 32080
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
@@ -71,10 +74,11 @@ spec:
entryPoints:
- websecure
routes:
- match: Host(`searxng.apps.mngoma.lab`)
# Matches the specific subdomain configured in Pangolin
- match: Host(`search.khongisa.co.za`)
kind: Rule
services:
- name: searxng-server
port: 8080
scheme: http
tls: {}
tls: {}
+17 -5
View File
@@ -58,7 +58,7 @@ data:
admin-password: QmxhY2tzdGFyMkBob21l
access-key-encryption: NHZKMm1LMnBMNW5COHhSMnpRN3dFM3RZNnVJMG9QOWE=
id_ed25519: LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQzFyWlhrdGRqRUFBQUFBQkc1dmJtVUFBQUFFYm05dVpRQUFBQUFBQUFBQkFBQUFNd0FBQUF0emMyZ3RaVwpReU5UVXhPUUFBQUNEbkRQMDZzbmM0Q2k3M0ZPSW1nTmszTWJsc25vNTNoajZYRDJTSzE1ZFpiQUFBQUpnZWwvMndIcGY5CnNBQUFBQXR6YzJndFpXUXlOVFV4T1FBQUFDRG5EUDA2c25jNENpNzNGT0ltZ05rM01ibHNubzUzaGo2WEQyU0sxNWRaYkEKQUFBRUJUaHFjcnNXZWVVWnpFeVdWWmJoRGlKZE9FQkZYSkg4NXNhMUNjK1dXQ0krY00vVHF5ZHpnS0x2Y1U0aWFBMlRjeAp1V3llam5lR1BwY1BaSXJYbDFsc0FBQUFEbXRvZDJWNmFVQkVRVkpMVTFWT0FRSURCQVVHQnc9PQotLS0tLUVORCBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0K
id_ed25519.pub: c3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSU9jTS9UcXlkemdLTHZjVTRpYUEyVGN4dVd5ZWpuZUdQcGNQWklyWGwxbHMga2h3ZXppQERBUktTVU4K
id_ed25519.pub: c3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSU9jTS9UcXlkemdLTHZjVTRpYUEyVGN4dVd5ZWpuZUdQcGNQWklyWGwxbHMga2h3ZXpkeEBkYXJrc3VuCg==
---
apiVersion: v1
kind: ConfigMap
@@ -109,8 +109,6 @@ spec:
initContainers:
- name: fix-ssh-permissions
image: busybox:latest
# We ensure the directory exists and has 700.
# We don't touch the files yet because they are mounted by the main container.
command: ["sh", "-c", "mkdir -p /home/semaphore/.ssh && chmod 700 /home/semaphore/.ssh"]
volumeMounts:
- name: semaphore-persistent-storage
@@ -188,7 +186,7 @@ metadata:
name: semaphore-service
namespace: semaphore
spec:
type: NodePort
type: ClusterIP
selector:
app: semaphore
ports:
@@ -196,4 +194,18 @@ spec:
protocol: TCP
port: 3000
targetPort: 3000
nodePort: 31011
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: semaphore-web
namespace: semaphore
spec:
entryPoints:
- websecure
routes:
- match: Host(`semaphore.khongisa.co.za`)
kind: Rule
services:
- name: semaphore-service
port: 3000
+18 -3
View File
@@ -1,10 +1,11 @@
---
apiVersion: v1
kind: Service
metadata:
name: traefik-dashboard-nodeport
name: traefik-dashboard
namespace: kube-system
spec:
type: NodePort
type: ClusterIP
selector:
app.kubernetes.io/name: traefik
ports:
@@ -12,4 +13,18 @@ spec:
protocol: TCP
port: 8080
targetPort: 8080
nodePort: 30000
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard-web
namespace: kube-system
spec:
entryPoints:
- websecure
routes:
- match: Host(`traefik.khongisa.co.za`)
kind: Rule
services:
- name: api@internal
kind: TraefikService
+16 -2
View File
@@ -112,7 +112,7 @@ metadata:
name: vaultwarden-service
namespace: vaultwarden
spec:
type: NodePort
type: ClusterIP
selector:
app: vaultwarden
ports:
@@ -120,4 +120,18 @@ spec:
protocol: TCP
port: 80
targetPort: 80
nodePort: 32085
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: vaultwarden-web
namespace: vaultwarden
spec:
entryPoints:
- websecure
routes:
- match: Host(`vault.khongisa.co.za`)
kind: Rule
services:
- name: vaultwarden-service
port: 80
+47 -5
View File
@@ -119,7 +119,7 @@ metadata:
name: vscode-service
namespace: vscode
spec:
type: NodePort
type: ClusterIP
selector:
app: vscode
ports:
@@ -127,7 +127,6 @@ spec:
protocol: TCP
port: 8080
targetPort: 8080
nodePort: 33000
---
apiVersion: v1
kind: Service
@@ -135,7 +134,7 @@ metadata:
name: vscode-dev-service
namespace: vscode
spec:
type: NodePort
type: ClusterIP
selector:
app: vscode
ports:
@@ -143,9 +142,52 @@ spec:
protocol: TCP
port: 3000
targetPort: 3000
nodePort: 33001
- name: dotnet-dev
protocol: TCP
port: 5000
targetPort: 5000
nodePort: 33002
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: vscode-web
namespace: vscode
spec:
entryPoints:
- websecure
routes:
- match: Host(`code.khongisa.co.za`)
kind: Rule
services:
- name: vscode-service
port: 8080
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: vscode-node-uat
namespace: vscode
spec:
entryPoints:
- websecure
routes:
- match: Host(`node.uat.khongisa.co.za`)
kind: Rule
services:
- name: vscode-dev-service
port: 3000
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: vscode-dotnet-uat
namespace: vscode
spec:
entryPoints:
- websecure
routes:
- match: Host(`dotnet.uat.khongisa.co.za`)
kind: Rule
services:
- name: vscode-dev-service
port: 5000
+16 -2
View File
@@ -45,7 +45,7 @@ metadata:
name: whoami
namespace: whoami
spec:
type: NodePort
type: ClusterIP
selector:
app: whoami
ports:
@@ -53,4 +53,18 @@ spec:
protocol: TCP
port: 80
targetPort: 80
nodePort: 31002
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: whoami-web
namespace: whoami
spec:
entryPoints:
- websecure
routes:
- match: Host(`whoami.khongisa.co.za`)
kind: Rule
services:
- name: whoami
port: 80