add app init files
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: cals
|
||||
namespace: epcare
|
||||
spec:
|
||||
selector:
|
||||
app: cals
|
||||
ports:
|
||||
- name: syslog-tcp
|
||||
protocol: TCP
|
||||
port: 601
|
||||
targetPort: 601
|
||||
# ClusterIP (default) — no fixed IP needed anymore.
|
||||
# Each namespace (epcare-ep01, epcare-ep02...) gets its own cals Service.
|
||||
# Other pods in the same namespace reach it via: cals:601
|
||||
# Cross-namespace: cals.epcare-ep01.svc.cluster.local:601 (not needed here)
|
||||
@@ -0,0 +1,60 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: cals
|
||||
namespace: epcare
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: cals
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: cals
|
||||
spec:
|
||||
nodeSelector:
|
||||
kubernetes.io/hostname: NODE_HOSTNAME # Patched per overlay (e.g. ep01)
|
||||
imagePullSecrets:
|
||||
- name: gitlab-registry
|
||||
containers:
|
||||
- name: cals
|
||||
image: registry.gitlab.com/signalytic/client-external/client-apps-log-sync/cals/arm64:1.3
|
||||
imagePullPolicy: IfNotPresent
|
||||
ports:
|
||||
- containerPort: 601
|
||||
protocol: TCP
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: cals-env
|
||||
- secretRef:
|
||||
name: global-env
|
||||
volumeMounts:
|
||||
- name: cals-logs
|
||||
mountPath: /var/log/syslog-ng
|
||||
- name: ssh-key
|
||||
mountPath: /root/.ssh/id_ed25519
|
||||
subPath: id_ed25519
|
||||
readOnly: true
|
||||
readinessProbe:
|
||||
tcpSocket:
|
||||
port: 601
|
||||
initialDelaySeconds: 15
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 3
|
||||
livenessProbe:
|
||||
tcpSocket:
|
||||
port: 601
|
||||
initialDelaySeconds: 20
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 3
|
||||
volumes:
|
||||
- name: cals-logs
|
||||
persistentVolumeClaim:
|
||||
claimName: cals-logs-pvc
|
||||
- name: ssh-key
|
||||
secret:
|
||||
secretName: cals-ssh-key
|
||||
defaultMode: 0400
|
||||
@@ -0,0 +1,88 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: db
|
||||
namespace: epcare
|
||||
spec:
|
||||
selector:
|
||||
app: db
|
||||
ports:
|
||||
- name: mysql
|
||||
protocol: TCP
|
||||
port: 3306
|
||||
targetPort: 3306
|
||||
clusterIP: None # Headless — stable DNS for OpenMRS without load balancing
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: db
|
||||
namespace: epcare
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: db
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: db
|
||||
spec:
|
||||
nodeSelector:
|
||||
kubernetes.io/hostname: NODE_HOSTNAME
|
||||
# Fix: chown /var/lib/mysql to mysql user (999) at pod start
|
||||
securityContext:
|
||||
fsGroup: 999
|
||||
initContainers:
|
||||
- name: fix-permissions
|
||||
image: busybox
|
||||
command: ["sh", "-c", "chown -R 999:999 /var/lib/mysql"]
|
||||
volumeMounts:
|
||||
- name: db-data
|
||||
mountPath: /var/lib/mysql
|
||||
imagePullSecrets:
|
||||
- name: gitlab-registry
|
||||
containers:
|
||||
- name: db
|
||||
image: registry.gitlab.com/signalytic/client-external/epcare/mysql/arm64:1.0
|
||||
imagePullPolicy: IfNotPresent
|
||||
args:
|
||||
- --character-set-server=utf8mb4
|
||||
- --collation-server=utf8mb4_general_ci
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: db-env
|
||||
ports:
|
||||
- containerPort: 3306
|
||||
readinessProbe:
|
||||
exec:
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- 'mysqladmin ping -h localhost -u${MYSQL_USER} -p${MYSQL_PASSWORD}'
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 5
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 20
|
||||
volumeMounts:
|
||||
- name: db-data
|
||||
mountPath: /var/lib/mysql
|
||||
- name: mysql-config
|
||||
mountPath: /etc/mysql/conf.d/mysql.cnf
|
||||
subPath: mysql.cnf
|
||||
readOnly: true
|
||||
- name: db-dumps
|
||||
mountPath: /docker-entrypoint-initdb.d
|
||||
readOnly: true
|
||||
volumes:
|
||||
- name: db-data
|
||||
persistentVolumeClaim:
|
||||
claimName: db-data-pvc
|
||||
- name: mysql-config
|
||||
configMap:
|
||||
name: mysql-config
|
||||
- name: db-dumps
|
||||
hostPath:
|
||||
path: /opt/epcare/resources/db/dumps
|
||||
type: DirectoryOrCreate
|
||||
@@ -0,0 +1,59 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: backend
|
||||
namespace: epcare
|
||||
spec:
|
||||
selector:
|
||||
app: backend
|
||||
ports:
|
||||
- name: http
|
||||
protocol: TCP
|
||||
port: 8080
|
||||
targetPort: 8080
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: backend
|
||||
namespace: epcare
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: backend
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: backend
|
||||
spec:
|
||||
nodeSelector:
|
||||
kubernetes.io/hostname: NODE_HOSTNAME
|
||||
imagePullSecrets:
|
||||
- name: gitlab-registry
|
||||
initContainers:
|
||||
- name: wait-for-db
|
||||
image: busybox:1.36
|
||||
command: ['sh', '-c', 'until nc -z db 3306; do echo "waiting for db..."; sleep 3; done']
|
||||
containers:
|
||||
- name: backend
|
||||
image: registry.gitlab.com/signalytic/client-external/epcare/backend/arm64:1.1
|
||||
imagePullPolicy: IfNotPresent
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: backend-env
|
||||
volumeMounts:
|
||||
- name: openmrs-data
|
||||
mountPath: /openmrs/data
|
||||
- name: openmrs-config
|
||||
mountPath: /openmrs/distribution/openmrs_config
|
||||
readOnly: true
|
||||
volumes:
|
||||
- name: openmrs-data
|
||||
persistentVolumeClaim:
|
||||
claimName: openmrs-data-pvc
|
||||
- name: openmrs-config
|
||||
hostPath:
|
||||
path: /opt/epcare/resources/backend/configuration
|
||||
type: DirectoryOrCreate
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: frontend
|
||||
namespace: epcare
|
||||
spec:
|
||||
selector:
|
||||
app: frontend
|
||||
ports:
|
||||
- name: http
|
||||
protocol: TCP
|
||||
port: 80
|
||||
targetPort: 80
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: frontend
|
||||
namespace: epcare
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: frontend
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: frontend
|
||||
spec:
|
||||
nodeSelector:
|
||||
kubernetes.io/hostname: NODE_HOSTNAME
|
||||
imagePullSecrets:
|
||||
- name: gitlab-registry
|
||||
initContainers:
|
||||
- name: wait-for-backend
|
||||
image: busybox:1.36
|
||||
command: ['sh', '-c', 'until nc -z backend 8080; do echo "waiting for backend..."; sleep 10; done']
|
||||
containers:
|
||||
- name: frontend
|
||||
image: registry.gitlab.com/signalytic/client-external/epcare/frontend/arm64:1.1
|
||||
imagePullPolicy: IfNotPresent
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: frontend-env
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: gateway
|
||||
namespace: epcare
|
||||
spec:
|
||||
selector:
|
||||
app: gateway
|
||||
ports:
|
||||
- name: http
|
||||
protocol: TCP
|
||||
port: 80
|
||||
targetPort: 80
|
||||
type: ClusterIP
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: gateway
|
||||
namespace: epcare
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: gateway
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: gateway
|
||||
spec:
|
||||
nodeSelector:
|
||||
kubernetes.io/hostname: NODE_HOSTNAME
|
||||
imagePullSecrets:
|
||||
- name: gitlab-registry
|
||||
initContainers:
|
||||
- name: wait-for-frontend
|
||||
image: busybox:1.36
|
||||
command: ['sh', '-c', 'until nc -z frontend 80; do echo "waiting for frontend..."; sleep 3; done']
|
||||
- name: wait-for-backend
|
||||
image: busybox:1.36
|
||||
command: ['sh', '-c', 'until nc -z backend 8080; do echo "waiting for backend..."; sleep 3; done']
|
||||
containers:
|
||||
- name: gateway
|
||||
image: registry.gitlab.com/signalytic/client-external/epcare/gateway/arm64:1.0
|
||||
imagePullPolicy: IfNotPresent
|
||||
ports:
|
||||
- containerPort: 80
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: databasus
|
||||
namespace: epcare
|
||||
spec:
|
||||
selector:
|
||||
app: databasus
|
||||
ports:
|
||||
- name: http
|
||||
protocol: TCP
|
||||
port: 4005
|
||||
targetPort: 4005
|
||||
type: ClusterIP
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: databasus
|
||||
namespace: epcare
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: databasus
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: databasus
|
||||
spec:
|
||||
nodeSelector:
|
||||
kubernetes.io/hostname: NODE_HOSTNAME
|
||||
imagePullSecrets:
|
||||
- name: gitlab-registry
|
||||
containers:
|
||||
- name: databasus
|
||||
image: registry.gitlab.com/signalytic/client-external/epcare/databasus/arm64:1.0
|
||||
imagePullPolicy: IfNotPresent
|
||||
ports:
|
||||
- containerPort: 4005
|
||||
volumeMounts:
|
||||
- name: databasus-data
|
||||
mountPath: /databasus-data
|
||||
volumes:
|
||||
- name: databasus-data
|
||||
persistentVolumeClaim:
|
||||
claimName: databasus-data-pvc
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: IngressRoute
|
||||
metadata:
|
||||
name: gateway-ingress
|
||||
namespace: epcare
|
||||
spec:
|
||||
entryPoints:
|
||||
- websecure
|
||||
routes:
|
||||
- match: Host(`epcare.signalytic.lan`)
|
||||
kind: Rule
|
||||
services:
|
||||
- name: gateway
|
||||
port: 80
|
||||
tls: {}
|
||||
---
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: IngressRoute
|
||||
metadata:
|
||||
name: databasus-ingress
|
||||
namespace: epcare
|
||||
spec:
|
||||
entryPoints:
|
||||
- websecure
|
||||
routes:
|
||||
- match: Host(`epcare-databasus.signalytic.lan`)
|
||||
kind: Rule
|
||||
services:
|
||||
- name: databasus
|
||||
port: 4005
|
||||
tls: {}
|
||||
@@ -0,0 +1,52 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: openmrs-data-pvc
|
||||
namespace: epcare
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
storageClassName: local-path # k3s built-in provisioner
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: db-data-pvc
|
||||
namespace: epcare
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
storageClassName: local-path
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: databasus-data-pvc
|
||||
namespace: epcare
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 5Gi
|
||||
storageClassName: local-path
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: cals-logs-pvc
|
||||
namespace: epcare
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 2Gi
|
||||
storageClassName: local-path
|
||||
@@ -0,0 +1,31 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: mysql-config
|
||||
namespace: epcare
|
||||
data:
|
||||
mysql.cnf: |
|
||||
[mysqld]
|
||||
# optimise for large db-imports
|
||||
innodb_redo_log_capacity = 2147483648
|
||||
|
||||
# Buffer pool - bump this if the host has more RAM available
|
||||
innodb_buffer_pool_size = 512M
|
||||
|
||||
# Log buffer - good
|
||||
innodb_log_buffer_size = 256M
|
||||
|
||||
# Flush behavior - 2 is good for import speed, consider switching
|
||||
# back to 1 in production for ACID compliance
|
||||
innodb_flush_log_at_trx_commit = 2
|
||||
|
||||
# WARNING: O_DIRECT can fail on overlay2 (common Docker storage driver)
|
||||
# Safer default for containers:
|
||||
innodb_flush_method = fsync
|
||||
|
||||
# Recommended additions for large imports:
|
||||
innodb_write_io_threads = 8
|
||||
innodb_read_io_threads = 8
|
||||
bulk_insert_buffer_size = 256M
|
||||
|
||||
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
|
||||
@@ -0,0 +1,36 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx-demo
|
||||
namespace: epcare
|
||||
spec:
|
||||
replicas: 4
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nginx-demo
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx-demo
|
||||
spec:
|
||||
nodeSelector:
|
||||
kubernetes.io/hostname: NODE_HOSTNAME
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:stable-alpine
|
||||
imagePullPolicy: IfNotPresent
|
||||
ports:
|
||||
- containerPort: 80
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: nginx-demo
|
||||
namespace: epcare
|
||||
spec:
|
||||
selector:
|
||||
app: nginx-demo
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: 80
|
||||
type: LoadBalancer
|
||||
@@ -0,0 +1,15 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- 01-cals-service.yaml
|
||||
- 02-cals-deployment.yaml
|
||||
- 03-db.yaml
|
||||
- 04-backend.yaml
|
||||
- 05-frontend.yaml
|
||||
- 06-gateway.yaml
|
||||
- 07-databasus.yaml
|
||||
- 08-ingress.yaml
|
||||
- 09-pvcs.yaml
|
||||
- 10-configmap.yaml
|
||||
- 11-nginx.yaml
|
||||
@@ -0,0 +1,4 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: epcare
|
||||
@@ -0,0 +1,18 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
|
||||
namespace: epcare
|
||||
|
||||
resources:
|
||||
- ../../base
|
||||
- secrets.yaml
|
||||
|
||||
patches:
|
||||
# Pin all Deployments to the single node of this cluster.
|
||||
# Value must match: kubectl get nodes --show-labels | grep kubernetes.io/hostname
|
||||
- patch: |-
|
||||
- op: replace
|
||||
path: /spec/template/spec/nodeSelector/kubernetes.io~1hostname
|
||||
value: hexm-0001
|
||||
target:
|
||||
kind: Deployment
|
||||
@@ -0,0 +1,92 @@
|
||||
# ============================================================
|
||||
# Node-specific secrets for hexm-0001
|
||||
#
|
||||
# These MUST be encrypted with SOPS before committing to Git.
|
||||
# Encrypt: sops --encrypt --in-place secrets.yaml
|
||||
# Decrypt: sops --decrypt secrets.yaml | kubectl apply -f -
|
||||
#
|
||||
# Alternatively, create imperatively and skip committing this file:
|
||||
# kubectl create secret generic global-env \
|
||||
# --from-literal=SIGNALYTIC_NODE_ID=HEXM0001 \
|
||||
# --from-literal=SIGNALYTIC_FACILITY_NAME="Facility Name Here" \
|
||||
# -n epcare
|
||||
# ============================================================
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: global-env
|
||||
namespace: epcare
|
||||
type: Opaque
|
||||
stringData:
|
||||
SIGNALYTIC_NODE_ID: "HEXM0001"
|
||||
SIGNALYTIC_FACILITY_NAME: "HOPE CLINIC LUKULI"
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: cals-env
|
||||
namespace: epcare
|
||||
type: Opaque
|
||||
stringData:
|
||||
CALS_REMOTE_HOST: "REPLACE_WITH_REMOTE_HOST"
|
||||
CALS_REMOTE_PATH: /home/cals/logs/HEXM0001
|
||||
CALS_REMOTE_USER: cals
|
||||
CALS_SSH_KEY_PATH: /root/.ssh/id_ed25519
|
||||
CALS_TZ: UTC
|
||||
CALS_SCHEDULE: "*/2 * * * *"
|
||||
CALS_OPTIONS: -avz --delete
|
||||
CALS_RETENTION_DAYS: "30"
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: cals-ssh-key
|
||||
namespace: epcare
|
||||
type: Opaque
|
||||
stringData:
|
||||
id_ed25519: |
|
||||
-----BEGIN OPENSSH PRIVATE KEY-----
|
||||
REPLACE_WITH_ACTUAL_PRIVATE_KEY_FOR_HEXM0001
|
||||
-----END OPENSSH PRIVATE KEY-----
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: db-env
|
||||
namespace: epcare
|
||||
type: Opaque
|
||||
stringData:
|
||||
OMRS_DB_USER: "openmrs"
|
||||
OMRS_DB_PASSWORD: "password"
|
||||
MYSQL_DATABASE: openmrs
|
||||
MYSQL_USER: openmrs
|
||||
MYSQL_PASSWORD: "password"
|
||||
MYSQL_ROOT_PASSWORD: "password"
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: backend-env
|
||||
namespace: epcare
|
||||
type: Opaque
|
||||
stringData:
|
||||
OMRS_CONFIG_MODULE_WEB_ADMIN: "true"
|
||||
OMRS_CONFIG_AUTO_UPDATE_DATABASE: "true"
|
||||
OMRS_CONFIG_CREATE_TABLES: "false"
|
||||
OMRS_CONFIG_CONNECTION_SERVER: db
|
||||
OMRS_CONFIG_CONNECTION_DATABASE: openmrs
|
||||
OMRS_CONFIG_CONNECTION_USERNAME: openmrs
|
||||
OMRS_CONFIG_CONNECTION_PASSWORD: "openmrs"
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: frontend-env
|
||||
namespace: epcare
|
||||
type: Opaque
|
||||
stringData:
|
||||
SPA_PATH: /openmrs/spa
|
||||
API_URL: /openmrs
|
||||
SPA_CONFIG_URLS: /openmrs/spa/config-core_demo.json
|
||||
SPA_DEFAULT_LOCALE: ""
|
||||
Reference in New Issue
Block a user