Skip to content

سند پیکربندی پروژه

1. مرور کلی پروژه

1.1 ساختار پروژه

این پروژه معماری میکروسرویس‌ها را اتخاذ کرده و به دو بخش تقسیم شده است: سیستم مدیریت و سیستم API:

  • سیستم مدیریت: عملکردهای مدیریت بک‌اند را ارائه می‌دهد، از جمله پیکربندی سیستم، مدیریت کاربر، نظارت داده، کنترل دسترسی و غیره.
  • سیستم API: سرویس‌های رابط خارجی را ارائه می‌دهد، درخواست‌های کلاینت را پردازش می‌کند و منطق کسب‌وکار را پیاده‌سازی می‌کند.

1.2 پشته فنی

  • زبان بک‌اند: زبان Go
  • فریم‌ورک وب: فریم‌ورک منبع باز go-zero
  • پایگاه‌داده: MySQL
  • حافظه: Redis
  • ذخیره فایل: ذخیره شیء پشتیبانی از پروتکل S3
  • احراز هویت: JWT (JSON Web Token)
  • کنترل دسترسی: Casbin

2. آیتم‌های پیکربندی اصلی

2.1 پیکربندی سرویس پایه

yaml
# اطلاعات سرویس پایه
Name: upgradelink-admin  # نام سرویس، برای شناسایی نمونه‌های مختلف سرویس استفاده می‌شود
Host: 0.0.0.0            # آدرس گوش‌دهی سرویس، 0.0.0.0 به معنی گوش‌دهی بر روی تمام رابط‌های شبکه است
Port: 9110               # پورت گوش‌دهی سرویس

# پیکربندی عملکرد سرویس
Timeout: 300000          # زمان درخواست (میلی‌ثانیه)
MaxBytes: 1073741824     # حداکثر اندازه بدنه درخواست (بایت)، در اینجا 1GB

2.2 پیکربندی محیط اجرا

yaml
Mode: dev                # حالت اجرا: dev (توسعه)، test (آزمایش)، prod (production)
EnvMode: dev             # حالت محیط، مشابه Mode، برای متمایز کردن پیکربندی‌های مختلف محیط‌ها استفاده می‌شود

2.3 پیکربندی ذخیره فایل

ذخیره فایل از سرویس‌های ذخیره شیء پروتکل S3 پشتیبانی می‌کند. پس از پیکربندی، می‌توانید بارگذاری فایل‌ها را در سیستم بک‌اند آزمایش کنید (مدیریت فایل ابر -> بارگذاری).

yaml
UploadConf:
  Bucket:       # نام سطل ذخیره
  SecretID:     # شناسه کلید دسترسی سطل ذخیره
  SecretKey:    # کلید دسترسی سطل ذخیره
  Endpoint:     # نقطه پایانی سطل ذخیره
  Folder:       # پوشه سطل ذخیره
  Region:       # منطقه سطل ذخیره
  CdnUrl:       # دامنه CDN، پس از پیکربندی پیشوند URL ذخیره شیء را جایگزین می‌کند

توجه: پس از پیکربندی CdnUrl، سیستم به طور خودکار پیشوند URL ذخیره شیء را با دامنه CDN جایگزین می‌کند و URL جایگزین شده را در پایگاه‌داده ذخیره می‌کند، در نتیجه از CDN برای تسریع دسترسی به فایل استفاده می‌شود.

2.4 پیکربندی احراز هویت

yaml
Auth:
  AccessSecret: jS6VKDtsJf3z1n2VKDtsJf3z  # رمز доступ JWT، برای امضای و تأیید توکن‌ها استفاده می‌شود
  AccessExpire: 259200                     # زمان انقضای توکن JWT (ثانیه)، در اینجا 3 روز

2.5 پیکربندی CORS

yaml
CROSConf:
  Address: '*'  # منابع کراس دامنه مجاز، * به معنی مجاز کردن تمام منابع است

2.6 پیکربندی لاگ

yaml
Log:
  ServiceName: UpgradeLink-admin  # نام سرویس لاگ
  Mode: file                      # حالت خروجی لاگ: console یا file
  Encoding: json                  # فرمت رمزگذاری لاگ: json یا console
  TimeFormat: "2006-01-02 15:04:05.000"  # فرمت زمان لاگ
  Path: "./logs"                  # مسیر ذخیره فایل لاگ
  Level: debug                    # سطح لاگ: debug، info، warn، error
  KeepDays: 3                     # روزهای نگهداری فایل لاگ
  Rotation: daily                 # روش چرخش لاگ: daily یا size

2.7 پیکربندی کنترل دسترسی

با استفاده از Casbin برای پیاده‌سازی مدیریت دسترسی RBAC (Role-Based Access Control):

yaml
CasbinConf:
  ModelText: |
    [request_definition]
    r = sub, obj, act
    [policy_definition]
    p = sub, obj, act
    [role_definition]
    g = _, _
    [policy_effect]
    e = some(where (p.eft == allow))
    [matchers]
    m = r.sub == p.sub && keyMatch2(r.obj,p.obj) && r.act == p.act

2.8 پیکربندی پایگاه‌داده

yaml
DatabaseConf:
  Type: mysql                    # نوع پایگاه‌داده
  Host: 127.0.0.1                # آدرس میزبان پایگاه‌داده
  Port: 3306                     # پورت پایگاه‌داده
  DBName: upgrade                # نام پایگاه‌داده
  Username: root                 # نام کاربر پایگاه‌داده
  Password: Rootroot123!         # رمز عبور پایگاه‌داده
  MaxOpenConn: 100               # حداکثر تعداد اتصالات باز
  SSLMode: disable               # حالت SSL: disable یا require
  CacheTime: 5                   # زمان کش (ثانیه)
  MysqlConfig: "&loc=Asia%2FShanghai"  # پیکربندی اضافی MySQL، در اینجا تنظیم منطقه زمانی به شانگهای

2.9 پیکربندی Redis

yaml
RedisConf:
  Host: 127.0.0.1:6379  # آدرس میزبان Redis و پورت
  Db: 0                 # شماره پایگاه Redis
  Pass: a123456         # رمز عبور Redis

3. بهترین روش‌های مدیریت پیکربندی

3.1 جداسازی محیط

  • محیط توسعه: از پایگاه‌داده و Redis محلی استفاده کنید، لاگ‌های دقیق را فعال کنید
  • محیط آزمایش: از پایگاه‌داده آزمایش استفاده کنید، پیکربندی محیط تولید را شبیه سازی کنید
  • محیط تولید: از پایگاه‌داده رسمی استفاده کنید، لاگ‌های debug را غیرفعال کنید، پیکربندی امنیتی را تقویت کنید

3.2 ملاحظات امنیتی

  • اطلاعات حساس (مانند رمز عبور، کلیدها) نباید در فایل‌های پیکربندی کدگذاری شوند، توصیه می‌شود از متغیرهای محیطی یا مرکز پیکربندی استفاده کنید
  • محیط تولید باید از پروتکل HTTPS استفاده کند
  • کلیدها و رمز عبور را به صورت منظم به‌روزرسانی کنید
  • دامنه دسترسی پایگاه‌داده و Redis را محدود کنید

3.3 بهینه‌سازی عملکرد

  • پارامتر MaxOpenConn را بر اساس بار سرویس تنظیم کنید
  • زمان کش را به طور معقول تنظیم کنید تا دسترسی به پایگاه‌داده کاهش یابد
  • سطح لاگ را بهینه‌سازی کنید، از سطح debug در محیط تولید اجتناب کنید
  • فایل‌های لاگ را به صورت منظم پاک کنید تا از کمبود فضای دیسک جلوگیری شود

4. مثال فایل پیکربندی

مثال کامل فایل پیکربندی به شرح زیر است:

yaml
# پیکربندی سرویس پایه
Name: upgradelink-admin
Host: 0.0.0.0
Port: 9110
Timeout: 300000
MaxBytes: 1073741824

# پیکربندی محیط اجرا
Mode: dev
EnvMode: dev

# پیکربندی احراز هویت
Auth:
  AccessSecret: jS6VKDtsJf3z1n2VKDtsJf3z
  AccessExpire: 259200

# پیکربندی CORS
CROSConf:
  Address: '*'

# پیکربندی لاگ
Log:
  ServiceName: UpgradeLink-admin
  Mode: file
  Encoding: json
  TimeFormat: "2006-01-02 15:04:05.000"
  Path: "./logs"
  Level: debug
  KeepDays: 3
  Rotation: daily

# پیکربندی ذخیره فایل
UploadConf:
  Bucket: 
  SecretID: 
  SecretKey: 
  Endpoint: 
  Folder: 
  Region: 
  CdnUrl: 

# پیکربندی کنترل دسترسی
CasbinConf:
  ModelText: |
    [request_definition]
    r = sub, obj, act
    [policy_definition]
    p = sub, obj, act
    [role_definition]
    g = _, _
    [policy_effect]
    e = some(where (p.eft == allow))
    [matchers]
    m = r.sub == p.sub && keyMatch2(r.obj,p.obj) && r.act == p.act

# پیکربندی پایگاه‌داده
DatabaseConf:
  Type: mysql
  Host: 127.0.0.1
  Port: 3306
  DBName: upgrade
  Username: root
  Password: Rootroot123!
  MaxOpenConn: 100
  SSLMode: disable
  CacheTime: 5
  MysqlConfig: "&loc=Asia%2FShanghai"

# پیکربندی Redis
RedisConf:
  Host: 127.0.0.1:6379
  Db: 0
  Pass: a123456

toolsetlink@163.com