Sunucu Taşıma Runbook'u

Zaten kurulu bir uygulamayı, şifreli ayarları veya 2FA verisini kaybetmeden yeni bir sunucuya taşımak için kopyala-yapıştır kontrol listesi. Buradaki herhangi bir adım tanıdık gelmiyorsa önce docs/encryption.tr.md'yi okuyun.

En önemli tek kural: mevcut .env dosyasını taşıyın, hedef sunucuda php artisan key:generate çalıştırmayın.

Başlamadan önce

  • [ ] Kaynak sunucuda tam bir veritabanı yedeği alın.
  • [ ] Kaynak sunucunun .env dosyasının tam bir kopyasına sahip olduğunuzu doğrulayın — yeniden üretilmiş bir dosya değil, hafızadan doldurulmuş bir .env.example değil.
  • [ ] Kaynak uygulamada aktif trafik varsa bir bakım penceresi planlayın.

1. Ortam dosyasını kopyalayın

  • [ ] Kaynak sunucunun .env dosyasını hedef sunucuya olduğu gibi kopyalayın, her ikisi dahil:
    • APP_KEY
    • DATA_ENCRYPTION_KEY ve DATA_ENCRYPTION_PREVIOUS_KEYS (DATA_ENCRYPTION_KEY boş olsa bile — bu boşluk anlamlıdır ve "düzeltilmeden" olduğu gibi taşınmalıdır)
  • [ ] .env.example'dan sıfır bir .env oluşturup değerleri elle yapıştırmayın. Gerçek dosyayı kopyalayın.

2. Hedef sunucuda ÇALIŞTIRMAYIN

  • [ ] php artisan key:generate çalıştırmayın. Bu komut APP_KEY'in üzerine yazar. Bu kurulumda DATA_ENCRYPTION_KEY boşsa, birincil veri şifreleme anahtarı APP_KEY'DİR — üzerine yazmak her şifreli ayarı ve her kullanıcının 2FA sırrını, hatanın olduğu noktada hiçbir uyarı vermeden kalıcı olarak okunamaz yapar.
  • [ ] Bu taşımanın bir parçası olarak hedef sunucuda php artisan encryption:key çalıştırmayın. Bu komut yeni bir anahtar üretir; rotasyon içindir, taşıma için değil. Taşıma mevcut anahtarı değiştirmeden taşır.
  • [ ] Hedef sunucuda, saklamak istediğiniz veriye karşı migrate:fresh, migrate:refresh, migrate:reset veya db:wipe çalıştırmayın.

3. Uygulama kodunu deploy edin ve migration'ları çalıştırın

  • [ ] Kod tabanını deploy edin (kaynak ile aynı sürüm, ya da hedeflediğiniz yükseltme sürümü).
  • [ ] Bağımlılıkları kurun (deploy sürecinize göre composer install --no-dev, npm ci && npm run build).
  • [ ] php artisan migrate çalıştırın (yalnızca şema — migration'lar hiçbir şifreleme anahtarına dokunmaz).
  • [ ] Hedef sunucuda çoğaltılmış/stream edilmiş değil de sıfır bir veritabanı varsa "Başlamadan önce" adımındaki yedeği geri yükleyin.

4. Trafik göndermeden ÖNCE doğrulayın

Aşağıdaki ikisi de geçmeden hedef sunucuya DNS/load balancer trafiği yönlendirmeyin:

  • [ ] php artisan encryption:health

    Kaynak sunucu zaten encryption:rekey çalıştırıp previous-keys listesini temizlediyse safe-to-clear (exit 0), bekleyen previous key'leri varsa rekey-required (exit 1) bekleyin — bu aşamada ikisi de sorun değil, ikisi de verinin okunabilir olduğu anlamına gelir. unreadable (exit 2) veya key-error (exit 2) DUR demektir — trafik göndermeyin, aşağıdaki kurtarma bölümüne bakın.

  • [ ] php artisan sk:doctor

    Başarısız hiçbir kontrol olmadığını, özellikle şifrelemeyle ilgili herhangi bir kontrolü (Data Encryption Key) doğrulayın. Ortamınıza göre bir uyarı kabul edilebilir olabilir; bir başarısızlık kabul edilemez.

  • [ ] Elle noktasal kontrol: admin panelinin Settings ekranını açın ve daha önce yapılandırılmış hassas bir değerin (örn. mail şifresi, yapılandırılmış bir storage secret'ı) hâlâ boş değil yapılandırılmış göründüğünü doğrulayın. 2FA açık bir kullanıcı olarak giriş yapın ve 2FA doğrulamasının hâlâ bir kodu kabul ettiğini doğrulayın.

Yalnızca her iki komut da geçtikten ve noktasal kontrol başarılı olduktan sonra trafiği hedef sunucuya kesin.

5. Kesimden sonra

  • [ ] Hedef sunucunun kararlı olduğuna güvenene kadar kaynak sunucunun veritabanını ve .env'ini dokunulmadan, erişilebilir tutun (geri dönüş yolu).
  • [ ] Yeni sunucuda veri şifreleme anahtarını rotasyona sokmayı planlıyorsanız, bunu ayrı, sonraki, bilinçli bir işlem olarak yapın — bkz. docs/encryption.tr.md → "Zaten benimsenmiş bir anahtarı rotasyona sokmak". Anahtar rotasyonunu sunucu taşımasıyla birleştirmeyin; önce taşımanın başarılı olduğunu doğrulayın.

Kurtarma: eski anahtar gerçekten kayıp

.env doğru taşınmadıysa ve mevcut veriyi şifreleyen anahtar (kaynak sunucuda hangisi birincilse, APP_KEY ve/veya DATA_ENCRYPTION_KEY) gerçekten kayıpsa — hiçbir yerde yedeklenmemiş, eski .env'in hiçbir kopyasından kurtarılamıyorsa:

  • Bu kitteki hiçbir komut o veriyi kurtaramaz. encryption:health unreadable veya key-error raporlar ve öyle kalır; bir onarım yolu yoktur.
  • Kurtarılamayan şeyler:
    • Kayıp anahtar altında şifrelenmiş her hassas ayar (mail.password, storage.spaces_secret, storage.aws_secret, storage.hetzner_secret, turnstile.secret_key, postman.api_key, apidog.access_token) — hedef sunucu diğer açılardan sağlıklı hale geldikten sonra Settings ekranından elle yeniden girilmelidir.
    • Kayıp anahtar altında şifrelenmiş her kullanıcının 2FA sırrı ve kurtarma kodları — etkilenen her kullanıcı iki faktörlü doğrulamayı kapatıp yeniden kaydolmalıdır. Sır çözülemediği için mevcut doğrulama akışı üzerinden kendi kendine kurtaramazlar.
  • Etkilenmeyenler: hâlâ elinizde olan bir anahtar altında şifrelenmiş her şey (örn. yalnızca DATA_ENCRYPTION_PREVIOUS_KEYS kaybolduysa ama mevcut birincil anahtar doğru taşındıysa, yalnızca hâlâ eski anahtarda kalan satırlar etkilenir — tam olarak hangileri olduğunu görmek için encryption:health çalıştırın).
  • Bunu "hatayı yok etmek için" DATA_ENCRYPTION_PREVIOUS_KEYS'i temizleyerek veya APP_KEY/DATA_ENCRYPTION_KEY'i yeniden üreterek atlatmaya çalışmayın — bu veriyi geri getirmez ve gerçek anahtarı daha sonra bulma şansını da ortadan kaldırır.

Bu dökümanda kullanılan yer tutucu değerler

Bu dökümanda veya docs/encryption.tr.md'de gösterilen herhangi bir anahtar (örn. bir .env.example bloğunda) bariz şekilde sahte bir yer tutucudur, örneğin base64:REPLACE_ME_WITH_A_GENERATED_KEY= — asla gerçek bir anahtar değildir. Gerçek bir APP_KEY veya DATA_ENCRYPTION_KEY değerini de bir ticket'a, sohbete veya commit mesajına yapıştırmayın; her ikisini de başka herhangi bir secret gibi işleyin.

Ayrıca bakınız

  • docs/encryption.tr.md — neyin şifrelendiği, anahtar çözümleme sözleşmesi, benimseme ve rotasyon prosedürleri.
  • docs/artisan-commands.tr.md — sk:doctor dahil tam komut referansı.