## 서버 이중화 구성 방안

보드의 운영 환경을 참고하실 수 있도록 기본적으로 구성되는 운영환경을 다음과 같이 소개합니다.

![Application Deployment Diagram](./images/application-deployment.png 'Application Deployment Diagram')

- Operato Board는 수평 스케일링이 가능한 구조로 설계가 되어 있습니다. 수평 스케일링은 어플리케이션에 요구되는 부하량이 커져서 하나의 서버에서 감당해야 하는 CPU와 메모리의 사용량이 초과될 경우 추가적인 서버를 증설함으로서 해결하는 방식이며 스케일 아웃(Scale Out)이라도 표현합니다.
- Operato Board는 데이터의 일관성을 위해서 하나의 데이터베이스에 한 개 이상의 Operato Board가 연결되는 구조를 통해서 멀티 인스턴스 운영이 가능합니다.

#### 데이터베이스

- 보드의 보든 기반 데이터와 생성되는 보드 데이터들을 보관하고 있습니다.
- 기본적으로 Postgres(12 이상) 혹은 Oracle (12c 이상)을 사용 가능합니다.
- 데이터베이스의 영속성과 안정성을 유지하기 위해서 클러스터링 혹은 주기적인 데이터 백업을 통해서 데이터 손실을 최소화합니다.
- 데이터베이스 관련 설정은 config.production.js 설정 파일에 ormconfig 부분을 수정합니다.
  ```javascript
  {
  ...
  ormconfig: {
    name: 'default',
    type: 'postgres',
    host: '192.168.0.100',
    port: 5432,
    database: 'postgres',
    username: 'postgres',
    password: 'xxxxxxxx',
    synchronize: true,
    logging: false
  },
  ...
  }
  ```
  다음 스케줄러의 설정도 데이터베이스 환경에 따라 변경합니다.
  ```yaml
  database:
    type: postgres
    host: 127.0.0.1
    port: 55432
    id: postgres
    pw: abcd1234
    db: postgres
  ```

#### 로드밸런서

- 여러 보드 인스턴스에 트래픽을 분산하기 위해서 어플리케이션 앞단에 위치해서 사용자 요청을 분산하는 역할을 수행합니다.
- NGINX나 혹은 클라우드 플래폼에서 제공하는 다양한 타입의 로드밸런서를 활용 가능합니다.
- 로드밸런서는 별도의 managed 혹은 manual 방식의 certificate 서비스를 통해서 https 서비스 제공이 가능합니다. 대표적으로 AWS Certificate Managger 혹은 GCP Managed Cerficate Service가 있습니다. 혹은 수동으로 인증서를 생성해서 서비스할 수 있는 방법도 있습니다. 참고로 다음과 같은 서비스들을 참고하세요.
  - [NGINX Configuring HTTPS servers](https://nginx.org/en/docs/http/configuring_https_servers.html)
  - [Create an HTTPS listener for your Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html#add-https-listener)
  - [Application Load Balancer overview](https://cloud.google.com/load-balancing/docs/application-load-balancer?hl=ko)

#### 스케줄러

- 보드의 시나리오에서 제공하는 스케줄링 기능을 활성화하기 위해서 필요한 서비스입니다.
- 보드에서 사용하는 데이터베이스와 동일한 데이터베이스를 사용 가능합니다.
- 스케줄러 또한 보드와 마찬가지로 수평 스케일링이 가능한 구조를 가지고 있습니다.

#### 첨부파일

- Operato Board에서 보드 생성 시에 포함되는 다양한 이미지, 비디오, 소리 파일들을 저장하는 기능입니다.
- 하나의 인스턴스를 사용할 경우 로컬 파일 저장을 통해서 해결 가능하지만, 스케일링 아웃 기능을 고려해서 여러 인스턴스가 동시에 접근 활용할 수 있는 저장 공간이 필요합니다.
- 이러한 조건을 만족하도록 활용 가능한서비스들은 다음과 같습니다.
  - 네트워크 파일 시스템(NFS): 특정 공유 폴더 위치를 지정해서 첨부 파일 저장에 사용할 수 있습니다.
  - AWS S3 서비스: Amazon Web Service 중 하나인 S3를 첨부 파일 저장에 사용할 수 있습니다.
  - 데이터베이스: 위의 서비스 사용이 불가할 경우, 데이터베이스를 통해서 대용량 파일들을 저장할 수 있습니다.
