본문 바로가기

개발 이야기/실무 Recipe

(11)
가장 빠른 머신러닝 앱 배포하기 | fastapi, gunicorn, nginx 로 lightsail에 배포하기 가볍고 빠르게 구축하거나 실행할 수 있는 모듈들로 머신러닝 앱을 배포해보자. fast api, uvicorn, gunicorn, nginx, lightsail fast api fastapi는 가볍고 높은 퍼포먼스를 낼 수 있으며 ASGI 서버를 지원하는 모던 웹 프레임워크다. ML 프로젝트는 데이터, 패키지만 있으면 다른 디펜던시가 필요없으므로 이것저것 설정해야하는 django보다는 가벼운 fastapi를 사용하면 빠르고 쉽게 앱을 build할 수 있다. 마이크로소프트, 넷플릭스와 같은 대형 서비스에서도 ML 프로젝트를 fastapi로 빌드했다고 한다. uvicorn uvloop, httptools를 사용해 가볍고 빠른 ASGI 서버를 구현할 수 있다. gunicorn과 함께 사용하려면 uvicorn w..
konlpy + fastapi Docker Image로 머신러닝 환경 구축하기 konlpy에서 자바를 사용하기때문에 우분투 이미지를 베이스로, java와 python이 함께 깔려있어야 한다. 첫 설정에 어려움이 많아 docker image로 만들어 허브에 올려놓았다. Docker Hub Docker Hub hub.docker.com 필요 조건 - requirements.txt (docker 내에서 uvicorn으로 실행하므로 uvicorn은 꼭 있어야 한다) 실행 - 도커 이미지 가져오기 docker pull roseline124/konlpy-fastapi - 컨테이너 실행 docker run -d --name -p 80:80 roseline124/konlpy-fastapi dockerfile FROM ubuntu:latest LABEL maintainer="roseline124 ..
AWS LightSail에서 Docker 설치하기 | 설치 오류 해결 용량 파악하기 lightsail에서 플랜을 바꾸려면 스냅샷을 생성하고 새 인스턴스를 생성해야 한다. 메모리가 낮은 상태에서 docker를 올리면 인스턴스가 뻗어버리므로 로컬에서 먼저 도커 컨테이너를 띄워보고 얼마나 용량을 차지하는지 확인한다. docker ps -a CONTAINER ID IMAGE NAME COMMAND CREATED STATUS PORTS c8c71bb80138 elasticsearch elastic_container "/bin/tini -- /usr/l…" 3 days ago Up 3 days 0.0.0.0:9200->9200/tcp, 9300/tcp docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK..
여러 개의 docker-compose 파일 사용하기 | multiple docker-compose files db와 엘라스틱서치 컨테이너를 같은 docker-compose 파일에서 띄우면 둘 중 하나만 다운시키고 싶을 때 *문제가 될 수 있다. docker-compose up 으로 컨테이너를 따로 띄울 수는 있지만 docker-compose down은 특정 컨테이너만 다운시킬 수 없기 때문이다. 그러므로 docker-compose 파일을 따로 분리해서 관리한다. *엘라스틱서치의 인덱스가 날아가거나, dump 떠놓은 로컬 DB가 날아간다거나. 큰 문제는 아니지만 다시 작업하기 귀찮다. docker-compose에서 default로 읽을 수 있는 파일 이름은 docker-compose.yml 과 docker-compose.override.yml 이다. 다른 이름의 docker-compose 파일을 사용하려면 -f ..
Zapier로 Google Form과 Slack 연동하기 | 구글 폼 응답 올 때마다 슬랙 알림 오게 하는 방법 휴먼 올빼미 우리 서비스는 구글 폼으로 서비스 피드백을 받고 있다. 그리고 그걸 기획자분이 매일 아침에 체크해서 새로운 응답이 있으면 슬랙에 올리곤 했다. 올리는 사람이 귀찮아하지 않으면 사실 이렇게 해도 상관 없...지 않았다. 1. 바로 알림을 받지 못한다. 만약 아침에 체크한 후 바로 그 다음에 피드백이 온다면? 그날 업무 시간 안에 처리할 수 있었는데 다음 날에 처리하게 된다. 2. 기획자는 올빼미가 아니다! 사실 그전부터 피드백이 들어올 때마다 사람이 아니라 봇이 알려주면 좋겠다고 생각했다. 별 것 아닌 것 같지만 자동화 가능한 영역이고, 기획자는 알림봇이 아니기 때문이다. 북마크가 안된다는 피드백은 업무 시간이 끝난 이후에 올라와서 1번 문제에는 해당이 안되지만, 만약 더 심각한 상황이었다면 ..
github action cache 하기 | 매번 build 하신다고요? 이번 포스팅은 쇼핑몰 컨셉이다. 빰빠빠. 빰빠빰. 빠라 빠라바라 빠밤밤. 이런! github action이 한 두개가 아니라고요? action을 돌릴 때마다 너무 느려 답답하다고요? 그런 당신을 위해 준비했습니다! 브금 dependency, build caching하는 방법, 절찬리 공개 중! 자, 지금부터 제가 소개할것은 그리 대단한것은 아니지만 엄청난 걸 소개해드리려고 합니다! actions/cache 액션을 사용해서 캐싱하는 방법입니다. 자, 아래의 코드를 보시죠! name: Caching with npm on: push jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Cache node modules us..
git으로 함께 일하기 | merge 전략, PR, 커밋 컨벤션 내가 속한 팀은 신생 팀이고 팀 단위의 git 전략은 딱히 존재하지 않았다. release log를 남기기 위해 커밋 컨벤션을 만들어놓은 정도였다. 사내 다른 개발자들의 브랜치 머지 전략, 커밋 로그 컨벤션 등을 보고 팀원들에게 제안해 적용해보았다. 브랜치 머지 전략 🧚‍♀️참고: https://moonsupport.oopy.io/f8a56d78-1425-4987-9a34-30ed30885d2c 군데군데 merge commit이 섞여 있어서 히스토리를 매끄럽게 알기 어렵다. 그래서 PR을 머지할 때 push 브랜치와 base 브랜치에 따라 머지 전략을 다르게 하기로 했다. 현재는 merge commit이 사라지고 의미있는 커밋들만 남아서 히스토리가 깔끔해졌다. 1. develop(or stage) → m..
[GraphQL] Connection, Edge, Node Graphql Schema를 짤 때 List를 가져오는 쿼리의 Payload에 Connection이라는 이름을 본 적이 있을 것이다. List를 List라 부르지 못하고 왜 Connection이라고 부르는 걸까? infinite scroll을 구현하려고 구글을 서핑하던 도중 Apollo 블로그에서 이와 관련된 글을 읽게 되었다. 왜 Connection이라는 이름을 쓰고, 어떤 경우에 사용하는지 살펴보자. *Apollo Blog 글: www.apollographql.com/blog/explaining-graphql-connections-c48b7c3d6976/ *SitePoint 글: www.sitepoint.com/paginating-real-time-data-cursor-based-pagination/..
[실무레시피] 자바스크립트로 바코드 이미지 생성하기 | JsBarcode, bwip-js 오늘 요리해볼 실무 레시피는 '자바스크립트로 바코드 이미지 생성하기'입니다~ 👏 (두둥) PIN 번호와 같은 상품 번호로 바코드를 만들 수 있습니다. ISBN, QR code를 만드는 데도 응용하실 수 있습니다. github.com/metafloor/bwip-js github.com/lindell/JsBarcode lindell/JsBarcode Barcode generation library written in JavaScript that works in both the browser and on Node.js - lindell/JsBarcode github.com bwip-js는 사이즈가 너무 크니까 서버에서만 써주세요. 클라이언트에서 써야하신다면 JsBarcode를 쓰는 게 더 가볍고 간단합니다. ..
[slack-bot] incoming webhook 만들기 incoming webhook을 사용하면 슬랙 외부에서도 특정 채널에 메시지를 보낼 수 있다. webhook으로 메시지를 보내려면 JSON 데이터와 함께 http request로 요청하면 된다. 이때, text만 보내거나 'attachments'라고 하여 그냥 text보다 더 구조적인 데이터를 보낼 수 있다. 아래 사진에서 빨간색 줄로 표시된 *블록이 attachments이다. *block: slack document에서 많이 보게 될 용어이다. 메시지의 구성 요소 하나하나를 말한다. slack에서 block마다 사용할 수 있는 필드들이 정해져있다. block kit builder를 사용하면 메시지 템플릿도 고를 수 있고, 어떻게 block을 만들어야 하는지 확인할 수도 있다. 1. 앱 생성 - api...