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

7.6 KiB
Raw Blame History

چک‌لیست 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 اجرا شد قبل از migrate
  • migrate: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 — ژوئن ۲۰۲۶