# Migrasi backup UtiClass ke cPanel baru

Target hosting: home `/home4/utiver9363`, aplikasi
`/home4/utiver9363/public_html/class.utiverse.app`.
Workflow FTP tetap memakai root home akun, `public_html/class.utiverse.app/`
untuk aplikasi, dan `scripts/` untuk skrip backup.

Penyesuaian source belum berarti backup sudah aktif di hosting baru. Urutan
di bawah dijalankan bersama saat migrasi. Tidak perlu mengubah cron antrean
UtiClass yang sudah ada untuk memasang backup.

## 1. Periksa home akun baru

Di Terminal cPanel baru:

```bash
printf 'HOME=%s\n' "$HOME"
ls -ld /home4/utiver9363/public_html/class.utiverse.app/artisan
command -v mysql mysqldump gzip tar flock
```

`HOME` seharusnya `/home4/utiver9363`. Skrip mengikuti nilai ini, termasuk
untuk folder sementara, rclone, dan arsip. Jika HOME berbeda, isi
`BACKUP_HOME="/home4/utiver9363"` di konfigurasi backup.

## 2. Pindahkan komponen di luar public_html

Aktifkan **Show Hidden Files** di File Manager untuk melihat `.config`.

| Komponen lama | Lokasi baru |
| --- | --- |
| `scripts/backup_config.sh` | `/home4/utiver9363/scripts/backup_config.sh` |
| `.config/rclone/rclone.conf` | `/home4/utiver9363/.config/rclone/rclone.conf` |
| `bin/rclone` | `/home4/utiver9363/bin/rclone` |

Unggah versi **baru** `cpanel-scripts/backup_full.sh` dari repository ke
`/home4/utiver9363/scripts/backup_full.sh`. Jangan menimpanya lagi dengan
skrip hosting lama. Unggah juga versi baru `public/telegram_webhook_backup.php`
ke folder `public` aplikasi jika ingin memakai tombol backup Telegram.

Workflow GitHub dapat mengunggah skrip backup dan webhook, tetapi tidak
menyediakan `backup_config.sh` asli, token rclone, program rclone, atau cron.
Konfigurasi asli tetap disimpan di hosting, di luar Git/public_html.

Periksa program rclone yang dipindahkan dapat berjalan di hosting baru:

```bash
chmod 700 /home4/utiver9363/scripts/backup_full.sh /home4/utiver9363/bin/rclone
chmod 600 /home4/utiver9363/scripts/backup_config.sh /home4/utiver9363/.config/rclone/rclone.conf
/home4/utiver9363/bin/rclone version
```

Jika program lama tidak bisa dijalankan, pasang rclone yang sesuai dengan OS
dan arsitektur hosting baru sebelum melanjutkan.

## 3. Sesuaikan konfigurasi private

Edit `/home4/utiver9363/scripts/backup_config.sh` melalui File Manager:

- Isi `DB_BACKUP_USER` dan `DB_BACKUP_PASS` dengan akun database **hosting baru**.
  User harus memiliki akses ke database yang akan dibackup; skrip mendeteksi
  semua database yang bisa diakses user tersebut.
- Pertahankan token bot dan chat ID yang benar untuk notifikasi.
- Gunakan `BACKUP_TIMEZONE="Asia/Makassar"` untuk waktu log dan nama tanggal
  folder backup dalam WITA.
- Pertahankan `BACKUP_RETENTION_COUNT=8` jika ingin menyimpan delapan folder
  tanggal backup terbaru. Beberapa backup di tanggal yang sama memakai folder
  Drive yang sama; ini bukan delapan versi terpisah per hari.
- Default tujuan Drive tetap `gdrive:BACKUP-WEB/Utiverse`, mengikuti backup
  lama. `GDRIVE_BACKUP_ROOT` dapat diisi jika ingin tujuan berbeda.

Target folder dihitung relatif terhadap home akun. Untuk membackup
public_html sekaligus komponen backup di luar public_html:

```bash
BACKUP_TARGETS=(
    "public_html"
    "scripts"
    ".config/rclone"
)
```

Pastikan seluruh target tersebut memang ada. Folder `bin/rclone` dapat
dipasang ulang dan tidak wajib masuk arsip. Source/dependensi yang dikecualikan
skrip dapat dibangun ulang dari Git; arsip bukan salinan penuh akun cPanel.

Uji akses Drive tanpa mengunggah atau menghapus file:

```bash
/home4/utiver9363/bin/rclone listremotes --config=/home4/utiver9363/.config/rclone/rclone.conf
/home4/utiver9363/bin/rclone lsf gdrive:BACKUP-WEB/Utiverse --dirs-only --config=/home4/utiver9363/.config/rclone/rclone.conf
```

Harus tersedia remote `gdrive:`. Jika akses gagal karena token sudah tidak
valid, hubungkan kembali akun Drive sebelum menjalankan backup.

## 4. Jalankan satu backup manual

```bash
mkdir -p /home4/utiver9363/logs
/bin/bash /home4/utiver9363/scripts/backup_full.sh
```

Periksa hasil sebelum memasang cron:

1. Perintah selesai dengan exit status 0 (`echo $?` tepat setelah perintah).
2. Folder tanggal di Drive berisi `db_<nama_database>.sql.gz` dan
   `files_targeted.tar.gz`. Skrip menjalankan `rclone check --one-way` setelah
   upload untuk memeriksa kecocokan file lokal dengan file di Drive.
3. Notifikasi Telegram diterima jika token/chat ID diaktifkan.
4. Unduh contoh arsip, periksa isi SQL serta file unggahan, lalu jadwalkan uji
   restore ke database/folder staging kosong sebelum mengandalkannya untuk
   pemulihan. Jangan menimpa database produksi untuk uji restore.

Satu backup manual yang berhasil juga menjalankan retensi pada tujuan Drive
yang dikonfigurasi. Backup lama yang melebihi batas retensi dapat dihapus.
Jika dump, arsip, upload, atau verifikasi gagal, skrip mengembalikan status
gagal, mempertahankan folder sementara, dan melewati retensi backup lama.
Periksa folder sementara yang tertinggal setelah memperbaiki kegagalan.

## 5. Tambahkan dua cron backup

Cron menggunakan waktu server cPanel. Periksa `date` dan sesuaikan jam
server untuk memperoleh waktu WITA yang diinginkan; `BACKUP_TIMEZONE` di
skrip tidak mengubah timezone penjadwalan cron.

### Backup mingguan

Jadwal lama adalah `0 3 * * 0`: Minggu pukul 03.00 **waktu server**.
Isi kolom Minute `0`, Hour `3`, Day `*`, Month `*`, Weekday `0`, jika jadwal
server ini masih yang diinginkan. Command:

```bash
/bin/bash /home4/utiver9363/scripts/backup_full.sh >> /home4/utiver9363/logs/backup-cron.log 2>&1
```

### Pemicu tombol Telegram

Jadwal `* * * * *` (setiap menit), atau interval minimum yang diizinkan
provider. Command:

```bash
if [ -f /home4/utiver9363/scripts/.trigger_backup ]; then rm -f /home4/utiver9363/scripts/.trigger_backup; /bin/bash /home4/utiver9363/scripts/backup_full.sh >> /home4/utiver9363/logs/backup-cron.log 2>&1; fi
```

Skrip memakai lock bersama agar pemicu Telegram dan jadwal mingguan tidak
menjalankan dua backup bersamaan. Permintaan tambahan saat backup sedang
berjalan dilewati; tidak masuk antrean baru.

Webhook memakai bot yang sudah ada. Jika domain/URL endpoint tetap sama,
pastikan DNS telah menunjuk ke hosting baru dan endpoint HTTPS dapat
dijangkau. Uji tombol setelah backup manual berhasil; periksa file trigger,
log cron, hasil Drive, dan notifikasi.

Cron queue pada screenshot baru menjalankan `queue:work`, bukan
`schedule:run`. Scheduler aplikasi masih perlu diperiksa terpisah untuk
tugas UtiClass lainnya. Cron WhatsApp/API dari screenshot hosting lama
adalah milik layanan lain; jangan menyalinnya sebagai cron backup UtiClass.

Referensi: [cron cPanel](https://docs.cpanel.net/cpanel/advanced/cron-jobs/)
dan [verifikasi rclone check](https://rclone.org/commands/rclone_check/).

## Validasi source lokal

```bash
bash -n cpanel-scripts/backup_full.sh
bash -n cpanel-scripts/backup_config.sh.example
php -l public/telegram_webhook_backup.php
bash tests/Infrastructure/backup-scripts.sh
```

Simulasi memakai MySQL, rclone, dan flock tiruan serta fixture database/file;
tidak menghubungi database produksi, Drive, atau Telegram. Hasil simulasi
tidak menggantikan backup manual dan uji restore di hosting/staging.
