# EraBackup Horizon Plugin Kurulum Rehberi

EraBackup Horizon Plugin, OpenStack kullanıcılarının backup policy, backup, geçmiş, restore point ve storage işlemlerini doğrudan OpenStack Horizon arayüzünden yönetmesini sağlar. Eklenti, kullanıcının mevcut project-scoped Keystone oturumunu kullanır; kullanıcıdan ayrıca EraBackup kullanıcı adı veya parolası istemez.

## Özellikler

- Horizon içinde `Project > EraBackup` menüsü
- Backup policy listeleme, oluşturma ve düzenleme
- Policy aktif/pasif yapma ve silme
- Full ve incremental backup başlatma
- Backup ilerlemesini görüntüleme
- Backup ve çalışma geçmişini listeleme
- Instance restore pointlerini listeleme
- Local ve RustFS storage kayıtlarını görüntüleme
- Keystone `reader`, `member` ve `admin` rollerine göre yetkilendirme

## Desteklenen ortam

Bu paket aşağıdaki referans ortamda doğrulanmıştır:

| Bileşen | Desteklenen sürüm |
|---|---|
| İşletim sistemi | Ubuntu 24.04 LTS |
| OpenStack Horizon | 25.1.0 |
| Django | 4.2.11 |
| Python | 3.12 |
| Web sunucusu | Apache + mod_wsgi |
| Horizon web yolu | `/horizon/` |

> **Önemli:** Kolla/container, virtualenv, farklı Python sürümü veya özel Horizon dizin yapısı kullanan ortamlarda kurulum yollarının uyarlanması gerekebilir.

## Mimari

```text
OpenStack Kullanıcısı
       │
       ▼
Horizon Oturumu ve Keystone Token
       │
       ▼
EraBackup Horizon Plugin
       │  X-Auth-Token
       ▼
EraBackup Master Skyline API
       │
       ├── Policy ve Scheduler
       ├── Backup ve Restore
       └── Local / RustFS Repository
```

Keystone tokenı browser üzerinden doğrudan EraBackup Master'a gönderilmez. Horizon plugin tokenı sunucu tarafında alır ve yalnızca izin verilen EraBackup API endpointlerine iletir.

## Yetki modeli

| Keystone rolü | Yetkiler |
|---|---|
| `reader` | Policy, backup, history, storage ve restore point görüntüleme |
| `member` | Reader yetkileri + policy yönetimi + full/incremental backup |
| `admin` | Member yetkileri + restore ve storage yönetimi |

Horizon butonları capability listesine göre gösterilir. Asıl yetki kontrolü EraBackup Master tarafından her API isteğinde yeniden uygulanır.

## Ön koşullar

Kurulumdan önce aşağıdaki kontrolleri çalıştırın:

```bash
python3 --version
dpkg -l | grep -E 'openstack-dashboard|python3-django|python3-django-horizon'
test -x /usr/share/openstack-dashboard/manage.py && echo "Horizon manage.py OK"
test -d /usr/lib/python3/dist-packages/openstack_dashboard/local/enabled \
 && echo "Horizon enabled directory OK"
systemctl is-active apache2
```

EraBackup Master erişimini kontrol edin:

```bash
curl -k -I https://ERABACKUP_MASTER/api/skyline/session/
```

Endpoint yalnız `POST` kabul ettiği için `405 Method Not Allowed` alınması erişimin mevcut olduğunu gösterir.

## Paketi sunucuya yükleme

Paketi Horizon sunucusuna SCP, SFTP veya kurumun dosya transfer yöntemiyle yükleyin.

Örnek:

```bash
scp era-horizon-plugin-1.0.0.tar.gz \
 kullanici@HORIZON_SUNUCU:/tmp/
```

Sunucuya bağlanın:

```bash
ssh kullanici@HORIZON_SUNUCU
cd /tmp
```

Paket bütünlüğünü doğrulayın:

```bash
sha256sum era-horizon-plugin-1.0.0.tar.gz
```

Beklenen SHA-256:

```text
dacbc0139d4d7b6cf88b98709eec03bce65c5318b47c4ed5e4627ae8708b0323
```

## Kurulum

Paketi açın:

```bash
mkdir -p /tmp/era-horizon-plugin-1.0.0
tar -xzf era-horizon-plugin-1.0.0.tar.gz \
 -C /tmp/era-horizon-plugin-1.0.0
cd /tmp/era-horizon-plugin-1.0.0
```

### Kurumsal CA ile önerilen kurulum

EraBackup Master HTTPS sertifikası kurumun özel CA zinciriyle imzalanmışsa CA dosyasını Horizon sunucusuna kopyalayın ve kurulumu şu şekilde çalıştırın:

```bash
sudo ./install.sh \
 --api-url https://ERABACKUP_MASTER \
 --ca-file /etc/ssl/certs/erabackup-ca.crt
```

### CA dosyası bulunmayan ortam

CA dosyası temin edilemiyorsa bağlantı aşağıdaki şekilde kurulabilir:

```bash
sudo ./install.sh \
 --api-url https://ERABACKUP_MASTER \
 --insecure
```

> `--insecure`, HTTPS sertifika doğrulamasını kapatır. Ağ trafiği şifrelenmeye devam eder fakat sunucu kimliği doğrulanmaz. Üretimde mümkün olduğunda kurumsal CA kullanılması önerilir.

## Installer tarafından yapılan işlemler

Installer:

1. Plugin uygulamasını `/usr/local/lib/python3.12/dist-packages/era_horizon_backup` altına kurar.
2. Horizon enabled dosyalarını `/usr/lib/python3/dist-packages/openstack_dashboard/local/enabled` altına yerleştirir.
3. `/etc/erabackup/horizon-plugin.json` bağlantı ayarını oluşturur.
4. Python syntax kontrolünü çalıştırır.
5. Horizon static dosyalarını toplar.
6. Django system check çalıştırır.
7. Apache servisini yeniden başlatır.
8. Mevcut plugin enabled dosyalarını `/var/backups/erabackup-horizon/` altında yedekler.

Plugin JavaScript ve CSS dosyaları yalnız EraBackup panelinde yüklenir. Horizon login sayfası ve diğer paneller global offline-compression değişikliğinden etkilenmez.

## Yapılandırma dosyası

Kurulumdan sonra aşağıdaki dosya oluşur:

```text
/etc/erabackup/horizon-plugin.json
```

CA ile örnek içerik:

```json
{
 "api_url": "https://ERABACKUP_MASTER",
 "verify_tls": true,
 "ca_file": "/etc/ssl/certs/erabackup-ca.crt",
 "timeout": 30
}
```

CA olmadan örnek içerik:

```json
{
 "api_url": "https://ERABACKUP_MASTER",
 "verify_tls": false,
 "ca_file": "",
 "timeout": 30
}
```

## Kurulum doğrulaması

Horizon sistem kontrolünü çalıştırın:

```bash
sudo python3 /usr/share/openstack-dashboard/manage.py check
```

Beklenen çıktı:

```text
System check identified no issues (0 silenced).
```

Apache durumunu kontrol edin:

```bash
systemctl is-active apache2
```

Beklenen çıktı:

```text
active
```

Static dosyaları kontrol edin:

```bash
find /var/lib/openstack-dashboard/static/erabackup \
 -maxdepth 2 -type f -print
```

Beklenen dosyalar:

```text
/var/lib/openstack-dashboard/static/erabackup/erabackup.js
/var/lib/openstack-dashboard/static/erabackup/erabackup.css
```

Login ekranını kontrol edin:

```bash
curl -sS -o /dev/null -w '%{http_code}\n' \
 http://127.0.0.1/horizon/auth/login/
```

Beklenen sonuç `200` değeridir.

## Arayüze erişim

Browser üzerinden Horizon'a giriş yapın:

```text
http://HORIZON_SUNUCU/horizon/
```

Başarılı girişten sonra aşağıdaki menüyü açın:

```text
Project > EraBackup
```

Panelin doğrudan yolu:

```text
http://HORIZON_SUNUCU/horizon/project/erabackup/
```

## Kabul testi

Kurulum sonrasında aşağıdaki testlerin ayrı kullanıcılarla yapılması önerilir:

### Reader

- Policy listesini görebilir.
- Backup ve history kayıtlarını görebilir.
- Policy oluşturma ve backup başlatma butonlarını göremez.
- Restore başlatamaz.

### Member

- Policy oluşturabilir ve düzenleyebilir.
- Full ve incremental backup başlatabilir.
- Restore başlatamaz.
- Storage oluşturamaz.

### Admin

- Policy ve backup işlemlerini yapabilir.
- Restore işlemi başlatabilir.
- Storage yönetebilir.

## Log ve hata analizi

Apache ve Horizon hataları:

```bash
sudo tail -f /var/log/apache2/error.log
```

Son Horizon hatalarını filtrelemek için:

```bash
sudo grep -E 'Internal Server Error|Traceback|EraBackup|OfflineGenerationError' \
 /var/log/apache2/error.log | tail -100
```

EraBackup Master erişimi:

```bash
curl -k -i -X POST \
 https://ERABACKUP_MASTER/api/skyline/session/ \
 -H 'Content-Type: application/json' \
 -H 'X-Auth-Token: TEST_TOKEN' \
 --data '{"platform":"openstack"}'
```

Geçersiz test tokenıyla `401 invalid_token` alınması ağ ve API endpoint erişiminin çalıştığını gösterir.

## Geri dönüş

Installer eski enabled dosyalarını aşağıdaki dizinde saklar:

```text
/var/backups/erabackup-horizon/TARIH-SAAT/
```

Eklentiyi geçici olarak devre dışı bırakmak için enabled dosyalarını `.disabled` uzantısıyla yeniden adlandırın:

```bash
sudo mv \
 /usr/lib/python3/dist-packages/openstack_dashboard/local/enabled/_3100_project_erabackup_panel_group.py \
 /usr/lib/python3/dist-packages/openstack_dashboard/local/enabled/_3100_project_erabackup_panel_group.py.disabled

sudo mv \
 /usr/lib/python3/dist-packages/openstack_dashboard/local/enabled/_3110_project_erabackup_panel.py \
 /usr/lib/python3/dist-packages/openstack_dashboard/local/enabled/_3110_project_erabackup_panel.py.disabled
```

Ardından:

```bash
sudo python3 /usr/share/openstack-dashboard/manage.py check
sudo systemctl restart apache2
```

## Güvenlik notları

- Keystone tokenları veritabanına veya uygulama loguna yazılmaz.
- Token URL query string içinde taşınmaz.
- EraBackup API yalnız tanımlı action listesindeki endpointlere çağrı yapar.
- Project kimliği istek gövdesinden güvenilir kabul edilmez; doğrulanmış Keystone tokenından alınır.
- Başka tenant veya projeye ait policy, backup ve restore kayıtları backend tarafından reddedilir.
- Üretimde mümkün olduğunda HTTPS ve kurumsal CA doğrulaması kullanılmalıdır.