# Release & Deployment — get.onox.com.tr Üzerinden Tek-Komut Kurulum

> **Hedef:** `curl -fsSL https://get.onox.com.tr/install.sh | bash` ile sıfır sunucuya ONOXSOFT'u tek satırda kurmak.

Bu sayfa **paketleyici (release maker)** ve **dağıtım sunucusu (get.onox.com.tr)** kurulumunu birlikte anlatır. Müşteri tarafındaki kurulum için [İlk Kurulum](/tr/getting-started/ilk-kurulum) sayfasına bakın.

---

## 1. Mimari Özet

```
┌──────────────────────┐        ┌─────────────────────────┐        ┌──────────────────────┐
│  Geliştirici/CI      │        │ get.onox.com.tr (CDN)   │        │ Müşteri sunucusu      │
│  C:\xampp\PANELTR    │ scp →  │ /var/www/.../public/    │  curl→ │ install.sh çalışır    │
│  build-release.sh    │        │   ├─ install.sh         │        │  ↓                    │
│   ↓                  │        │   ├─ paneltr.tar.gz     │        │  tarball indir+SHA256 │
│  dist/*.tar.gz       │        │   └─ *.tar.gz.sha256    │        │  ↓ /var/www/onoxsoft  │
└──────────────────────┘        └─────────────────────────┘        └──────────────────────┘
```

- **Geliştirici tarafı:** Windows (XAMPP/WSL) veya Linux CI üzerinden `scripts/build-release.sh` çalıştırır → versiyonlu tarball + SHA256 üretir → `scp` ile dağıtım sunucusuna yükler.
- **Dağıtım sunucusu:** `get.onox.com.tr` Apache/Nginx ile sadece statik dosya servisi. **PHP/DB gereksiz.**
- **Müşteri sunucusu:** `install.sh` 4 kaynağı sırayla dener: yerel `/opt/onox-source/` → mevcut `.git/` pull → tarball indir+verify → GitHub fallback.

---

## 2. Geliştirici Tarafı — Release Üretmek

### 2.1 Yerel Build (Windows + Git Bash veya WSL)

```bash
cd /c/xampp/htdocs/PANELTR

# Sadece build (upload yok)
bash scripts/build-release.sh

# Çıktı:
#   dist/paneltr-v0.18.0.tar.gz          (versiyonlu)
#   dist/paneltr-v0.18.0.tar.gz.sha256   (checksum)
#   dist/paneltr.tar.gz                  (latest alias = symlink/copy)
#   dist/paneltr.tar.gz.sha256
```

### 2.2 Build + Upload (Tek Komut)

```bash
# SSH key auth gerekli (get.onox.com.tr için)
bash scripts/build-release.sh --upload

# Veya farklı versiyon override:
bash scripts/build-release.sh --version 0.19.0 --upload

# Farklı upload target (env veya flag):
ONOX_UPLOAD_TARGET=root@cdn.example.com:/var/www/public/ \
    bash scripts/build-release.sh --upload

# CI'da composer/npm zaten çalıştıysa atla:
bash scripts/build-release.sh --skip-composer --skip-npm --upload
```

### 2.3 Tarball İçeriği

**Dahil olanlar:**
- `app/`, `bootstrap/`, `config/`, `database/`, `routes/`, `resources/`, `public/`
- `public/build/` — Vite production bundle (npm run build çıktısı)
- `vendor/` — composer install --no-dev çıktısı
- `.env.example` — install.sh override edecek
- `install.sh`, `composer.json`, `composer.lock`, `package.json`
- `scripts/sysapi/` — onx-* wrapper script'leri

**Hariç olanlar:** `.git`, `.github`, `node_modules`, `tests`, `storage/logs/*`, `storage/framework/cache/*`, `.env`, `.env.local`, `*.log`, `.claude`, `.worktrees`, `dist`, `public/hot`

### 2.4 Build Çıktısı Boyutu Beklentisi

- **0.18.0:** ~28-35 MB (vendor/ + public/build/ dahil)
- **30 MB üstü → kontrol et:** `composer install --no-dev` çalışmamış olabilir veya `tests/` paketlenmiştir

---

## 3. Dağıtım Sunucusu — get.onox.com.tr Kurulumu

### 3.1 Minimum Gereksinimler

- 1 vCPU, 1 GB RAM (statik dosya = düşük yük)
- Public IP + DNS A kaydı (`get.onox.com.tr → <IP>`)
- 10 GB disk (her release ~30 MB, 100 versiyon = 3 GB)
- AlmaLinux 9 veya Ubuntu 22.04+

### 3.2 Apache Vhost Kurulumu (AlmaLinux 9)

```bash
# 1. Apache + Let's Encrypt kur
dnf install -y httpd mod_ssl certbot python3-certbot-apache
systemctl enable --now httpd

# 2. Doc root oluştur
mkdir -p /var/www/get.onox.com.tr/public
chown -R apache:apache /var/www/get.onox.com.tr

# 3. SELinux context (önemli — yoksa 403)
chcon -Rt httpd_sys_content_t /var/www/get.onox.com.tr

# 4. Vhost yaz
cat > /etc/httpd/conf.d/get.onox.com.tr.conf <<'EOF'
<VirtualHost *:80>
    ServerName get.onox.com.tr
    DocumentRoot /var/www/get.onox.com.tr/public

    # Let's Encrypt HTTP-01 challenge için /.well-known açık
    <Directory /var/www/get.onox.com.tr/public>
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    # Açık olan dosyalar: sadece statik release artifacts
    <FilesMatch "\.(sh|tar\.gz|sha256)$">
        Header set Cache-Control "public, max-age=300"
        Header set Access-Control-Allow-Origin "*"
    </FilesMatch>

    # Tüm diğer dosya tipleri → 403
    <FilesMatch "\.(php|html|cgi|pl)$">
        Require all denied
    </FilesMatch>

    ErrorLog /var/log/httpd/get-error.log
    CustomLog /var/log/httpd/get-access.log combined
</VirtualHost>
EOF

# 5. Test + reload
httpd -t && systemctl reload httpd

# 6. Let's Encrypt sertifikası (otomatik HTTPS vhost ekler)
certbot --apache -d get.onox.com.tr --agree-tos --email admin@onox.com.tr --no-eff-email --redirect
```

### 3.3 Nginx Alternatifi (Ubuntu)

```nginx
server {
    listen 80;
    listen [::]:80;
    server_name get.onox.com.tr;

    root /var/www/get.onox.com.tr/public;
    index index.html;

    # Sadece release artifact'lerini sun
    location ~* \.(sh|tar\.gz|sha256)$ {
        add_header Cache-Control "public, max-age=300";
        add_header Access-Control-Allow-Origin "*";
        try_files $uri =404;
    }

    # Dizin listeleme yasak
    location / {
        try_files $uri =404;
    }

    # PHP/script execution kapalı
    location ~ \.(php|cgi|pl)$ {
        return 403;
    }

    access_log /var/log/nginx/get-access.log;
    error_log /var/log/nginx/get-error.log warn;
}
```

`sudo certbot --nginx -d get.onox.com.tr` ile HTTPS aktif et.

### 3.4 İlk Yükleme Testi

`get.onox.com.tr` ayağa kalktıktan sonra geliştirici makinesinden:

```bash
cd /c/xampp/htdocs/PANELTR
bash scripts/build-release.sh --upload

# Doğrula:
curl -fsI https://get.onox.com.tr/paneltr.tar.gz | grep -E '^(HTTP|Content-Length)'
curl -fsSL https://get.onox.com.tr/paneltr.tar.gz.sha256

# install.sh da upload edildi mi?
curl -fsSL https://get.onox.com.tr/install.sh | head -5
```

---

## 4. Müşteri Tarafı — Tek-Komut Kurulum

### 4.1 FQDN Modu (Hostname hazır)

```bash
# DNS A kaydı: panel.müsteri.com → sunucu IP
curl -fsSL https://get.onox.com.tr/install.sh | \
    bash -s -- --admin-email admin@müsteri.com --hostname panel.müsteri.com
```

### 4.2 IP-Only Modu (DNS henüz hazır değil)

```bash
# Sunucu IP otomatik tespit edilir, self-signed SSL ile kurulur
# Hostname sonra Settings UI'dan eklenir
curl -fsSL https://get.onox.com.tr/install.sh | \
    bash -s -- --admin-email admin@müsteri.com --ip-only
```

### 4.3 Custom Panel Port (Default 666)

```bash
# WHM-uyumlu port (2087) istersen:
curl -fsSL https://get.onox.com.tr/install.sh | \
    bash -s -- --admin-email admin@müsteri.com \
               --ssl-port 2087 --http-port 2086 \
               --hostname panel.müsteri.com
```

### 4.4 Kurulum Sonrası Doğrulama

```bash
# 1. Panel erişilebilir mi?
curl -fkI https://panel.müsteri.com:666/

# 2. SSH ile bağlan, admin user oluştur (kurulumda email verilmediyse):
ssh root@sunucu
cd /var/www/onoxsoft
php artisan onoxsoft:admin-create --email=admin@müsteri.com

# 3. Service status:
systemctl status onox-worker onox-scheduler httpd mariadb redis
```

---

## 5. Versiyonlu Yayın Akışı (Production)

### 5.1 Önerilen Versiyonlama

`composer.json` → `"version": "0.18.0"` alanı build-release.sh'in okuduğu yer.

```json
{
    "name": "onoxsoft/panel",
    "version": "0.18.0",
    "type": "project",
    "...": "..."
}
```

### 5.2 Release Checklist

- [ ] `git status` temiz, ana branch'tesin
- [ ] `composer.json` versiyon bump (örn `0.18.0 → 0.19.0`)
- [ ] `CHANGELOG.md` güncellendi
- [ ] `git tag v0.19.0 && git push origin v0.19.0`
- [ ] `bash scripts/build-release.sh --upload` çalıştır
- [ ] Test sunucusunda `install.sh` çek ve doğrula
- [ ] Tag'i GitHub'da release olarak işaretle (notları CHANGELOG'dan)

### 5.3 Eski Versiyonları Saklamak

`scripts/build-release.sh` versiyonlu dosya bırakır (`paneltr-v0.18.0.tar.gz`). `paneltr.tar.gz` her zaman en sonu işaret eder.

```bash
# get.onox.com.tr üzerinde:
ls /var/www/get.onox.com.tr/public/
# paneltr-v0.17.0.tar.gz
# paneltr-v0.17.0.tar.gz.sha256
# paneltr-v0.18.0.tar.gz       ← yeni
# paneltr-v0.18.0.tar.gz.sha256
# paneltr.tar.gz → paneltr-v0.18.0.tar.gz  (symlink)
# paneltr.tar.gz.sha256

# Müşteri spesifik versiyon istemek için (env var, bash tarafında set edilir):
curl -fsSL https://get.onox.com.tr/install.sh | \
    ONOX_RELEASE_URL=https://get.onox.com.tr/paneltr-v0.17.0.tar.gz \
    ONOX_RELEASE_SHA256_URL=https://get.onox.com.tr/paneltr-v0.17.0.tar.gz.sha256 \
    bash -s -- --admin-email x@y.com

# Not: env vars `curl |`'in sağ tarafına yazılırsa bash'e geçer. Yanlış kullanım:
#   VAR=x curl ... | bash   ← VAR curl'a gider, bash'e gitmez
# Doğru kullanım yukarıdaki gibi `| VAR=x ONOX_RELEASE_URL=... bash` formatıdır.
```

---

## 6. SHA256 Bütünlük Doğrulaması

`install.sh` indirme sonrası **otomatik olarak** doğrular:

```bash
# install.sh içinde (özet):
curl -fsSL -o /tmp/paneltr.tar.gz https://get.onox.com.tr/paneltr.tar.gz
curl -fsSL -o /tmp/paneltr.tar.gz.sha256 https://get.onox.com.tr/paneltr.tar.gz.sha256

cd /tmp
sha256sum -c paneltr.tar.gz.sha256 || { echo "SHA256 mismatch!"; exit 1; }

tar -xzf paneltr.tar.gz -C /var/www/onoxsoft --strip-components=1
```

**Manuel doğrulama:**

```bash
curl -fsSL https://get.onox.com.tr/paneltr.tar.gz -o /tmp/p.tar.gz
echo "$(curl -fsSL https://get.onox.com.tr/paneltr.tar.gz.sha256 | awk '{print $1}')  /tmp/p.tar.gz" | sha256sum -c -
# /tmp/p.tar.gz: OK
```

---

## 7. CI Üzerinden Release (Opsiyonel — GitHub Actions)

`.github/workflows/release.yml`:

```yaml
name: Release

on:
  push:
    tags: ['v*']

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with: { php-version: '8.3' }
      - uses: actions/setup-node@v4
        with: { node-version: '20' }

      - name: Composer install
        run: composer install --no-dev --optimize-autoloader --no-interaction

      - name: npm build
        run: npm ci && npm run build

      - name: Build tarball
        run: bash scripts/build-release.sh --skip-composer --skip-npm

      - name: Setup SSH
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.DEPLOY_SSH_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan -H get.onox.com.tr >> ~/.ssh/known_hosts

      - name: Upload to get.onox.com.tr
        run: |
          scp dist/*.tar.gz dist/*.sha256 \
              root@get.onox.com.tr:/var/www/get.onox.com.tr/public/
          scp install.sh \
              root@get.onox.com.tr:/var/www/get.onox.com.tr/public/

      - name: Create GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          files: dist/*
```

`Settings → Secrets → DEPLOY_SSH_KEY` → SSH private key (deploy-only kullanıcı için).

---

## 8. Güvenlik Notları

- **install.sh'i imzala (gelecek geliştirme):** Şimdilik HTTPS + SHA256 yeterli. İleride `minisign` veya GPG ile script imzalama eklenebilir.
- **Tarball SHA256 dosyası mutlaka yan dosya olarak yüklenmeli** — install.sh ona güvenerek doğrular.
- **get.onox.com.tr root erişimi sınırlı tutulmalı** — sadece deploy SSH key + admin yetkisi olan kullanıcılar. Dağıtım sunucusu compromise olursa **tüm müşteri kurulumları zehirlenir**.
- **rsyslog veya auditd ile dosya yazma logla** — kim ne zaman release yükledi denetlenebilir.
- **2FA SSH:** dağıtım sunucusunda root SSH login kapalı + key-only + opsiyonel pam_google_authenticator.

---

## 9. Sorun Giderme

| Hata | Sebep | Çözüm |
|---|---|---|
| `curl: (22) HTTP 404` | Tarball yüklü değil | `scripts/build-release.sh --upload` çalıştır |
| `sha256sum: WARNING: 1 computed checksum did NOT match` | Bozuk indirme veya yanlış checksum | Tarball + .sha256 dosyalarını birlikte yeniden yükle |
| `403 Forbidden` (Apache) | SELinux context yanlış | `chcon -Rt httpd_sys_content_t /var/www/get.onox.com.tr` |
| `install.sh` "GitHub fallback" diyor | Tarball erişilemiyor | `curl -fsI https://get.onox.com.tr/paneltr.tar.gz` ile DNS+vhost doğrula |
| Boyut > 80 MB | `tests/` veya `node_modules` paketlendi | `scripts/build-release.sh` exclude listesini kontrol et |

---

**Sonraki adımlar:**
- [İlk Kurulum](/tr/getting-started/ilk-kurulum) — müşteri tarafı detaylı kurulum
- [Sistem Gereksinimleri](/tr/getting-started/sistem-gereksinimleri) — donanım/yazılım önkoşulları
- [Status Page](/tr/admin/status-page) — get.onox.com.tr uptime monitoring kurulumu
