기존의 오래된 프레임워크에 익숙해진 나머지, 최신 기술에 대한 적응력이 떨어지게 되었다. 이에 웹 서비스의 개발, 구축, 배포까지 익숙해지고 최신 프레임워크 및 아직 많이 사용하는 프레임워크를 공부하고자 이번 프로젝트를 기획하게 되었다. 이를 통해 최신 기술을 습득하고, 실무에 적용할 수 있는 능력을 배양하며, 포트폴리오를 강화하는 것을 목표로 하고 있다.
개요
- 프로젝트명 : Cloud Mini
- 개발기간 : 24-07-08 ~ 24-08-08 (1month)
- 핵심내용 : 서버 호스팅 및 도메인 서비스가 있는 기능 확장이 용이한 클라우드 플랫폼
- 개발에 사용된 기술 스텍: React.js, Java, Spring boot, Docker, Shellscript, Ubuntu, Git , MySQL, Typescript, Axios, SCSS
규칙
- 개발 일지
- 하루에 한번 개발 일지를 작성한다.
- 초심자에게 가르친다는 생각으로 나중에 봐도 이해하기 쉽게 작성
- 명령어를 사용할땐 명령어의 특정 인자값을 왜 사용했는지, 이 인자는 무엇을 뜻하는지 상세하게 정리
- 실패했던 항목이 있을 경우 문제를 해결하기 위해 시도했던 것, 원인 및 해결 방법 상세하게 작성
- 코드
- 모든 코드는 타입힌트와 주석을 작성
- 변수 이름은 스네이크 케이스 (snake_case)
- 함수 이름은 카멜 케이스 (camelCase)
- 클래스 이름은 파스칼 케이스 (PascalCase)
- 커밋
- 명확하고 간결하게 작성, 변경 사항을 잘 설명
- 한국어로 작성
- 예시: “사용자 인증 기능 추가”
사업을 하면서 파이썬, PHP, 바닐라 Javascript 등에 너무 익숙해져서 취업이 걱정이라 이번 프로젝트를 시작하기로 했다.
프론트는 많이 쓰이는 React.js, 백엔드는 Spring boot를 가장 많이 쓰는 것 같아서 한번 공부해보고자 이렇게 정했다.
Docker도 개인 취미로는 몇번 써봤는데 아직 익숙치 않아서, 활용해보고자 VPS 호스팅 서비스를 만들기로 결정했다.
전체적인 그림으로는 GCP, AWS와 비슷한 클라우드 플랫폼을 만들어보고자 하고 있고, 시간이 없기 때문에 도메인 관리, 호스팅(도커 컨테이너)을 해주는 기능만 구현하기로 했다.
회원이 가입하고 호스팅을 생성하면, 카페24 등의 호스팅 서비스처럼 기본 제공 도메인을 하나씩 제공해주고(username.edix.studio), 기본 제공 도메인을 기본 모드, 고급 모드로 나누어 관리 할 수 있게 하고 Let’s Encrypt 인증서 발급 및 갱신까지 자동화 시킬 예정이다.
리액트 개발서버의 도메인을 별도로 설정한 후 개발하고, 빌드하면 아파치 리버스 프록시를 이용하여 연결할 예정이다.
백엔드는 스프링으로 구축되며, 사용자의 상호작용에 따라 쉘 스크립트를 실행하여 도커 컨테이너를 생성하고 아파치를 조작한다.
사용자가 신규 호스팅을 생성하면 G Cloud Shell로 서브 도메인 생성하고, 컨테이너의 포트를 매핑하여 해당 도메인으로 들어오면 리버스 프록시로 연결해준다.
사용자가 사용자의 개인 도메인 사용 시 Cloud DNS에 영역을 추가하여 네임서버를 연결시키고, 확인되면 레코드를 대신 관리할 수 있게 한다.
도메인 관리
기본 모드
- 컨테이너에 연결
- IP 연결(A 레코드 변경과 유사)
- 도메인 연결 (CName 레코드와 유사)
- 인증서 발급(자동)
고급 모드
- 내 도메인 연결(Google 네임서버 활용)
- 내 도메인 인증서 발급
- DNS 레코드 관리(NS 변경은 제공하지 않을 예정)
VPS 호스팅 관리
- 우분투 컨테이너 제공
- Apache, PHP, Mysql, 워드프레스 기본 제공
- 서브넷은 제공하지 않으며, 도메인 관리에서 자신의 도메인을 컨테이너에 연결할 수 있게 함
프로젝트 구조는 우선 아래의 디렉토리 구조처럼 생각하고 있다.
디렉토리 구조
- Cloud-Mini
- docker-compose.yml
- spring_app/
- src/
- main/
- java/
- studio.edix/
- cloud-mini
- CloudMini.java
- controller/
- model/
- repository/
- service/
- cloud-mini
- studio.edix/
- resources/
- application.properties
- java/
- main/
- pom.xml
- src/
- react_app/
- build/
- public/
- src/
- components/
- App.tsx
- index.tsx
- Dockerfile
- pakage.json
- tsconfig.json
- mysql/
- Dockerfile
- container/
- 미리 만들어진 유저 컨테이너 이미지(Apache, PHP, Mysql이 설치된 우분투)
- apache_conf/
- user_conf/
- {userID}_{num}.conf
- 유저 가상호스트 설정 파일 (유저가 추가한 도메인에 프록시를 위해 필요, SSH, 웹 도메인 등)
- vhost_template.conf #vhost 추가 템플릿
- user_conf/
- backup/
- mysql/
- container/
- mysql_container_20240708.tar
- …
- master/
- mysql_master_20240708.sql
- …
- container/
- apache/
- apache_20240708.tar.gz
- …
- mysql/
- log/
- cloud-mini-start.sh
- cloud-mini-stop.sh
- cloud-mini-update.sh
- cloud-mini-restart.sh
- config.json
- install.sh
- backup.sh
- restore.sh