Skip to content

Commit a5af24f

Browse files
web-flowclaude
andcommitted
feat: containerize Ollama scripts with Flux image automation
Package ollama management scripts into a container image for in-cluster execution as a K8s Job. Refactors update-model.sh to use Ollama HTTP API directly (via service DNS) instead of kubectl exec, with auto-detection of in-cluster vs Mac execution mode. Adds GHA workflow to build/push the image on changes, and Flux ImageAutomation to auto-update the Job manifest when new images are available. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 0635768 commit a5af24f

8 files changed

Lines changed: 335 additions & 85 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
name: Build Ollama Scripts
2+
3+
on:
4+
push:
5+
paths:
6+
- 'scripts/ollama/**'
7+
branches:
8+
- master
9+
workflow_dispatch:
10+
11+
env:
12+
REGISTRY: ghcr.io
13+
IMAGE_NAME: ${{ github.repository_owner }}/ollama-scripts
14+
15+
jobs:
16+
build:
17+
runs-on: ubuntu-latest
18+
permissions:
19+
contents: read
20+
packages: write
21+
22+
steps:
23+
- name: Checkout
24+
uses: actions/checkout@v4
25+
26+
- name: Log in to Container Registry
27+
uses: docker/login-action@v3
28+
with:
29+
registry: ${{ env.REGISTRY }}
30+
username: ${{ github.actor }}
31+
password: ${{ secrets.GITHUB_TOKEN }}
32+
33+
- name: Extract metadata
34+
id: meta
35+
uses: docker/metadata-action@v5
36+
with:
37+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
38+
tags: |
39+
type=sha,prefix=,format=short
40+
41+
- name: Build and push
42+
uses: docker/build-push-action@v6
43+
with:
44+
context: scripts/ollama
45+
push: true
46+
tags: ${{ steps.meta.outputs.tags }}
47+
labels: ${{ steps.meta.outputs.labels }}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
apiVersion: batch/v1
2+
kind: Job
3+
metadata:
4+
name: ollama-model-update
5+
namespace: ollama
6+
annotations:
7+
description: "Pull new Ollama model and remove old one via HTTP API"
8+
spec:
9+
ttlSecondsAfterFinished: 86400
10+
backoffLimit: 2
11+
activeDeadlineSeconds: 600
12+
template:
13+
metadata:
14+
labels:
15+
app: ollama-model-update
16+
spec:
17+
restartPolicy: OnFailure
18+
imagePullSecrets:
19+
- name: ghcr-creds
20+
containers:
21+
- name: model-update
22+
image: ghcr.io/homeiac/ollama-scripts:INITIAL # {"$imagepolicy": "flux-system:ollama-scripts"}
23+
env:
24+
- name: NEW_MODEL
25+
value: "qwen3:4b"
26+
- name: OLD_MODEL
27+
value: "qwen2.5:3b"
28+
- name: OLLAMA_URL
29+
value: "http://ollama-gpu.ollama.svc:80"

gitops/clusters/homelab/apps/ollama/kustomization.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ resources:
66
- deployment.yaml
77
- service.yaml
88
- ingress.yaml
9-
9+
- job-model-update.yaml
10+
- secrets/ghcr-creds.sops.yaml
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
apiVersion: v1
2+
kind: Secret
3+
metadata:
4+
name: ghcr-creds
5+
namespace: ollama
6+
type: kubernetes.io/dockerconfigjson
7+
stringData:
8+
.dockerconfigjson: ENC[AES256_GCM,data:zlRqVDMP9CN6cCZDkNWOOYD+00ozRPsiM2yln99l5Znyj4O0Wcad9rMf9WW+Y+Cl/Nkac1m9JeLwzatlwP9A2stGQMow67EDXflx1XWdmI8mZpyonhRk3qM6n3uSXKvceOd4FpQtMgsgsoaqo/AvYT4bi7LNL9yyarcgMEwXHJetTNs7wZILMmoJLFoZ9VxtAInMJGXlJviNXisMCDLUT7g2ZnMHWMK6vlg0qg==,iv:aukokOBL3IHL6JqFKxKLhKTvMFRt57GCKd5WhwJdi/k=,tag:Qtamug5yONtPFLshhHZDzA==,type:str]
9+
sops:
10+
age:
11+
- recipient: age1uwvq3llqjt666t4ckls9wv44wcpxxwlu8svqwx5kc7v76hncj94qg3tsna
12+
enc: |
13+
-----BEGIN AGE ENCRYPTED FILE-----
14+
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBySVNoTFNqZVJQMUE1d0hZ
15+
ckZ5aXdDb3pOSDNWL3BpQjloc2RiS1BxU2dZCko5RysyUDE5NU53ejZ6Yi9ocU9L
16+
MUt2emhVK0ZOdmxnU2hyMm9wdWVtUFEKLS0tIEcxcCsvRUFiSmthdVQ5a0dYazRm
17+
YXFRYVBUMUdoeGNtWHhJUjFXenRiTWMKK8XMVKycTOqG4SC+2nF8SxzDKZI0xWnY
18+
aPiAhlCcetAQEFEw62G+sPaFIVjOD1wxJzct73de+0y1QiegX+DDmw==
19+
-----END AGE ENCRYPTED FILE-----
20+
lastmodified: "2026-02-26T19:13:42Z"
21+
mac: ENC[AES256_GCM,data:5Smqq98kT8GdUExFilAWJ3QBkldTRn9pABqHkfMAQQK+fApRfwG2bOZVRFkN/Fn5BkXLAN23wx2CSMpQyRPereQfOlIQd9cuXOiSNvLC9RdP+jqRyXbQzVbZhrDvvKO/Y3bL6N8d14sjazx9X1Zd85S16NlGuknRHg7GGJ9eR6o=,iv:ZM0Pd+DTqnSmRyK+ig45txZ8igNI8GxrU1NX5qwnGyY=,tag:6kIgIUNH+c8Vs61y54Z1Cw==,type:str]
22+
encrypted_regex: ^(data|stringData)$
23+
version: 3.11.0
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
---
2+
apiVersion: image.toolkit.fluxcd.io/v1beta2
3+
kind: ImageRepository
4+
metadata:
5+
name: ollama-scripts
6+
namespace: flux-system
7+
spec:
8+
image: ghcr.io/homeiac/ollama-scripts
9+
interval: 5m
10+
secretRef:
11+
name: ghcr-creds
12+
---
13+
apiVersion: image.toolkit.fluxcd.io/v1beta2
14+
kind: ImagePolicy
15+
metadata:
16+
name: ollama-scripts
17+
namespace: flux-system
18+
spec:
19+
imageRepositoryRef:
20+
name: ollama-scripts
21+
filterTags:
22+
pattern: '^[a-f0-9]{7}$'
23+
policy:
24+
alphabetical:
25+
order: desc
26+
---
27+
apiVersion: image.toolkit.fluxcd.io/v1beta2
28+
kind: ImageUpdateAutomation
29+
metadata:
30+
name: ollama-scripts
31+
namespace: flux-system
32+
spec:
33+
interval: 5m
34+
sourceRef:
35+
kind: GitRepository
36+
name: flux-system
37+
git:
38+
checkout:
39+
ref:
40+
branch: master
41+
commit:
42+
author:
43+
name: fluxcdbot
44+
email: fluxcd@homelab.local
45+
messageTemplate: |
46+
chore(flux): update ollama-scripts image to {{range .Changed.Changes}}{{.NewValue}}{{end}}
47+
push:
48+
branch: master
49+
update:
50+
path: ./gitops/clusters/homelab/apps/ollama
51+
strategy: Setters

gitops/clusters/homelab/flux-system/kustomization.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ resources:
77
- image-automation-pve-nut.yaml
88
- image-automation-proxmox-provisioner.yaml
99
- image-automation-frigate-health-checker.yaml
10+
- image-automation-ollama-scripts.yaml

scripts/ollama/Dockerfile

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
FROM alpine:3.19
2+
3+
RUN apk add --no-cache \
4+
bash \
5+
curl \
6+
jq
7+
8+
WORKDIR /app
9+
10+
COPY update-model.sh check-ollama.sh test-inference.sh /app/
11+
12+
RUN chmod +x /app/*.sh
13+
14+
ENTRYPOINT ["/app/update-model.sh"]

0 commit comments

Comments
 (0)