feat: minimal IHP scaffold — T01-T05, T08 of IRP-WP-0001

- flake.nix adapted from inter-hub: appName=ihp-railiance-probe, stripped to
  core packages, GHC 9.10.3 Bug 1+2 overlays carried verbatim (pname check
  updated to ihp-railiance-probe-models)
- IHP project scaffold: Main.hs, Config.hs, App.cabal, Setup.hs, Makefile
- Schema: probes table (id, name, created_at)
- Health endpoint: GET /healthz → "ok" (HealthController)
- Probes CRUD: ProbesController + 4 views (Index, New, Show, Edit)
- Hspec test suite: Test/ProbeControllerSpec covers /probes and /healthz
- Helm chart in chart/: deployment, service, ingress, secret templates
- devenv.nix, devenv.yaml, .ghci, tailwind config

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-03 12:57:28 +02:00
parent b818866c7f
commit e372a0c9ce
35 changed files with 645 additions and 0 deletions

6
chart/Chart.yaml Normal file
View File

@@ -0,0 +1,6 @@
apiVersion: v2
name: ihp-railiance-probe
description: Minimal IHP probe app for Railiance01 pipeline validation
type: application
version: 0.1.0
appVersion: "0.1.0"

View File

@@ -0,0 +1,38 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}
labels:
app: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
spec:
containers:
- name: {{ .Release.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 8000
envFrom:
- secretRef:
name: {{ .Values.secretName }}
resources:
limits:
memory: {{ .Values.resources.limits.memory }}
cpu: {{ .Values.resources.limits.cpu }}
requests:
memory: {{ .Values.resources.requests.memory }}
cpu: {{ .Values.resources.requests.cpu }}
livenessProbe:
httpGet:
path: /healthz
port: 8000
initialDelaySeconds: 30
periodSeconds: 10

View File

@@ -0,0 +1,20 @@
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Release.Name }}
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: {{ .Values.ingress.host }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: {{ .Release.Name }}
port:
number: {{ .Values.service.port }}
{{- end }}

View File

@@ -0,0 +1,11 @@
apiVersion: v1
kind: Secret
metadata:
name: {{ .Values.secretName }}
annotations:
"helm.sh/resource-policy": keep
type: Opaque
stringData:
IHP_SESSION_SECRET: "REPLACE_ME"
DATABASE_URL: "REPLACE_ME"
IHP_BASEURL: "http://{{ .Values.ingress.host }}"

View File

@@ -0,0 +1,11 @@
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}
spec:
type: {{ .Values.service.type }}
selector:
app: {{ .Release.Name }}
ports:
- port: {{ .Values.service.port }}
targetPort: {{ .Values.service.targetPort }}

25
chart/values.yaml Normal file
View File

@@ -0,0 +1,25 @@
image:
repository: 92.205.130.254:32166/coulomb/ihp-railiance-probe
tag: latest
pullPolicy: Always
replicaCount: 1
service:
type: ClusterIP
port: 80
targetPort: 8000
ingress:
enabled: true
host: probe.coulomb.social
resources:
limits:
memory: 256Mi
cpu: 200m
requests:
memory: 128Mi
cpu: 50m
secretName: ihp-railiance-probe-env