Sync from main server - 2026-04-18 18:47:38
This commit is contained in:
@@ -19,12 +19,25 @@ VM_PORT="2223"
|
||||
VM_KEY="/root/.ssh/contabo-key"
|
||||
VM_DEST="/backups/main-server/"
|
||||
|
||||
# Log file for backup status (used by boot-check script)
|
||||
BACKUP_LOG_FILE="/root/backups/backup-status.log"
|
||||
MAX_BACKUPS=10
|
||||
|
||||
# ── Write status to log ──────────────────────────────────────────────────────
|
||||
log_status() {
|
||||
local status="$1" # SUCCESS or FAILED
|
||||
local name="$2"
|
||||
local msg="${3:-}"
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') | ${status} | ${name} | ${msg}" >> "$BACKUP_LOG_FILE"
|
||||
}
|
||||
|
||||
echo "========================================="
|
||||
echo "📦 Starting Backup: $BACKUP_NAME"
|
||||
echo " Apps: Frappe, Nextcloud, Mautic, n8n, Odoo"
|
||||
echo "========================================="
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
mkdir -p "/root/backups"
|
||||
cd "$BACKUP_DIR"
|
||||
|
||||
# --------------------------------------------------
|
||||
@@ -77,7 +90,6 @@ VOLUMES=(
|
||||
)
|
||||
|
||||
for volume in "${VOLUMES[@]}"; do
|
||||
# Skip volumes that don't exist on this host
|
||||
if ! docker volume inspect "$volume" &>/dev/null; then
|
||||
echo " ⏭️ $volume — not found, skipping"
|
||||
continue
|
||||
@@ -122,7 +134,6 @@ docker run --rm \
|
||||
&& echo " ✅ Nextcloud config.php" \
|
||||
|| echo " ⏭️ Nextcloud config not found"
|
||||
|
||||
# Frappe site config
|
||||
docker exec frappe-erpnext \
|
||||
cat /home/frappe/frappe-bench/sites/erpnext.navitrends.ovh/site_config.json \
|
||||
> configs/frappe-site_config.json 2>/dev/null \
|
||||
@@ -130,7 +141,7 @@ docker exec frappe-erpnext \
|
||||
|| echo " ⏭️ Frappe config not found"
|
||||
|
||||
# --------------------------------------------------
|
||||
# 6. Backup metadata
|
||||
# 6. Backup metadata + checksum
|
||||
# --------------------------------------------------
|
||||
echo ""
|
||||
echo "📝 [6/7] Writing backup metadata..."
|
||||
@@ -146,6 +157,14 @@ Docker info: $(docker --version)
|
||||
Volumes included:
|
||||
$(ls volumes/*.tar.gz 2>/dev/null | xargs -I{} basename {} || echo "none")
|
||||
EOF
|
||||
|
||||
# Write individual volume checksums for integrity verification later
|
||||
echo "" >> backup-info.txt
|
||||
echo "Volume SHA256 checksums:" >> backup-info.txt
|
||||
for f in volumes/*.tar.gz; do
|
||||
[ -f "$f" ] && sha256sum "$f" | awk '{print $1 " " $2}' >> backup-info.txt || true
|
||||
done
|
||||
|
||||
echo " ✅ Done"
|
||||
|
||||
# --------------------------------------------------
|
||||
@@ -158,8 +177,35 @@ tar -czf "${BACKUP_NAME}.tar.gz" "${BACKUP_NAME}/"
|
||||
COMPRESSED_SIZE=$(du -h "${BACKUP_NAME}.tar.gz" | cut -f1)
|
||||
echo " ✅ Compressed size: $COMPRESSED_SIZE → $BACKUP_ARCHIVE"
|
||||
|
||||
# Write a top-level SHA256 for the final archive (used by health-check)
|
||||
sha256sum "${BACKUP_NAME}.tar.gz" > "${BACKUP_NAME}.tar.gz.sha256"
|
||||
echo " ✅ Checksum written: ${BACKUP_NAME}.tar.gz.sha256"
|
||||
|
||||
# Remove staging directory now that archive is created
|
||||
rm -rf "$BACKUP_DIR"
|
||||
|
||||
# --------------------------------------------------
|
||||
# Send to VM over SSH
|
||||
# 8. Retention — keep only the latest MAX_BACKUPS
|
||||
# --------------------------------------------------
|
||||
echo ""
|
||||
echo "🧹 [Retention] Keeping latest ${MAX_BACKUPS} backups..."
|
||||
ARCHIVE_LIST=$(ls -t /root/backups/myapps-backup-*.tar.gz 2>/dev/null || true)
|
||||
ARCHIVE_COUNT=$(echo "$ARCHIVE_LIST" | grep -c '.tar.gz' || true)
|
||||
|
||||
if [ "$ARCHIVE_COUNT" -gt "$MAX_BACKUPS" ]; then
|
||||
TO_DELETE=$(echo "$ARCHIVE_LIST" | tail -n +$((MAX_BACKUPS + 1)))
|
||||
while IFS= read -r old_file; do
|
||||
[ -z "$old_file" ] && continue
|
||||
rm -f "$old_file"
|
||||
rm -f "${old_file}.sha256"
|
||||
echo " 🗑️ Deleted old backup: $(basename $old_file)"
|
||||
done <<< "$TO_DELETE"
|
||||
else
|
||||
echo " ✅ ${ARCHIVE_COUNT}/${MAX_BACKUPS} backups — nothing to prune"
|
||||
fi
|
||||
|
||||
# --------------------------------------------------
|
||||
# 9. Send to VM over SSH
|
||||
# --------------------------------------------------
|
||||
echo ""
|
||||
echo "📤 Sending backup to VM (${VM_HOST}:${VM_PORT})..."
|
||||
@@ -172,7 +218,9 @@ scp -i "$VM_KEY" \
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo " ✅ Backup sent to VM successfully!"
|
||||
echo " 💡 On the VM: ls ${VM_DEST}"
|
||||
# Also send the checksum file
|
||||
scp -i "$VM_KEY" -P "$VM_PORT" -o StrictHostKeyChecking=no \
|
||||
"${BACKUP_NAME}.tar.gz.sha256" "${VM_USER}@${VM_HOST}:${VM_DEST}" 2>/dev/null || true
|
||||
else
|
||||
echo " ❌ Transfer failed. The compressed backup is still at:"
|
||||
echo " $BACKUP_ARCHIVE"
|
||||
@@ -180,6 +228,11 @@ else
|
||||
echo " scp -i $VM_KEY -P $VM_PORT $BACKUP_ARCHIVE ${VM_USER}@${VM_HOST}:${VM_DEST}"
|
||||
fi
|
||||
|
||||
# --------------------------------------------------
|
||||
# 10. Write final status to log
|
||||
# --------------------------------------------------
|
||||
log_status "SUCCESS" "$BACKUP_NAME" "size=${COMPRESSED_SIZE}"
|
||||
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo "✅ BACKUP COMPLETE"
|
||||
|
||||
Reference in New Issue
Block a user