۱۹ — Production Launch Checklist
قبل از باز کردن app.takeeat.ir برای عموم — همه موارد زیر را tick کنید.
۱. Legal و trust
| # | مورد | وضعیت | یادداشت |
|---|---|---|---|
| 1 | ثبت شرکت / شخص حقوقی | ☐ | برای Zarinpal production و قرارداد رستوران |
| 2 | اینماد (enamad.ir) | ☐ | دامنه باید HTTPS + از ایران در دسترس باشد |
| 3 | قرارداد با رستورانها | ☐ | حداقل informal قبل از scale — جزئیات در 11-open-decisions #8 |
| 4 | صفحات قانونی در سایت | ☐ | حریم خصوصی، شرایط استفاده (v2 اگر نبود) |
اینماد — فلو خلاصه
- ثبتنام در enamad.ir با دامنه
takeeat.ir - اطمینان از HTTPS روی
takeeat.irوapp.takeeat.ir(Caddy + Arvan CDN) - قرار دادن فایل/کد تأیید در root سایت (مثل IRNIC verify)
- بعد از تأیید، badge اینماد در footer لندینگ
→ جزئیات DNS/SSL: 18-deploy-and-dns.md
۲. Payment (Zarinpal)
| # | مورد | env |
|---|---|---|
| 1 | Merchant ID production از Zarinpal | ZARINPAL_MERCHANT_ID |
| 2 | Sandbox خاموش | ZARINPAL_SANDBOX=false |
| 3 | Callback URL prod | ZARINPAL_CALLBACK_URL=https://app.takeeat.ir/api/payments/zarinpal/callback |
| 4 | تست end-to-end: سفارش → pay → awaiting_vendor → vendor confirm → confirmed | دستی |
| 5 | refund دستی برای auto-cancel (#20) | ادمین /admin/orders → refund |
نکته: auto-cancel وقتی وندور تا pickup_start تأیید نکند → cancelled + refund خودکار نیست — ادمین باید manual refund بزند.
۳. SMS (Panelchi)
| # | مورد | env |
|---|---|---|
| 1 | API key فعال | PANELCHI_API_KEY |
| 2 | شماره خط | PANELCHI_SOURCE_NUMBER |
| 3 | پترن OTP (اختیاری ولی توصیه) | PANELCHI_OTP_PATTERN=takeeat-otp |
| 4 | Dev mode خاموش | SMS_DEV_MODE=false |
| 5 | تست OTP واقعی روی ۲–۳ شماره | scripts/test-otp-send.sh |
| 6 | تست SMS سفارش (vendor + client) | flow کامل سفارش |
→ قالبها: 10-sms-notifications.md
۴. Infrastructure
| # | مورد | مقدار prod |
|---|---|---|
| 1 | URL اپ | https://app.takeeat.ir |
| 2 | NEXT_PUBLIC_APP_URL | https://app.takeeat.ir |
| 3 | BLOCK_SEARCH_INDEXING | false (برخلاف stage) |
| 4 | DNS app.takeeat.ir → سرور prod | Arvan CDN A/CNAME |
| 5 | SSL origin + CDN | scripts/obtain-origin-certs.sh |
| 6 | JWT_SECRET تصادفی 64+ char | openssl rand -base64 48 |
| 6b | JWT_REFRESH_SECRET جدا از access | openssl rand -base64 48 |
| 7 | CRON_SECRET تصادفی | header x-cron-secret (POST) |
| 8 | Postgres backup روزانه | cron pg_dump — 21-ops-runbook.md |
| 9 | GitHub Environment production + required reviewer | قبل از deploy |
→ Deploy: 18-deploy-and-dns.md — workflow deploy-prod.yml
۵. Product readiness
| # | مورد |
|---|---|
| 1 | حداقل ۵–۱۰ وندور در ۲–۳ محله نزدیک (#6) |
| 2 | smoke test کامل — 14-smoke-test-playbook.md |
| 3 | e2e: npm run test:e2e |
| 4 | vendor onboarding آماده — 20-vendor-onboarding.md |
| 5 | co-founder میداند refund دستی چطور کار میکند |
۶. Security (pre-launch)
| # | مورد | تأیید |
|---|---|---|
| 1 | SMS_DEV_MODE=false | ☐ |
| 2 | JWT_SECRET + JWT_REFRESH_SECRET تصادفی (نه placeholder) | ☐ |
| 3 | Admin password bcrypt (login once یا scripts/migrate-admin-passwords.ts) | ☐ |
| 4 | Security headers فعال (Next.js + Caddy HSTS) | ☐ |
| 5 | Gateway callback → awaiting_vendor (نه مستقیم confirmed) | ☐ |
| 6 | npm run test:ci green | ☐ |
۷. Go / No-go
| Signal | Go | No-go |
|---|---|---|
| Payment prod تست شده | ≥ ۳ سفارش واقعی موفق | callback fail |
| SMS delivery | OTP + vendor SMS ≤ ۳۰s | fail مکرر |
| Vendor liquidity | ≥ ۵ باکس فعال در یک محله | لیست خالی |
| Legal minimum | اینماد + sandbox→prod gateway | بدون HTTPS |
۷. روز لانچ
□ deploy prod (GitHub Actions → approval)
□ smoke: home → box → pay → vendor confirm → pickup
□ مانیتور لاگ ۳۰ دقیقه اول: journalctl -u takeeat
□ یک سفارش real با co-founder
□ اعلام soft launch به وندورهای signed