해외직구 디지털 도어록 안전성 시험결과 – 주요 안전 문제 발견

한국소비자원(원장 윤수현)이 해외직구 플랫폼인 알리익스프레스에서 판매되는 디지털 도어록 10개 제품의 품질 및 안전성을 시험한 상세 결과를 공개했습니다.

1. 시험평가 대상 제품 현황

2. 상세 시험평가 결과

2.1 안전성 평가 결과

평가 항목시험 기준부적합 제품문제점화재 시 열림270℃ 환경에서 수동레버로 문 개방 가능 여부XSDTS(DF14), SANKESONG, YKESDL(D14P)수동레버 녹아내려 대피 불가배터리 안전성화재 시 발화·폭발 여부리튬2차전지 사용 5개 제품 전체170℃~260℃에서 발화·폭발
🔥 화재 시 문 개방 가능 여부도어록을 30분 내에 270℃까지 가열 후 10분 유지 후 꺼내어 수동레버 작동 여부 확인
🔋 배터리 발화 및 폭발 위험성270℃ 이하에서 배터리가 발화·폭발하는지 확인 (온도 범위: 170℃~260℃)
⚡ 비상 전원 공급 기능내부 배터리 방전 후 외부에서 비상 전원 공급이 가능한지 확인
🌡 내환경성고온(55℃), 저온(-15℃), 고습도(40℃, 습도 90%)에서 48시간 노출 후 정상 작동 여부 확인
🔧 설치 호환성국내 표준 타공 규격(KS C 9806)과 비교하여 설치 가능 여부 확인

2.2 품질 평가 결과

평가 항목시험 기준부적합 제품문제점비상외부전원배터리 방전 시 외부 전원 공급 가능 여부Catchface비상전원 공급 단자 없음내환경성고온(55℃), 저온(-15℃), 고습도(40℃, 90%) 환경 내구성없음전 제품 적합

2.3 호환성 평가 결과

평가 항목기준결과영향타공도 호환성KS C 9806 표준 규격전체 제품 부적합추가 설치비용 발생, 이사 시 출입문 교체 필요

3. 조치 사항

3.1 유통차단 대상 제품 (6개)

  1. Catchface(미상)
  2. XSDTS(DF14)
  3. SANKESONG(3D Face Smart Door Lock)
  4. Tropernic(17)
  5. YKESDL(D14P)
  6. 브랜드 미상(H7)

알리익스프레스는 2025.01.09 기준으로 해당 제품들의 판매를 차단 완료

3.2 소비자 환불 절차

  • 대상: 판매차단 시점(2025.01.09) 이전 구매자 총 46명
  • 방법: 알리익스프레스 고객센터(1533-6727) 연락 후 환불 진행

4. 소비자 구매 시 주의사항

  1. 안전성 검증
    • KC안전확인 인증 제품 선택
    • 내화형, 화재 시 열림 기능 확인
  2. 전원 방식 선택
    • 가급적 건전지 사용 제품 선택
    • 리튬2차전지 제품은 KC안전확인 필수 확인
    • 2025년 5월 7일부터 리튬2차전지 사용 가능 (국가기술표준원 고시 제2025-0026호)
  3. 설치 호환성
    • 기존 도어록과의 타공도 호환성 확인
    • 추가 설치 비용 발생 가능성 고려
    • 이사 시 출입문 교체 비용 고려

5. 소비자 피해구제 방법

소비자 피해 발생 시 ‘소비자24 열린소비자포털(www.consumer.go.kr)’ 을 통해 다음 서류를 구비하여 상담 또는 피해구제 신청 가능:

  • 거래내역
  • 증빙서류
  • 기타 관련 자료

n8n: 누구나 쉽게 자동화를 구현하는 오픈소스 워크플로우 자동화 도구

n8n이란?

n8n은 오픈소스 기반의 워크플로우 자동화 도구로, 코드 작성 없이 다양한 서비스와 애플리케이션을 연결하여 자동화된 작업을 수행할 수 있도록 돕는 플랫폼입니다. 이를 통해 사용자는 반복적인 업무를 줄이고, 효율성을 극대화할 수 있습니다.

n8n은 노드(Node) 기반으로 동작하며, 드래그 앤 드롭 방식의 직관적인 UI를 제공하여 비개발자도 쉽게 자동화 흐름을 설계할 수 있습니다. 또한, 자체 호스팅이 가능하므로 데이터 프라이버시를 강화할 수 있으며, 다양한 서드파티 API와의 원활한 연동을 지원합니다.

n8n으로 할 수 있는 일

n8n은 여러 가지 이상적으로 업무에서 반복해야 하는 프로세스를 자동화하는 데 활용할 수 있습니다. 대표적인 활용 사례는 다음과 같습니다.

1. 데이터 연동 및 변환

  • Google Sheets, Airtable, Notion과 같은 데이터베이스를 연동하여 정보를 자동 업데이트
  • JSON, XML, CSV 형식 변환 및 정제 작업
  • API를 활용한 데이터 수집 및 가공

2. 마케팅 및 고객 관리 자동화

  • 이메일 마케팅: 신규 가입자에게 자동으로 이메일 전송 (Mailchimp, SendGrid 등과 연동)
  • CRM 자동화: HubSpot, Salesforce 등의 CRM과 연동하여 고객 데이터를 동기화
  • 소셜미디어 자동화: Instagram, Twitter, Facebook에 게시물 자동 업로드

3. 프로젝트 및 업무 관리

  • Trello, Asana, ClickUp과 같은 프로젝트 관리 도구와 연동하여 자동화된 태스크 생성
  • Slack, Microsoft Teams 알림 자동화
  • Jira 티켓 자동 생성 및 업데이트

4. IT 및 DevOps 자동화

  • GitHub, GitLab 등의 리포지토리 변경 사항 감지 및 알림
  • AWS, Google Cloud, Azure 클라우드 리소스 관리 자동화
  • CI/CD 파이프라인 자동화 (Jenkins, CircleCI 연동)

자, 그럼 어떻게 설치하고 실제 제가 어떻게 활용하고 있는지 살펴봅시다.

version: "3.7"
services:
postgres:
image: postgres:13
restart: always
environment:
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=패스워드작성
- POSTGRES_DB=n8n
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n"]
interval: 10s
timeout: 5s
retries: 5
n8n:
image: n8nio/n8n:latest
restart: always
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=패스워드작성
- N8N_HOST=n8.123qwe.co.kr
- WEBHOOK_URL=https://사용할 도메인 혹은 ip 기입
- N8N_PORT=5678
- N8N_PROTOCOL=https
- N8N_ENCRYPTION_KEY=키값 작성
- N8N_SECURE_COOKIE=false
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
# PostgreSQL 연결 설정
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=패스워드작성
- DB_POSTGRESDB_DATABASE=n8n
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
qdrant:
image: qdrant/qdrant
container_name: qdrant
restart: always
environment:
- QDRANT_API_KEY=키값작성
ports:

저는 위와 같은 형태로 docker-compose.yml 파일을 만들어서 도커로 올렸습니다.

QDRANT_API_KEY키의 경우 벡터 db를 사용하기 위해 별도로 올렸으니, 필요 없으면 안써도 되지만, 워크 플로우를 만들다 보면 의외로 쓸일이 많아서 이 참에 하나 같이 올려주시면 도움이 됩니다.

이건 실제로 제가 가장 많이 사용하는 워크플로우인데요. 설명을 하자면

텔레그램 그룹방에서 봇을 만들어서 “봇 + 명령어” 형태로 동작시키는 워크플로우입니다.

텔레그램 봇파더에게 봇을 하나 만든뒤에 그룹방에 해당 봇을 초대하여 메시지 접근을 수락해 준 뒤에 다음과 같은 명령을 할 수 있어요

봇 날씨

이런식으로 AI 챗봇을 그룹방에 불러 놓고 여러명이서 편하게 사용 하는거죠.

또 다른 예로는,

이러한 형태로 만든 예제가 있습니다.

이 n8n 워크플로우는 Notion 데이터베이스를 검색하고, 결과를 기반으로 AI 에이전트를 활용하여 응답을 생성하는 자동화 프로세스입니다. 주요 기능은 다음과 같습니다:

  1. Notion 데이터베이스 검색
    • 사용자가 Notion 데이터베이스 URL을 입력하면, 해당 데이터베이스의 정보를 가져옵니다.
    • 검색을 통해 관련 정보를 추출하고 정리합니다.
  2. 데이터 정제 및 변환
    • 데이터베이스의 속성을 표준화하고, 필요한 JSON 데이터를 추출하여 처리합니다.
    • 특정 속성을 간소화하여 검색을 최적화합니다.
  3. AI 기반 응답 생성
    • OpenAI GPT 모델을 활용하여 검색된 데이터를 기반으로 적절한 응답을 생성합니다.
    • n8n 에이전트를 통해 검색 질의에 대해 구조화된 답변을 제공합니다.
  4. 자동 JSON 워크플로우 생성 및 검증
    • AI 모델이 Notion 데이터베이스를 기반으로 새로운 워크플로우 JSON을 생성합니다.
    • 생성된 JSON이 올바른 형식인지 검증하고, 오류가 있으면 자동으로 수정합니다.
  5. 채팅 인터페이스와 연동
    • 사용자의 입력을 기반으로 워크플로우를 실행하고, Slack 또는 Telegram 같은 채팅 플랫폼으로 응답을 반환할 수 있도록 설계됨.

즉, 이 워크플로우는 Notion 데이터베이스의 정보를 검색하고 AI를 활용하여 사용자 맞춤형 응답을 자동으로 생성하는 기능을 수행합니다. 🚀

마지막으로 하나 더 살펴보자면,

이 n8n 워크플로우는 이메일 자동 처리 및 응답 생성을 위한 자동화 프로세스입니다. 주요 기능은 다음과 같습니다:

1. 이메일 수신 및 처리

  • IMAP 트리거를 사용하여 특정 이메일 계정에서 수신된 메일을 감지합니다.
  • 이메일 본문을 Markdown 형식으로 변환하여 자연어 처리에 적합하게 변환합니다.
  • 요약 체인을 통해 이메일 내용을 간결하게 요약합니다.

2. AI 기반 이메일 응답 생성

  • 요약된 이메일 내용을 기반으로 AI (GPT-4o-mini) 모델이 적절한 응답을 자동으로 생성합니다.
  • 생성된 이메일이 비즈니스 용도로 적절한지 텍스트 분류기를 사용하여 검토합니다.
  • 필요 시, 이메일을 재작성하는 리뷰 프로세스를 거칩니다.

3. 이메일 전송 및 승인

  • 생성된 이메일을 Gmail API를 통해 자동으로 전송합니다.
  • 이메일을 전송하기 전에 승인 요청을 수행하여 사람이 검토 후 최종 전송할 수 있도록 합니다.

4. 벡터 데이터베이스 활용 (Qdrant)

  • 비즈니스 관련 정보를 검색하고 활용하기 위해 Qdrant 벡터 데이터베이스를 사용합니다.
  • OpenAI 임베딩 모델을 활용하여 이메일 내용과 관련된 정보를 추출할 수 있습니다.

결론

이 워크플로우는 비즈니스 이메일을 자동으로 요약하고, AI 기반으로 응답을 생성한 후, 승인 또는 자동 전송하는 자동화 프로세스입니다. 이를 통해 이메일 처리 시간을 단축하고, 보다 효율적인 고객 응대가 가능합니다. 🚀

저도 처음에 n8n을 서버에 설치하고 나서, 이걸로 대체 무엇을 할 수 있을까 막막했어요, 유툽도 많이 찾아 봤지만, 별 도움이 안되더라구요.

하지만, https://n8n.io/workflows/?utm_source=n8n_app&utm_medium=template_library&utm_instance=https%3A%2F%2Fn8.123qwe.co.kr%2F&utm_n8n_version=1.78.1&utm_awc=5&utm_user_role=business-owner 이곳에 들어가보면

이미 많은 사람들이 자신들의 워크플로우를 만들어서 공유를 하고 있습니다.

관심있는 워크플로우 몇개 설치해 보면서 감을 잡으시면 큰 도움이 되는데,

초보라면 몇가지 개념이 많이 혼동스럽습니다. 크리덴셜? 웹훅? 노드id 등등..
이러한 개념을 알고 진행하시면 큰 도움이 됩니다.

n8n의 핵심 개념 정리

  1. 크리덴셜 (Credential)
    • 외부 서비스(API, 데이터베이스, 이메일 등)와 연결할 때 필요한 인증 정보입니다.
    • 예: API 키, OAuth 토큰, 로그인 정보 등.
    • 설정 후 여러 **노드(Node)**에서 재사용 가능.
  2. 노드 (Node)
    • n8n에서 **각각의 작업(작업 단위)**을 의미합니다.
    • 데이터 처리, API 호출, 파일 관리, 조건 분기 등의 역할을 수행.
    • 예: 이메일 전송 노드, HTTP 요청 노드, 데이터베이스 쿼리 노드 등.
  3. 워크플로우 (Workflow)
    • 여러 개의 노드를 연결하여 자동화된 작업 흐름을 구성한 것입니다.
    • 시작 노드(Trigger) → 데이터 처리 노드 → 결과 출력 노드 등의 구조.
    • 예: 새 이메일 수신 → 내용 요약 → Slack 알림 전송.
  4. 웹훅 (Webhook)
    • 외부 서비스에서 특정 이벤트가 발생할 때 n8n 워크플로우를 실행하는 트리거입니다.
    • HTTP 요청을 받아 자동으로 실행됨.
    • 예: 신규 고객 가입 시 고객 정보를 DB에 저장하는 워크플로우 실행.
  5. 트리거 (Trigger)
    • 워크플로우를 자동으로 실행하는 시작점 역할을 하는 노드.
    • 웹훅, 크론잡(스케줄러), IMAP 이메일 수신 등 다양한 방식이 있음.
    • 예: 매일 아침 9시에 데이터를 가져오는 일정 기반 트리거.

그리고 진짜 꿀팁은 바로 이건데요….
타인의 워크플로우를 넣건, 내가 만들었건, 각 노드에서 계속 오류 나다 보면 금방 포기하고 싶어지거든요

그때는 워크플로우 화면을 한번 클릭하고 컨트롤+c를 누르면 json 코드 형태로 워크플로우가 복사가 되어 클립보드에 저장이 됩니다.

이렇게 저장된 내용을 챗gpt나 클로드 그리고 요즘 무료로 많이 사용이 가능한 구글 ai스튜디오에 가서 붙여 넣고 오류에 대해 해결해 달라고 하거나 오류 원인을 물어 보면 하나 하나 해결해 나가실 수 있습니다.

🌟콩알금 투자 OR KRX로 현실적인 금 투자하기!

📌 목차

  1. 서론: 실물 금? 무조건 좋은 선택은 아니다!
  2. 실물 콩알금, 생각보다 비효율적인 이유
  3. KRX 금 시장 vs 실물 금 투자 비교
  4. KRX 금 시장, 어떻게 시작할까?
  5. 콩알금 vs KRX 금 투자, 무엇이 더 현실적일까?
  6. 결론: 금 투자, 제대로 하려면 KRX로!

1️⃣ 실물 금? 무조건 좋은 선택은 아니다!

금은 안전자산으로 평가받지만, 콩알금(소량의 실물 금)을 모으는 것이 정말 최선의 선택일까요?
많은 사람들이 작은 단위로 금을 사 모으지만, 매번 부가세 10%를 내야 하는 함정이 있습니다. 즉, 사자마자 손실을 보고 시작하는 셈이죠.

💡 더 나은 대안은?

주식처럼 KRX 금 시장을 이용하는 것! 실물 금보다 수수료와 세금 부담이 훨씬 적고, 안전한 방식으로 금에 투자할 수 있습니다.

이 글에서는 콩알금 투자 방법, 단점과 해결책, 그리고 KRX 금 투자법까지 현실적인 해결책을 알려드립니다! 🏆


2️⃣ 실물 콩알금, 생각보다 비효율적인 이유 🤔

🔹 구매 시 부가세 10% 발생: 실물 금은 구매 시 부가세 10%를 내야 합니다.
🔹 재판매 시 손해 가능성: 금은방이나 은행에서 매도할 때, 매입 가격이 시세보다 낮아 손실이 발생할 수 있음.
🔹 보관의 불편함: 보관할 때 분실 위험이 있으며, 금고 대여 시 추가 비용 발생.
🔹 환금성 제한: 현금화하려면 반드시 매입처를 찾아야 하며, 즉시 매도하기 어려운 경우도 있음.

💡 대안? KRX 금 시장 활용!


3️⃣ KRX 금 시장 vs 실물 금 투자 비교 📊

투자 방식장점단점
실물 콩알금직접 보유 가능, 선물용으로 활용부가세 10%, 보관 부담, 환금성 낮음
KRX 금 시장부가세 없음, 수수료 저렴, 즉시 매매 가능실물이 아닌 계좌 투자 방식

결론: 실물 금을 모으는 것은 낭만적이지만, 투자 목적으로는 KRX 금 시장이 훨씬 현실적인 대안입니다.


KRX시장에서 거래하면 부가가치세가 면제! (단, 실물 금으로 교환시 부과)


4️⃣ KRX 금 시장, 어떻게 시작할까? 🏦

1️⃣ 증권사 금 거래 계좌 개설 (미래에셋, 키움증권 등)
2️⃣ KRX 금 시장에서 1g 단위로 매수 가능
3️⃣ 실물 인출도 가능 (단, 일정량 이상 보유 시)
4️⃣ 수수료가 낮고, 부가세 없이 금을 보유 가능

부가세 없이 실물 금에 투자할 수 있는 유일한 방법!



5️⃣ 콩알금 vs KRX 금 투자, 무엇이 더 현실적일까? 🤔

🔹 실물 콩알금: 직접 보유의 만족감은 있지만, 초기 10% 손실이 발생하며, 보관 및 매매가 불편함.
🔹 KRX 금 시장: 세금 부담이 없고, 거래가 편리하며, 실물 인출까지 가능.

투자 목적으로는 KRX 금 시장이 가장 현실적인 선택!


6️⃣ 결론: 금 투자, 제대로 하려면 KRX로! 🚀

📌 핵심 요약

실물 콩알금 투자, 부가세 10%로 손실부터 시작!
KRX 금 시장은 세금 부담 없이 현실적인 투자 방법
증권사에서 금 계좌 개설 후 간편하게 거래 가능

🎯 이제 실물 콩알금보다, KRX 금 시장으로 제대로 투자하세요!

홈랩 구축을 위한 Proxmox, NPM, WordPress, n8n의 조합

오늘날 기술적 환경이 변화함에 따라 많은 사용자들이 개인 서버를 구축하여 다양한 서비스를 운영하고자 합니다. 이러한 홈랩 구축을 위해 최고의 선택 중 하나는 Proxmox, NPM, WordPress, 그리고 n8n의 조합입니다. 이 글에서는 각 소프트웨어의 기능과 함께 이들을 통합하여 사용할 때 얻을 수 있는 이점에 대해 설명하겠습니다.

Proxmox는 가상화 플랫폼으로, 여러 가상 머신을 손쉽게 관리할 수 있도록 돕습니다. 이는 물리적 서버를 효율적으로 활용하고 필요에 따라 다양한 환경을 구축할 수 있게 합니다. NPM은 JavaScript 패키지 관리자로, WordPress와 n8n을 포함한 여러 프로젝트에서 필수적인 역할을 합니다. WordPress는 웹사이트 구축과 관리에 강력한 도구로 자리잡았으며, n8n은 비즈니스 프로세스 자동화를 가능하게 하는 유연한 워크플로우 오케스트레이션 플랫폼입니다.

이 조합은 각각의 소프트웨어가 제공하는 독특한 기능을 활용하여 서로의 장점을 극대화할 수 있습니다. 예를 들어, Proxmox를 통해 가상 서버를 운영하여 WordPress 웹사이트를 호스팅하고, n8n을 활용해 자동화된 프로세스를 설정하는 것이 가능합니다. 이러한 통합된 접근 방식은 비용 효율적이고 유연한 솔루션을 제공하며, 기술적 경량화에 기여할 수 있습니다. 이 기사를 통해 각 소프트웨어의 특성과 이를 활용하여 홈랩을 구축하는 방법을 알아보겠습니다.

Proxmox의 이해와 설치

Proxmox의 설치를 통해 가정에서 서버 환경을 구성하고 가상화된 인프라를 만드는 첫 단계를 쉽게 진행할 수 있습니다. 이제 다음 단계로, Proxmox에서 구축한 가상 머신을 통해 다양한 서비스를 운영하며, 사용자 요구에 맞는 집약적인 서버 솔루션을 만드는 방법에 대해서 살펴보겠습니다. 여기에서는 NPM, WordPress, n8n을 활용하여 고도의 통합된 홈랩 구축을 목표로 합니다. 이러한 서비스 간의 조합을 통해 효율적인 웹 애플리케이션을 배포하고 자동화를 구현할 수 있습니다.

Proxmox에서 가상화를 통해 Linux 기반의 가상 서버를 구축했다면, 이후 NPM(Node Package Manager)을 활용하여 JavaScript 기반의 패키지들을 관리하는 것이 중요합니다. NPM은 웹 애플리케이션을 구축할 때 필요한 다양한 라이브러리와 모듈을 효율적으로 관리할 수 있도록 도와줍니다. 이는 특히 WordPress 같은 CMS(콘텐츠 관리 시스템)에서 플러그인과 테마를 설치하고 관리하는 데 필수적입니다. NPM을 이용하면 사이트의 기능을 쉽게 확장할 수 있으며, 종속성을 자동으로 해결하여 프로젝트의 생산성을 높입니다.

이제 NPM을 통해 WordPress 프로젝트를 준비할 차례입니다. 먼저, Proxmox 내에 가상 머신을 생성하고 그 위에 필요한 운영체제를 설치한 후, Node.js와 NPM을 설치해야 합니다. 설치가 완료되면, 프로젝트 루트 디렉토리에서 ‘npm init’ 명령어를 사용하여 프로젝트를 초기화합니다. 초기화가 완료되면, 필요한 플러그인이나 테마를 설치하기 위해 ‘npm install <패키지명>‘ 명령어를 사용합니다. 예를 들어, 특정 테마를 적용하기 위해테마 패키지를 설치한 후, WordPress 관리 패널에서 이를 활성화하면 됩니다.

그 후, n8n과 같은 오픈 소스 자동화 툴을 통합하여 작업을 더욱 간소화할 수 있습니다. n8n은 다양한 API 및 서비스를 연결하여 워크플로우를 자동화하는 데 매우 유용합니다. Proxmox 가상 머신에서 n8n을 설정하면, 이메일 자동화, 데이터 통합, 알림 시스템 등 다양한 자동화 작업을 구성할 수 있습니다. 예를 들어, WordPress에서 신규 포스트가 작성될 때마다 특정 채널로 알림이 전송되도록 하거나, 사용자의 피드백을 자동으로 수집하는 작업을 설정할 수 있습니다.

n8n의 설치는 비교적 간단하며, Docker 또는 npm을 통해 설치할 수 있습니다. 설치 후 n8n의 웹 인터페이스에 접속하여 다양한 노드를 설정하고 이를 조합함으로써, 원하는 자동화 워크플로우를 완성할 수 있습니다. n8n을 통해 프로세스를 자동화하면 수작업으로 처리해야 하는 시간과 노력을 줄일 수 있으며, 여러 서비스를 효율적으로 통합하여 보다 나은 사용자 경험을 제공할 수 있습니다.

결국, Proxmox와 NPM, WordPress, 그리고 n8n의 조합은 가정에서의 서버 구성뿐만 아니라, 다양한 서비스를 유기적으로 연결하여 최적의 솔루션을 제공합니다. 이러한 통합된 환경에서는 서버 관리, 웹 애플리케이션 운영, 업무 프로세스 자동화가 효율적으로 이루어지며, 개인의 기술적 요구사항도 충족시킬 수 있습니다. 이는 결국 개인의 홈랩을 통해 보다 전문적인 서버 환경을 구축하고 유연한 서비스를 제공하는 기초가 됩니다. 다음 장에서는 이러한 조합에서 NPM과 WordPress 간의 효과적인 연계를 다루어, 웹사이트의 성능을 더욱 향상시키는 방법에 대해 논의할 것입니다.

NPM과 WordPress 연계

NPM은 JavaScript 생태계에서 가장 널리 사용되는 패키지 관리자로, 다양한 프론트엔드와 백엔드 애플리케이션의 개발에 필수적인 도구입니다. 특히 WordPress와 같은 콘텐츠 관리 시스템(CMS)에서도 NPM은 중요한 역할을 수행합니다. 이 장에서는 WordPress 사이트 구축 시 NPM을 활용하여 필요한 플러그인과 테마를 설치하고 관리하는 방법에 대해 깊이 있게 탐구하겠습니다.

WordPress는 기본적으로 사용자가 쉽게 콘텐츠를 생성하고 관리할 수 있도록 설계되었습니다. 그러나 기본 테마와 플러그인으로는 특정 요구 사항을 충족하지 못할 수 있기 때문에, 개발자는 NPM을 통해 더 많은 기능과 디자인 요소를 추가할 수 있습니다. NPM을 사용하면 손쉽게 다양한 라이브러리를 설치하고 이를 WordPress 프로젝트에 통합할 수 있으며, 이는 사이트의 성능과 사용자 경험을 크게 향상시킬 수 있습니다.

먼저, NPM을 사용해 WordPress 프로젝트를 설정하는 방법을 살펴보겠습니다. 새 WordPress 프로젝트를 시작하려면 먼저 해당 프로젝트의 루트 디렉토리에서 NPM을 초기화해야 합니다. 이를 위해 ‘npm init’ 명령을 사용하여 package.json 파일을 생성합니다. 이 파일은 프로젝트의 메타데이터를 포함하고, 설치할 패키지에 대한 정보를 담고 있습니다. 패키지.json 파일이 생성되면 필요한 플러그인과 테마를 추가하기 위해 ‘npm install [패키지명]’ 명령어를 사용하여 설치할 수 있습니다.

예를 들어, 인기 있는 외부 라이브러리인 jQuery를 설치하려면 ‘npm install jquery’라고 입력하면 되며, 이는 WordPress의 테마 또는 플러그인 코드에서 사용할 수 있습니다. 이렇게 설치한 jQuery는 스크립트를 통해 다양한 인터랙티브한 기능을 사이트에 추가하고 사용자 경험을 풍부하게 만들어줄 수 있습니다.

또한, NPM을 사용하여 여러분의 WordPress 프로젝트에 Vue.js와 같은 모던 프론트엔드 프레임워크를 통합할 수도 있습니다. 이를 통해 역동적이고 즉각적인 사용자 인터페이스를 제공할 수 있으며, 이는 사용자 몰입도를 높이는 데 큰 도움을 줍니다. 예를 들어, 비동기식 통신을 통해 게시물 데이터를 가져와 실시간으로 업데이트된 콘텐츠를 사용자에게 제공할 수 있습니다. NPM을 통해 설치한 모든 라이브러리는 프로젝트 내에서 쉽게 불러올 수 있어, 코드 관리가 보다 효율적으로 이루어집니다.

NPM을 통해 설치한 패키지는 언제든지 간편하게 업데이트할 수 있습니다. ‘npm update’ 명령어를 사용하면 최신 버전의 패키지로 일괄 업그레이드를 진행하게 되며, 이를 통해 보안 취약성을 예방하고 최신 기능을 적용할 수 있습니다. 이러한 점은 프로젝트의 장기적인 유지보수와 성능 향상에 매우 중요합니다.

WordPress에서 NPM을 활용하는 방법은 주로 프론트엔드 개발에 국한되지 않습니다. 서버 측에서도 NPM을 사용하여 다양한 패키지를 관리하고, 이를 통해 특정 기능을 구현할 수 있습니다. 예를 들어, NPM을 사용하여 REST API와 통신하는 플러그인을 작성하거나, 커스텀 테마의 빌드 프로세스를 자동화하여 효율성을 높일 수 있습니다. 이를 통해 개발자는 표준화된 환경을 구축하고, 팀 간의 협업을 원활하게 진행할 수 있습니다.

결론적으로, NPM은 WordPress 개발에서 필수적인 도구로 자리 잡고 있습니다. NPM을 통해 요구하는 기능을 쉽게 추가하고 관리하며, 사이트 성능을 개선할 수 있는 다양한 옵션을 제공받을 수 있습니다. 이 다음 장에서는 n8n을 통한 프로세스 자동화에 대해 자세히 알아볼 것이며, NPM 및 WordPress와의 조화로운 결합이 직관적인 자동화 작업 흐름을 어떻게 가능하게 하는지 살펴보겠습니다.

n8n을 통한 프로세스 자동화

n8n은 강력한 워크플로우 자동화 도구로, 다양한 애플리케이션과 서비스 간의 상호작용을 지원하여 복잡한 비즈니스 프로세스를 단순화합니다. 사용자는 n8n의 직관적인 인터페이스를 통해 비주얼 방식으로 작업 흐름을 정의하고 설정할 수 있으며, 이를 통해 업무의 효율성을 극대화할 수 있습니다. n8n은 클라우드 서비스에서 호스팅할 수도 있지만, 홈랩 구축 환경에서 Proxmox를 통해 직접 배포하는 것도 가능합니다. Proxmox와 n8n의 조합은 개발 환경이나 개인 프로젝트에서 작업을 자동으로 처리할 수 있는 유연성을 제공합니다.

n8n의 설정 과정은 특히 수월하여 기술적인 배경이 없는 사용자도 쉽게 접근할 수 있습니다. 사용자는 다양한 트리거를 설정하여 특정 이벤트가 발생했을 때 자동으로 작업을 실행할 수 있습니다. 예를 들어, WordPress 블로그에 새로운 글이 게시될 때 이를 소셜 미디어 플랫폼에 자동으로 공유하도록 설정할 수 있습니다. 트리거와 작업은 드래그 앤 드롭 방식으로 쉽게 연결할 수 있으며, 각 단계에서 필요한 데이터 조작도 가능하므로 더 정교한 워크플로우를 구축할 수 있습니다.

n8n은 여러 서비스 간의 연결성을 극대화하는 데 강점을 지니고 있습니다. 예를 들어, 이메일 마케팅 서비스와 CRM 시스템을 연동하여, 새로운 고객이 가입할 때 자동으로 환영 이메일을 보내고 대신 연락처 정보를 CRM에 등록하는 프로세스를 설정할 수 있습니다. 이러한 자동화는 작업의 중복성을 줄이면서도 고객 경험을 향상시킬 수 있는 훌륭한 방법입니다.

또한 n8n은 기본적으로 오픈소스이며, 여러 플러그인을 통해 다양한 서비스와의 통합이 가능합니다. 사용자는 GitHub 또는 n8n 커뮤니티에서 개발된 커넥터를 활용하여 필요에 따라 기능을 확장할 수 있습니다. 예를 들어, Google Sheets와의 연계를 통해 팀이 프로젝트 상태를 모니터링하거나, Zapier 및 IFTTT와 같은 기존의 자동화 플랫폼과 비교해 더 세밀한 작업 흐름을 설계할 수 있습니다.

n8n을 활용한 자동화의 또 다른 장점은 실시간 데이터 흐름 관리입니다. 사용자는 각 단계에서 전달되는 데이터가 어떻게 변화하는지를 명확하게 파악할 수 있으며, 이를 통해 원하는 결과를 얻기 위해 필요한 조정이 가능합니다. 각 워크플로우에서는 각 작업의 성공과 실패 여부를 확인할 수 있는 대시보드가 제공되므로 관리와 모니터링이 용이합니다.

이 장에서는 특정 워크플로우의 예시를 통해 n8n의 강력한 기능을 더욱 구체적으로 설명하겠습니다. 예를 들어, 온라인 쇼핑몰을 운영하는 경우, 고객이 새로운 주문을 했을 때 발생하는 일련의 작업을 자동화하는 과정을 살펴보겠습니다. 이 과정에서 n8n을 사용하여 고객에게 자동으로 확인 이메일을 보내고, 재고를 업데이트하며, 회계 소프트웨어에 주문 정보를 기록하도록 설정할 수 있습니다. 이를 통해 인력 자원 절약은 물론, 오류 발생 가능성을 최소화할 수 있습니다.

n8n은 이러한 방식으로 단순히 반복적인 작업을 자동화하는 것을 넘어, 비즈니스의 총체적 운영 효율성을 크게 향상시킬 수 있는 도구입니다. 특히 홈랩 환경에서 설치하고 운영할 수 있다면, 기존의 클라우드 기반 서비스 의존도를 줄이면서도 커스터마이징된 솔루션을 통해 나만의 자동화 시스템을 구축할 수 있습니다. 앞으로의 챕터에서는 이러한 n8n의 활용 사례와 함께, Proxmox 서버와의 통합 방법에 대해 더 자세히 안내드리겠습니다.

Conclusions

홈랩 구축은 단순히 기술적인 도전이 아닙니다. Proxmox, NPM, WordPress, n8n의 조합은 개인의 요구에 맞는 맞춤형 서버 환경을 만드는 데 큰 도움이 됩니다. 각 소프트웨어는 독립적으로도 뛰어난 기능을 제공하지만 함께 사용함으로써 전체적인 시스템의 성능과 효율성을 크게 향상시킬 수 있습니다.

결국, 이러한 조합은 가정에서의 IT 환경을 혁신적으로 변화시키고, 사용자가 필요로 하는 모든 것을 한 곳에서 운영할 수 있게 해줍니다. 따라서 여러분의 홈랩을 위한 필수적인 도구로 이들 소프트웨어를 고려해야 할 순간입니다.

zoom을 대체할 수 있는 오픈소스 mirotalk

간단하게 쓸 용도의 WebRTC기반의 화상회의 플랫폼입니다. 오픈소스이고 도커로 쉽게 설치가 가능합니다.

Mirotalk은 오픈소스 WebRTC 기반의 화상 회의 플랫폼입니다. 주요 특징들을 설명해드리겠습니다:

주요 특징:

  1. 브라우저 기반으로 별도의 설치가 필요 없습니다.
  2. 실시간 화상/음성 통화를 지원합니다.
  3. 화면 공유 기능을 제공합니다.
  4. 채팅 기능이 포함되어 있습니다.
  5. 개인정보 보호를 위한 P2P(Peer-to-Peer) 연결을 사용합니다.

기술적 특징:

  • WebRTC 기술을 기반으로 구축되었습니다
  • 오픈소스로 제공되어 직접 호스팅이 가능합니다
  • Node.js로 개발되었습니다
  • Socket.io를 사용하여 실시간 통신을 구현했습니다

사용 방법:

  1. 웹사이트에 접속합니다
  2. 회의실 생성 또는 참여를 선택합니다
  3. 카메라와 마이크 권한을 허용합니다
  4. URL을 공유하여 다른 참가자를 초대할 수 있습니다

보안 기능:

  • 종단간 암호화(E2EE) 지원
  • 회의실 비밀번호 설정 가능
  • 참가자 권한 관리 기능

Mirotalk은 특히 자체 호스팅이 가능한 오픈소스 솔루션을 찾는 기업이나 단체에게 적합한 선택이 될 수 있습니다.

라고 클로드가 설명해 주는데요, 깃헙에 있는 내용을 추가로 기재 하자면

Mirotalk의 주요 특징들을 번역해드리겠습니다:

  • 100% 무료 – AGPLv3 라이선스의 오픈소스 – 자체 호스팅 가능하며 PWA(Progressive Web App) 지원!
  • 다운로드, 플러그인, 로그인이 필요 없음 – 완전한 브라우저 기반
  • 시간 제한 없는 무제한 회의실 제공
  • 133개 언어로 번역 지원
  • OpenID Connect (OIDC) 인증 레이어 지원
  • 무단 접근 방지를 위한 호스트 보호 기능
  • 무단 접근 방지를 위한 사용자 인증
  • 회의실 비밀번호 보호
  • JWT.io를 통한 호스트 구성 및 사용자 인증을 위한 보안 자격 증명 관리로 보안 강화 및 프로세스 간소화
  • 데스크톱 및 모바일 기기 호환
  • 최적화된 모바일 회의실 URL 공유
  • 모바일 기기의 전면/후면 카메라 지원 웹캠 스트리밍
  • 발언 감지 및 볼륨 표시기가 있는 선명한 오디오 스트리밍
  • 프레젠테이션을 위한 화면 공유
  • 드래그 앤 드롭 지원 파일 공유
  • 오디오 입력, 출력 및 비디오 소스 선택 가능
  • 최대 8K 및 60 FPS의 비디오 품질 지원
  • 더욱 간소화되고 유연한 시청 경험을 제공하는 향상된 PiP(Picture-in-Picture) 지원
  • 화면, 오디오 및 비디오 녹화
  • 비디오 프레임을 스냅샷으로 촬영하여 PNG 이미지로 저장
  • 이모티콘 선택기, 개인 메시지, 마크다운 지원, 대화 저장이 가능한 채팅
  • ChatGPT(OpenAI 제공)를 통한 질문 답변, 정보 제공 및 관련 리소스 연결
  • 음성 메시지 전송을 위한 음성 인식
  • 무전기와 유사한 Push-to-talk 기능
  • 교사를 위한 고급 협업 화이트보드
  • YouTube 임베드 비디오, 비디오 파일(MP4, WebM, OGG) 및 오디오 파일(MP3)의 실시간 공유
  • 원클릭 비디오 요소 확대 및 고정/고정 해제가 가능한 전체 화면 모드
  • 사용자 정의 가능한 UI 테마
  • 추가 제어를 위한 비디오 요소의 우클릭 옵션
  • WebRTC를 통한 저지연 통신을 위한 직접적인 P2P 연결
  • REST API(Application Programming Interface) 지원
  • 향상된 커뮤니케이션을 위한 Mattermost 통합
  • 향상된 커뮤니케이션을 위한 Slack 통합
  • 오류 보고를 위한 Sentry 활용

oidc를 지원해서 구성원들만 사용하도록 할 수 있고, 방 만들고 나서 설정에서 방을 비번으로 잠글 수도 있어서 나름 괜찮은 솔루션인것 같습니다.

요거를 일단 회사 내부 서버에 설치해봤는데, 성능이 낮은 서버에서도 메모리만 넉넉히 주면 20~30명 수준의 화상회의는 아무 문제 없이 아주 잘 됩니다. 

처음에는 jitsi를 설치했는데, 이건 외부에서 음성이 안들리는 등 문제가 좀 있어서 그냥 미로톡을 설치했는데 이건 뭐 너무 쉽게 그냥 잘 되는군요 ^^

회사에서는 mattermost라는 슬랙과 유사한 협업툴을 사용하는데, 여기에 슬래시 명령어를 통해 쉽게 방을 만들고 들어올 수 있도록 했습니다.

이런식으로 말이죠….. (이렇게 하려면 .env에 mattermost에 대한 설정을 해주고, 매터모스트 통합 -> 슬래시명렁어 만들기를 해 줘야 합니다)

접속하면 이런 화면이 나오고요, 조인룸 버튼을 누르면 바로 방을 만들고 들어갈 수 있습니다.

화면 공유도 되고, 화이트보드 기능도 있고, 기본 기능은 매우 충실합니다.

* https를 사용해야 웹브라우저에서 카메라와 마이크를 사용할 수 있습니다. 뭐 우회하는 방법이 있을테지만 기본적으로 그렇습니다;;;; (그러니 꼭 https로….)

oidc 설정을 하면, 메인 페이지 접속을 위한 sso 사용이 가능합니다. 해당 설정은 .env 파일에서 아래 부분을 설정해 주면 됩니다.

OIDC_ENABLED=true
OIDC_ISSUER=https://your-oidc-provider.com
OIDC_CLIENT_ID=your_client_id
OIDC_CLIENT_SECRET=your_client_secret
OIDC_CALLBACK_URL=https://your-mirotalk-domain/auth/oidc/callback
OIDC_SCOPE=”openid profile email”

요렇게 env파일에 추가해 주시면 됩니다. 

 설치 방법은

# clone this repo
$ git clone https://github.com/miroslavpejic85/mirotalk.git
# go to mirotalk dir
$ cd mirotalk
# copy .env.template to .env (edit it according to your needs)
$ cp .env.template .env
# Copy app/src/config.template.js in app/src/config.js (edit it according to your needs)
$ cp app/src/config.template.js app/src/config.js
# Copy docker-compose.template.yml in docker-compose.yml (edit it according to your needs)
$ cp docker-compose.template.yml docker-compose.yml
# Get official image from Docker Hub
$ docker pull mirotalk/p2p:latest
# create and start containers
$ docker-compose up # -d

이 방법으로 설치하면 아주 쉽게 웹접속이 가능합니다.

 라이브 데모 : 

Click the link to make a call.MiroTalk calling provides real-time HD quality and latency simply not available with traditional technology.from MIROTALK

검색해봐도 잘 안나오길래 일단 써봅니다.. ^^

오픈소스를 이용한 챗봇 제작하기

typebot이라는 오픈소스를 이용해 챗봇을 만들기가 매우 쉽습니다.

사내에서 챗봇에 대한 니즈가 있어서 오픈소스를 찾아서 이거 저거 써봤는데 typebot이 가장 좋더군요.

우선 chatgpt가 알려주는 typebot의 설명입니다.

Typebot은 대화형 봇을 구축하고 운영하기 위한 플랫폼으로, 코드 작성 없이도 다양한 대화형 봇을 설계하고 배포할 수 있는 환경을 제공합니다. 주로 사용자와의 상호작용을 간소화하거나 고객 지원, 정보 제공, 자동화된 프로세스를 처리하기 위해 사용됩니다.

아래는 Typebot의 주요 특징과 기능, 사용 사례를 정리한 내용입니다.


1. Typebot의 주요 특징

1.1. 코드 없이 쉽게 설계 가능

  • 드래그 앤 드롭 인터페이스를 통해 복잡한 대화 흐름을 설계할 수 있습니다.
  • 초보자도 이해하기 쉬운 직관적인 UI 제공.

1.2. 멀티 플랫폼 지원

  • Slack, WhatsApp, 웹사이트, Facebook Messenger 등 다양한 플랫폼과의 통합이 가능.
  • 웹 임베드(embed) 기능을 통해 웹사이트에 쉽게 추가 가능.

1.3. 강력한 커스터마이징

  • 봇의 대화 스타일, 답변 논리, 조건 등을 세부적으로 설정 가능.
  • 사용자 입력에 따라 동적으로 반응하는 대화 흐름 설계 가능.

1.4. API와의 통합

  • 외부 API와의 연동을 통해 데이터를 가져오거나 동적으로 데이터를 처리 가능.
  • 예: 데이터베이스 조회, AI API 연동 등.

1.5. 분석 및 통계

  • 사용자와의 대화 데이터를 분석하여 성능 개선 가능.
  • 사용량, 클릭률, 대화 성공률 등을 시각화하여 제공.

2. 주요 기능

2.1. 대화 흐름 설계

  • 질문-응답 시퀀스를 블록으로 정의.
  • 조건 분기와 반복 로직 지원.

2.2. 사용자 입력 처리

  • 버튼 선택, 텍스트 입력, 날짜 선택 등의 다양한 입력 방식을 지원.
  • 사용자의 입력을 변수로 저장하여 다른 블록에서 재사용 가능.

2.3. 멀티미디어 지원

  • 이미지, 동영상, 링크, 파일 등을 전송 가능.

2.4. 외부 서비스 연동

  • Zapier, Integromat 같은 자동화 플랫폼과 통합.
  • Google Sheets, CRM, 이메일 서비스 등과 연동.

2.5. 다국어 지원

  • 여러 언어로 대화를 설정 가능.
  • 다국어를 사용하는 글로벌 사용자층에 적합.

3. 사용 사례

3.1. 고객 지원

  • 자주 묻는 질문(FAQ) 자동화.
  • 간단한 문제 해결 봇 구축.

3.2. 예약 시스템

  • 사용자가 날짜와 시간을 선택하면 예약을 처리.
  • 예약 확인 이메일 또는 알림 발송.

3.3. 리드 생성

  • 웹사이트 방문자와의 대화를 통해 잠재 고객 데이터를 수집.
  • 설문조사나 의견 수집.

3.4. 교육

  • 대화형 학습 모듈 제공.
  • 퀴즈 및 테스트 자동화.

4. 장점

  1. 사용 편의성: 프로그래밍 지식 없이도 빠르게 설정 가능.
  2. 유연성: 다양한 플랫폼과 통합 가능.
  3. 확장성: 외부 API와 연동하여 기능을 무한히 확장할 수 있음.
  4. 비용 효율성: 비교적 저렴한 비용으로 기업용 봇 구축 가능.

이제 설치에 대해 알아 봅시다.

  1. 도커 설치(도커가 제일 만만하고 편하죠~)
    sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl software-properties-common && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && echo “deb [arch=$(dpkg –print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin && sudo usermod -aG docker $USER && newgrp docker

    2. typebot 디렉토리 생성
    sudo mkdir typebot

3. docker-compose.yml 생성
version: ‘3.3’

volumes:
db-data:

services:
typebot-db:
image: postgres:16
restart: always
volumes:
– db-data:/var/lib/postgresql/data
environment:
– POSTGRES_DB=typebot
– POSTGRES_PASSWORD=typebot
healthcheck:
test: [“CMD-SHELL”, “pg_isready -U postgres”]
interval: 5s
timeout: 5s
retries: 5
typebot-builder:
image: baptistearno/typebot-builder:latest
restart: always
depends_on:
typebot-db:
condition: service_healthy
ports:
– ‘8080:3000’
extra_hosts:
– ‘host.docker.internal:host-gateway’
env_file: .env

typebot-viewer:
image: baptistearno/typebot-viewer:latest
depends_on:
typebot-db:
condition: service_healthy
restart: always
ports:
– ‘8081:3000’
env_file: .env

4. .env 파일 생성
Make sure to change this to your own random string of 32 characters (https://docs.typebot.io/self-hosting/deploy/docker#2-add-the-required-configuration)

ENCRYPTION_SECRET=do+UspMmB/rewbX2K/rskFmtgGSSZ8Ta

DATABASE_URL=postgresql://postgres:typebot@typebot-db:5432/typebot

NODE_OPTIONS=–no-node-snapshot

NEXTAUTH_URL=(서버 ip 혹은 도메인 기입)(관리자 페이지)
NEXT_PUBLIC_VIEWER_URL=(서버 ip 혹은 도메인 기입)(챗봇 뷰어)

ADMIN_EMAIL=(관리자 이메일)

5. docker compose up -d 명령어로 실행


* 주의사항: smtp를 꼭 설정해줘야 합니다. 그래야 관리자 페이지로 들어가거나 할때 매직링크(이메일로 코드 날라오면 해당 코드로 접속) 사용이 가능합니다.

로그인을 하면 나오는 첫 화면.. 저기서 + 버튼을 눌러서 챗봇을 만들 수 있습니다.

챗봇 크레에이터 버튼을 누르면 나오는 화면, 첫번째는 스크래치를 이용해서 블럭 쌓기 처럼 챗봇을 만들 수 있는 메뉴.

두번째는 예제 파일을 이용해서 만드는 경우. 우리는 두번째 예제 파일을 살펴볼껍니다.

템플릿 메뉴를 누르면 나오는 화면입니다. 좌측은 여러가지 예제가 있고, 예제를 선택하면 우측에는 예제가 실행되는 화면이 나옵니다. 이것을 선택해 보도록 하죠.

자 그러면 이렇게 스크래치 화면이 나오고 우측 하단에 머머리 아저씨의 동영상 설명이 나옵니다. 좌측에는 여러가지 메뉴 박스가 있고 해당 기능을 이용해서 계속해서 챗봇을 구축해 나가면 됩니다.

몇번만 해 보면 감이 오실꺼에요, 매우 쉽습니다. 물론 고급기능을 사용하기에는 부족할 수 있지만, 일반적인 챗봇은 대부분 구현이 가능할 정도로 쉽고 정교하게 구축이 가능합니다.

Ubuntu 시스템 로그 모니터링 및 알림 시스템 구현하기(with rsyslog)

이번 포스트에서는 Python을 사용하여 시스템 로그를 모니터링하고, 웹 대시보드로 표시하며, Telegram으로 알림을 보내는 통합 시스템을 구현하는 방법을 알아보겠습니다.

1. 프로젝트 개요

이 시스템은 다음과 같은 주요 기능들을 제공합니다:

  • 시스템 로그 실시간 모니터링
  • SQLite 데이터베이스에 로그 저장
  • Flask 기반 웹 대시보드
  • Telegram을 통한 알림 전송
  • 주기적인 로그 통계 보고

2. 필요한 라이브러리 및 초기 설정

python
 
import time
import os
import requests
import sqlite3
import threading
from flask import Flask, render_template_string, request, jsonify
TELEGRAM_TOKEN = “YOUR_TOKEN”
CHAT_ID = “YOUR_CHAT_ID”
TELEGRAM_LEVELS = [‘경고’, ‘마이너’, ‘메이저’, ‘치명적’]
LOG_FILE_PATH = “/var/log/syslog”

주요 라이브러리들을 임포트하고 필요한 상수들을 정의합니다. Telegram 봇 토큰과 채팅 ID는 실제 값으로 교체해야 합니다.

3. 데이터베이스 설정

python
 
def create_db_connection():
conn = sqlite3.connect('logs.db', check_same_thread=False)
conn.row_factory = sqlite3.Row
return conn
conn = create_db_connection()
cursor = conn.cursor()
cursor.execute(”’
CREATE TABLE IF NOT EXISTS logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT,
hostname TEXT,
program TEXT,
level TEXT,
message TEXT
)
”’)
conn.commit()

SQLite 데이터베이스를 설정하고 로그를 저장할 테이블을 생성합니다. check_same_thread=False는 다중 스레드 환경에서 데이터베이스 접근을 가능하게 합니다.

4. Telegram 알림 기능

python
 
def send_to_telegram(message):
url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
data = {
'chat_id': CHAT_ID,
'text': message
}
try:
response = requests.post(url, data=data)
if not response.ok:
print(f"텔레그램 메시지 전송 실패: {response.text}")
except Exception as e:
print(f"텔레그램 메시지 전송 중 오류 발생: {e}")

Telegram API를 사용하여 메시지를 전송하는 함수입니다. 예외 처리를 통해 전송 실패 시 적절한 에러 메시지를 출력합니다.

5. 로그 파싱 및 처리

python
 
def parse_log_line(line):
try:
parts = line.split(' ')
if len(parts) < 5:
return None
timestamp = ‘ ‘.join(parts[:3])
hostname = parts[3]
program_part = parts[4]
program = program_part.split(‘[‘)[0].strip(‘:’)
message = ‘ ‘.join(parts[5:])
level = “정보”

for l in TELEGRAM_LEVELS:
if f”[{l}]” in message:
level = l
message = message.replace(f”[{l}]”, “”).strip()
break

return {
‘timestamp’: timestamp,
‘hostname’: hostname,
‘program’: program,
‘level’: level,
‘message’: message
}
except Exception as e:
print(f”로그 파싱 중 예외 발생: {e})
return None

로그 라인을 파싱하여 구조화된 데이터로 변환하는 함수입니다. 시간, 호스트명, 프로그램명, 로그 레벨, 메시지를 추출합니다.

6. 실시간 로그 모니터링

python
 
def follow(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
f.seek(0, os.SEEK_END)
while True:
line = f.readline()
if line:
yield line.strip()
else:
time.sleep(0.1)
def log_monitor():
thread_conn = create_db_connection()
for line in follow(LOG_FILE_PATH):
parsed = parse_log_line(line)
if parsed:
save_to_db(
thread_conn,
parsed[‘timestamp’],
parsed[‘hostname’],
parsed[‘program’],
parsed[‘level’],
parsed[‘message’]
)

follow 함수는 파일의 새로운 라인을 지속적으로 모니터링하고, log_monitor 함수는 이를 파싱하여 데이터베이스에 저장합니다.

7. 웹 대시보드 구현

python
 
@app.route('/')
def index():
return render_template_string(TEMPLATE)
@app.route(‘/api/logs’)
def get_logs():
cursor = conn.cursor()
cursor.execute(“SELECT timestamp, hostname, program, level, message FROM logs ORDER BY timestamp DESC LIMIT 20”)
logs = cursor.fetchall()
return jsonify([dict(log) for log in logs])

Flask를 사용하여 웹 대시보드를 구현했습니다. 메인 페이지와 로그를 제공하는 API 엔드포인트를 제공합니다.

 

8. 실행 코드

python
 
if __name__ == '__main__':
threading.Thread(target=log_monitor, daemon=True).start()
threading.Thread(target=send_log_count, daemon=True).start()
app.run(host='0.0.0.0', port=5000)

두 개의 백그라운드 스레드(로그 모니터링, 통계 전송)를 시작하고 Flask 애플리케이션을 실행합니다.

import time
import os
import requests
import sqlite3
import threading
from flask import Flask, render_template_string, request, jsonify

# 텔레그램 토큰 및 채팅 ID 하드코딩
TELEGRAM_TOKEN = “YOUR_TELEGRAM_TOKEN”
CHAT_ID = “YOUR_CHAT_ID”

# 텔레그램으로 전송할 로그 레벨
TELEGRAM_LEVELS = [‘경고’, ‘마이너’, ‘메이저’, ‘치명적’]

# 로그 파일 경로 설정
LOG_FILE_PATH = “/var/log/syslog”

# Flask 애플리케이션 설정
app = Flask(__name__)

# 데이터베이스 설정
def create_db_connection():
conn = sqlite3.connect(‘logs.db’, check_same_thread=False)
conn.row_factory = sqlite3.Row # 딕셔너리 형식으로 결과 반환
return conn

# 데이터베이스 초기화
conn = create_db_connection()
cursor = conn.cursor()
cursor.execute(”’
CREATE TABLE IF NOT EXISTS logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT,
hostname TEXT,
program TEXT,
level TEXT,
message TEXT
)
”’)
conn.commit()

# 텔레그램 메시지 전송 함수
def send_to_telegram(message):
url = f”https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage”
data = {
‘chat_id’: CHAT_ID,
‘text’: message
}
try:
response = requests.post(url, data=data)
if not response.ok:
print(f”텔레그램 메시지 전송 실패: {response.text}”)
except Exception as e:
print(f”텔레그램 메시지 전송 중 오류 발생: {e}”)

# 데이터베이스에 로그 저장
def save_to_db(conn, timestamp, hostname, program, level, message):
try:
cursor = conn.cursor()
cursor.execute(”’
INSERT INTO logs (timestamp, hostname, program, level, message)
VALUES (?, ?, ?, ?, ?)
”’, (timestamp, hostname, program, level, message))
conn.commit()
except Exception as e:
print(f”데이터베이스 저장 중 오류 발생: {e}”)

# 로그 라인 파싱
def parse_log_line(line):
try:
parts = line.split(‘ ‘)
if len(parts) < 5:
return None

timestamp = ‘ ‘.join(parts[:3])
hostname = parts[3]
program_part = parts[4]
program = program_part.split(‘[‘)[0].strip(‘:’)
message = ‘ ‘.join(parts[5:])
level = “정보”

for l in TELEGRAM_LEVELS:
if f”[{l}]” in message:
level = l
message = message.replace(f”[{l}]”, “”).strip()
break

return {
‘timestamp’: timestamp,
‘hostname’: hostname,
‘program’: program,
‘level’: level,
‘message’: message
}
except Exception as e:
print(f”로그 파싱 중 예외 발생: {e}”)
return None

# 로그 파일 실시간 읽기
def follow(file_path):
with open(file_path, ‘r’, encoding=’utf-8′) as f:
f.seek(0, os.SEEK_END)
while True:
line = f.readline()
if line:
yield line.strip()
else:
time.sleep(0.1)

# 로그 모니터링 스레드
def log_monitor():
thread_conn = create_db_connection()
for line in follow(LOG_FILE_PATH):
parsed = parse_log_line(line)
if parsed:
save_to_db(
thread_conn,
parsed[‘timestamp’],
parsed[‘hostname’],
parsed[‘program’],
parsed[‘level’],
parsed[‘message’]
)

# 3분마다 로그 개수 텔레그램으로 전송
def send_log_count():
thread_conn = create_db_connection()
while True:
cursor = thread_conn.cursor()
cursor.execute(“SELECT COUNT(*) as count FROM logs”)
log_count = cursor.fetchone()[‘count’]
send_to_telegram(f”지난 3분 동안 데이터베이스에 쌓인 로그 개수: {log_count}”)
time.sleep(180)

# Flask 웹 라우트
@app.route(‘/’)
def index():
return render_template_string(TEMPLATE)

@app.route(‘/api/logs’)
def get_logs():
cursor = conn.cursor()
cursor.execute(“SELECT timestamp, hostname, program, level, message FROM logs ORDER BY timestamp DESC LIMIT 20”)
logs = cursor.fetchall()
return jsonify([dict(log) for log in logs])

# HTML 템플릿
TEMPLATE = ”’
<!DOCTYPE html>
<html lang=”ko”>
<head>
<meta charset=”UTF-8″>
<title>로그 대시보드</title>
<style>
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #ddd; padding: 8px; }
th { background-color: #f2f2f2; text-align: left; }
</style>
<script>
async function fetchLogs() {
const response = await fetch(‘/api/logs’);
const logs = await response.json();
const tableBody = document.getElementById(‘logs-body’);
tableBody.innerHTML = ”;
logs.forEach(log => {
const row = `<tr>
<td>${log.timestamp}</td>
<td>${log.hostname}</td>
<td>${log.program}</td>
<td>${log.level}</td>
<td>${log.message}</td>
</tr>`;
tableBody.innerHTML += row;
});
}
setInterval(fetchLogs, 5000); // 5초마다 갱신
window.onload = fetchLogs;
</script>
</head>
<body>
<h1>로그 대시보드</h1>
<table>
<thead>
<tr>
<th>시간</th>
<th>호스트명</th>
<th>프로그램</th>
<th>레벨</th>
<th>메시지</th>
</tr>
</thead>
<tbody id=”logs-body”></tbody>
</table>
</body>
</html>
”’

# Flask 앱 실행
if __name__ == ‘__main__’:
threading.Thread(target=log_monitor, daemon=True).start()
threading.Thread(target=send_log_count, daemon=True).start()
app.run(host=’0.0.0.0′, port=5000)

OpenSSH의 치명적 취약점: regreSSHion (CVE-2024-6387)

OpenSSH의 치명적 취약점: regreSSHion (CVE-2024-6387)

최근, 보안 업계에서 큰 관심을 끄는 취약점이 발견되었습니다. Qualys Threat Research Unit(TRU)은 glibc 기반 Linux 시스템에서 실행되는 **OpenSSH 서버(sshd)**에서 인증되지 않은 원격 코드 실행(RCE) 취약점을 발견했으며, 이를 **regreSSHion (CVE-2024-6387)**이라 명명했습니다. 이 취약점은 심각한 악용 가능성을 내포하고 있으며, 기본 설정으로도 전체 루트 권한을 부여할 수 있어 보안에 큰 위협이 되고 있습니다.

regreSSHion: 치명적인 RCE 취약점

regreSSHion은 인증 없이도 원격에서 코드 실행이 가능하여 공격자가 서버의 루트 권한을 획득할 수 있는 취약점입니다. 이로 인해 사용자 상호 작용이 필요 없으며, OpenSSH 서버가 실행되고 있는 기본 구성에서도 즉시 악용될 수 있습니다. 이 취약점은 OpenSSH 보안에 있어 거의 20년 만에 처음 발견된 큰 결함으로, 특히 주목을 받고 있습니다.

regreSSHion의 배경과 회귀의 의미

이번에 발견된 regreSSHion 취약점은 2006년의 CVE-2006-5051 취약점과 관련이 있습니다. Qualys TRU의 분석에 따르면, 이 취약점은 2006년에 보고되고 패치된 결함이 시간이 지나면서 회귀(regression) 현상을 통해 다시 나타난 경우입니다. 회귀란 이전에 수정되었던 문제가 코드 변경이나 소프트웨어 업데이트 과정에서 실수로 다시 발생하게 되는 상황을 의미합니다. regreSSHion이라는 이름도 회귀 현상과 SSH를 합친 것입니다.

이 회귀는 OpenSSH의 8.5p1 버전(2020년 10월 출시)에서 도입되었으며, 최신 버전인 9.8p1까지 영향을 미치고 있습니다. 이 사건은 철저한 회귀 테스트의 필요성을 다시금 일깨워 주며, 알려진 취약점이 실수로 재도입되는 것을 방지하는 데 매우 중요한 역할을 합니다.

영향을 받는 OpenSSH 버전

  • 4.4p1 이전 버전: CVE-2006-5051 및 CVE-2008-4109의 패치가 적용되지 않았다면, 신호 핸들러 경쟁 조건 취약점에 노출됩니다.
  • 4.4p1부터 8.5p1까지: CVE-2006-5051에 대한 혁신적인 패치 덕분에 이 취약점에 안전합니다.
  • 8.5p1부터 9.8p1까지: 함수의 중요한 구성 요소가 실수로 제거되며, 이로 인해 regreSSHion 취약점이 다시 나타나게 되었습니다.

OpenSSH란 무엇인가?

OpenSSH는 SSH 프로토콜 기반의 보안 네트워킹 유틸리티로, 보안이 요구되는 네트워크 환경에서 강력한 암호화와 원격 서버 관리를 지원합니다. Linux 및 macOS와 같은 Unix 계열 시스템에서 널리 사용되며, 여러 암호화 기술과 강력한 액세스 제어를 통해 네트워크 통신의 기밀성과 무결성을 유지하는 필수 도구로 자리 잡았습니다. 최근 발생한 취약점에도 불구하고, OpenSSH는 오랜 기간 신뢰받아 온 보안 네트워킹 도구입니다.

마무리

이번 regreSSHion(CVE-2024-6387) 취약점은 OpenSSH의 신뢰성을 크게 흔드는 사건이지만, 이를 통해 보안 소프트웨어의 지속적인 회귀 테스트와 강화된 검토가 필수적임을 알게 되었습니다. 향후 보안 패치가 발표될 때까지는 네트워크 보안 관리자가 OpenSSH 서버를 주의 깊게 모니터링하고, 잠재적인 공격에 대비할 필요가 있습니다.

홈 서버 구축을 위한 최적의 선택, Proxmox VE

가정에서 홈 서버나 홈랩을 구축하려고 할 때, 많은 분들이 처음 고민하는 것이 가상화 플랫폼의 선택일 것입니다. VMware vSphere는 업계 표준이지만 라이선스 비용이 만만치 않죠. 오늘은 무료로 사용할 수 있으면서도 엔터프라이즈급 기능을 제공하는 Proxmox VE를 소개하고자 합니다.

비용 부담 없는 시작

  • VMware vSphere의 경우 가정에서 테스트용으로 사용하더라도 라이선스 비용이 발생
  • Proxmox VE는 완전한 오픈소스로 무료로 사용 가능
  • 기업용 서브스크립션이 있지만, 홈랩 용도라면 커뮤니티 버전으로 충분

다운로드 : https://www.proxmox.com/en/downloads

(N100 서버에 실제 구동하고 있는 다양한 서비스들)

놀라운 기본 기능들

Proxmox VE는 생각보다 훨씬 더 많은 기능들을 기본으로 제공합니다:

1. 통합된 스토리지 관리

  • ZFS 기본 지원으로 데이터 안정성 보장
  • Ceph 통합으로 분산 스토리지 구성 가능
  • NFS, iSCSI, SMB 등 다양한 스토리지 프로토콜 지원

2. 백업 및 복구

  • 내장된 백업 기능으로 VM/CT 전체 백업
  • 증분 백업 지원으로 효율적인 백업 관리
  • 스냅샷 기능으로 빠른 복구 지점 생성

3. 고가용성(HA) 기능

  • 무료 버전에서도 클러스터링 지원
  • 노드 간 실시간 마이그레이션
  • 자동 페일오버 구성 가능

4. 컨테이너와 VM 통합 관리

  • KVM 가상머신과 LXC 컨테이너 동시 지원
  • 웹 인터페이스에서 통합 관리
  • 템플릿을 통한 빠른 배포

5. 네트워크 가상화

  • 내장된 방화벽 기능
  • VLAN, 본딩 등 고급 네트워크 기능
  • SDN(Software Defined Networking) 지원

사용자 친화적인 관리

  • 직관적인 웹 인터페이스 제공
  • CLI를 통한 고급 관리 가능
  • REST API로 자동화 구현 용이
  • 상세한 리소스 모니터링 제공

활발한 커뮤니티

  • 광범위한 문서화
  • 활발한 포럼 활동
  • 지속적인 업데이트와 버그 수정
  • 다양한 커뮤니티 템플릿 제공

그렇기에,

Proxmox VE는 단순히 “무료 대안”이 아닌, 엔터프라이즈급 기능을 제공하는 완성도 높은 가상화 플랫폼입니다. VMware의 대안을 찾고 계신다면, 특히 홈랩 환경에서는 Proxmox VE가 최적의 선택이 될 수 있습니다. 무료로 제공되는 기능만으로도 대부분의 홈랩 시나리오를 충분히 커버할 수 있으며, 고급 기능들도 별도의 비용 없이 사용할 수 있다는 점이 큰 장점입니다.

추가로, Proxmox VE는 계속해서 발전하고 있으며, 매 릴리스마다 새로운 기능들이 추가되고 있습니다. 홈랩을 시작하시는 분들께 자신 있게 추천드릴 수 있는 플랫폼입니다.

옵시디언에 로컬 LLM(LM Studio 0.35 최신 버전 기준)연결

LM스튜디오를 처음 실행하면 왼쪽 하단에 디벨로퍼 혹은 파워 유저를 선택한다.

(그래야 디벨로퍼 메뉴가 나옴)

디벨로퍼 메뉴에 들어 오면 우측에
The local server is reachable at this address
요기에 표시되는 사설 ip를 복사한다.
(물론 상단에 스타트 서버를 꼭 눌러 주도록)


옵시디언 -> 설정 -> 커뮤니티 플러그인 -> 탐색에 가서 copilot을 설치해주고 활성화 해준다.

코파일럿 설정으로 와서 Add Custom Model을 선택하고 (*이후 부터 중요함)

모델네임(이미지와 같이 당신이 lm스튜디오에 로드한 모델이름을 입력해 준다)을 잘 작성해주고

프로바이더는 lmstudio를 선택하고

가장 중요한 베이스 url을 잘 입력해 줘야 한다.

lm스튜디오 디벨로퍼 메뉴에 있다. 참고 이미지 참조.

마지막으로 코파일럿에서 애드 모델을 해 주면 윗윗 짤 처럼 모델이 추가 되었을것이다.

CORS항목에 꼭 체크를 잊지 말것! (이거 체크 안하면 서로 통신이 안됨)