Files
boursecu_server/database/sql/DEPLOY_CHECKLIST.md
T
2026-06-11 10:41:55 +03:30

235 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# چک‌لیست 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 — ژوئن ۲۰۲۶*