fix migrations 4

This commit is contained in:
2026-06-11 10:41:55 +03:30
parent 518338b9f9
commit 15994116f9
+234
View File
@@ -0,0 +1,234 @@
# چک‌لیست Deploy — برنچ ماژولار
بر اساس تجربه deploy روی **abshode_rahimi** (و الگوی مشابه برای groosy، abaeigold، bazre_tala، ...).
---
## قبل از deploy
- [ ] **بکاپ کامل DB** (mysqldump) — اجباری روی production
- [ ] کد جدید روی سرور (git pull / rsync) و `composer install` در صورت نیاز
- [ ] `.env` سرور درست است (`DB_HOST`, `DB_PORT`, `DB_DATABASE`, `DB_USERNAME`, `DB_PASSWORD`)
- [ ] `php artisan config:clear` بعد از تغییر `.env`
---
## بررسی پوشه migrations (خیلی مهم)
روی سرور فقط این **۸ فایل** باید در `database/migrations/` باشد:
```
2026_05_25_163201_add_provider_fields_to_orders_table.php
2026_06_02_000001_add_price_offset_percent_to_products_table.php
2026_06_06_000001_add_total_referrals_to_customers_table.php
2026_06_06_000002_alter_logs_data_to_longtext.php
2026_06_06_000003_add_order_limit_columns_to_products_table.php
2026_06_09_000001_add_show_in_assets_to_products_table.php
2026_06_10_000001_add_use_last_price_if_zero_to_products_table.php
2026_06_10_000002_add_type_column_to_settings_table.php
```
- [ ] فایل‌های قدیمی **حذف** شده‌اند (`2014_*`, `2019_*`, `2021_*`, `2023_*` create_*)
- [ ] اگر migration legacy مخصوص همان سرور مانده (مثلاً `wallet_moudle`) → در بخش «legacy» پایین چک‌لیست
```bash
ls database/migrations/*.php
```
---
## سناریو A — DB موجود (production با داده)
> ⚠️ اگر جدول `migrations` خالی باشد و مستقیم `php artisan migrate` بزنید، Laravel کل
> `database/schema/mysql-schema.sql` را load می‌کند (**DROP TABLE + CREATE**) و داده‌ها از بین می‌رود.
### ترتیب اجرا
```bash
cd /path/to/server
# ۱) baseline — حتماً قبل از migrate
mysql -h DB_HOST -P DB_PORT -u DB_USER -p DB_NAME \
< database/sql/baseline_migrations.sql
# ۲) schema incremental
php artisan migrate:status
php artisan migrate
# ۳) settings + const
mysql -h DB_HOST -P DB_PORT -u DB_USER -p DB_NAME \
< database/sql/deploy_settings_const.sql
```
- [ ] `baseline_migrations.sql` اجرا شد **قبل از** `migrate`
- [ ] `migrate:status` — همه migrationها **Ran** (یا فقط موارد جدید **Pending**)
- [ ] `deploy_settings_const.sql` اجرا شد
### مقادیر mysql
`HOST`, `PORT`, `USER`, `DATABASE` placeholder نیستند — از `.env` بخوانید:
```bash
grep ^DB_ .env
```
مثال:
```bash
mysql -h 91.212.174.137 -P 3030 -u root -p abshode_rahimi < database/sql/baseline_migrations.sql
```
پسورد = همان `DB_PASSWORD` در `.env`.
---
## سناریو B — DB خالی (نصب از صفر)
```bash
php artisan migrate # schema dump + ۸ migration
mysql ... < database/sql/deploy_settings_const.sql
```
- [ ] بعد از migrate جدول‌ها ساخته شدند
- [ ] settings/const با SQL پر شدند
- [ ] مقادیر tenant (نام، URL، توکن، main_product، ...) دستی در پنل یا UPDATE تنظیم شدند
---
## migrationهای legacy سرور
بعضی سرورها فایل PHP قدیمی دارند که در repo ماژولار نیست:
| migration | جدول |
|-----------|------|
| `2019_12_14_000001_create_personal_access_tokens_table` | `personal_access_tokens` |
| `2021_12_02_065938_create_wallet_moudle_table` | `wallet_moudle` (اختیاری) |
اگر جدول **از قبل هست** و فایل PHP هنوز روی سرور است:
- [ ] یا فایل PHP را حذف کنید
- [ ] یا در جدول `migrations` ثبت کنید (fake):
```sql
INSERT INTO migrations (migration, batch) VALUES
('2019_12_14_000001_create_personal_access_tokens_table', 1),
('2021_12_02_065938_create_wallet_moudle_table', 1);
```
یا یک‌جا:
```bash
mysql -u root -p DB_NAME < database/sql/fix_migrations_after_failed_migrate.sql
```
(این اسکریپت legacy بالا را هم شامل می‌شود — migrationهای اضافی سرور را در انتهای فایل اضافه کنید.)
---
## بعد از deploy — تأیید
```bash
php artisan migrate:status # همه Ran یا Nothing to migrate
php artisan migrate # Nothing to migrate
# داده
mysql -e "SELECT COUNT(*) FROM customers;" DB_NAME
mysql -e "SELECT COUNT(*) FROM settings;" DB_NAME
# کلیدهای مهم
mysql -e "SELECT \`key\`, LEFT(value,40) FROM settings WHERE \`key\` IN ('price_provider','main_product','name_fa');" DB_NAME
```
- [ ] سایت / API بالا می‌آید
- [ ] پنل ادمین settings را نشان می‌دهد
- [ ] `value`های قبلی tenant حفظ شده (مثلاً `price_provider`, توکن‌ها, `main_product`)
---
## deploy_settings_const — رفتار روی value
| وضعیت | نتیجه |
|--------|--------|
| کلید از قبل هست | `value` **حفظ** — فقط title/type/description آپدیت |
| کلید جدید | INSERT با مقدار پیش‌فرض اسکریپت |
| کلید legacy/test | **DELETE** (`test*`, `goldir*`, `is_requaire_referral`, ...) |
- [ ] قبل از SQL، لیست DELETE را در `deploy_settings_const.sql` مرور کردید
- [ ] اگر tenant به کلید legacy وابسته است، DELETE را comment کنید
---
## اگر اشتباه شد — بازیابی
### خطا: `Table 'personal_access_tokens' already exists`
علت: `migrations` خالی بود یا migration قدیمی Pending مانده.
```bash
# ۱) migrate نزنید
# ۲) فیکس migrations
mysql ... < database/sql/fix_migrations_after_failed_migrate.sql
# ۳) migrationهای قدیمی را از پوشه حذف یا fake کنید
php artisan migrate:status
```
### داده‌ها پاک شد (schema dump اجرا شد)
```bash
# restore بکاپ — fix_migrations داده برنمی‌گرداند
mysql ... < backup.sql
# سپس از اول با baseline_migrations.sql
```
### خطا: `Unknown MySQL server host 'HOST'`
مقادیر واقعی `.env` را جایگزین placeholder کنید.
### خطا: `3030\r` هنگام source .env
فایل `.env` خط Windows (`\r\n`) دارد — دستی mysql بزنید یا:
```bash
DB_PORT=$(grep ^DB_PORT= .env | cut -d= -f2- | tr -d '\r"')
```
---
## tenantهای خاص (اختیاری)
بعد از `deploy_settings_const.sql`، در صورت نیاز اسکریپت مخصوص همان مشتری:
| پروژه | فایل اضافی |
|--------|------------|
| groosi | `garoosi_gold_settings_finish.sql` |
| bazre_tala | `bazre_tala_settings_update.sql` |
| goldali | `goldali_post_merge_settings.sql` |
| abshode_rahimi | `abshode_rahimi_merge_goldali_catalog.sql` |
- [ ] فقط اسکریپت **همان tenant** اجرا شد (نه همه SQLها روی همه DBها)
---
## خلاصه یک‌خطی (DB موجود)
```
بکاپ → baseline_migrations.sql → migrate → deploy_settings_const.sql → تست
```
**هرگز:** `php artisan migrate` روی DB پر بدون `baseline_migrations.sql` وقتی `migrations` خالی است.
---
## فایل‌های مرجع
| فایل | کار |
|------|-----|
| `database/schema/mysql-schema.sql` | baseline schema (نصب از صفر) |
| `database/sql/baseline_migrations.sql` | قبل از migrate روی DB موجود |
| `database/sql/fix_migrations_after_failed_migrate.sql` | بعد از خطای migrate |
| `database/sql/deploy_settings_const.sql` | settings + const |
| `database/sql/deploy_safe_schema.sql` | جایگزین قدیمی schema-only (بدون settings) |
---
*آخرین به‌روزرسانی: بر اساس deploy abshode_rahimi — ژوئن ۲۰۲۶*