minio

minio는 오브젝트 스토리지로 기존 클라우드에서 사용되는 S3와 동일한 호환성을 제공하는 프로젝트이다.
오픈소스로 공개되어 개발되고 있는 minio는 간단한 도커 환경 배포부터 실 서비스를 위한 프러덕션 환경에도 대응이 가능하다고 한다.
https://github.com/minio/minio

GitHub - minio/minio: MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.

MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license. - minio/minio

github.com

 
오브젝트 스토리지를 사용하기 위해 공식 문서을 읽어보던중 간단하게 도커로 배포가 가능하여 시도해보았다.
 
배포 및 사용을 꽤하면서 알게된 사실이지만 도커로써의 노드 확장을 사실상 불가능인거 같다. 
과거에 지원햇지만 지금은 지원하지 않는거 같구 추가적인 디스크 확장이나, 디스크 추가 등과 같은 작업은 minio의 구조때문인지 불가능하고 확장을 위해선 노드를 추가하여 다중노드다중디스크 시스템으로 결국 가야한다. 다만 이럴경우 리눅스 배포나 쿠버네티스 배포를 사용하여 배포를 진행해야 추가적인 확장이 가능한거같다.
 

minio docker 배포

아무튼 minio를 간단하게 도커를 활용하여 서비스를 올리기 위해 디스크 4장을 준비하였다.
8TB 4장을  공식문서에서 권장하는데로 xfs으로 디스크 포맷을 진행 후 도커컴포즈를 작성하였다.
 
다음은 사용할 docer-compose.yml 구성이다

version: '3'
services:
  minio:
    image: quay.io/minio/minio:latest
    command: server /data{1...4} --console-address ":9001"
    container_name: minio
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: 12341234!
      CONSOLE_DEV_MODE: "on"
    restart: always
    #shm_size: '1gb'  # default는 64MB
    ports:
      - "9002:9000"    # minio 서비스 포트
      - "9001:9001"    # minio 콘솔 포트
    volumes: 
     - /mnt/bay0/minio_disk1:/data1  # 버킷 데이터 저장소 위치
      - /mnt/bay1/minio_disk2:/data2  # hdd2
      - /mnt/bay2/minio_disk3:/data3  # hdd3
      - /mnt/bay3/minio_disk4:/data4  # hdd4
      - ./minio:/root/.minio # 컨테이너 실행 데이터 위치

 
 MINIO_ROOT_USER: admin
 MINIO_ROOT_PASSWORD: 12341234!
 
부분에 원하는 루트 아이디 및 비밀번호 로 설정하여 생성 및 저장 후 
docker compose up -d 
를 통해 배포 실행
웹페이지(9001) 에 접속하여 세팅을 진행한다.

 
별도 인증서를 적용하여 https를 사용하고자 할경우  다음과 같은 인증서 파일 생성이 필요하다.

  • https://github.com/minio/certgen/releases/ 설치 후 인증서 생성=>(certgen -host "127.0.0.1, localhost")
  • 생성된 두개의 파일을 minio의 실행데이터폴더의 cert 폴더에 저장(구현한 서버 환경에서는 /home/keti/docker/minio/minio/certs/ 경로로 두개파일 저장)
  • 파일 저장후  도커 컨테이너 다시 시작 및 적용 
  • 적용 후 https로 접속

버킷 생성

좌측 메뉴에서 Buckets 클릭, 우측 상단 Create Bucket 클릭하여 버킷 정보 입력 창으로 이동

 
 
버킷 이름과 추가 설정 후 Create Bucket을 클릭하여 버킷 생성
 
 

 

사용자생성

  • 좌측 메뉴에서 Identity -> Users를 클릭하여 우측 상단 Create User 클릭
  • User 이름과 비밀번호, 기타 권한 옵션을 설정 후 유저 생성
     
     
    접근키 생성(코드에서 버킷에 저장된 파일 다운로드/업로드, minio간의 동기화에 사용됨)
    • 좌측 메뉴에서 Access Keys 클릭 후, 우측 상단 Ceate access key클릭
    • 자동으로 생성된 Access Key와 Secret Key를 메모장에 복사 후 저장하여 관리

 
minio 을 사용하여 기존 분석 코드등에서 보다 손쉽게 데이터 사용이 가능하다

와일드카드 ssl 인증서 적용하기
 
기존에 사용중이던 역방향 프록시를 활용중에 시놀로지등에 인증서를 변경해주기 위하여 구상
nginx proxy manager를 사용하여 인증서를 갱신을 진행하고 있었으며 해당 인증서는 와일드 카드 인증서를 사용하려다 보니 시놀로지 혹은 다른 npm 서버에 적용하고자 하였다. 
 
 
1. npm와 클라우드플레어를 이용하여 인증서 갱신
클라우드 플레어의 api토큰을 발급 후 npm에 연결하면 자동으로 3개월마다 갱신
 
2. 동기화 프로그램을 이용하여 갱신된 인증서 파일을 각각의 필요한 서버로 업로드 진행
 
3. 업로드된 인증서를 이용하여 서버에 적용 스크립트 작성!
 
3-1. ex)시놀로지 서버에 적용할떄 
 
1) 수동적용

개인키privacy.pem
인증서cert.pem
중간 인증서chain.pem
인증서와 중간인증서 묶음full chain.pem

 2) 자동 적용
 

'Sever > DevOps' 카테고리의 다른 글

S3 호환 스토리지 minIO 간단 구축  (0) 2023.07.30
Dockerfile을 이용한 컨테이너 이미지 빌드  (0) 2022.10.31

각종 프로젝트를 도커로 빌드 하다가 까먹어서 작성

 

Dockerfile을 통하여 추후 젠킨스 등 으로 배포 자동화를 시도해볼 수 있다.

 


Dockerfile 

스프링부트 프로젝트dockrfile

# FROM azul/zulu-openjdk:11-latest
FROM azul/zulu-openjdk-alpine:11-latest
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar

# EXPOSE 8080 #npm으로 연결
ENTRYPOINT ["java","-jar","/app.jar"]

 

FROM 이미지이름

베이스가 되는 원하는 이미지를 기입한다.

 


Dockerfile을 통한 빌드

 

터미널에서 도커로 이미지 빌드

해당 폴더의 dockerfile을 참조하여 빌드해준다.

대문자가 이미지 이름에 포함될경우 빌드 불가능하다!!

 

docker build --tag 이미지이름:latest .

 

도커 이미지 Tar로 저장, 로드

이미지를 DockerHub나 개인 Harbor같은걸 쓰면 좋겠지만 귀찮을땐 파일째 옮기는것이 편할때가 있다.

 

도커이미지 저장

docker save -o tar파일이름 이미지이름:latest

 

도커이미지 로드

docker load -i tar파일명

 

학교 수업간 유니티를 이용하여 간단한 게임을 만들어보던 중 랭킹서버용으로 랭킹API 장고로 아주 간단하게 제작하기로 생각하여 제작하였습니다.

 

해당 글에서는 장고를 통한 reat-api, JWT, 도커를 통한 배포 등을 다루었습니다

 


 

 

저는 API통신을 위한 부분을 만들기 위해 rest api를 제작할수 있는  rest framework를 이용하여 제작하였습니다.

 

https://www.django-rest-framework.org/

 

Home - Django REST framework

 

www.django-rest-framework.org


장고 앱의 모델 구성

#프레임워크
from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from django.http import Http404
#데어터 처리
from .models import GameRank
from .serializers import GameRankSerializer


# Create your views here.
#GET,POST 부분
class GameRankAPI(APIView):
    
    #list
    def get(self, request):
        gameRankList = GameRank.objects.all() #질의할 쿼리생성
        print(gameRankList)
        serializer = GameRankSerializer(gameRankList, many=True)
        return Response(serializer.data)
    
    #새로운 랭킹 작성
    def post(self, request):
        serializer = GameRankSerializer(data = request.data)
        if serializer.is_valid(): #유효성 검사
            serializer.save() #저장
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


#하나씩 조회
class GameRankDetail(APIView):
    #해당 객체 가져오기
    def get_object(self, pk):
        try:
            return GameRank.objects.get(pk=pk)
        except GameRank.DoesNotExist:
            raise Http404

    #가저온 객체를 이용 출력
    def get(self, request, pk, format=None):
        gameRankObject = self.get_object(pk)
        serializer = GameRankSerializer(gameRankObject)
        return Response(serializer.data)

    #수정
    def put(self, request, pk, format=None):
        gameRankObject = self.get_object(pk)
        serializer = GameRankSerializer(gameRankObject, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    #삭제
    def delete(self, request, pk, format= None):
        gameRankObject =  self.get_object(pk)
        gameRankObject.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

 

장고에는 Viewset이 있어 이를 활용하여 구현하였다.

 

 

유니티에서 로그인을 하기위해 rest api를 통한 로그인을 구현해야한다.

따라서 토큰방식을  사용하기로 결정 하고 진행하였다.

 

https://ssungkang.tistory.com/entry/Django-Token-%EC%9D%B8%EC%A6%9D-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0-TokenAuthentication

 

[Django] Token 인증 적용하기, TokenAuthentication

DRF 에서 지원하는 인증은 다음과 같습니다. rest_framework.authentication.SessionAuthentication rest_framework.authentication.BasicAuthentication rest_framework.authentication.TokenAuthentication 초기..

ssungkang.tistory.com

 


외부 DB 연결

 

pip install mysqlclient

연결 어댑터 설치

 

DB연결에 연결후 DB생성을 manager.py를 통해 진행


도커를 통한 서비스 배포

도커 데스트탑 설치, 프로젝트에 Dockerfile 제작

 

docker build -t name .

빌드 후 

 

도커 허브 업로드 하여 공개 할수없으므로 별도 tar로 제작 

docker save dfdf

 

https://www.leafcats.com/240

 

docker image를 tar 파일로 저장 (export / import / save / load)

docker build나 commit으로 만들어진 이미지는 일반적으로 docker hub와 같은 registry에 push되고, 이를 다시 pull 받는 방식으로 사용된다. 하지만, 간혹 docker 이미지를 registry를 거치지 않고 이동해야 할..

www.leafcats.com

 

 


API통신간 크롬등 브라우저에서의 보안상의 이유로 외부 도메인에 대한 호출을 차단한다.

해당 차단을 풀기위해선 같은 도메인으로 서비스를 제공하거나 서버측에서 접속하는 도메인을 화이트리스트로 허용해주면 사용이 가능하다 아래는 참고링크이다.

 

https://jahong.tistory.com/entry/CORSCross-Origin-Resource-Sharing%EC%99%80-Django

 

CORS(Cross-Origin Resource Sharing)와 Django

CORS란 무엇인가? CORS(Cross-Origin Resource Sharing)란 웹 페이지 상의 제한된 리소스를 최초 자원이 서비스된 도메인 밖의 다른 도메인으로부터 요청할 수 있게 허용하는 구조이다(위키백과). 모노리틱

jahong.tistory.com

 

 

 

//일단 기록용

 

서버가 존재하는 곳의 네트워크 라우팅 정보를 openvpn서버(도커로 운영)에 추가해준다.

터미널에 명령어 를 아래와 같이 자신의 네트워크 환경에 맞게 수정해주고 추가

ovpn_genconfig -N -d -p "route 192.168.35.0 255.255.255.0"

 

 

 

그리고 서버 재부팅

 

그리고 ovpn 파일에서 redirect-gateway def1 을 지우던가 주석처리 후 접속하면 서버에 추가한 경로만 vpn을 통해서 접속된다.

 

시놀로지 vpn서버에서는  redirect-gateway def1   만 지우면 됬는데 안되서 찾아보고 기록

시스템에 설치된 모든 패키지를 업데이트 하지 않고 OS의 보안 패치만 적용하는 명령어

sudo apt-get update

sudo apt-get install unattended-upgrades

sudo unattended-upgrade

+ Recent posts