fix: reduce memory_limit to 256M and configure PHP-FPM process management settings

This commit is contained in:
hamed
2026-07-08 17:54:20 +03:30
parent c6fa92b9a4
commit a5460cbaa9
15 changed files with 563 additions and 458 deletions
+2 -1
View File
@@ -18,7 +18,8 @@
# resource's page (Internal URL). serverVersion MUST match the MariaDB resource (11.8). # resource's page (Internal URL). serverVersion MUST match the MariaDB resource (11.8).
DATABASE_URL="mysql://clinic:DB_PASSWORD@mariadb-XXXXXXXX:3306/clinic_pro?serverVersion=mariadb-11.8.0&charset=utf8mb4" DATABASE_URL="mysql://clinic:DB_PASSWORD@mariadb-XXXXXXXX:3306/clinic_pro?serverVersion=mariadb-11.8.0&charset=utf8mb4"
REDIS_URL="redis://redis-XXXXXXXX:6379" REDIS_URL="redis://redis-XXXXXXXX:6379"
MESSENGER_TRANSPORT_DSN="redis://redis-XXXXXXXX:6379/messages" # stream_max_entries caps the Redis stream so the queue cannot grow without bound
MESSENGER_TRANSPORT_DSN="redis://redis-XXXXXXXX:6379/messages?stream_max_entries=20000"
# If the Redis resource has a password: redis://:PASSWORD@redis-XXXXXXXX:6379 # If the Redis resource has a password: redis://:PASSWORD@redis-XXXXXXXX:6379
# ── Backend's own domain (single URL — used for payment callbacks & absolute URLs) ── # ── Backend's own domain (single URL — used for payment callbacks & absolute URLs) ──
+1 -1
View File
@@ -99,7 +99,7 @@ services:
worker-scheduler: worker-scheduler:
image: clinicpro-app:latest image: clinicpro-app:latest
restart: unless-stopped restart: unless-stopped
command: php bin/console messenger:consume scheduler_default --time-limit=3600 command: php bin/console messenger:consume scheduler_default --time-limit=3600 --memory-limit=128M
environment: environment:
<<: *app-env <<: *app-env
RUN_INIT: "0" RUN_INIT: "0"
+3 -1
View File
@@ -1,5 +1,7 @@
; Production PHP settings for ClinicPro on Coolify ; Production PHP settings for ClinicPro on Coolify
memory_limit = 1024M ; 256M is ample for API requests (uploads are capped at 32M below); the old 1024M
; let a single leaky/looping request eat a quarter of a small VPS before dying.
memory_limit = 256M
upload_max_filesize = 16M upload_max_filesize = 16M
post_max_size = 32M post_max_size = 32M
max_execution_time = 60 max_execution_time = 60
+11
View File
@@ -5,3 +5,14 @@
; wrong environment. Keep the container env so compose-provided vars reach PHP. ; wrong environment. Keep the container env so compose-provided vars reach PHP.
[www] [www]
clear_env = no clear_env = no
; Process manager: bounded pool + child recycling. Without pm.max_requests the
; default children live forever and slow PHP memory leaks accumulate for hours
; until the host OOMs (the messenger workers already recycle hourly; this gives
; FPM the same hygiene).
pm = dynamic
pm.max_children = 8
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 500
+1 -1
View File
@@ -56,7 +56,7 @@ stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0 stderr_logfile_maxbytes=0
[program:worker-scheduler] [program:worker-scheduler]
command=php bin/console messenger:consume scheduler_default --time-limit=3600 command=php bin/console messenger:consume scheduler_default --time-limit=3600 --memory-limit=128M
autorestart=true autorestart=true
priority=30 priority=30
stopsignal=TERM stopsignal=TERM
+47 -1
View File
@@ -104,6 +104,52 @@ GET /.well-known/acme-challenge/xxxx HTTP/1.1" 404 ... "Let's Encrypt validation
- **کانتینر app**: `docker/healthcheck.sh` مسیر واقعی `/health` را از داخل می‌زند. پارامترها در `Dockerfile` و `docker-compose.yml` یکسان‌اند: `interval=15s, timeout=5s, retries=5, start_period=60s`. یعنی برای unhealthy شدن باید ۵ بار پیاپی (~۷۵ ثانیه) fail شود. - **کانتینر app**: `docker/healthcheck.sh` مسیر واقعی `/health` را از داخل می‌زند. پارامترها در `Dockerfile` و `docker-compose.yml` یکسان‌اند: `interval=15s, timeout=5s, retries=5, start_period=60s`. یعنی برای unhealthy شدن باید ۵ بار پیاپی (~۷۵ ثانیه) fail شود.
- **کانتینرهای worker** (حالت compose): healthcheck فقط وجود پروسه `messenger:consume` را با `ps | grep` چک می‌کند (`interval=30s, retries=3`). در لحظه exit ساعتیِ worker ممکن است **یک** چک fail شود — بی‌اهمیت است؛ برای unhealthy شدن ۳ شکست پیاپی (~۹۰ ثانیه) لازم است و worker در همان چند ثانیه اول برمی‌گردد. unhealthy شدن worker فقط وقتی رخ می‌دهد که consumer واقعاً بالا نیاید (مثلاً Redis در دسترس نباشد). - **کانتینرهای worker** (حالت compose): healthcheck فقط وجود پروسه `messenger:consume` را با `ps | grep` چک می‌کند (`interval=30s, retries=3`). در لحظه exit ساعتیِ worker ممکن است **یک** چک fail شود — بی‌اهمیت است؛ برای unhealthy شدن ۳ شکست پیاپی (~۹۰ ثانیه) لازم است و worker در همان چند ثانیه اول برمی‌گردد. unhealthy شدن worker فقط وقتی رخ می‌دهد که consumer واقعاً بالا نیاید (مثلاً Redis در دسترس نباشد).
## ۷. اعمال تغییرات config ## ۷. down شدن بعد از چند ساعت — کمبود حافظه (OOM)
الگو: workerها چند بار recycle عادی می‌شوند و بعد از چند ساعت کل سرویس down می‌شود. مظنون اول: پر شدن حافظه سرور و کشته شدن پروسه‌ها توسط OOM-killer.
### تأیید روی سرور
```bash
# آیا کانتینر با OOM کشته شده؟
docker inspect --format '{{.State.OOMKilled}} {{.State.ExitCode}} {{.State.FinishedAt}}' <container>
# ردپای OOM-killer در کرنل (مهم‌ترین دستور)
journalctl -k --since "24 hours ago" | grep -i -E "oom|killed process"
# مصرف لحظه‌ای هر کانتینر
docker stats --no-stream
# حافظه و swap کل سرور
free -h
```
اگر `OOMKilled=true` یا در journalctl خط `Out of memory: Killed process ... (php-fpm|mariadbd)` دیدید، تشخیص قطعی است.
### چرا این اتفاق می‌افتاد (و فیکس اعمال‌شده)
- `memory_limit` هر request برابر **1024M** بود → به 256M کاهش یافت (`docker/php/php.ini`).
- pool فقط `clear_env=no` داشت؛ **`pm.max_requests` تنظیم نشده بود** → پروسه‌های php-fpm هرگز recycle نمی‌شدند و نشت‌های کوچک حافظه در طول ساعت‌ها جمع می‌شد. حالا `pm.max_requests=500` + سقف `pm.max_children=8` (`docker/php/zz-pool.conf`).
- workerهای messenger از قبل با `--time-limit=3600` و `--memory-limit=128M` محافظت می‌شدند — مشکل از آن‌ها نبود.
### اقدامات تکمیلی روی سرور (خارج از repo)
1. در Coolify برای resource اپ **Memory Limit** بگذارید (مثلاً 1G) تا در بدترین حالت فقط همان کانتینر ری‌استارت شود، نه کل سرور.
2. اگر سرور swap ندارد، 1-2G swap اضافه کنید: `fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile`.
3. اسکن‌های بات (درخواست‌های `GET /xxx.php → 404` پشت‌سرهم) توسط nginx مستقیم 404 می‌شوند و به Symfony نمی‌رسند — عامل مرگ نیستند، فقط نویز لاگ.
4. **Redis بدون سقف حافظه**: کش اپ (`cache.adapter.redis`) و صف messenger هر دو روی یک Redis resource هستند و Redis پیش‌فرض `maxmemory=0` (رشد بی‌نهایت) دارد — یکی از عوامل خورده شدن تدریجی RAM. روی Redis resource در Coolify ست کنید:
```
maxmemory 256mb
maxmemory-policy volatile-lru
```
⚠️ `allkeys-lru` ممنوع — پیام‌های صف messenger (بدون TTL) را حذف می‌کند؛ `volatile-lru` فقط کلیدهای کش (TTL‌دار) را evict می‌کند. در DSN صف هم `?stream_max_entries=20000` بگذارید (نمونه در `.env.coolify.example`).
5. **چرخش لاگ Docker**: اگر daemon محدودیت ندارد، فایل‌های `*-json.log` تا پر شدن دیسک رشد می‌کنند. چک: `df -h` و `du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail`. فیکس در `/etc/docker/daemon.json`:
```json
{ "log-driver": "json-file", "log-opts": { "max-size": "20m", "max-file": "3" } }
```
(بعدش `systemctl restart docker` — کانتینرها باید recreate شوند تا اعمال شود.)
6. **جدول `messenger_messages` (failed)**: پیام‌های شکست‌خورده (مثلاً SMS بعد از ۳ retry) برای همیشه در DB می‌مانند. هر چند وقت: `php bin/console messenger:failed:show` و پاکسازی با `messenger:failed:remove`.
## ۸. اعمال تغییرات config
فایل‌های `docker/supervisord.conf`، `docker-compose.yml` و `supervisor.conf` باید آینه هم بمانند (workerهای یکسان، فلگ‌های یکسان). هر تغییری در آن‌ها فقط بعد از **Redeploy در Coolify** روی سرور اثر می‌کند. فایل‌های `docker/supervisord.conf`، `docker-compose.yml` و `supervisor.conf` باید آینه هم بمانند (workerهای یکسان، فلگ‌های یکسان). هر تغییری در آن‌ها فقط بعد از **Redeploy در Coolify** روی سرور اثر می‌کند.
+1 -12
View File
@@ -727,18 +727,7 @@
"725": "Community 725", "725": "Community 725",
"726": "Community 726", "726": "Community 726",
"727": "Community 727", "727": "Community 727",
"728": "Community 728",
"729": "Community 729", "729": "Community 729",
"730": "Community 730",
"731": "Community 731",
"732": "Community 732",
"733": "Community 733",
"734": "Community 734",
"735": "Community 735",
"736": "Community 736", "736": "Community 736",
"737": "Community 737", "738": "Community 738"
"738": "Community 738",
"739": "Community 739",
"740": "Community 740",
"741": "Community 741"
} }
+89 -116
View File
@@ -1,16 +1,16 @@
# Graph Report - clinicpro (2026-07-08) # Graph Report - clinicpro (2026-07-08)
## Corpus Check ## Corpus Check
- 718 files · ~526,180 words - 718 files · ~526,578 words
- Verdict: corpus is large enough that graph structure adds value. - Verdict: corpus is large enough that graph structure adds value.
## Summary ## Summary
- 9068 nodes · 12516 edges · 742 communities (596 shown, 146 thin omitted) - 9072 nodes · 12520 edges · 731 communities (592 shown, 139 thin omitted)
- Extraction: 98% EXTRACTED · 2% INFERRED · 0% AMBIGUOUS · INFERRED: 277 edges (avg confidence: 0.8) - Extraction: 98% EXTRACTED · 2% INFERRED · 0% AMBIGUOUS · INFERRED: 277 edges (avg confidence: 0.8)
- Token cost: 0 input · 0 output - Token cost: 0 input · 0 output
## Graph Freshness ## Graph Freshness
- Built from commit: `94541ad6` - Built from commit: `c6fa92b9`
- Run `git rev-parse HEAD` and compare to check if the graph is stale. - Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost). - Run `graphify update .` after code changes (no API cost).
@@ -728,20 +728,9 @@
- [[_COMMUNITY_Community 725|Community 725]] - [[_COMMUNITY_Community 725|Community 725]]
- [[_COMMUNITY_Community 726|Community 726]] - [[_COMMUNITY_Community 726|Community 726]]
- [[_COMMUNITY_Community 727|Community 727]] - [[_COMMUNITY_Community 727|Community 727]]
- [[_COMMUNITY_Community 728|Community 728]]
- [[_COMMUNITY_Community 729|Community 729]] - [[_COMMUNITY_Community 729|Community 729]]
- [[_COMMUNITY_Community 730|Community 730]]
- [[_COMMUNITY_Community 731|Community 731]]
- [[_COMMUNITY_Community 732|Community 732]]
- [[_COMMUNITY_Community 733|Community 733]]
- [[_COMMUNITY_Community 734|Community 734]]
- [[_COMMUNITY_Community 735|Community 735]]
- [[_COMMUNITY_Community 736|Community 736]] - [[_COMMUNITY_Community 736|Community 736]]
- [[_COMMUNITY_Community 737|Community 737]]
- [[_COMMUNITY_Community 738|Community 738]] - [[_COMMUNITY_Community 738|Community 738]]
- [[_COMMUNITY_Community 739|Community 739]]
- [[_COMMUNITY_Community 740|Community 740]]
- [[_COMMUNITY_Community 741|Community 741]]
## God Nodes (most connected - your core abstractions) ## God Nodes (most connected - your core abstractions)
1. `BaseController` - 76 edges 1. `BaseController` - 76 edges
@@ -762,19 +751,19 @@
assets/admin/components/ui/Pagination.tsx → assets/admin/lib/utils.ts assets/admin/components/ui/Pagination.tsx → assets/admin/lib/utils.ts
- `PersianDatePicker()` --calls--> `formatDate()` [EXTRACTED] - `PersianDatePicker()` --calls--> `formatDate()` [EXTRACTED]
assets/admin/components/ui/PersianDatePicker.tsx → assets/admin/lib/utils.ts assets/admin/components/ui/PersianDatePicker.tsx → assets/admin/lib/utils.ts
- `RepresentationSettlementPage()` --calls--> `formatRial()` [EXTRACTED]
assets/admin/pages/RepresentationSettlementPage.tsx → assets/admin/lib/utils.ts
- `SettlementsPage()` --calls--> `formatRial()` [EXTRACTED] - `SettlementsPage()` --calls--> `formatRial()` [EXTRACTED]
assets/admin/pages/SettlementsPage.tsx → assets/admin/lib/utils.ts assets/admin/pages/SettlementsPage.tsx → assets/admin/lib/utils.ts
- `NewAppointmentModal()` --calls--> `useAuthStore` [EXTRACTED]
assets/admin/pages/AppointmentsPage.tsx → assets/admin/stores/authStore.ts
## Import Cycles ## Import Cycles
- None detected. - None detected.
## Communities (742 total, 146 thin omitted) ## Communities (731 total, 139 thin omitted)
### Community 0 - "Community 0" ### Community 0 - "Community 0"
Cohesion: 0.06 Cohesion: 0.05
Nodes (36): ALLOWED_ROLES, PrivateRoute(), PublicRoute(), RoleRoute(), queryClient, toastStyle, DEGREE_OPTIONS, DoctorFormPage() (+28 more) Nodes (38): ALLOWED_ROLES, PrivateRoute(), PublicRoute(), RoleRoute(), queryClient, toastStyle, DEGREE_OPTIONS, DoctorFormPage() (+30 more)
### Community 1 - "Community 1" ### Community 1 - "Community 1"
Cohesion: 0.03 Cohesion: 0.03
@@ -789,20 +778,20 @@ Cohesion: 0.10
Nodes (20): `RepresentationActionController` — welcome به‌صورت inline (بدون تمپلت), `SmsMessageTemplate::DEFAULTS` (فاقد نام تمپلت و نگاشت token), `SmsService::sendNow` — انتخاب بین lookup و متن‌آزاد, الگوی فعلی همه‌ی call-siteها (به‌جز OTP) — متن‌آزاد، بدون `templateCode`, تبدیل همه‌ی پیامک‌های سیستمی به VerifyLookup کاوه‌نگار (تمپلت نام‌دار), تنها جای درست (OTP) — که باید الگوی بقیه شود, زمینه, فایل‌های مرتبط (+12 more) Nodes (20): `RepresentationActionController` — welcome به‌صورت inline (بدون تمپلت), `SmsMessageTemplate::DEFAULTS` (فاقد نام تمپلت و نگاشت token), `SmsService::sendNow` — انتخاب بین lookup و متن‌آزاد, الگوی فعلی همه‌ی call-siteها (به‌جز OTP) — متن‌آزاد، بدون `templateCode`, تبدیل همه‌ی پیامک‌های سیستمی به VerifyLookup کاوه‌نگار (تمپلت نام‌دار), تنها جای درست (OTP) — که باید الگوی بقیه شود, زمینه, فایل‌های مرتبط (+12 more)
### Community 4 - "Community 4" ### Community 4 - "Community 4"
Cohesion: 0.06 Cohesion: 0.08
Nodes (8): DoctorService, Doctor, DoctorServiceRepository, Collection, self, User, WeeklySchedule, ManagerRegistry Nodes (5): Doctor, Collection, self, User, WeeklySchedule
### Community 5 - "Community 5" ### Community 5 - "Community 5"
Cohesion: 0.07 Cohesion: 0.07
Nodes (3): UserProfile, self, User Nodes (3): UserProfile, self, User
### Community 6 - "Community 6" ### Community 6 - "Community 6"
Cohesion: 0.17 Cohesion: 0.12
Nodes (8): SettlementController, SettlementRepository, Settlement, JsonResponse, Request, User, ManagerRegistry, User Nodes (12): SettlementController, SettlementRepository, WalletTransactionRepository, Settlement, JsonResponse, Request, User, ManagerRegistry (+4 more)
### Community 7 - "Community 7" ### Community 7 - "Community 7"
Cohesion: 0.07 Cohesion: 0.05
Nodes (5): Clinic, Collection, Doctor, self, User Nodes (11): DoctorServiceController, DoctorService, Clinic, DoctorServiceRepository, Collection, Doctor, self, User (+3 more)
### Community 8 - "Community 8" ### Community 8 - "Community 8"
Cohesion: 0.08 Cohesion: 0.08
@@ -822,7 +811,7 @@ Nodes (4): UserActiveContextRepository, ManagerRegistry, User, UserActiveContext
### Community 12 - "Community 12" ### Community 12 - "Community 12"
Cohesion: 0.05 Cohesion: 0.05
Nodes (39): Clinic Doctor Invitation API, DELETE `/api/v1/admin/clinic/invitation/{invUuid}`, Errors, Errors, Errors, Errors, Errors, Errors (+31 more) Nodes (44): Clinic Doctor Invitation API, DELETE `/api/v1/admin/clinic/invitation/{invUuid}`, Errors, Errors, Errors, Errors, Errors, Errors (+36 more)
### Community 13 - "Community 13" ### Community 13 - "Community 13"
Cohesion: 0.08 Cohesion: 0.08
@@ -837,32 +826,32 @@ Cohesion: 0.25
Nodes (7): PaymentController, Appointment, JsonResponse, Payment, Request, Response, User Nodes (7): PaymentController, Appointment, JsonResponse, Payment, Request, Response, User
### Community 16 - "Community 16" ### Community 16 - "Community 16"
Cohesion: 0.07 Cohesion: 0.06
Nodes (7): PatientSession, SmsWallet, Appointment, Collection, PatientRecord, self, SessionService Nodes (9): PatientSession, SmsWallet, LogPruneService, AppointmentExpiryService, Appointment, Collection, PatientRecord, self (+1 more)
### Community 17 - "Community 17" ### Community 17 - "Community 17"
Cohesion: 0.05 Cohesion: 0.06
Nodes (38): DELETE `/api/v1/comment/{uuid}`, Errors, Errors, Errors, Errors, Errors, Errors, Errors (+30 more) Nodes (33): DELETE `/api/v1/comment/{uuid}`, Errors, Errors, Errors, Errors, Errors, Errors, Errors (+25 more)
### Community 18 - "Community 18" ### Community 18 - "Community 18"
Cohesion: 0.05 Cohesion: 0.05
Nodes (38): API, API, API, API, API, Route, Route, Route (+30 more) Nodes (38): API, API, API, API, API, Route, Route, Route (+30 more)
### Community 19 - "Community 19" ### Community 19 - "Community 19"
Cohesion: 0.05 Cohesion: 0.04
Nodes (44): PaginatedResponse, formatDate(), STATUS_FILTERS, FILTERS, Breakdown, SOURCE_LABEL, Summary, LEVEL_FILTER_OPTIONS (+36 more) Nodes (56): PaginatedResponse, formatDate(), STATUS_FILTERS, AddForm, addSchema, ClinicsPage(), HUES_LIST, FILTERS (+48 more)
### Community 20 - "Community 20" ### Community 20 - "Community 20"
Cohesion: 0.14 Cohesion: 0.13
Nodes (3): AdminApiController, JsonResponse, Request Nodes (3): AdminApiController, JsonResponse, Request
### Community 21 - "Community 21" ### Community 21 - "Community 21"
Cohesion: 0.05 Cohesion: 0.05
Nodes (33): formatNumber(), ClinicDetailPage(), AdminCharts, AdminDashboard(), AdminRecent, AdminStats, APPT_CLS, APPT_COLOR (+25 more) Nodes (37): formatNumber(), formatRial(), ClinicDetailPage(), AdminCharts, AdminDashboard(), AdminRecent, AdminStats, APPT_CLS (+29 more)
### Community 22 - "Community 22" ### Community 22 - "Community 22"
Cohesion: 0.15 Cohesion: 0.12
Nodes (9): RatingController, Like, LikeRepository, JsonResponse, Request, User, Comment, ManagerRegistry (+1 more) Nodes (10): RatingController, Like, CommentListNPlusOneTest, LikeRepository, JsonResponse, Request, User, Comment (+2 more)
### Community 23 - "Community 23" ### Community 23 - "Community 23"
Cohesion: 0.05 Cohesion: 0.05
@@ -877,12 +866,12 @@ Cohesion: 0.05
Nodes (39): Appointment API, Error Responses, Errors, Errors, Errors, Errors, Errors, Errors (+31 more) Nodes (39): Appointment API, Error Responses, Errors, Errors, Errors, Errors, Errors, Errors (+31 more)
### Community 26 - "Community 26" ### Community 26 - "Community 26"
Cohesion: 0.15 Cohesion: 0.24
Nodes (7): InsuranceController, EntityInsurancePricing, EntityInsurancePricingRepository, JsonResponse, Request, User, ManagerRegistry Nodes (4): InsuranceController, JsonResponse, Request, User
### Community 27 - "Community 27" ### Community 27 - "Community 27"
Cohesion: 0.06 Cohesion: 0.05
Nodes (35): 55. 🟢 `GET` all tag, 56. 🟢 `GET` supplementary_insurance, 57. 🟢 `GET` categories list, 58. 🟢 `GET` all state, 59. 🟢 `GET` all city, 60. 🟢 `GET` all specially doctor, 62. 🟡 `PATCH` patch, 63. 🔴 `DELETE` DELETE (+27 more) Nodes (40): 55. 🟢 `GET` all tag, 56. 🟢 `GET` supplementary_insurance, 57. 🟢 `GET` categories list, 58. 🟢 `GET` all state, 59. 🟢 `GET` all city, 60. 🟢 `GET` all specially doctor, 61. 🔵 `POST` post, 62. 🟡 `PATCH` patch (+32 more)
### Community 28 - "Community 28" ### Community 28 - "Community 28"
Cohesion: 0.08 Cohesion: 0.08
@@ -981,8 +970,8 @@ Cohesion: 0.07
Nodes (26): الزامات UI, باگ‌فیکس صفحه نوبت‌ها, باگ ۱ — کرش تقویم, باگ ۲ — روز هفته در DateNavigator, باگ ۳ — پیام «slot نیست», باگ ۴ — نوبت جدید: نام اجباری + find-or-create patient, باگ ۵ — patient_mobile نشان می‌دهد موبایل پزشک, باگ ۶ — نوبت‌های رزرو شده در نمایش زمانبندی (+18 more) Nodes (26): الزامات UI, باگ‌فیکس صفحه نوبت‌ها, باگ ۱ — کرش تقویم, باگ ۲ — روز هفته در DateNavigator, باگ ۳ — پیام «slot نیست», باگ ۴ — نوبت جدید: نام اجباری + find-or-create patient, باگ ۵ — patient_mobile نشان می‌دهد موبایل پزشک, باگ ۶ — نوبت‌های رزرو شده در نمایش زمانبندی (+18 more)
### Community 53 - "Community 53" ### Community 53 - "Community 53"
Cohesion: 0.10 Cohesion: 0.08
Nodes (13): AppLogRepository, ClaimItemRepository, DoctorInsuranceRepository, InvoiceItemRepository, PreRegistrationRepository, ServiceEntityRepository, ManagerRegistry, ManagerRegistry (+5 more) Nodes (15): AppLogRepository, ClaimItemRepository, InvoiceItemRepository, PreRegistrationRepository, SessionServiceRepository, SiteConfigRepository, ServiceEntityRepository, ManagerRegistry (+7 more)
### Community 54 - "Community 54" ### Community 54 - "Community 54"
Cohesion: 0.10 Cohesion: 0.10
@@ -1025,8 +1014,8 @@ Cohesion: 0.22
Nodes (5): AuthController, RateLimiterFactory, JsonResponse, Request, User Nodes (5): AuthController, RateLimiterFactory, JsonResponse, Request, User
### Community 64 - "Community 64" ### Community 64 - "Community 64"
Cohesion: 0.29 Cohesion: 0.19
Nodes (4): SmsWalletController, JsonResponse, Request, User Nodes (7): SmsWalletController, SmsSettingsRepository, SmsSettings, JsonResponse, Request, User, ManagerRegistry
### Community 65 - "Community 65" ### Community 65 - "Community 65"
Cohesion: 0.08 Cohesion: 0.08
@@ -1049,8 +1038,8 @@ Cohesion: 0.15
Nodes (12): رفع بهم‌ریختگی کامل پنل ادمین روی iPhone 8 (Safari/Chrome iOS), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی, وظایف, پروژه (+4 more) Nodes (12): رفع بهم‌ریختگی کامل پنل ادمین روی iPhone 8 (Safari/Chrome iOS), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی, وظایف, پروژه (+4 more)
### Community 71 - "Community 71" ### Community 71 - "Community 71"
Cohesion: 0.05 Cohesion: 0.20
Nodes (37): ApiResponse, ClinicAddress, ClinicDoctorItem, ClinicInvitation, EditForm, editSchema, HUES_LIST, INV_STATUS_MAP (+29 more) Nodes (8): AdminUser, ChangeRoleModal(), getPrimaryRole(), HUES_LIST, ROLE_META, ROLE_TABS, RoleBadge(), UserStats
### Community 72 - "Community 72" ### Community 72 - "Community 72"
Cohesion: 0.09 Cohesion: 0.09
@@ -1101,8 +1090,8 @@ Cohesion: 0.07
Nodes (30): devDependencies, @babel/core, @babel/preset-env, @babel/preset-react, @babel/preset-typescript, core-js, @csstools/postcss-oklab-function, @hotwired/stimulus (+22 more) Nodes (30): devDependencies, @babel/core, @babel/preset-env, @babel/preset-react, @babel/preset-typescript, core-js, @csstools/postcss-oklab-function, @hotwired/stimulus (+22 more)
### Community 86 - "Community 86" ### Community 86 - "Community 86"
Cohesion: 0.08 Cohesion: 0.06
Nodes (13): AppointmentExpiryServiceTest, LowTierFixesTest, SendCodeMobileRateLimitTest, ClaimsListPaginationTest, ServiceItemDeleteCleanupTest, ServiceItemStaffOwnershipTest, EntityManagerInterface, KernelBrowser (+5 more) Nodes (15): AppointmentExpiryServiceTest, LowTierFixesTest, SendCodeMobileRateLimitTest, ClaimsListPaginationTest, ServiceItemStaffOwnershipTest, EntityManagerInterface, KernelBrowser, CommentPaginationTest (+7 more)
### Community 87 - "Community 87" ### Community 87 - "Community 87"
Cohesion: 0.10 Cohesion: 0.10
@@ -1173,8 +1162,8 @@ Cohesion: 0.11
Nodes (18): `AdminApiController::paymentDetail` — الان فقط GET, `MellatGateway.php` — الگوی موجود REST/SOAP (پس از کار sandbox), `PaymentGatewayInterface.php`, `PaymentManager.php` — الگوی log و transaction, برگشت/استرداد وجه ملت از پنل ادمین (bpReversalRequest / bpRefundRequest), زمینه, فایل‌های مرتبط, نکات مهم (+10 more) Nodes (18): `AdminApiController::paymentDetail` — الان فقط GET, `MellatGateway.php` — الگوی موجود REST/SOAP (پس از کار sandbox), `PaymentGatewayInterface.php`, `PaymentManager.php` — الگوی log و transaction, برگشت/استرداد وجه ملت از پنل ادمین (bpReversalRequest / bpRefundRequest), زمینه, فایل‌های مرتبط, نکات مهم (+10 more)
### Community 104 - "Community 104" ### Community 104 - "Community 104"
Cohesion: 0.18 Cohesion: 0.35
Nodes (6): TagController, TagRepository, JsonResponse, Request, ManagerRegistry, Tag Nodes (3): TagController, JsonResponse, Request
### Community 105 - "Community 105" ### Community 105 - "Community 105"
Cohesion: 0.11 Cohesion: 0.11
@@ -1189,8 +1178,8 @@ Cohesion: 0.32
Nodes (6): AppointmentController, Appointment, Doctor, JsonResponse, Request, User Nodes (6): AppointmentController, Appointment, Doctor, JsonResponse, Request, User
### Community 108 - "Community 108" ### Community 108 - "Community 108"
Cohesion: 0.18 Cohesion: 0.10
Nodes (7): BaseController, CategoryController, CategoryImportController, JsonResponse, JsonResponse, Request, JsonResponse Nodes (14): BaseController, CategoryController, CategoryImportController, SiteConfigController, SmsMessageController, JsonResponse, JsonResponse, Request (+6 more)
### Community 109 - "Community 109" ### Community 109 - "Community 109"
Cohesion: 0.29 Cohesion: 0.29
@@ -1397,8 +1386,8 @@ Cohesion: 0.13
Nodes (13): Architecture, Auth, Backend (PHP/Symfony), Backend — `src/`, Category / Bundle system, Commands, Database, First-time setup (+5 more) Nodes (13): Architecture, Auth, Backend (PHP/Symfony), Backend — `src/`, Category / Bundle system, Commands, Database, First-time setup (+5 more)
### Community 163 - "Community 163" ### Community 163 - "Community 163"
Cohesion: 0.13 Cohesion: 0.11
Nodes (14): autoload, autoload-dev, psr-4, psr-4, conflict, symfony/symfony, description, license (+6 more) Nodes (18): autoload, autoload-dev, psr-4, psr-4, conflict, symfony/symfony, description, extra (+10 more)
### Community 164 - "Community 164" ### Community 164 - "Community 164"
Cohesion: 0.29 Cohesion: 0.29
@@ -1542,7 +1531,7 @@ Nodes (13): Endpoint ها, PATCH /api/v1/secretary/{uuid}, POST /api/v1/secretar
### Community 201 - "Community 201" ### Community 201 - "Community 201"
Cohesion: 0.15 Cohesion: 0.15
Nodes (13): Admin API, Clinic Invitation Management, GET `/api/v1/admin/secretaries`, GET /api/v1/admin/settings, GET `/api/v1/admin/settlements`, PATCH /api/v1/admin/settings, Query Parameters, Query Parameters (+5 more) Nodes (13): Admin API, Clinic Invitation Management, GET `/api/v1/admin/pre-registrations`, GET `/api/v1/admin/secretaries`, GET /api/v1/admin/settings, PATCH /api/v1/admin/settings, POST `/api/v1/admin/pre-registrations/{uuid}/approve`, POST `/api/v1/admin/pre-registrations/{uuid}/reject` (+5 more)
### Community 202 - "Community 202" ### Community 202 - "Community 202"
Cohesion: 0.15 Cohesion: 0.15
@@ -1553,8 +1542,8 @@ Cohesion: 0.15
Nodes (12): Clinic Services API, DELETE /api/v1/service-item/{uuid}, DELETE /api/v1/service-section/{uuid}, GET /api/v1/service-items/{sectionUuid}, GET /api/v1/service-items/{uuid}/tariffs, GET /api/v1/service-sections, PATCH /api/v1/service-item/{uuid}, PATCH /api/v1/service-section/{uuid} (+4 more) Nodes (12): Clinic Services API, DELETE /api/v1/service-item/{uuid}, DELETE /api/v1/service-section/{uuid}, GET /api/v1/service-items/{sectionUuid}, GET /api/v1/service-items/{uuid}/tariffs, GET /api/v1/service-sections, PATCH /api/v1/service-item/{uuid}, PATCH /api/v1/service-section/{uuid} (+4 more)
### Community 204 - "Community 204" ### Community 204 - "Community 204"
Cohesion: 0.23 Cohesion: 0.21
Nodes (5): ExceptionSubscriber, SecurityHeadersSubscriber, EventSubscriberInterface, ExceptionEvent, ResponseEvent Nodes (6): AuthenticationException, ExceptionSubscriber, SecurityHeadersSubscriber, EventSubscriberInterface, ExceptionEvent, ResponseEvent
### Community 205 - "Community 205" ### Community 205 - "Community 205"
Cohesion: 0.10 Cohesion: 0.10
@@ -1621,16 +1610,16 @@ Cohesion: 0.23
Nodes (5): PaymentRepository, Appointment, ManagerRegistry, Payment, User Nodes (5): PaymentRepository, Appointment, ManagerRegistry, Payment, User
### Community 225 - "Community 225" ### Community 225 - "Community 225"
Cohesion: 0.06 Cohesion: 0.05
Nodes (36): PaymentConfig, PaymentGatewayInfo, usePaymentConfig(), buildKavenegarPattern(), KavenegarGuide(), STATUS_LOG_META, Tab, TAG_FILTER_OPTIONS (+28 more) Nodes (50): PaymentConfig, PaymentGatewayInfo, usePaymentConfig(), formatDateTime(), ALL_STATUSES, AppointmentDetailPage(), timeOf(), LogsPage() (+42 more)
### Community 226 - "Community 226" ### Community 226 - "Community 226"
Cohesion: 0.15 Cohesion: 0.15
Nodes (12): Callback Mellat, frontend_address, Idempotency, درگاه‌های واقعی پروژه (از کد Drupal), شرط ایجاد پرداخت, قیمت از Config (نه Request), مجوزها, نکات پیاده‌سازی — تسک ۱۵: ماژول پرداخت (+4 more) Nodes (12): Callback Mellat, frontend_address, Idempotency, درگاه‌های واقعی پروژه (از کد Drupal), شرط ایجاد پرداخت, قیمت از Config (نه Request), مجوزها, نکات پیاده‌سازی — تسک ۱۵: ماژول پرداخت (+4 more)
### Community 227 - "Community 227" ### Community 227 - "Community 227"
Cohesion: 0.36 Cohesion: 0.22
Nodes (4): SiteConfigController, JsonResponse, Request, User Nodes (4): EntityInsurancePricing, EntityInsurancePricingRepository, TenantInsuranceCleanupService, ManagerRegistry
### Community 228 - "Community 228" ### Community 228 - "Community 228"
Cohesion: 0.20 Cohesion: 0.20
@@ -1809,7 +1798,7 @@ Cohesion: 0.18
Nodes (10): Endpoint های موجود که تغییر می‌کنند, GET /api/v1/admin/dashboard/charts?from=UNIX&to=UNIX, GET /api/v1/dashboard/clinic, GET /api/v1/dashboard/doctor, تسک ۱۶: داشبورد هوشمند — چارت + فیلتر زمانی, توضیح, زمان تخمینی, فیلتر بازه زمانی (+2 more) Nodes (10): Endpoint های موجود که تغییر می‌کنند, GET /api/v1/admin/dashboard/charts?from=UNIX&to=UNIX, GET /api/v1/dashboard/clinic, GET /api/v1/dashboard/doctor, تسک ۱۶: داشبورد هوشمند — چارت + فیلتر زمانی, توضیح, زمان تخمینی, فیلتر بازه زمانی (+2 more)
### Community 274 - "Community 274" ### Community 274 - "Community 274"
Cohesion: 0.21 Cohesion: 0.20
Nodes (5): Authentication, ClinicPro — API Documentation Index, Error Code Reference, Modules, Standard Response Envelope Nodes (5): Authentication, ClinicPro — API Documentation Index, Error Code Reference, Modules, Standard Response Envelope
### Community 275 - "Community 275" ### Community 275 - "Community 275"
@@ -1914,7 +1903,7 @@ Nodes (3): PreRegistrationController, JsonResponse, Request
### Community 301 - "Community 301" ### Community 301 - "Community 301"
Cohesion: 0.04 Cohesion: 0.04
Nodes (55): FreeVisitPrice(), Pricing, cn(), formatDateTime(), formatRial(), iranMobileOptionalSchema, iranMobileSchema, isValidIranMobile() (+47 more) Nodes (52): FreeVisitPrice(), Pricing, ApiResponse, cn(), iranMobileOptionalSchema, iranMobileSchema, isValidIranMobile(), maskMobile() (+44 more)
### Community 302 - "Community 302" ### Community 302 - "Community 302"
Cohesion: 0.12 Cohesion: 0.12
@@ -1926,7 +1915,7 @@ Nodes (16): آماده‌سازی پروژه ClinicPro برای دیپلوی ر
### Community 304 - "Community 304" ### Community 304 - "Community 304"
Cohesion: 0.22 Cohesion: 0.22
Nodes (9): 30. 🟢 `GET` get 🆕, 33. 🔵 `POST` image_clinic, 36. 🟢 `GET` get my rate, 6. کلینیک (Clinic), هدرهای اضافی, هدرهای اضافی, پاسخ‌ها, پاسخ‌ها (+1 more) Nodes (9): 29. 🟢 `GET` clinic list 🆕, 30. 🟢 `GET` get 🆕, 33. 🔵 `POST` image_clinic, 6. کلینیک (Clinic), هدرهای اضافی, پارامترهای Query, پاسخ‌ها, پاسخ‌ها (+1 more)
### Community 306 - "Community 306" ### Community 306 - "Community 306"
Cohesion: 0.07 Cohesion: 0.07
@@ -1973,8 +1962,8 @@ Cohesion: 0.31
Nodes (3): SubscriptionPlanRepository, ManagerRegistry, SubscriptionPlan Nodes (3): SubscriptionPlanRepository, ManagerRegistry, SubscriptionPlan
### Community 318 - "Community 318" ### Community 318 - "Community 318"
Cohesion: 0.28 Cohesion: 0.30
Nodes (7): AbstractAuthenticator, AuthenticationException, Passport, PasswordAuthenticator, Request, Response, TokenInterface Nodes (6): AbstractAuthenticator, Passport, PasswordAuthenticator, Request, Response, TokenInterface
### Community 319 - "Community 319" ### Community 319 - "Community 319"
Cohesion: 0.39 Cohesion: 0.39
@@ -2272,6 +2261,10 @@ Nodes (6): ClaimAmountBoundsTest, ClaimsListNPlusOneTest, ClaimItem, Claim, Doct
Cohesion: 0.22 Cohesion: 0.22
Nodes (7): initiate(), refund(), reverse(), verify(), PaymentInitResult, PaymentRefundResult, PaymentVerifyResult Nodes (7): initiate(), refund(), reverse(), verify(), PaymentInitResult, PaymentRefundResult, PaymentVerifyResult
### Community 399 - "Community 399"
Cohesion: 0.23
Nodes (5): AbstractMigration, Schema, Version20260609130407, Schema, Version20260622160119
### Community 401 - "Community 401" ### Community 401 - "Community 401"
Cohesion: 0.12 Cohesion: 0.12
Nodes (15): `lib/utils.ts`, `SettingsPage.tsx` (ورودی‌ها ریال ذخیره می‌شوند), زمینه, فایل‌های مرتبط, مشکل / هدف, نمونهٔ نمایش (Subscription), نکات مهم, واحد پول = تومان در پنل ادمین (نمایش ÷۱۰ / ورودی ×۱۰) — ذخیره و درگاه ریال می‌ماند (+7 more) Nodes (15): `lib/utils.ts`, `SettingsPage.tsx` (ورودی‌ها ریال ذخیره می‌شوند), زمینه, فایل‌های مرتبط, مشکل / هدف, نمونهٔ نمایش (Subscription), نکات مهم, واحد پول = تومان در پنل ادمین (نمایش ÷۱۰ / ورودی ×۱۰) — ذخیره و درگاه ریال می‌ماند (+7 more)
@@ -2281,8 +2274,8 @@ Cohesion: 0.11
Nodes (17): بازطراحی معماری پرداخت — سرویس‌محور، امن، توسعه‌پذیر (Backend), تست دستی (ddev، در حالت `payment_test_mode=1`), خروجی نهایی (طبق spec — در گزارش اجرا ارائه شود), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی (+9 more) Nodes (17): بازطراحی معماری پرداخت — سرویس‌محور، امن، توسعه‌پذیر (Backend), تست دستی (ddev، در حالت `payment_test_mode=1`), خروجی نهایی (طبق spec — در گزارش اجرا ارائه شود), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی (+9 more)
### Community 407 - "Community 407" ### Community 407 - "Community 407"
Cohesion: 0.27 Cohesion: 0.16
Nodes (8): MessageBusInterface, MockObject, SmsServiceLookupOnlyTest, SmsLogRepository, SmsMessageTemplateRepository, SmsService, SmsTextResolver, KavehNegarProvider Nodes (11): MessageBusInterface, MockObject, SmsService, SmsServiceLookupOnlyTest, SmsLogRepository, SmsMessageTemplateRepository, SmsService, SmsTextResolver (+3 more)
### Community 418 - "Community 418" ### Community 418 - "Community 418"
Cohesion: 0.17 Cohesion: 0.17
@@ -2292,10 +2285,6 @@ Nodes (11): دیپلوی ClinicPro روی Coolify (Docker Compose), رفع اش
Cohesion: 0.33 Cohesion: 0.33
Nodes (5): SecretaryController, DoctorSecretary, JsonResponse, Request, User Nodes (5): SecretaryController, DoctorSecretary, JsonResponse, Request, User
### Community 431 - "Community 431"
Cohesion: 0.23
Nodes (5): AbstractMigration, Schema, Version20260614181657, Schema, Version20260615061938
### Community 432 - "Community 432" ### Community 432 - "Community 432"
Cohesion: 0.12 Cohesion: 0.12
Nodes (16): backend (آماده — فقط annotation/doc ناقص), افزودن فیلد «تاریخ شروع فعالیت» (سال تجربه) در پنل ادمین با تقویم شمسی, زمینه, فایل‌های مرتبط, فرم ساخت پزشک — `DoctorFormPage.tsx` (خط ~282), فرم ویرایش پزشک — `DoctorDetailPage.tsx` (وضعیت فعلی، بدون فیلد تاریخ), مشکل / هدف, نکات مهم (+8 more) Nodes (16): backend (آماده — فقط annotation/doc ناقص), افزودن فیلد «تاریخ شروع فعالیت» (سال تجربه) در پنل ادمین با تقویم شمسی, زمینه, فایل‌های مرتبط, فرم ساخت پزشک — `DoctorFormPage.tsx` (خط ~282), فرم ویرایش پزشک — `DoctorDetailPage.tsx` (وضعیت فعلی، بدون فیلد تاریخ), مشکل / هدف, نکات مهم (+8 more)
@@ -2316,9 +2305,13 @@ Nodes (5): 31. 🟡 `PATCH` patch, Request Body, مثال Request, هدرهای
Cohesion: 0.11 Cohesion: 0.11
Nodes (18): [F10] راهنمای کهنه در `CLAUDE.md`: endpoint `categorys/{bundle}` منتقل شده, [F11] داشبورد دکتر `GET /api/v1/dashboard/doctor` همیشه 500 (فیلد ناموجود در DQL) — ✅ رفع شد, [F1] phpstan: مقایسهٔ همیشه‌درست در محاسبهٔ estimated SMS — ✅ رفع شد, [F2] تست‌های PHPUnit به API خارجی Kavenegar درخواست واقعی می‌زنند, [F3] دیتابیس تست seed نشده — فقط کاربر ادمین وجود دارد, [F4] اسکریپت seeder `create_test_users.php` وجود ندارد, [F5] ادمین با JWT معتبر به `/api/doc` (Swagger UI) دسترسی ندارد (401), [F6] ناسازگاری کدهای خطا بین دامنه‌ها (+10 more) Nodes (18): [F10] راهنمای کهنه در `CLAUDE.md`: endpoint `categorys/{bundle}` منتقل شده, [F11] داشبورد دکتر `GET /api/v1/dashboard/doctor` همیشه 500 (فیلد ناموجود در DQL) — ✅ رفع شد, [F1] phpstan: مقایسهٔ همیشه‌درست در محاسبهٔ estimated SMS — ✅ رفع شد, [F2] تست‌های PHPUnit به API خارجی Kavenegar درخواست واقعی می‌زنند, [F3] دیتابیس تست seed نشده — فقط کاربر ادمین وجود دارد, [F4] اسکریپت seeder `create_test_users.php` وجود ندارد, [F5] ادمین با JWT معتبر به `/api/doc` (Swagger UI) دسترسی ندارد (401), [F6] ناسازگاری کدهای خطا بین دامنه‌ها (+10 more)
### Community 444 - "Community 444"
Cohesion: 0.39
Nodes (3): TagRepository, ManagerRegistry, Tag
### Community 452 - "Community 452" ### Community 452 - "Community 452"
Cohesion: 0.24 Cohesion: 0.48
Nodes (5): WalletTransactionRepository, WalletTransactionsPaginationTest, ManagerRegistry, User, WalletTransaction Nodes (3): DoctorInsuranceRepository, DoctorInsurance, ManagerRegistry
### Community 456 - "Community 456" ### Community 456 - "Community 456"
Cohesion: 0.15 Cohesion: 0.15
@@ -2673,8 +2666,8 @@ Cohesion: 0.50
Nodes (4): Errors, POST `/api/v1/admin/sms/template/{uuid}/reject`, Request Body, Response `200` Nodes (4): Errors, POST `/api/v1/admin/sms/template/{uuid}/reject`, Request Body, Response `200`
### Community 559 - "Community 559" ### Community 559 - "Community 559"
Cohesion: 0.16 Cohesion: 0.25
Nodes (7): SmsMessageController, SmsMessageTemplateRepository, SmsTextResolver, SmsMessageTemplate, JsonResponse, Request, ManagerRegistry Nodes (4): SmsMessageTemplateRepository, SmsTextResolver, SmsMessageTemplate, ManagerRegistry
### Community 560 - "Community 560" ### Community 560 - "Community 560"
Cohesion: 0.50 Cohesion: 0.50
@@ -2798,11 +2791,11 @@ Nodes (3): بک‌اند, فرانت‌اند, وضعیت فعلی کد (مهم
### Community 618 - "Community 618" ### Community 618 - "Community 618"
Cohesion: 0.12 Cohesion: 0.12
Nodes (6): ServiceCoverageNPlusOneTest, TenantInsuranceCleanupTest, TenantServiceCoverageRepository, TenantInsuranceCleanupService, ManagerRegistry, TenantServiceCoverage Nodes (6): ServiceItemDeleteCleanupTest, ServiceCoverageNPlusOneTest, TenantInsuranceCleanupTest, TenantServiceCoverageRepository, ManagerRegistry, TenantServiceCoverage
### Community 625 - "Community 625" ### Community 625 - "Community 625"
Cohesion: 0.16 Cohesion: 0.40
Nodes (4): RanginehProvider, SmsService, SendSmsMessage, SmsProviderInterface Nodes (5): Errors, Path Parameters, POST `/api/v1/like/{commentUuid}`, Request Body (`application/json`), Response `200`
### Community 631 - "Community 631" ### Community 631 - "Community 631"
Cohesion: 0.50 Cohesion: 0.50
@@ -2821,8 +2814,8 @@ Cohesion: 0.47
Nodes (3): ImageCropModalProps, createImage(), getCroppedImage() Nodes (3): ImageCropModalProps, createImage(), getCroppedImage()
### Community 635 - "Community 635" ### Community 635 - "Community 635"
Cohesion: 0.17 Cohesion: 0.12
Nodes (11): Runbook — تشخیص «ری‌استارت» سرور: recycle عادی یا خرابی واقعی؟, خلاصه یک‌خطی, علامت مشکل, چک‌لیست رفع, ۱. چرا workerها هر ساعت restart می‌شوند؟, ۲. نشانه‌های خرابی واقعی, ۳. دستورهای تشخیص روی سرور, ۴. اطلاع‌رسانی خودکار در Coolify (+3 more) Nodes (15): Runbook — تشخیص «ری‌استارت» سرور: recycle عادی یا خرابی واقعی؟, اقدامات تکمیلی روی سرور (خارج از repo), تأیید روی سرور, خلاصه یک‌خطی, علامت مشکل, چرا این اتفاق می‌افتاد (و فیکس اعمال‌شده), چک‌لیست رفع, ۱. چرا workerها هر ساعت restart می‌شوند؟ (+7 more)
### Community 636 - "Community 636" ### Community 636 - "Community 636"
Cohesion: 0.50 Cohesion: 0.50
@@ -2885,8 +2878,8 @@ Cohesion: 0.31
Nodes (4): ClinicInvitationService, Clinic, ClinicDoctorInvitation, User Nodes (4): ClinicInvitationService, Clinic, ClinicDoctorInvitation, User
### Community 661 - "Community 661" ### Community 661 - "Community 661"
Cohesion: 0.36 Cohesion: 0.50
Nodes (3): DoctorServiceController, JsonResponse, Request Nodes (4): GET `/api/v1/admin/settlements`, Query Parameters, Response `200`, Settlement Management
### Community 662 - "Community 662" ### Community 662 - "Community 662"
Cohesion: 0.29 Cohesion: 0.29
@@ -2900,6 +2893,10 @@ Nodes (5): DELETE `/api/v1/billing/tenant-insurances/{uuid}`, GET `/api/v1/billi
Cohesion: 0.17 Cohesion: 0.17
Nodes (11): تشخیص «ری‌استارت» سرور روی Coolify + رفع نویز لاگ + بررسی خطای ACME, زمینه, فایل‌های مرتبط, نکات مهم, وضعیت فعلی, وظایف, پروژه, ۱. کاهش نویز لاگ workerها (بدون تغییر رفتار) (+3 more) Nodes (11): تشخیص «ری‌استارت» سرور روی Coolify + رفع نویز لاگ + بررسی خطای ACME, زمینه, فایل‌های مرتبط, نکات مهم, وضعیت فعلی, وظایف, پروژه, ۱. کاهش نویز لاگ workerها (بدون تغییر رفتار) (+3 more)
### Community 673 - "Community 673"
Cohesion: 0.15
Nodes (3): LoggerInterface, RanginehProvider, ApiIrService
### Community 674 - "Community 674" ### Community 674 - "Community 674"
Cohesion: 0.50 Cohesion: 0.50
Nodes (4): Errors, GET `/api/v1/admin/insurances`, Query Parameters, Response `200` Nodes (4): Errors, GET `/api/v1/admin/insurances`, Query Parameters, Response `200`
@@ -2937,8 +2934,8 @@ Cohesion: 0.50
Nodes (4): Errors, PATCH `/api/v1/admin/insurance/{id}`, Path Parameters, Response `200` Nodes (4): Errors, PATCH `/api/v1/admin/insurance/{id}`, Path Parameters, Response `200`
### Community 688 - "Community 688" ### Community 688 - "Community 688"
Cohesion: 0.48 Cohesion: 0.67
Nodes (3): SmsSettingsRepository, SmsSettings, ManagerRegistry Nodes (3): 36. 🟢 `GET` get my rate, هدرهای اضافی, پاسخ‌ها
### Community 689 - "Community 689" ### Community 689 - "Community 689"
Cohesion: 0.50 Cohesion: 0.50
@@ -3064,56 +3061,32 @@ Nodes (3): InvoiceService, Invoice, PatientSession
Cohesion: 0.53 Cohesion: 0.53
Nodes (4): Money, BillingCalculator, CoverageRule, ShareBreakdown Nodes (4): Money, BillingCalculator, CoverageRule, ShareBreakdown
### Community 730 - "Community 730"
Cohesion: 0.53
Nodes (3): SessionServiceRepository, ManagerRegistry, SessionService
### Community 731 - "Community 731"
Cohesion: 0.40
Nodes (5): 61. 🔵 `POST` post, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 732 - "Community 732"
Cohesion: 0.40
Nodes (5): Errors, Path Parameters, POST `/api/v1/doctor/invitation/{invUuid}/respond`, Request Body, Response `200`
### Community 734 - "Community 734"
Cohesion: 0.67
Nodes (3): 29. 🟢 `GET` clinic list 🆕, پارامترهای Query, پاسخ‌ها
### Community 736 - "Community 736" ### Community 736 - "Community 736"
Cohesion: 0.40 Cohesion: 0.40
Nodes (3): Props, StatTone, TONE Nodes (3): Props, StatTone, TONE
### Community 737 - "Community 737"
Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/pre-registrations`, POST `/api/v1/admin/pre-registrations/{uuid}/approve`, POST `/api/v1/admin/pre-registrations/{uuid}/reject`, Pre-Registration Management
### Community 738 - "Community 738" ### Community 738 - "Community 738"
Cohesion: 0.50 Cohesion: 0.50
Nodes (4): Errors, GET `/api/v1/representation/{uuid}`, Path Parameters, Response `200` Nodes (4): Errors, GET `/api/v1/representation/{uuid}`, Path Parameters, Response `200`
### Community 739 - "Community 739"
Cohesion: 0.50
Nodes (4): extra, symfony, allow-contrib, require
## Knowledge Gaps ## Knowledge Gaps
- **3964 isolated node(s):** `ALLOWED_ROLES`, `Pricing`, `ImageCropModalProps`, `TenantInsurance`, `CoverageRow` (+3959 more) - **3967 isolated node(s):** `ALLOWED_ROLES`, `Pricing`, `ImageCropModalProps`, `TenantInsurance`, `CoverageRow` (+3962 more)
These have ≤1 connection - possible missing edges or undocumented components. These have ≤1 connection - possible missing edges or undocumented components.
- **146 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. - **139 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions ## Suggested Questions
_Questions this graph is uniquely positioned to answer:_ _Questions this graph is uniquely positioned to answer:_
- **Why does `BaseController` connect `Community 108` to `Community 6`, `Community 138`, `Community 139`, `Community 14`, `Community 654`, `Community 655`, `Community 15`, `Community 20`, `Community 661`, `Community 22`, `Community 26`, `Community 164`, `Community 295`, `Community 424`, `Community 169`, `Community 300`, `Community 559`, `Community 435`, `Community 308`, `Community 59`, `Community 63`, `Community 64`, `Community 75`, `Community 77`, `Community 607`, `Community 227`, `Community 230`, `Community 104`, `Community 107`, `Community 109`, `Community 245`, `Community 121`, `Community 122`, `Community 252`?** - **Why does `BaseController` connect `Community 108` to `Community 6`, `Community 7`, `Community 138`, `Community 139`, `Community 14`, `Community 654`, `Community 655`, `Community 15`, `Community 20`, `Community 22`, `Community 26`, `Community 164`, `Community 295`, `Community 424`, `Community 169`, `Community 300`, `Community 435`, `Community 308`, `Community 59`, `Community 63`, `Community 64`, `Community 75`, `Community 77`, `Community 607`, `Community 230`, `Community 104`, `Community 107`, `Community 109`, `Community 245`, `Community 121`, `Community 122`, `Community 252`?**
_High betweenness centrality (0.031) - this node is a cross-community bridge._ _High betweenness centrality (0.031) - this node is a cross-community bridge._
- **Why does `ApiTestCase` connect `Community 86` to `Community 397`, `Community 535`, `Community 541`, `Community 41`, `Community 562`, `Community 565`, `Community 573`, `Community 574`, `Community 575`, `Community 452`, `Community 594`, `Community 82`, `Community 728`, `Community 733`, `Community 735`, `Community 609`, `Community 484`, `Community 618`, `Community 497`, `Community 371`?** - **Why does `ApiTestCase` connect `Community 86` to `Community 609`, `Community 541`, `Community 484`, `Community 535`, `Community 41`, `Community 618`, `Community 397`, `Community 497`, `Community 594`, `Community 562`, `Community 82`, `Community 565`, `Community 371`, `Community 22`, `Community 573`, `Community 574`, `Community 575`?**
_High betweenness centrality (0.020) - this node is a cross-community bridge._ _High betweenness centrality (0.020) - this node is a cross-community bridge._
- **Why does `Version20260705070546` connect `Community 646` to `Community 431`?** - **Why does `Version20260705070546` connect `Community 646` to `Community 399`?**
_High betweenness centrality (0.019) - this node is a cross-community bridge._ _High betweenness centrality (0.019) - this node is a cross-community bridge._
- **What connects `ALLOWED_ROLES`, `Pricing`, `ImageCropModalProps` to the rest of the system?** - **What connects `ALLOWED_ROLES`, `Pricing`, `ImageCropModalProps` to the rest of the system?**
_3964 weakly-connected nodes found - possible documentation gaps or missing edges._ _3967 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Community 0` be split into smaller, more focused modules?** - **Should `Community 0` be split into smaller, more focused modules?**
_Cohesion score 0.055152394775036286 - nodes in this community are weakly interconnected._ _Cohesion score 0.05200501253132832 - nodes in this community are weakly interconnected._
- **Should `Community 1` be split into smaller, more focused modules?** - **Should `Community 1` be split into smaller, more focused modules?**
_Cohesion score 0.028985507246376812 - nodes in this community are weakly interconnected._ _Cohesion score 0.028985507246376812 - nodes in this community are weakly interconnected._
- **Should `Community 2` be split into smaller, more focused modules?** - **Should `Community 2` be split into smaller, more focused modules?**
@@ -0,0 +1 @@
{"nodes": [], "edges": [], "skipped": "data json (non-object root)"}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+395 -315
View File
File diff suppressed because it is too large Load Diff
+8 -8
View File
@@ -3235,8 +3235,8 @@
"semantic_hash": "" "semantic_hash": ""
}, },
".claude/prompt/home-landing-copy-and-mobile.md": { ".claude/prompt/home-landing-copy-and-mobile.md": {
"mtime": 1782728407.085277, "mtime": 1783500476.9525328,
"ast_hash": "74dc4297980df3c07bcecef4d7f7cbdd", "ast_hash": "801ab916b94e47a5005e40475a05f341",
"semantic_hash": "" "semantic_hash": ""
}, },
".claude/prompt/split-db-redis-to-coolify-resources.md": { ".claude/prompt/split-db-redis-to-coolify-resources.md": {
@@ -3245,8 +3245,8 @@
"semantic_hash": "" "semantic_hash": ""
}, },
"docker-compose.yml": { "docker-compose.yml": {
"mtime": 1783497270.5667799, "mtime": 1783520508.741232,
"ast_hash": "5699cb42ee2d8d898b26e5fd01b9e17b", "ast_hash": "75c5d64fa9241dd92c5a0b9999f8241f",
"semantic_hash": "" "semantic_hash": ""
}, },
"docs/DEPLOY.md": { "docs/DEPLOY.md": {
@@ -3430,8 +3430,8 @@
"semantic_hash": "" "semantic_hash": ""
}, },
"data/seed/cities.json": { "data/seed/cities.json": {
"mtime": 1783499720.4733326, "mtime": 1783500944.1575975,
"ast_hash": "8fa9399cc8295b14436b9e0a7d8daa13", "ast_hash": "e55b9115a16a75a1b76f1cd57ea3f3c6",
"semantic_hash": "" "semantic_hash": ""
}, },
"data/seed/doctor_services.json": { "data/seed/doctor_services.json": {
@@ -3745,8 +3745,8 @@
"semantic_hash": "" "semantic_hash": ""
}, },
"docs/ops-restarts.md": { "docs/ops-restarts.md": {
"mtime": 1783497352.078513, "mtime": 1783520553.2990608,
"ast_hash": "e9c3240a7a86744c5e2d3119388c9119", "ast_hash": "8958131c497ddd30769e7f0ccdcbead9",
"semantic_hash": "" "semantic_hash": ""
}, },
"migrations/Version20260708083446.php": { "migrations/Version20260708083446.php": {
+1 -1
View File
@@ -22,7 +22,7 @@ stdout_logfile=/tmp/worker-async.log
[program:worker-scheduler] [program:worker-scheduler]
process_name=%(program_name)s_%(process_num)02d process_name=%(program_name)s_%(process_num)02d
command=sh -c "cd $ROOT && php bin/console messenger:consume scheduler_default --time-limit=3600" command=sh -c "cd $ROOT && php bin/console messenger:consume scheduler_default --time-limit=3600 --memory-limit=128M"
autostart=true autostart=true
autorestart=true autorestart=true
stopasgroup=true stopasgroup=true