V6.1 continue refining backup: switch to Synology Drive Client for remote backup
Quality Gate / gate (push) Failing after 1m10s

This commit is contained in:
Jim Lancaster
2026-09-01 18:47:03 -05:00
parent 929f8d6de9
commit 75dc946123
8 changed files with 90 additions and 39 deletions
+25 -27
View File
@@ -3,7 +3,9 @@ set -eu
COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.production.yml}"
ENV_FILE="${ENV_FILE:-.env.production}"
BACKUP_DIR="${BACKUP_DIR:-./data/backups}"
BACKUP_DIR="${BACKUP_DIR:-${DATABASE_BACKUP_DIR:-./data/backups}}"
APP_DATA_BACKUP_DIR="${APP_DATA_BACKUP_DIR:-${BACKUP_DIR}/data}"
UPLOADS_BACKUP_DIR="${UPLOADS_BACKUP_DIR:-${BACKUP_DIR}/uploads}"
RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-14}"
SYNOLOGY_BACKUP_DIR="${SYNOLOGY_BACKUP_DIR:-}"
@@ -66,6 +68,23 @@ find "${BACKUP_DIR}" -type f \( \
-name 'backup-*.manifest' \
\) -mtime +"${RETENTION_DAYS}" -delete
# Always keep a rolling incremental mirror of uploaded files in BACKUP_DIR.
mkdir -p "${APP_DATA_BACKUP_DIR}"
if [ -d /app/data ]; then
cp -a /app/data/. "${APP_DATA_BACKUP_DIR}/"
fi
mkdir -p "${UPLOADS_BACKUP_DIR}/documents" "${UPLOADS_BACKUP_DIR}/photos"
if [ -f /app/uploads/homepage.md ] && [ ! -f "${UPLOADS_BACKUP_DIR}/homepage.md" ]; then
cp /app/uploads/homepage.md "${UPLOADS_BACKUP_DIR}/homepage.md"
fi
if [ -d /app/uploads/documents ]; then
cp -an /app/uploads/documents/. "${UPLOADS_BACKUP_DIR}/documents/"
fi
if [ -d /app/uploads/photos ]; then
cp -an /app/uploads/photos/. "${UPLOADS_BACKUP_DIR}/photos/"
fi
if [ -n "${SYNOLOGY_BACKUP_DIR}" ]; then
mkdir -p "${SYNOLOGY_BACKUP_DIR}"
@@ -89,21 +108,6 @@ if [ -n "${SYNOLOGY_BACKUP_DIR}" ]; then
--entrypoint sh app -lc \
"if [ -d /app/data/logs ]; then tar -C /app/data/logs -czf /backup/${logs_file} .; else : > /backup/${logs_file}; fi"
# 3) Sync uploads incrementally to Synology (copy only new files).
docker compose --env-file "${ENV_FILE}" -f "${COMPOSE_FILE}" run --rm --no-deps \
-v "${SYNOLOGY_BACKUP_DIR}:/backup" \
--entrypoint sh app -lc '
mkdir -p /backup/uploads/documents /backup/uploads/photos;
if [ -f /app/uploads/homepage.md ] && [ ! -f /backup/uploads/homepage.md ]; then
cp /app/uploads/homepage.md /backup/uploads/homepage.md;
fi;
if [ -d /app/uploads/documents ]; then
cp -an /app/uploads/documents/. /backup/uploads/documents/;
fi;
if [ -d /app/uploads/photos ]; then
cp -an /app/uploads/photos/. /backup/uploads/photos/;
fi
'
else
if [ -d /app/data/logs ]; then
tar -C /app/data/logs -czf "${SYNOLOGY_BACKUP_DIR}/${logs_file}" .
@@ -111,16 +115,8 @@ if [ -n "${SYNOLOGY_BACKUP_DIR}" ]; then
: > "${SYNOLOGY_BACKUP_DIR}/${logs_file}"
fi
mkdir -p "${SYNOLOGY_BACKUP_DIR}/uploads/documents" "${SYNOLOGY_BACKUP_DIR}/uploads/photos"
if [ -f /app/uploads/homepage.md ] && [ ! -f "${SYNOLOGY_BACKUP_DIR}/uploads/homepage.md" ]; then
cp /app/uploads/homepage.md "${SYNOLOGY_BACKUP_DIR}/uploads/homepage.md"
fi
if [ -d /app/uploads/documents ]; then
cp -an /app/uploads/documents/. "${SYNOLOGY_BACKUP_DIR}/uploads/documents/"
fi
if [ -d /app/uploads/photos ]; then
cp -an /app/uploads/photos/. "${SYNOLOGY_BACKUP_DIR}/uploads/photos/"
fi
mkdir -p "${SYNOLOGY_BACKUP_DIR}/uploads"
cp -an "${UPLOADS_BACKUP_DIR}/." "${SYNOLOGY_BACKUP_DIR}/uploads/"
fi
cp "${BACKUP_DIR}/${manifest_file}" "${SYNOLOGY_BACKUP_DIR}/${manifest_file}"
@@ -137,12 +133,14 @@ fi
echo "Created backup set:"
echo " ${BACKUP_DIR}/${postgres_file}"
echo " ${BACKUP_DIR}/${manifest_file}"
echo " ${APP_DATA_BACKUP_DIR}/ (incremental app data mirror)"
echo " ${UPLOADS_BACKUP_DIR}/ (incremental uploads mirror)"
if [ -n "${SYNOLOGY_BACKUP_DIR}" ]; then
echo "Synology artifacts:"
echo " ${SYNOLOGY_BACKUP_DIR}/${postgres_file}"
echo " ${SYNOLOGY_BACKUP_DIR}/${config_file}"
echo " ${SYNOLOGY_BACKUP_DIR}/${logs_file}"
echo " ${SYNOLOGY_BACKUP_DIR}/uploads/{homepage.md,documents/,photos/} (incremental)"
echo " ${SYNOLOGY_BACKUP_DIR}/uploads/ (copied from local incremental mirror)"
echo " ${SYNOLOGY_BACKUP_DIR}/${manifest_file}"
else
echo "SYNOLOGY_BACKUP_DIR not set; skipped Synology copy."