글

Django + ASGI + Docker 적용하기.

 Django + ASGI + Docker 적용하기. 지금까지 Django wsgi + uWSGI 를 사용하다가 장고 3.0 버전에서 ASGI 서버를 지원하게 되면서 그것에 대해 코드 적용 및 발생 하는 이슈에 대해서 적을까 합니다. 1. Gunicorn worker hanging issue docker 내부에서 gunicorn 사용할때 worker가 가동되는데 그 워커의 tmp directory가  /tmp 로 docker 내부에 있는 overlay 스토리지 타입으로 되어있어서,  docker 내에서 gunicorn worker 가동시 blocking 걸릴수도 있음. 따라서 gunicron 의 worker tmp directory path를 세팅해줌으로써 worker 가 hanging 걸리는 이슈 해결 gunicorn --worker-tmp-dir /dev/shm ....  2. uvicorn --relaod 사용시 high cpu usage uvicorn high cpu 의 경우 reload 사용시 모든 폴더 및 파일을 watching 하고 있어서 이슈가 발생. reload-dir을 어플리케이션 directory 로 세팅해주면  high cpu usage 이슈는 해결됨. 기존에 45% 까지 사용하던 CPU Usage가 25%까지 줄어들었음. uvicorn --reload-dir /app 3. too slow response Application 의 경우는 Django 3.1 을 사용해서 Async view만 적용 되어, ORM 쪽은 async 로직이 아직 적용 안되어있는 상태 따라서 DJANGO_ALLOW_ASYNC_UNSAFE 세팅 필요. settings.py 에 해당 라인 추가 os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" 그리고 지금 Application의 경우 graphql을 사용하고 있는데, 거기에 제공하는 playgorund를 통해 테스트 진행. 그리고 gun...

Axios request 사용시 self signed certificate chain Error

이미지
 기존에 Axios를 통해 request 를 요청하던중 self signed certificate chain 에러가 발생해서 코드가 다운 되는 이슈가 발생했습니다. 해당 이슈에 대해 확인 해보던 중에 알게 된 사실은 OpenSSL 이슈라는 걸 확인해서 찾아보던 중에 해결 방법으론 2가지가 있는데  1. axios instance 생성시에 httpsAgent 세팅을 통해서 해결 하는 방법 2. NODE_TLS_REJECT_UNAUTHORIZED Environment 세팅을 통해 해결     NODE_TLS_REJECT_UNAUTHORIZED=0 REFERENCES https://github.com/axios/axios/issues/535

Docker build시에 특정 라인 캐싱 제거하기.

이미지
 Docker 빌드 시에 특정 라인 캐싱 제거하기. Docker compose를 사용해서 여러개의 container를 동일한 Dockerfile 파일을 사용해서 만들때, ARGS에 따라서 다르게 빌드 되어야하는 경우, 캐싱처리로 인해서 올바르게 동작하지 않는 이슈가 발생하였습니다. 그래서 이 이슈를 해결 하기 위해 사용했던 방법에 대해서 적을까 합니다. --no-cache Argument 추가하기. docker build시에 --no-cache 추가하면 기존에 캐시 되는 Docker image를 제거 할수 있음. CACHEBUST Argument 사용하기. no-cache의 경우는 모든 Docker image cache를 제거 해서 파일은 업데이트 되는데 필요 없는 라인까지 업데이트 되는 경우가 발생.  CACHEBUST를 사용할 경우 해당 라인 밑에 있는 docker command에 대해서 캐시 처리 없이 항상 실행 됨. 저의 경우 barbel-node 를 사용하는데 그때 CACHEBUST를 추가해서 항상 코드가 업데이트 되도록 세팅함.

June Leetcode

2020/06/15 Cheapest Flights Within K Stops week-2-june-8th-june-14th Which language are used python3 How to solving Graph를 만들고, BFS를 사용해서 Graphql를 순회하면서 min_price를 찾고, 리턴하는 방식으로 개발함. Code class Solution: def findCheapestPrice(self, n: int, flights: List[List[int]], src: int, dst: int, K: int) -> int: # dp = value, step n = len(flights) dp = collections.defaultdict(list) for u, v, w in flights: dp[u].append((v, w)) queue = [] queue = [(src, 0, 0)] min_price = 100000 while len(queue): cur, queue = queue[0], queue[1:] cur_dst, cur_price, cur_step = cur if cur_dst == dst: min_price = min(min_price, cur_price) continue if cur_step<=K and cur_price<=min_price: for d, price in dp[cur[0]]: queue.append((d, price + cur_price, cur_step + 1)) ...

Ruby EBS Platform에서 webpacker not found 이슈 해결하기.

이미지
이번에 적어볼 내용은 Elastic Bean Stalk(EBS) 에서 webpacker not found 이슈 해결하기. 해당 내용을 적는 이유는 기존에 rails를 EBS ruby 2.6 버전에서 작업후 배포 하는 중에 webpack을 찾을수가 없다는 이슈가 발생하였고, 해결하기 위해 log를 찾아보던 중에 기존에 EBS instance에 설치 되어있는 노드 버전이 6으로 설정 되어있어 특정 패키지가 설치 되지 않아서 서버가 동작하지 않는 이슈였습니다. 그 후 구글을 통해 많은 검색을 해서 Node version을 업데이트 하는 스크립트를 찾아서 작성을 했습니다. 이게 초반에 구글을 통해 작성해서 넣었던 스크립트 내용입니다. TODO      EBS Container 스크립트를 통해 Node 업데이트하기. VERSION 1 아래 보시는 스크린샷이 초반에 노드 버전을 container에서 업데이트 하기 위한 초기 스크립트 입니다.  간단하게 설명 드리면 스크립트에 대해서 설명 해 드리면 Node를 curl을 통해 다운받아서 yarn 을 통해 nodejs와 yum을 업데이트 하는 스크립트 입니다. 해당 스크립트 사용시에도 여전히 node version이 업데이트 되지 않는 이슈가 있었습니다. RESULT     FAILURE DEBUG 해당 이슈에 대해 확인해보니  container를 통해서 12버전의 node를 다운 받았더라도,  yum -y install nodejs command 실행시에 기존에 다운 받은 6버전과 충돌 이 발생해 여러개의 repository가 있어서 업데이트 할수 없다는 이슈였습니다. VERSION 2 Version1에서 발생한 이슈를 해결 하기 위해 container에서 node 설치시에 기존에 설치 되어있는 nodesource repo를 제거 하고 배포하는 방식으로 변경하였습니다. 해당 내용은 기존에 node repo를 다운받기 전에 nodesource-re...

GitLab에서 dependatbot 연동하기.

이미지
GitLab에서 dependency 관리하기. 개인 프로젝트에서 github을 사용하고 있는데, 어느날 github을 통해 어느날 dependency 이슈가 될수 있거나,  오래 되서 업데이트가 필요한 libary에 대해서 알람 및 자동 PR까지 만들어서 알려주는 서비스가 있어서 이걸 gitlab에 적용하는 과정을 적을까 합니다.  그렇게 어렵지는 않고,  순서대로 따라만 하면 됩니다.  이걸 통해서 오래된 lib에 대한 변경을 조금이라도 빠르게 하면 좋겠네요. 요구사항 * gitlab access_token * forked  dependabot   project * dependency를 체크할 gitlab project 실행 순서 * dependatbot 프로젝트 fork해서 내 gitlab에 project 생성하기 * 내 계정 세팅에서 access_token 생성하기. * dependabot을 통해 생성된 프로젝트로 가서 settings/variables에 GITLAB_ACCESS_TOKEN 환경변수 세팅하기 * CI/CD에서 scheduler 생성하기. 프로젝트 생성하기 dependabot에서 사용할 gitlab access token 생성하기 dependabot에서 gitlab 환경 변수 세팅하기. scheduler에서 dependabot에서 사용할 환경 변수 세팅하기. TIPS 저의 경우에는 프로젝트 root에 있지 않고, 폴더 안에 package.json 파일이 있어서 찾아보니, 밑에 문서에는 없지만 DIRECTORY_PATH 라는 variable 세팅을 통해서 원하시는 폴더로 접근이 가능합니다. 저는 아래 링크를 참고해서 작업하였습니다. https://bobbybouwmann.nl/blog/dependabot-on-gitl...

Next.js 프로젝트 Firebase에 hosting 배포하기.

이미지
Next.js 프로젝트 Firebase에 배포하기. Why i Wrote This Posts 지난번 Apps script를 사용해서 Firebase 에 디비 연결하기 포스트에 이어서  이번에 Frontend로 사용한 Next.js를 Firebase에 배포하는 작업에 대해서 적을까 합니다.  이 방법은 정말 배포에 대해서만 말하고 있어서, 내용이 짧을수도 있을것 같습니다. 이 내용에 대해서 적는 이유는 저처럼 삽질을 하는사람이 적었으면 하는 바람에서 적습니다. How to work about next.js to deploy to firebase 이 글을 적기 전에 Next.js를 Firebase에 배포하기를 구글에 찾아보면 Firebase 에 있는 Function을 통해서 Next에 연결할수 있는 API를 만들고, hosting에서는 rewrite로 hosting으로 요청이 왔을 경우에 API로 redirect하는 형태로 배포가 진행 됩니다. Step Create Firebase Function Create Firebase Hosting use dummy `public` folder When attached hosting API Redirect to Function API Endpoint 이유는 기존에 react 의 다르게 `next build` 를 통해서 빌드시에 html 파일을 만들지 때문에 static file만 지원하는 firebase hosting에서는 파일을 읽을수 없다는 이슈가 나옵니다. 그래서 유명한 github 프로젝트에서도 public/ 폴더를 강제로 만들어주고,  거기안에 의미 없는 html 파일을 하나 넣어줘서 해결하였습니다. 이렇게 할 경우 API와 static에 대한 처리를 둘다 할수 있다는 장점이 있지만, 저의 경우에는 배포도 느려지고,  설정도 복잡해져서 제가 사용할려고 설치한 deps 들을 잘 찾지...