Giter VIP home page Giter VIP logo

taxi-infra's Introduction

taxi-docker

Production Service Docker-compose & CI/CD Outline Structure

service-structure

Setup

Build Images (for dev service)

$ docker build -t taxi-front:latest ./taxi-front
$ docker build -t taxi-back:latest ./taxi-back

Login to AWS ECR (for prod service)

See "Using Amazon ECR with the AWS CLI".

Add .env

Environments for dev service

# Required Environment variables
PROXY_PORT=
OG_PORT=
SESSION_KEY=
JWT_SECRET_KEY=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=

# Environment variables with default values
FRONT_IMAGE=666583083672.dkr.ecr.ap-northeast-2.amazonaws.com/taxi-front:dev
BACK_IMAGE=666583083672.dkr.ecr.ap-northeast-2.amazonaws.com/taxi-back:dev
OG_IMAGE=666583083672.dkr.ecr.ap-northeast-2.amazonaws.com/taxi-og-generator:dev
FRONT_URL=https://taxi.dev.sparcs.org
BACK_URL=https://api.taxi.dev.sparcs.org
IO_URL=https://api.taxi.dev.sparcs.org
OG_URL=https://og-image.taxi.dev.sparcs.org
S3_URL=https://sparcs-taxi-dev.s3.ap-northeast-2.amazonaws.com
AWS_S3_BUCKET_NAME=sparcs-taxi-dev

# Optional Environment variables
CHANNELTALK_PLUGIN_KEY=
KAKAO_SDK_KEY=
GA_TRACKING_ID=
FIREBASE_CONFIG=
SPARCSSSO_CLIENT_ID=
SPARCSSSO_CLIENT_KEY=
GOOGLE_APPLICATION_CREDENTIALS=
TEST_ACCOUNTS=
SLACK_REPORT_WEBHOOK_URL=
SLACK_WATCHTOWER_WEBHOOK=

Environments for prod service

# Required Environment variables
PROXY_PORT=
OG_PORT=
SESSION_KEY=
JWT_SECRET_KEY=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_S3_DUMP_BUCKET_NAME=

# Environment variables with default values
FRONT_IMAGE=666583083672.dkr.ecr.ap-northeast-2.amazonaws.com/taxi-front:latest
BACK_IMAGE=666583083672.dkr.ecr.ap-northeast-2.amazonaws.com/taxi-back:latest
OG_IMAGE=666583083672.dkr.ecr.ap-northeast-2.amazonaws.com/taxi-og-generator:latest
FRONT_URL=https://taxi.sparcs.org
BACK_URL=https://api.taxi.sparcs.org
IO_URL=https://api.taxi.sparcs.org
OG_URL=https://og-image.taxi.sparcs.org
S3_URL=https://sparcs-taxi-prod.s3.ap-northeast-2.amazonaws.com
AWS_S3_BUCKET_NAME=sparcs-taxi-prod
TEST_ACCOUNTS=["[email protected]","[email protected]"]

# Optional Environment variables
CHANNELTALK_PLUGIN_KEY=
KAKAO_SDK_KEY=
GA_TRACKING_ID=
FIREBASE_CONFIG=
SPARCSSSO_CLIENT_ID=
SPARCSSSO_CLIENT_KEY=
GOOGLE_APPLICATION_CREDENTIALS=
SLACK_REPORT_WEBHOOK_URL=
SLACK_WATCHTOWER_WEBHOOK=

Create named volumes to store persistent MongoDB data & logs, backend logs

$ docker volume create taxi-mongo-logs
taxi-mongo-logs
$ docker volume create taxi-mongo-data
taxi-mongo-data
$ docker volume create taxi-redis-data
taxi-redis-data
$ docker volume create taxi-back-logs
taxi-back-logs
$ docker volume create taxi-scheduler-logs
taxi-scheduler-logs

Compose up

make prod-up # for prod service
make dev-up # for dev service

Compose down

make prod-down # for prod service
make dev-down # for dev service

taxi-infra's People

Contributors

14kgun avatar chlehdwon avatar doyunshin avatar ptptsw avatar wanwanss avatar withsang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

taxi-infra's Issues

초대링크의 redirect 및 og-image, `taxi-proxy` 컨테이너에서 처리

Summary

초대링크를 Firebase의 다이나믹 링크로 redirect하는 로직을 taxi-front에서 처리하여
기존 방식은 클라이언트에서 불필요한 렌더링 후 redirect 되는 단점을 가지고 있습니다.

초대링크의 redirect 및 og-image를 taxi-proxy 컨테이너에서 처리하도록 수정합니다.

Docker Cache Problem

Summary

도커 캐시에 git clone이 저장되어 업데이트 되지 않는 문제를 해결합니다.

[Bug] JWT_SECRET_KEY 및 APP_URI_SCHEME 환경변수 주입 안 됨

Describe the bug

docker-compose.yml에 해당 환경변수들에 대한 매핑이 정의되어 있지 않아 taxi-back 컨테이너에 해당 환경변수가 주입되지 않습니다.
(@happycastle114 님 제보)

JWT_SECRET_KEY 환경변수가 없기 때문에, token generate 시 아래와 같은 오류가 발생합니다.

uncaughtException: secretOrPrivateKey must have a value
Error: secretOrPrivateKey must have a value
    at Object.module.exports [as sign] (/usr/src/app/node_modules/jsonwebtoken/sign.js:107:20)
    at Object.signJwt [as sign] (/usr/src/app/src/modules/jwt.js:21:16)
    at /usr/src/app/src/service/auth.js:139:39
    at /usr/src/app/node_modules/mongoose/lib/model.js:5095:18
    at processTicksAndRejections (node:internal/process/task_queues:78:11) Error: secretOrPrivateKey must have a value
    at Object.module.exports [as sign] (/usr/src/app/node_modules/jsonwebtoken/sign.js:107:20)
    at Object.signJwt [as sign] (/usr/src/app/src/modules/jwt.js:21:16)
    at /usr/src/app/src/service/auth.js:139:39
    at /usr/src/app/node_modules/mongoose/lib/model.js:5095:18
    at processTicksAndRejections (node:internal/process/task_queues:78:11)

To Reproduce

없음.

Screenshots

없음.

[Bug] 데이터베이스 덤프 버킷 변경

Describe the bug

기존에는 sparcs-taxi-prod 버킷에 데이터베이스 덤프 파일을 업로드하도록 설정되어 있었는데, 해당 버킷이 퍼블릭 액세스로 설정되어 있어 위험한 방법이라고 생각합니다.
다행히(?) IAM 권한 부족으로 인해 실제 덤프가 업로드되지는 않았습니다.
sparcs-taxi-prod-backup, sparcs-taxi-dev-backup 버킷을 만들어 백업을 진행하는 것은 어떨까요?

To Reproduce

프로덕션 서버에서 데이터베이스 S3 덤프를 시도하면 이 문제가 발생합니다.

Screenshots

없음.

`taxi-back` 서비스에 예상 택시비 관련 환경 변수 추가

Summary

taxi-back v2.2.11부터 네이버 Maps API의 Directions 5 서비스를 사용하여 사용자에게 예상 택시비를 제공할 수 있는 기능이 추가되었습니다. 이 기능은 NAVER_MAP_API_IDNAVER_MAP_API_KEY 환경 변수를 필요로 하므로, docker-compose.ymldocker-compose.dev.yml 파일에 두 환경 변수를 등록하고자 합니다.

`taxi-worker` 추가

Summary

채팅 전송 시 FCM 알림(sendMessageByTokens)을 비동기적으로 보내기 위해 BullMQ worker를 추가하였습니다.
해당 worker를 배포하기 위한 서비스를 docker compose 파일에 추가합니다.

Add volume mounts

Summary

DB 컨테이너의 /data/db 디렉토리(DB 데이터가 저장됨), 백엔드 컨테이너의 logs 디렉토리(백엔드 로그가 저장됨)를 컨테이너가 종료된 뒤에도 삭제되지 않게 하기 위해 Volume을 생성하여 해당 디렉토리들에 마운트합니다.

Tasks

  • 도커 Volume 생성 및 마운트

[Bug] `X-Forwarded-Proto` 헤더 설정 제거

Bug description

taxi-proxy nginx 컨테이너에서 X-Forwarded-Proto 헤더를 override하기 때문에 secure cookie와 rate limit이 의도한 대로 동작하지 않습니다.

  • secure cookie를 사용하려면 X-Forwarded-Proto 헤더 값이 "https"여야 하지만, 이 경우 "http"로 설정됩니다.

How to replicate

  • 로그인 시도 시 "invalid request" 오류가 반환됨
    • 로그인 시도 시 express에 최종적으로 보내지는 request의 X-Forwarded-Proto 헤더가 "http"로 설정되기 때문
    • 세션이 존재하지 않아 sparcs sso를 사용해 로그인할 수 없음(400 error - "SparcsssoCallbackHandler : invalid request"가 반환됨)

[Bug] `taxi-redis`에 data 볼륨 추가

Summary

taxi-redis 컨테이너에 /data 디렉토리를 docker volume에 바인딩합니다.
그렇지 않으면 redis 컨테이너가 재시작될 때 로그인 세션이 무효화됩니다(앱은 jwt를 사용해 해당 없음).

Watchtower scope 추가

Summary

하나의 서버에서 여러 SPARCS 서비스가 구동되는 상황을 대비하여, Wachtower에 scope를 추가합니다.

Create ChannelTalk plugin key environment variable

프론트엔드에서 채널톡 서비스를 사용할 수 있게 docker-compose.yml 파일에 채널톡 플러그인 키 환경변수(REACT_APP_CHANNELTALK_PLUGIN_KEY)를 추가하려고 합니다.

FCM token-topic pair 주기적으로 삭제

FC
https://firebase.google.com/docs/cloud-messaging/manage-tokens#unsubscribe_stale_tokens_from_topics

Summary

토큰이 주기적으로 만료되기 때문에, FCM에서는 1-2달에 한 번씩 토픽에 구독된 토큰들을 삭제하는 것을 권장하고 있습니다.
택시 데이터베이스의 topicsubscriptions 컬렉션에 각 토큰이 구독된 토픽과 구독 시각이 저장되기 때문에, 이 정보를 사용하여 주기적으로 구독한 지 1-2달이 된 토큰들을 구독 해제하는 기능이 taxi-scheduler에 필요합니다.
이 과정에서 Firebase Admin SDK가 필요하면, node-cron 같은 걸 써서 taxi-scheduler를 쉘 스크립트 대신 node 스크립트로 개편하는 것도 좋겠다고 생각합니다.

Tasks

  • 오래된 token-topic pair를 구독 해제할 수 있는 taxi-scheduler 기능 추가

[Bug] dev 서버에서 SPARCS SSO 로그인 불가

Describe the bug

dev 서버( taxi.dev.sparcs.org )에서 SPARCS SSO 계정을 이용한 로그인이 불가능합니다.
dev 서비스의 경우 SPARCS TEST 계정만 로그인할 수 있는데, 해당 계정은 KAIST 학번을 가지고 있지 않아 로그인이 불가능합니다.
이를 우회하기 위해 taxi-back에는 NODE_ENV 환경변수가 "development"인 경우 학번 여부를 검사하지 않지만, 현재 taxi-docker에서는 백엔드 서버를 무조건 "production" 환경으로 실행하는 문제가 있습니다.

To Reproduce

생략.

Screenshots

생략.

`taxi-proxy` 다시 만들기

Summary

taxi-fronttaxi-back을 같은 host로 배포하기 위해 taxi-proxy 컨테이너를 다시 도입합니다.

Tasks

  • taxi-infra 컨테이너 도입
  • 개발용 서버에서 테스트

nginx 버전 가리기

Summary

kaist 도메인을 사용하는 웹페이지는 서버 버전을 노출하면 안 됩니다.
nginx 설정을 수정하여 웹서버의 버전이 노출되지 않게 합니다.

taxi-back과 taxi-og-generator를 taxi-nginx 컨테이너로부터 분리

Summary

현재 main 브랜치에 배포된 taxi-infra의 구조에서는 사용자의 모든 요청이 taxi-nginx 컨테이너를 거쳐 taxi-front 컨테이너나 taxi-back, 또는 taxi-og-generator 컨테이너로 전달됩니다.
7/19 회의에서 taxi-front의 정적 빌드 파일만 taxi-nginx 컨테이너를 통해 서빙하고 taxi-back과 taxi-og-generator 서버는 별도로 두기로 결정했기에, 결정된 사항을 taxi-infra에 반영합니다.

Tasks

  • taxi-nginx 컨테이너에서 taxi-back 컨테이너와 taxi-og-generator 컨테이너로 요청이 전달되는 라우팅 규칙 제거
  • taxi-nginx 컨테이너에서 /invite 주소로 오는 요청을 "빈 html 파일"을 서빙하는 것으로 대체하기
    * "빈 html 파일"의 역할:
    1. html head에 방 정보를 담은 og-image 주소를 가지고 있음(taxi-og-generator가 서빙되는 host와 일치해야 함)
    2. 자바스크립트 실행 시 deeplink로 리다이렉트됨

간단한 cpu/메모리 사용량 집계 스크립트 작성

Summary

AWS 배포 시 사용할 인스턴스 사양을 결정하기 위해, 기존 물리 서버에서 taxi 컨테이너들의 cpu, 메모리 사용량을 csv 파일로 수집하는 스크립트를 작성합니다.
샘플링 주기가 중요한데, 일단 5초로 해보고 모니터링에 의한 cpu 사용량이 늘어나면 주기를 늘려볼 수 있습니다.

임시로 사용하는 스크립트라 main 브랜치에 머지될 필요는 없습니다.

Todos

  • 쉘 스크립트 및 docker-compose 파일 작성
  • 배포

Notes

5초마다 로그를 수집하면 매일 약 6.3MB의 로그 파일이 생성됩니다. 무시할 수 있는 용량입니다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.