# Backup2 0.1.1

Backup2 je PHP/MySQL systém pro periodické zálohování síťových prvků evidovaných v CDZ.

## Co umí

- synchronizuje `lokality` a `zarizeni` z CDZ podle `sehrano_backup IS NULL`;
- po úspěšném převzetí změny zapíše do CDZ aktuální Unix timestamp;
- `sync:cdz --full` slouží pro první import;
- MikroTik (`druh=1`): SSH + `/export compact`, soubor `.rsc`;
- UBNT (`druh=2`): SSH + načtení `/var/tmp/system.cfg`, soubor `.cfg`;
- CDZ heslo dešifruje starou mapou pouze při SSH připojení;
- interval i noční okno lze nastavit samostatně pro každé `druh2`;
- výchozí okno je 02:00–05:00 a zařízení jsou v něm rozprostřena;
- ruční záloha z webu i CLI;
- dashboard upozorňuje na chybující, nezálohovaná nebo zastaralá zařízení;
- historie záloh, SHA-256 a detekce změny konfigurace.

## Umístění

ZIP je připravený jako čistý obsah aplikace. Rozbal jej přímo do:

```text
/www/backup2
```

Po rozbalení tedy bude například:

```text
/www/backup2/public
/www/backup2/src
/www/backup2/config
/www/backup2/backups
/www/backup2/var
```

Zálohy se standardně ukládají do:

```text
/www/backup2/backups
```

Adresář `backups` obsahuje vlastní `.htaccess` s `Require all denied` jako druhou pojistku proti přímému HTTP přístupu.

## Požadavky

Debian, PHP 8.2+, MariaDB/MySQL, Apache, Composer a PHP rozšíření `pdo_mysql`.

```bash
apt install php php-cli php-mysql php-mbstring php-xml composer unzip
```

## První zprovoznění

Po rozbalení:

```bash
cd /www/backup2
composer install --no-dev --optimize-autoloader
cp config/config.php.example config/config.php
nano config/config.php
```

V `config.php` nastav připojení k databázi Backup2 a k CDZ.

Vytvoř databázi `backup2` a účet pro aplikaci. Účet pro CDZ potřebuje `SELECT` na tabulkách `lokality` a `zarizeni` a `UPDATE(sehrano_backup)` na obou tabulkách.

Nastav práva:

```bash
chown -R root:www-data /www/backup2
chown -R www-data:www-data /www/backup2/backups /www/backup2/var
chmod 770 /www/backup2/backups /www/backup2/var
chmod 640 /www/backup2/config/config.php
```

Pak:

```bash
cd /www/backup2
php bin/backup2 db:migrate
php bin/backup2 doctor
php bin/backup2 sync:cdz --full
```

## Apache

Vzor je v `systemd/apache-backup2.conf.example` a používá:

```text
DocumentRoot /www/backup2/public
```

`AllowOverride All` je zapnuté, takže si můžeš do `/www/backup2/public/.htaccess` dát vlastní HTTP autentizaci.

Po vytvoření vhostu:

```bash
a2ensite backup2.conf
apache2ctl configtest
systemctl reload apache2
```

## systemd

Připravené service/timer soubory už používají `/www/backup2`:

```bash
cp systemd/backup2-cdz-sync.* /etc/systemd/system/
cp systemd/backup2-scheduler.* /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now backup2-cdz-sync.timer backup2-scheduler.timer
```

CDZ synchronizace běží každou minutu. Scheduler se kontroluje každých pět minut, ale zařízení zálohuje jen v termínu a uvnitř nastaveného časového okna.

## CLI

```bash
php bin/backup2 sync:cdz
php bin/backup2 sync:cdz --full
php bin/backup2 backup:run-due --limit=10
php bin/backup2 backup:device 123
php bin/backup2 doctor
```

## Výchozí intervaly

| druh2 | Kategorie | Interval | Okno |
|---:|---|---:|---|
| 1 | router | 1 den | 02:00–05:00 |
| 2 | spoj | 3 dny | 02:00–05:00 |
| 3 | ap | 3 dny | 02:00–05:00 |
| 4 | ups | 7 dní | 02:00–05:00 |
| 6 | switch/rozbočení | 7 dní | 02:00–05:00 |
| 7 | switch | 7 dní | 02:00–05:00 |
| 999999 | jiné | 7 dní | 02:00–05:00 |

Vše lze měnit ve webu na stránce **Plánování**.

## `sehrano_backup`

Normální synchronizace načítá pouze řádky, kde je `sehrano_backup IS NULL`. Po úspěšném převzetí změny Backup2 nastaví aktuální timestamp. Existující hodnoty Backup2 nepřepisuje.

Při `sync:cdz --full` se načtou stávající položky kromě `sehrano_backup = 9`; u položek, které už hodnotu mají, ji Backup2 nemění.
