Configuration

운영 서버 및 DB 환경 설정 방법을 설명하는 문서입니다.

개요

kono 서비스를 운영하기 위해 원격 서버에 띄워야 할 것들로는 MySQL (MariaDB) 데이터베이스, kono-api API 서버, 아두이노 장치 데이터를 중계해줄 kono-judge 서버, 그리 HTTP 요청을 kono-front 프론트엔드 페이지와 API 서버로 중계해줄 수 있는 nginx 서버가 있습니다.

kono 에서는 서비스를 쉽게 배포하고 일정한 환경을 유지하기 위해, 그리고 AWS 원격 서버의 sudo 권한을 사용하지 않고 업데이트를 진행하기 위해 docker를 사용하고 있습니다. maintainer 컨테이너에 SSH으로 접속하여 다른 컨테이너의 소스 코드를 업데이트하고, 로그를 볼 수 있습니다.

이 문서에서는 서버 환경을 설정하기 위한 과정만 설명하고, Dockerfile, docker-compose.yml 등의 구조는 설명하지 않습니다. 프로젝트 구조를 개선하고 싶다면 직접 공부하세요 bb

스테이지 서버

배포 환경은 GitHub Repository의 production branch를 기준으로 하고 있습니다. 개발 중인 feature에 대해 배포 중인 서비스를 이용하여 테스트할 수는 없으므로, 배포 환경과 동일한 환경의 stage server를 만들어 놓았습니다. Stage 서버는 master branch의 소스 코드를 기반으로 하고 있습니다. Stage 서버는 dev.kono.sparcs.org URL에 연결되어 있으며, 운영 서버와 동일한 host에서 동작하고 있지만 서로 다른 docker container에 분리되어 있습니다.

상세

Service

Base Image

Port

db_production

mariadb:10.1.41-bionic

db_dev

mariadb:10.1.41-bionic

3306:3306

api_production

node:12

nginx_production

nginx:1.17.4

api_stage

node:12

nginx_stage

nginx:1.17.4

nginx_general

nginx:1.17.4

80:80

judge

python:3.8.1

maintainer

ubuntu:16.04

8022:22

준비물

  • Configuration files

    • 데이터베이스 root 비밀번호, API에서 사용하는 JWT secret 등의 정보는 container에 저장하지 않고 host machine에 보관합니다. Docker secret을 통해 숨겨야 하는 값들을 image나 container에 보관하지 않고 보호되는 host에 유지할 수 있습니다.

    • File structure는 아래와 같이 구성하면 됩니다. 각 파일의 내용은 openssl rand --base64 16 > [file_name]과 같이 아무 string으로 만들면 됩니다. (이미 존재하는 운영 서버를 옮겨오는 경우 적어도 config/production/api_password_key 값은 동일하게 구성해야 합니다.)

  • Database migration

    • 이미 존재하는 MySQL database로부터 옮겨오는 경우, 기존 DB의 데이터를 volume으로 올려 이 환경에서 만드는 새로운 DB에서 사용할 수 있도록 해야 합니다.

    • 원래 DB에서 mysqldump command를 실행하여 dump를 가져옵시다.

컨테이너 생성하기

프로젝트 파일을 받아옵니다.

Configuration directory를 프로젝트 directory 아래에 추가합니다.

데이터베이스 dump가 있는 경우, db/config/schema.sql 을 그 파일로 대체합니다.

이미지를 빌드합니다.

빌드한 이미지로부터 container를 생성합니다.

작동 확인

브라우저로 서버에 HTTP로 접속하면 프론트엔드 페이지가 올라와야 하며, GET /api 엔드포인트로 접속하면 kono-api production server 메시지가 response로 돌아와야 합니다.

Maintainer 사용자 설정

maintainer는 다른 컨테이너의 소스 코드를 업데이트하고 로그를 볼 수 있습니다. Host에 권한이 없어도 이 컨테이너에 접속할 수 있도록 하기 위해 maintainer 컨테이너에서 SSH Daemon을 열어 놓고, host의 8022번 포트와 mapping이 되어 있습니다. 143.248.234.0/24 IP 대역에서 8022번 포트로 이 컨테이너에 접속할 수 있습니다.

Dockerfile-maintainer를 보면 알 수 있듯, 기본적으로 sysopwheel 사용자가 생성되어 있습니다. (둘 모두 sudoer 계정입니다.) 그러나 --disabled-password 옵션을 주고 생성되었기 때문에, 컨테이너가 생성된 후 host에서 root user로 접속하여 비밀번호를 직접 설정해 주어야 합니다.

이를 위해서는,

위 명령으로 host에서 컨테이너에 직접 접속한 후 passwd 명령 등으로 비밀번호를 바꾸어 주면 됩니다.

이제 원격(143.248.234.0/24)에서 컨테이너에 접속할 수 있습니다.

maintainer 컨테이너에서 배포 및 로그를 보는 방법에 관해서는 management 문서를 참고하세요.

Management

Last updated

Was this helpful?