Compare commits

...

56 Commits

Author SHA1 Message Date
1477b532bc Merge pull request 'Second drone ci port fix' (#42) from dev into main
Reviewed-on: #42
2026-04-12 14:49:17 +02:00
Khwezi
0fb27042e6 Second drone ci port fix 2026-04-12 14:48:44 +02:00
8eeb1a7da1 Merge pull request 'Fixed drone-ci port definitions' (#41) from dev into main
Reviewed-on: #41
2026-04-12 14:44:30 +02:00
Khwezi
5a98b0280e Fixed drone-ci port definitions 2026-04-12 14:43:52 +02:00
ad9ac0fed0 Merge pull request 'refactored drone ci template' (#40) from dev into main
Reviewed-on: #40
2026-04-12 14:40:57 +02:00
Khwezi
7a925af1c0 refactored drone ci template 2026-04-12 14:40:18 +02:00
2cb81107f2 Merge pull request 'Reconfigured semaphore secrets' (#39) from dev into main
Reviewed-on: #39
2026-04-12 14:20:19 +02:00
Khwezi
db32982c30 Reconfigured semaphore secrets 2026-04-12 14:19:28 +02:00
fad7ca7386 Merge pull request 'Light refactor' (#38) from dev into main
Reviewed-on: #38
2026-04-12 14:09:28 +02:00
Khwezi
6df82ede04 Light refactor 2026-04-12 14:08:52 +02:00
68fdb36467 Merge pull request 'Readded init command and temporary mount point' (#37) from dev into main
Reviewed-on: #37
2026-04-12 14:04:45 +02:00
Khwezi
b473b0577b Readded init command and temporary mount point 2026-04-12 14:04:21 +02:00
8b168439fe Merge pull request 'Fixed semaphore mount paths' (#36) from dev into main
Reviewed-on: #36
2026-04-12 14:01:01 +02:00
Khwezi
c90c375348 Fixed semaphore mount paths 2026-04-12 14:00:26 +02:00
6931a826f3 Merge pull request 'Fixed semaphore role binding syntax error' (#35) from dev into main
Reviewed-on: #35
2026-04-12 13:57:10 +02:00
Khwezi
c0c94d320f Fixed semaphore role binding syntax error 2026-04-12 13:56:41 +02:00
c4b22b5f8d Merge pull request 'dev' (#34) from dev into main
Reviewed-on: #34
2026-04-12 13:55:11 +02:00
Khwezi
2d4ccc7910 Added semaphore role binding 2026-04-12 13:54:24 +02:00
Khwezi
e1196d437f Added a semaphore service account 2026-04-12 13:50:09 +02:00
941658a91d Merge pull request 'Changed semaphore group policy' (#33) from dev into main
Reviewed-on: #33
2026-04-12 13:45:08 +02:00
Khwezi
c6a3b4c473 Changed semaphore group policy 2026-04-12 13:44:44 +02:00
be9c308842 Merge pull request 'Refactored semaphore init' (#32) from dev into main
Reviewed-on: #32
2026-04-12 13:42:26 +02:00
Khwezi
66f476e746 Refactored semaphore init 2026-04-12 13:41:51 +02:00
44899b7e13 Merge pull request 'dev' (#31) from dev into main
Reviewed-on: #31
2026-04-12 13:29:15 +02:00
Khwezi
4e31981737 Ensured the volumes mount to the right target directory 2026-04-12 13:28:42 +02:00
Khwezi
a53578cfc9 Fixed private key secret 2026-04-12 13:23:12 +02:00
509b96f702 Merge pull request 'Corrected semaphore host affiny patching' (#30) from dev into main
Reviewed-on: #30
2026-04-12 12:32:36 +02:00
7d8504701f Merge pull request 'Added host alias to semaphore template for gitea' (#29) from dev into main
Reviewed-on: #29
2026-04-12 12:30:10 +02:00
b8defaa183 Merge pull request 'Manually created public ssh key fix' (#28) from dev into main
Reviewed-on: #28
2026-04-12 12:20:19 +02:00
63e8b0bfb7 Merge pull request 'Fixed semaphoe ssh secret' (#27) from dev into main
Reviewed-on: #27
2026-04-12 12:18:26 +02:00
5898246ac1 Merge pull request 'Added the semaphoreui template' (#26) from dev into main
Reviewed-on: #26
2026-04-12 12:16:17 +02:00
471452483d Merge pull request 'changed node port for pgadmin' (#25) from dev into main
Reviewed-on: #25
2026-04-12 11:55:53 +02:00
0228263257 Merge pull request 'Updated pgadmin to use a new port and use the correct nodeAffinity statement' (#24) from dev into main
Reviewed-on: #24
2026-04-12 11:46:16 +02:00
4693cf5c3c Merge pull request 'Refactored pgadmin k3s template' (#23) from dev into main
Reviewed-on: #23
2026-04-12 11:41:19 +02:00
31947a8a80 Merge pull request 'Increased max CPU from 2 to 4 for nexus' (#22) from dev into main
Reviewed-on: #22
2026-04-12 10:49:44 +02:00
0bcc69f6d6 Merge pull request 'Added nexus kubernetes template' (#21) from dev into main
Reviewed-on: #21
2026-04-12 10:37:26 +02:00
33eb1bcd92 Merge pull request 'Refactored searxing template' (#20) from dev into main
Reviewed-on: #20
2026-04-11 17:21:08 +02:00
161c12199e Merge pull request 'Added two more k3s templates' (#19) from dev into main
Reviewed-on: #19
2026-04-11 17:13:40 +02:00
bf3c678554 Merge pull request 'dev' (#18) from dev into main
Reviewed-on: #18
2026-04-11 16:46:35 +02:00
78f0bdff25 Merge pull request 'Added wait task to vpn playbook' (#17) from dev into main
Reviewed-on: #17
2026-04-11 16:39:58 +02:00
e729e27b73 Merge pull request 'dev' (#16) from dev into main
Reviewed-on: #16
2026-04-11 16:34:16 +02:00
ee00fe073a Merge pull request 'Updated vpn playbook to output diagnostics lines' (#15) from dev into main
Reviewed-on: #15
2026-04-11 16:15:12 +02:00
0853f03005 Merge pull request 'Fixed semaphore named volume syntax error' (#14) from dev into main
Reviewed-on: #14
2026-04-11 16:01:41 +02:00
891d85223b Merge pull request 'using named volumes for semaphore' (#13) from dev into main
Reviewed-on: #13
2026-04-11 15:59:48 +02:00
d2b7a6de5f Merge pull request 'dev' (#12) from dev into main
Reviewed-on: #12
2026-04-11 15:42:59 +02:00
ea5c0e637b Merge pull request 'Removed ssh pub key line specification from ansible inventory' (#11) from dev into main
Reviewed-on: #11
2026-04-11 15:29:45 +02:00
92a63dd809 Merge pull request 'Added VPN updater playbook' (#10) from dev into main
Reviewed-on: #10
2026-04-11 15:14:57 +02:00
8d318a4912 Merge pull request 'Added vpn host to manifest' (#9) from dev into main
Reviewed-on: #9
2026-04-11 15:08:54 +02:00
64d6c503f8 Merge pull request 'Specified timezone on semaphore' (#8) from dev into main
Reviewed-on: #8
2026-04-11 15:05:24 +02:00
83332af8b5 Merge pull request 'Added playbook that reboots hosts' (#7) from dev into main
Reviewed-on: #7
2026-04-11 14:58:26 +02:00
3f7d06aa2a Merge pull request 'Changed database password variable name' (#6) from dev into main
Reviewed-on: #6
2026-04-11 14:26:59 +02:00
ece2529841 Merge pull request 'Fixed variable formatting' (#5) from dev into main
Reviewed-on: #5
2026-04-11 14:20:32 +02:00
582263ce05 Merge pull request 'Hardcoded exposed port' (#4) from dev into main
Reviewed-on: #4
2026-04-11 14:15:21 +02:00
c800ef3466 Merge pull request 'dev' (#3) from dev into main
Reviewed-on: #3
2026-04-11 14:12:55 +02:00
e3b7b4bb0c Merge pull request 'dev' (#2) from dev into main
Reviewed-on: #2
2026-04-11 13:57:27 +02:00
3cbb37e66f Merge pull request 'Copied all stacks' (#1) from dev into main
Reviewed-on: #1
2026-04-11 09:53:34 +02:00
2 changed files with 152 additions and 266 deletions

View File

@@ -1,331 +1,172 @@
---
# Namespace for Drone CI
apiVersion: v1
kind: Namespace
metadata:
name: droneci
name: drone-ci
---
# Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
name: droneci-sa
namespace: droneci
name: drone-runner-sa
namespace: drone-ci
---
# ConfigMap for Drone configuration
apiVersion: v1
kind: ConfigMap
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: droneci-config
namespace: droneci
data:
server.domain: "droneci.apps.mngoma.lab"
server.proto: "https"
server.runnername: "drone-runner"
server.runnercapacity: "2"
server.runnernetworks: "default"
database.type: "postgres"
database.host: "192.168.1.137:5432"
database.name: "dronecim"
gitea.server: "https://gitea.apps.mngoma.lab"
gitea.server.internal: "https://gitea-server.gitea.svc.cluster.local"
name: drone-runner-role
namespace: drone-ci
rules:
- apiGroups: [""]
resources: ["pods", "pods/log", "secrets"]
verbs: ["get", "create", "delete", "list", "watch", "update"]
---
# Secret for Drone credentials
apiVersion: v1
kind: Secret
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: droneci-secret
namespace: droneci
type: Opaque
data:
server.rpctoken: MDFLNlFHTkE4VEMxQjJGVzNGV0JSWDJFNE4=
database.username: YXBwX3VzZXI=
database.password: MTIzNDU=
database.connectstring: cG9zdGdyZXM6Ly9hcHBfdXNlcjoxMjM0NUAxOTIuMTY4LjEuMTM3OjU0MzIvZHJvbmVjaW0/c3NsbW9kZT1kaXNhYmxl
gitea.clientid: MGRiNTliZDAtMGI3Ni00ODgxLThhODQtNjI0N2ZlYTExOTcz
gitea.clientsecret: Z3RvX3l6bXB6NmJvZG52cmRnMnM1MmVmNWF1c3ozZTYzNGdyeTc0MjJqZ2hwd3ZnbGc2M2JtcnE=
name: drone-runner-rb
namespace: drone-ci
subjects:
- kind: ServiceAccount
name: drone-runner-sa
namespace: drone-ci
roleRef:
kind: Role
name: drone-runner-role
apiGroup: rbac.authorization.k8s.io
---
# Persistent Volume for Drone data
apiVersion: v1
kind: PersistentVolume
metadata:
name: droneci-pv
labels:
type: local
spec:
capacity:
storage: 5Gi
accessModes: ["ReadWriteOnce"]
storageClassName: local-pvs
local:
path: /home/ansible/k3s/makhiwane/droneci
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values: ["lead"]
persistentVolumeReclaimPolicy: Retain
---
# Persistent Volume Claim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: droneci-pvc
namespace: droneci
name: drone-server-data-pvc
namespace: drone-ci
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: local-pvs
accessModes:
- ReadWriteOnce
storageClassName: nfs-storage
resources:
requests:
storage: 5Gi
---
# Drone Server Deployment
apiVersion: v1
kind: Secret
metadata:
name: drone-secrets
namespace: drone-ci
type: Opaque
stringData:
DRONE_RPC_SECRET: "b505b2906ae213070b10d9698cc35e84"
DRONE_GITEA_CLIENT_ID: "a9b4a947-0b4c-4782-a5f8-3ed79a4b295d"
DRONE_GITEA_CLIENT_SECRET: "gto_ukxcserdy7vei36git4tbuz2tdyez4rb2eo5woownmtyct3lz3aq"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: drone
namespace: droneci
labels:
app.kubernetes.io/name: drone
name: drone-server
namespace: drone-ci
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: drone
app: drone-server
template:
metadata:
labels:
app.kubernetes.io/name: drone
app: drone-server
spec:
serviceAccountName: droneci-sa
hostAliases:
- ip: "192.168.1.160"
hostnames:
- "gitea.apps.mngoma.lab"
- ip: "169.255.58.144"
hostnames: ["gitea.khongisa.co.za"]
containers:
- name: drone
image: drone/drone:latest
- name: drone-server
image: drone/drone:2
ports:
- containerPort: 80
name: http
resources:
requests:
cpu: "100m"
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
memory: "512Mi"
env:
- name: DRONE_SERVER_HOST
valueFrom:
configMapKeyRef:
name: droneci-config
key: server.domain
- name: DRONE_SERVER_PROTO
valueFrom:
configMapKeyRef:
name: droneci-config
key: server.proto
- name: DRONE_SERVER_PORT
# FIX: Explicitly bind the address to bypass port validation logic
- name: DRONE_SERVER_ADDR
value: ":80"
- name: DRONE_TLS_AUTOCERT
value: "false"
- name: DRONE_LOGS_DEBUG
value: "true"
- name: DRONE_RPC_SECRET
valueFrom:
secretKeyRef:
name: droneci-secret
key: server.rpctoken
- name: DRONE_DATABASE_DRIVER
valueFrom:
configMapKeyRef:
name: droneci-config
key: database.type
- name: DRONE_DATABASE_DATASOURCE
valueFrom:
secretKeyRef:
name: droneci-secret
key: database.connectstring
- name: DRONE_DB_USER
valueFrom:
secretKeyRef:
name: droneci-secret
key: database.username
- name: DRONE_DB_PASS
valueFrom:
secretKeyRef:
name: droneci-secret
key: database.password
- name: DRONE_SERVER_HOST
value: "drone.khongisa.co.za"
- name: DRONE_SERVER_PROTO
value: "https"
- name: DRONE_GITEA_SERVER
valueFrom:
configMapKeyRef:
name: droneci-config
key: gitea.server
value: "https://gitea.khongisa.co.za"
- name: DRONE_RPC_SECRET
valueFrom: { secretKeyRef: { name: drone-secrets, key: DRONE_RPC_SECRET } }
- name: DRONE_GITEA_CLIENT_ID
valueFrom:
secretKeyRef:
name: droneci-secret
key: gitea.clientid
valueFrom: { secretKeyRef: { name: drone-secrets, key: DRONE_GITEA_CLIENT_ID } }
- name: DRONE_GITEA_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: droneci-secret
key: gitea.clientsecret
- name: DRONE_GITEA_SKIP_VERIFY
value: "true"
valueFrom: { secretKeyRef: { name: drone-secrets, key: DRONE_GITEA_CLIENT_SECRET } }
- name: DRONE_DATABASE_DRIVER
value: "sqlite3"
- name: DRONE_DATABASE_DATASOURCE
value: "/data/database.sqlite"
volumeMounts:
- name: drone-storage
- name: data
mountPath: /data
volumes:
- name: drone-storage
- name: data
persistentVolumeClaim:
claimName: droneci-pvc
claimName: drone-server-data-pvc
---
# Drone Server Service
apiVersion: v1
kind: Service
metadata:
name: drone-server
namespace: droneci
spec:
selector:
app.kubernetes.io/name: drone
ports:
- name: http
port: 80
targetPort: 80
type: ClusterIP
---
# Drone Runner Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: drone-runner
namespace: droneci
labels:
app.kubernetes.io/name: drone-runner
namespace: drone-ci
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: drone-runner
app: drone-runner
template:
metadata:
labels:
app.kubernetes.io/name: drone-runner
app: drone-runner
spec:
serviceAccountName: droneci-sa
serviceAccountName: drone-runner-sa
hostAliases:
- ip: "192.168.1.160"
hostnames:
- "droneci.apps.mngoma.lab"
- ip: "169.255.58.144"
hostnames: ["gitea.khongisa.co.za"]
containers:
- name: runner
- name: drone-runner
image: drone/drone-runner-kube:latest
ports:
- containerPort: 3000
env:
# propagate SSL skip and internal Gitea to ephemeral pods
- name: DRONE_RUNNER_ENV_VARS
valueFrom:
configMapKeyRef:
name: droneci-config
key: gitea.server.internal
- name: DRONE_RPC_HOST
value: drone-server.droneci.svc.cluster.local
- name: DRONE_RPC_PROTO
value: "http"
- name: DRONE_RPC_SECRET
valueFrom:
secretKeyRef:
name: droneci-secret
key: server.rpctoken
- name: DRONE_RUNNER_NAME
valueFrom:
configMapKeyRef:
name: droneci-config
key: server.runnername
- name: DRONE_RUNNER_CAPACITY
valueFrom:
configMapKeyRef:
name: droneci-config
key: server.runnercapacity
- name: DRONE_RUNNER_NETWORKS
valueFrom:
configMapKeyRef:
name: droneci-config
key: server.runnernetworks
resources:
requests:
cpu: "100m"
memory: "128Mi"
cpu: "200m"
limits:
cpu: "300m"
memory: "256Mi"
cpu: "400m"
env:
- name: DRONE_RPC_PROTO
value: "http"
- name: DRONE_RPC_HOST
value: "drone-server.drone-ci.svc.cluster.local"
- name: DRONE_RPC_SECRET
valueFrom: { secretKeyRef: { name: drone-secrets, key: DRONE_RPC_SECRET } }
- name: DRONE_NAMESPACE_DEFAULT
value: "drone-ci"
---
# Drone IngressRoute for Traefik
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
apiVersion: v1
kind: Service
metadata:
name: droneci-web
namespace: droneci
name: drone-server
namespace: drone-ci
spec:
entryPoints:
- websecure
routes:
- match: Host(`droneci.apps.mngoma.lab`)
kind: Rule
services:
- name: drone-server
port: 80
scheme: http
tls: {}
---
# ClusterRole for Drone CI Service Account
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: droneci-cluster-role
rules:
- apiGroups: [""] # core API
resources: ["pods", "pods/exec", "pods/log", "services", "endpoints", "configmaps", "secrets", "persistentvolumeclaims", "namespaces"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets", "statefulsets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["batch"]
resources: ["jobs", "cronjobs"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["extensions", "networking.k8s.io"]
resources: ["ingresses"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["policy"]
resources: ["poddisruptionbudgets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
# ClusterRoleBinding for Drone CI Service Account
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: droneci-cluster-rolebinding
subjects:
- kind: ServiceAccount
name: droneci-sa
namespace: droneci
roleRef:
kind: ClusterRole
name: droneci-cluster-role
apiGroup: rbac.authorization.k8s.io
type: NodePort
selector:
app: drone-server
ports:
- name: http
port: 80
targetPort: 80
nodePort: 31001

View File

@@ -5,6 +5,36 @@ metadata:
name: semaphore
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: semaphore-sa
namespace: semaphore
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: semaphore-role
namespace: semaphore
rules:
- apiGroups: [""]
resources: ["pods", "secrets", "configmaps"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: semaphore-rb
namespace: semaphore
subjects:
- kind: ServiceAccount
name: semaphore-sa
namespace: semaphore
roleRef:
kind: Role
name: semaphore-role
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: semaphore-data-pvc
@@ -27,10 +57,8 @@ data:
db-password: c2VYbk42RGt1cFJaN0Y=
admin-password: QmxhY2tzdGFyMkBob21l
access-key-encryption: NHZKMm1LMnBMNW5COHhSMnpRN3dFM3RZNnVJMG9QOWE=
# CLEAN BASE64 STRINGS (No spaces or newlines)
id_ed25519: b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZWQyNTUxOQAAACDnDP06snc4Ci73FOImgNk3Mblsno53hj6XD2SK15dZbAAAAJgel/2wHpf9sAAAAAtzc2gtZWQyNTUxOQAAACDnDP06snc4Ci73FOImgNk3Mblsno53hj6XD2SK15dZbAAAAEBThqcrsWeeUZzEyWVZbhDiJdOEBFXJH85sa1Cc+WWCI+cM/TqydzgKLvcU4iaA2TcxuWyejneGPpcPZIrXl1lsAAAADmtod2V6aUBEQVJLU1VOAQIDBAUGBw==
id_ed25519.pub: c3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSU9jTS9UcXlkemdLTHZjVTRpYUEyVGN4dVd5ZWpuZUdQcGNQWklyWGwxbHMga2h3ZXppQERBUktTVU4=
id_ed25519: LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQzFyWlhrdGRqRUFBQUFBQkc1dmJtVUFBQUFFYm05dVpRQUFBQUFBQUFBQkFBQUFNd0FBQUF0emMyZ3RaVwpReU5UVXhPUUFBQUNEbkRQMDZzbmM0Q2k3M0ZPSW1nTmszTWJsc25vNTNoajZYRDJTSzE1ZFpiQUFBQUpnZWwvMndIcGY5CnNBQUFBQXR6YzJndFpXUXlOVFV4T1FBQUFDRG5EUDA2c25jNENpNzNGT0ltZ05rM01ibHNubzUzaGo2WEQyU0sxNWRaYkEKQUFBRUJUaHFjcnNXZWVVWnpFeVdWWmJoRGlKZE9FQkZYSkg4NXNhMUNjK1dXQ0krY00vVHF5ZHpnS0x2Y1U0aWFBMlRjeAp1V3llam5lR1BwY1BaSXJYbDFsc0FBQUFEbXRvZDJWNmFVQkVRVkpMVTFWT0FRSURCQVVHQnc9PQotLS0tLUVORCBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0K
id_ed25519.pub: c3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSU9jTS9UcXlkemdLTHZjVTRpYUEyVGN4dVd5ZWpuZUdQcGNQWklyWGwxbHMga2h3ZXppQERBUktTVU4K
---
apiVersion: v1
kind: ConfigMap
@@ -50,8 +78,6 @@ kind: Deployment
metadata:
name: semaphore
namespace: semaphore
labels:
app: semaphore
spec:
replicas: 1
selector:
@@ -62,6 +88,7 @@ spec:
labels:
app: semaphore
spec:
serviceAccountName: semaphore-sa
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
@@ -72,10 +99,23 @@ spec:
hostAliases:
- ip: "169.255.58.144"
hostnames:
- "gitea.khongisa.co.za"
- "gitea.khongisa.co.za"
securityContext:
runAsUser: 1001
fsGroup: 1001
fsGroupChangePolicy: "Always"
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
mountPath: /home/semaphore
containers:
- name: semaphore
image: semaphoreui/semaphore:latest
@@ -115,22 +155,27 @@ spec:
- name: SEMAPHORE_ACCESS_KEY_ENCRYPTION
valueFrom: { secretKeyRef: { name: semaphore-secrets, key: access-key-encryption } }
volumeMounts:
- name: semaphore-tmp
- name: semaphore-persistent-storage
mountPath: /home/semaphore
- name: semaphore-persistent-storage
mountPath: /tmp/semaphore
subPath: tmp
- name: ssh-keys-volume
mountPath: /home/semaphore/.ssh/id_ed25519
subPath: id_ed25519
readOnly: true
- name: ssh-keys-volume
mountPath: /home/semaphore/.ssh/id_ed25519.pub
subPath: id_ed25519.pub
readOnly: true
volumes:
- name: semaphore-tmp
- name: semaphore-persistent-storage
persistentVolumeClaim:
claimName: semaphore-data-pvc
- name: ssh-keys-volume
secret:
secretName: semaphore-secrets
defaultMode: 384
defaultMode: 384 # 0600
items:
- key: id_ed25519
path: id_ed25519