Skip to content

Commit

Permalink
Merge branch 'develop' into Fix/299
Browse files Browse the repository at this point in the history
  • Loading branch information
zero0205 authored Nov 28, 2024
2 parents a985990 + 7dc944a commit 904edfc
Show file tree
Hide file tree
Showing 36 changed files with 719 additions and 97 deletions.
46 changes: 42 additions & 4 deletions .github/workflows/api-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,25 @@ jobs:
deploy-and-run:
runs-on: ubuntu-latest
needs: build-and-push
env:
IMAGE_NAME: api-camon
DB_HOST: ${{ secrets.DB_HOST }}
DB_PORT: ${{ secrets.DB_PORT }}
DB_USERNAME: ${{ secrets.DB_USERNAME }}
DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
DB_NAME: ${{ secrets.DB_NAME }}
GH_CLIENT_ID: ${{ secrets.GH_CLIENT_ID }}
GH_SECRET: ${{ secrets.GH_SECRET }}
GH_CALLBACK_URL: ${{ secrets.GH_CALLBACK_URL }}
JWT_SECRET: ${{ secrets.JWT_SECRET }}
GG_CLIENT_ID: ${{ secrets.GG_CLIENT_ID }}
GG_SECRET: ${{ secrets.GG_SECRET }}
GG_CALLBACK_URL: ${{ secrets.GG_CALLBACK_URL }}
CALLBACK_URI: ${{ secrets.CALLBACK_URI }}
NCLOUD_REGISTRY_URL: ${{ secrets.NCLOUD_REGISTRY_URL }}
NCLOUD_ACCESS_KEY: ${{ secrets.NCLOUD_ACCESS_KEY }}
NCLOUD_SECRET_KEY: ${{ secrets.NCLOUD_SECRET_KEY }}

steps:
- name: Checkout for docker-compose
uses: actions/checkout@v2
Expand All @@ -82,16 +101,35 @@ jobs:
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_SERVER_KEY }}
port: 22
envs: DB_HOST,DB_PORT,DB_USERNAME,DB_PASSWORD,DB_NAME,GH_CLIENT_ID,GH_SECRET,GH_CALLBACK_URL,JWT_SECRET,GG_CLIENT_ID,GG_SECRET,GG_CALLBACK_URL,CALLBACK_URI
envs: DB_HOST,DB_PORT,DB_USERNAME,DB_PASSWORD,DB_NAME,GH_CLIENT_ID,GH_SECRET,GH_CALLBACK_URL,JWT_SECRET,GG_CLIENT_ID,GG_SECRET,GG_CALLBACK_URL,CALLBACK_URI,NCLOUD_ACCESS_KEY,NCLOUD_SECRET_KEY,NCLOUD_REGISTRY_URL
script: |
cd /home/${{ secrets.SERVER_USER }}/camon
sudo docker login -u ${{secrets.NCLOUD_ACCESS_KEY}} -p ${{ secrets.NCLOUD_SECRET_KEY }} ${{ secrets.NCLOUD_REGISTRY_URL }}
echo "DB_HOST=$DB_HOST" > .env
echo "DB_PORT=$DB_PORT" >> .env
echo "DB_USERNAME=$DB_USERNAME" >> .env
echo "DB_PASSWORD=$DB_PASSWORD" >> .env
echo "DB_NAME=$DB_NAME" >> .env
echo "GH_CLIENT_ID=$GH_CLIENT_ID" >> .env
echo "GH_SECRET=$GH_SECRET" >> .env
echo "GH_CALLBACK_URL=$GH_CALLBACK_URL" >> .env
echo "JWT_SECRET=$JWT_SECRET" >> .env
echo "GG_CLIENT_ID=$GG_CLIENT_ID" >> .env
echo "GG_SECRET=$GG_SECRET" >> .env
echo "GG_CALLBACK_URL=$GG_CALLBACK_URL" >> .env
echo "CALLBACK_URI=$CALLBACK_URI" >> .env
echo "NCLOUD_ACCESS_KEY=$NCLOUD_ACCESS_KEY" >> .env
echo "NCLOUD_SECRET_KEY=$NCLOUD_SECRET_KEY" >> .env
echo "NCLOUD_REGISTRY_URL=$NCLOUD_REGISTRY_URL" >> .env
sudo docker login -u $NCLOUD_ACCESS_KEY -p $NCLOUD_SECRET_KEY $NCLOUD_REGISTRY_URL
sudo docker stop api-camon || true
sudo docker rm api-camon || true
sudo docker rmi ${{ secrets.NCLOUD_REGISTRY_URL }}/api-camon:latest || true
sudo docker rmi $NCLOUD_REGISTRY_URL/api-camon:latest || true
sudo docker pull ${{ secrets.NCLOUD_REGISTRY_URL }}/$IMAGE_NAME:latest
sudo docker pull $NCLOUD_REGISTRY_URL/api-camon:latest
sudo docker tag $NCLOUD_REGISTRY_URL/api-camon:latest api-camon
sudo docker-compose up -d api
sudo docker image prune -f
Expand Down
20 changes: 18 additions & 2 deletions .github/workflows/chat-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v2

# ncloud 로그인
- name: Log in to Ncloud Container Registry
env:
Expand All @@ -40,10 +40,18 @@ jobs:
- name: Push to Ncloud Container Registry
run: |
docker push ${{ secrets.NCLOUD_REGISTRY_URL }}/$IMAGE_NAME:latest
deploy-and-run:
runs-on: ubuntu-latest
needs: build-and-push
env:
IMAGE_NAME: chat-camon
CHAT_PORT: ${{ secrets.CHAT_PORT }}
REDIS_HOST: ${{ secrets.REDIS_HOST }}
REDIS_PORT: ${{ secrets.REDIS_PORT }}
REDIS_CHAT: ${{ secrets.REDIS_CHAT }}
JWT_SECRET: ${{ secrets.JWT_SECRET }}
NCLOUD_REGISTRY_URL: ${{ secrets.NCLOUD_REGISTRY_URL }}

steps:
- name: Checkout for docker-compose
Expand All @@ -68,13 +76,21 @@ jobs:
envs: CHAT_PORT,REDIS_HOST,REDIS_PORT,REDIS_CHAT,JWT_SECRET
script: |
cd /home/${{ secrets.SERVER_USER }}/camon
echo "CHAT_PORT=$CHAT_PORT" > .env
echo "REDIS_HOST=$REDIS_HOST" >> .env
echo "REDIS_PORT=$REDIS_PORT" >> .env
echo "REDIS_CHAT=$REDIS_CHAT" >> .env
echo "JWT_SECRET=$JWT_SECRET" >> .env
sudo docker login -u ${{secrets.NCLOUD_ACCESS_KEY}} -p ${{ secrets.NCLOUD_SECRET_KEY }} ${{ secrets.NCLOUD_REGISTRY_URL }}
sudo docker stop chat-camon || true
sudo docker rm chat-camon || true
sudo docker rmi ${{ secrets.NCLOUD_REGISTRY_URL }}/chat-camon:latest || true
sudo docker pull ${{ secrets.NCLOUD_REGISTRY_URL }}/chat-camon:latest
sudo docker tag ${{ secrets.NCLOUD_REGISTRY_URL }}/chat-camon:latest chat-camon
sudo docker-compose up -d chat
sudo docker image prune -f
Expand Down
50 changes: 38 additions & 12 deletions .github/workflows/media-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,23 @@ jobs:
deploy-and-run:
runs-on: ubuntu-latest
needs: build-and-push
env:
IMAGE_NAME: media-camon
MEDIA_PORT: 3001
REDIS_HOST: ${{ secrets.REDIS_HOST }}
REDIS_PORT: ${{ secrets.REDIS_PORT }}
REDIS_MEDIA: ${{ secrets.REDIS_MEDIA }}
ANNOUNCED_IP: ${{ secrets.ANNOUNCED_IP }}
API_SERVER_URL: ${{ secrets.API_SERVER_URL }}
HTTP_TIMEOUT: ${{ secrets.HTTP_TIMEOUT }}
RECORD_SERVER_URL: ${{ secrets.RECORD_SERVER_URL }}
SERVER_PRIVATE_IP: ${{ secrets.SERVER_PRIVATE_IP }}
PUBLIC_RECORD_SERVER_URL: ${{ secrets.PUBLIC_RECORD_SERVER_URL }}
JWT_SECRET: ${{ secrets.JWT_SECRET }}
NCLOUD_REGISTRY_URL: ${{ secrets.NCLOUD_REGISTRY_URL }}
NCLOUD_ACCESS_KEY: ${{ secrets.NCLOUD_ACCESS_KEY }}
NCLOUD_SECRET_KEY: ${{ secrets.NCLOUD_SECRET_KEY }}

steps:
- name: Checkout for docker-compose
uses: actions/checkout@v2
Expand All @@ -82,24 +99,33 @@ jobs:
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_SERVER_KEY }}
port: 22
envs: MEDIA_PORT,REDIS_HOST,REDIS_PORT,REDIS_MEDIA,ANNOUNCED_IP,API_SERVER_URL,HTTP_TIMEOUT,RECORD_SERVER_URL,SERVER_PRIVATE_IP,PUBLIC_RECORD_SERVER_URL
envs: MEDIA_PORT,REDIS_HOST,REDIS_PORT,REDIS_MEDIA,ANNOUNCED_IP,API_SERVER_URL,HTTP_TIMEOUT,RECORD_SERVER_URL,SERVER_PRIVATE_IP,PUBLIC_RECORD_SERVER_URL,NCLOUD_REGISTRY_URL,NCLOUD_ACCESS_KEY,NCLOUD_SECRET_KEY
script: |
cd /home/${{ secrets.SERVER_USER }}/camon
sudo lsof -i :3001
sudo lsof -i :30000-31000
sudo docker login -u ${{secrets.NCLOUD_ACCESS_KEY}} -p ${{ secrets.NCLOUD_SECRET_KEY }} ${{ secrets.NCLOUD_REGISTRY_URL }}
echo "API_SERVER_URL=http://api:3000" >> .env
echo "HTTP_TIMEOUT=5000" >> .env
echo "RECORD_SERVER_URL=http://record:3003" >> .env
echo "SERVER_PRIVATE_IP=record" >> .env
echo "PUBLIC_RECORD_SERVER_URL=https://record.cam-on.site" >> .env
echo "MEDIA_PORT=$MEDIA_PORT" > .env
echo "REDIS_HOST=$REDIS_HOST" >> .env
echo "REDIS_PORT=$REDIS_PORT" >> .env
echo "REDIS_MEDIA=$REDIS_MEDIA" >> .env
echo "ANNOUNCED_IP=$ANNOUNCED_IP" >> .env
echo "API_SERVER_URL=$API_SERVER_URL" >> .env
echo "HTTP_TIMEOUT=$HTTP_TIMEOUT" >> .env
echo "RECORD_SERVER_URL=$RECORD_SERVER_URL" >> .env
echo "SERVER_PRIVATE_IP=$SERVER_PRIVATE_IP" >> .env
echo "PUBLIC_RECORD_SERVER_URL=$PUBLIC_RECORD_SERVER_URL" >> .env
echo "NCLOUD_REGISTRY_URL=$NCLOUD_REGISTRY_URL" >> .env
echo "NCLOUD_ACCESS_KEY=$NCLOUD_ACCESS_KEY" >> .env
echo "NCLOUD_SECRET_KEY=$NCLOUD_SECRET_KEY" >> .env
echo "JWT_SECRET=$JWT_SECRET" >> .env
sudo docker login -u $NCLOUD_ACCESS_KEY -p $NCLOUD_SECRET_KEY $NCLOUD_REGISTRY_URL
sudo docker stop media-camon || true
sudo docker rm media-camon || true
sudo docker rmi ${{ secrets.NCLOUD_REGISTRY_URL }}/media-camon:latest || true
sudo docker rmi $NCLOUD_REGISTRY_URL/media-camon:latest || true
sudo docker pull ${{ secrets.NCLOUD_REGISTRY_URL }}/media-camon:latest
sudo docker pull $NCLOUD_REGISTRY_URL/media-camon:latest
sudo docker tag $NCLOUD_REGISTRY_URL/media-camon:latest media-camon
sudo docker-compose up -d media
sudo docker image prune -f
Expand Down
43 changes: 34 additions & 9 deletions .github/workflows/record-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@ jobs:
IMAGE_NAME: record-camon
RECORD_PORT: ${{ secrets.RECORD_PORT }}
NCLOUD_ACCESS_KEY: ${{ secrets.NCLOUD_ACCESS_KEY }}
NCLOUD_SECRET_KEY=: ${{ secrets.NCLOUD_SECRET_KEY }}
NCLOUD_BUCKET_NAME=: ${{ secrets.NCLOUD_BUCKET_NAME }}
NCLOUD_SECRET_KEY: ${{ secrets.NCLOUD_SECRET_KEY }}
NCLOUD_BUCKET_NAME: ${{ secrets.NCLOUD_BUCKET_NAME }}
API_SERVER_URL: ${{ secrets.API_SERVER_URL }}
CDN_URL: ${{ secrets.CDN_URL }}

steps:
- name: Checkout code
Expand All @@ -33,8 +35,10 @@ jobs:
docker build -f ./apps/record/Dockerfile -t ${{ secrets.NCLOUD_REGISTRY_URL }}/$IMAGE_NAME:latest \
--build-arg RECORD_PORT=$RECORD_PORT \
--build-arg NCLOUD_ACCESS_KEY=$NCLOUD_ACCESS_KEY \
--build-arg NCLOUD_SECRET_KEY=$NCLOUD_ACCESS_KEY \
--build-arg NCLOUD_SECRET_KEY=$NCLOUD_SECRET_KEY \
--build-arg NCLOUD_BUCKET_NAME=$NCLOUD_BUCKET_NAME \
--build-arg API_SERVER_URL=$API_SERVER_URL \
--build-arg CDN_URL=$CDN_URL \
.
- name: Push to Ncloud Container Registry
Expand All @@ -44,6 +48,16 @@ jobs:
deploy-and-run:
runs-on: ubuntu-latest
needs: build-and-push
env:
IMAGE_NAME: record-camon
RECORD_PORT: ${{ secrets.RECORD_PORT }}
NCLOUD_ACCESS_KEY: ${{ secrets.NCLOUD_ACCESS_KEY }}
NCLOUD_SECRET_KEY: ${{ secrets.NCLOUD_SECRET_KEY }}
NCLOUD_BUCKET_NAME: ${{ secrets.NCLOUD_BUCKET_NAME }}
NCLOUD_REGISTRY_URL: ${{ secrets.NCLOUD_REGISTRY_URL }}
API_SERVER_URL: ${{ secrets.API_SERVER_URL }}
CDN_URL: ${{ secrets.CDN_URL }}

steps:
- name: Checkout for docker-compose
uses: actions/checkout@v2
Expand All @@ -64,19 +78,30 @@ jobs:
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_SERVER_KEY }}
port: 22
envs: RECORD_PORT,NCLOUD_ACCESS_KEY,NCLOUD_SECRET_KEY,NCLOUD_BUCKET_NAME
envs: RECORD_PORT,NCLOUD_ACCESS_KEY,NCLOUD_SECRET_KEY,NCLOUD_BUCKET_NAME,NCLOUD_REGISTRY_URL,API_SERVER_URL,CDN_URL
script: |
cd /home/${{ secrets.SERVER_USER }}/camon
sudo docker login -u ${{secrets.NCLOUD_ACCESS_KEY}} -p ${{ secrets.NCLOUD_SECRET_KEY }} ${{ secrets.NCLOUD_REGISTRY_URL }}
echo "RECORD_PORT=$RECORD_PORT" > .env
echo "NCLOUD_ACCESS_KEY=$NCLOUD_ACCESS_KEY" >> .env
echo "NCLOUD_SECRET_KEY=$NCLOUD_SECRET_KEY" >> .env
echo "NCLOUD_BUCKET_NAME=$NCLOUD_BUCKET_NAME" >> .env
echo "NCLOUD_REGISTRY_URL=$NCLOUD_REGISTRY_URL" >> .env
echo "API_SERVER_URL=$API_SERVER_URL" >> .env
echo "CDN_URL=$CDN_URL" >> .env
sudo docker login -u $NCLOUD_ACCESS_KEY -p $NCLOUD_SECRET_KEY $NCLOUD_REGISTRY_URL
sudo docker stop record-camon || true
sudo docker rm record-camon || true
sudo docker rmi ${{ secrets.NCLOUD_REGISTRY_URL }}/record-camon:latest || true
sudo docker pull ${{ secrets.NCLOUD_REGISTRY_URL }}/$IMAGE_NAME:latest
sudo docker rmi $NCLOUD_REGISTRY_URL/record-camon:latest || true
sudo docker pull $NCLOUD_REGISTRY_URL/record-camon:latest
sudo docker tag $NCLOUD_REGISTRY_URL/record-camon:latest record-camon

sudo docker-compose up -d record

sudo docker image prune -f
- name: Check container status
uses: appleboy/[email protected]
with:
Expand Down
3 changes: 2 additions & 1 deletion apps/api/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@ GG_CALLBACK_URL=


#JWT
JWT_SECRET=
JWT_SECRET=
CALLBACK_URI=
2 changes: 2 additions & 0 deletions apps/api/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { typeormConfig } from './config/typeorm.config';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { AuthModule } from './auth/auth.module';
import { RecordModule } from './record/record.module';

@Module({
imports: [
Expand All @@ -27,6 +28,7 @@ import { AuthModule } from './auth/auth.module';
BroadcastModule,
AttendanceModule,
AuthModule,
RecordModule,
],
controllers: [AppController],
providers: [AppService],
Expand Down
3 changes: 3 additions & 0 deletions apps/api/src/common/responses/exceptions/errorStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,7 @@ export class ErrorStatus {
// Broadcast Errors
static readonly BROADCAST_NOT_FOUND = new ErrorStatus(404, 'BROADCAST_4000', '방송 정보가 존재하지 않습니다.');
static readonly BROADCAST_ALREADY_EXISTS = new ErrorStatus(400, 'BROADCAST_4001', '이미 존재하는 방송입니다.');

//Attendance
static readonly ATTENDANCE_NOT_FOUND = new ErrorStatus(404, 'ATTENDANCE_4000', '출석 정보가 존재하지 않습니다.');
}
5 changes: 3 additions & 2 deletions apps/api/src/member/dto/attendance-response.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@ class AttendanceInfo {

export class AttendanceResponseDto {
@ApiProperty()
id: number;
memberId: number;
@ApiProperty({ type: AttendanceInfo, isArray: true })
attendances: AttendanceInfo[];

static of(memberId: number, attendances: Attendance[]): AttendanceResponseDto {
return {
id: memberId,
memberId: memberId,
attendances: attendances.map(attendance => ({
attendanceId: attendance.id,
date: this.formatDate(attendance.startTime),
startTime: this.formatTime(attendance.startTime),
endTime: this.formatTime(attendance.endTime),
Expand Down
4 changes: 4 additions & 0 deletions apps/api/src/record/dto/create-record.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export class CreateRecordDto {
title: string;
roomId: string;
}
55 changes: 55 additions & 0 deletions apps/api/src/record/dto/records-response.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { ApiProperty } from '@nestjs/swagger';
import { Record } from '../record.entity';

class RecordDto {
@ApiProperty()
recordId: number;

@ApiProperty()
video: string;

@ApiProperty()
title: string;

@ApiProperty()
date: string;

static from(record: Record) {
const dto = new RecordDto();
dto.recordId = record.id;
dto.video = record.video;
dto.title = record.title;
dto.date = this.formatDate(new Date(record.attendance.startTime));
return dto;
}

static fromList(records: Record[]) {
return records.map(record => this.from(record));
}

private static formatDate(date: Date): string {
return date
.toLocaleDateString('ko-KR', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
})
.replace(/\. /g, '.')
.slice(0, -1);
}
}

export class RecordsResponseDto {
@ApiProperty({
type: RecordDto,
isArray: true,
})
records: RecordDto[];

static from(records: Record[]) {
const dto = new RecordsResponseDto();
dto.records = RecordDto.fromList(records);

return dto;
}
}
4 changes: 4 additions & 0 deletions apps/api/src/record/dto/update-record.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export class UpdateRecordDto {
video: string;
roomId: string;
}
Loading

0 comments on commit 904edfc

Please sign in to comment.