mirror of
https://github.com/myronblair/do-server-config
synced 2026-06-30 17:50:59 -05:00
Initial: backup/restore scripts + README for DO server
- backup.sh: weekly cron collecting scripts, systemd, WG, OLS vhosts, cron, mysql creds - restore.sh: 8-phase interactive disaster recovery wizard - README.md: full rebuild guide, credentials, architecture notes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
*.log
|
||||
*.tmp
|
||||
__pycache__/
|
||||
*.pyc
|
||||
@@ -0,0 +1,172 @@
|
||||
# DO Server Config Backup & Restore
|
||||
|
||||
Weekly backup of the DigitalOcean production server (`orbis`, 165.22.1.228).
|
||||
CyberPanel/OpenLiteSpeed, Ubuntu 24.04, 48GB disk.
|
||||
|
||||
---
|
||||
|
||||
## What's Backed Up
|
||||
|
||||
| Directory | Source | Contents |
|
||||
|-----------|--------|----------|
|
||||
| `scripts/` | `/usr/local/bin/` | jarvis-deploy, jarvis-watchdog, jarvis-backup, jarvis-agent, ttg-backup |
|
||||
| `systemd/` | `/etc/systemd/system/` | jarvis-agent.service, fastapi_ssh_server.service |
|
||||
| `wireguard/` | `/etc/wireguard/` | wg0.conf (VPN hub for home network), other WG profiles |
|
||||
| `network/` | `/etc/netplan/` | 50-cloud-init.yaml, hosts, hostname |
|
||||
| `cron/` | `crontab -l` | root_custom (JARVIS lines), root_full (everything) |
|
||||
| `ssh/` | `/root/.ssh/` | authorized_keys, id_rsa.pub (no private keys) |
|
||||
| `ols-vhosts/` | `/usr/local/lsws/conf/vhosts/` | All 8 site OLS vhost configs |
|
||||
| `mysql/` | `/root/.my.cnf` | MySQL root credentials, database list |
|
||||
| `infra/` | `/opt/infra/` | DO infra repo snapshot |
|
||||
| `smtp-docs/` | `/opt/smtp-for-websites/` | CyberMail SMTP config docs |
|
||||
|
||||
**Backup schedule:** Every Sunday at 4:00 AM
|
||||
**Log:** `/var/log/do-server-backup.log`
|
||||
**Manual trigger:** `/usr/local/bin/do-server-backup`
|
||||
|
||||
---
|
||||
|
||||
## Sites on This Server
|
||||
|
||||
| Domain | GitHub Repo | DB |
|
||||
|--------|-------------|-----|
|
||||
| jarvis.orbishosting.com | myronblair/jarvis | jarvis_db |
|
||||
| tomsjavajive.com | myronblair/tomsjavajive | toms_tjj_db |
|
||||
| epictravelexpeditions.com | myronblair/epictravelexpeditions | epic_epic_db |
|
||||
| parkerslingshot.epictravelexpeditions.com | myronblair/parkerslingshot | epic_parkersling |
|
||||
| parkerslingshotrentals.com | myronblair/parkerslingshotrentals | parker_db |
|
||||
| orbishosting.com | myronblair/orbishosting | — |
|
||||
| orbis.orbishosting.com | myronblair/orbis-hosting-portal | — |
|
||||
| tomtomgames.com | myronblair/tomtomgames | tomt_ttg_db |
|
||||
|
||||
GitHub PAT: `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` (expires ~2026-08-20)
|
||||
|
||||
---
|
||||
|
||||
## What Is NOT Backed Up Here
|
||||
|
||||
| Item | Location / Notes |
|
||||
|------|-----------------|
|
||||
| Website files | All in GitHub repos — `git pull` on restore |
|
||||
| Databases | Backed up daily by `jarvis-backup.sh` → `/var/backups/jarvis/` |
|
||||
| SSL certs | `/etc/letsencrypt/` — re-issue via CyberPanel after restore |
|
||||
| Gitignored configs | `api/config.php` files — must recreate manually (see DB creds below) |
|
||||
| SSH private key | `/root/.ssh/id_rsa` — regenerate or restore from secure storage |
|
||||
| CyberPanel itself | Reinstall via `sh <(curl https://cyberpanel.net/install.sh)` |
|
||||
| composer binary | Reinstall: `curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin` |
|
||||
|
||||
---
|
||||
|
||||
## Disaster Recovery — Full Server Rebuild
|
||||
|
||||
**Estimated time: 60–90 minutes**
|
||||
|
||||
### Step 1 — Create new DigitalOcean Droplet
|
||||
|
||||
- Region: Same as original (NYC3 / SFO3 — check DO console)
|
||||
- Image: Ubuntu 24.04 LTS
|
||||
- Size: At minimum 4GB RAM, 80GB disk (original was 4vCPU/8GB/160GB)
|
||||
- Add SSH key from your local machine
|
||||
|
||||
### Step 2 — Clone this repo
|
||||
|
||||
```bash
|
||||
apt update && apt install -y git
|
||||
git clone https://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@github.com/myronblair/do-server-config.git /opt/do-server-config
|
||||
bash /opt/do-server-config/restore.sh
|
||||
```
|
||||
|
||||
The restore script is interactive — it walks you through each phase and asks before applying each section.
|
||||
|
||||
### Step 3 — DNS Update (if IP changed)
|
||||
|
||||
If the new droplet has a different IP, update DNS before or immediately after:
|
||||
- Cloudflare → DNS → Update A records for all domains
|
||||
- Also update GitHub webhook URLs if they use IP directly (they don't — they use jarvis.orbishosting.com which is behind Cloudflare)
|
||||
|
||||
### Step 4 — Database Restore
|
||||
|
||||
Databases are in daily backups at `/var/backups/jarvis/`. If restoring to a new server:
|
||||
|
||||
```bash
|
||||
# Copy the latest backup from old server (if still accessible)
|
||||
scp root@165.22.1.228:/var/backups/jarvis/jarvis_backup_YYYY-MM-DD_*.tar.gz /tmp/
|
||||
|
||||
# Extract and restore
|
||||
cd /tmp && tar -xzf jarvis_backup_*.tar.gz
|
||||
# Then for each database:
|
||||
mysql -u root -p jarvis_db < sql/jarvis_db.sql
|
||||
mysql -u root -p toms_tjj_db < sql/toms_tjj_db.sql
|
||||
mysql -u root -p tomt_ttg_db < sql/tomt_ttg_db.sql
|
||||
mysql -u root -p epic_epic_db < sql/epic_epic_db.sql
|
||||
mysql -u root -p epic_parkersling < sql/epic_parkersling.sql
|
||||
mysql -u root -p parker_db < sql/parker_db.sql
|
||||
```
|
||||
|
||||
You'll need to create the DB users first:
|
||||
```sql
|
||||
CREATE USER 'jarvis_user'@'localhost' IDENTIFIED BY 'J4rv1s_Pr0t0c0l_2026!';
|
||||
GRANT ALL ON jarvis_db.* TO 'jarvis_user'@'localhost';
|
||||
-- repeat for each DB user
|
||||
```
|
||||
|
||||
### Step 5 — Recreate Gitignored Configs
|
||||
|
||||
After pulling website code, create these manually:
|
||||
|
||||
**`/home/jarvis.orbishosting.com/api/config.php`** — Contains all JARVIS credentials (Groq API key, Ollama URL, GitHub PAT, JARVIS DB credentials, ElevenLabs key, etc.)
|
||||
|
||||
**`/home/tomsjavajive.com/config/database.php`** — TJJ DB credentials
|
||||
|
||||
**`/home/epictravelexpeditions.com/api/config.php`** — Epic/Parker credentials
|
||||
|
||||
Reference: `api/config.php.example` or `config/database.php.example` in each repo.
|
||||
|
||||
---
|
||||
|
||||
## Key Credentials Quick Reference
|
||||
|
||||
| Service | User | Password |
|
||||
|---------|------|----------|
|
||||
| Root SSH | root | Gonewalk1974!@# |
|
||||
| CyberPanel admin | admin | (set during reinstall) |
|
||||
| MySQL root | root | Z9Of4NVs6ji74x (see mysql/my.cnf) |
|
||||
| jarvis_db | jarvis_user | J4rv1s_Pr0t0c0l_2026! |
|
||||
| toms_tjj_db | toms_tjj_user | +60wlPc+55e@gFq4 |
|
||||
| tomt_ttg_db | tomt_ttg_user | q#q+mrOcozsa7I6J |
|
||||
| epic_parkersling | epic_parkersling | Joker1974!!! |
|
||||
|
||||
---
|
||||
|
||||
## WireGuard VPN (wg0)
|
||||
|
||||
The DO server is the VPN hub for the home network tunnel:
|
||||
- `wg0` on DO: `10.201.0.1/24`, ListenPort 51820
|
||||
- Peer: Alpine LXC CT110 on home network → `10.201.0.2/32`
|
||||
- Traffic flows: CT110 → DO for MediaStack VPN exit
|
||||
|
||||
Config is in `wireguard/wg0.conf`. Keys are included (this is a private repo).
|
||||
|
||||
---
|
||||
|
||||
## Architecture Notes
|
||||
|
||||
- **CyberPanel/OLS** manages PHP-FPM, virtual hosts, SSL, DNS (PowerDNS), mail (Postfix)
|
||||
- **Cloudflare** is in front of all public sites — DNS proxy mode, Rocket Loader ON (breaks inline JS — `Cache-Control: no-transform` header is the fix)
|
||||
- **JARVIS webhooks** at `/home/jarvis.orbishosting.com/public_html/webhook.php` handle auto-deploys for all 8+ GitHub repos
|
||||
- **Deploy queue** `/tmp/jarvis-deploy-queue.txt` processed by `jarvis-deploy.sh` every minute
|
||||
- **Watchdog** `jarvis-watchdog.sh` runs every 5 min — restarts lsws/mysql/redis if down, inserts alerts to DB
|
||||
- **Daily DB backup** `jarvis-backup.sh` runs at 2am → `/var/backups/jarvis/` (7-day retention)
|
||||
- **JARVIS agent** registers this server with JARVIS monitoring dashboard
|
||||
|
||||
---
|
||||
|
||||
## After Restore — Verify Services
|
||||
|
||||
```bash
|
||||
systemctl status lsws mysql redis jarvis-agent
|
||||
crontab -l
|
||||
wg show
|
||||
curl -sk https://jarvis.orbishosting.com/api.php?action=ping
|
||||
tail -f /home/jarvis.orbishosting.com/logs/watchdog.log
|
||||
```
|
||||
@@ -0,0 +1,160 @@
|
||||
#!/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
|
||||
+354
@@ -0,0 +1,354 @@
|
||||
#!/usr/bin/env bash
|
||||
# =============================================================================
|
||||
# DO Server Restore — run on a fresh DigitalOcean Ubuntu 24.04 droplet
|
||||
#
|
||||
# Usage:
|
||||
# bash restore.sh
|
||||
#
|
||||
# Prerequisites:
|
||||
# - Fresh Ubuntu 24.04 droplet at 165.22.1.228
|
||||
# - Root SSH access
|
||||
# - Run this script BEFORE installing CyberPanel (network/SSH steps)
|
||||
# OR after CyberPanel install (full restore)
|
||||
# =============================================================================
|
||||
|
||||
REPO_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
RED='\033[0;31m'; YELLOW='\033[1;33m'; GREEN='\033[0;32m'; CYAN='\033[0;36m'; BOLD='\033[1m'; NC='\033[0m'
|
||||
|
||||
header() { echo -e "\n${CYAN}══════════════════════════════════════════════════${NC}"; echo -e "${CYAN}${BOLD} $*${NC}"; echo -e "${CYAN}══════════════════════════════════════════════════${NC}"; }
|
||||
success() { echo -e "${GREEN} ✓ $*${NC}"; }
|
||||
warn() { echo -e "${YELLOW} ⚠ $*${NC}"; }
|
||||
info() { echo -e " → $*"; }
|
||||
step() { echo -e "\n${BOLD} $*${NC}"; }
|
||||
die() { echo -e "${RED} ✗ $*${NC}" >&2; exit 1; }
|
||||
|
||||
confirm() {
|
||||
echo -e "\n${YELLOW} $1${NC}"
|
||||
read -rp " Apply? [Y/n] " ans
|
||||
[[ "${ans:-Y}" =~ ^[Yy]$ ]]
|
||||
}
|
||||
|
||||
[[ $(id -u) -eq 0 ]] || die "Must run as root"
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Welcome
|
||||
# ---------------------------------------------------------------------------
|
||||
clear
|
||||
echo -e "${CYAN}"
|
||||
cat << 'BANNER'
|
||||
╔══════════════════════════════════════════════════════╗
|
||||
║ DO SERVER RESTORE — orbis.orbishosting.com ║
|
||||
║ 165.22.1.228 | Ubuntu 24.04 | CyberPanel ║
|
||||
╚══════════════════════════════════════════════════════╝
|
||||
BANNER
|
||||
echo -e "${NC}"
|
||||
echo " Source : $REPO_DIR"
|
||||
echo " Date : $(date)"
|
||||
echo ""
|
||||
warn "This script restores a fresh Ubuntu 24.04 droplet to full production."
|
||||
warn "It is interactive — confirm each step as you go."
|
||||
echo ""
|
||||
read -rp " Type 'yes' to continue: " confirm_start
|
||||
[[ "$confirm_start" == "yes" ]] || { echo "Aborted."; exit 0; }
|
||||
|
||||
APPLIED=(); SKIPPED=()
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# PHASE 1: SSH & NETWORK
|
||||
# ---------------------------------------------------------------------------
|
||||
header "PHASE 1 — SSH & Network"
|
||||
|
||||
step "1.1 SSH authorized_keys"
|
||||
if [[ -f "$REPO_DIR/ssh/authorized_keys" ]]; then
|
||||
if confirm "Restore SSH authorized_keys?"; then
|
||||
mkdir -p /root/.ssh && chmod 700 /root/.ssh
|
||||
cp "$REPO_DIR/ssh/authorized_keys" /root/.ssh/authorized_keys
|
||||
chmod 600 /root/.ssh/authorized_keys
|
||||
success "authorized_keys restored"
|
||||
APPLIED+=("ssh")
|
||||
else; SKIPPED+=("ssh"); fi
|
||||
fi
|
||||
|
||||
step "1.2 Hostname"
|
||||
if confirm "Set hostname to 'orbis'?"; then
|
||||
hostnamectl set-hostname orbis
|
||||
success "Hostname set"
|
||||
APPLIED+=("hostname")
|
||||
else; SKIPPED+=("hostname"); fi
|
||||
|
||||
step "1.3 WireGuard VPN"
|
||||
if [[ -d "$REPO_DIR/wireguard" ]] && confirm "Restore WireGuard configs and enable wg0?"; then
|
||||
apt install -y wireguard -q 2>/dev/null
|
||||
cp "$REPO_DIR/wireguard/"*.conf /etc/wireguard/ 2>/dev/null || true
|
||||
chmod 600 /etc/wireguard/*.conf
|
||||
systemctl enable wg-quick@wg0
|
||||
systemctl start wg-quick@wg0 2>/dev/null || warn "wg0 start failed — check /etc/wireguard/wg0.conf peers"
|
||||
success "WireGuard configs restored"
|
||||
APPLIED+=("wireguard")
|
||||
else; SKIPPED+=("wireguard"); fi
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# PHASE 2: CyberPanel (manual step — cannot automate)
|
||||
# ---------------------------------------------------------------------------
|
||||
header "PHASE 2 — CyberPanel Install"
|
||||
|
||||
echo ""
|
||||
warn "CyberPanel must be installed manually before continuing with web setup."
|
||||
warn "Run these commands in a separate terminal, then come back here."
|
||||
echo ""
|
||||
info "Install CyberPanel (OpenLiteSpeed, PHP, MySQL, Postfix, PowerDNS):"
|
||||
echo ""
|
||||
echo -e " ${BOLD}sh <(curl https://cyberpanel.net/install.sh)${NC}"
|
||||
echo ""
|
||||
info "During install, choose:"
|
||||
info " • OpenLiteSpeed (not LiteSpeed Enterprise)"
|
||||
info " • Install Full service (PowerDNS, Postfix, Pure-FTPd)"
|
||||
info " • Set admin password when prompted"
|
||||
info " • PHP versions to install: 8.1, 8.2, 8.3, 8.4, 8.5"
|
||||
echo ""
|
||||
read -rp " Press ENTER once CyberPanel is fully installed... "
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# PHASE 3: MySQL
|
||||
# ---------------------------------------------------------------------------
|
||||
header "PHASE 3 — MySQL Credentials"
|
||||
|
||||
step "3.1 MySQL root credentials"
|
||||
if [[ -f "$REPO_DIR/mysql/my.cnf" ]]; then
|
||||
if confirm "Restore /root/.my.cnf (MySQL root credentials)?"; then
|
||||
cp "$REPO_DIR/mysql/my.cnf" /root/.my.cnf
|
||||
chmod 600 /root/.my.cnf
|
||||
success "MySQL credentials restored"
|
||||
APPLIED+=("mysql-creds")
|
||||
else; SKIPPED+=("mysql-creds"); fi
|
||||
fi
|
||||
|
||||
step "3.2 Restore databases"
|
||||
info "Databases to restore: $(cat $REPO_DIR/mysql/databases.txt 2>/dev/null | tr '\n' ' ')"
|
||||
echo ""
|
||||
warn "Databases are restored from the JARVIS daily backup (not this repo)."
|
||||
info "Latest backup is at: /var/backups/jarvis/ (if migrating from old server)"
|
||||
info " OR download from the old server:"
|
||||
info " scp root@165.22.1.228:/var/backups/jarvis/jarvis_backup_latest.tar.gz /tmp/"
|
||||
echo ""
|
||||
info "To restore manually after getting the backup file:"
|
||||
info " tar -xzf jarvis_backup_*.tar.gz"
|
||||
info " mysql -u root -p jarvis_db < sql/jarvis_db.sql"
|
||||
info " mysql -u root -p toms_tjj_db < sql/toms_tjj_db.sql"
|
||||
info " # (repeat for each database in sql/)"
|
||||
echo ""
|
||||
info "DB users/passwords are in each site's gitignored config file:"
|
||||
info " jarvis_db → jarvis_user / J4rv1s_Pr0t0c0l_2026!"
|
||||
info " toms_tjj_db → toms_tjj_user / +60wlPc+55e@gFq4"
|
||||
info " tomt_ttg_db → tomt_ttg_user / q#q+mrOcozsa7I6J"
|
||||
info " epic_epic_db → epic_epic_user / (see epictravelexpeditions api/config.php)"
|
||||
info " epic_parkersling → epic_parkersling / Joker1974!!!"
|
||||
info " parker_db → parker_user / (see parkerslingshotrentals db config)"
|
||||
read -rp " Press ENTER to continue... "
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# PHASE 4: Websites
|
||||
# ---------------------------------------------------------------------------
|
||||
header "PHASE 4 — Websites (GitHub → server)"
|
||||
|
||||
step "4.1 Create websites in CyberPanel"
|
||||
warn "Each site must be created in CyberPanel before pulling code."
|
||||
echo ""
|
||||
info "Go to CyberPanel → Websites → Create Website for each:"
|
||||
echo ""
|
||||
printf " %-45s %s\n" "Domain" "PHP"
|
||||
printf " %-45s %s\n" "------" "---"
|
||||
printf " %-45s %s\n" "jarvis.orbishosting.com" "8.5"
|
||||
printf " %-45s %s\n" "tomsjavajive.com" "8.5"
|
||||
printf " %-45s %s\n" "epictravelexpeditions.com" "8.5"
|
||||
printf " %-45s %s\n" "parkerslingshotrentals.com" "8.5"
|
||||
printf " %-45s %s\n" "orbishosting.com" "8.5"
|
||||
printf " %-45s %s\n" "orbis.orbishosting.com" "8.5"
|
||||
printf " %-45s %s\n" "tomtomgames.com" "8.5"
|
||||
echo ""
|
||||
read -rp " Press ENTER once all sites are created in CyberPanel... "
|
||||
|
||||
step "4.2 Pull website code from GitHub"
|
||||
PAT="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"
|
||||
declare -A SITE_REPOS=(
|
||||
["jarvis.orbishosting.com"]="jarvis"
|
||||
["tomsjavajive.com"]="tomsjavajive"
|
||||
["epictravelexpeditions.com"]="epictravelexpeditions"
|
||||
["parkerslingshotrentals.com"]="parkerslingshotrentals"
|
||||
["orbishosting.com"]="orbishosting"
|
||||
["orbis.orbishosting.com"]="orbis-hosting-portal"
|
||||
["tomtomgames.com"]="tomtomgames"
|
||||
)
|
||||
|
||||
if confirm "Pull all site repos from GitHub into /home/*/public_html/?"; then
|
||||
for domain in "${!SITE_REPOS[@]}"; do
|
||||
repo="${SITE_REPOS[$domain]}"
|
||||
target="/home/$domain/public_html"
|
||||
if [[ -d "$target" ]]; then
|
||||
info "Cloning $repo → $target"
|
||||
# Preserve existing CyberPanel-created files, then overlay git
|
||||
tmpdir=$(mktemp -d)
|
||||
git clone "https://${PAT}@github.com/myronblair/$repo.git" "$tmpdir" -q 2>&1
|
||||
rsync -a --exclude='.git' "$tmpdir/" "$target/"
|
||||
rm -rf "$tmpdir"
|
||||
success "$domain pulled"
|
||||
else
|
||||
warn " $target doesn't exist — create the site in CyberPanel first"
|
||||
fi
|
||||
done
|
||||
# Parker Slingshot subfolder
|
||||
if [[ -d /home/epictravelexpeditions.com ]]; then
|
||||
info "Cloning parkerslingshot subfolder"
|
||||
git clone "https://${PAT}@github.com/myronblair/parkerslingshot.git" \
|
||||
/home/epictravelexpeditions.com/parkerslingshot -q 2>&1 && \
|
||||
success "parkerslingshot cloned" || warn "parkerslingshot clone failed"
|
||||
fi
|
||||
APPLIED+=("websites")
|
||||
else; SKIPPED+=("websites"); fi
|
||||
|
||||
step "4.3 Restore gitignored config files"
|
||||
warn "These files contain credentials and are NOT in GitHub."
|
||||
warn "They must be manually recreated or copied from backup."
|
||||
echo ""
|
||||
info "Required config files:"
|
||||
info " /home/jarvis.orbishosting.com/api/config.php (all JARVIS credentials)"
|
||||
info " /home/tomsjavajive.com/config/database.php (TJJ database)"
|
||||
info " /home/epictravelexpeditions.com/api/config.php"
|
||||
info " /home/parkerslingshotrentals.com/admin/config.php (if separate)"
|
||||
echo ""
|
||||
info "Reference templates are in each repo's api/config.php.example or similar."
|
||||
info "DB creds are documented above in step 3.2."
|
||||
read -rp " Press ENTER once config files are restored... "
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# PHASE 5: Custom Scripts & Services
|
||||
# ---------------------------------------------------------------------------
|
||||
header "PHASE 5 — Custom Scripts, Systemd, Cron"
|
||||
|
||||
step "5.1 Custom scripts to /usr/local/bin"
|
||||
if [[ -d "$REPO_DIR/scripts" ]] && confirm "Restore custom scripts?"; then
|
||||
cp "$REPO_DIR/scripts/"* /usr/local/bin/ 2>/dev/null || true
|
||||
chmod +x /usr/local/bin/jarvis-*.sh /usr/local/bin/jarvis-*.py \
|
||||
/usr/local/bin/ttg-backup.sh /usr/local/bin/do-server-backup 2>/dev/null || true
|
||||
success "Scripts restored"
|
||||
APPLIED+=("scripts")
|
||||
else; SKIPPED+=("scripts"); fi
|
||||
|
||||
step "5.2 Systemd service units"
|
||||
if [[ -d "$REPO_DIR/systemd" ]] && confirm "Restore and enable custom systemd units?"; then
|
||||
for unit in "$REPO_DIR/systemd/"*.service; do
|
||||
[[ -f "$unit" ]] || continue
|
||||
bname=$(basename "$unit")
|
||||
cp "$unit" /etc/systemd/system/
|
||||
systemctl enable "$bname" 2>/dev/null || true
|
||||
info " Enabled: $bname"
|
||||
done
|
||||
systemctl daemon-reload
|
||||
success "Systemd units restored and enabled"
|
||||
APPLIED+=("systemd")
|
||||
warn "jarvis-agent will fail until JARVIS DB is running — start it after DB restore"
|
||||
else; SKIPPED+=("systemd"); fi
|
||||
|
||||
step "5.3 Root crontab (custom entries)"
|
||||
if [[ -f "$REPO_DIR/cron/root_custom" ]] && confirm "Restore custom crontab entries?"; then
|
||||
# Merge with existing CyberPanel crontab
|
||||
CURRENT=$(crontab -l 2>/dev/null || true)
|
||||
CUSTOM=$(cat "$REPO_DIR/cron/root_custom")
|
||||
# Deduplicate
|
||||
{ echo "$CURRENT"; echo ""; echo "# --- Restored custom entries ---"; echo "$CUSTOM"; } | \
|
||||
sort -u | crontab -
|
||||
success "Custom crontab entries restored"
|
||||
info "Review with: crontab -l"
|
||||
APPLIED+=("crontab")
|
||||
else; SKIPPED+=("crontab"); fi
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# PHASE 6: OLS Vhost Configs
|
||||
# ---------------------------------------------------------------------------
|
||||
header "PHASE 6 — OpenLiteSpeed Vhost Configs"
|
||||
|
||||
if [[ -d "$REPO_DIR/ols-vhosts" ]]; then
|
||||
step "6.1 Restore OLS vhost config files"
|
||||
warn "CyberPanel manages these files — overwriting may cause conflicts."
|
||||
warn "Only do this if CyberPanel's auto-generated configs are wrong."
|
||||
echo ""
|
||||
info "Vhost configs backed up:"
|
||||
ls "$REPO_DIR/ols-vhosts/" | grep -v "^httpd\|^site-list" | sed 's/^/ /'
|
||||
echo ""
|
||||
if confirm "Restore OLS vhost .conf files to /usr/local/lsws/conf/vhosts/?"; then
|
||||
for vdir in "$REPO_DIR/ols-vhosts/"/*/; do
|
||||
vname=$(basename "$vdir")
|
||||
[[ -d "/usr/local/lsws/conf/vhosts/$vname" ]] || mkdir -p "/usr/local/lsws/conf/vhosts/$vname"
|
||||
cp "$vdir"*.conf "/usr/local/lsws/conf/vhosts/$vname/" 2>/dev/null || true
|
||||
info " Restored: $vname"
|
||||
done
|
||||
systemctl reload lsws 2>/dev/null || systemctl restart lsws 2>/dev/null
|
||||
success "OLS vhost configs restored and OLS reloaded"
|
||||
APPLIED+=("ols-vhosts")
|
||||
else
|
||||
SKIPPED+=("ols-vhosts")
|
||||
info "Skipped — CyberPanel will auto-generate vhost configs when sites are created"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# PHASE 7: SSL / HTTPS
|
||||
# ---------------------------------------------------------------------------
|
||||
header "PHASE 7 — SSL Certificates"
|
||||
|
||||
echo ""
|
||||
info "SSL certs are NOT backed up here (they're in /etc/letsencrypt/)."
|
||||
info "Re-issue via CyberPanel → SSL → Issue SSL for each domain."
|
||||
info " OR run: certbot certonly --webroot -w /home/<domain>/public_html -d <domain>"
|
||||
echo ""
|
||||
info "After SSL is issued, each site's OLS vhost will auto-update."
|
||||
read -rp " Press ENTER to continue... "
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# PHASE 8: JARVIS-Specific
|
||||
# ---------------------------------------------------------------------------
|
||||
header "PHASE 8 — JARVIS Services"
|
||||
|
||||
step "8.1 JARVIS deploy + watchdog scripts"
|
||||
info "jarvis-deploy.sh and jarvis-watchdog.sh are already restored via Step 5.1"
|
||||
info "Verify cron entries are active: crontab -l | grep jarvis"
|
||||
|
||||
step "8.2 JARVIS agent"
|
||||
info "Start JARVIS agent service:"
|
||||
info " systemctl start jarvis-agent"
|
||||
info " journalctl -u jarvis-agent -f"
|
||||
|
||||
step "8.3 Backup script"
|
||||
info "Install this backup script as /usr/local/bin/do-server-backup:"
|
||||
if confirm "Install do-server-backup cron (weekly Sunday 4am)?"; then
|
||||
cp "$REPO_DIR/backup.sh" /usr/local/bin/do-server-backup
|
||||
chmod +x /usr/local/bin/do-server-backup
|
||||
(crontab -l 2>/dev/null | grep -v do-server-backup; \
|
||||
echo "0 4 * * 0 /usr/local/bin/do-server-backup >> /var/log/do-server-backup.log 2>&1") | crontab -
|
||||
success "Backup cron installed"
|
||||
APPLIED+=("backup-cron")
|
||||
else; SKIPPED+=("backup-cron"); fi
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Summary
|
||||
# ---------------------------------------------------------------------------
|
||||
header "Restore Complete"
|
||||
echo ""
|
||||
[[ ${#APPLIED[@]} -gt 0 ]] && success "Applied: ${APPLIED[*]}"
|
||||
[[ ${#SKIPPED[@]} -gt 0 ]] && warn "Skipped: ${SKIPPED[*]}"
|
||||
echo ""
|
||||
echo -e "${YELLOW} Final checklist:${NC}"
|
||||
echo " • Test https://jarvis.orbishosting.com"
|
||||
echo " • Test https://tomsjavajive.com"
|
||||
echo " • Check OLS status: systemctl status lsws"
|
||||
echo " • Check MySQL: systemctl status mysql"
|
||||
echo " • Check JARVIS agent: systemctl status jarvis-agent"
|
||||
echo " • Verify webhook: curl -s https://jarvis.orbishosting.com/webhook.php"
|
||||
echo " • Check WireGuard: wg show"
|
||||
echo " • Confirm crons: crontab -l"
|
||||
echo " • Point GitHub webhooks to new server IP (if IP changed)"
|
||||
echo ""
|
||||
echo " CyberPanel admin: https://165.22.1.228:8090"
|
||||
echo " JARVIS: https://jarvis.orbishosting.com"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user