معماری
چرخش APP_KEY
Pitchbar هر کلید مخفی کنترلشده توسط مشتری را در حالت استراحت تحت APP_KEY لاراول رمزگذاری میکند. اگر آن کلید نشت کند، باید آن را به یک کلید جدید تغییر دهید بدون اینکه دسترسی به دادههای موجود را از دست بدهید. دستور Artisan security:rotate-app-key چرخش را ایمن و idempotent میکند.
ستونهای پوششدادهشده
workspaces.cta_context_secretworkspaces.byok_keysworkspaces.slack_webhook_urlworkspaces.teams_webhook_urlwebhook_subscriptions.secretworkspace_api_tokens.shopper_signing_secretdsr_requests.result_payloadintegration_connections.credentials_encryptedsources.credentials_encryptedapp_settings.*(Stripe، PayPal، Razorpay، Cloudflare، OpenAI، OpenRouter، ایمیل، اسرار صف داخلی)
جریان چرخش
- یک کلید جدید تولید کنید:
php artisan key:generate --show # خروجی را کپی کنید - کلید جدید را بهعنوان
APP_KEYفعال اضافه کنید و کلید قدیمی را بهAPP_PREVIOUS_KEYSمنتقل کنید (در صورت چندین کلید، با کاما جدا کنید). مثال:APP_KEY=base64:NEW_KEY APP_PREVIOUS_KEYS=base64:OLD_KEY - استقرار دهید. لاراول ردیفها را با هر دو کلید رمزگشایی میکند (کلید جدید در نوشتن اولویت دارد). خوانشها با استفاده از متن رمز قدیمی به کلید قبلی بازمیگردند. برنامه بدون وقفه به کار خود ادامه میدهد.
- پاکسازی را اجرا کنید:
php artisan security:rotate-app-key --confirm-production - دستور هر ستون رمزگذاریشده را در دستههای ۲۰۰ ردیفی تکرار میکند، با کلید فعلی (یا بازگشت به کلید قبلی) رمزگشایی کرده و با کلید جدید دوباره رمزگذاری میکند. ردیفهای رد شده (ردیفهایی که متن رمز آنها قابل رمزگشایی نیست) گزارش میشوند اما پاکسازی را متوقف نمیکنند.
- پس از اتمام دستور،
APP_PREVIOUS_KEYSرا از محیط خود حذف کنید. کلید قدیمی دیگر برای هیچ ردیفی مورد نیاز نیست.
پرچمهای ایمنی
--confirm-production— در محیطproductionالزامی است. درstaging/localحذف کنید.--dry-run— تعداد ردیفها + ستونهایی را که باز رمزگذاری میشوند، بدون نوشتن شمارش میکند. برای پیشنمایش سطح قبل از اجرا مفید است.
Idempotency
اجرای دستور دو بار بیضرر است. بار دوم همان مقادیر را رمزگشایی و دوباره رمزگذاری میکند؛ بایتهای متن رمز تغییر میکنند (IV جدید) اما متن ساده دست نخورده باقی میماند.
اگر یک ردیف قابل رمزگشایی نباشد چه میشود؟
دستور ستون و شناسه ردیف را در کنسول ثبت کرده و ادامه میدهد. آن ردیف با هر کلیدی که متن رمز فعلی خود را تولید کرده است، باقی میماند. اگر APP_PREVIOUS_KEYS را قبل از اتمام پاکسازی حذف کردهاید، آن ردیفها غیرقابل بازیابی هستند — از یک پشتیبان بازیابی کرده و با کلید قبلی در محیط دوباره اجرا کنید.
ردپای حسابرسی
دستور بهتنهایی در audit_logs نمینویسد — اما اپراتوری که آن را اجرا میکند باید چرخش را در سیستم مدیریت تغییرات خود ثبت کند. اگر میخواهید هر چرخش بهطور خودکار حسابرسی شود، فراخوانی artisan را در یک اسکریپت استقرار بپیچید که یک ردیف حسابرسی منتشر کند.