From 15994116f995f5e60148245bb7b64de0af20b03b Mon Sep 17 00:00:00 2001 From: adonis Date: Thu, 11 Jun 2026 10:41:55 +0330 Subject: [PATCH] fix migrations 4 --- database/sql/DEPLOY_CHECKLIST.md | 234 +++++++++++++++++++++++++++++++ 1 file changed, 234 insertions(+) create mode 100644 database/sql/DEPLOY_CHECKLIST.md diff --git a/database/sql/DEPLOY_CHECKLIST.md b/database/sql/DEPLOY_CHECKLIST.md new file mode 100644 index 0000000..fdcf419 --- /dev/null +++ b/database/sql/DEPLOY_CHECKLIST.md @@ -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 — ژوئن ۲۰۲۶*