Files
cloud-host/AUDIT-STATUS.fa.md
keyhan d3bbc0c0a0
Build and Deploy Platform / build-and-deploy (push) Successful in 14m57s
fix(build): default Kaniko and init images to Harbor via Helm values
User-app builds no longer pull gcr.io/docker.io directly when build.images
is configured in values.yaml, fixing ImagePullBackOff on clusters without
upstream registry access.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 14:20:36 +03:30

173 lines
7.5 KiB
Markdown
Raw Permalink 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.
# وضعیت رفع یافته‌های گزارش ممیزی CloudHost
> مرجع: `AUDIT-REPORT.fa.pdf` / `scripts/audit-report.fa.html`
> آخرین به‌روزرسانی: ۳ تیر ۱۴۰۴ (3 Jul 2026)
| نماد | معنی |
|------|------|
| ✅ | رفع شده |
| ⚠️ | جزئی / نیاز به پیکربندی محیط |
| 🔜 | عمداً به تعویق افتاده (اسکوپ بزرگ یا trade-off) |
---
## خلاصه
| دسته | تعداد | ✅ | ⚠️ | 🔜 |
|------|-------|----|----|-----|
| بلاکرهای پروداکشن | 8 | 8 | 0 | 0 |
| بیلد و Kaniko | 10 | 9 | 0 | 1 |
| دیپلوی و پیش‌نمایش | 6 | 6 | 0 | 0 |
| دیتابیس / سرویس اختیاری | 9 | 8 | 0 | 1 |
| Migration / اسکیما | 4 | 4 | 0 | 0 |
| بیلینگ و امنیت مالی | 5 | 5 | 0 | 0 |
| GitOps / CI-CD | 4 | 4 | 0 | 0 |
| امنیت اپ / auth | 6 | 3 | 0 | 3 |
| بهبود / زیرساخت | 5 | 2 | 1 | 2 |
**نتیجه:** همه بلاکرهای پروداکشن و تقریباً همه باگ‌های قطعی رفع شده‌اند. موارد باقی‌مانده عمدتاً پیکربندی آینه رجیستری، JWT در localStorage، و پاک‌سازی PVC یتیم هستند.
---
## ۱. بلاکرهای پروداکشن (اولویت ۱–۸)
| # | یافته | وضعیت | اقدام |
|---|--------|--------|-------|
| 1 | شارژ رایگان کیف پول (`POST /billing/wallet/charge`) | ✅ | HMAC + گارد production در `billing-wallet.controller.ts` |
| 2 | دیپلوی بدون پرداخت | ✅ | گارد بیلینگ در `triggerDeployment`, `startDeployment`, `PATCH resources` |
| 3 | namespace از ۸ کاراکتر UUID | ✅ | `userIdSlug` / `userNamespace` با UUID کامل |
| 4 | migration بدون ردیابی نسخه | ✅ | `schema_migrations` + `000_base_schema.sql` + pre-upgrade hook |
| 5 | `015` ستون `user_id` / `001` بدون گارد TYPE | ✅ | اصلاح نام ستون + `IF NOT EXISTS` |
| 6 | workflow Gitea بدون تست | ✅ | job تست + rebase در `.gitea/workflows/build-deploy.yaml` |
| 7 | رمز هاردکد Elasticsearch | ✅ | حذف از git + SealedSecret |
| 8 | COPY گو / `\|\| echo` Node | ✅ | اصلاح در `build.service.ts` |
---
## ۲. بیلد (Kaniko + Dockerfile)
| یافته | وضعیت | یادداشت |
|--------|--------|---------|
| Go COPY نامعتبر | ✅ | |
| Node build failure نادیده | ✅ | `npm ci` + fail-on-build |
| Laravel extensions | ✅ | mbstring, xml, bcmath, zip, fileinfo, tokenizer |
| Python pyproject.toml | ✅ | تشخیص + نصب poetry/pdm |
| Kaniko 4Gi / PVC بدون SC | ✅ | limits قابل تنظیم + `BUILD_PVC_STORAGE_CLASS` |
| Git token در spec / branch injection / SSRF | ✅ | GIT_ASKPASS + Secret + validation |
| Zip slip در unzip | ✅ | اعتبارسنجی مسیر قبل و بعد از extract |
| state بیلد در حافظه | ✅ | Redis session + startup recovery |
| دیپلوی هم‌زمان بدون قفل | ✅ | in-flight guard در `triggerDeployment` |
| Base image بدون آینه | ✅ | `build.images` در Helm values + پیش‌فرض Harbor در configuration |
| zip bomb (۱۰GiB) | 🔜 | سقف آپلود موجود؛ محدودیت تعداد entry در archive پیشنهاد می‌شود |
---
## ۳. دیپلوی و پیش‌نمایش
| یافته | وضعیت | یادداشت |
|--------|--------|---------|
| حذف preview با custom domain pending | ✅ | `hasVerifiedCustomDomain()` در k8s + deployments |
| getPreviewInfo پچ NodePort | ✅ | فقط خواندن؛ ingressUrl اولویت دارد |
| fallback بین‌کلاستری → ImagePullBackOff | ✅ | `CLUSTER_DEPLOY_FALLBACK_ENABLED=true` برای fallback |
| NodePort host از API server | ⚠️ | `getClusterHostIp` همچنان fallback؛ ingressUrl مسیر اصلی |
| suspend NodePort revoke | ✅ | `deleteTemporaryAccessServicesForApp` در suspend |
---
## ۴. دیتابیس و سرویس‌های اختیاری
| یافته | وضعیت | یادداشت |
|--------|--------|---------|
| Redis/RabbitMQ randAlphaNum | ✅ | الگوی `lookup` در helm templates |
| probe بدون auth | ✅ | redis-cli `-a` / mongo با credential |
| RWO بدون Recreate | ✅ | `strategy: Recreate` |
| dbPassword fallback هر deploy | ✅ | generate + persist در DB |
| Mongo snapshot/restore | ✅ | |
| WordPress MySQL اجباری | ✅ | |
| wp-content restore از PVC | ✅ | |
| PVC یتیم بعد از suspend/delete | 🔜 | نیاز به job پاک‌سازی دوره‌ای |
| ایمیج DB از Docker Hub | ⚠️ | آینه در `values.yaml`؛ پیکربندی per-cluster |
---
## ۵. Migration / اسکیما
| یافته | وضعیت |
|--------|--------|
| Job دوباره همه SQL | ✅ |
| post-upgrade → pre-upgrade | ✅ |
| نبود base schema | ✅ |
| 015 user_id | ✅ |
---
## ۶. بیلینگ
| یافته | وضعیت |
|--------|--------|
| wallet charge بدون درگاه | ✅ |
| proration اشتباه | ✅ |
| race در wallet | ✅ | pessimistic lock |
| auto-renew دو بار بین replicas | ✅ | lock روی Application در transaction |
| دیپلوی بدون پرداخت | ✅ |
---
## ۷. GitOps / CI-CD
| یافته | وضعیت |
|--------|--------|
| workflow بدون تست | ✅ |
| elastic password در git | ✅ |
| platform Redis requirepass | ✅ |
| backend RollingUpdate + limits + postgres backup | ✅ |
| Swagger در production | ✅ |
| RUNBOOK-DEPLOY portable | ✅ | commit `6d9cd89` |
---
## ۸. امنیت اپلیکیشن
| یافته | وضعیت | یادداشت |
|--------|--------|---------|
| gitToken / dbPassword در API | ✅ | `@Exclude` + `hasDbPassword` / `hasGitToken` |
| Elasticsearch log isolation | ✅ | namespace کامل |
| OTP Math.random | ✅ | `crypto.randomInt` |
| OTP consume race | ✅ | pessimistic lock در transaction |
| JWT در localStorage | 🔜 | نیاز به httpOnly cookie + CSRF — اسکوپ frontend بزرگ |
| refresh token rotation | 🔜 | |
| secret پیش‌فرض dev | ⚠️ | `validate-production-config` در production fail می‌کند |
| docker compose NODE_ENV=production | ✅ | `NODE_ENV: development` برای dev محلی |
---
## ۹. بهبود / زیرساخت
| یافته | وضعیت |
|--------|--------|
| Backend Dockerfile helm/kubectl از اینترنت | 🔜 | mirror یا COPY از stage |
| orphan PVC cleanup | 🔜 |
| zip bomb hard limit | 🔜 |
---
## متغیرهای محیطی جدید (مرجع deploy)
| متغیر | پیش‌فرض | توضیح |
|--------|---------|-------|
| `CLUSTER_DEPLOY_FALLBACK_ENABLED` | `false` | fallback بین کلاستر |
| `CLUSTER_DEPLOY_FALLBACK_ATTEMPTS` | `3` | فقط وقتی fallback فعال |
| `BASE_IMAGE_REGISTRY` | `registry.abrban.com/proxy-dockerhub/library` | آینه base imageهای بیلد (یا از `build` در Helm values) |
| `KANIKO_IMAGE` | `registry.abrban.com/proxy-gcr/...` | Kaniko executor (یا `build.images.kaniko` در values) |
| `BUILD_PVC_STORAGE_CLASS` | — | StorageClass برای PVC بیلد |
| `BILLING_WALLET_HMAC_SECRET` | — | اجباری در production |
| `PAYMENT_GATEWAY_*` | — | اجباری برای charge واقعی |
---
## commitهای مرتبط
- `22359be` — fix(platform): apply production hardening from audit plan
- `6d9cd89` — docs: add portable from-zero deploy runbook and GitOps templates
- *(uncommitted)* — رفع موارد باقی‌مانده این سند (preview، OTP، zip slip، auto-renew lock، docker-compose)