fix: fix backup CronJob template bugs
Helm Chart Release / release-chart (push) Successful in 4s

- Fix MYSQL_HOST/PORT: were referencing non-existent .Values.backup.mysql.host/port;
  now correctly read from .Values.phpmyadmin.hosts[0] as documented in README
- Remove broken BACKUP_TIMESTAMP env var (shell command substitution does not
  execute in k8s env vars; timestamp is already defined inside the script)
- Fix NFS readOnly: was always outputting "readOnly: false" even when
  .Values.backup.nfs.readOnly was true; now renders the actual value
- Add MYSQL_HISTFILE=/dev/null to prevent mysql client from writing history
  file when readOnlyRootFilesystem: true
- Fix variable name collision: renamed shell var DATABASES -> DB_LIST in the
  all-databases branch to avoid conflict with the DATABASES env var
- Use /bin/bash (available in mysql:8.0 Debian image) for set -euo pipefail
  and local keyword support
- Split retention find into separate *.sql and *.sql.gz patterns
- Add -mindepth 1 to empty dir cleanup to avoid removing the root backup dir

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-28 08:04:30 +09:00
parent 85a22e4d34
commit be7671b55b
+18 -18
View File
@@ -49,10 +49,11 @@ spec:
runAsNonRoot: true runAsNonRoot: true
runAsUser: 999 runAsUser: 999
env: env:
# MySQL接続情報は phpmyadmin.hosts[0] から取得
- name: MYSQL_HOST - name: MYSQL_HOST
value: {{ .Values.backup.mysql.host | quote }} value: {{ (index .Values.phpmyadmin.hosts 0).host | quote }}
- name: MYSQL_PORT - name: MYSQL_PORT
value: {{ .Values.backup.mysql.port | quote }} value: {{ (index .Values.phpmyadmin.hosts 0).port | quote }}
- name: MYSQL_USER - name: MYSQL_USER
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
@@ -63,8 +64,9 @@ spec:
secretKeyRef: secretKeyRef:
name: {{ .Values.backup.mysql.existingSecret | default (printf "%s-backup" (include "phpmyadmin-nginx.fullname" .)) }} name: {{ .Values.backup.mysql.existingSecret | default (printf "%s-backup" (include "phpmyadmin-nginx.fullname" .)) }}
key: {{ .Values.backup.mysql.passwordKey | default "mysql-password" }} key: {{ .Values.backup.mysql.passwordKey | default "mysql-password" }}
- name: BACKUP_TIMESTAMP # readOnlyRootFilesystem: true のためmysqlコマンドの履歴ファイルを無効化
value: $(date +%Y%m%d_%H%M%S) - name: MYSQL_HISTFILE
value: /dev/null
{{- if .Values.backup.databases }} {{- if .Values.backup.databases }}
- name: DATABASES - name: DATABASES
value: {{ join " " .Values.backup.databases | quote }} value: {{ join " " .Values.backup.databases | quote }}
@@ -90,12 +92,13 @@ spec:
DATE_DIR=$(date +%Y%m%d) DATE_DIR=$(date +%Y%m%d)
echo "=== MySQL Backup Started at $(date) ===" echo "=== MySQL Backup Started at $(date) ==="
echo "Host: ${MYSQL_HOST}:${MYSQL_PORT}"
echo "Backup destination: ${BACKUP_DIR}/${DATE_DIR}" echo "Backup destination: ${BACKUP_DIR}/${DATE_DIR}"
# Create backup directory # Create backup directory
mkdir -p "${BACKUP_DIR}/${DATE_DIR}" mkdir -p "${BACKUP_DIR}/${DATE_DIR}"
# Function to backup a database # Function to backup a single database
backup_database() { backup_database() {
local db=$1 local db=$1
local backup_file="${BACKUP_DIR}/${DATE_DIR}/${db}_${TIMESTAMP}.sql" local backup_file="${BACKUP_DIR}/${DATE_DIR}/${db}_${TIMESTAMP}.sql"
@@ -121,7 +124,6 @@ spec:
backup_file="${backup_file}.gz" backup_file="${backup_file}.gz"
{{- end }} {{- end }}
# Verify backup file
if [ -f "${backup_file}" ]; then if [ -f "${backup_file}" ]; then
size=$(du -h "${backup_file}" | cut -f1) size=$(du -h "${backup_file}" | cut -f1)
echo "✓ Backup completed: ${backup_file} (${size})" echo "✓ Backup completed: ${backup_file} (${size})"
@@ -131,14 +133,14 @@ spec:
fi fi
} }
# Backup specified databases or all databases
{{- if .Values.backup.databases }} {{- if .Values.backup.databases }}
# Backup specified databases
for db in ${DATABASES}; do for db in ${DATABASES}; do
backup_database "${db}" || echo "Warning: Failed to backup ${db}" backup_database "${db}" || echo "Warning: Failed to backup ${db}"
done done
{{- else }} {{- else }}
# Get all databases except system databases # Get all databases except system databases
DATABASES=$(mysql \ DB_LIST=$(mysql \
-h "${MYSQL_HOST}" \ -h "${MYSQL_HOST}" \
-P "${MYSQL_PORT}" \ -P "${MYSQL_PORT}" \
-u "${MYSQL_USER}" \ -u "${MYSQL_USER}" \
@@ -146,25 +148,25 @@ spec:
-N -B -e "SHOW DATABASES" | \ -N -B -e "SHOW DATABASES" | \
grep -Ev '^(information_schema|performance_schema|mysql|sys)$') grep -Ev '^(information_schema|performance_schema|mysql|sys)$')
for db in ${DATABASES}; do for db in ${DB_LIST}; do
backup_database "${db}" || echo "Warning: Failed to backup ${db}" backup_database "${db}" || echo "Warning: Failed to backup ${db}"
done done
{{- end }} {{- end }}
{{- if .Values.backup.retention.enabled }} {{- if .Values.backup.retention.enabled }}
# Cleanup old backups # Cleanup old backups
echo "Cleaning up backups older than {{ .Values.backup.retention.days }} days" echo "Cleaning up backups older than {{ .Values.backup.retention.days }} days..."
find "${BACKUP_DIR}" -type f -name "*.sql*" -mtime +{{ .Values.backup.retention.days }} -delete find "${BACKUP_DIR}" -type f -name "*.sql" -mtime +{{ .Values.backup.retention.days }} -delete
find "${BACKUP_DIR}" -type d -empty -delete find "${BACKUP_DIR}" -type f -name "*.sql.gz" -mtime +{{ .Values.backup.retention.days }} -delete
find "${BACKUP_DIR}" -mindepth 1 -type d -empty -delete
{{- end }} {{- end }}
# Summary # Summary
echo "=== Backup Summary ===" echo "=== Backup Summary ==="
echo "Total backup size:" echo "Total backup size:"
du -sh "${BACKUP_DIR}/${DATE_DIR}" du -sh "${BACKUP_DIR}/${DATE_DIR}" 2>/dev/null || echo "(no files)"
echo "Backup files:" echo "Backup files:"
ls -lh "${BACKUP_DIR}/${DATE_DIR}" ls -lh "${BACKUP_DIR}/${DATE_DIR}" 2>/dev/null || echo "(none)"
echo "=== MySQL Backup Completed at $(date) ===" echo "=== MySQL Backup Completed at $(date) ==="
resources: resources:
{{- toYaml .Values.backup.resources | nindent 14 }} {{- toYaml .Values.backup.resources | nindent 14 }}
@@ -179,9 +181,7 @@ spec:
nfs: nfs:
server: {{ .Values.backup.nfs.server }} server: {{ .Values.backup.nfs.server }}
path: {{ .Values.backup.nfs.path }} path: {{ .Values.backup.nfs.path }}
{{- if .Values.backup.nfs.readOnly }} readOnly: {{ .Values.backup.nfs.readOnly }}
readOnly: false
{{- end }}
{{- else }} {{- else }}
persistentVolumeClaim: persistentVolumeClaim:
claimName: {{ .Values.backup.existingClaim | default (printf "%s-backup" (include "phpmyadmin-nginx.fullname" .)) }} claimName: {{ .Values.backup.existingClaim | default (printf "%s-backup" (include "phpmyadmin-nginx.fullname" .)) }}