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 (프로덕션)
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 또는 size

2.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.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를 사용하고, 상세한 로그를 활성화합니다
  • 테스트 환경: 테스트 데이터베이스를 사용하고, 프로덕션 환경 구성을 시뮬레이션합니다
  • 프로덕션 환경: 공식 데이터베이스를 사용하고, 디버그 로그를 비활성화하고, 보안 구성을 강화합니다

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

toolsetlink@163.com