feat(platform): Add connections (signal-cli-rest-api) service

- Deploy signal-cli-rest-api 0.85 for Hermes Signal notifications
- Replace broken astro-orbiter VM (10.1.71.130:8080) with K8s service
- ArgoCD-managed GitOps deployment in connections namespace
- NFS-backed persistent storage for signal-cli state
- Fixes UNREGISTERED_FAILURE affecting midday market cron job
- Epcot-themed service (communication pavilion concept)

Service endpoint: http://connections.connections.svc.cluster.local:8080
This commit is contained in:
Hermes Agent service account
2026-06-12 15:52:49 -05:00
parent 7cbed63c92
commit 3b3461fd3c
5 changed files with 143 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
# ------------------------------------------------------------------------------
# Platform: connections (Signal Gateway)
# Theme: epcot-connections (EPCOT: Communication & World Showcase)
# Wave 8 — Signal-cli REST API for Hermes notifications
# ------------------------------------------------------------------------------
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: connections
namespace: argocd
annotations:
argocd.argoproj.io/sync-wave: "8"
spec:
project: default
source:
repoURL: https://gitea.mk-labs.cloud/rblundon/homelab.git
targetRevision: main
path: cluster/platform/connections
directory:
exclude: "application.yaml"
destination:
server: https://kubernetes.default.svc
namespace: connections
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m

View File

@@ -0,0 +1,67 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: connections
namespace: connections
labels:
app.kubernetes.io/name: connections
app.kubernetes.io/component: messaging-gateway
app.kubernetes.io/version: "0.85" # Pin version initially
spec:
replicas: 1 # MUST be 1 - signal-cli state is not multi-instance safe
strategy:
type: Recreate # Prevents dual mount of PVC
selector:
matchLabels:
app.kubernetes.io/name: connections
template:
metadata:
labels:
app.kubernetes.io/name: connections
app.kubernetes.io/component: messaging-gateway
spec:
securityContext:
fsGroup: 1000
runAsUser: 1000
runAsNonRoot: true
containers:
- name: signal-cli-rest-api
image: bbernhard/signal-cli-rest-api:0.85 # Pin version, test upgrades
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
name: http
protocol: TCP
env:
- name: MODE
value: "json-rpc" # json-rpc mode for API compatibility
volumeMounts:
- name: signal-data
mountPath: /home/.local/share/signal-cli
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /v1/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /v1/health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 2
volumes:
- name: signal-data
persistentVolumeClaim:
claimName: signal-cli-data

View File

@@ -0,0 +1,8 @@
apiVersion: v1
kind: Namespace
metadata:
name: connections
labels:
app.kubernetes.io/name: connections
app.kubernetes.io/component: messaging-gateway
theme: epcot

View File

@@ -0,0 +1,16 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: signal-cli-data
namespace: connections
labels:
app.kubernetes.io/name: connections
app.kubernetes.io/component: storage
spec:
accessModes:
- ReadWriteOnce
storageClassName: nfs-emporium # NFS CSI storage class
resources:
requests:
storage: 2Gi # signal-cli state is small, 2Gi provides headroom
volumeMode: Filesystem

View File

@@ -0,0 +1,17 @@
apiVersion: v1
kind: Service
metadata:
name: connections
namespace: connections
labels:
app.kubernetes.io/name: connections
app.kubernetes.io/component: messaging-gateway
spec:
type: ClusterIP
ports:
- port: 8080
targetPort: 8080
protocol: TCP
name: http
selector:
app.kubernetes.io/name: connections