2026-10-01 11:16:46 +03:30

ERP & PM Integrated Platform — Dockerized

سامانه یکپارچه تدارکات، انبارداری، مدیریت پروژه (PM) و ربات هوشمند

مجموعه نرم‌افزاری یکپارچه و خودکفا (Self-contained) شامل تمامی سرویس‌ها، ماژول‌ها و تنظیمات زیرساختی مورد نیاز برای اجرا در محیط توسعه و عملیات:

سرویس نام کانتینر فناوری / کاربرد پورت در دسترس
postgres procurement-postgres PostgreSQL 18 (دیتابیس مشترک procurement + casdoor) 5455:5432
minio procurement-minio MinIO Object Storage (S3-compatible) برای فایل‌ها و پیش‌فاکتورها 9000 (API), 9001 (کنسول)
casdoor procurement-casdoor ارائه‌دهنده متمرکز هویت سازمانی (OIDC Provider) 8080:8000
api procurement-api بک‌اند اصلی تدارکات و انبار (FastAPI + Asyncpg) 8000:8000
frontend procurement-frontend فرانت‌اند وب ERP (React 19 + Vite + Tailwind) سرو از طریق Traefik روی پورت 80
pm-api pm-api بک‌اند بومی مدیریت پروژه ساخت (FastAPI + Python 3.12) درون‌شبکه‌ای (زیرمسیر /pm/api)
pm-frontend pm-frontend فرانت‌اند پلتفرم PM (React 19 + تقویم شمسی + گانت + QC) سرو از طریق Traefik روی /pm
bot procurement-bot ربات هوشمند بله با پردازش صوت و متن (DeepSeek LLM + STT) ارتباط Long-polling با Bale
db-backup procurement-db-backup پشتیبان‌گیری خودکار زمان‌بندی‌شده از هر دو پایگاه داده کانتینر دوره‌ای در پس‌زمینه
traefik procurement-traefik ریورس پروکسی و مدیریت ترافیک لایه لبه (Traefik v3) 80 (HTTP), 443 (HTTPS)

🌐 معماری شبکه و هدایت ترافیک (Traefik Edge Routing)

                                  ┌────────────────────────┐
                                  │   Browser / Client     │
                                  └───────────┬────────────┘
                                              │ :80 / :443
                                              ▼
                                  ┌────────────────────────┐
                                  │    Traefik v3 (Edge)   │
                                  └───────────┬────────────┘
                                              │
         ┌────────────────────────────────────┼───────────────────────────────────┐
         │                                    │                                   │
         ▼ (Host: localhost)                  ▼ (PathPrefix: /pm)                 ▼ (Host: api.localhost)
┌───────────────────────┐            ┌───────────────────────┐           ┌───────────────────────┐
│   frontend (React)    │            │ pm-frontend / pm-api  │           │   api (FastAPI Core)  │
│  /api/* Proxy ───────┼────────────┼───────────────────────┼──────────►│  /api/v1/*            │
└───────────────────────┘            └───────────────────────┘           └───────────┬───────────┘
         │                                                                           │
         ├────────────────────────────────────┬──────────────────────────────────────┤
         ▼                                    ▼                                      ▼
┌───────────────────────┐            ┌───────────────────────┐           ┌───────────────────────┐
│  Casdoor OIDC (:8080) │            │   MinIO S3 (:9000)    │           │ PostgreSQL 18 (:5455) │
│  Host: auth.localhost │            │ Host: s3 / storage    │           │ procurement + casdoor │
└───────────────────────┘            └───────────────────────┘           └───────────────────────┘
                                              ▲
                                              │ ثبت پیش‌نویس استعلام
                                     ┌────────┴──────────────┐
                                     │ bot (Bale AI Agent)   │
                                     └───────────────────────┘

📁 ساختار پوشه‌ها و اجزای مخزن

ERP/
├── docker-compose.yml          ← پیکربندی اصلی اجرای کامل تمام سرویس‌های استک
├── docker-compose.prod.yml     ← لایه تنظیمات عملیاتی (Let's Encrypt و دامنه‌های رسمی)
├── docker-compose.coolify.yml  ← پیکربندی سازگار با استقرار بر روی Coolify
├── start.ps1                   ← اسکریپت هلپر پاورشل برای ساخت و اجرا
├── mc.cmd                      ← ابزار خط فرمان MinIO Client برای مدیریت باکت‌ها
├── README.md                   ← همین سند راهنما
├── backend/                    ← سرویس بک‌اند اصلی تدارکات و انبار (procurement-api)
│   ├── app/
│   │   ├── db/                 ← اتصال دیتابیس و توابع راه‌اندازی اسکیمای خودکار (init_db.py)
│   │   ├── models/             ← مدل‌های پایگاه‌داده (procurement, inventory, catalog)
│   │   ├── routers/            ← اندپوینت‌های API v1 (quotes, inventory, users, drafts, ...)
│   │   ├── schemas/            ← مدل‌های اعتبارسنجی Pydantic
│   │   ├── services/           ← منطق بیزینس (انبارداری، استعلام‌ها، ذخیره‌سازی، ...)
│   │   ├── utils/              ← ابزارهای امنیتی، خطایابی، ریت‌لیمیت
│   │   ├── auth.py             ← تایید توکن Casdoor و تفکیک دسترسی‌ها
│   │   ├── config.py           ← متغیرهای پیکربندی
│   │   └── main.py             ← اسمبلی برنامه FastAPI و میدل‌ورها
│   └── tools/                  ← اسکریپت‌های سیدینگ (seed_casdoor.py) و تست‌های دود (Smoke)
├── frontend/                   ← وب‌اپلیکیشن اصلی ERP (procurement-frontend)
│   ├── src/
│   │   ├── components/         ← کامپوننت‌های مشترک، لایه‌بندی و سوییچر پنل‌ها
│   │   ├── pages/
│   │   │   ├── Admin/          ← پنل مدیریت سامانه و همگام‌سازی کاربران
│   │   │   ├── Auth/           ← صفحه ورود و احراز هویت
│   │   │   ├── Dashboard/      ← کارتابل استعلام‌ها و تصمیم‌گیری خرید
│   │   │   ├── Inventory/      ← انبارداری (موجودی، ورود کالا، انتقال کارگاهی، کنترل روزانه)
│   │   │   ├── Organization/   ← ماتریس دسترسی پنل‌ها و انتساب پروژه‌ها
│   │   │   ├── Projects/       ← مدیریت پروژه‌های عمرانی
│   │   │   ├── Suppliers/      ← دسته‌بندی موضوعی و فهرست تأمین‌کنندگان
│   │   │   ├── Units/          ← سیستم کاتالوگ متریال‌ها، تامین‌کنندگان و ضرایب تبدیل
│   │   │   └── Wizard/         ← ویزارد مرحله‌ای ثبت استعلام (با اتصال مستقیم به پیش‌نویس ربات)
│   │   ├── store/              ← مدیریت وضعیت با Zustand
│   │   └── App.tsx             ← درخت روت‌ها، گیت‌های امنیتی پنل‌ها و نقش‌ها
├── pm/                         ← پلتفرم مدیریت پروژه و کنترل کیفیت (پلتفرم آرامش)
│   ├── backend/                ← بک‌اند مستقل PM (FastAPI, CPM Engine, QC Service)
│   ├── frontend/               ← فرانت‌اند PM (گانت چارت شمسی، WBS، ثبت عیوب و بازرسی)
│   ├── sql/                    ← اسکیما و اسکریپت‌های اختصاصی پایگاه داده PM
│   └── API_CONTRACT.md         ← قرارداد کامل اندپوینت‌های PM
├── bot/                        ← ایجنت هوشمند بله برای ثبت صوتی/متنی استعلام‌ها
│   ├── app/                    ← کلاینت Bale، پردازشگر STT صوتی، استخراج NLU با DeepSeek
│   ├── docs/SETUP.md           ← راهنمای راه‌اندازی و اتصال توکن بله
│   └── requirements.txt
├── monitoring/                 ← استک مانیتورینگ، متریک‌ها و لاگ‌ها (پرومتئوس، گرافانا، لوکی)
├── infra/                      ← تنظیمات وب‌هوک دیپلوی خودکار و کانفیگ‌های داینامیک Traefik
├── sql/
│   ├── migration.sql           ← اسکریپت اولیه پایه دیتابیس
│   └── 02-casdoor-db.sql       ← اسکریپت راه‌اندازی دیتابیس هویت Casdoor
└── tests/                      ← تست‌های یکپارچگی NLU و ویزارد استعلام

🔐 سیستم احراز هویت، ماتریس پنل‌ها و کنترل دسترسی (RBAC)

سامانه از سیستم احراز هویت Casdoor OIDC بهره می‌برد؛ ورود به صورت In-Page بوده و توکن JWT صادر شده توسط بک‌اند با JWKS اعتبارسنجی می‌شود.

مدل دسترسی سامانه بر پایه پنل‌ها (user_panels) بازطراحی شده است:

۱. لایه‌های دسترسی پنل‌ها

  • پنل تدارکات (procurement):
    • full: دسترسی کامل به کارتابل استعلام‌ها، تایید یا رد پیشنهادها، تامین‌کنندگان و قیمت‌ها.
    • limited: فقط امکان ثبت استعلام جدید در ویزارد برای پروژه‌های منتسب به کاربر (کاربر پس از ورود مستقیماً به /wizard یا /requester هدایت می‌شود).
  • پنل انبارداری (inventory):
    • full: مشاهده موجودی همه انبارها، رهگیری «کالاهای در راه» و کارتابل تایید رسید.
    • limited: فقط مشاهده و مدیریت انبارهای پروژه‌های تحت عضویت، همراه با دسترسی به ثبت تغییر موجودی کارگاهی (/inventory/change).
  • پنل مدیریت پروژه (pm):
    • دسترسی به مشاهده یا ویرایش تسک‌ها، چارت گانت، ثبت عیوب و فرم‌های QC در /panel/pm.

۲. قوانین و نقش سرپرست پروژه (supervisor)

  • کاربرانی با نقش supervisor تنها در صورتی مجاز به ورود به سامانه هستند که حداقل یک پروژه در جدول user_project_members یا projects.pm_user_id به آن‌ها منتسب شده باشد. در غیر این صورت، پیام عدم تخصیص پروژه نمایش داده شده و اجازه ورود نخواهند داشت.

🚀 راهنمای سریع راه‌اندازی محیط توسعه (Docker)

پیش‌نیازها

  • Docker Desktop (ویندوز) یا Docker Engine + Docker Compose Plugin (لینوکس)
  • حداقل ۴ گیگابایت فضای خالی دیسک و اتصال اینترنت برای بارگیری ایمیج‌های اولیه

دستورات اجرا

# ۱. رفتن به پوشه پروژه و ساخت/اجرای کانتینرها
docker compose up -d --build

# ۲. بررسی وضعیت سلامت سرویس‌ها
docker compose ps

تمام سرویس‌ها باید وضعیت Up و دیتابیس وضعیت (healthy) را نشان دهند.

درگاه‌ها و آدرس‌های محلی

بخش آدرس محلی توضیحات
رابط کاربری ERP http://localhost داشبورد اصلی سامانه
پلتفرم PM http://localhost/pm مدیریت پروژه و کنترل کیفیت (قابل دسترس در /panel/pm)
مستندات API (Swagger) http://localhost:8000/docs مستندات تعاملی اندپوینت‌های تدارکات
سلامت API http://localhost:8000/health/ready بررسی اتصال دیتابیس، Casdoor و MinIO
کنسول MinIO http://localhost:9001 نام کاربری و رمز پیش‌فرض: minioadmin / minioadmin
کنسول Casdoor http://localhost:8080 نام کاربری و رمز اولیه: admin / 123
پایگاه داده PostgreSQL localhost:5455 نام دیتابیس: procurement، کاربر: postgres

🤖 ربات هوشمند بله (procurement-bot)

ربات پیام‌رسان بله به عنوان یک سرویس اختصاصی درون شبکه فعال است:

  1. پیام صوتی یا متنی فرستاده شده از طریق هوش مصنوعی (DeepSeek NLU) و تبدیل صوت به متن پردازش می‌شود.
  2. قلم‌ها، متریال‌ها، پروژه‌ها و تامین‌کنندگان به صورت فازی جستجو و شناسایی می‌شوند.
  3. پیش‌نویس در جدول bot_drafts ذخیره شده و شناسه پیش‌نویس تولید می‌شود.
  4. کاربر می‌تواند با زدن دکمه روی بله یا مراجعه به لینک مستقیم: http://localhost/wizard?draft=<UUID> اطلاعات استخراج‌شده را در ویزارد فرانت‌اند مرور، تکمیل و نهایی کند.
  5. راهنمای تکمیلی تنظیم توکن در bot/docs/SETUP.md قرار دارد.

🔄 انتقال بین‌کارگاهی کالاها (project_transfers)

سامانه دارای سیستم ردیابی انتقال متریال بین کارگاه‌هاست:

  • ثبت انتقال از طریق صفحه «تغییر موجودی» با نوع انتقال بین کارگاهی.
  • وضعیت‌های انتقال: در حال انتقال (in_transit)، تحویل‌شده (received) و لغوشده (cancelled).
  • کارگاه مقصد از طریق زبانه «انتقالات ورودی» در صفحه «کالاهای در راه» اقلام ارسالی را دریافت و به انبارهای خود تخصیص می‌دهد.

🛠️ عملیات نگهداری و دیپلوی در سرور (Operations)

  • دیپلوی خودکار: سرور با هر Push به برنچ production از طریق وب‌هوک اختصاصی به صورت خودکار بیلد و بالا می‌آید. راهنمای کامل: docs/OPERATIONS.md.
  • پشتیبان‌گیری پایگاه داده: سرویس db-backup به صورت روزانه از هر دو پایگاه داده procurement و casdoor فایل‌های .dump تولید و در پوشه backups/ نگهداری می‌کند.
  • مانیتورینگ و مشاهده‌پذیری: ابزارهای Prometheus، لاگ‌های Loki و ردیابی خطاهای GlitchTip در پوشه monitoring/ سازمان‌دهی شده‌اند.
S
Description
No description provided
Readme
3.9 MiB
Languages
TypeScript 54.2%
Python 40.6%
PLpgSQL 2.5%
CSS 1.7%
PowerShell 0.6%
Other 0.2%