# 20i → Srv4 WordPress Göç Planı

**TEK SİTE (demowebsiteniz.com) + 32 SUBDOMAIN** — hepsi tek cPanel hesabı altında, 33 ayrı WP kurulumu.

---

## KAYNAK SUNUCU (20i / StackCP)

| Bilgi | Değer |
|-------|-------|
| SSH Bağlantı | `ssh -i /root/.ssh/20i_demowebsiteniz demowebsiteniz.com@ssh.gb.stackcp.com` |
| Kullanıcı | `demowebsiteniz.com` |
| Home Dizini | `/home/sites/27a/3/3ceb0414b8` |
| Docroot | `~/public_html` |
| DB Host | `sdb-t.hosting.stackcp.net` (uzak sunucu, localhost DEĞİL) |
| DB Kimlik | Her sitenin kendi user/pass'ı kendi wp-config.php dosyasında |
| wp-cli | `/usr/local/bin/wp` (mevcut, kullanılabilir) |
| mysql client | `/usr/bin/mysql` (mevcut, mysqldump çalışır) |
| Platform | cPanel + CloudLinux (CageFS/LVE) + Imunify360 + LiteSpeed |

### UYARI: 20i LVE Limiti
Kaynak sunucu CloudLinux LVE ile kısıtlı. Ağır veya paralel komutlar SSH oturumunu kesiyor.
- Paralel işlem YAPMA
- Her siteyi sırayla işle
- Aralardan 2-3 saniye bekle
- Script'leri `bash -s` ile stdin'den besle (çok satırlı SSH argümanı çalışmıyor)

---

## HEDEF SUNUCU (Srv4)

| Bilgi | Değer |
|-------|-------|
| IP (IPv4) | `51.210.84.167` |
| IP (IPv6) | `2001:41d0:1004:156b::b` |
| SSH Bağlantı | `ssh -i /root/.ssh/srv4_optimize root@51.210.84.167` |
| Hostname | `srv.yagmurwebtasarim.com` |
| OS | AlmaLinux 8.10 (CloudLinux YOK, Imunify YOK) |
| cPanel | 136.0 build 27 |
| LiteSpeed | Enterprise (14 gün trial — KALİCİ LİSANS ALINMALI!) |
| MariaDB | 11.8.8 |
| RAM / CPU / Disk | 15GB / 8 çekirdek / 508GB (%3 dolu) |
| cPanel Kullanıcı | `demowe` |
| Home | `/home/demowe` |
| Docroot | `/home/demowe/public_html` |

### Yapılan Optimizasyonlar (2026-07-08)
- [x] firewalld kapatıldı + masked
- [x] LiteSpeed config (srv1'den kopyalandı: Brotli 4/6, workerProcesses=8, lsphp 60 child)
- [x] OPcache (8 PHP sürümüne: 72/73/74/80/81/82/83/84)
- [x] Redis (512MB, allkeys-lru)
- [x] MariaDB tuning (buffer pool 4GB, slow log ON, max_conn 300, innodb_log_file_size 512M)
- [x] modsec kuralları (OWASP CRS + .env koruması + bot bloklama + bot tuzak URL + WP istisnası)
- [x] ionCube (zaten kuruluydu tüm PHP sürümlerinde)

---

## TAŞINACAK SİTELER: 1 Ana Site + 32 Subdomain

### Ana Site

| # | Domain | Klasör | DB Adı | DB Prefix | DB User |
|---|--------|--------|--------|-----------|---------|
| 0 | demowebsiteniz.com | . (public_html kökü) | demoweb_data | wp_ | demoweb_admin |

### etc Grubu (23 subdomain)

| # | Subdomain | Klasör | DB Adı | DB Prefix |
|---|-----------|--------|--------|-----------|
| 1 | etc001.demowebsiteniz.com | etc001 | demoweb_etc001 | wp_ |
| 2 | etc002.demowebsiteniz.com | etc002 | demoweb_etc002 | wp_ |
| 3 | etc003.demowebsiteniz.com | etc003 | demoweb_etc003 | wp_ |
| 4 | etc004.demowebsiteniz.com | etc004 | demoweb_etc004 | wp_ |
| 5 | etc005.demowebsiteniz.com | etc005 | demoweb_etc005 | wp_ |
| 6 | etc006.demowebsiteniz.com | etc006 | demoweb_etc006 | wp_ |
| 7 | etc007.demowebsiteniz.com | etc007 | demoweb_etc007 | wp_ |
| 8 | etc008.demowebsiteniz.com | etc008 | demoweb_etc008 | wp_ |
| 9 | etc009.demowebsiteniz.com | etc009 | demoweb_etc009 | ywt_ |
| 10 | etc10.demowebsiteniz.com | etc10 | demoweb_etc10 | ywt_ |
| 11 | etc11.demowebsiteniz.com | etc11 | demoweb_etc11 | wp_ |
| 12 | etc12.demowebsiteniz.com | etc12 | demoweb_etc12 | ywt_ |
| 13 | etc13.demowebsiteniz.com | etc13 | demoweb_etc13 | ywt_ |
| 14 | etc14.demowebsiteniz.com | etc14 | demoweb_etc14 | wp_ |
| 15 | etc15.demowebsiteniz.com | etc15 | demoweb_etc15 | ywt_ |
| 16 | etc16.demowebsiteniz.com | etc16 | demoweb_etc16 | wp_ |
| 17 | etc17.demowebsiteniz.com | etc17 | demoweb_etc17 | wp_ |
| 18 | etc18.demowebsiteniz.com | etc18 | demoweb_etc18 | wp_ |
| 19 | etc19.demowebsiteniz.com | etc19 | demoweb_etc19 | wp_ |
| 20 | etc20.demowebsiteniz.com | etc20 | demoweb_etc20 | wp_ |
| 21 | etc21.demowebsiteniz.com | etc21 | demoweb_etc21 | wp_ |
| 22 | etc22.demowebsiteniz.com | etc22 | demoweb_etc22 | wp_ |
| 23 | etc23.demowebsiteniz.com | etc23 | demoweb_etc23 | wp_ |

### ywt Grubu (7 subdomain)

| # | Subdomain | Klasör | DB Adı | DB Prefix |
|---|-----------|--------|--------|-----------|
| 24 | ywt1.demowebsiteniz.com | ywt1 | demoweb_ywt001 | ywt_ |
| 25 | ywt2.demowebsiteniz.com | ywt2 | demoweb_ywt002 | ywt_ |
| 26 | ywt3.demowebsiteniz.com | ywt3 | demoweb_ywt003 | wp_ |
| 27 | ywt4.demowebsiteniz.com | ywt4 | demoweb_ywt004 | wp_ |
| 28 | ywt5.demowebsiteniz.com | ywt5 | demoweb_ywt005 | wp_ |
| 29 | ywt6.demowebsiteniz.com | ywt6 | demoweb_ywt006 | wp_ |
| 30 | ywt7.demowebsiteniz.com | ywt7 | demoweb_ywt007 | wp_ |

### Diğer (2 subdomain)

| # | Subdomain | Klasör | DB Adı | DB Prefix |
|---|-----------|--------|--------|-----------|
| 31 | timeenerji.demowebsiteniz.com | timeenerji | demoweb_timeenerji | wp_ |
| 32 | xtra1.demowebsiteniz.com | xtra1 | demoweb_xtra1 | wp_ |

### Taşınmayacak Klasörler (WP kurulumu yok)
`demo1–14`, `php001–021`, `anaokulu`, `bodrum`, `crm` — bu klasörlerde wp-config.php yok, gerçek subdomain'e bağlı değil, göç kapsamı dışında.

---

## GÖÇ ADIMLARI

### ADIM 1: Hedefte cPanel Hesabı
cPanel hesabı `demowe` olarak zaten mevcut. Ana domain: `demowebsiteniz.com`

### ADIM 2: 32 Subdomain Oluştur
Hedef sunucuda root olarak:
```bash
SUBS="etc001 etc002 etc003 etc004 etc005 etc006 etc007 etc008 etc009
etc10 etc11 etc12 etc13 etc14 etc15 etc16 etc17 etc18 etc19 etc20
etc21 etc22 etc23 timeenerji xtra1 ywt1 ywt2 ywt3 ywt4 ywt5 ywt6 ywt7"

for sub in $SUBS; do
  uapi --user=demowe SubDomain addsubdomain \
    domain=$sub rootdomain=demowebsiteniz.com dir=public_html/$sub
  echo "$sub oluşturuldu"
done
```

### ADIM 3: Dosyaları Çek
20i jailed ortam — doğrudan rsync mümkün değil.

**Yöntem A (önerilen): srv1 aracı**
srv1 (51.210.84.14) hem 20i'ye hem srv4'e SSH erişimi var.
1. 20i'den srv1'e çek:
```bash
# srv1'den çalıştır — her klasörü sıralı tar+pipe
ssh -i /root/.ssh/20i_demowebsiteniz demowebsiteniz.com@ssh.gb.stackcp.com \
  'tar czf - -C ~/public_html etc001' > /tmp/etc001.tar.gz
```
2. srv1'den srv4'e aktar:
```bash
scp /tmp/etc001.tar.gz root@51.210.84.167:/home/demowe/public_html/
ssh root@51.210.84.167 'cd /home/demowe/public_html && tar xzf etc001.tar.gz && rm etc001.tar.gz'
```

**Yöntem B: Tek pipe (aracısız)**
```bash
# srv1'den: 20i'den oku, doğrudan srv4'e yaz
ssh -i /root/.ssh/20i_demowebsiteniz demowebsiteniz.com@ssh.gb.stackcp.com \
  'tar czf - -C ~/public_html etc001' | \
ssh -i /root/.ssh/srv4_optimize root@51.210.84.167 \
  'tar xzf - -C /home/demowe/public_html/'
```

**Ana site (public_html kökü):**
WP core dosyalarını al ama subdomain klasörlerini hariç tut:
```bash
ssh -i /root/.ssh/20i_demowebsiteniz demowebsiteniz.com@ssh.gb.stackcp.com \
  'tar czf - -C ~/public_html \
    --exclude="etc*" --exclude="ywt*" --exclude="demo*" \
    --exclude="php*" --exclude="anaokulu" --exclude="bodrum" \
    --exclude="crm" --exclude="timeenerji" --exclude="xtra1" \
    .' > /tmp/demowebsiteniz_root.tar.gz
```

### ADIM 4: DB'leri Dump Et
20i'de her site için sıralı mysqldump (LVE'ye dikkat, paralel yapma):
```bash
# Script: 20i SSH'ta çalışır
cd ~/public_html
for f in $(find . -maxdepth 2 -name wp-config.php | sort); do
  d=$(dirname "$f"); d=${d#./}
  db=$(grep -oP "DB_NAME['\"],\s*['\"]\K[^'\"]+" "$f" | head -1)
  u=$(grep -oP "DB_USER['\"],\s*['\"]\K[^'\"]+" "$f" | head -1)
  h=$(grep -oP "DB_HOST['\"],\s*['\"]\K[^'\"]+" "$f" | head -1)
  pw=$(grep "DB_PASSWORD" "$f" | sed -E "s/.*DB_PASSWORD['\"],[[:space:]]*['\"]([^'\"]*)['\"].*/\1/" | head -1)
  
  echo "Dump: $db ..."
  MYSQL_PWD="$pw" mysqldump -u"$u" -h"$h" "$db" \
    --default-character-set=utf8mb4 \
    --single-transaction --routines --triggers \
    > ~/tmp/${db}.sql
  
  echo "  Bitti: $(du -h ~/tmp/${db}.sql | cut -f1)"
  sleep 2  # LVE sakinleşsin
done
```
Sonra dump'ları srv4'e aktar:
```bash
# srv1'den
scp -i /root/.ssh/20i_demowebsiteniz \
  demowebsiteniz.com@ssh.gb.stackcp.com:~/tmp/demoweb_*.sql \
  /tmp/20i_dumps/

scp -i /root/.ssh/srv4_optimize /tmp/20i_dumps/*.sql \
  root@51.210.84.167:/tmp/
```

### ADIM 5: Hedefte DB Oluştur + Import
Srv4'te root olarak:
```bash
# Her site için DB + user + grant + import
# cPanel max 8 karakter prefix: demowe_
SITES="data etc001 etc002 etc003 etc004 etc005 etc006 etc007 etc008
etc009 etc10 etc11 etc12 etc13 etc14 etc15 etc16 etc17 etc18 etc19
etc20 etc21 etc22 etc23 timeenerji xtra1 ywt001 ywt002 ywt003
ywt004 ywt005 ywt006 ywt007"

DBPASS="GüçlüŞifreKoy123!"  # Tüm DB'lere ortak veya her birine ayrı

for site in $SITES; do
  DBNAME="demowe_${site}"
  DBUSER="demowe_${site}"
  
  # cPanel API ile oluştur
  uapi --user=demowe Mysql create_database name="${DBNAME}"
  uapi --user=demowe Mysql create_user name="${DBUSER}" password="${DBPASS}"
  uapi --user=demowe Mysql set_privileges_on_database \
    user="${DBUSER}" database="${DBNAME}" privileges=ALL
  
  # Import
  mysql "${DBNAME}" < /tmp/demoweb_${site}.sql
  echo "${DBNAME} import edildi"
done
```

### ADIM 6: wp-config Güncelle
Her sitenin wp-config.php dosyasında 4 satır değişecek:
```bash
# Örnek: etc001
WP_PATH="/home/demowe/public_html/etc001"
sed -i "s/demoweb_etc001/demowe_etc001/" "$WP_PATH/wp-config.php"       # DB_NAME
sed -i "s/demoweb_etc001/demowe_etc001/" "$WP_PATH/wp-config.php"       # DB_USER (aynı adsa tek sed yeter)
sed -i "s/ESKİ_DB_ŞİFRE/YENİ_DB_ŞİFRE/" "$WP_PATH/wp-config.php"     # DB_PASSWORD
sed -i "s/sdb-t.hosting.stackcp.net/localhost/" "$WP_PATH/wp-config.php" # DB_HOST → localhost
```

**Toplu script:**
```bash
cd /home/demowe/public_html
for d in . etc001 etc002 ... ywt7 timeenerji xtra1; do
  conf="$d/wp-config.php"
  [ -f "$conf" ] || continue
  # DB_HOST hepsinde aynı, toplu değiştir
  sed -i "s/sdb-t.hosting.stackcp.net/localhost/" "$conf"
  # DB_NAME ve DB_USER: demoweb_ → demowe_
  sed -i "s/demoweb_/demowe_/g" "$conf"
  # DB_PASSWORD: toplu değiştir
  sed -i "s/ESKİ_ŞİFRE/${DBPASS}/" "$conf"
  echo "$d güncellendi"
done
```

### ADIM 7: Dosya Sahipliği Düzelt
```bash
chown -R demowe:demowe /home/demowe/public_html/
find /home/demowe/public_html/ -type d -exec chmod 755 {} \;
find /home/demowe/public_html/ -type f -exec chmod 644 {} \;
```

### ADIM 8: DNS Yönlendirme
demowebsiteniz.com DNS kayıtları:
```
A     @                    51.210.84.167
A     *                    51.210.84.167       (wildcard — 32 subdomain tek seferde)
AAAA  @                    2001:41d0:1004:156b::b
AAAA  *                    2001:41d0:1004:156b::b
```
Wildcard ile tüm subdomain'ler tek kayıtla yönlenir (etc001, etc002, ywt1... hepsi).

### ADIM 9: SSL
DNS yönlendikten sonra (propagasyon 5dk-24saat):
```bash
# cPanel AutoSSL tüm domainleri tarar ve kurar
/usr/local/cpanel/bin/autossl_check --user=demowe
```
Veya Let's Encrypt wildcard:
```bash
# Wildcard sertifika (DNS doğrulama gerekir)
cpanel_letsencrypt --issue -d 'demowebsiteniz.com' -d '*.demowebsiteniz.com'
```

### ADIM 10: Test
Her site için kontrol:
```bash
# hosts dosyasından test (DNS değişmeden önce)
# Yerel bilgisayarında /etc/hosts'a ekle:
# 51.210.84.167 demowebsiteniz.com etc001.demowebsiteniz.com etc002.demowebsiteniz.com ...

# Sunucudan curl ile test:
for sub in "" etc001 etc002 etc003 ywt1 ywt2 timeenerji xtra1; do
  if [ -z "$sub" ]; then
    domain="demowebsiteniz.com"
  else
    domain="${sub}.demowebsiteniz.com"
  fi
  code=$(curl -s -o /dev/null -w "%{http_code}" --resolve "${domain}:443:51.210.84.167" "https://${domain}/")
  echo "$domain → HTTP $code"
done
```

---

## DİKKAT EDİLECEKLER

1. **20i LVE limiti:** Paralel işlem oturumu keser. Her şeyi sıralı yap, aralarda bekle.
2. **20i DB uzak sunucuda:** mysqldump ağ üzerinden çalışır, büyük DB'ler yavaş olabilir.
3. **MariaDB 11.8 (srv4):** Import'ta charset uyumsuzluğu olabilir → `--default-character-set=utf8mb4` kullan.
4. **MariaDB 11.8 tuzağı:** `innodb_buffer_pool_instances` ve `innodb_buffer_pool_chunk_size` değişkenleri KALDIRILDI — my.cnf'e koyarsan MariaDB başlamaz!
5. **LiteSpeed lisansı:** 14 gün trial! Süre dolmadan kalıcı lisans alınmalı, yoksa restart'ta Apache'ye düşer.
6. **Dosya sahipliği:** rsync/tar sonrası mutlaka `chown -R demowe:demowe` yap.
7. **wp-config izinleri:** 644 veya 640 olmalı, 600 yaparsan LiteSpeed okuyamayabilir.
8. **Redis entegrasyonu:** Taşıma bittikten sonra her WP'ye Redis Cache eklentisi kurulacak (wp-cli ile toplu).
9. **LSCache:** Her WP'ye LiteSpeed Cache eklentisi kurulacak (taşıma sonrası).

---

## DURUM TAKİBİ

- [ ] cPanel hesabı oluşturuldu (demowe — MEVCUT)
- [ ] 32 subdomain oluşturuldu
- [ ] Ana site dosyaları taşındı
- [ ] 32 subdomain dosyaları taşındı
- [ ] 33 DB dump edildi (20i'den)
- [ ] 33 DB hedefte oluşturuldu
- [ ] 33 DB import edildi
- [ ] 33 wp-config güncellendi (DB bilgileri + localhost)
- [ ] Dosya sahipliği düzeltildi
- [ ] DNS yönlendirildi (A + AAAA + wildcard)
- [ ] SSL kuruldu (AutoSSL veya wildcard)
- [ ] Tüm siteler test edildi
- [ ] Redis Cache eklentisi kuruldu (toplu)
- [ ] LiteSpeed Cache eklentisi kuruldu (toplu)
- [ ] 20i hesabı kapatıldı/askıya alındı

---

---

## SSH KEY BİLGİLERİ

### 20i Bağlantı Key (srv1 ve srv4'te mevcut)
- **Dosya yolu (srv1):** `/root/.ssh/20i_demowebsiteniz`
- **Dosya yolu (srv4):** `/root/.ssh/20i_demowebsiteniz`
- **Bağlantı komutu:** `ssh -i /root/.ssh/20i_demowebsiteniz demowebsiteniz.com@ssh.gb.stackcp.com`
- **Public key (20i paneline eklendi):**
  `ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINfsxkg3gNxvpQnjv6pW0MjHiN+R2bICp/5hCf3dqZ1b 20i-demowebsiteniz-migrate`

### Srv4 Bağlantı Key (srv1'de mevcut)
- **Dosya yolu:** `/root/.ssh/srv4_optimize`
- **Bağlantı komutu:** `ssh -i /root/.ssh/srv4_optimize root@51.210.84.167`

### UYARI: Doğrudan Bağlantı Yönü
- srv1 → 20i: ✅ ÇALIŞIYOR
- srv1 → srv4: ✅ ÇALIŞIYOR
- srv4 → 20i: ❌ TIMEOUT (20i firewall engelliyor)
- **Sonuç:** Taşıma srv1 üzerinden yapılacak (aracı sunucu).
  srv1'den 20i'ye bağlanıp dosya/DB çekilir, sonra srv1'den srv4'e aktarılır.
  VEYA srv1'den tek pipe ile 20i→srv4 doğrudan akıtılır.

*Oluşturulma: 2026-07-09 | Son güncelleme: 2026-07-09*
*Bu döküman srv4 sunucusunda /home/demowe/public_html/tasima.md olarak saklanmaktadır.*
