heojae / FoodImageRotationAdmin

Food Image Rotation (음식이미지 회전) 이라는 주제에 대해서. 실제로 딥러닝(deeplearning)을 어떻게 도입하고, 이를 API(backend)로서 서버에 올리며, 웹(frontend) 를 통해서 올리는 과정을 구현하기 위해서 만든 프로젝트입니다.
0 stars 0 forks source link

Docker 를 통한 컨테이너화 구현 구상 #44

Open heojae opened 3 years ago

heojae commented 3 years ago

대주제 : 도커를 통해서, 이때까지 만들어 왔던 것들을 도커라이즈화 하면서 구현하고 싶다.

소주제 : BackendFrontend 부분을 Docker 로 컨테이너화를 하고 싶고, 그에 대한 구상을 정리하고 싶다.

현재 상황

우선, backend, frontend, deeplearning, proto 모두, release-0.1 버젼까지는 구현을 완료한 상태입니다.

backendfrontend 이 두가지를 대상으로 컨테이너화를 할 예정입니다.

결과로 나온 이슈 : https://github.com/heojae/FoodImageRotationAdmin/issues/43#issuecomment-791501187


현재 상황 - Backend

  1. 서버를 실행 시키기 위해서, 켜야 하는게 너무 많다.

    전체적으로, 서버를 실행을 시키기 위해서는 user, model version, dl, dataset, media(static) , redis

    총 6개의 서버를 켜서 작업을 해왔는데, 이를 docker-compose를 통해서, 효율화를 해줄 필요가 있다.

  2. DBsql lite 에서, mysql 로 각각의 DB 를 만들어줄 필요가 있다.

    현재, 개발용으로 간편하게 바로 고치기 위해서, sql alchemysql lite3DB 를 구현하였지만,

    이제는 각각의 port 번호를 매핑을 하여, 각각의 mysql 을 구현해줄 필요가 있다.

현재 상황 - Frontend

  1. build 된 파일들을 전송해줄 필요가 있다.

    npm run build 를 통해서, 생성된 파일들을 보내주어야 하는데,

    python3 -m http.server 3000 을 통해서, 단순하게 보낼수는 있겠지만,

    nginx 를 통해서, 이를 구현해두고 싶다.


앞으로의 구현 예상도 - Backend

  1. proto 파일들을 생성한 상태에서 올린다.

    user, model version, dl, dataset 서버들에서도,

    proto 파일들을 생성할 때, app.py에서, import absolute_path 가 맞지 않으므로, proto 파일들을 생성하고,

    import 경로까지 완벽하게 맞게 설정되었다고 생각하고 접근한다.

  2. 각각의 DB 를 생성한다.

    uesr -> /mysql Docker file 연결

    model version -> /mysql Dockerfile 연결

    dataset-> /mysql

  3. static 파일 serve

    dataset-> nginx(static file serving)

  4. redis 서버

    user -> redis-server 를 구현해야한다.

전체적인 Docker Config 설정

아래 처럼 서로 연동될 수 있도록, 설정을 하고 진행한다. 기존의 설정과 거의 차이가 안나는 형태로 진행하여, 간단하게

settings = DockerSettings() or DevSettings() 을 바꾸는 정도에서 간편하게 선택할 수 있도록 한다.

class DockerSettings(BaseSettings):
    env: str = "prod"

    user_api_listen_port: str = "[::]:50051"
    dl_api_listen_port: str = "[::]:50052"
    model_version_api_listen_port: str = "[::]:50053"
    dataset_api_listen_port: str = "[::]:50054"
    media_server_listen_port: str = "[::]:50050"

    user_api_listen_addr: str = "api-user:50051"
    dl_api_listen_addr: str = "api-dl:50052"
    model_version_api_listen_addr: str = "api-model_version:50053"
    dataset_api_listen_addr: str = "api-dataset:50054"
    media_server_listen_addr: str = "nginx-media"

    user_db_end_point: str = "mysql://root:fira_user_password@mysql-user/fira_user"
    model_version_db_end_point: str = "mysql://root:fira_model_version_password@mysql-model_version/fira_model_version"
    dataset_db_end_point: str = "mysql://root:fira_dataset_password@mysql-dataset/fira_dataset"
    redis_end_point: str = "redis://redis-server:6379/0?encoding=utf-8"

    token_header: str = "access_token"
    access_token: str = "f9e4a020-6bfd-11eb-8572-0800200c9a66"

    # api_user 에만 필요한 정보
    admin_email: str = "admin@naver.com"
    admin_password: str = "1234"
    admin_profile_image: str = "admin/profile.jpg"

앞으로의 구현 예상도 - Frontend

npm run build 를 기반으로 생성된, 파일들을 nginx 를 통해서, 전달되는 형태로 구현할 예정입니다.