Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 5 additions & 0 deletions src/.env
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@ MONGO_INITDB_ROOT_USERNAME=kickzo
MONGO_INITDB_ROOT_PASSWORD=test123
MONGO_INITDB_DATABASE=chatDB

# ElastricSearch & Kibana
ELASTIC_PORT=9200
ELASTIC_PASSWORD=+bAf9ynghd3*Y7L6qFQi
KIBANA_PORT=5601

# JWT
ACCESS_TOKEN_SECRET=kickzo_access_token_secret
REFRESH_TOKEN_SECRET=kickzo_refresh_token_secret
Expand Down
1 change: 1 addition & 0 deletions src/backend/main-server/main/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
}

tasks.named('test') {
Expand Down
44 changes: 44 additions & 0 deletions src/backend/main-server/main/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,54 @@ services:
SPRING_DATASOURCE_URL: jdbc:mysql://${MYSQL_HOST}:${MYSQL_CONTAINER_PORT}/${MYSQL_DATABASE}
SPRING_DATASOURCE_USERNAME: ${MYSQL_USER}
SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD}
SPRING_ELASTICSEARCH_URIS: http://elasticsearch:9200
SPRING_ELASTICSEARCH_USERNAME: kickzo
SPRING_ELASTICSEARCH_PASSWORD: test123
SPRING_APPLICATION_NAME: main
depends_on:
- elasticsearch
networks:
- kickzo-network

elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.5.0
container_name: elasticsearch
ports:
- "${ELASTIC_PORT}:${ELASTIC_PORT}"
environment:
- discovery.type=single-node # 단일 노드로 실행
- xpack.security.enabled=true
- bootstrap.memory_lock=true # 메모리 잠금 활성화
- ES_JAVA_OPTS=-Xms512m -Xmx512m # Elasticsearch JVM 메모리 설정
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
volumes:
- es-data:/usr/share/elasticsearch/data
- ./elasticsearch-init.sh:/usr/share/elasticsearch/init.sh
entrypoint: [ "/bin/sh", "-c", "/usr/share/elasticsearch/init.sh & /usr/local/bin/docker-entrypoint.sh" ]
ulimits:
memlock:
soft: -1
hard: -1
networks:
- kickzo-network

kibana:
image: docker.elastic.co/kibana/kibana:8.5.0
container_name: kibana
ports:
- "${KIBANA_PORT}:${KIBANA_PORT}"
environment:
ELASTICSEARCH_HOSTS: http://elasticsearch:9200
ELASTICSEARCH_USERNAME: kickzo
ELASTICSEARCH_PASSWORD: test123
depends_on:
- elasticsearch
networks:
- kickzo-network

volumes:
es-data:

networks:
kickzo-network:
driver: bridge
34 changes: 34 additions & 0 deletions src/backend/main-server/main/elasticsearch-init.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/bin/sh

echo "⏳ Waiting for Elasticsearch to be ready..."
until curl -s -u elastic:${ELASTIC_PASSWORD} "http://localhost:9200/_cluster/health" | grep -q '"status":"green"\|"status":"yellow"'; do
sleep 5
done

echo "✅ Elasticsearch is ready. Creating user and roles..."

# kickzo_role 생성
curl -X PUT "http://localhost:9200/_security/role/kickzo_role" \
-H "Content-Type: application/json" \
-u elastic:${ELASTIC_PASSWORD} \
-d '{
"cluster": ["all"],
"indices": [
{
"names": [".kibana*", ".kibana_task_manager*"],
"privileges": ["create_index", "manage", "all"],
"allow_restricted_indices": true
}
]
}'

# kickzo 사용자 생성 또는 업데이트
curl -X PUT "http://localhost:9200/_security/user/kickzo" \
-H "Content-Type: application/json" \
-u elastic:${ELASTIC_PASSWORD} \
-d '{
"password": "test123",
"roles": ["superuser", "kickzo_role"]
}'

echo "✅ Elasticsearch user and roles setup completed."
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;

@SpringBootApplication
@EnableElasticsearchRepositories
public class MainApplication {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.kickzo.main;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Document(indexName = "rooms") // Elasticsearch 인덱스 이름
public class RoomDocument {
@Id
private Long id;

@Field(type = FieldType.Text)
private String title;

@Field(type = FieldType.Boolean)
private Boolean isPublic;

@Field(type = FieldType.Integer)
private int userCount;

@Field(type = FieldType.Keyword)
private String creator;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.kickzo.main;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/search")
@RequiredArgsConstructor
public class RoomSearchController {

private final RoomSearchRepository roomSearchRepository;

@GetMapping()
public List<RoomDocument> searchRooms(@RequestParam String keyword) {
return roomSearchRepository.findByTitleContainingOrCreatorContaining(keyword, keyword);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.kickzo.main;

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public interface RoomSearchRepository extends ElasticsearchRepository<RoomDocument, Long> {
List<RoomDocument> findByTitleContainingOrCreatorContaining(String title, String creator);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.kickzo.main.RoomDocument;
import com.kickzo.main.RoomSearchRepository;
import com.kickzo.main.dto.data.PlaylistItem;
import com.kickzo.main.dto.request.CreateRoomRequestDto;
import com.kickzo.main.dto.response.CreateRoomResponseDto;
Expand All @@ -37,6 +39,7 @@ public class MainPageService {
private final RoomRepository roomRepository;
private final RoomUserRepository roomUserRepository;
private final UserRepository userRepository;
private final RoomSearchRepository roomSearchRepository; // Elasticsearch Repository

private static final int MAX_ROOMS_PER_USER = 5;
private static final int ROLE_CREATOR = 0;
Expand Down Expand Up @@ -70,6 +73,14 @@ public CreateRoomResponseDto createRoom(Long userId, CreateRoomRequestDto reques
Room newRoom = saveNewRoom(creatorNickname, requestDto, randomCode);
saveRoomUser(newRoom.getId(), userId);

// Elasticsearch에도 저장
RoomDocument roomDocument = new RoomDocument();
roomDocument.setId(newRoom.getId());
roomDocument.setTitle(newRoom.getTitle());
roomDocument.setCreator(newRoom.getCreator());

roomSearchRepository.save(roomDocument);

return new CreateRoomResponseDto(randomCode);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,8 @@ spring.kafka.bootstrap-servers=localhost:19092
spring.data.redis.database=3
spring.data.redis.host=localhost
spring.data.redis.port=7003
spring.data.redis.timeout=60000
spring.data.redis.timeout=60000

spring.elasticsearch.uris=http://localhost:9200
spring.elasticsearch.connection-timeout=10s
spring.elasticsearch.socket-timeout=30s
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,8 @@ spring.kafka.bootstrap-servers=kafka:9092
spring.data.redis.database=3
spring.data.redis.host=redis
spring.data.redis.port=6379
spring.data.redis.timeout=60000
spring.data.redis.timeout=60000

spring.elasticsearch.uris=http://elasticsearch:9200
spring.elasticsearch.connection-timeout=20s
spring.elasticsearch.socket-timeout=60s
1 change: 1 addition & 0 deletions src/infra/kong/kong.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ services:
paths:
- /api/rooms/all
- /api/rooms/participants
- /api/search
strip_path: false

- name: main-private-route
Expand Down
Loading