프로젝트 구성 문서
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 (프로덕션)
EnvMode: dev # 환경 모드, Mode와 유사, 다른 환경에 대한 구성을 구분하는 데 사용2.3 파일 저장 구성
파일 저장은 S3 프로토콜을 지원하는 객체 저장소 서비스를 지원합니다. 구성 후 백엔드 시스템에서 파일 업로드를 테스트할 수 있습니다 (클라우드 파일 관리 -> 업로드).
yaml
UploadConf:
Bucket: # 저장 버킷 이름
SecretID: # 저장 버킷 액세스 키 ID
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 (역할 기반 액세스 제어) 권한 관리를 구현합니다:
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 # Redis 비밀번호3. 구성 관리 모범 사례
3.1 환경 분리
- 개발 환경: 로컬 데이터베이스 및 Redis를 사용하고, 상세한 로그를 활성화합니다
- 테스트 환경: 테스트 데이터베이스를 사용하고, 프로덕션 환경 구성을 시뮬레이션합니다
- 프로덕션 환경: 공식 데이터베이스를 사용하고, 디버그 로그를 비활성화하고, 보안 구성을 강화합니다
3.2 보안 고려 사항
- 비밀번호, 키와 같은 민감한 정보는 구성 파일에 하드 코딩하지 않고, 환경 변수 또는 구성 센터를 사용하는 것이 권장됩니다
- 프로덕션 환경에서는 HTTPS 프로토콜을 사용해야 합니다
- 정기적으로 키와 비밀번호를 업데이트합니다
- 데이터베이스 및 Redis의 액세스 범위를 제한합니다
3.3 성능 최적화
- 서비스 부하에 따라
MaxOpenConn매개변수를 조정합니다 - 데이터베이스 액세스를 줄이기 위해 캐시 시간을 합리적으로 설정합니다
- 프로덕션 환경에서 디버그 레벨을 사용하지 않도록 로그 레벨을 최적화합니다
- 디스크 공간 부족을 방지하기 위해 정기적으로 로그 파일을 정리합니다
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