Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
0dc0e39
refactor: 에디터 unsaved 뱃지 제거
pkh0106 Jan 8, 2025
7aa8272
refactor: websocket 디렉토리 내부 setField 모두 setFields로 변경
mssak Jan 8, 2025
72d1bb7
refactor: redis 트랜젝션 방식 변경
mssak Jan 8, 2025
1bd2153
refactor: useCanvas 미사용용 반환값 제거
pkh0106 Jan 8, 2025
3fe4308
refactor: 빈 문자열 사용 제거거
pkh0106 Jan 8, 2025
d5e2e07
refactor: 내부에서만 사용하는 모듈 export 제거거
pkh0106 Jan 8, 2025
860d156
refactor: page 관련 미사용 API 제거거
pkh0106 Jan 8, 2025
af7ca2a
refactor: Separator default 변경
pkh0106 Jan 8, 2025
10b4644
refactor: useEffect 중복 로직 제거
pkh0106 Jan 8, 2025
eff8680
refactor: TODO 주석 삭제
baegyeong Jan 8, 2025
bc6a568
refactor: 필요없는 주석 삭제
baegyeong Jan 8, 2025
c9a832a
fix: 스케쥴러 돌때 redis 데이터가 제대로 삭제되지 않는 오류 수정정
mssak Jan 9, 2025
ea4f324
chore: 주석 제거
mssak Jan 9, 2025
f475ef8
chore: 임시로 edge delete 기능 비활성화
mssak Jan 9, 2025
40d14f0
Merge pull request #10 from boostcampwm-2024/refactor-be-#4
ezcolin2 Jan 9, 2025
5feffd9
refactor: EditorView의 스켈레톤 UI 추가
baegyeong Jan 9, 2025
6b8db17
refactor: 도커 최적화 - 중복되는 볼륨 처리
mssak Jan 9, 2025
1b3a74e
refactor: editorView에 lazy loading 적용
baegyeong Jan 9, 2025
e9b183b
fix: 스켈레톤 UI에서 prop으로 스타일을 받도록 수정
baegyeong Jan 9, 2025
5fa6292
refactor: 스켈레톤 UI불러올 때 크기를 지정하도록 설정
baegyeong Jan 9, 2025
47cbcb7
fix: 스켈레톤 컴포넌트 내의 padding 제거
pkh0106 Jan 9, 2025
a611c67
Merge pull request #11 from boostcampwm-2024/refactor-be-#4
ezcolin2 Jan 9, 2025
972f836
refactor: 워크스페이스 패널 분리 및 lazy loading 적용
pkh0106 Jan 9, 2025
fd6eb9a
Merge pull request #6 from boostcampwm-2024/refactor-fe-#2
pkh0106 Jan 9, 2025
77ba38f
refactor: 페이지 목록 패널 분리 및 lazy loading 적용
pkh0106 Jan 9, 2025
0d9a0b3
refactor: 사용자 정보 관리 패널 lazy loading 적용
pkh0106 Jan 9, 2025
374837f
fix: cn을 이용하여 Skeleton 컴포넌트 내 div 통합
pkh0106 Jan 9, 2025
3fa0411
refactor: 노드 색상 관리 패널 lazy loading 적용
pkh0106 Jan 9, 2025
5446971
Merge pull request #12 from boostcampwm-2024/refactor-fe-#9
pkh0106 Jan 9, 2025
94414c0
refactor: red lock 제거 후 redis 낙관적 락 적용
ezcolin2 Jan 9, 2025
8ca857c
Merge pull request #14 from boostcampwm-2024/refactor-be-#13
ezcolin2 Jan 9, 2025
39a8bea
feat: migrate 함수와 redis 값 변경 연산에 redis 분산 락 적용
ezcolin2 Jan 11, 2025
7b8fc80
Merge pull request #16 from boostcampwm-2024/refactor-be-#15
ezcolin2 Jan 12, 2025
8b8f683
fix: redis service의 setFields가 존재하지 않아서 추가
ezcolin2 Jan 13, 2025
4ba4a74
refactor: LCP 개선을 위한 Suspense 적용
baegyeong Jan 13, 2025
29308c9
refactor: 접근성 개선을 위한 aria label 지정
baegyeong Jan 13, 2025
471a038
refactor: 이미지 요소에 alt 속성 적용
baegyeong Jan 13, 2025
d49af48
refactor: 백그라운드와 포그라운드 대비 개선
baegyeong Jan 13, 2025
2ece725
Merge pull request #20 from boostcampwm-2024/refactor-fe-#17
baegyeong Jan 13, 2025
902535f
Merge pull request #19 from boostcampwm-2024/refactor-fe-#18
baegyeong Jan 13, 2025
c00d02d
refactor: 사용하지 않는 커스텀훅 삭제
baegyeong Jan 13, 2025
53f4f4e
feat: production에서 에러 console를 지우는 라이브러리 추가
baegyeong Jan 13, 2025
9d343ab
chore: index.html에 meta description 설명 추가
baegyeong Jan 13, 2025
930a59b
chore: SEO 개선을 위한robots.txt 파일 생성
baegyeong Jan 13, 2025
c204c21
Merge pull request #24 from boostcampwm-2024/refactor-fe-#21
pkh0106 Jan 13, 2025
2e01985
Merge pull request #23 from boostcampwm-2024/refactor-fe-#22
baegyeong Jan 13, 2025
4d7f3cf
refactor: docker 환경 개선
ezcolin2 Jan 13, 2025
48fecde
fix: redis lock을 획득하지 못 하는 이슈 해결
ezcolin2 Jan 13, 2025
90c9373
Merge branch 'refactor-be-#25' of https://github.com/boostcampwm-2024…
ezcolin2 Jan 13, 2025
2f5a7fa
feat: production 환경 용 nginx conf 파일 추가
ezcolin2 Jan 13, 2025
e9c5baa
refactor: docker 상용 환경 변경
ezcolin2 Jan 13, 2025
8c738b7
fix: certbot 인증서 이메일 및 도메인 변경
ezcolin2 Jan 13, 2025
24cdf62
refactor: 상용 환경 설정 파일 개선
ezcolin2 Jan 14, 2025
d0af367
refactor: connected 상태 색상 변경
baegyeong Jan 14, 2025
8da472d
chore: remove console을 위한 babel 설정 파일 삭제
baegyeong Jan 14, 2025
3c3c0b2
chore: vite-plugin-remove-console 설치
baegyeong Jan 14, 2025
4331ae9
Merge pull request #28 from boostcampwm-2024/refactor-fe-#27
pkh0106 Jan 14, 2025
f11821e
refactor: nginx 이미지 빌드할 때 리액트 정적 파일 삽입 구현
ezcolin2 Jan 14, 2025
3f0384d
refactor: websocket, backend 이미지 멀티 스테이지 빌드 제거
ezcolin2 Jan 14, 2025
063c02c
fix: react 정적 파일을 복사하는 nginx 디렉토리 이름 수정
ezcolin2 Jan 14, 2025
a3c2097
Merge pull request #29 from boostcampwm-2024/refactor-be-#25
summersummerwhy Jan 15, 2025
d0cea19
fix: Suspense를 사용하기 때문에 isLoading 상태 제거
baegyeong Jan 15, 2025
0c8604b
chore: 사용하지 않는 파일 삭제
baegyeong Jan 15, 2025
afa8b7a
Merge pull request #31 from boostcampwm-2024/refactor-fe-#27
github-actions[bot] Jan 15, 2025
8ebaa1f
hotfix: lint 오류 수정
ezcolin2 Jan 15, 2025
51f6677
fix: root package.json에 build 스크립트 추가
ezcolin2 Jan 15, 2025
08b8ca5
Merge pull request #32 from boostcampwm-2024/hotfix-be-#30
github-actions[bot] Jan 15, 2025
e431423
refactor: compose.prod.yml build를 override 파일로 분리
ezcolin2 Jan 15, 2025
bff4d5d
feat: 자동 배포 github action workflow 작성 완료
ezcolin2 Jan 15, 2025
82acb44
feat: 빌드한 이미지 이름에 docker hub 유저 이름 추가
ezcolin2 Jan 15, 2025
67dee9f
refactor: 이미지 안 .env 제거 후 volume mount로 변경
ezcolin2 Jan 15, 2025
d6a4fab
refactor: 원격 개발 서버 자동 배포 코드 삭제
ezcolin2 Jan 15, 2025
2a323d8
feat: octodocs-modules 원격 레포지토리에서 가져오는 것 구현
ezcolin2 Jan 15, 2025
9f93249
test: 자동 배포 테스트
ezcolin2 Jan 15, 2025
d3a7225
fix: 이미지 빌드 및 푸쉬 과정에서 docker-compose 명령어 제거
ezcolin2 Jan 15, 2025
b229de8
fix: cd-pipeline.yml 오타 수정 (prpod -> prod)
ezcolin2 Jan 15, 2025
37e82b5
fix: Docker.prod의 base 이미지에 dockerhub username 추가
ezcolin2 Jan 15, 2025
0488847
fix: nginx Dockerfile.prod 환경 변수 복사 제거
ezcolin2 Jan 15, 2025
1452986
fix: frontend 디렉토리 내부 .env 파일 이름 .env.local로 변경
ezcolin2 Jan 15, 2025
6a59445
fix: target branch main으로 변경
ezcolin2 Jan 16, 2025
189788e
Merge pull request #36 from boostcampwm-2024/refactor-be-#33
github-actions[bot] Jan 16, 2025
a5a0e15
refactor: redis 분산 락 제거 후 watch를 사용한 낙관적 락으로 변경
ezcolin2 Jan 16, 2025
a6e1967
Merge pull request #41 from boostcampwm-2024/refactor-be-#40
github-actions[bot] Jan 16, 2025
e95f2be
feat: auth-guard에 로그인 여부 판단 함수 추가
summersummerwhy Jan 16, 2025
a596d57
feat: auth controller 로그인 체크 api 추가
summersummerwhy Jan 16, 2025
2b59850
Merge pull request #43 from boostcampwm-2024/refactor-be-#42
github-actions[bot] Jan 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions .github/workflows/cd-pipeline.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: auto Workflow

on:
push:
branches:
- main
workflow_dispatch:
jobs:
image-build-and-push:
runs-on: ubuntu-latest

steps:
- name: checkout
uses: actions/checkout@v3

# root에 .env.local, .env.client, .env.server 복사
- name: copy .env
run: |
echo "${{ secrets.LOCAL_ENV }}" > .env.local
echo "${{ secrets.CLIENT_ENV }}" > .env.client
echo "${{ secrets.SERVER_ENV }}" > .env.server

# Docker 로그인
- name: docker hub login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

# Docker 이미지 빌드
- name: docker image build
run: |
docker build -f ./services/module/Dockerfile -t summersummerwhy/octodocs-modules .
docker build -f ./services/backend/Dockerfile.prod -t summersummerwhy/octodocs-backend .
docker build -f ./services/nginx/Dockerfile.prod -t summersummerwhy/octodocs-nginx .
docker build -f ./services/websocket/Dockerfile.prod -t summersummerwhy/octodocs-websocket .

# Docker 이미지 푸시
- name: docker image push
run: |
docker push summersummerwhy/octodocs-modules
docker push summersummerwhy/octodocs-backend
docker push summersummerwhy/octodocs-nginx
docker push summersummerwhy/octodocs-websocket

deploy:
needs: image-build-and-push
runs-on: ubuntu-latest

steps:
- name: deploy
env:
REMOTE_HOST: ${{ secrets.REMOTE_SERVER_IP }}
REMOTE_USER: ${{ secrets.REMOTE_SERVER_USER }}
SSH_KEY: ${{ secrets.REMOTE_PRIVATE_KEY }}
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
run: |
mkdir ~/.ssh
echo "$SSH_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa

ssh -o StrictHostKeyChecking=no $REMOTE_USER@$REMOTE_HOST << 'EOF'
cd /root/octodocs
docker-compose -f compose.prod.yml down
docker-compose -f compose.prod.yml pull
docker-compose -f compose.prod.yml up -d
105 changes: 0 additions & 105 deletions .github/workflows/develop.yml

This file was deleted.

15 changes: 15 additions & 0 deletions Dockerfile.module
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# node_modules를 가지고 있는 이미지
# 이 이미지를 기반으로 각 workspace 별 이미지를 만들면
# yarn install 레이어를 공유하게 된다.
FROM node:20-alpine

WORKDIR /app

# 호이스팅을 위해
COPY package.json yarn.lock ./
COPY apps/backend/package.json ./apps/backend/
COPY apps/frontend/package.json ./apps/frontend/
COPY apps/websocket/package.json ./apps/websocket/

# 의존성 설치
RUN yarn install
2 changes: 0 additions & 2 deletions apps/backend/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import { WorkspaceModule } from './workspace/workspace.module';
import { RoleModule } from './role/role.module';
import { TasksModule } from './tasks/tasks.module';
import { ScheduleModule } from '@nestjs/schedule';
import { RedLockModule } from './red-lock/red-lock.module';

@Module({
imports: [
Expand Down Expand Up @@ -54,7 +53,6 @@ import { RedLockModule } from './red-lock/red-lock.module';
WorkspaceModule,
RoleModule,
TasksModule,
RedLockModule,
],
controllers: [AppController],
providers: [AppService],
Expand Down
16 changes: 16 additions & 0 deletions apps/backend/src/auth/auth.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,22 @@ import { AuthService } from './auth.service';
import { JwtAuthGuard } from './guards/jwt-auth.guard';
import { Response } from 'express';
import { MessageResponseDto } from './dtos/messageResponse.dto';
import { LoginResponseDto } from './dtos/loginResponse.dto';
import { ApiOperation, ApiResponse } from '@nestjs/swagger';
import { TokenService } from './token/token.service';
import { UpdateUserDto } from './dtos/UpdateUser.dto';

export enum AuthResponseMessage {
AUTH_LOGGED_OUT = '로그아웃하였습니다.',
AUTH_STATUS = '로그인 여부를 확인하였습니다',
}

@Controller('auth')
export class AuthController {
constructor(
private readonly authService: AuthService,
private readonly tokenService: TokenService,
private readonly jwtAuthGuard: JwtAuthGuard,
) {}

@Get('naver')
Expand Down Expand Up @@ -94,6 +97,19 @@ export class AuthController {
});
}

// 클라이언트가 사용자가 로그인되어 있는지 확인할 수 있는 엔드포인트
// auth/status
@ApiResponse({ type: LoginResponseDto })
@ApiOperation({ summary: '사용자가 로그인 여부를 체크합니다.' })
@Get('status')
async checkLogin(@Req() req, @Res() res: Response) {
const isLoggedIn = await this.jwtAuthGuard.isLoggedIn(req, res);
return res.status(200).json({
message: AuthResponseMessage.AUTH_STATUS,
loggedIn: isLoggedIn,
});
}

// 클라이언트가 사용자의 외부 id(snowflakeId) + 이름을 알 수 있는 엔드포인트
// auth/profile
@Get('profile')
Expand Down
18 changes: 18 additions & 0 deletions apps/backend/src/auth/dtos/loginResponse.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsString, IsBoolean } from 'class-validator';

export class LoginResponseDto {
@ApiProperty({
example: 'OO 생성에 성공했습니다.',
description: 'api 요청 결과 메시지',
})
@IsString()
message: string;

@ApiProperty({
example: true,
description: '로그인 여부',
})
@IsBoolean()
loggedIn: string;
}
44 changes: 44 additions & 0 deletions apps/backend/src/auth/guards/jwt-auth.guard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,48 @@ export class JwtAuthGuard implements CanActivate {
}
}
}

// 제대로 로그인이 안되어있으면 exception 대신 false return
// 쿠키 처리해줌
async isLoggedIn(request, response): Promise<boolean> {
const cookies = request.cookies;

// 쿠키가 없는 경우 false 반환
if (!cookies || !cookies.accessToken || !cookies.refreshToken) {
return false;
}

const { accessToken, refreshToken } = cookies;

try {
// JWT 검증
this.jwtService.verify(accessToken, {
secret: process.env.JWT_SECRET,
});

return true;
} catch (error) {
// accessToken이 만료된 경우
if (error instanceof TokenExpiredError) {
try {
// 새로운 accessToken 발급받기
const newAccessToken =
await this.tokenService.refreshAccessToken(refreshToken);

// 쿠키 업데이트
this.tokenService.setAccessTokenCookie(response, newAccessToken);

return true;
} catch (refreshError) {
// refreshToken 디코딩 실패 시 처리 쿠키 비워줌
this.tokenService.clearCookies(response);
return false;
}
} else {
// accessToken 디코딩(만료가 아닌 이유로) 실패 시 처리 쿠키 비워줌
this.tokenService.clearCookies(response);
return false;
}
}
}
}
2 changes: 0 additions & 2 deletions apps/backend/src/page/page.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,12 @@ import { Page } from './page.entity';
import { PageRepository } from './page.repository';
import { NodeModule } from '../node/node.module';
import { WorkspaceModule } from '../workspace/workspace.module';
import { RedLockModule } from '../red-lock/red-lock.module';

@Module({
imports: [
TypeOrmModule.forFeature([Page]),
forwardRef(() => NodeModule),
WorkspaceModule,
RedLockModule,
],
controllers: [PageController],
providers: [PageService, PageRepository],
Expand Down
Loading
Loading