nodir / db-sync
Laravel uchun prod-local PostgreSQL sync
Requires
- php: ^8.1
- illuminate/console: ^10.0|^11.0|^12.0
- illuminate/support: ^10.0|^11.0|^12.0
- symfony/process: ^6.0|^7.0
README
π Production PostgreSQL bazasini local muhitga bir buyruq bilan ko'chiring.
Laravel dasturchilari uchun oddiy va xavfsiz vosita β prod serverdagi PostgreSQL bazasini SSH orqali local kompyuteringizga sinxronlash. Real ma'lumotlar bilan ishlash, debug qilish va test qilishni osonlashtiradi.
β¨ Xususiyatlari
- π Xavfsiz β SSH orqali ulanish, prod bazaga faqat o'qish uchun kirish
- β‘ Tez β PostgreSQL'ning native
pg_dump/pg_restorevositalaridan foydalanadi - π― Oddiy β bitta buyruq (
php artisan db:sync-prod) - π‘οΈ Himoyalangan β production muhitda ishlamaydi, har safar tasdiqlash so'raydi
- π§ Avtomatik β sequence'larni o'zi to'g'rilaydi, dump fayllarni o'zi tozalaydi
- π Moslashuvchan β faqat data, fresh migrate, dump saqlash kabi rejimlar bor
π Talablar
Ishlash uchun quyidagilar kerak:
| Component | Versiya | Qayerda |
|---|---|---|
| PHP | ^8.1 | Local |
| Laravel | 10.x / 11.x / 12.x | Local |
| PostgreSQL client | 14+ | Local (pg_dump, pg_restore) |
| PostgreSQL server | 14+ | Prod server |
| SSH | Har qanday | Local β Prod |
Local kompyuterda pg_dump va pg_restore o'rnatilganligini tekshiring:
pg_dump --version pg_restore --version
Agar yo'q bo'lsa, Ubuntu/Debian'da:
sudo apt install postgresql-client
π¦ O'rnatish
1-qadam: Composer orqali
composer require nodir/db-sync --dev
π‘ Eslatma:
--devflagi bilan o'rnatilyapti, chunki bu vosita faqat development muhiti uchun.
2-qadam: Config faylni publish qilish (ixtiyoriy)
Sozlamalarni o'zgartirmoqchi bo'lsangiz:
php artisan vendor:publish --tag=db-sync-config
Bu config/db-sync.php faylini yaratadi.
βοΈ Sozlash
1-qadam: SSH key sozlash
Prod serverga parolsiz kirish uchun SSH key ulanishini sozlang:
ssh-copy-id user@your-server.com
Tekshiring β parolsiz ishlashi kerak:
ssh user@your-server.com "echo OK"
2-qadam: .env faylga qo'shish
Laravel loyihangizning .env fayliga quyidagi o'zgaruvchilarni qo'shing:
# SSH sozlamalari PROD_SSH_HOST=your-server.com PROD_SSH_USER=root PROD_SSH_PORT=22 # Prod database sozlamalari PROD_DB_NAME=your_production_db PROD_DB_USER=postgres PROD_DB_PASSWORD=your_production_db_password PROD_DB_HOST=localhost PROD_DB_PORT=5432
β οΈ Muhim:
.envfayli.gitignoreda borligiga ishonch hosil qiling. Prod parollari hech qachon Git'ga tushmasligi kerak!
3-qadam: Prod DB parolini topish
Prod serverdagi Laravel .env faylidan oling:
ssh user@your-server.com "cat /var/www/your-project/.env | grep DB_PASSWORD"
π Foydalanish
Oddiy sync
Barcha ma'lumotlar va schema'ni ko'chirish:
php artisan db:sync-prod
Natija:
Local bazangiz 'my_app' to'liq qayta yoziladi.
Prod server: your-server.com β production_db
Davom etamizmi? (yes/no) [no]: yes
π¦ Proddan dump olinmoqda...
β
Dump olindi: 24.5 MB
π₯ Localga tiklanmoqda...
π§ Sequence'lar to'g'rilanmoqda...
π Dump fayl o'chirildi
π Sync muvaffaqiyatli yakunlandi!
Boshqa rejimlar
| Buyruq | Tavsif |
|---|---|
php artisan db:sync-prod |
To'liq sync (schema + data) |
php artisan db:sync-prod --fresh |
Avval migrate:fresh qiladi, keyin data yuklaydi |
php artisan db:sync-prod --data-only |
Faqat ma'lumotlarni oladi (schema tegilmaydi) |
php artisan db:sync-prod --keep-dump |
Dump faylini o'chirmaydi, storage/app/db-sync/ da saqlaydi |
Flaglarni birlashtirish mumkin:
php artisan db:sync-prod --fresh --keep-dump
π Xavfsizlik
Nima qilinadi
| Baza | Amal | Tavsif |
|---|---|---|
| Prod | β Faqat o'qiladi | pg_dump faqat SELECT qiladi, hech narsa o'zgartirmaydi |
| Local | β οΈ Qayta yoziladi | Eski jadvallar o'chadi, prod nusxasi bilan almashtiriladi |
Ichki himoyalar
- β Production'da ishlamaydi β
APP_ENV=productionbo'lsa, darhol to'xtaydi - β Tasdiqlash so'raydi β har safar
yesjavobi kerak - π SSH orqali β PostgreSQL portini tashqariga ochmaydi
- π§Ή Tozalash β dump fayllar avtomatik o'chadi (agar
--keep-dumpqo'shilmasa)
Tavsiyalar
-
Sensitive data β agar prod'da real foydalanuvchi ma'lumotlari bo'lsa, sync'dan keyin anonymizatsiya qiling:
DB::table('users')->update([ 'email' => DB::raw("CONCAT('user', id, '@test.local')"), 'phone' => DB::raw("CONCAT('+99890', LPAD(id::text, 7, '0'))"), ]);
-
Backup β birinchi marta ishlatishdan oldin local bazani backup qiling:
pg_dump -U postgres -d local_db -F c -f backup.dump
-
Alohida backup user β production'da
rooto'rniga faqatpg_dumphuquqiga ega alohida SSH user yarating.
π Muammolarni hal qilish
"Permission denied (publickey)"
SSH key to'g'ri sozlanmagan. Qayta sozlang:
ssh-copy-id user@your-server.com
ssh user@your-server.com "echo OK"
"pg_dump: command not found"
Prod serverda PostgreSQL client o'rnatilmagan:
ssh user@your-server.com "sudo apt install postgresql-client"
"connection to server failed: fe_sendauth: no password supplied"
.env da PROD_DB_PASSWORD yo'q yoki noto'g'ri. Tekshiring:
ssh user@your-server.com "cat /var/www/your-project/.env | grep DB_PASSWORD"
"pg_restore: error: could not execute query"
Odatda FK (foreign key) ogohlantirishlari, xavfsiz. Agar jiddiy xato bo'lsa, --fresh flagi bilan qayta urinib ko'ring:
php artisan db:sync-prod --fresh
Katta bazalarda timeout
.env ga qo'shing:
DB_SYNC_TIMEOUT=7200
(7200 soniya = 2 soat)
π Ichki ishlash tamoyili
ββββββββββββββββ SSH ββββββββββββββββ
β Local ββββββββββββββββΆβ Prod β
β β pg_dump β β
β βββββββββββββββββ β
β β .dump file β β
ββββββββ¬ββββββββ ββββββββββββββββ
β
βΌ pg_restore
ββββββββββββββββ
β Local DB β
β (yangilanadi)β
ββββββββββββββββ
- SSH orqali prod serverga ulanadi
- Prod'da
pg_dumpishga tushadi, natija local'ga stream bilan kelib tushadi - Local'da
pg_restoreorqali bazaga yoziladi - Sequence'lar avtomatik to'g'rilanadi
- Dump fayl tozalanadi
π£οΈ Yo'l xaritasi
Kelajakda qo'shilishi mumkin bo'lgan xususiyatlar:
- MySQL qo'llab-quvvatlash
- Bir nechta prod baza profillari
- Faqat tanlangan jadvallarni sync qilish (
--tables=users,orders) - Avtomatik anonymizatsiya konfiguratsiyasi
- Progress bar
- Docker'da PostgreSQL qo'llab-quvvatlash
π€ Hissa qo'shish
Pull request'lar xush kelibsiz! Katta o'zgarishlar uchun avval issue oching.
- Repository'ni fork qiling
- Feature branch yarating (
git checkout -b feature/zo-r-narsa) - Commit qiling (
git commit -m 'Zo"r narsa qo"shildi') - Push qiling (
git push origin feature/zo-r-narsa) - Pull Request oching
π Litsenziya
MIT License - xohlaganingizcha ishlatishingiz mumkin.
π¨βπ» Muallif
Nodir β Senior PHP Developer, Uzbekistan
- π GitHub: @Nodir7393
- πΌ Ish: Laravel, Yii2, Next.js, PostgreSQL
β Loyihaga yordam berish
Agar paket yoqdi va ishingizga yaragan bo'lsa:
- β GitHub'da yulduzcha qo'ying
- π Topilgan bug'lar haqida xabar bering
- π‘ Yangi g'oyalar bilan bo'lishing
- π’ Do'stlaringiz bilan ulashing
Made with β€οΈ in Uzbekistan πΊπΏ