feat(chart): air-gap-friendly Odoo + Postgres image refs (B.10)

This commit is contained in:
OdooSky v3
2026-05-05 17:59:17 +02:00
parent 8ab695b93d
commit 6425526314
3 changed files with 38 additions and 3 deletions

View File

@@ -28,6 +28,14 @@ spec:
# values.yaml would leave the existing pod alone. # values.yaml would leave the existing pod alone.
odoosky.io/addons-hash: {{ .Values.addons | toJson | sha256sum | trunc 16 }} odoosky.io/addons-hash: {{ .Values.addons | toJson | sha256sum | trunc 16 }}
spec: spec:
{{- with .Values.imageMirror.pullSecret }}
# Air-gap support (B.10): when imageMirror.pullSecret is set,
# K8s authenticates against the mirror with this Secret to pull
# the upstream Odoo image. Default empty = anonymous (Docker
# Hub library images need no auth).
imagePullSecrets:
- name: {{ . }}
{{- end }}
# fsGroup=101 makes the kubelet recursively chown the filestore # fsGroup=101 makes the kubelet recursively chown the filestore
# PVC's root inode to gid=101 on attach. Odoo runs as uid 101 # PVC's root inode to gid=101 on attach. Odoo runs as uid 101
# and writes /var/lib/odoo/sessions on first request; without # and writes /var/lib/odoo/sessions on first request; without
@@ -59,7 +67,7 @@ spec:
# and create Odoo's tables. After base is installed, # and create Odoo's tables. After base is installed,
# `-i base` is a no-op so subsequent boots add ~5s. # `-i base` is a no-op so subsequent boots add ~5s.
- name: db-init - name: db-init
image: "{{ .Values.odoo.image }}:{{ .Values.odoo.tag }}" image: "{{ if .Values.imageMirror.registry }}{{ .Values.imageMirror.registry }}/{{ end }}{{ .Values.odoo.image }}:{{ .Values.odoo.tag }}"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
# Override the official Odoo entrypoint so we can run psql # Override the official Odoo entrypoint so we can run psql
# before odoo. The image ships with postgresql-client, so # before odoo. The image ships with postgresql-client, so
@@ -194,7 +202,7 @@ spec:
{{- end }} {{- end }}
containers: containers:
- name: odoo - name: odoo
image: "{{ .Values.odoo.image }}:{{ .Values.odoo.tag }}" image: "{{ if .Values.imageMirror.registry }}{{ .Values.imageMirror.registry }}/{{ end }}{{ .Values.odoo.image }}:{{ .Values.odoo.tag }}"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
# Pin the active database to our tenant code. Without this # Pin the active database to our tenant code. Without this
# Odoo runs in multi-DB mode and exposes /web/database/manager; # Odoo runs in multi-DB mode and exposes /web/database/manager;

View File

@@ -28,9 +28,16 @@ spec:
{{- include "instance.labels" . | nindent 8 }} {{- include "instance.labels" . | nindent 8 }}
odoosky.io/role: postgres odoosky.io/role: postgres
spec: spec:
{{- with .Values.imageMirror.pullSecret }}
# Air-gap support (B.10) — see odoo-deployment.yaml for the
# full rationale. Same imageMirror.pullSecret is used for the
# postgres image too so customers configure mirror auth once.
imagePullSecrets:
- name: {{ . }}
{{- end }}
containers: containers:
- name: postgres - name: postgres
image: "{{ .Values.postgres.image }}:{{ .Values.postgres.tag }}" image: "{{ if .Values.imageMirror.registry }}{{ .Values.imageMirror.registry }}/{{ end }}{{ .Values.postgres.image }}:{{ .Values.postgres.tag }}"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
ports: ports:
- name: pg - name: pg

View File

@@ -74,6 +74,26 @@ sizes:
filestore: 50Gi filestore: 50Gi
database: 100Gi database: 100Gi
# imageMirror — air-gap support (audit B.10). When `registry` is
# set, the chart prepends it to .Values.odoo.image AND
# .Values.postgres.image references at template-render time. So an
# air-gapped customer pointing at e.g. registry.example.com/dh-mirror
# renders Odoo as registry.example.com/dh-mirror/odoo:18.0 instead
# of Docker Hub's docker.io/library/odoo:18.0. Addon images already
# pull from the cluster-local registry (registry.odoosky-system) by
# Tower's image-build pipeline; this block covers the upstream Odoo
# + Postgres images that bypass that pipeline.
#
# `pullSecret` names a K8s Secret in the instance namespace that
# carries credentials for the mirror. Empty = anonymous pull (the
# default; Docker Hub's library images don't need auth).
#
# Default empty = same behaviour as before this addition — Odoo +
# Postgres images come from Docker Hub.
imageMirror:
registry: ""
pullSecret: ""
odoo: odoo:
image: odoo image: odoo
tag: "18.0" tag: "18.0"