سند پیکربندی پروژه
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 # حداکثر اندازه بدنه درخواست (بایت)، در اینجا 1GB2.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 یا size2.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.act2.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 # رمز عبور Redis3. بهترین روشهای مدیریت پیکربندی
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