From 9e9b76ea4a07a5f69795510dcc2f05b7dc33e1a6 Mon Sep 17 00:00:00 2001 From: DO Server Backup Date: Tue, 7 Jul 2026 16:08:41 +0000 Subject: [PATCH] =?UTF-8?q?[orbis]=20Weekly=20backup=202026-07-07=20?= =?UTF-8?q?=E2=80=94=20=208=20files=20changed,=2017=20insertions(+),=20160?= =?UTF-8?q?=20deletions(-)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backup.sh | 17 ++++ backup.sh.bak-2026-07-07 | 160 ------------------------------ databases/epic_epic_db.sql.gz | Bin 4375 -> 4375 bytes databases/epic_parkersling.sql.gz | Bin 6408 -> 6408 bytes databases/park_slingshot.sql.gz | Bin 6699 -> 6698 bytes databases/toms_tjj_db.sql.gz | Bin 11612 -> 11614 bytes databases/tomt_ttg_db.sql.gz | Bin 16791 -> 16791 bytes databases/workt_track_db.sql.gz | Bin 1601 -> 1601 bytes 8 files changed, 17 insertions(+), 160 deletions(-) delete mode 100644 backup.sh.bak-2026-07-07 diff --git a/backup.sh b/backup.sh index 0d5f337..3f36d2c 100755 --- a/backup.sh +++ b/backup.sh @@ -194,3 +194,20 @@ else git push origin main log "Backup complete" fi + +# --------------------------------------------------------------------------- +# 13. Zip snapshot for direct download — added 2026-07-07. Requested so the +# full backup (sites + database dumps + configs) can be downloaded +# straight from JARVIS's admin panel (Blair HQ), not just pulled via git. +# Regenerated unconditionally every run (even if nothing changed) so its +# own file timestamp always reflects when the backup last actually ran. +# Lives outside the git repo dir so it's never accidentally committed. +# --------------------------------------------------------------------------- +log "Creating downloadable zip snapshot" +ZIP_TMP="/opt/do-server-backup.zip.tmp" +ZIP_FINAL="/opt/do-server-backup.zip" +rm -f "$ZIP_TMP" +(cd "$REPO_DIR" && zip -rq "$ZIP_TMP" . -x '.git/*') +mv "$ZIP_TMP" "$ZIP_FINAL" +ZIPSIZE=$(du -sh "$ZIP_FINAL" | cut -f1) +log "Zip snapshot ready: $ZIP_FINAL ($ZIPSIZE)" diff --git a/backup.sh.bak-2026-07-07 b/backup.sh.bak-2026-07-07 deleted file mode 100644 index 26ef8f8..0000000 --- a/backup.sh.bak-2026-07-07 +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash -# ============================================================================= -# DO Server Config Backup — runs on orbis (165.22.1.228) -# Backs up all critical configs/scripts to GitHub weekly -# Install: /usr/local/bin/do-server-backup -# Cron: 0 4 * * 0 /usr/local/bin/do-server-backup >> /var/log/do-server-backup.log 2>&1 -# ============================================================================= -set -euo pipefail - -PAT="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" -REPO_URL="https://${PAT}@github.com/myronblair/do-server-config.git" -REPO_DIR="/opt/do-server-config" -LOG_PREFIX="[$(date '+%Y-%m-%d %H:%M:%S')] [orbis]" - -log() { echo "$LOG_PREFIX $*"; } - -# --------------------------------------------------------------------------- -# 1. Clone or update repo -# --------------------------------------------------------------------------- -if [[ -d "$REPO_DIR/.git" ]]; then - log "Pulling latest from GitHub" - cd "$REPO_DIR" - git config user.email "backup@orbishosting.com" - git config user.name "DO Server Backup" - git pull --rebase origin main -q || true -else - log "Cloning repo to $REPO_DIR" - git clone "$REPO_URL" "$REPO_DIR" - cd "$REPO_DIR" - git config user.email "backup@orbishosting.com" - git config user.name "DO Server Backup" -fi - -cd "$REPO_DIR" -mkdir -p scripts systemd wireguard network cron ssh ols-vhosts mysql infra - -# --------------------------------------------------------------------------- -# 2. Custom scripts from /usr/local/bin (text only — skip large binaries) -# --------------------------------------------------------------------------- -log "Backing up custom scripts" -for f in /usr/local/bin/jarvis-*.sh \ - /usr/local/bin/jarvis-*.py \ - /usr/local/bin/ttg-backup.sh \ - /usr/local/bin/do-server-backup; do - [[ -f "$f" ]] || continue - size=$(stat -c%s "$f" 2>/dev/null || echo 0) - [[ $size -lt 524288 ]] && cp "$f" scripts/ || log " SKIP (too large): $f" -done -# composer is a stock PHP tool — skip it - -# --------------------------------------------------------------------------- -# 3. Custom systemd service units (skip stock DO/system units) -# --------------------------------------------------------------------------- -log "Backing up custom systemd units" -CUSTOM_UNITS="jarvis-agent.service fastapi_ssh_server.service" -for unit in $CUSTOM_UNITS; do - src="/etc/systemd/system/$unit" - [[ -f "$src" ]] && cp "$src" systemd/ || true -done - -# --------------------------------------------------------------------------- -# 4. WireGuard configs (includes private keys — repo is private) -# --------------------------------------------------------------------------- -log "Backing up WireGuard configs" -for f in /etc/wireguard/*.conf; do - [[ -f "$f" ]] && cp "$f" wireguard/ || true -done - -# --------------------------------------------------------------------------- -# 5. Network / netplan -# --------------------------------------------------------------------------- -log "Backing up netplan" -for f in /etc/netplan/*.yaml; do - [[ -f "$f" ]] && cp "$f" network/ || true -done -cp /etc/hosts network/hosts 2>/dev/null || true -cp /etc/hostname network/hostname 2>/dev/null || true - -# --------------------------------------------------------------------------- -# 6. Root crontab — custom entries only (strip CyberPanel boilerplate) -# --------------------------------------------------------------------------- -log "Backing up crontab" -crontab -l 2>/dev/null | grep -v "^#\|CyberCP\|acme.sh\|cleansessions\|run_scheduled_scans\|pdnsHealthCheck\|findBWUsage\|postfixSenderPolicy\|upgradeCritical\|renew\.py\|IncScheduler\|e2scrub\|imunify\|sessionclean\|lsws\b" \ - | sed '/^[[:space:]]*$/d' > cron/root_custom -# Also keep the full crontab for reference -crontab -l 2>/dev/null > cron/root_full || echo "# no crontab" > cron/root_full - -# --------------------------------------------------------------------------- -# 7. SSH authorized_keys -# --------------------------------------------------------------------------- -log "Backing up SSH keys" -[[ -f /root/.ssh/authorized_keys ]] && cp /root/.ssh/authorized_keys ssh/ || true -[[ -f /root/.ssh/id_rsa.pub ]] && cp /root/.ssh/id_rsa.pub ssh/ || true - -# --------------------------------------------------------------------------- -# 8. OpenLiteSpeed vhost configs (CyberPanel-managed) -# --------------------------------------------------------------------------- -log "Backing up OLS vhost configs" -for vdir in /usr/local/lsws/conf/vhosts/*/; do - vname=$(basename "$vdir") - [[ "$vname" == "Example" ]] && continue - mkdir -p "ols-vhosts/$vname" - for conf in "$vdir"*.conf; do - [[ -f "$conf" ]] && cp "$conf" "ols-vhosts/$vname/" || true - done -done -# OLS main listener/vhost mapping -grep -E "^\s*(listener|virtualHost|address |map |vhRoot|vhDomain|configFile)" \ - /usr/local/lsws/conf/httpd_config.conf 2>/dev/null > ols-vhosts/httpd_vhosts_summary.txt || true - -# --------------------------------------------------------------------------- -# 9. MySQL root credentials file -# --------------------------------------------------------------------------- -log "Backing up MySQL credentials" -[[ -f /root/.my.cnf ]] && cp /root/.my.cnf mysql/my.cnf || true -# Document all databases -mysql -e "SHOW DATABASES;" 2>/dev/null | grep -v "^Database\|information_schema\|performance_schema\|sys" > mysql/databases.txt || true - -# --------------------------------------------------------------------------- -# 10. /opt/infra snapshot (already a separate git repo — copy contents) -# --------------------------------------------------------------------------- -log "Backing up /opt/infra snapshot" -if [[ -d /opt/infra ]]; then - rsync -a --exclude='.git' /opt/infra/ infra/ -fi - -# SMTP config docs -if [[ -d /opt/smtp-for-websites ]]; then - mkdir -p smtp-docs - rsync -a --exclude='.git' /opt/smtp-for-websites/ smtp-docs/ -fi - -# --------------------------------------------------------------------------- -# 11. CyberPanel website list (for documentation) -# --------------------------------------------------------------------------- -log "Documenting website list" -{ - echo "# Websites on DO server — $(date '+%Y-%m-%d')" - echo "" - for d in /home/*/public_html; do - site=$(echo "$d" | sed 's|/home/||;s|/public_html||') - diskuse=$(du -sh "$d" 2>/dev/null | cut -f1) - echo "- $site ($diskuse)" - done -} > ols-vhosts/site-list.txt - -# --------------------------------------------------------------------------- -# 12. Commit and push -# --------------------------------------------------------------------------- -log "Committing changes" -git add -A -if git diff --cached --quiet; then - log "No changes to commit" -else - CHANGES=$(git diff --cached --stat | tail -1) - git commit -m "[orbis] Weekly backup $(date '+%Y-%m-%d') — $CHANGES" - log "Pushing to GitHub" - git push origin main - log "Backup complete" -fi diff --git a/databases/epic_epic_db.sql.gz b/databases/epic_epic_db.sql.gz index 0576ae24c5c08a29f5dce5f8796420585a6b6a90..ec3b89e25e7da11351f0fc75a55c8b813564a0b1 100644 GIT binary patch delta 25 hcmbQPG+k)}o1oygnXl%}d^Pz$>r^$aDPEQg3;>b%3RnOD delta 25 hcmbQPG+k)}o1oyenNR10tCuAM0|1892=o8| diff --git a/databases/epic_parkersling.sql.gz b/databases/epic_parkersling.sql.gz index fe3b41eea7d81efee2821fcc028c9eb02449eb87..af994b4da34df379fe24b06a6ae84cb2c2632d90 100644 GIT binary patch delta 25 hcmeA$>M+{yT|&@7$;bB5hvolSS6A$kdFjKz0057V3flkx delta 25 gcmeA$>M+{yT|&^wM(B#NU)`^Gn~I&iFMSvo0EEs8AOHXW diff --git a/databases/park_slingshot.sql.gz b/databases/park_slingshot.sql.gz index 37092e9e1cbea97a5d71b5ee9497f3a1ab4abbd8..13b17ba22713bdfd18f04590c117e065d9b63f37 100644 GIT binary patch delta 26 icmZ2&vdUzGgp^Q`ealOAnSW2~8C^;ryp;E6U;qG+jS6M} delta 27 jcmZ2wvf5;Wgp{yCONG)4^*O(u)-zr%eOw{$&%gixoiqy! diff --git a/databases/toms_tjj_db.sql.gz b/databases/toms_tjj_db.sql.gz index aabda19d1c18476db38ff8df47539bd6cde4d0a9..349181ee76d69603847b358df8bd3ec92b331236 100644 GIT binary patch delta 5920 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 CsEY~! delta 5918 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 AB>(^b diff --git a/databases/tomt_ttg_db.sql.gz b/databases/tomt_ttg_db.sql.gz index 11adc40e24852dc60f327a4462a0e613f58f5674..fdb9dd3ac04108e9ade322ec2e47c7d8e607ba62 100644 GIT binary patch delta 569 zcmV-90>=H9g8`R=0kCX8e;7pMO*f{kRzOIV$_s;zs9h?GsL-$PO^6~ZyWQE*8OaUz z$_XLoM8hTBgkiAF7yRUO^I#pvl|EGmMx@cHWEB8wOOkc=*gkgj984Q`5LPw01k(mE zi|sK=^OUbT7GPZYS9`xs#%()~f1D>jmm}hl<#F(lo#)XsNmXP0f1Wzd)6R0UbYi0| z8ispD8M`=&Bu(Z|XS>Gj?&2hUTZZ9b0cfH_BTiO-$Aeh^Qdy?p8!PIt6?RH-0}98Z z619(X9hZ1C0IB`{(h5m0u-Wb?L%Xc)p;@!%P0#6K;xvvgy8b#g+(+XS=dRm(m^5c0 zGFE$P&eDzr-%!Rae?Az(AUUj~|HP-Wv`4a1XH}5ErzkC~k$$Jd*MT;UkI`JD8xoMB z#-=43!&7jwdmdI-x{dZn>me|ctuq~FV|sY~pmdXan|C^I$mZku`HeIDO{nX3^$Pkk z28G{PiJ;rvS(|+7Qecn?QWZ>^U!?dGL-oI@)C-{`Fz9Z!f6HPy6l0e;XkCdVkOtk6 zf)1E}XC8vT6wY5S1B3XU1svJ6Mt%QUEC{PYb<`gDhSe8)UP?FrY{M1C_7lIU`Eb-e zej@mp79RKZd*6cID{d9jy(DJL-NVpyK9qbs8Zc((j&(I(`8$My9H4apL{&`$t`!EB z>0`?@31*ujFF;MrjeoOjR}jX8mJQ2`7tO%WuXLRPNiel4`j-Z8K0w1rCx80{kuBUb HBaQ+9d$JTv delta 569 zcmV-90>=H9g8`R=0kCX8e-K3EO*f{kRzOIV$_s;zC|wGQpwO>x5~9e;Zg+NcMsmZw zazfyoXmZKIAn@aI%}&ms^mj?p=u>TAcp9BXRsmw|3Zh0I+eeR{f$70MfQl;CV0r}1 zI?ki4%-F1B4#p9G^$xpq*0ajw$9ev9Ges`i9=C=8E+ zlo8N0SmRL%NcH!ZT1k42&2pv%*cUw)ETy5lIA`m*-N|1x?RBO*kNPPo9cTD3mzDw0 zw+C!2v%X2bp^jU9e^7*edfY|-iBF?xk3_l6Dg%yBmb*|zqkfIAPue)iqZLm##34nU zuq*15lYg>?E>yOf1rE9S;2UXdFDAtdA74K(4of$D$E%KLJf5H57{lL$x^6eGpg&`f z*}_Udy4{^sVnde-gNT44LnM8X;*Z~||4pS{2qh&q-7wx%f778TyR3-T6=(u!qB}C8 z16JRu2j?%D@z={(N1kgEjvScNk#{Xtgw>!rY)w7g9PvFbrJH}Y$rVQT