# Onoxsoft Production Deployment Guide

Bu dizin Onoxsoft hosting kontrol panelinin production ve geliştirme ortamı deployment araçlarını içerir.

---

## Hangi Aracı Kullanmalısınız?

| Senaryo | Araç |
|---|---|
| İlk kurulum (1 veya N sunucu) | Ansible `bootstrap.yml` |
| Günlük yönetim / idempotent güncelleme | Ansible `site.yml` |
| Panel sürüm güncellemesi | Ansible `upgrade.yml` |
| Sağlık kontrolü | Ansible `healthcheck.yml` |
| Yeni slave ekleme | Ansible `add-slave.yml` |
| Yerel geliştirme | Docker Compose |
| CI/CD pipeline testi | Docker Compose |

---

## Önkoşullar

### Ansible (kontrol makinesi)

```bash
pip install ansible>=8.0 ansible-lint
ansible-galaxy collection install community.general community.mysql
```

### Hedef sunucular
- AlmaLinux 9 (minimal kurulum)
- Root SSH erişimi (anahtar tabanlı, parola yok)
- Minimum 2 GB RAM, 20 GB disk

---

## İlk Deployment

### 1. Envanter düzenleyin

```bash
cp inventories/production/hosts.yml.example inventories/production/hosts.yml
# hosts.yml içindeki IP adreslerini ve host adlarını güncelleyin
```

### 2. Hassas değişkenleri vault ile şifreleyin

```bash
ansible-vault create inventories/production/group_vars/vault.yml
```

Vault dosyası şu değişkenleri içermelidir:
```yaml
vault_mariadb_root_password: "güçlü-parola"
vault_mariadb_panel_password: "güçlü-parola"
vault_mariadb_replication_password: "güçlü-parola"
vault_pdns_api_key: "rastgele-api-anahtarı"
vault_pdns_db_password: "güçlü-parola"
vault_onox_api_token: "panel-api-token"
vault_onox_slave_token: "slave-agent-token"
vault_mail_password: "mail-parolası"
```

### 3. SSH bağlantısını test edin

```bash
ansible all -m ping --ask-vault-pass
```

### 4. Bootstrap çalıştırın

```bash
ansible-playbook playbooks/bootstrap.yml --ask-vault-pass
```

Bu işlem yaklaşık 15-30 dakika sürer.

---

## Day-2 Operasyonlar

### Panel Güncelleme

```bash
ansible-playbook playbooks/upgrade.yml \
  -e onox_target_version=0.19.0 \
  --ask-vault-pass
```

Upgrade playbook otomatik olarak:
1. Bakım modunu etkinleştirir
2. Veritabanı ve dosya yedeği alır
3. Kodu günceller, migrasyonları çalıştırır
4. Başarısız olursa rollback yapar
5. Healthcheck ile doğrular

### Manuel Yedekleme

```bash
ansible-playbook playbooks/backup.yml --ask-vault-pass
# Yedekler: /var/backups/onox/manual/ dizinine kaydedilir
```

### Sağlık Kontrolü

```bash
ansible-playbook playbooks/healthcheck.yml
```

### Yeni Slave Ekleme

```bash
# 1. hosts.yml'e yeni slave ekleyin
# 2. Çalıştırın:
ansible-playbook playbooks/add-slave.yml \
  -l slave3.example.com \
  -e master_hostname=master.example.com \
  --ask-vault-pass
```

### Belirli Role Yeniden Uygulama

```bash
# Sadece Apache rolünü uygula
ansible-playbook playbooks/site.yml --tags apache

# Sadece PHP-FPM ve panel rollerini uygula
ansible-playbook playbooks/site.yml --tags "php-fpm,onox-panel" -l masters
```

---

## Docker ile Geliştirme

```bash
cd deploy/docker

# Başlat
docker compose up -d

# Logları izle
docker compose logs -f panel

# Panel shell
docker compose exec panel bash

# Durdur
docker compose down

# Tamamen sil (veritabanı dahil)
docker compose down -v
```

### Geliştirme Servisleri

| Servis | URL |
|---|---|
| Onoxsoft Panel | http://localhost:8000 |
| Grafana | http://localhost:3000 (admin/admin) |
| Prometheus | http://localhost:9090 |
| Mailpit (e-posta test) | http://localhost:8025 |
| MariaDB | localhost:3306 |
| PowerDNS API | http://localhost:8081 |

---

## Dizin Yapısı

```
deploy/
├── ansible/
│   ├── ansible.cfg                  # Ansible ayarları
│   ├── inventories/
│   │   ├── production/              # Canlı ortam
│   │   │   ├── hosts.yml            # Sunucu listesi
│   │   │   ├── group_vars/          # Grup değişkenleri
│   │   │   └── host_vars/           # Host-özel değişkenler
│   │   └── staging/                 # Test ortamı
│   ├── playbooks/
│   │   ├── site.yml                 # Ana playbook
│   │   ├── bootstrap.yml            # İlk kurulum
│   │   ├── upgrade.yml              # Güncelleme + rollback
│   │   ├── backup.yml               # Manuel yedekleme
│   │   ├── healthcheck.yml          # Sağlık kontrolü
│   │   ├── add-slave.yml            # Slave ekleme
│   │   └── reset.yml                # TEHLIKE: silme + yeniden kurulum
│   └── roles/
│       ├── common/                  # OS sertleştirme
│       ├── apache/                  # Apache HTTPD
│       ├── mariadb/                 # MariaDB 10.11
│       ├── powerdns/                # PowerDNS
│       ├── redis/                   # Redis
│       ├── php-fpm/                 # Çoklu PHP-FPM
│       ├── postfix/                 # Postfix SMTP
│       ├── dovecot/                 # Dovecot IMAP/POP3
│       ├── rspamd/                  # Rspamd spam filtresi
│       ├── onox-panel/              # Onoxsoft panel (master)
│       ├── onox-slave/              # Onoxsoft slave agent
│       └── monitoring/              # Prometheus + Grafana
└── docker/
    ├── docker-compose.yml           # Geliştirme stack
    ├── Dockerfile                   # Panel image
    ├── nginx.conf                   # Nginx (container)
    ├── php-fpm.conf                 # PHP-FPM (container)
    ├── supervisord.conf             # Süreç yöneticisi
    ├── entrypoint.sh                # Container başlatma
    └── prometheus.yml               # Prometheus config
```

---

## Sorun Giderme

### SSH bağlantısı kurulamıyor
```bash
# Ansible verbose modda çalıştır
ansible-playbook playbooks/bootstrap.yml -vvv
```

### Migrasyon başarısız
```bash
# Sunucuya bağlanın
ssh root@master.example.com
cd /opt/onoxsoft/panel
php artisan migrate:status
tail -100 storage/logs/laravel.log
```

### PHP-FPM 502 hatası
```bash
systemctl status php82-php-fpm
journalctl -u php82-php-fpm -n 50
```

### Vault parolası unutuldu
Vault parolası `~/.vault_pass` dosyasına kaydedilebilir:
```bash
echo "parola" > ~/.vault_pass
chmod 600 ~/.vault_pass
# ansible.cfg'e ekle: vault_password_file = ~/.vault_pass
```

---

## Güvenlik Notları

- `reset.yml` playbook'u üretimde ASLA çalıştırmayın
- Vault dosyalarını git'e commit etmeyin (`inventories/*/group_vars/vault.yml` `.gitignore`'da olmalı)
- Production sunucularına SSH anahtar yönetimi için HashiCorp Vault veya benzeri kullanın
- `onox_api_token` rotasyonu için `php artisan onox:rotate-token` komutunu kullanın
