$ man git-gecmisine-sizan-env

GIT-GECMISINE-SIZAN-ENV(7)GIT-GECMISINE-SIZAN-ENV(7)

NAME

Git geçmişime sızan .env dosyası

SYNOPSIS

5 Ekim 2024 · ~2 dk okuma

DESCRIPTION

Uzun bir aradan sonra kendi siteme döndüğümde ilk sorum "bu proje ne durumda?" oldu. Cevap beklediğimden kötüydü: git'in takip ettiği dosyaların arasında .env.production duruyordu. İçinde veritabanı adresi ve JWT_SECRET vardı. Aylardır. KISACA - .gitignore'a eklemek, daha önce commit edilmiş bir dosyayı takipten çıkarmaz. - Dosyayı silmek, onu git geçmişinden silmez. - Sızan bir secret ölü kabul edilir: önce yenile, sonra temizle. NASIL FARK ETTİM $ git ls-files | grep env .env.local.example .env.production ← burada olmamalıydı Dosya, veritabanını Neon'a taşıdığım bir commit'le girmiş. Repo private'tı ama bu sadece şansımın yaver gittiği anlamına geliyor. Repoyu bir gün public yapsaydım, veritabanım herkese açık olacaktı. 1. ADIM: TAKİBİ BIRAKMAK $ git rm --cached .env.production --cached sayesinde dosya diskimde kalıyor, sadece git onu izlemeyi bırakıyor. .gitignore kuralını da sadeleştirdim: .env* !.env*.example Artık sadece .example ile biten dosyalar commit edilebiliyor. 2. ADIM: GEÇMİŞTEN SİLMEK Takibi bırakmak yetmiyordu: eski commit'e bakınca dosyanın içeriği hâlâ oradaydı. Bunun için git filter-repo kullandım: $ git clone --mirror <repo-adresi> ../yedek.git # önce yedek! $ git filter-repo --path .env.production --invert-paths $ git remote add origin <repo-adresi> # filter-repo origin'i siler $ git push --force -u origin main Geçmişi yeniden yazmak, dosyanın geçtiği commit'ten sonraki her commit'in hash'ini değiştirir. Tek başıma çalıştığım için sorun olmadı, ama ekip projesinde herkesi önceden uyarmak gerekir. 3. ADIM: SECRET'LARI YENİLEMEK (ASIL ÖNEMLİ OLAN) Geçmişi temizlemek, dosyayı daha önce kimsenin görmediğini garanti etmez: klonlar, önbellekler, CI logları... O yüzden: - Neon'da veritabanı şifresini sıfırladım, - yeni bir JWT_SECRET ürettim: $ openssl rand -base64 32 - Vercel'deki ortam değişkenlerini güncelledim. BEKLENMEDİK YAN ETKİLER Şifreyi sıfırlamak zincirleme bir debug maratonu başlattı. Aynı veritabanı kullanıcısını başka bir projem de kullanıyordu. Vercel'deki bir entegrasyon değişkeni yanlış veritabanını gösteriyordu ve düzenlenemiyordu. Site "tablo yok" hatası veriyordu. Ama bu, başka bir notun konusu. AKLIMDA KALSIN - Commit'ten önce: git status, ardından git diff --staged. - .env dosyaları asla commit edilmez; örnek değerler .env.example'a yazılır. - "Sızdı mı?" sorusunda emin değilsem, cevap "evet".
semagoktas.dev5 Ekim 2024GIT-GECMISINE-SIZAN-ENV(7)
← cd ../notes