fix(backup): stream forgejo dump chunks via kubectl exec cat
kubectl cp still drops websocket on large forgejo dump parts; fall back to exec cat with pod refresh and smaller 8m chunks.
This commit is contained in:
parent
e644ce150f
commit
ae85effd0c
1 changed files with 20 additions and 4 deletions
|
|
@ -101,14 +101,29 @@ fi
|
||||||
# Large dumps (~700M) fail via stdout stream or single kubectl cp — use chunks.
|
# Large dumps (~700M) fail via stdout stream or single kubectl cp — use chunks.
|
||||||
dump_size="$(kubectl exec -n "${FORGEJO_NAMESPACE}" "${PROD_POD}" -c gitea -- \
|
dump_size="$(kubectl exec -n "${FORGEJO_NAMESPACE}" "${PROD_POD}" -c gitea -- \
|
||||||
stat -c%s "${DUMP_REMOTE}" 2>/dev/null || echo 0)"
|
stat -c%s "${DUMP_REMOTE}" 2>/dev/null || echo 0)"
|
||||||
|
refresh_prod_pod() {
|
||||||
|
PROD_POD="$(kubectl get pods -n "${FORGEJO_NAMESPACE}" \
|
||||||
|
-l "app.kubernetes.io/instance=${FORGEJO_RELEASE}" \
|
||||||
|
-o jsonpath='{.items[0].metadata.name}' 2>/dev/null || true)"
|
||||||
|
}
|
||||||
|
|
||||||
copy_from_pod() {
|
copy_from_pod() {
|
||||||
local remote_path="$1" local_path="$2" attempt
|
local remote_path="$1" local_path="$2" attempt
|
||||||
for attempt in 1 2 3; do
|
for attempt in 1 2 3 4 5; do
|
||||||
|
refresh_prod_pod
|
||||||
|
if [[ -z "${PROD_POD}" ]]; then
|
||||||
|
sleep $((attempt * 5))
|
||||||
|
continue
|
||||||
|
fi
|
||||||
if kubectl cp -n "${FORGEJO_NAMESPACE}" -c gitea \
|
if kubectl cp -n "${FORGEJO_NAMESPACE}" -c gitea \
|
||||||
"${FORGEJO_NAMESPACE}/${PROD_POD}:${remote_path}" "${local_path}" 2>/dev/null; then
|
"${FORGEJO_NAMESPACE}/${PROD_POD}:${remote_path}" "${local_path}" 2>/dev/null; then
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
sleep $((attempt * 3))
|
if kubectl exec --request-timeout=120 -n "${FORGEJO_NAMESPACE}" "${PROD_POD}" -c gitea -- \
|
||||||
|
cat "${remote_path}" > "${local_path}" 2>/dev/null && [[ -s "${local_path}" ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
sleep $((attempt * 5))
|
||||||
done
|
done
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
@ -118,8 +133,9 @@ if [[ "${dump_size}" -lt 52428800 ]]; then
|
||||||
else
|
else
|
||||||
ok "forgejo dump" "chunked copy (${dump_size} bytes)…"
|
ok "forgejo dump" "chunked copy (${dump_size} bytes)…"
|
||||||
chunk_dir="$(mktemp -d)"
|
chunk_dir="$(mktemp -d)"
|
||||||
parts="$(kubectl exec -n "${FORGEJO_NAMESPACE}" "${PROD_POD}" -c gitea -- \
|
refresh_prod_pod
|
||||||
sh -c "split -b 16m '${DUMP_REMOTE}' /tmp/forgejo-backup-part- && ls /tmp/forgejo-backup-part-*")"
|
parts="$(kubectl exec --request-timeout=120 -n "${FORGEJO_NAMESPACE}" "${PROD_POD}" -c gitea -- \
|
||||||
|
sh -c "rm -f /tmp/forgejo-backup-part-*; split -b 8m '${DUMP_REMOTE}' /tmp/forgejo-backup-part- && ls /tmp/forgejo-backup-part-*")"
|
||||||
for part in ${parts}; do
|
for part in ${parts}; do
|
||||||
base="$(basename "${part}")"
|
base="$(basename "${part}")"
|
||||||
copy_from_pod "${part}" "${chunk_dir}/${base}" || { bad "forgejo dump" "chunk copy failed: ${base}"; exit 1; }
|
copy_from_pod "${part}" "${chunk_dir}/${base}" || { bad "forgejo dump" "chunk copy failed: ${base}"; exit 1; }
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue