feat: Add Step 13 - Search System with Apache Solr and Data Persistence

- Implemented search service with Apache Solr instead of Elasticsearch
- Added full-text search, faceted search, and autocomplete capabilities
- Created data indexer for synchronizing data from MongoDB/Kafka to Solr
- Configured external volume mounts for all data services:
  - MongoDB, Redis, Kafka, Zookeeper, MinIO, Solr
  - All data now persists in ./data/ directory
- Added comprehensive search API endpoints
- Created documentation for data persistence and backup strategies

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
jungwoo choi
2025-09-11 20:27:02 +09:00
parent ee4e50afc9
commit dd165454f0
11 changed files with 1746 additions and 20 deletions

View File

@ -76,7 +76,7 @@ services:
- CONVERT_TO_WEBP=true
volumes:
- ./services/images/backend:/app
- images_cache:/app/cache
- ./data/images-cache:/app/cache
networks:
- site11_network
restart: unless-stopped
@ -118,8 +118,8 @@ services:
ports:
- "${MONGODB_PORT}:27017"
volumes:
- mongodb_data:/data/db
- mongodb_config:/data/configdb
- ./data/mongodb:/data/db
- ./data/mongodb/configdb:/data/configdb
networks:
- site11_network
restart: unless-stopped
@ -135,7 +135,7 @@ services:
ports:
- "${REDIS_PORT}:6379"
volumes:
- redis_data:/data
- ./data/redis:/data
networks:
- site11_network
restart: unless-stopped
@ -154,8 +154,8 @@ services:
ports:
- "${KAFKA_ZOOKEEPER_PORT}:2181"
volumes:
- zookeeper_data:/var/lib/zookeeper/data
- zookeeper_logs:/var/lib/zookeeper/log
- ./data/zookeeper/data:/var/lib/zookeeper/data
- ./data/zookeeper/logs:/var/lib/zookeeper/log
networks:
- site11_network
restart: unless-stopped
@ -181,7 +181,7 @@ services:
KAFKA_JMX_HOSTNAME: localhost
KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
volumes:
- kafka_data:/var/lib/kafka/data
- ./data/kafka:/var/lib/kafka/data
networks:
- site11_network
restart: unless-stopped
@ -234,7 +234,7 @@ services:
- MINIO_ROOT_USER=${MINIO_ROOT_USER:-minioadmin}
- MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-minioadmin}
volumes:
- minio_data:/data
- ./data/minio:/data
command: server /data --console-address ":9001"
networks:
- site11_network
@ -264,7 +264,7 @@ services:
- MINIO_SECURE=false
volumes:
- ./services/files/backend:/app
- files_temp:/tmp
- ./data/files-temp:/tmp
networks:
- site11_network
restart: unless-stopped
@ -277,6 +277,57 @@ services:
timeout: 10s
retries: 3
# Apache Solr Search Engine
solr:
image: solr:9.4
container_name: ${COMPOSE_PROJECT_NAME}_solr
ports:
- "8983:8983"
volumes:
- ./data/solr:/var/solr
- ./services/search/solr-config:/opt/solr/server/solr/configsets/site11_config
command:
- solr-precreate
- site11
- /opt/solr/server/solr/configsets/site11_config
networks:
- site11_network
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8983/solr/site11/admin/ping"]
interval: 30s
timeout: 10s
retries: 3
# Search Service
search-backend:
build:
context: ./services/search/backend
dockerfile: Dockerfile
container_name: ${COMPOSE_PROJECT_NAME}_search_backend
ports:
- "8015:8000"
environment:
- ENV=${ENV}
- PORT=8000
- SOLR_URL=http://solr:8983/solr
- MONGODB_URL=${MONGODB_URL}
- KAFKA_BOOTSTRAP_SERVERS=${KAFKA_BOOTSTRAP_SERVERS}
volumes:
- ./services/search/backend:/app
networks:
- site11_network
restart: unless-stopped
depends_on:
- solr
- mongodb
- kafka
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
# Statistics Service
statistics-backend:
build:
@ -308,13 +359,15 @@ networks:
driver: bridge
name: site11_network
volumes:
mongodb_data:
mongodb_config:
redis_data:
images_cache:
zookeeper_data:
zookeeper_logs:
kafka_data:
minio_data:
files_temp:
# Named volumes are replaced with bind mounts in ./data/ directory
# volumes:
# mongodb_data:
# mongodb_config:
# redis_data:
# images_cache:
# zookeeper_data:
# zookeeper_logs:
# kafka_data:
# minio_data:
# files_temp:
# solr_data: