# OpenSearch 로그 시스템 구축 ## 작성일: 2025-09-14 ## 작성자: admin ## 환경: Ubuntu 22.04, 51123 서버, Docker Compose ## 요구사항 분석 ### 목적 - 51123/51124 서버 로그 중앙집중식 관리 - 실시간 로그 검색 및 분석 - 시각화 대시보드 제공 ### 솔루션 비교 | 항목 | OpenSearch | Loki+Grafana | Vector+ClickHouse | |------|------------|--------------|-------------------| | 메모리 | 2-4GB | 512MB-1GB | 1-2GB | | 검색성능 | 풀텍스트 최강 | 라벨 기반 | SQL 지원 | | Docker 통합 | Fluentd 필요 | Promtail 자동 | Vector 자동 | | 대시보드 | OpenSearch Dashboards | Grafana | Grafana 연동 | **선택**: OpenSearch (복잡한 텍스트 검색 요구) ## 시스템 확인 ### 리소스 현황 ```bash # 메모리: 29GB 총량, 23GB 가용 free -h # HDD: 916GB 총량, 869GB 가용 df -h /mnt/hdd # SSD: 228GB 총량, 158GB 가용 (27% 사용) df -h / ``` ### 로그 현황 - `/mnt/hdd/logs/`: 51124-server/, act_runner/, backup/, cleanup/, company-x/, nginx/ - 종료된 컨테이너: skill-slack (10일 전), rb10508_test (6주 전) - 자동 정리: 매일 4시, 30일 보관 ## Docker Compose 설정 ```yaml # /home/admin/opensearch/docker-compose.yml version: '3' services: opensearch: image: opensearchproject/opensearch:2.11.0 container_name: opensearch environment: - cluster.name=robeing-logs - node.name=opensearch-node1 - discovery.type=single-node - bootstrap.memory_lock=true - "OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g" - DISABLE_SECURITY_PLUGIN=true # 개발환경 ulimits: memlock: soft: -1 hard: -1 volumes: - /mnt/hdd/opensearch/data:/usr/share/opensearch/data ports: - 9200:9200 - 9600:9600 networks: - opensearch-net opensearch-dashboards: image: opensearchproject/opensearch-dashboards:2.11.0 container_name: opensearch-dashboards ports: - 5601:5601 environment: - OPENSEARCH_HOSTS=http://opensearch:9200 - DISABLE_SECURITY_DASHBOARDS_PLUGIN=true networks: - opensearch-net fluentd: build: ./fluentd container_name: fluentd volumes: - /mnt/hdd/logs:/var/log/system:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro - ./fluentd/fluent.conf:/fluentd/etc/fluent.conf environment: - OPENSEARCH_HOST=opensearch - OPENSEARCH_PORT=9200 networks: - opensearch-net depends_on: - opensearch networks: opensearch-net: ``` ## Fluentd 설정 ```ruby # /home/admin/opensearch/fluentd/fluent.conf @type tail path /var/log/system/**/*.log pos_file /fluentd/log/system.pos tag system.logs @type multiline format_firstline /^\d{4}-\d{2}-\d{2}/ format1 /^(? @type opensearch host "#{ENV['OPENSEARCH_HOST']}" port "#{ENV['OPENSEARCH_PORT']}" logstash_format true logstash_prefix robeing ``` ## 실행 및 검증 ```bash # 디렉토리 생성 mkdir -p /mnt/hdd/opensearch/data chmod 777 /mnt/hdd/opensearch/data # 실행 cd /home/admin/opensearch docker compose up -d # 상태 확인 curl -X GET "localhost:9200/_cluster/health?pretty" ``` ## CI/CD 배포 문제 해결 (추가: happybell80) ### 발견된 문제들 #### 1. Password 파싱 오류 ``` Parsing failed. Reason: Missing argument for option: p ``` **원인**: bash -c 내부에서 변수 이스케이프 문제 - `${OP_PASS}`를 호스트가 먼저 해석하려 해서 빈 값이 됨 - `\${OP_PASS}`로 이스케이프 필요 #### 2. 인증서 파일 누락으로 컨테이너 재시작 **원인**: docker-compose.yaml에 볼륨 마운트 없음 ```yaml # 현재 (문제) volumes: - /var/lib/opensearch:/usr/share/opensearch/data # 수정 필요 volumes: - /var/lib/opensearch:/usr/share/opensearch/data - ./certs:/usr/share/opensearch/config/certs:ro - ./internal_users.yml:/usr/share/opensearch/config/opensearch-security/internal_users.yml:ro ``` #### 3. Gitea Secrets 한계 - Secrets는 CI/CD Actions 실행 시에만 사용 가능 - 서버에서 직접 `docker compose up` 시 사용 불가 - Actions가 생성한 파일을 컨테이너에 마운트 필요 ## 현재 상태 (2025-09-14 최종 확인) ### 헬스체크 실패 상황 - **컨테이너 상태**: 계속 재시작 중 (Restarting) - **포트 9200**: 리스닝 중이지만 응답 없음 - **원인**: `/usr/share/opensearch/config/certs/root.pem` 인증서 파일 없음 - **Actions 배포**: 성공으로 표시되지만 실제 컨테이너는 실패 ### 문제 확인 - Actions는 `docker compose up -d` 실행 후 종료 (백그라운드 실행) - 컨테이너 상태를 확인하지 않아 "성공"으로 표시 - 실제로는 인증서 누락으로 컨테이너 재시작 반복 ### 근본적 해결책 **docker-compose.yaml에 볼륨 마운트 추가 필수** ```yaml volumes: - /var/lib/opensearch:/usr/share/opensearch/data - ./certs:/usr/share/opensearch/config/certs:ro - ./internal_users.yml:/usr/share/opensearch/config/opensearch-security/internal_users.yml:ro ``` Git Actions가 생성한 인증서와 비밀번호 파일을 컨테이너가 읽을 수 있도록 마운트해야 함. 현재 데이터 볼륨만 마운트되어 있어서 인증서를 찾지 못해 실패. ## 다음 단계 1. 인덱스 라이프사이클 정책 설정 (30일 보관) 2. 기존 로그 마이그레이션 스크립트 작성 3. 알림 규칙 설정 (에러 임계값)