7.6 KiB
چکلیست 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» پایین چکلیست
ls database/migrations/*.php
سناریو A — DB موجود (production با داده)
⚠️ اگر جدول
migrationsخالی باشد و مستقیمphp artisan migrateبزنید، Laravel کل
database/schema/mysql-schema.sqlرا load میکند (DROP TABLE + CREATE) و دادهها از بین میرود.
ترتیب اجرا
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اجرا شد قبل ازmigratemigrate:status— همه migrationها Ran (یا فقط موارد جدید Pending)deploy_settings_const.sqlاجرا شد
مقادیر mysql
HOST, PORT, USER, DATABASE placeholder نیستند — از .env بخوانید:
grep ^DB_ .env
مثال:
mysql -h 91.212.174.137 -P 3030 -u root -p abshode_rahimi < database/sql/baseline_migrations.sql
پسورد = همان DB_PASSWORD در .env.
سناریو B — DB خالی (نصب از صفر)
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):
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);
یا یکجا:
mysql -u root -p DB_NAME < database/sql/fix_migrations_after_failed_migrate.sql
(این اسکریپت legacy بالا را هم شامل میشود — migrationهای اضافی سرور را در انتهای فایل اضافه کنید.)
بعد از deploy — تأیید
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 مانده.
# ۱) migrate نزنید
# ۲) فیکس migrations
mysql ... < database/sql/fix_migrations_after_failed_migrate.sql
# ۳) migrationهای قدیمی را از پوشه حذف یا fake کنید
php artisan migrate:status
دادهها پاک شد (schema dump اجرا شد)
# 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 بزنید یا:
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 — ژوئن ۲۰۲۶