13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] 홈랩

  • [NAS] TrueNAS SCALE 앱 배포: Docker 컨테이너부터 관리까지

    NAS가 단순 저장소였던 시대는 끝났습니다

    홈랩을 운영하다 보면 어느 순간 이런 생각이 드시지 않나요? “NAS에 데이터만 넣어두기엔 너무 아깝다.” 저도 처음엔 그냥 파일 서버로 쓰다가, 어느 날 Plex를 띄워보고 나서 생각이 완전히 바뀌었거든요. 그 이후로 TrueNAS SCALE 위에서 십수 개의 서비스를 돌리고 있습니다.

    근데 솔직히 말씀드리면, 처음에 TrueNAS SCALE 앱 시스템을 접했을 때 꽤 헷갈렸어요. 버전마다 배포 방식이 달라지고, 한글 자료도 많지 않아서 삽질을 꽤 했거든요. 이번 글에서는 제가 직접 겪어온 경험을 바탕으로, TrueNAS SCALE에서 앱을 배포하고 관리하는 방법을 처음부터 끝까지 정리해 드리겠습니다.

    TrueNAS SCALE 위에서 여러 컨테이너 앱이 동작하는 홈랩 전체 아키텍처. 스토리지, 네트워킹, 앱 레이어가 통합된 모습입니다.

    TrueNAS SCALE 앱 시스템이 바뀐 이유

    여기서 중요한 역사 이야기를 하나 해야 할 것 같아요. TrueNAS SCALE의 앱 시스템은 버전을 거치면서 꽤 큰 변화가 있었거든요.

    초기 버전(Angelfish, Bluefin, Cobia 등)에서는 K3s(경량 쿠버네티스)를 기반으로 앱을 운영했습니다. 쿠버네티스를 쓴다니까 좋아 보이긴 했는데, 일반 홈랩 사용자 입장에서는 진입 장벽이 꽤 높았어요. Helm 차트 구조도 이해해야 하고, 리소스 관리가 복잡하다는 불만도 많았고요.

    그래서 iXsystems는 Electric Eel(24.10) 버전부터 TrueNAS SCALE 앱 시스템을 Docker Compose 기반으로 전면 바꿨습니다. 쿠버네티스를 걷어내고 훨씬 직관적인 Docker Compose 방식을 채택한 거죠. 솔직히 처음엔 “아니 왜 바꾸는 거야”라고 생각했는데, 써보니 훨씬 낫더라고요.

    • 이전(~Dragonfish): K3s + Helm Chart 기반, TrueCharts 커뮤니티 카탈로그 의존도 높음
    • 이후(Electric Eel~): Docker Compose 기반, 공식 카탈로그 + 커스텀 컨테이너 지원

    이 글은 Electric Eel 이후의 Docker Compose 기반 앱 시스템을 중심으로 설명합니다. 혹시 구버전 사용 중이시라면 업그레이드를 먼저 하시길 권장합니다.

    시작 전 준비사항 체크

    본격적으로 TrueNAS SCALE 앱 배포에 들어가기 전에 확인해야 할 것들이 있어요. 저도 이걸 안 하고 바로 들어갔다가 중간에 막혀서 처음부터 다시 한 경험이 있거든요 😅

    1. 풀(Pool) 설정 확인: 앱 데이터를 저장할 ZFS 풀이 생성되어 있어야 합니다. 저는 SSD 별도 풀을 만들어서 앱 전용으로 씁니다.
    2. Apps 전용 풀 지정: TrueNAS SCALE에서 Apps 탭으로 이동하면, 앱 데이터를 저장할 풀을 처음 한 번 지정하게 돼 있어요. 나중에 바꾸기 귀찮으니 처음에 잘 골라두세요.
    3. 네트워크 설정: 외부에서 접근이 필요한 앱이라면, 공유기 포트 포워딩이나 Reverse Proxy(리버스 프록시) 설정도 미리 생각해두면 좋습니다.
    4. TrueNAS SCALE 버전: 앞서 말씀드린 것처럼, 가능하면 Electric Eel(24.10) 이상으로 업그레이드하고 시작하세요.

    TrueNAS SCALE 앱 카탈로그에서 첫 번째 앱 설치하기

    준비가 됐다면 이제 실전입니다! TrueNAS SCALE 웹 UI 왼쪽 메뉴에서 Apps를 클릭하세요. 처음 접속하면 앱 풀(pool)을 선택하라고 나옵니다. 앞서 준비한 풀을 선택하면 돼요.

    앱 화면으로 들어오면 Discover Apps 버튼이 보입니다. 여기서 공식 카탈로그에 등록된 앱들을 검색하고 설치할 수 있어요. Plex, Nextcloud, Jellyfin, Home Assistant 같은 인기 홈랩 앱들이 대부분 등록되어 있습니다.

    예시로 Jellyfin(미디어 서버)을 설치해볼게요.

    1. Discover Apps에서 “Jellyfin” 검색
    2. 앱 카드 클릭 → Install 버튼 클릭
    3. 설정 화면에서 주요 항목 입력:
      • Application Name: jellyfin (기본값 그대로)
      • Network Configuration: 포트 번호 설정 (기본 8096)
      • Storage Configuration: 미디어 파일이 있는 데이터셋 경로 지정
    4. Install 클릭 후 배포 완료 대기

    설치가 완료되면 앱 목록에 Jellyfin이 나타나고, http://NAS-IP:8096으로 접속할 수 있어요. 드디어 됐다! 라는 느낌이 이때 오더라고요 🎉

    TrueNAS SCALE Apps 탭의 카탈로그 화면. Discover Apps에서 원하는 앱을 검색하고 GUI로 간편하게 설치할 수 있습니다.

    Docker 컨테이너 직접 배포하기 (Custom App)

    카탈로그에 없는 앱을 써야 할 때가 있죠. 저도 특정 오픈소스 툴을 올리고 싶은데 카탈로그에 없을 때, 직접 Docker 이미지를 지정해서 배포하는 방법을 씁니다. Docker on TrueNAS를 활용하는 방식이에요.

    Discover Apps 화면 오른쪽 위를 보면 Custom App 버튼이 있습니다. 이걸 누르면 Docker Compose 방식으로 직접 컨테이너를 정의할 수 있는 화면이 나와요.

    예시로 Uptime Kuma(서비스 모니터링 앱)를 커스텀 앱으로 배포해볼게요.

    # Custom App 설정에서 사용하는 Docker Compose 예시
    services:
      uptime-kuma:
        image: louislam/uptime-kuma:latest
        container_name: uptime-kuma
        ports:
          - "3001:3001"
        volumes:
          - /mnt/pool/apps/uptime-kuma:/app/data
        restart: unless-stopped

    TrueNAS SCALE의 Custom App UI에서는 이걸 GUI 폼으로 입력할 수 있어요. 직접 YAML을 쓰는 방식도 지원되고, 폼 형태로도 입력 가능합니다.

    핵심 입력 항목들은 이렇습니다:

    항목 설명 예시
    Image Repository Docker Hub 이미지 이름 louislam/uptime-kuma
    Image Tag 버전 태그 latest 또는 1.23.x
    Container Port 컨테이너 내부 포트 3001
    Node Port 호스트에서 접근할 포트 3001
    Host Path TrueNAS 데이터셋 경로 /mnt/pool/apps/uptime-kuma
    Mount Path 컨테이너 내부 마운트 경로 /app/data

    💡 팁: 볼륨 경로는 반드시 미리 ZFS 데이터셋으로 만들어두고 마운트하는 게 좋습니다. 그냥 디렉토리 경로를 쓰면 나중에 스냅샷 관리가 안 되거든요. 이거 처음에 몰라서 나중에 다 옮긴 적이 있습니다 ㅎㅎ.

    환경 변수와 네트워크 설정 팁

    컨테이너를 배포할 때 환경 변수(Environment Variable) 설정이 필요한 경우가 많아요. 예를 들어 데이터베이스 비밀번호, API 키 같은 것들이요.

    Custom App 설정 화면에서 Environment Variables 섹션을 찾으면 Key-Value 형태로 추가할 수 있습니다.

    # 환경 변수 예시 (Nextcloud 같은 경우)
    MYSQL_DATABASE=nextcloud
    MYSQL_USER=ncuser
    MYSQL_PASSWORD=your_secure_password
    NEXTCLOUD_ADMIN_USER=admin
    NEXTCLOUD_ADMIN_PASSWORD=admin_password

    네트워크 관련해서 한 가지 더 말씀드리면, TrueNAS SCALE에서 여러 앱이 서로 통신해야 할 때(예: 웹 앱 + DB 컨테이너) 같은 Docker 네트워크에 묶어야 해요. Custom App에서 Network Configuration 섹션에서 네트워크를 지정할 수 있습니다. 이 부분은 처음엔 좀 헷갈릴 수 있는데, 같은 앱 스택이라면 동일한 사용자 정의 네트워크를 사용하면 돼요.

    ⚠️ 트러블슈팅: 자주 겪는 문제들

    13년 동안 인프라 일을 하면서 깨달은 건, 문서대로 안 되는 게 정상이라는 거예요 ㅎㅎ. TrueNAS SCALE 앱 배포하면서 자주 만나는 문제들과 해결법을 공유합니다.

    문제 1: 앱이 Deploying 상태에서 멈춤

    가장 흔한 문제예요. 배포 눌렀는데 한참 동안 Deploying 상태에서 안 바뀌는 경우.

    원인 대부분은 이미지 풀(pull) 실패입니다. 이미지 이름이 틀렸거나, NAS가 인터넷에 제대로 연결 안 됐을 때 주로 발생해요.

    # TrueNAS Shell에서 컨테이너 로그 확인
    docker logs [컨테이너_이름]
    
    # 이미지가 제대로 받아졌는지 확인
    docker images | grep [앱_이름]

    문제 2: 볼륨 마운트 권한 오류

    앱은 뜨는데 데이터를 못 쓰는 경우가 있어요. 특히 컨테이너가 특정 UID로 실행되는데, 마운트한 경로의 소유자가 다를 때 발생합니다.

    # TrueNAS Shell에서 권한 확인 및 수정
    ls -la /mnt/pool/apps/uptime-kuma
    
    # 필요하다면 소유자 변경 (999는 예시 UID, 앱마다 다름)
    chown -R 999:999 /mnt/pool/apps/uptime-kuma

    💡 팁: Docker Hub의 해당 이미지 문서에 어떤 UID로 실행되는지 나와 있는 경우가 많아요. 미리 확인하고 데이터셋 권한을 맞춰두면 삽질을 줄일 수 있습니다.

    문제 3: 포트 충돌

    “이미 사용 중인 포트”라는 오류가 뜨는 경우요. 앱들이 기본 포트가 겹칠 때 발생합니다. 예를 들어 여러 웹 앱이 다 80번 포트를 쓰려 하면 충돌이 나죠.

    해결책은 단순합니다. 앱 설치 시 Node Port를 겹치지 않게 다른 번호로 바꿔주면 돼요. 저는 개인적으로 앱별로 포트 번호를 스프레드시트에 정리해두고 쓰고 있습니다. 처음엔 귀찮아 보여도, 앱이 10개 이상 넘어가면 이게 필수예요.

    TrueNAS SCALE 앱 관리 및 업데이트

    설치하고 끝이 아니죠. 앱 관리도 중요합니다. TrueNAS SCALE에서 설치된 앱의 업데이트는 Apps 탭 → Installed 화면에서 할 수 있어요.

    업데이트 가능한 앱이 있으면 배지(badge)가 표시되고, Update All 버튼으로 한 번에 업데이트도 가능합니다. 근데 저는 한 번에 다 올리기보다는, 중요한 앱은 하나씩 올리고 확인하는 편이에요. 한 번에 다 올렸다가 뭔가 깨지면 어디서 문제가 생긴 건지 찾기 어렵거든요.

    앱 데이터 백업은 ZFS 스냅샷을 활용하는 게 최고입니다. 앱 데이터를 담은 데이터셋에 정기 스냅샷을 걸어두면, 앱이 망가졌을 때 스냅샷으로 롤백이 가능해요. 이게 TrueNAS SCALE을 쓰는 가장 큰 이유 중 하나라고 생각합니다.

    TrueNAS SCALE Apps의 Installed 탭. 실행 중인 앱 상태, 업데이트 가능 여부, 리소스 사용량을 한눈에 확인할 수 있습니다.

    ✅ 실전 구성: 제 홈랩 앱 운영 사례

    참고로 현재 제가 TrueNAS SCALE 위에서 돌리고 있는 주요 앱들을 공유할게요. 비슷한 구성을 계획하시는 분들께 도움이 될 것 같아서요.

    앱 이름 용도 설치 방법
    Jellyfin 미디어 서버 (영화, 음악) 공식 카탈로그
    Nextcloud 개인 클라우드 스토리지 공식 카탈로그
    Home Assistant 스마트홈 허브 공식 카탈로그
    Uptime Kuma 서비스 모니터링 Custom App
    Vaultwarden 비밀번호 관리자 Custom App
    Nginx Proxy Manager 리버스 프록시 + SSL Custom App

    모두 ZFS 데이터셋에 데이터를 저장하고, 매일 새벽 3시에 스냅샷이 자동으로 찍히도록 설정해뒀습니다. 덕분에 앱 업데이트 실패나 설정 꼬임 같은 상황에서도 걱정 없이 복구할 수 있어요. 실제로 Home Assistant 업데이트 후 통합 설정이 날아갔을 때 스냅샷으로 5분 만에 복구한 적도 있습니다 😅

    현재 운영 중인 홈랩의 앱 구성 요약. TrueNAS SCALE 위에서 미디어, 클라우드, 모니터링, 보안 앱들이 유기적으로 연동되는 모습입니다.

    마무리: TrueNAS SCALE 앱 배포, 이렇게 시작하세요

    오늘 다룬 내용을 간단히 정리해볼게요.

    • ✅ TrueNAS SCALE은 Electric Eel(24.10)부터 Docker Compose 기반 앱 시스템으로 전환됨
    • ✅ 공식 카탈로그 앱은 GUI로 손쉽게 설치 가능
    • ✅ 카탈로그에 없는 앱은 Custom App 기능으로 Docker 이미지 직접 지정 배포
    • ✅ 볼륨은 반드시 ZFS 데이터셋으로 분리해서 관리할 것
    • ✅ 스냅샷 정책을 함께 설정해두면 백업/복구가 정말 편함

    처음 TrueNAS SCALE 앱 시스템을 접하면 설정 항목이 많아서 막막할 수 있어요. 근데 한 번 익숙해지면 정말 편합니다. 스토리지와 앱을 같은 플랫폼에서 관리한다는 게 이렇게 편할 줄 몰랐다는 생각이 드실 거예요.

    다음 글에서는 Nginx Proxy Manager와 Let’s Encrypt를 이용한 HTTPS 설정을 다룰 예정입니다. 외부에서 도메인으로 안전하게 접근하는 방법인데, 홈랩을 한 단계 업그레이드하고 싶은 분들께 유용할 거예요. 이전 글에서 다뤘던 ZFS 데이터셋 구성과 함께 보시면 더 도움이 됩니다.

    궁금한 점이 있으면 댓글로 남겨주세요. 같이 삽질하며 발전하는 홈랩 라이프, 응원합니다! 🎉

  • [AI] Gemini API 실전 활용 가이드: 멀티모달 기능으로 AI 서비스 구축하기

    Gemini API 실전 활용 가이드: 멀티모달 AI 서비스 구축하기

    안녕하세요, 13년차의 서버실 주인장, 인프라 엔지니어입니다. 요즘 AI 기술 발전 속도가 정말 무섭다는 생각이 들어요. 특히 Gemini API가 등장하면서 텍스트뿐만 아니라 이미지, 오디오, 비디오까지 한 번에 처리하는 멀티모달 AI(Multimodal AI)의 시대가 본격적으로 열렸거든요. 저도 처음엔 ‘이게 정말 될까?’ 싶었는데, 직접 홈랩에서 굴려보니 그 잠재력에 깜짝 놀랐어요. 오늘은 저처럼 새로운 AI 서비스를 구축하고 싶으신 분들을 위해 Gemini API 활용법을 실전 경험 위주로 풀어볼까 합니다. 삽질 과정도 솔직하게 공유할 테니, 여러분은 저보다 더 쉽고 빠르게 목표를 달성하시길 바랍니다! 💡

    그림 1: Gemini API를 활용한 멀티모달 AI 서비스의 개요

    1. Gemini API, 무엇이 그렇게 특별할까요?

    Gemini API는 Google에서 개발한 차세대 대규모 언어 모델(LLM)인 Gemini 모델에 접근할 수 있게 해주는 인터페이스(API)예요. 그런데 단순히 텍스트만 주고받는 LLM과는 결이 다릅니다. 가장 큰 특징은 바로 멀티모달(Multimodal) 기능인데요. 쉽게 말해, 텍스트는 물론이고 이미지, 오디오, 비디오 등 여러 형태의 데이터를 동시에 이해하고 처리할 수 있다는 뜻입니다. 예를 들어, 이미지와 함께 질문을 던지면 이미지를 보고 답변을 해주는 식이죠.

    제가 이 기능을 처음 써봤을 때, ‘와, 이제 AI가 정말 세상을 보는 것 같구나’라는 생각이 들더라고요. 기존에는 이미지를 분석하려면 별도의 이미지 분석 모델을 거쳐야 했는데, Gemini API는 이 모든 걸 한 번에 처리해주니 AI 서비스 구축 과정이 훨씬 간결해졌어요. 특히, Google AI Studio(구 MakerSuite) 같은 도구를 활용하면 코딩 없이도 빠르게 프로토타입을 만들 수 있어서 개발 속도가 확 빨라지는 경험을 했습니다.

    2. Google AI Studio에서 Gemini API 시작하기

    Gemini API 활용의 첫걸음은 API 키를 발급받는 거예요. Google AI Studio에 접속하면 이 과정을 정말 쉽게 진행할 수 있어요. 별도의 복잡한 가입 절차 없이 Google 계정만 있으면 바로 시작할 수 있죠. 저도 처음엔 개발자 콘솔에서 복잡한 과정을 예상했는데, 생각보다 너무 간단해서 놀랐습니다.

    1. Google AI Studio (aistudio.google.com)에 접속합니다.
    2. 좌측 메뉴에서 ‘Get API key’를 클릭합니다.
    3. ‘Create API key in new project’ 또는 ‘Create API key in existing project’를 선택하여 API 키를 발급받습니다.
    4. 발급받은 API 키는 안전한 곳에 보관해야 합니다. 외부에 노출되지 않도록 각별히 주의하세요! ⚠️

    이렇게 API 키를 받았다면, 이제 여러분의 AI 서비스 구축 여정의 절반은 온 거예요. 이 키를 가지고 실제로 API를 호출해볼까요?

    3. Python으로 Gemini API 실전 구현: 멀티모달 챗봇 만들기

    이제 본격적으로 코드를 작성해볼 시간이에요. 저는 주로 Python을 사용해서 API 연동 작업을 하는데요, Gemini API도 Python SDK를 제공해서 정말 편리합니다. 이번 예제에서는 이미지와 텍스트를 동시에 입력받아 답변하는 간단한 멀티모달 챗봇을 만들어보겠습니다.

    3.1. 환경 설정

    먼저 필요한 라이브러리를 설치해야 합니다. 터미널에서 다음 명령어를 실행하세요.

    
    pip install google-generativeai pillow
    

    pillow는 이미지 처리를 위해 필요합니다.

    3.2. API 호출 코드 작성

    다음은 API 키를 설정하고 Gemini API를 호출하는 Python 코드입니다. 저는 보통 .env 파일에 API 키를 저장하고 python-dotenv 라이브러리로 불러오는데, 여기서는 예제 편의상 직접 코드로 넣겠습니다. 실제 운영 환경에서는 환경 변수(Environment Variable)를 사용하는 걸 강력히 권장합니다.

    
    import google.generativeai as genai
    from PIL import Image
    import io
    import os
    
    # 발급받은 API 키를 여기에 입력하세요.
    # 실제 환경에서는 환경 변수를 사용하는 것이 안전합니다.
    GOOGLE_API_KEY = "YOUR_API_KEY"
    genai.configure(api_key=GOOGLE_API_KEY)
    
    # Gemini 2.0 Flash 모델 로드 (멀티모달 기능 지원)
    model = genai.GenerativeModel('gemini-2.0-flash')
    
    def generate_multimodal_response(image_path, text_prompt):
        try:
            # 이미지 파일 로드
            img = Image.open(image_path)
            
            # API에 전달할 콘텐츠 구성
            # 텍스트와 이미지 데이터를 리스트 형태로 전달합니다.
            contents = [
                text_prompt,
                img
            ]
            
            # Gemini API 호출
            response = model.generate_content(contents)
            return response.text
        except Exception as e:
            return f"오류 발생: {e}"
    
    if __name__ == "__main__":
        # 예제 이미지 파일 (실제 이미지 파일 경로로 변경하세요)
        # 저는 홈랩에서 찍은 서버랙 사진으로 테스트해봤어요 ㅎㅎ
        sample_image_path = "./server_rack.jpg" 
        sample_text_prompt = "이 사진에 보이는 것에 대해 설명하고, 특별히 관리해야 할 부분이 있다면 알려줘."
    
        # 이미지 파일이 존재하는지 확인
        if not os.path.exists(sample_image_path):
            print(f"⚠️ {sample_image_path} 파일을 찾을 수 없습니다. 예제 이미지 파일을 준비해주세요.")
        else:
            print(f"질문: {sample_text_prompt}")
            print("이미지와 함께 Gemini API에 요청 중...")
            response_text = generate_multimodal_response(sample_image_path, sample_text_prompt)
            print("\nGemini 답변:")
            print(response_text)
    
    

    이 코드를 실행하려면 server_rack.jpg라는 이미지 파일이 코드와 같은 디렉토리에 있어야 해요. 저는 집에 있는 서버랙 사진을 찍어서 테스트해봤는데, AI가 팬 소음이 크지 않은지, 케이블 정리가 잘 되어 있는지 같은 조언을 해주더라고요. 정말 신기했어요! 🎉

    그림 2: Google AI Studio에서 멀티모달 프롬프트를 테스트하는 모습

    4. 삽질 경험: API Rate Limit과 Token 제한

    제가 Gemini API를 가지고 놀면서 가장 많이 겪었던 삽질은 바로 API Rate Limit(API 호출 제한)과 Token Limit(토큰 제한)이었어요. 처음에는 아무 생각 없이 테스트 스크립트를 여러 번 돌리다가 갑자기 에러를 만나 당황했죠. ⚠️

    • API Rate Limit: 일정 시간 동안 호출할 수 있는 API 요청 횟수 제한입니다. 너무 빠르게 많은 요청을 보내면 ‘Resource Exhausted’ 같은 에러 메시지를 보게 돼요. 저처럼 성격 급한 개발자라면 특히 조심해야 할 부분이에요. 해결책으로는 요청 사이에 time.sleep()을 넣어 딜레이를 주거나, 재시도 로직(Retry Logic)을 구현해서 지수 백오프(Exponential Backoff) 방식으로 요청을 보내는 것이 좋습니다.
    • Token Limit: Gemini 모델이 한 번에 처리할 수 있는 입력(Prompt) 및 출력(Response)의 최대 토큰(Token) 수입니다. 토큰은 단어, 구두점 등 AI가 이해하는 단위라고 생각하시면 돼요. 멀티모달의 경우 이미지도 특정 토큰 양으로 환산됩니다. 너무 긴 텍스트나 고해상도 이미지를 보내면 이 제한에 걸릴 수 있어요. 이럴 땐 입력 텍스트를 요약하거나, 이미지를 압축하여 해상도를 낮추는 등의 방법을 고려해야 합니다.

    이런 제한들은 안정적인 AI 서비스 구축을 위해 반드시 고려해야 할 부분이에요. 무작정 API를 호출하기보다, 각 모델의 제한 사항을 미리 확인하고 설계에 반영하는 습관이 중요합니다. 💡

    5. 결과 확인 및 활용 아이디어

    위 Python 코드를 실행하면 Gemini 모델이 이미지와 텍스트 프롬프트를 기반으로 답변을 생성하는 것을 확인할 수 있습니다. 예를 들어, 서버랙 사진과 함께 질문을 던졌을 때, AI는 사진 속 장비들의 종류를 식별하고, 케이블 정리 상태나 냉각 시스템에 대한 조언을 해줄 수 있어요. 이처럼 멀티모달 AI는 단순한 질문-답변을 넘어 상황 인지 기반의 훨씬 더 유용한 정보를 제공합니다.

    이러한 Gemini API 활용 아이디어는 정말 무궁무진해요.

    • 이미지 기반 제품 추천: 사용자가 찍은 옷 사진을 분석하여 유사한 스타일의 제품을 추천해주는 서비스.
    • 의료 이미지 분석 보조: X-ray나 MRI 이미지와 의사의 소견을 함께 입력하여 진단을 보조하는 시스템 (물론 전문의의 판단이 최우선이겠죠!).
    • 교육 콘텐츠 생성: 학습 자료 이미지와 텍스트를 분석하여 질문을 만들거나 요약본을 생성하는 봇.
    • 스마트 홈 모니터링: CCTV 이미지와 센서 데이터를 결합하여 이상 상황을 감지하고 사용자에게 알림.

    특히 제가 운영하는 홈랩에서는 보안 카메라 영상과 센서 데이터를 연동해서 이상 상황 감지 시스템을 만들어볼까 구상 중이에요. 기존에는 특정 객체 인식만 가능했는데, 이제는 ‘어떤 상황’인지까지 판단할 수 있게 되는 거죠. 정말 기대됩니다! 🎉

    그림 3: Gemini API를 활용한 AI 서비스 아이디어 예시

    6. 마무리하며: 경험이 곧 자산

    오늘은 Gemini API의 멀티모달 기능을 활용하여 AI 서비스 구축하는 방법에 대해 알아봤어요. 저도 처음엔 막막했지만, Google AI Studio를 통해 빠르게 프로토타입을 만들고, Python SDK로 직접 코드를 짜면서 많은 것을 배웠습니다. 특히 멀티모달 AI의 가능성은 상상 이상이었어요.

    물론 API 호출 제한이나 토큰 제한 같은 삽질도 있었지만, 이런 경험들이 쌓여 더 견고하고 효율적인 시스템을 만들 수 있는 밑거름이 된다고 생각해요. 13년차 인프라 엔지니어로서 늘 새로운 기술을 탐구하고 직접 손으로 구현해보는 것이 얼마나 중요한지 다시 한번 느꼈네요. 여러분도 오늘 소개드린 내용을 바탕으로 자신만의 멋진 AI 서비스를 만들어보시길 바랍니다!

    다음 글에서는 Gemini API를 활용한 스트리밍(Streaming) 응답 처리나 함수 호출(Function Calling) 기능에 대해 더 자세히 다뤄볼까 합니다. 관심 있으시다면 다음 포스팅도 기대해주세요! 😉

    그림 4: 13년차 인프라 엔지니어가 홈랩에서 Gemini API를 탐구하는 모습

  • [HomeLabs] 라즈베리파이 4로 홈 어시스턴트 구축 — 스마트홈 초보자 완벽 가이드

    라즈베리파이 4로 홈 어시스턴트 구축하기 — 스마트홈 구축 실전 가이드

    솔직히 처음엔 스마트홈이 그냥 비싼 장난감이라고 생각했어요. 삼성 스마트싱스, 애플 홈킷 같은 것들도 월정액이 나가고, 집 데이터가 외부 서버로 나가는 게 찜찜했거든요. 그러다 홈랩 커뮤니티에서 Home Assistant(홈 어시스턴트)를 알게 됐어요. 오픈소스, 로컬 실행, 수천 가지 기기 연동… 정말 원하던 그것이더라고요.

    그래서 서랍 속 라즈베리파이 4를 꺼냈습니다. 처음 설치하는 데 두 시간쯤 삽질했는데, 지금은 집에 들어오면 자동으로 불이 켜지고, 외출하면 에어컨이 꺼져요. 한번 써보면 정말 못 돌아가요. 이 글에서는 그 과정을 처음부터 끝까지 함께 해보겠습니다.

    라즈베리파이 4를 중심으로 한 홈 어시스턴트 스마트홈 구성도 — 허브 하나로 조명, 센서, 가전을 모두 연결합니다.

    홈 어시스턴트란 무엇일까요

    Home Assistant는 집 안의 스마트 기기들을 한 곳에서 통합 관리하는 오픈소스 홈 오토메이션 플랫폼입니다. 구글 홈이나 아마존 알렉사처럼 외부 클라우드에 의존하지 않고, 내 서버(라즈베리파이)에서 직접 돌아가는 게 핵심이에요.

    제가 가장 좋아하는 점은 프라이버시입니다. 집 데이터가 어느 미국 회사 서버에 올라가지 않고, 내 라즈베리파이에서만 처리된다는 거죠. 인터넷이 끊겨도 자동화가 작동하고요.

    설치 방식 비교

    설치 방식 특징 초보자 추천
    HAOS (Home Assistant OS) 전용 OS 이미지, 가장 간단한 설치, 공식 권장 ✅ 강력 추천
    Home Assistant Supervised 기존 Debian 위에 설치, 유연하지만 복잡 중급자 이상
    Home Assistant Container Docker 위에서 실행, 애드온 없음 고급 사용자
    Home Assistant Core Python 환경에 직접 설치, 가장 복잡 개발자용

    초보자라면 고민할 것도 없이 HAOS(Home Assistant Operating System)로 가세요. 저도 처음엔 Docker로 시작했다가 결국 HAOS로 갈아탔거든요. 애드온 생태계가 워낙 편리해서요.

    라즈베리파이 4 홈 어시스턴트 설치 — 준비물 체크리스트

    시작 전에 뭐가 필요한지 먼저 확인해 봅시다. 없으면 설치 중간에 멈추게 되니까요. 저는 SD카드가 없어서 한 번 멈췄거든요.

    • ✅ 라즈베리파이 4 (RAM 4GB 이상 권장, 2GB도 동작은 함)
    • ✅ MicroSD 카드 (32GB 이상, Class 10 이상 권장 — 저는 64GB 씁니다)
    • ✅ MicroSD 카드 리더기 (노트북에 내장된 것 있으면 OK)
    • ✅ USB-C 전원 어댑터 (라즈베리파이 4 공식 권장 5V/3A)
    • ✅ 유선 랜 케이블 (초기 설정 시 와이파이보다 안정적)
    • ✅ Raspberry Pi Imager 또는 Balena Etcher (이미지 굽는 소프트웨어, 무료)

    💡 팁: SSD로 부팅하는 방법도 있는데, 처음엔 SD카드로 시작하세요. 안정화되면 그때 SSD로 옮기는 게 훨씬 수월합니다.

    라즈베리파이 4 홈 어시스턴트 설치 — 단계별 실전 가이드

    1단계 — Home Assistant OS 이미지 다운로드 및 굽기

    먼저 Raspberry Pi Imager를 PC나 맥에 설치합니다. 공식 홈페이지(raspberrypi.com)에서 무료로 받을 수 있어요.

    1. Raspberry Pi Imager 실행
    2. “Choose OS” 클릭 → “Other specific-purpose OS” 선택
    3. “Home assistants and home automation” → “Home Assistant” 선택
    4. 라즈베리파이 4용 이미지 선택
    5. “Choose Storage”에서 SD카드 선택
    6. “Write” 클릭 — 다 쓰는 데 5~10분 정도 걸려요

    ⚠️ 주의: SD카드에 있던 데이터는 전부 지워집니다. 중요한 파일 있으면 미리 백업하세요!

    2단계 — 라즈베리파이 첫 부팅

    이미지를 다 구웠으면, SD카드를 라즈베리파이에 꽂고 랜 케이블을 연결한 후 전원을 넣어주세요. 처음 부팅은 조금 오래 걸려요. 저는 약 5분 정도 기다렸어요.

    부팅이 완료되면 같은 네트워크에 연결된 PC 브라우저에서 아래 주소로 접속합니다:

    http://homeassistant.local:8123

    혹시 위 주소로 안 된다면, 공유기 관리 페이지에서 라즈베리파이에 할당된 IP를 확인하고 직접 입력해 보세요:

    http://192.168.x.x:8123

    3단계 — 초기 설정 마법사

    접속하면 초기 설정 화면이 뜹니다. 여기서는 별로 어려운 게 없어요.

    1. 계정 생성: 이름, 아이디, 비밀번호 입력 (이게 홈 어시스턴트 관리자 계정이 됩니다)
    2. 위치 설정: 집 위치를 설정하면 일출/일몰 기반 자동화가 가능해져요
    3. 기기 자동 탐색: 같은 네트워크에 있는 스마트 기기를 자동으로 찾아줍니다 — 저는 여기서 필립스 휴 전구가 바로 잡히더라고요 🎉

    홈 어시스턴트 초기 설정 마법사 화면 — 몇 가지 기본 정보만 입력하면 바로 대시보드가 활성화됩니다.

    4단계 — 첫 통합(Integration) 추가하기

    Integration(통합)이란 홈 어시스턴트가 특정 기기나 서비스와 통신하는 방법을 정의한 모듈이에요. 쉽게 말해 드라이버 같은 거죠.

    설정 → 기기 및 서비스 → 통합 추가 버튼을 누르면 수백 가지 통합 목록이 나옵니다. 자주 쓰는 것들을 몇 가지 소개하면:

    • Philips Hue: 휴 조명 연동
    • MQTT: 다양한 IoT 센서 연동 프로토콜
    • ESPHome: ESP8266/ESP32 기반 DIY 센서 연동
    • Google Cast: 구글 홈, 크롬캐스트 연동
    • Samsung SmartThings: 삼성 스마트싱스 기기 연동

    5단계 — 첫 자동화(Automation) 만들기

    자동화야말로 홈 어시스턴트의 핵심이에요. 저는 처음에 UI로 만들었다가, 나중에 YAML로 직접 작성하는 방식으로 넘어갔어요. 일단 UI부터 익히는 게 좋습니다.

    설정 → 자동화 및 장면 → 자동화 만들기 순서로 들어가세요. 아래는 “해질 무렵 거실 조명 켜기” 자동화 예시입니다:

    alias: "해질 무렵 거실 조명 켜기"
    description: "일몰 30분 전에 거실 조명을 자동으로 켭니다"
    trigger:
      - platform: sun
        event: sunset
        offset: "-00:30:00"
    condition: []
    action:
      - service: light.turn_on
        target:
          entity_id: light.living_room
        data:
          brightness_pct: 80
    mode: single

    YAML이 낯설어도 괜찮아요. UI에서 클릭 몇 번으로 똑같이 만들 수 있거든요. 위 코드는 나중에 “아, 이런 구조구나” 참고용으로 봐두시면 됩니다.

    홈 어시스턴트 설치 후 트러블슈팅 — 제가 겪은 문제들

    설치하면서 막혔던 부분들, 솔직하게 공유합니다. 저만 겪은 게 아닐 거예요.

    문제 1 — homeassistant.local 주소로 접속이 안 돼요

    mDNS(멀티캐스트 DNS)가 막혀 있는 네트워크 환경에서 종종 발생합니다. 해결법은 간단해요.

    1. 공유기 관리 페이지(보통 192.168.0.1 또는 192.168.1.1)에 접속
    2. 연결된 기기 목록에서 “homeassistant” 또는 “raspberrypi” 항목 찾기
    3. 해당 IP 주소로 직접 접속: http://192.168.x.x:8123

    💡 팁: 라즈베리파이에 고정 IP(Static IP)를 할당해 두면 IP가 바뀌는 불상사를 막을 수 있어요. 공유기 DHCP 설정에서 MAC 주소 기반으로 IP를 고정해 주세요.

    문제 2 — SD카드 속도가 너무 느려요

    이거 진짜 많이들 겪는 문제예요. 홈 어시스턴트는 데이터베이스를 SD카드에 계속 쓰는데, 저가형 SD카드면 엄청 느려집니다. 해결 방법은 두 가지예요:

    • 단기: 좋은 SD카드로 교체 (A2 등급 이상 권장)
    • 장기: USB 3.0 SSD로 부팅 전환 — 이 방법은 나중에 별도 글로 다룰게요

    문제 3 — 특정 기기가 자동 탐색이 안 돼요

    같은 네트워크에 있는데 기기가 안 잡히는 경우, 공유기에서 AP 격리(AP Isolation) 기능이 켜져 있는 게 원인인 경우가 많아요. 공유기 설정에서 AP 격리를 꺼주세요. 그래도 안 되면 해당 기기 전용 Integration을 수동으로 추가해야 합니다.

    자동화와 기기 연동이 완료된 홈 어시스턴트 대시보드 — 조명, 온도, 에너지 사용량을 한눈에 확인할 수 있습니다.

    설치 완료 — 결과 확인해 봅시다

    설치가 다 됐다면 대시보드에서 이런 것들이 보여야 정상입니다:

    • ✅ 연결된 기기들이 엔티티(Entity)로 표시됨
    • ✅ 기기 상태(켜짐/꺼짐, 온도 등)가 실시간으로 업데이트됨
    • ✅ 만들어 둔 자동화가 활성화 상태로 표시됨
    • ✅ 설정 → 시스템 → 정보에서 버전 정보 확인 가능

    스마트폰 앱도 설치하고 싶으시면, iOS/안드로이드 모두 “Home Assistant” 공식 앱이 있어요. 같은 네트워크에서는 물론이고, 외부에서도 접속하려면 Nabu Casa(나부 카사) 클라우드 서비스나 Tailscale(테일스케일, VPN 서비스)을 활용하면 됩니다. 이 부분은 다음 글에서 자세히 다룰 예정이에요.

    홈 어시스턴트 확장하기 — 추천 애드온

    HAOS의 장점이 바로 Add-on(애드온) 생태계입니다. 설정 → 애드온 메뉴에서 클릭 몇 번으로 추가 기능을 설치할 수 있어요. 제가 쓰는 것들 몇 가지 소개합니다:

    • Mosquitto Broker: MQTT 브로커, IoT 센서 연동의 핵심
    • ESPHome: ESP 기반 DIY 센서를 홈 어시스턴트에 연결
    • Node-RED: 시각적 자동화 편집기, 복잡한 자동화 만들 때 편함
    • File Editor: 브라우저에서 바로 설정 파일 편집 가능
    • Samba Share: 윈도우 파일 공유로 설정 파일 접근

    처음엔 File Editor 하나만 설치해도 충분해요. 나머지는 필요할 때 하나씩 추가하면 됩니다.

    홈 어시스턴트 vs 상용 스마트홈 플랫폼 비교 요약 — 프라이버시, 비용, 확장성 모든 면에서 홈 어시스턴트가 홈랩 환경에 적합합니다.

    홈 어시스턴트 설치 — 자주 묻는 질문 (FAQ)

    Q. 라즈베리파이 4 말고 다른 기기로도 되나요?

    네, 됩니다. 인텔 NUC, 구형 미니PC, 심지어 가상머신 위에서도 돌아가요. 다만 라즈베리파이 4는 전력 소모가 적고 가격 대비 성능이 좋아서 홈 어시스턴트 전용으로 쓰기 딱 좋습니다.

    Q. 한국 스마트 기기들도 연동이 되나요?

    삼성 스마트싱스 기기들은 공식 통합이 있고, LG ThinQ도 커뮤니티 통합이 있어요. 다만 국내 제조사 기기들은 공식 지원이 없는 경우도 있어서 사전에 호환성 확인이 필요합니다.

    Q. 인터넷이 끊기면 자동화도 안 되나요?

    홈 어시스턴트 자체는 로컬에서 돌아가기 때문에 인터넷이 끊겨도 로컬 자동화는 정상 작동해요. 다만 클라우드 기반 기기(일부 스마트 플러그 등)는 영향을 받을 수 있습니다.

    마무리 — 이제 진짜 스마트홈 시작입니다

    라즈베리파이 4로 홈 어시스턴트를 구축하는 것, 생각보다 어렵지 않죠? 처음 설치하고 거실 조명이 자동으로 켜지던 그 순간이 아직도 기억나요. 진짜 뿌듯하더라고요 🎉

    정리하자면 이렇습니다:

    1. 라즈베리파이 4 + 64GB SD카드 준비
    2. Raspberry Pi Imager로 HAOS 이미지 굽기
    3. 부팅 후 homeassistant.local:8123 접속
    4. 계정 생성 및 기기 연동
    5. 첫 자동화 만들기

    다음 글에서는 외부에서 홈 어시스턴트에 안전하게 접속하는 방법 — Tailscale VPN 연동을 다룰 예정입니다. 이 부분이 설정되면 집 밖에서도 스마트홈을 완전히 제어할 수 있어요.

    질문 있으시면 댓글로 남겨주세요. 제가 직접 겪은 문제라면 같이 해결해 드릴 수 있을 것 같습니다 😊

  • [HomeLabs] 라즈베리파이 5 홈랩 구축: 저전력 미니PC 활용 완전 가이드

    전기세 걱정 없는 홈서버, 라즈베리파이 5로 시작해보세요

    홈랩(Home Lab)을 처음 꾸릴 때 저도 똑같은 고민을 했거든요. “중고 서버 살까? 미니PC 살까?” 근데 막상 중고 타워 서버를 들여놨더니 소음이 장난이 아니더라고요. 한밤중에 서버실(사실 제 방 한 켠이지만) 앞을 지나갈 때마다 데이터센터 온 느낌이랄까요. 그리고 전기 요금 고지서 받아보고 진짜 식겁했습니다.

    그래서 찾게 된 게 라즈베리파이 5(Raspberry Pi 5) 홈랩이에요. 저전력 홈서버로 이만한 게 없더라고요. 처음엔 “이 작은 게 뭘 할 수 있겠어?” 싶었는데, 막상 세팅하고 나니까 놀라웠습니다. 이 글에서는 제가 직접 구축하면서 겪은 삽질과 함께, 라즈베리파이 5 홈랩을 제대로 활용하는 방법을 공유해 드릴게요.

    라즈베리파이 5 기반 홈랩의 전체 구성도 — 단일 보드 컴퓨터 하나로 이렇게 많은 서비스를 돌릴 수 있습니다.

    라즈베리파이 5가 홈랩에 적합한 이유

    라즈베리파이 시리즈는 워낙 유명하지만, 5세대로 넘어오면서 진짜 “쓸만한” 홈서버로 거듭났어요. 이전 세대와 비교하면 체감 성능 차이가 꽤 납니다.

    라즈베리파이 5의 주요 스펙을 간단히 정리하면:

    • CPU: Broadcom BCM2712, Arm Cortex-A76 쿼드코어
    • RAM: 4GB 또는 8GB LPDDR4X (홈랩용이라면 8GB 추천)
    • 스토리지 인터페이스: PCIe 2.0 슬롯 추가 (NVMe SSD 연결 가능)
    • 네트워크: 기가비트 이더넷
    • USB: USB 3.0 포트 2개, USB 2.0 포트 2개

    여기서 제가 특히 주목한 건 PCIe 슬롯이에요. 이전 세대까지는 microSD 카드에 전적으로 의존하거나 USB 방식 외장 SSD를 써야 했거든요. 5세대부터는 공식 HAT(Hardware Attached on Top, 확장 보드)나 서드파티 어댑터를 통해 NVMe SSD를 직접 연결할 수 있어요. 속도 차이가 체감상 확연합니다.

    저전력 홈서버로서의 장점

    • ✅ 소음 없음: 액티브 쿨러를 달아도 일반 PC 대비 훨씬 조용
    • ✅ 저전력: 일반 데스크탑 PC 대비 전력 소모가 현저히 낮음
    • ✅ 공간 효율: 손바닥 크기라 어디든 놓을 수 있음
    • ✅ 활발한 커뮤니티: 문제 생기면 검색하면 다 나옴 (이게 진짜 중요해요)
    • ✅ 합리적인 가격: 진입 장벽이 낮음

    물론 단점도 있어요. x86 아키텍처가 아닌 ARM이라 일부 소프트웨어는 ARM 빌드를 따로 찾아야 하고, 고성능 컴퓨팅 작업에는 한계가 있습니다. 하지만 홈랩 용도, 특히 네트워크 서비스, 모니터링, 미디어 서버, 자동화 같은 작업에는 충분하더라고요.

    준비물 체크리스트

    본격적으로 시작하기 전에 뭐가 필요한지 정리해 드릴게요. 제가 처음에 이것저것 빠뜨려서 두 번 주문했던 기억이 나서 말이에요. ㅎㅎ

    항목 필수 여부 비고
    라즈베리파이 5 (8GB 모델 권장) ✅ 필수 홈랩이라면 8GB로
    공식 전원 어댑터 (27W USB-C PD) ✅ 필수 5세대는 전원 요구사항 달라짐
    microSD 카드 (32GB 이상) 또는 NVMe SSD ✅ 필수 NVMe 강력 추천
    케이스 + 쿨러 권장 발열 관리 필요
    NVMe HAT (M.2 어댑터) 선택 NVMe SSD 쓸 경우 필요
    이더넷 케이블 권장 Wi-Fi보다 유선 안정적

    💡 팁: 라즈베리파이 5는 공식 27W USB-C PD 어댑터를 권장합니다. 전력이 부족하면 부팅 중 경고 메시지가 뜨거나 불안정해질 수 있어요. 저도 처음에 아무 충전기나 꽂았다가 낭패 봤습니다.

    OS 설치 및 초기 설정

    자, 이제 본격적으로 세팅 시작해볼게요. 생각보다 어렵지 않습니다.

    1단계: Raspberry Pi OS 설치

    가장 쉬운 방법은 Raspberry Pi Imager를 사용하는 거예요. 공식 도구라 믿을 수 있고, 설치 전에 SSH 활성화, Wi-Fi 설정, 사용자 계정 설정까지 다 할 수 있거든요.

    1. Raspberry Pi 공식 사이트에서 Raspberry Pi Imager 다운로드
    2. OS 선택: Raspberry Pi OS Lite (64-bit) — 홈서버용이라면 GUI 없는 Lite 버전이 리소스 효율적
    3. 고급 설정(⚙️ 아이콘)에서 SSH 활성화, 사용자명/비밀번호 설정
    4. microSD 또는 NVMe에 Write

    설치 완료 후 첫 부팅, SSH로 접속해서 기본 설정부터 해줍니다.

    # 시스템 업데이트 (항상 첫 번째로 해야 할 일)
    sudo apt update && sudo apt upgrade -y
    
    # 한국 타임존 설정
    sudo timedatectl set-timezone Asia/Seoul
    
    # 호스트명 변경 (나중에 여러 대 운영할 때 헷갈리지 않으려면)
    sudo hostnamectl set-hostname homelab-pi5
    
    # 자동 보안 업데이트 설치
    sudo apt install unattended-upgrades -y
    sudo dpkg-reconfigure --priority=low unattended-upgrades

    2단계: 고정 IP 설정

    홈서버는 IP가 바뀌면 진짜 골치 아파요. 라우터에서 DHCP 예약을 하거나, 직접 고정 IP를 설정해 줍니다. 저는 라우터 DHCP 예약 방식을 선호하는데, 그게 관리하기 편하더라고요.

    직접 설정하고 싶다면 NetworkManager를 씁니다.

    # 현재 연결 이름 확인
    nmcli connection show
    
    # 고정 IP 설정 (예: 192.168.1.100)
    nmcli connection modify "Wired connection 1" \
      ipv4.method manual \
      ipv4.addresses 192.168.1.100/24 \
      ipv4.gateway 192.168.1.1 \
      ipv4.dns "1.1.1.1,8.8.8.8"
    
    # 적용
    nmcli connection up "Wired connection 1"

    3단계: Docker 설치

    홈랩의 핵심은 Docker(도커, 컨테이너 기반 가상화 플랫폼)예요. 여러 서비스를 격리된 환경에서 깔끔하게 관리할 수 있거든요. ARM64 지원이 많이 좋아져서 이제는 대부분의 인기 이미지가 ARM64 빌드를 제공합니다.

    # Docker 공식 설치 스크립트
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    
    # 현재 사용자를 docker 그룹에 추가 (sudo 없이 docker 명령 사용)
    sudo usermod -aG docker $USER
    
    # 변경사항 적용을 위해 재로그인 필요
    newgrp docker
    
    # 설치 확인
    docker --version
    docker run hello-world

    Docker Compose도 함께 설치해 줍니다. 여러 컨테이너를 한 번에 관리할 때 필수예요.

    # Docker Compose V2는 Docker 설치 시 플러그인으로 포함됨
    # 확인
    docker compose version

    Docker 컨테이너로 구성한 홈랩 서비스 스택 — 각 서비스가 독립된 컨테이너로 동작하는 구조입니다.

    핵심 서비스 구축: 실전 Docker Compose 설정

    이제 진짜 재미있는 부분이에요. 어떤 서비스를 돌릴지가 홈랩의 핵심이거든요. 제가 실제로 운영 중인 서비스 스택을 공유해 드릴게요.

    홈랩 필수 서비스 구성

    # ~/homelab/docker-compose.yml
    version: '3.8'
    
    services:
    
      # Portainer: 도커 컨테이너 웹 UI 관리 도구
      portainer:
        image: portainer/portainer-ce:latest
        container_name: portainer
        restart: unless-stopped
        ports:
          - "9000:9000"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - portainer_data:/data
    
      # Pi-hole: 네트워크 전체 광고 차단 DNS 서버
      pihole:
        image: pihole/pihole:latest
        container_name: pihole
        restart: unless-stopped
        ports:
          - "53:53/tcp"
          - "53:53/udp"
          - "8080:80/tcp"
        environment:
          TZ: 'Asia/Seoul'
          WEBPASSWORD: 'your_secure_password'  # 반드시 변경하세요!
        volumes:
          - pihole_data:/etc/pihole
          - dnsmasq_data:/etc/dnsmasq.d
        cap_add:
          - NET_ADMIN
    
      # Uptime Kuma: 서비스 모니터링 대시보드
      uptime-kuma:
        image: louislam/uptime-kuma:latest
        container_name: uptime-kuma
        restart: unless-stopped
        ports:
          - "3001:3001"
        volumes:
          - uptime_kuma_data:/app/data
    
    volumes:
      portainer_data:
      pihole_data:
      dnsmasq_data:
      uptime_kuma_data:
    # 서비스 시작
    cd ~/homelab
    docker compose up -d
    
    # 실행 상태 확인
    docker compose ps
    
    # 로그 확인
    docker compose logs -f

    🎉 이렇게 하면 세 가지 핵심 서비스가 한 번에 뜹니다. Portainer(포테이너)로 컨테이너를 웹에서 관리하고, Pi-hole(파이홀)로 집 안 모든 기기의 광고를 차단하고, Uptime Kuma(업타임 쿠마)로 서비스 가용성을 모니터링할 수 있어요.

    홈 미디어 서버 추가 (선택)

    미디어 서버도 많이들 구성하시는데, Jellyfin(젤리핀, 오픈소스 미디어 서버)이 ARM64 지원도 잘 되고 무료라서 추천드려요.

    # docker-compose.yml에 추가
      jellyfin:
        image: jellyfin/jellyfin:latest
        container_name: jellyfin
        restart: unless-stopped
        network_mode: host  # DLNA 사용 시 host 모드 권장
        volumes:
          - jellyfin_config:/config
          - jellyfin_cache:/cache
          - /mnt/media:/media:ro  # 미디어 파일 경로
        environment:
          - TZ=Asia/Seoul

    ⚠️ 삽질 경험담: 이것만 주의하세요

    13년 경력이라도 새 장비 세팅할 때는 항상 뭔가 하나씩 걸리더라고요. 제가 겪은 주요 문제들을 공유해 드릴게요.

    문제 1: 발열 관리

    라즈베리파이 5는 이전 세대보다 성능이 오른 만큼 발열도 있어요. 케이스 없이 쓰다가 CPU 쓰로틀링(Throttling, 과열 시 성능 제한)이 걸리는 걸 모니터링으로 발견했습니다.

    # CPU 온도 확인
    vcgencmd measure_temp
    
    # 실시간 모니터링
    watch -n 2 vcgencmd measure_temp
    
    # 쓰로틀링 여부 확인 (0x0이면 정상)
    vcgencmd get_throttled

    액티브 쿨러(팬)를 달거나, 방열판이 포함된 케이스를 사용하는 게 좋아요. 라즈베리파이 공식 액티브 쿨러 제품도 있고, 서드파티 케이스들도 많습니다.

    문제 2: ARM64 이미지 없는 경우

    가끔 원하는 Docker 이미지가 ARM64(aarch64)를 지원 안 하는 경우가 있어요. 이럴 때 확인하는 방법:

    # 이미지 아키텍처 확인
    docker manifest inspect [이미지명] | grep architecture
    
    # 만약 arm64 없으면 대안 이미지 검색 필요
    # 또는 QEMU 에뮬레이션 (성능 저하 있음)
    docker run --platform linux/amd64 [이미지명]

    ⚠️ QEMU 에뮬레이션으로 x86 이미지를 돌리면 성능이 많이 떨어집니다. 가능하면 ARM64 네이티브 이미지를 쓰세요.

    문제 3: microSD 카드 수명 문제

    Docker를 microSD에 올리고 로그를 막 쌓다 보면 카드 수명이 급격히 줄어요. 실제로 저 첫 번째 카드 6개월 만에 날렸습니다. 해결책은 두 가지예요.

    • NVMe SSD로 부팅 드라이브 변경 (가장 좋은 방법)
    • 로그 설정 최적화로 쓰기 횟수 줄이기
    # Docker 로그 크기 제한 설정
    # /etc/docker/daemon.json 생성 또는 수정
    sudo nano /etc/docker/daemon.json
    {
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "10m",
        "max-file": "3"
      }
    }
    # Docker 재시작으로 적용
    sudo systemctl restart docker

    운영 결과 확인: 이렇게 쓰고 있습니다

    세팅 완료 후 실제로 어떻게 돌아가는지 확인해 보는 시간이에요. 드디어 됐다! 싶은 순간이기도 하고요.

    시스템 리소스 모니터링

    # 전체 시스템 상태 한눈에 보기
    htop
    
    # Docker 컨테이너별 리소스 사용량
    docker stats
    
    # 디스크 사용량
    df -h
    
    # 메모리 상세
    free -h

    제 경우 위에 소개한 서비스들을 다 올려도 RAM 사용량이 여유 있더라고요. 8GB 모델이라면 훨씬 더 여유롭게 쓸 수 있어요.

    Uptime Kuma 모니터링 대시보드 — 홈랩의 모든 서비스 상태를 한눈에 확인할 수 있습니다.

    자동 시작 설정

    정전이나 재부팅 후에도 서비스가 자동으로 올라오도록 설정해 줍니다.

    # Docker 서비스 자동 시작
    sudo systemctl enable docker
    
    # docker-compose를 systemd 서비스로 등록
    sudo nano /etc/systemd/system/homelab.service
    [Unit]
    Description=Homelab Docker Compose
    Requires=docker.service
    After=docker.service
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    WorkingDirectory=/home/pi/homelab
    ExecStart=/usr/bin/docker compose up -d
    ExecStop=/usr/bin/docker compose down
    TimeoutStartSec=0
    
    [Install]
    WantedBy=multi-user.target
    # 서비스 등록 및 활성화
    sudo systemctl daemon-reload
    sudo systemctl enable homelab.service
    sudo systemctl start homelab.service

    다음 단계로 확장하기

    기본 세팅이 끝났다면 이제 더 재미있는 것들을 추가할 수 있어요. 제가 다음 글에서 다룰 예정인 주제들이기도 합니다.

    추천 확장 서비스 목록

    서비스 용도 ARM64 지원
    Nginx Proxy Manager 리버스 프록시, SSL 인증서 관리 ✅
    Grafana + Prometheus 메트릭 수집 및 시각화 대시보드 ✅
    Home Assistant 스마트홈 자동화 허브 ✅
    Vaultwarden 자체 호스팅 비밀번호 관리자 ✅
    Nextcloud 개인 클라우드 스토리지 ✅
    WireGuard VPN 서버 ✅

    💡 WireGuard(와이어가드, 경량 VPN 프로토콜)를 설정해 두면 외출 중에도 집 홈랩에 안전하게 접속할 수 있어요. 이건 다음 글에서 자세히 다루겠습니다.

    라즈베리파이 5 홈랩에서 활용 가능한 서비스 비교 — 용도에 맞게 골라서 구성해 보세요.

    자주 묻는 질문 (FAQ)

    Q. 라즈베리파이 5 홈랩, 24시간 켜놔도 되나요?

    네, 됩니다. 저도 항상 켜놓고 있어요. 다만 발열 관리(케이스 + 쿨러)와 안정적인 전원 공급이 중요합니다. UPS(무정전 전원 장치)까지 달면 더욱 안정적이에요.

    Q. microSD vs NVMe SSD, 어떤 게 낫나요?

    홈랩 용도라면 NVMe SSD를 강력히 추천드려요. 속도도 빠르고 수명도 훨씬 길거든요. 처음 세팅 비용이 조금 더 들지만, microSD 갈아 엎는 수고를 생각하면 훨씬 이득입니다.

    Q. 라즈베리파이 5 8GB vs 4GB, 뭐가 더 나을까요?

    홈랩 목적이라면 8GB를 권장합니다. Docker 컨테이너 여러 개 올리다 보면 4GB는 빠듯해질 수 있어요. 처음부터 8GB로 가는 게 나중에 후회가 없더라고요.

    마무리: 작게 시작해서 크게 배웁니다

    라즈베리파이 5 홈랩, 생각보다 어렵지 않죠? 처음엔 “이게 진짜 되겠어?” 싶었는데, 막상 세팅하고 나면 진짜 신세계가 열려요.

    제가 13년 동안 인프라 엔지니어로 일하면서 느낀 건, 홈랩이야말로 가장 빠르게 실력이 느는 방법이라는 거예요. 회사 서버는 함부로 건드릴 수 없으니까요. 집에서 마음껏 실험하고, 망가뜨려 보고, 복구해 보는 과정에서 진짜 실력이 쌓입니다.

    오늘 다룬 내용을 정리하면:

    • ✅ 라즈베리파이 5의 하드웨어 특성과 홈랩 적합성 이해
    • ✅ OS 설치 및 기본 시스템 설정
    • ✅ Docker 기반 서비스 스택 구성 (Portainer, Pi-hole, Uptime Kuma)
    • ✅ 발열, ARM64 호환성, 스토리지 수명 등 주요 이슈 해결
    • ✅ 시스템 안정성을 위한 자동 시작 설정

    다음 글에서는 Nginx Proxy Manager와 Let’s Encrypt를 활용한 HTTPS 설정을 다룰 예정이에요. 외부에서 홈랩 서비스에 안전하게 접속하는 방법인데, 이게 또 재미있거든요. 기대해 주세요! 😄

    궁금한 점이나 다른 삽질 경험이 있으시면 댓글로 공유해 주세요. 같이 고민해 봐요!

  • [k8s] 쿠버네티스 영구 스토리지: Longhorn vs Rook Ceph 비교 및 선택 가이드

    쿠버네티스 영구 스토리지, 왜 이렇게 어렵냐고요

    쿠버네티스(Kubernetes)로 처음 스테이트풀(Stateful) 애플리케이션을 올려본 분들이라면 공감하실 텐데요. 컨테이너는 죽었다 살아나는 게 당연한 세계인데, 데이터는 절대 사라지면 안 되잖아요. 데이터베이스, 메시지 큐, 로그 수집기… 이런 것들을 올리려면 결국 쿠버네티스 영구 스토리지(Persistent Storage) 문제를 해결해야 합니다.

    저도 처음 홈랩에서 쿠버네티스 클러스터를 구성할 때 이 부분에서 꽤 오래 고민했거든요. NFS 마운트로 버티다가 결국 제대로 된 분산 스토리지를 써야겠다 싶어서 Longhorn이랑 Rook Ceph를 둘 다 실제로 구성해봤습니다. 오늘은 그 경험을 바탕으로 두 솔루션을 비교하고, 어떤 상황에서 뭘 선택해야 하는지 정리해 드릴게요.

    ▲ 쿠버네티스 영구 스토리지의 전체 구조 — PVC(Persistent Volume Claim)가 어떻게 실제 스토리지 백엔드와 연결되는지 보여주는 아키텍처 다이어그램

    먼저 개념부터: PV, PVC, CSI가 뭔가요?

    비교 얘기 전에 기본 개념을 짚고 넘어가겠습니다. 저도 처음엔 이 용어들이 다 비슷비슷해 보여서 헷갈렸거든요 ㅎㅎ

    • PV (Persistent Volume, 영구 볼륨): 클러스터 관리자가 프로비저닝한 실제 스토리지 리소스입니다. 쉽게 말해 “실제 저장 공간”이에요.
    • PVC (Persistent Volume Claim, 영구 볼륨 클레임): 개발자(또는 파드)가 스토리지를 요청하는 오브젝트입니다. “나 10GB짜리 저장 공간 필요해요”라고 요청하는 거죠.
    • StorageClass (스토리지 클래스): 스토리지의 종류와 프로비저닝 방식을 정의합니다. PVC가 요청하면 자동으로 PV를 만들어주는 동적 프로비저닝(Dynamic Provisioning)을 가능하게 해줘요.
    • CSI (Container Storage Interface, 컨테이너 스토리지 인터페이스): 쿠버네티스가 다양한 스토리지 벤더와 통신하기 위한 표준 인터페이스입니다. Longhorn도, Rook Ceph도 이 CSI 드라이버를 통해 쿠버네티스와 연동돼요.

    💡 핵심 포인트: 개발자는 PVC만 선언하면 되고, 실제 스토리지가 어디에 있는지는 신경 안 써도 됩니다. 그 복잡한 연결을 StorageClass와 CSI 드라이버가 처리해주거든요.

    Longhorn 소개: CNCF가 인정한 경량 분산 스토리지

    Longhorn은 Rancher(현재 SUSE 산하)에서 개발한 쿠버네티스 전용 분산 블록 스토리지입니다. CNCF(Cloud Native Computing Foundation) 졸업 프로젝트로 등록되어 있고, 오픈소스이면서 완전히 쿠버네티스 네이티브하게 설계됐어요.

    Longhorn의 주요 특징

    • 쿠버네티스 위에서 동작하는 컨트롤러 기반 아키텍처
    • 볼륨 복제본(Replica)을 여러 노드에 자동 분산
    • 내장 UI 대시보드 — 볼륨 상태를 시각적으로 확인 가능
    • 스냅샷(Snapshot) 및 백업 기능 내장 (S3, NFS 등으로 백업 가능)
    • 볼륨 확장(Volume Expansion) 지원
    • RWO(ReadWriteOnce) 지원, RWX(ReadWriteMany)는 NFS 게이트웨이를 통해 제한적으로 지원

    Longhorn 설치 — Helm으로 빠르게

    실제로 설치해보겠습니다. 저는 k3s 기반 3노드 클러스터에서 테스트했어요.

    # 사전 요구사항 확인 (iscsi 패키지 필요)
    sudo apt-get install -y open-iscsi
    sudo systemctl enable --now iscsid
    
    # Helm 저장소 추가
    helm repo add longhorn https://charts.longhorn.io
    helm repo update
    
    # longhorn 네임스페이스 생성 및 설치
    helm install longhorn longhorn/longhorn \
      --namespace longhorn-system \
      --create-namespace \
      --set defaultSettings.defaultReplicaCount=3

    설치가 완료되면 longhorn-system 네임스페이스에 여러 파드가 뜨는 걸 확인할 수 있어요.

    kubectl get pods -n longhorn-system
    # NAME                                        READY   STATUS    RESTARTS
    # longhorn-manager-xxxxx                      1/1     Running   0
    # longhorn-driver-deployer-xxxxx              1/1     Running   0
    # longhorn-ui-xxxxx                           1/1     Running   0
    # engine-image-ei-xxxxx-xxxxx                 1/1     Running   0

    Longhorn UI에 접근하려면 포트 포워딩이나 인그레스(Ingress, 외부 트래픽 진입점)를 설정해야 합니다.

    kubectl port-forward -n longhorn-system svc/longhorn-frontend 8080:80

    브라우저에서 http://localhost:8080으로 접속하면 볼륨 상태, 노드 디스크 현황을 한눈에 볼 수 있는 대시보드가 나옵니다. 이거 처음 봤을 때 진짜 편하다 싶었어요.

    Longhorn StorageClass 및 PVC 생성 예시

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: longhorn
    provisioner: driver.longhorn.io
    allowVolumeExpansion: true
    parameters:
      numberOfReplicas: "3"
      staleReplicaTimeout: "2880"
      fromBackup: ""
      fsType: "ext4"
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-longhorn-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: longhorn
      resources:
        requests:
          storage: 10Gi

    Rook Ceph 소개: 엔터프라이즈급 분산 스토리지

    Rook은 Ceph를 쿠버네티스에서 오퍼레이터(Operator) 패턴으로 운영할 수 있게 해주는 프레임워크입니다. Ceph 자체는 수십 년의 역사를 가진 검증된 분산 스토리지 시스템이고, Rook은 그 복잡한 Ceph를 쿠버네티스 위에서 쉽게(?) 운영하게 해주죠.

    솔직히 말하면 “쉽게”라는 말에 따옴표를 붙인 이유가 있어요. 처음 Rook Ceph 설치할 때 삽질을 꽤 했거든요 ㅎㅎ

    Rook Ceph의 주요 특징

    • 블록 스토리지(RBD), 파일시스템(CephFS), 오브젝트 스토리지(S3 호환 RGW) 모두 지원
    • CephFS를 통한 RWX(ReadWriteMany) 네이티브 지원 — 여러 파드가 동시에 같은 볼륨 마운트 가능
    • PG(Placement Group), CRUSH Map 등 고급 튜닝 옵션
    • 대규모 클러스터에서 검증된 안정성
    • Ceph Dashboard 내장
    • 최소 3개 OSD(Object Storage Daemon) 노드 권장

    Rook Ceph 설치 — 조금 더 복잡합니다

    # Rook 오퍼레이터 설치
    git clone --single-branch --branch v1.13.0 https://github.com/rook/rook.git
    cd rook/deploy/examples
    
    # CRD 및 공통 리소스 먼저 설치
    kubectl create -f crds.yaml
    kubectl create -f common.yaml
    
    # 오퍼레이터 배포
    kubectl create -f operator.yaml
    
    # 오퍼레이터 파드 확인
    kubectl get pods -n rook-ceph
    # NAME                                  READY   STATUS    RESTARTS
    # rook-ceph-operator-xxxxx              1/1     Running   0

    오퍼레이터가 Running 상태가 되면 Ceph 클러스터를 생성합니다. 아래는 기본 클러스터 설정이에요.

    apiVersion: ceph.rook.io/v1
    kind: CephCluster
    metadata:
      name: rook-ceph
      namespace: rook-ceph
    spec:
      cephVersion:
        image: quay.io/ceph/ceph:v18.2.0
      dataDirHostPath: /var/lib/rook
      mon:
        count: 3
        allowMultiplePerNode: false
      mgr:
        count: 2
      dashboard:
        enabled: true
        ssl: true
      storage:
        useAllNodes: true
        useAllDevices: false
        deviceFilter: "^sd[b-z]"
      resources:
        mgr:
          requests:
            cpu: "500m"
            memory: "512Mi"

    ⚠️ 주의사항: deviceFilter 설정이 중요합니다. 잘못 설정하면 OS 디스크까지 Ceph OSD로 사용하려고 할 수 있어요. 저도 이 부분에서 한 번 아찔한 경험을 했습니다. 반드시 데이터 디스크만 지정하세요.

    # Ceph 블록 스토리지 풀 및 StorageClass 생성
    kubectl create -f csi/rbd/storageclass.yaml
    
    # CephFS (RWX 지원) StorageClass 생성
    kubectl create -f filesystem.yaml
    kubectl create -f csi/cephfs/storageclass.yaml

    ▲ Rook Ceph 아키텍처 — MON(모니터), MGR(매니저), OSD(오브젝트 스토리지 데몬)의 구성과 CSI 드라이버를 통한 쿠버네티스 연동 구조

    Longhorn vs Rook Ceph: 직접 써본 비교

    두 솔루션을 실제로 운영해보면서 느낀 점들을 솔직하게 비교해 드릴게요.

    항목 Longhorn Rook Ceph
    설치 난이도 ⭐⭐ (쉬움) ⭐⭐⭐⭐ (복잡함)
    최소 노드 수 1개 (복제본 설정에 따라) 3개 (OSD 최소 3개 권장)
    리소스 사용량 가벼움 무거움 (MON, MGR, OSD 등 다수)
    RWX 지원 제한적 (NFS 게이트웨이 필요) 네이티브 지원 (CephFS)
    오브젝트 스토리지 미지원 지원 (S3 호환 RGW)
    UI/관리 편의성 직관적인 내장 UI Ceph Dashboard (기능 풍부)
    백업 기능 내장 (S3, NFS 백업) 별도 구성 필요
    성숙도/안정성 CNCF 졸업 프로젝트 CNCF 졸업 프로젝트 (Ceph는 업계 표준)
    운영 복잡도 낮음 높음 (PG 튜닝, CRUSH Map 등)
    적합한 규모 소~중형 클러스터 중~대형 클러스터

    실제로 겪은 트러블슈팅 사례들

    Longhorn에서 겪은 문제: 노드 한 대를 재부팅했더니 해당 노드의 복제본이 degraded 상태가 됐어요. 근데 이건 Longhorn이 자동으로 다른 노드에 복제본을 재빌드해주더라고요. 시간이 좀 걸리긴 했지만 데이터 손실은 없었습니다. ✅

    Rook Ceph에서 겪은 문제: OSD 디스크 하나에 파티션이 남아있었는데, Rook이 해당 디스크를 인식 못 하는 문제가 있었어요. 이게 처음엔 왜 안 되는지 몰라서 꽤 삽질했습니다.

    # OSD 디스크 초기화 — 기존 파티션 제거
    sgdisk --zap-all /dev/sdb
    dd if=/dev/zero of=/dev/sdb bs=1M count=100 oflag=direct
    blkdiscard /dev/sdb
    
    # 파티션 확인
    lsblk /dev/sdb

    ⚠️ 경고: 위 명령어는 해당 디스크의 모든 데이터를 완전히 삭제합니다. 반드시 올바른 디스크를 지정했는지 확인하고 실행하세요.

    또 Ceph 클러스터 상태가 HEALTH_WARN으로 뜰 때 원인 파악하는 방법도 알아두면 좋아요.

    # Ceph 상태 확인
    kubectl exec -n rook-ceph -it deploy/rook-ceph-tools -- ceph status
    kubectl exec -n rook-ceph -it deploy/rook-ceph-tools -- ceph health detail
    
    # OSD 상태 확인
    kubectl exec -n rook-ceph -it deploy/rook-ceph-tools -- ceph osd status

    ▲ Longhorn 대시보드 — 볼륨 상태, 노드별 복제본 분산 현황, 백업 상태를 한눈에 모니터링하는 화면

    어떤 상황에서 뭘 선택해야 할까요?

    이게 결국 핵심 질문이잖아요. 저는 이렇게 기준을 잡아드리고 싶어요.

    Longhorn을 선택하세요, 만약…

    • ✅ 홈랩이나 소규모 클러스터(노드 3~5개 이하)를 운영한다면
    • ✅ 쿠버네티스 스토리지를 처음 도입하는 팀이라면
    • ✅ 운영 인력이 부족하고 관리 부담을 최소화하고 싶다면
    • ✅ 블록 스토리지(RWO) 위주로만 사용한다면
    • ✅ 백업/복구 기능을 간편하게 쓰고 싶다면
    • ✅ 빠르게 구성해서 바로 써야 하는 상황이라면

    Rook Ceph를 선택하세요, 만약…

    • ✅ 중대형 클러스터(노드 5개 이상)를 운영한다면
    • ✅ RWX(ReadWriteMany) 볼륨이 반드시 필요하다면
    • ✅ S3 호환 오브젝트 스토리지도 함께 필요하다면
    • ✅ 전담 인프라 운영 인력이 있다면
    • ✅ 엔터프라이즈 환경에서 검증된 기술 스택이 필요하다면
    • ✅ 고가용성과 세밀한 스토리지 정책 제어가 필요하다면

    둘 다 쓰는 경우도 있어요

    실제로 일부 팀에서는 일반적인 파드 스토리지는 Longhorn으로, RWX가 필요한 공유 파일시스템이나 오브젝트 스토리지는 Rook Ceph로 나눠서 운영하기도 합니다. 복잡해지긴 하지만 각각의 장점을 활용할 수 있는 방법이기도 해요.

    결과 검증: 실제로 제대로 동작하는지 확인하기

    설치만 하면 끝이 아니죠. 실제로 데이터가 잘 보존되는지 확인해봐야 합니다. 아래는 간단한 테스트 시나리오예요.

    # 테스트용 파드 생성
    apiVersion: v1
    kind: Pod
    metadata:
      name: storage-test
    spec:
      containers:
      - name: test
        image: busybox
        command: ["/bin/sh", "-c", "while true; do date >> /data/test.log; sleep 5; done"]
        volumeMounts:
        - mountPath: /data
          name: test-volume
      volumes:
      - name: test-volume
        persistentVolumeClaim:
          claimName: my-longhorn-pvc
    # 파드 실행 후 데이터 확인
    kubectl exec storage-test -- cat /data/test.log
    
    # 파드를 강제 삭제
    kubectl delete pod storage-test
    
    # 새 파드로 다시 마운트해서 데이터가 남아있는지 확인
    kubectl apply -f storage-test.yaml
    kubectl exec storage-test -- cat /data/test.log
    # 이전 로그가 그대로 남아있으면 성공! 🎉

    🎉 데이터가 살아있는 걸 확인했을 때의 그 안도감… 처음엔 진짜 설레더라고요. 쿠버네티스에서 영구 스토리지가 제대로 동작한다는 걸 눈으로 확인한 순간이었습니다.

    추가로 볼륨 상태도 확인해두면 좋아요.

    # PVC 상태 확인
    kubectl get pvc
    # NAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    # my-longhorn-pvc    Bound    pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx   10Gi       RWO            longhorn       5m
    
    # PV 상세 정보
    kubectl describe pv pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

    ▲ Longhorn vs Rook Ceph 선택 가이드 요약 — 클러스터 규모, 기능 요구사항, 운영 복잡도를 기준으로 한 비교 인포그래픽

    자주 묻는 질문 (FAQ)

    Q. Longhorn은 프로덕션 환경에서 써도 되나요?

    네, CNCF 졸업 프로젝트이고 실제로 많은 기업에서 프로덕션에 사용하고 있습니다. 다만 대규모 클러스터나 높은 I/O가 필요한 환경에서는 Ceph 대비 한계가 있을 수 있어요.

    Q. Rook Ceph 최소 사양이 어떻게 되나요?

    OSD 노드 최소 3개를 권장합니다. 각 OSD 노드에는 전용 디스크가 필요하고, MON(모니터) 데몬 운영을 위한 CPU와 메모리도 여유 있게 확보해야 해요. 리소스가 빠듯한 환경에서는 Longhorn이 훨씬 현실적입니다.

    Q. 기존 NFS 스토리지에서 마이그레이션이 가능한가요?

    직접적인 마이그레이션 도구는 없고, 보통 데이터를 백업 후 새 PVC에 복원하는 방식을 사용합니다. Velero(벨레로) 같은 쿠버네티스 백업 도구를 활용하면 좀 더 체계적으로 진행할 수 있어요. 이 내용은 다음 글에서 다룰 예정입니다.

    Q. 홈랩에서는 뭘 추천하세요?

    저는 홈랩에서 Longhorn을 쓰고 있어요. 설치가 간단하고 UI가 직관적이어서 관리하기 편합니다. 노드 3대 이하 환경이라면 Longhorn이 압도적으로 편해요.

    마무리: 결국 “상황에 맞는” 선택이 정답입니다

    13년 동안 인프라 일을 하면서 느낀 건데요. 기술 선택에 “절대적인 정답”은 없더라고요. Longhorn이 좋냐, Rook Ceph가 좋냐가 아니라 내 환경에 뭐가 맞냐가 핵심이에요.

    소규모 클러스터에서 빠르게 쿠버네티스 영구 스토리지를 도입하고 싶다면 Longhorn으로 시작하세요. 운영하다가 규모가 커지고 RWX나 오브젝트 스토리지가 필요해지면 그때 Rook Ceph로 전환하거나 병행하는 것도 방법이에요.

    중요한 건 일단 시작하는 거라고 생각해요. NFS로 버티다가 나중에 대규모 마이그레이션 하는 것보다, 처음부터 제대로 된 CSI 드라이버 기반 스토리지를 도입하는 게 훨씬 낫거든요.

    다음 글에서는 Velero를 활용한 쿠버네티스 백업 전략에 대해 다룰 예정입니다. Longhorn 내장 백업과 Velero를 조합하면 꽤 탄탄한 백업 체계를 만들 수 있거든요. 기대해 주세요! 🎉

    혹시 설치하다가 막히는 부분이 있으시면 댓글로 남겨주세요. 제가 겪었던 삽질 경험이 도움이 될 수도 있으니까요 ㅎㅎ

  • [Proxmox] Proxmox 백업 자동화 완벽 가이드: PBS 및 스케줄 백업 활용

    백업 없이 운영하다가 날린 VM, 그 뼈아픈 경험 이야기

    솔직하게 고백하자면, 저도 한 번 날린 적 있습니다. 홈랩에서 열심히 세팅해 둔 VM(가상 머신) 하나가 스토리지 장애로 그냥 사라져버렸거든요. 백업? 당연히 없었죠. ‘홈랩인데 뭐 어때’ 라고 생각했던 게 화근이었습니다. 그 이후로 저는 Proxmox 백업 자동화를 진지하게 구축하기 시작했고, 지금은 매일 밤 자동으로 백업이 돌아가는 걸 보면서 마음이 편안해지는 사람이 됐습니다 ㅎㅎ.

    이 글은 Proxmox VE(Virtual Environment)를 운영하면서 Proxmox 백업 자동화를 아직 제대로 구성하지 못하신 분들을 위한 실전 가이드입니다. PBS(Proxmox Backup Server)를 활용한 자동화 방법부터, 스케줄 백업 설정, 그리고 실제 운영에서 겪은 삽질까지 전부 공유해 드릴게요.

    ▲ Proxmox VE와 PBS(Proxmox Backup Server)가 연동된 전체 백업 아키텍처 구성도. VM과 CT(컨테이너)가 PBS로 자동 백업되는 흐름을 보여줍니다.

    Proxmox 백업의 두 가지 방식: 어떤 걸 써야 할까?

    Proxmox VE에서 백업을 설정할 때 처음에 헷갈리는 게 바로 이 부분이에요. 백업 저장소를 어디로 잡느냐에 따라 Proxmox 백업 자동화 방식이 완전히 달라지거든요.

    구분 로컬/NFS/CIFS 백업 PBS(Proxmox Backup Server) 백업
    저장 방식 전체 이미지 파일 (.vma) 증분 백업 (변경분만 저장)
    중복 제거 ❌ 없음 ✅ 청크 기반 중복 제거
    암호화 제한적 ✅ 클라이언트 사이드 암호화 지원
    복원 속도 보통 빠름 (증분 복원 가능)
    스토리지 효율 낮음 매우 높음
    구축 난이도 쉬움 중간 (별도 서버 필요)

    쉽게 말해서, 로컬 백업은 간단하지만 디스크를 많이 잡아먹고, PBS는 증분 백업과 중복 제거 덕분에 같은 공간에 훨씬 많은 백업 포인트를 유지할 수 있어요. 홈랩이라 스토리지가 넉넉하지 않다면 PBS가 훨씬 유리합니다.

    저는 처음에 NFS 공유 폴더에 그냥 백업했다가, 한 달도 안 돼서 디스크가 꽉 차는 걸 경험했거든요. 그 이후로 Proxmox Backup Server로 갈아탔고, 같은 공간에 훨씬 오래된 백업 포인트를 유지할 수 있게 됐습니다.

    PBS(Proxmox Backup Server) 설치 및 초기 설정

    PBS는 Proxmox VE와는 별도의 소프트웨어입니다. 전용 ISO를 받아서 별도 머신(물리 서버든, VM이든)에 설치하는 게 기본이에요. 저는 홈랩에서 오래된 미니 PC 한 대를 PBS 전용으로 쓰고 있습니다.

    1단계: PBS 설치

    Proxmox 공식 사이트(proxmox.com)에서 PBS ISO를 다운받아서 설치하면 됩니다. 설치 과정은 Proxmox VE와 거의 동일해서 어렵지 않아요. 설치 후 웹 UI는 기본적으로 https://[PBS-IP]:8007로 접속합니다.

    2단계: 데이터스토어(Datastore) 생성

    PBS에서 백업이 실제로 저장되는 공간을 데이터스토어라고 부릅니다. 웹 UI에서 만들 수도 있고, CLI로도 만들 수 있어요.

    # PBS 서버에서 실행
    # /mnt/backup-pool 디렉토리를 데이터스토어로 생성
    proxmox-backup-manager datastore create main /mnt/backup-pool
    
    # 생성된 데이터스토어 목록 확인
    proxmox-backup-manager datastore list

    3단계: 사용자 및 토큰 생성 (API Token)

    Proxmox VE가 PBS에 접속할 때 사용할 API 토큰을 만들어야 합니다. 보안상 root 계정 대신 전용 사용자를 만드는 걸 권장해요.

    # PBS 서버에서 실행
    # 백업 전용 사용자 생성
    proxmox-backup-manager user create backup-user@pbs --password 'YourSecurePassword'
    
    # 데이터스토어에 대한 권한 부여 (DatastoreBackup 역할)
    proxmox-backup-manager acl update /datastore/main --auth-id 'backup-user@pbs' --role DatastoreBackup
    
    # API 토큰 생성
    proxmox-backup-manager user generate-token backup-user@pbs mytoken

    ⚠️ 중요! 토큰 값은 생성 시 한 번만 표시되니까 반드시 메모해 두세요. 저도 처음에 그냥 닫았다가 다시 만들었거든요 ㅎㅎ.

    Proxmox VE에 PBS 스토리지 연결하기

    이제 Proxmox VE 쪽에서 PBS를 백업 저장소로 등록해야 합니다.

    웹 UI로 연결하는 방법

    1. Proxmox VE 웹 UI 접속 → Datacenter 선택
    2. 왼쪽 메뉴에서 Storage 클릭
    3. Add 버튼 → Proxmox Backup Server 선택
    4. PBS 서버 IP, 포트(8007), 앞서 만든 사용자명과 토큰 값 입력
    5. 데이터스토어 이름 입력 후 저장

    CLI로 연결하는 방법

    # Proxmox VE 노드에서 실행
    # PBS 스토리지를 /etc/pve/storage.cfg에 추가
    pvesm add pbs pbs-backup \
      --server 192.168.1.100 \
      --datastore main \
      --username backup-user@pbs \
      --token mytoken \
      --tokenid 'backup-user@pbs!mytoken'
    
    # 연결 확인
    pvesm status

    연결이 성공하면 Proxmox VE 스토리지 목록에 PBS가 표시됩니다. 여기서 핑거프린트(Fingerprint) 불일치 오류가 나는 경우가 있는데, 이건 아래 트러블슈팅 섹션에서 다룰게요.

    ▲ Proxmox VE 웹 UI에서 PBS 스토리지를 연결하고 백업 작업을 설정하는 화면. Storage 메뉴에서 Proxmox Backup Server 타입을 선택해 연동합니다.

    Proxmox 스케줄 백업 설정: 자동화의 핵심

    이제 진짜 핵심입니다. 수동으로 백업 버튼 누르는 건 언젠가 반드시 까먹게 되어 있어요. Proxmox 스케줄 백업을 설정해두면 정해진 시간에 알아서 백업이 돌아갑니다.

    백업 작업(Backup Job) 생성

    Proxmox VE 웹 UI에서 Datacenter → Backup 메뉴로 이동하면 백업 작업을 만들 수 있어요.

    1. Add 버튼 클릭
    2. 노드(Node), 스토리지(Storage, 아까 연결한 PBS 선택), VM 선택
    3. 스케줄(Schedule) 설정
    4. 백업 모드(Mode) 선택
    5. 보존 정책(Retention) 설정

    스케줄 문법 이해하기

    Proxmox의 스케줄은 systemd 타이머 문법을 사용합니다. 처음엔 낯설 수 있는데, 익숙해지면 굉장히 직관적이에요.

    # 자주 쓰는 스케줄 예시
    daily          # 매일 00:00
    daily 02:00    # 매일 새벽 2시
    weekly         # 매주 월요일 00:00
    monthly        # 매월 1일 00:00
    sat 03:00      # 매주 토요일 새벽 3시
    */2:00         # 2시간마다
    
    # CLI로 백업 작업 생성 예시
    pvesh create /cluster/backup \
      --storage pbs-backup \
      --schedule 'daily 02:00' \
      --mode snapshot \
      --vmid 100,101,102 \
      --mailnotification always \
      --mailto '[email protected]'

    백업 모드(Mode) 선택 기준

    • Snapshot 모드: VM이 실행 중인 상태에서 백업. 서비스 중단 없음. 가장 많이 씀.
    • Suspend 모드: 백업 중 VM을 일시 정지. 데이터 일관성이 높지만 잠깐 서비스 중단.
    • Stop 모드: VM을 완전히 끄고 백업. 가장 안전하지만 다운타임 발생.

    💡 팁: 데이터베이스가 돌아가는 VM이라면 Snapshot 모드만으로는 데이터 일관성이 보장되지 않을 수 있어요. 이 경우 QEMU Guest Agent를 설치하면 스냅샷 전에 파일시스템을 freeze(동결)해줘서 훨씬 안전합니다.

    보존 정책(Retention Policy) 설정

    백업을 얼마나 오래 보관할지 정하는 게 보존 정책입니다. PBS에서는 굉장히 세밀하게 설정할 수 있어요.

    # PBS 데이터스토어에 보존 정책 설정
    proxmox-backup-manager datastore update main \
      --keep-last 3 \
      --keep-daily 7 \
      --keep-weekly 4 \
      --keep-monthly 3
    
    # 위 설정의 의미:
    # keep-last 3   : 최신 백업 3개는 무조건 보관
    # keep-daily 7  : 일별 백업을 7일치 보관
    # keep-weekly 4 : 주별 백업을 4주치 보관
    # keep-monthly 3: 월별 백업을 3개월치 보관

    이 설정 덕분에 같은 스토리지 공간으로 훨씬 오랜 기간의 백업 히스토리를 유지할 수 있습니다. 증분 백업 + 중복 제거 + 보존 정책, 이 세 가지가 Proxmox Backup Server의 핵심 강점이에요.

    ⚠️ 실제로 겪은 트러블슈팅 모음

    이론은 이론이고, 실제로 설정하다 보면 별의별 문제가 다 생기더라고요. 제가 겪은 것들을 공유합니다.

    문제 1: 핑거프린트(Fingerprint) 불일치 오류

    PBS 스토리지를 추가할 때 이런 오류가 나는 경우가 있어요.

    TASK ERROR: fingerprint 'XX:XX:...' does not match

    PBS 서버에서 핑거프린트를 직접 확인해서 Proxmox VE 설정에 넣어주면 해결됩니다.

    # PBS 서버에서 실행
    proxmox-backup-manager cert info | grep Fingerprint
    
    # 출력된 핑거프린트를 복사해서
    # Proxmox VE의 스토리지 설정에 fingerprint 항목에 붙여넣기

    문제 2: 백업 중 ‘lock timeout’ 오류

    VM 여러 개를 동시에 백업할 때 간혹 발생합니다. 기본적으로 Proxmox는 VM당 하나의 백업만 허용하는데, 이전 백업이 비정상 종료되면 락(Lock) 파일이 남아있을 수 있어요.

    # 특정 VM의 락 파일 확인 (VM ID 100 예시)
    ls /run/lock/qemu-server/lock-100.conf
    
    # 락 파일 제거 (백업이 실제로 안 돌아가고 있을 때만!)
    rm /run/lock/qemu-server/lock-100.conf

    문제 3: 스냅샷 백업 시 디스크 공간 부족

    Snapshot 모드로 백업할 때 임시 스냅샷을 위한 여유 공간이 필요합니다. 스토리지가 꽉 차있으면 백업이 실패해요. 저장소에 최소 20% 정도 여유 공간을 확보해 두는 게 좋습니다.

    문제 4: PBS 가비지 컬렉션 미실행으로 인한 공간 낭비

    PBS에서 오래된 백업을 삭제해도 실제 디스크 공간이 바로 회수되지 않아요. 가비지 컬렉션(Garbage Collection)을 주기적으로 실행해야 합니다.

    # PBS 서버에서 가비지 컬렉션 수동 실행
    proxmox-backup-manager garbage-collection start main
    
    # 스케줄 설정 (매주 일요일 새벽 4시)
    proxmox-backup-manager datastore update main \
      --gc-schedule 'sun 04:00'

    저도 이걸 몰라서 한동안 PBS 디스크가 예상보다 빨리 차는 걸 보고 의아했었는데, 가비지 컬렉션 설정하고 나서 해결됐습니다.

    ▲ PBS 웹 대시보드에서 백업 작업 현황, 스토리지 사용량, 보존 정책 적용 결과를 한눈에 확인할 수 있습니다.

    백업 검증: 백업했다고 끝이 아닙니다

    이게 진짜 중요한데 많이들 놓치는 부분이에요. 백업은 복원이 되어야 의미가 있습니다. 백업 파일이 존재한다는 것과, 그 백업으로 실제로 복원이 된다는 건 다른 얘기거든요.

    백업 무결성 검증 (Verify)

    PBS는 백업 데이터의 무결성을 검증하는 기능을 내장하고 있습니다.

    # PBS 서버에서 특정 데이터스토어 검증
    proxmox-backup-manager verify-job create \
      --store main \
      --schedule 'weekly' \
      --ignore-verified true \
      --outdated-after 30
    
    # 수동 검증 실행
    proxmox-backup-manager verify-job run verify-job-id

    복원 테스트

    저는 분기에 한 번씩은 실제로 VM을 복원해보는 테스트를 합니다. Proxmox VE 웹 UI에서는 간단하게 할 수 있어요.

    1. Proxmox VE 웹 UI → 해당 노드 → PBS 스토리지 선택
    2. 복원하고 싶은 백업 포인트 선택
    3. Restore 버튼 클릭
    4. 복원할 VM ID와 스토리지 지정 후 실행

    CLI로도 복원할 수 있습니다.

    # VM 백업 복원 (VM ID 100, 새 VM ID 200으로 복원)
    qmrestore pbs-backup:vm/100/2024-01-15T02:00:00Z 200 \
      --storage local-lvm \
      --force
    
    # CT(LXC 컨테이너) 백업 복원
    pct restore 201 pbs-backup:ct/101/2024-01-15T02:00:00Z \
      --storage local-lvm \
      --force

    VM 백업 전략: 어떻게 구성하면 좋을까?

    마지막으로 제가 실제로 운영 중인 VM 백업 전략을 공유할게요. 홈랩 기준이지만 소규모 운영 환경에도 참고하실 수 있을 거예요.

    ▲ VM 중요도에 따라 차등화된 백업 전략 인포그래픽. 중요 서비스는 매일, 개발/테스트 VM은 주 단위로 백업 주기를 다르게 설정합니다.

    제가 쓰는 3-2-1 백업 전략

    • 3: 데이터 복사본 3개 유지
    • 2: 2가지 다른 미디어/스토리지에 저장
    • 1: 1개는 오프사이트(다른 물리적 위치)에 보관

    홈랩에서 완전한 3-2-1을 구현하기 어렵다면, 최소한 PBS 백업 + 외장 하드 또는 클라우드 스토리지(B2, S3 등)에 추가 백업을 유지하는 것을 권장합니다.

    VM 중요도별 백업 주기

    • 중요 서비스 VM (홈서버, NAS 등): 매일 새벽 2시, 7일치 보관
    • 일반 서비스 VM: 매일 새벽 3시, 3일치 보관
    • 개발/테스트 VM: 주 1회, 2주치 보관

    마무리: 백업은 습관입니다

    여기까지 따라오셨다면, 이제 Proxmox 백업 자동화의 기본 틀은 완성됐습니다. 🎉

    정리하자면:

    • ✅ PBS를 설치하고 Proxmox VE와 연동했습니다
    • ✅ 증분 백업과 중복 제거로 스토리지를 효율적으로 사용합니다
    • ✅ 스케줄 백업으로 매일 자동으로 백업이 돌아갑니다
    • ✅ 보존 정책으로 오래된 백업을 자동 정리합니다
    • ✅ 검증과 복원 테스트로 백업의 신뢰성을 확인합니다

    백업은 한 번 설정했다고 끝이 아니에요. 주기적으로 백업이 제대로 돌아가고 있는지, 복원은 실제로 되는지 확인하는 습관이 중요합니다. 저도 매월 PBS 대시보드를 한 번씩 들여다보고, 분기에 한 번은 복원 테스트를 하고 있어요.

    다음 글에서는 Proxmox VE 클러스터 구성과 고가용성(HA) 설정에 대해 다룰 예정입니다. PBS 백업이 잘 되어 있으면 클러스터 구성도 훨씬 마음 편하게 할 수 있거든요. 기대해주세요!

    혹시 설정하다가 막히는 부분이 있으시면 댓글로 남겨주세요. 같이 해결해봐요 😊

    자주 묻는 질문 (FAQ)

    Q. PBS 서버는 반드시 별도 물리 서버여야 하나요?

    꼭 그렇지는 않습니다. Proxmox VE 위에 VM으로 PBS를 올릴 수도 있어요. 다만 해당 노드가 장애가 나면 백업 서버도 같이 다운된다는 단점이 있어서, 가능하면 별도 머신을 추천합니다.

    Q. 백업 중 VM 성능이 저하되나요?

    Snapshot 모드는 백업 중 성능 영향이 거의 없습니다. 다만 스토리지 I/O는 백업 중 증가할 수 있어요. 그래서 새벽 시간대에 스케줄을 잡는 게 좋습니다.

    Q. PBS 없이 로컬 백업만으로 충분하지 않나요?

    단순한 환경이라면 로컬 백업도 괜찮습니다. 하지만 VM이 5개 이상이거나, 스토리지 공간이 넉넉하지 않다면 Proxmox Backup Server의 증분 백업과 중복 제거 기능이 확실히 유리합니다.

  • [3D 프린팅] Cura 5.7 슬라이서 설정: 초보자를 위한 완벽 출력 가이드

    [3D 프린팅] Cura 5.7 슬라이서 설정: 초보자를 위한 완벽 출력 가이드

    안녕하세요, 13년차 서버실 지킴이, ’13년차의 서버실’ 블로그 주인장입니다. 오늘은 서버실 이야기는 잠시 접어두고, 제 홈랩에서 밤낮없이 돌아가고 있는 3D 프린터 이야기, 그중에서도 Cura 5.7 슬라이서 설정에 대한 경험담을 풀어볼까 합니다. 3D 프린팅을 처음 시작하시는 분들이라면, 저처럼 수많은 출력 실패와 ‘삽질’을 경험하셨을 거예요. 저도 처음엔 이게 뭔가 싶었는데, 결국은 Cura 가이드를 제대로 익히는 것이 성공적인 출력을 위한 지름길이더라고요.

    처음 3D 프린터를 구매하고 나서, 예쁜 모델링 파일을 다운받아 신나는 마음으로 출력을 눌렀다가 처참하게 실패했던 기억, 혹시 있으신가요? 😢 출력물이 베드에서 떨어져 나가거나, 거미줄처럼 실이 덕지덕지 붙어 나오거나, 아니면 아예 형체가 이상하게 나오는 등… 저도 수십 번은 겪었을 겁니다. 이런 문제들의 대부분은 사실 3D프린터 슬라이서인 Cura의 설정을 제대로 이해하지 못해서 발생하거든요. 오늘은 초보자분들도 헤매지 않고 멋진 출력물을 뽑아낼 수 있도록, 제가 직접 경험하며 얻은 Cura 5.7 설정 팁을 아낌없이 공유해 드릴게요. 함께 차근차근 따라오시면, 분명 만족스러운 결과를 얻으실 수 있을 겁니다! 💡

    Cura 5.7 메인 화면은 이렇게 생겼습니다. 다양한 옵션들이 한눈에 들어오죠? 처음엔 복잡해 보이지만, 자주 쓰는 것들 위주로 익히면 금방 익숙해집니다.

    Cura 슬라이서, 왜 중요할까요?

    3D 프린팅을 시작하면서 가장 먼저 만나게 되는 소프트웨어가 바로 슬라이서(Slicer)입니다. 쉽게 말해, 3D 모델링 파일(보통 .STL이나 .OBJ 파일)을 3D 프린터가 이해할 수 있는 언어(G-code)로 바꿔주는 역할을 하는 거죠. G-code(지코드)는 프린터의 노즐이 어디로 움직여야 하고, 필라멘트를 얼마나 밀어내야 하며, 온도는 몇 도로 설정해야 하는지 등 모든 출력 과정을 명령하는 코드입니다.

    수많은 슬라이서 프로그램 중에서도 Ultimaker Cura(얼티메이커 큐라)는 가장 널리 사용되고 있는 슬라이서 중 하나거든요. 무료이고, 오픈소스(Open Source)이며, 다양한 3D 프린터 모델을 지원한다는 장점 덕분에 저도 오랫동안 사용하고 있어요. 특히 Cura 5.7 버전은 사용자 인터페이스(UI)도 직관적이고, 여러 기능이 개선되어 초보자분들이 접근하기 더욱 좋아졌더라고요.

    Cura 5.7 초기 설정 가이드: 내 프린터 등록하기

    가장 먼저 Cura를 설치하셨다면, 여러분의 3D 프린터를 등록해야 합니다. 저도 처음엔 어떤 프린터를 선택해야 할지 몰라 한참 헤맸던 기억이 나네요. 하지만 걱정 마세요, 생각보다 간단합니다.

    1. Cura 실행 및 프린터 추가: Cura를 처음 실행하면, 자동으로 프린터 추가 마법사가 뜹니다. 만약 뜨지 않는다면, 상단 메뉴에서 Settings (설정) > Printer (프린터) > Add Printer (프린터 추가)를 선택하시면 됩니다.
    2. 프린터 선택:
      • Non-Ultimaker Printers (얼티메이커 외 프린터)를 선택하고, 본인의 프린터 제조사와 모델명을 찾아 선택합니다. (예: Creality Ender-3, Anet A8 등)
      • 만약 목록에 없다면, Custom (사용자 정의) > Custom FFF printer (사용자 정의 FFF 프린터)를 선택하여 직접 베드 크기나 노즐 직경 등을 입력해야 합니다. 저도 한때 DIY 프린터를 만들어서 등록해본 경험이 있거든요.
    3. 프린터 설정 확인: 프린터를 선택하면, 자동으로 해당 프린터에 맞는 기본 설정(빌드 볼륨, 노즐 직경 등)이 로드됩니다. 특별한 경우가 아니라면 이대로 두셔도 됩니다.

    이렇게 프린터가 등록되면, 이제 모델링 파일을 불러와 G-code로 슬라이싱할 준비가 된 겁니다. 간단하죠? 🎉

    성공적인 출력을 위한 핵심 설정 파헤치기

    이제 본격적으로 Cura 5.7 설정의 핵심인 출력 관련 파라미터(Parameter)들을 살펴보겠습니다. 이 부분에서 정말 많은 분들이 삽질을 하시고, 저 역시 수많은 실패를 통해 배웠던 것들이 많거든요. 중요한 설정 위주로 쉽게 설명해 드릴게요.

    Cura의 ‘Prepare’ 탭에서 볼 수 있는 핵심 설정 창입니다. 이 설정들을 잘 조절하는 것이 고품질 출력을 위한 첫걸음이죠.

    1. 레이어 높이 (Layer Height): 출력 품질 vs 속도

    • 설명: 출력물의 한 층(Layer)의 두께를 의미합니다. 이 값이 낮을수록 층이 얇아져서 출력물의 표면이 매끄러워지고 디테일이 살아납니다. 반대로 높으면 출력 속도가 빨라지지만, 층이 눈에 띄게 보여 거칠어져요.
    • 제가 쓰는 팁:
      • 정밀한 출력물: 0.1mm ~ 0.15mm (출력 시간이 길어집니다.)
      • 일반적인 출력물: 0.2mm (가장 많이 사용합니다.)
      • 빠른 출력물/시제품: 0.25mm ~ 0.3mm (품질보다는 속도에 중점을 둘 때)

    2. 벽 두께 (Wall Thickness) & 탑/바텀 레이어 (Top/Bottom Layers): 출력물 강도

    • 설명:
      • Wall Thickness (벽 두께): 출력물 외벽의 두께를 결정합니다. 노즐 직경의 배수로 설정하는 것이 일반적이거든요. (예: 0.4mm 노즐 기준, 0.8mm 또는 1.2mm) 두꺼울수록 강도가 강해집니다.
      • Top/Bottom Layers (탑/바텀 레이어): 출력물의 상단과 하단이 몇 층으로 채워질지를 결정합니다. 이 값이 너무 낮으면 상단이 비어 보이거나 구멍이 생길 수 있어요.
    • 제가 쓰는 팁:
      • Wall Line Count (벽 라인 수)를 2~3개 정도로 설정하고, 노즐 직경에 맞춰 Wall Thickness를 조절합니다.
      • Top/Bottom Layers는 보통 4~5개 정도로 설정하면 웬만한 출력물은 깔끔하게 나와요.

    3. 채움 밀도 (Infill Density) & 패턴 (Pattern): 내부 채움

    • 설명: 출력물 내부를 채우는 정도와 방식을 결정합니다. Infill Density (채움 밀도)는 퍼센트(%)로 설정하며, 높을수록 내부가 촘촘해져 강도가 강해지지만, 재료 소모와 출력 시간이 늘어나죠. Infill Pattern (채움 패턴)은 내부를 채우는 모양을 의미하며, 종류에 따라 강도, 유연성, 출력 시간이 달라집니다.
    • 제가 쓰는 팁:
      • 시제품/장식용: 10~15% (재료 절약, 빠른 출력)
      • 일반적인 용도: 20~25% (적당한 강도와 출력 시간)
      • 높은 강도 요구: 40% 이상 (기능성 부품 등)
      • 패턴: Cubic (큐빅)이나 Gyroid (자이로이드)가 강도도 좋고 안정적이라 자주 사용합니다. Lines (라인)는 빠르지만 강도가 약하거든요.

    4. 출력 속도 (Print Speed): 품질과 시간의 트레이드오프

    • 설명: 노즐이 움직이며 필라멘트를 압출하는 속도입니다. 빠를수록 출력 시간이 줄어들지만, 품질 저하(고스팅, 진동으로 인한 오차)나 압출 불량의 위험이 커져요.
    • 제가 쓰는 팁:
      • 일반적인 출력: 50mm/s ~ 60mm/s
      • 고품질 출력: 30mm/s ~ 40mm/s (인내심이 필요합니다. ㅎㅎ)
      • 벽(Wall)이나 상단/하단(Top/Bottom) 레이어는 메인 출력 속도보다 조금 느리게 (예: 25~30mm/s) 설정하면 표면 품질을 높일 수 있어요. Cura에는 Outer Wall Speed (외부 벽 속도) 같은 세부 설정이 있으니 활용해 보세요.

    5. 서포트 (Supports): 오버행 구조물 지지

    • 설명: 출력물에 공중에 떠 있는 부분(Overhang, 오버행)이 있을 때, 이 부분을 지지해주기 위해 임시로 출력되는 구조물입니다. 없으면 필라멘트가 중력에 의해 처지거나 무너져요.
    • 제가 쓰는 팁:
      • Generate Support (서포트 생성)를 활성화하고, Support Overhang Angle (서포트 오버행 각도)를 45도 ~ 60도 사이로 설정합니다. 이 각도보다 가파른 경사에는 서포트가 생성되거든요.
      • Support Placement (서포트 배치)는 Everywhere (모든 곳)보다는 Touching Buildplate (빌드플레이트와 닿는 곳만)를 먼저 시도하는 것이 제거하기 편합니다.
      • 제거가 어려운 경우가 많으니, Support Density (서포트 밀도)는 10~15% 정도로 낮게 설정하고, Support Z Distance (서포트 Z 거리)를 노즐 직경의 배수(예: 0.2mm, 0.28mm)로 조절하여 제거 용이성을 높여보세요. 이 부분에서 삽질을 정말 많이 했었거든요.

    6. 베드 접착 (Build Plate Adhesion): 출력물 안착

    • 설명: 출력물이 빌드 플레이트(Build Plate, 프린터 베드)에 잘 달라붙도록 돕는 기능입니다. 출력 초기에 베드에서 떨어지는 문제(Warping, 워핑)를 방지하죠.
    • 제가 쓰는 팁:
      • Brim (브림): 출력물 바닥 주변에 얇고 넓게 층을 만들어 접착 면적을 넓힙니다. 제거가 쉽고 효과가 좋아서 제일 많이 써요!
      • Skirt (스커트): 출력물 주변에 몇 바퀴 선을 그어 노즐 프라임(Prime, 예열 및 필라멘트 채우기)을 돕습니다. 접착에는 직접적인 영향이 적어요.
      • Raft (래프트): 출력물 바닥에 두꺼운 뗏목 형태의 층을 만듭니다. 접착력이 매우 강하지만, 제거가 어렵고 바닥면 품질이 좋지 않을 수 있어요. 워핑이 정말 심할 때만 사용합니다.

    7. 온도 (Temperature) & 리트랙션 (Retraction): 스트링잉 방지

    • 설명:
      • Printing Temperature (출력 온도): 노즐 온도(Extruder Temperature)와 베드 온도(Build Plate Temperature)를 설정합니다. 사용하는 필라멘트(PLA, ABS, PETG 등)에 따라 적정 온도가 다르거든요. 필라멘트 제조사 권장 온도를 따르세요.
      • Retraction (리트랙션): 노즐이 이동할 때, 필라멘트를 살짝 뒤로 당겨서 노즐 끝에서 필라멘트가 새어 나오는 것을 방지하는 기능입니다. 스트링잉(Stringing, 거미줄 현상)과 블로빙(Blobling, 점액처럼 뭉치는 현상)을 줄이는 데 핵심적인 역할을 하거든요.
    • 제가 쓰는 팁:
      • PLA 필라멘트 기준: 노즐 온도 190~210°C, 베드 온도 50~60°C.
      • Retraction Distance (리트랙션 거리): 4~6mm (보우덴(Bowden) 방식 프린터), 0.5~1.5mm (다이렉트 드라이브(Direct Drive) 방식 프린터)
      • Retraction Speed (리트랙션 속도): 25~45mm/s
      • 이 설정은 프린터와 필라멘트에 따라 정말 천차만별이거든요. Temperature Tower (온도 타워)나 Retraction Test (리트랙션 테스트) 모델을 출력해보면서 최적값을 찾는 것이 중요해요. 저도 수없이 테스트하며 최적값을 찾아냈습니다. 🧪

    ⚠️ 삽질 경험담과 트러블슈팅 팁

    제가 13년차 인프라 엔지니어지만, 3D 프린팅 분야에서는 저도 초보와 다름없었죠. 수많은 삽질을 통해 얻은 몇 가지 꿀팁을 공유합니다.

    1. 출력물이 베드에서 떨어져요 (Warping)!
      • 원인: 베드 온도가 너무 낮거나, 첫 레이어(First Layer)가 제대로 안착되지 않았을 때예요.
      • 해결:
        • 베드 온도를 5~10°C 정도 높여보세요.
        • Brim (브림) 기능을 사용해 접착 면적을 넓혀보세요.
        • 베드 레벨링(Bed Leveling)을 다시 확인하고, 노즐과 베드 간의 간격이 너무 멀지 않은지 확인하세요. 종이 한 장이 겨우 들어갈 정도가 적당합니다.
        • 저는 베드에 헤어스프레이나 딱풀을 발라서 접착력을 높이기도 합니다. 이거 진짜 꿀팁이더라고요.
    2. 출력물에 거미줄이 생겨요 (Stringing)!
      • 원인: 노즐 온도가 너무 높거나, 리트랙션 설정이 부족할 때예요.
      • 해결:
        • 노즐 온도를 5°C 단위로 낮춰가며 테스트해보세요.
        • Retraction Distance (리트랙션 거리)를 0.5~1mm 단위로 늘려보세요.
        • Retraction Speed (리트랙션 속도)를 높여보세요.
        • 필라멘트가 습기를 먹으면 스트링잉이 심해지니, 제습 보관도 중요합니다.
    3. 레이어가 제대로 쌓이지 않고 분리돼요 (Layer Separation)!
      • 원인: 노즐 온도가 너무 낮거나, 냉각팬(Cooling Fan) 설정이 너무 강할 때예요.
      • 해결:
        • 노즐 온도를 5~10°C 정도 높여보세요.
        • Cooling Fan Speed (냉각팬 속도)를 줄여보세요. 특히 첫 레이어 몇 개는 냉각팬을 끄는 것이 좋습니다.
        • 프린팅 환경의 온도가 너무 낮으면 문제가 발생할 수 있어요. 챔버(Enclosure)를 사용하거나, 주변 온도를 따뜻하게 유지하는 것도 도움이 됩니다.

    이 외에도 수많은 문제가 발생할 수 있지만, 대부분은 위에서 설명한 핵심 설정들을 조금씩 조절하면서 해결할 수 있을 겁니다. 포기하지 마세요! 멘토인 제가 항상 응원합니다. 💪

    설정 검증 및 첫 출력! 🎉

    이제 여러분이 열심히 설정한 값들이 잘 작동하는지 확인해볼 시간입니다. 복잡한 모델보다는 간단한 테스트 모델을 출력해보는 것을 추천해요.

    1. 테스트 모델 불러오기: Thingiverse 같은 사이트에서 Calibration Cube (캘리브레이션 큐브)나 Benchy (벤치) 같은 작은 테스트 모델을 다운로드하여 Cura로 불러옵니다.
    2. 슬라이싱 (Slice): Cura 우측 하단의 Slice (슬라이스) 버튼을 클릭하여 G-code를 생성합니다.
    3. 미리보기 (Preview): Preview (미리보기) 탭으로 이동하여 출력 경로와 서포트 생성 여부 등을 시각적으로 확인해요. 여기서 문제가 없어 보이면 성공입니다.
    4. 출력 시작: 생성된 G-code 파일을 SD 카드에 저장하거나, USB 케이블/Wi-Fi를 통해 프린터로 전송하여 출력을 시작합니다.

    드디어 제가 설정한 값으로 뽑아낸 벤치마크 큐브입니다. 깔끔하게 잘 나왔죠? 이런 작은 성공이 다음 출력에 대한 동기를 부여합니다.

    마무리하며: 꾸준한 실험과 학습이 중요합니다

    오늘은 Cura 5.7 슬라이서 설정, 특히 초보자분들이 성공적인 3D 프린팅을 시작하는 데 필요한 핵심 설정들을 제 경험을 바탕으로 자세히 알아봤습니다. 3D프린터 슬라이서는 단순히 모델을 G-code로 바꾸는 도구가 아니라, 출력물의 품질을 좌우하는 가장 중요한 요소 중 하나라는 것을 다시 한번 강조하고 싶네요.

    제가 알려드린 팁들은 기본적인 가이드라인이며, 여러분의 프린터 모델, 사용하는 필라멘트 종류, 심지어는 출력 환경(온도, 습도)에 따라 최적의 설정값은 달라질 수 있습니다. 마치 서버 환경 설정과 비슷하죠? 😅 끊임없이 실험하고, 작은 실패를 통해 배우는 과정이 3D 프린팅의 진짜 재미라고 생각합니다.

    이 글이 여러분의 3D 프린팅 삽질 여정을 조금이나마 줄여주고, 즐거운 취미 생활을 이어가는 데 도움이 되었으면 좋겠습니다. 다음번에는 더 재미있는 홈랩 이야기나 서버실 경험담으로 찾아뵐게요! 그때까지 즐거운 출력 되세요! 🎉

    오늘 다룬 핵심 설정들을 한눈에 볼 수 있도록 정리해봤습니다. 이 표를 참고해서 여러분만의 최적 설정을 찾아보세요!

  • [HomeLabs] 저전력 미니 서버 구축: N100/N305 미니PC 홈서버 완벽 가이드

    [HomeLabs] 저전력 미니 서버 구축: N100/N305 미니PC 홈서버 완벽 가이드

    전기세 걱정 없는 홈서버, N100/N305 미니PC로 시작하기

    홈서버 구축을 처음 고민할 때 가장 많이 받는 질문이 있어요. “전기세 얼마나 나와요?” 저도 처음에 타워형 서버로 홈랩을 시작했다가 한 달 전기세 고지서 보고 잠깐 멘붕이 왔었거든요. 그때부터 저전력 미니 서버 쪽으로 눈을 돌리기 시작했습니다.

    요즘 홈랩 커뮤니티에서 가장 핫한 조합이 바로 인텔 N100, N305 칩셋을 탑재한 미니PC예요. 가격도 합리적이고, 전력 소비는 놀라울 정도로 낮고, 성능은 웬만한 홈랩 워크로드를 충분히 소화해내거든요. 오늘은 제가 직접 구축하고 운영해온 경험을 바탕으로 N100/N305 미니PC 홈서버 구축 완벽 가이드를 정리해봤습니다.

    N100 N305 미니PC 홈서버 전체 구성도 및 홈랩 아키텍처 다이어그램

    ▲ N100/N305 기반 저전력 홈랩의 전체 구성도 — 미니PC 본체부터 네트워크 스위치, NAS 연결까지 한눈에 볼 수 있는 레이아웃입니다.


    N100과 N305, 뭐가 다른가요?

    처음 보시는 분들은 “N100이랑 N305가 뭔데요?” 하실 수 있어요. 쉽게 말해서, 인텔이 저전력 소형 기기용으로 내놓은 Alder Lake-N 시리즈 프로세서입니다. 기존 Celeron/Pentium 라인을 대체하는 포지션이라고 보시면 돼요.

    N100 vs N305 핵심 차이점

    항목 Intel N100 Intel N305
    코어 구성 4코어 (E-core) 8코어 (E-core)
    TDP (열설계전력) 6W 15W
    최대 부스트 클럭 3.4GHz 3.8GHz
    ECC 메모리 지원 미지원 지원 (일부 보드)
    적합한 용도 단독 서비스, 가벼운 컨테이너 다수 VM, 복잡한 워크로드
    대략적 가격대 상대적으로 저렴 N100 대비 높음

    제 경험상 처음 홈서버를 시작하는 분이라면 N100으로도 충분합니다. Docker 컨테이너 10~20개 정도는 거뜬히 돌아가요. 반면에 Proxmox VE(프록스목스, 오픈소스 가상화 플랫폼)로 여러 개의 VM을 동시에 굴리거나, 미디어 트랜스코딩(실시간 영상 변환)을 함께 할 계획이라면 N305 쪽이 더 여유롭습니다.

    💡 팁: N100/N305 모두 Intel Quick Sync(퀵 싱크, 하드웨어 가속 영상 처리) 기능을 지원합니다. Plex나 Jellyfin(젤리핀, 미디어 서버) 트랜스코딩에 이걸 활용하면 CPU 부하가 확 줄어들어요.


    하드웨어 선택 가이드 — 뭘 사야 하나요?

    미니PC 시장에는 정말 다양한 제품이 있는데, 처음엔 어떤 걸 골라야 할지 막막하더라고요. 제가 실제로 고려했던 체크리스트를 공유할게요.

    미니PC 선택 시 핵심 체크리스트

    • LAN 포트 개수: 홈서버용이라면 2.5GbE(2.5기가비트 이더넷) 포트가 2개 이상인 게 좋아요. 하나는 업스트림, 하나는 관리용이나 추가 네트워크 분리에 씁니다.
    • RAM 확장성: 최소 16GB는 되어야 해요. 처음엔 8GB로 버티다가 결국 업그레이드했는데, 처음부터 넉넉하게 가는 게 낫더라고요.
    • 스토리지 슬롯: M.2 NVMe 슬롯이 2개 이상이면 OS용 + 데이터용으로 분리 운영이 가능해서 편합니다.
    • USB 포트: USB 3.0 이상 포트가 넉넉한지 확인. 외장 스토리지 연결할 때 필요해요.
    • 팬리스 vs 쿨링팬 여부: 24시간 돌아가는 서버라면 팬 소음이 생각보다 거슬릴 수 있어요.
    • Wake-on-LAN (WoL) 지원: 원격으로 전원을 켤 수 있는 기능. 홈서버에선 거의 필수입니다.

    시중에 N100 탑재 미니PC는 여러 브랜드에서 다양한 모델로 출시되어 있어요. 구매 전에 커뮤니티 리뷰와 실제 사용자 후기를 꼭 확인하시는 걸 추천드려요. 특히 바이오스(BIOS) 업데이트 지원이 잘 되는지, 리눅스 드라이버 호환성은 어떤지가 중요하거든요.


    OS 설치 — Proxmox VE로 홈랩 기반 다지기

    저는 홈서버 OS로 Proxmox VE(프록스목스 버추얼 인바이런먼트)를 강력 추천합니다. 오픈소스 하이퍼바이저(가상화 플랫폼)인데, 웹 UI로 VM과 LXC 컨테이너를 쉽게 관리할 수 있어서 홈랩에 딱이거든요.

    Proxmox VE 설치 순서

    1. Proxmox 공식 사이트에서 ISO 이미지 다운로드
    2. Rufus 또는 Balena Etcher로 USB 부팅 디스크 생성
    3. 미니PC에 USB 꽂고 부팅, BIOS에서 USB 부팅 우선순위 설정
    4. 설치 마법사 진행 — IP 주소, 게이트웨이, DNS 설정
    5. 설치 완료 후 웹 브라우저에서 https://[IP주소]:8006 접속

    설치 자체는 어렵지 않아요. 근데 여기서 한 가지 꼭 챙겨야 할 게 있습니다.

    ⚠️ 주의: Proxmox 기본 설치 후 엔터프라이즈 저장소(Enterprise Repository)가 활성화되어 있어서, 라이선스 없이 apt update를 하면 오류가 납니다. 아래 설정으로 무료 커뮤니티 저장소로 바꿔주세요.

    # Proxmox 엔터프라이즈 저장소 비활성화
    echo "# deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise" > /etc/apt/sources.list.d/pve-enterprise.list
    
    # 무료 커뮤니티 저장소 추가
    echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list
    
    # 패키지 업데이트
    apt update && apt upgrade -y

    저도 처음에 이거 모르고 한참 헤맸습니다 ㅎㅎ. 설치 직후에 꼭 해주세요.

    N100/N305에서 Intel GPU 패스스루 설정

    미디어 서버를 돌릴 계획이라면 내장 GPU를 LXC 컨테이너나 VM에 넘겨주는 GPU 패스스루(Pass-through) 설정이 중요합니다.

    # LXC 컨테이너 설정 파일 예시 (/etc/pve/lxc/[CTID].conf)
    # i915 드라이버를 통한 Intel Quick Sync 공유 방식 설정
    
    lxc.cgroup2.devices.allow: c 226:0 rwm
    lxc.cgroup2.devices.allow: c 226:128 rwm
    lxc.cgroup2.devices.allow: c 29:0 rwm
    lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file
    lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
    lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file

    이렇게 하면 Jellyfin 같은 미디어 서버 컨테이너에서 Intel Quick Sync 하드웨어 가속을 바로 쓸 수 있어요. 체감 차이가 꽤 큽니다.

    Proxmox VE 웹 대시보드에서 N100 미니PC 홈서버 노드와 컨테이너 관리 화면

    ▲ Proxmox VE 웹 대시보드 — CPU 사용률, 메모리, 스토리지 현황을 한눈에 파악할 수 있어요. N100 기반임에도 여러 컨테이너가 여유롭게 돌아가고 있습니다.


    Docker로 핵심 서비스 올리기

    Proxmox 위에 Debian LXC 컨테이너를 만들고, 그 안에 Docker를 설치하는 방식을 저는 선호합니다. VM보다 오버헤드가 적고, 그렇다고 호스트를 직접 건드리지 않아도 되거든요.

    Docker + Docker Compose 설치

    # 기존 구버전 Docker 제거
    apt remove docker docker-engine docker.io containerd runc
    
    # 필수 패키지 설치
    apt update
    apt install -y ca-certificates curl gnupg lsb-release
    
    # Docker 공식 GPG 키 추가
    mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    
    # Docker 저장소 추가
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
      $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    # Docker 엔진 설치
    apt update
    apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

    홈랩 필수 서비스 Docker Compose 예시

    제가 실제로 돌리고 있는 스택의 일부를 공유할게요. Traefik(트래픽, 리버스 프록시)을 앞단에 두고, 각 서비스를 뒤에 배치하는 구조입니다.

    version: '3.8'
    
    services:
      traefik:
        image: traefik:v2.10
        container_name: traefik
        restart: unless-stopped
        ports:
          - "80:80"
          - "443:443"
          - "8080:8080"  # Traefik 대시보드
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - ./traefik/traefik.yml:/traefik.yml:ro
          - ./traefik/acme.json:/acme.json  # Let's Encrypt 인증서
        networks:
          - proxy
    
      portainer:
        image: portainer/portainer-ce:latest
        container_name: portainer
        restart: unless-stopped
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - portainer_data:/data
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.portainer.rule=Host(`portainer.homelab.local`)"
        networks:
          - proxy
    
      jellyfin:
        image: jellyfin/jellyfin:latest
        container_name: jellyfin
        restart: unless-stopped
        devices:
          - /dev/dri:/dev/dri  # Intel Quick Sync GPU 패스스루
        volumes:
          - ./jellyfin/config:/config
          - /mnt/media:/media:ro
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.jellyfin.rule=Host(`jellyfin.homelab.local`)"
        networks:
          - proxy
    
    volumes:
      portainer_data:
    
    networks:
      proxy:
        external: true

    Traefik을 쓰면 각 서비스마다 포트 번호를 외울 필요 없이 도메인 이름으로 접근할 수 있어서 진짜 편해요. 처음엔 설정이 좀 복잡해 보이는데, 한 번 익히면 계속 쓰게 됩니다.

    홈랩에서 자주 쓰는 서비스 목록

    • Portainer(포테이너): Docker 컨테이너 웹 UI 관리
    • Jellyfin(젤리핀): 오픈소스 미디어 서버
    • Home Assistant(홈 어시스턴트): 스마트홈 허브
    • Pi-hole(파이홀): 네트워크 광고 차단 DNS
    • Uptime Kuma(업타임 쿠마): 서비스 모니터링
    • Vaultwarden(볼트워든): 셀프호스팅 비밀번호 관리자 (Bitwarden 호환)
    • Nextcloud(넥스트클라우드): 셀프호스팅 클라우드 스토리지

    ⚠️ 삽질 포인트 — 이것만 주의하면 됩니다

    13년 경력이라고 해도 새로운 환경에서는 삽질을 합니다 ㅎㅎ. 제가 N100 미니PC 홈서버 세팅하면서 걸렸던 포인트들을 정리해봤어요.

    문제 1: 절전 모드로 인한 서버 다운

    처음에 며칠 잘 돌다가 갑자기 서버가 응답을 안 하는 거예요. 가서 보면 켜져 있는데 핑이 안 되더라고요. 알고 보니 BIOS의 절전 설정이 문제였습니다.

    # Linux에서 절전 모드 비활성화
    # /etc/systemd/sleep.conf 수정
    
    [Sleep]
    AllowSuspend=no
    AllowHibernation=no
    AllowSuspendThenHibernate=no
    AllowHybridSleep=no

    BIOS에서도 S3 Sleep State를 비활성화하거나, AC 전원 연결 시 자동 부팅 옵션을 켜두세요. 정전 후 자동 복구에도 필요합니다.

    문제 2: NTP 시간 동기화 오류로 인한 인증서 오류

    LXC 컨테이너에서 HTTPS 인증서 관련 오류가 간헐적으로 났었는데, 원인이 시간 동기화 문제였어요. 컨테이너 내부 시간이 호스트와 달라지는 경우가 있거든요.

    # 호스트 시간대 설정
    timedatectl set-timezone Asia/Seoul
    
    # systemd-timesyncd 활성화
    systemctl enable systemd-timesyncd
    systemctl start systemd-timesyncd
    
    # 동기화 상태 확인
    timedatectl status

    문제 3: 저장 공간 부족 — /var/lib/docker 폭탄

    Docker를 쓰다 보면 사용하지 않는 이미지, 볼륨, 네트워크가 쌓여서 디스크를 잡아먹습니다. 주기적으로 정리해줘야 해요.

    # 사용하지 않는 Docker 리소스 전체 정리
    docker system prune -a --volumes
    
    # 또는 개별 정리
    docker image prune -a    # 미사용 이미지 삭제
    docker volume prune      # 미사용 볼륨 삭제
    docker network prune     # 미사용 네트워크 삭제
    
    # 현재 디스크 사용량 확인
    docker system df

    저는 이걸 cron(크론, 리눅스 작업 스케줄러)으로 매주 한 번씩 자동 실행되도록 해뒀습니다.


    전력 소비 모니터링 — 진짜 얼마나 아낄 수 있나요?

    홈서버 구축할 때 가장 궁금한 게 “전기세 얼마나 나오냐”잖아요. N100 미니PC는 아이들(idle, 대기 상태) 시 소비 전력이 매우 낮습니다. 물론 실제 수치는 구체적인 모델과 구성에 따라 다르지만, 일반적으로 구형 타워 서버나 데스크탑 대비 전력 소비가 크게 낮은 편이에요.

    Proxmox에서 전력 관련 상태를 간단히 확인하는 방법이에요.

    # CPU 현재 주파수 및 거버너 확인
    cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    
    # powertop 설치 및 실행 (전력 소비 분석 툴)
    apt install powertop -y
    powertop
    
    # CPU 절전 모드 활성화 (powertop 자동 튜닝)
    powertop --auto-tune

    💡 팁: powertop --auto-tune을 /etc/rc.local에 추가해두면 부팅 시 자동으로 전력 최적화가 적용됩니다. 체감상 아이들 소비 전력이 더 낮아지더라고요.

    홈서버 Grafana 모니터링 대시보드에서 저전력 미니PC 전력 소비 및 컨테이너 현황 확인

    ▲ Grafana(그라파나) + Prometheus(프로메테우스)로 구성한 홈서버 모니터링 대시보드 — CPU, 메모리, 네트워크, 전력 소비까지 실시간으로 확인할 수 있어요.


    자주 묻는 질문 (FAQ)

    Q. N100 미니PC로 NAS(나스, 네트워크 연결 스토리지)도 되나요?

    됩니다! USB 3.0으로 외장 HDD를 연결하거나, M.2 슬롯에 NVMe를 꽂아서 TrueNAS Scale이나 OpenMediaVault를 올릴 수 있어요. 다만 대용량 HDD를 여러 개 연결하고 싶다면 SATA 포트가 없는 모델이 많아서, 이 경우엔 USB 3.0 허브나 별도 NAS를 따로 두는 걸 추천합니다.

    Q. N100으로 쿠버네티스(Kubernetes) 운영 가능한가요?

    가능하긴 한데, 단일 노드라면 K3s(케이쓰리에스, 경량 쿠버네티스)를 추천합니다. 풀 쿠버네티스보다 리소스를 훨씬 적게 먹거든요. 저도 다음 글에서 K3s 홈랩 구축 과정을 다룰 예정이에요.

    Q. 외부에서 접속하려면 어떻게 해야 하나요?

    가장 안전한 방법은 Tailscale(테일스케일, 메시 VPN 서비스) 또는 WireGuard(와이어가드, 오픈소스 VPN)를 사용하는 거예요. 포트 포워딩으로 직접 노출하는 건 보안상 권장하지 않습니다.

    Q. 처음 시작할 때 예산은 얼마나 잡아야 하나요?

    N100 미니PC 본체, RAM, NVMe SSD를 합쳐서 구성할 수 있어요. 중고 시장도 잘 활용하면 더 절약할 수 있고요. 정확한 가격은 시기와 판매처에 따라 다르니 구매 시점에 직접 비교해보시는 게 좋습니다.


    마무리 — 저전력 홈서버, 이제 시작해보세요

    N100 N305 미니PC 홈서버 구축 단계별 로드맵 요약 인포그래픽

    ▲ N100/N305 미니PC 홈서버 구축 로드맵 요약 — OS 설치부터 서비스 배포까지의 단계를 한눈에 정리한 인포그래픽입니다.

    저전력 미니 서버는 홈랩 입문자에게도, 기존 서버 전기세에 지친 분들에게도 정말 매력적인 선택지입니다. N100/N305 기반 미니PC는 낮은 전력 소비, 조용한 운영, 합리적인 가격이라는 세 가지 장점을 동시에 갖추고 있거든요.

    오늘 다룬 내용을 정리하면:

    • ✅ N100(4코어, 6W)은 입문용, N305(8코어, 15W)는 더 무거운 워크로드에 적합
    • ✅ Proxmox VE로 가상화 기반을 구축하면 확장성이 뛰어남
    • ✅ Docker + Traefik 조합으로 다양한 셀프호스팅 서비스를 깔끔하게 관리
    • ✅ 절전 모드, 시간 동기화, 디스크 정리는 초기에 꼭 챙겨야 할 포인트
    • ✅ Intel Quick Sync 활용으로 미디어 트랜스코딩 효율 극대화 가능

    다음 글에서는 이 환경 위에 K3s 경량 쿠버네티스 클러스터를 구축하는 방법을 다룰 예정입니다. 미니PC 여러 대를 묶어서 클러스터를 만드는 건데, 생각보다 훨씬 재미있는 경험이거든요. 기대해주세요!

    궁금한 점이나 다른 삽질 경험이 있으시면 댓글로 남겨주세요. 같이 해결해봐요 🎉

  • [k8s] 쿠버네티스 Ingress Controller 비교: Nginx, Traefik, HAProxy 선택 가이드

    [k8s] 쿠버네티스 Ingress Controller 비교: Nginx, Traefik, HAProxy 선택 가이드

    쿠버네티스 Ingress Controller, 뭘 써야 할까요?

    쿠버네티스를 처음 공부할 때 저도 Ingress Controller 선택 앞에서 한참 멈췄던 기억이 나요. Nginx는 익숙하고, Traefik은 이름이 예쁘고, HAProxy는 오래됐으니 안정적일 것 같고… 근데 막상 뭘 골라야 할지 기준이 없으니까 그냥 남들 쓰는 거 따라갔었거든요.

    13년 동안 인프라 엔지니어로 일하면서 홈랩부터 실제 프로덕션 환경까지 세 가지 컨트롤러를 다 써봤습니다. 오늘은 그 경험을 바탕으로 Nginx Ingress, Traefik Ingress, HAProxy Ingress를 솔직하게 비교해 드릴게요. 어떤 상황에서 어떤 걸 골라야 하는지, 실제 겪었던 삽질 포인트까지 전부 공유해 드리겠습니다.

    팀에서 쿠버네티스 Ingress Controller를 선택해야 하는데 레퍼런스가 너무 많고 각자 장점만 얘기해서 오히려 더 헷갈리는 상황, 있으시죠? 이 글이 그 혼란을 정리해 드릴 거예요.

    쿠버네티스 Ingress Controller 전체 아키텍처 - Nginx, Traefik, HAProxy 트래픽 흐름 비교

    쿠버네티스 클러스터에서 외부 트래픽이 Ingress Controller를 통해 각 서비스로 라우팅되는 전체 흐름. Nginx, Traefik, HAProxy 세 가지 컨트롤러의 위치를 비교하여 보여줍니다.

    Ingress Controller가 뭔지 먼저 짚고 가요

    쉽게 말해서, Ingress(인그레스)는 클러스터 외부에서 내부 서비스로 들어오는 트래픽을 관리하는 쿠버네티스 오브젝트예요. 근데 Ingress 오브젝트 자체는 그냥 규칙 명세서일 뿐이고, 이걸 실제로 실행하는 게 바로 Ingress Controller(인그레스 컨트롤러)입니다.

    비유하자면 Ingress는 “3번 테이블 손님은 A 주방으로, 4번 테이블은 B 주방으로” 같은 안내판이고, Ingress Controller는 그 안내판을 읽고 실제로 손님을 안내하는 직원인 거죠. 이 직원 역할을 Nginx가 할 수도 있고, Traefik이나 HAProxy가 할 수도 있는 겁니다.

    • Ingress Resource: 라우팅 규칙을 정의하는 쿠버네티스 오브젝트
    • Ingress Controller: Ingress 규칙을 실제로 처리하는 프록시/로드밸런서 파드
    • 쿠버네티스는 기본으로 Ingress Controller를 제공하지 않아서 직접 설치해야 해요

    세 가지 Ingress Controller 핵심 특징 비교

    본격 비교 전에 각 컨트롤러의 DNA를 먼저 이해하면 선택이 훨씬 쉬워져요.

    Nginx Ingress Controller

    가장 널리 쓰이는 컨트롤러입니다. 사실 Nginx Ingress Controller에는 두 가지 버전이 있어요. 쿠버네티스 커뮤니티가 관리하는 ingress-nginx와 Nginx 사가 직접 관리하는 nginx-ingress. 보통 오픈소스 쪽에서 말하는 건 ingress-nginx 쪽이에요. 처음에 저도 이게 헷갈려서 잘못된 걸 설치했던 기억이 있습니다.

    • 레퍼런스가 가장 많고 커뮤니티가 활발해요
    • Nginx.conf 기반이라 기존 Nginx 경험자에게 친숙함
    • Annotation(어노테이션) 기반 세밀한 설정 가능
    • 설정 변경 시 nginx reload가 필요한 구조 (무중단 배포 시 주의)

    Traefik Ingress Controller

    클라우드 네이티브 시대에 맞게 설계된 현대적인 리버스 프록시예요. 처음 Traefik을 접했을 때 “이게 진짜 쿠버네티스랑 찰떡이구나” 싶었거든요. 서비스 디스커버리(Service Discovery)를 자동으로 처리해서 설정 파일을 거의 안 만져도 되는 게 매력이에요.

    • 자동 서비스 디스커버리로 설정 최소화
    • 내장 대시보드(Dashboard)로 트래픽 시각화 가능
    • Let’s Encrypt TLS 인증서 자동 발급/갱신 지원
    • 미들웨어(Middleware) 체인으로 요청 처리 파이프라인 구성
    • CRD(Custom Resource Definition) 기반 설정으로 쿠버네티스 네이티브한 느낌

    HAProxy Ingress Controller

    HAProxy는 원래 고성능 로드밸런서로 유명하죠. 금융권이나 대용량 트래픽 환경에서 오랫동안 검증된 친구입니다. 쿠버네티스 Ingress Controller로서의 HAProxy는 이 안정성과 성능을 그대로 가져왔어요.

    • 로드밸런싱 알고리즘 선택지가 풍부함
    • TCP/UDP 레이어 처리에 강점
    • 설정 변경 시 무중단 리로드(hitless reload) 지원
    • Nginx, Traefik 대비 국내 레퍼런스가 적은 편

    Ingress Controller 핵심 비교표

    항목 Nginx Ingress Traefik Ingress HAProxy Ingress
    설정 방식 Annotation + ConfigMap CRD + Annotation ConfigMap + Annotation
    자동 서비스 디스커버리 제한적 ✅ 강력 지원 제한적
    TLS 자동화 cert-manager 연동 필요 ✅ 내장 지원 cert-manager 연동 필요
    내장 모니터링 UI ❌ 없음 ✅ 대시보드 내장 HAProxy Stats 페이지
    무중단 설정 리로드 부분 지원 ✅ 지원 ✅ 지원
    학습 난이도 낮음 (친숙함) 중간 중간~높음
    커뮤니티/레퍼런스 매우 풍부 풍부 보통
    적합한 환경 범용, 소~대규모 클라우드 네이티브, 동적 환경 고성능, 금융/엔터프라이즈

    실전 설치 및 기본 설정 방법

    자, 이제 실제로 설치해 봅시다. 각 컨트롤러별로 가장 빠른 설치 방법을 보여드릴게요. 제가 홈랩에서 테스트할 때 쓰는 방식이에요.

    Helm을 이용한 Nginx, Traefik, HAProxy Ingress Controller 설치 및 배포 구성

    Helm을 이용한 Nginx, Traefik, HAProxy Ingress Controller 설치 과정과 각 컨트롤러의 파드 구성을 보여주는 다이어그램.

    1. Nginx Ingress Controller 설치

    Helm을 이용하는 게 제일 편합니다. ingress-nginx 공식 차트를 사용해요.

    # Helm 레포지토리 추가
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    
    # 설치
    helm install ingress-nginx ingress-nginx/ingress-nginx \
      --namespace ingress-nginx \
      --create-namespace

    설치 후 기본 Ingress 리소스 예시입니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-app-ingress
      annotations:
        kubernetes.io/ingress.class: "nginx"
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - host: myapp.example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-app-service
                port:
                  number: 80

    2. Traefik Ingress Controller 설치

    Traefik도 Helm으로 설치하는 게 가장 깔끔해요. 대시보드 활성화 옵션도 같이 넣어줄게요.

    # Helm 레포지토리 추가
    helm repo add traefik https://helm.traefik.io/traefik
    helm repo update
    
    # values 파일 생성 (대시보드 활성화)
    cat < traefik-values.yaml
    dashboard:
      enabled: true
    api:
      dashboard: true
    EOF
    
    # 설치
    helm install traefik traefik/traefik \
      --namespace traefik \
      --create-namespace \
      -f traefik-values.yaml

    Traefik에서는 IngressRoute라는 CRD를 사용하는 방식이 더 권장돼요.

    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: my-app-route
      namespace: default
    spec:
      entryPoints:
        - web
      routes:
        - match: Host(`myapp.example.com`)
          kind: Rule
          services:
            - name: my-app-service
              port: 80

    3. HAProxy Ingress Controller 설치

    # Helm 레포지토리 추가
    helm repo add haproxytech https://haproxytech.github.io/helm-charts
    helm repo update
    
    # 설치
    helm install haproxy-ingress haproxytech/kubernetes-ingress \
      --namespace haproxy-controller \
      --create-namespace
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-app-ingress
      annotations:
        kubernetes.io/ingress.class: "haproxy"
    spec:
      rules:
      - host: myapp.example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-app-service
                port:
                  number: 80

    ⚠️ 실제로 겪었던 주의사항과 트러블슈팅

    이론은 여기까지 하고, 제가 실제로 삽질했던 포인트들 정리해 드릴게요. 이게 진짜 중요한 부분이에요.

    Nginx Ingress에서 자주 만나는 문제들

    ⚠️ 문제 1: Annotation 오타로 설정이 안 먹히는 경우

    Nginx Ingress는 Annotation에 오타가 있어도 에러를 안 뿜고 그냥 무시해버려요. 처음에 이걸 몰라서 한참 헤맸습니다. 설정이 안 먹힌다 싶으면 아래 명령어로 컨트롤러 로그를 꼭 확인하세요.

    kubectl logs -n ingress-nginx \
      $(kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].metadata.name}')

    ⚠️ 문제 2: 413 Request Entity Too Large 에러

    파일 업로드 기능이 있는 서비스를 Nginx Ingress 뒤에 놓으면 자주 만나는 에러예요. Annotation으로 해결 가능합니다.

    annotations:
      nginx.ingress.kubernetes.io/proxy-body-size: "50m"

    Traefik에서 자주 만나는 문제들

    ⚠️ 문제 1: IngressRoute와 기본 Ingress 혼용 시 충돌

    Traefik은 기본 쿠버네티스 Ingress 오브젝트도 처리하고 자체 IngressRoute CRD도 처리해요. 근데 팀 내에서 두 가지 방식을 섞어 쓰면 나중에 관리가 진짜 복잡해집니다. 처음부터 방식을 통일하는 걸 강력 추천해요.

    ⚠️ 문제 2: 대시보드 외부 노출 시 인증 필수

    Traefik 대시보드를 아무 인증 없이 외부에 노출하면 큰일 납니다. BasicAuth 미들웨어라도 꼭 붙여주세요.

    apiVersion: traefik.containo.us/v1alpha1
    kind: Middleware
    metadata:
      name: dashboard-auth
      namespace: traefik
    spec:
      basicAuth:
        secret: traefik-dashboard-auth-secret

    HAProxy Ingress에서 자주 만나는 문제들

    ⚠️ 문제 1: ConfigMap 설정 반영 지연

    HAProxy Ingress는 ConfigMap을 통한 글로벌 설정 변경이 즉시 반영되지 않는 경우가 있어요. 설정 변경 후 컨트롤러 파드를 재시작해줘야 하는 상황이 생길 수 있습니다.

    kubectl rollout restart deployment haproxy-ingress -n haproxy-controller

    어떤 상황에서 뭘 골라야 할까요?

    제가 내린 결론을 솔직하게 말씀드릴게요. 완벽한 정답은 없지만, 상황별 추천은 꽤 명확해요.

    Nginx Traefik HAProxy Ingress Controller 성능 및 기능 비교 대시보드

    Nginx, Traefik, HAProxy Ingress Controller의 주요 지표(성능, 설정 편의성, 생태계, 모니터링)를 레이더 차트로 비교한 시각화.

    ✅ Nginx Ingress를 선택하세요, 만약…

    • 팀원들이 Nginx에 익숙한 경우
    • 레퍼런스와 커뮤니티 지원이 중요한 경우
    • 처음 쿠버네티스를 도입하는 팀
    • 범용적인 웹 트래픽 처리가 주 목적인 경우

    ✅ Traefik Ingress를 선택하세요, 만약…

    • 마이크로서비스가 자주 추가/삭제되는 동적인 환경
    • TLS 인증서 관리를 자동화하고 싶은 경우
    • 별도 모니터링 설정 없이 트래픽을 시각화하고 싶은 경우
    • 클라우드 네이티브 환경에서 GitOps 방식으로 운영하는 경우

    ✅ HAProxy Ingress를 선택하세요, 만약…

    • 기존에 HAProxy를 잘 알고 있는 팀
    • L4(TCP/UDP) 레벨의 세밀한 로드밸런싱이 필요한 경우
    • 금융, 통신 등 고성능/고가용성이 핵심인 환경
    • 엄격한 엔터프라이즈 지원이 필요한 경우

    자주 묻는 질문 (FAQ)

    Q. 클러스터에 Ingress Controller를 여러 개 동시에 설치할 수 있나요?

    네, 가능합니다. IngressClass 리소스를 이용해서 각 Ingress 오브젝트가 어떤 컨트롤러를 사용할지 지정할 수 있어요. 다만 운영 복잡도가 올라가니까 특별한 이유가 없다면 하나만 쓰는 걸 추천합니다.

    Q. 쿠버네티스 Ingress Controller와 서비스 메시는 다른 건가요?

    다릅니다. Ingress Controller는 클러스터 외부에서 내부로 들어오는 북-남(North-South) 트래픽을 처리하고, Istio 같은 서비스 메시는 클러스터 내부 서비스 간의 동-서(East-West) 트래픽을 관리해요. 보통 두 가지를 같이 쓰기도 합니다.

    Q. Traefik v2와 v3는 많이 다른가요?

    Traefik v3에서 일부 API와 설정 방식이 변경됐어요. 특히 일부 CRD API 버전이 바뀌었으니 마이그레이션 시 공식 문서를 꼭 확인하세요. 신규 설치라면 최신 버전을 쓰는 게 좋습니다.

    마무리 — 결국 팀의 상황이 답이에요

    쿠버네티스 Ingress Controller 선택 가이드 - Nginx Traefik HAProxy 상황별 추천 요약

    Nginx, Traefik, HAProxy Ingress Controller의 특징과 적합한 사용 환경을 한눈에 정리한 요약 인포그래픽.

    오늘 세 가지 쿠버네티스 Ingress Controller를 비교해 봤는데요. 제 개인적인 결론을 한 줄로 정리하면 이래요.

    “처음이라면 Nginx, 클라우드 네이티브 환경이라면 Traefik, 고성능/엔터프라이즈라면 HAProxy.”

    저는 홈랩에서는 Traefik을 주로 써요. 대시보드가 있어서 트래픽 흐름 보기 편하고, TLS 자동화가 정말 편리하거든요. 근데 실무에서 처음 쿠버네티스를 도입하는 팀이라면 역시 Nginx가 제일 무난합니다. 레퍼런스가 많아서 문제 생겼을 때 해결하기 수월하니까요.

    💡 팁 하나 더! 어떤 Ingress Controller를 선택하든 cert-manager와 함께 쓰면 TLS 인증서 관리가 훨씬 수월해집니다. cert-manager 설정 방법은 다음 글에서 자세히 다룰 예정이에요.

    궁금한 점이나 다른 삽질 경험이 있으시면 댓글로 공유해 주세요. 같이 고민해 봅시다! 🎉

  • [3D 프린팅] OctoPrint 완벽 가이드: 라즈베리 파이로 원격 제어하기

    [3D 프린팅] OctoPrint 완벽 가이드: 라즈베리 파이로 원격 제어하기

    [3D 프린팅] OctoPrint 완벽 가이드: 라즈베리 파이로 3D 프린터 원격 제어하기

    안녕하세요, 13년차 인프라 엔지니어입니다. 오늘은 제 홈랩에서 정말 유용하게 쓰고 있는 OctoPrint에 대한 이야기를 해볼까 합니다. 혹시 3D 프린터 출력 시작 버튼 누르고 나서, 혹시나 실패할까 봐 전전긍긍하며 프린터 앞에서 밤새 대기하고 계신가요? 아니면 출력 상태 확인하려고 작업실까지 왔다 갔다 하는 게 귀찮으신가요? 제가 딱 그랬거든요. 😅

    저도 처음엔 3D 프린터 출력을 시작하면 중간에 문제가 생길까 봐 걱정이 많았어요. 출력물 베드가 들뜨거나, 필라멘트가 엉키거나, 심지어는 프린터가 오작동해서 불이 날까 봐 불안했죠. 이런 불안감을 해결해 준 게 바로 라즈베리 파이와 OctoPrint였습니다. 이제는 사무실에 앉아서도, 심지어는 외부에 있을 때도 제 3D 프린터의 상태를 실시간으로 모니터링하고 제어할 수 있게 됐습니다. 정말 편하더라고요! 오늘은 이 OctoPrint를 라즈베리 파이에 설치하고 활용하는 완벽 가이드를 공유해 드릴게요. 저의 삽질 경험을 녹여냈으니, 여러분은 좀 더 쉽게 성공하실 수 있을 겁니다. 🎉

    OctoPrint가 라즈베리 파이와 3D 프린터를 연결하여 원격 제어 및 모니터링하는 전체 아키텍처 다이어그램

    OctoPrint와 라즈베리 파이, 그리고 3D 프린터의 연결 구조를 보여주는 다이어그램입니다. 마치 뇌가 신체 각 부분을 통제하는 모습과 비슷하죠?

    OctoPrint가 뭐야? 왜 써야 할까요?

    먼저 OctoPrint가 정확히 무엇인지, 그리고 왜 이걸 써야 하는지부터 알아봐야겠죠?

    OctoPrint 개념 쉽게 설명

    쉽게 말해 OctoPrint는 3D 프린터를 위한 웹 인터페이스 기반의 원격 제어 및 모니터링 시스템입니다. 오픈소스 프로젝트로, 주로 라즈베리 파이 같은 싱글 보드 컴퓨터에 설치해서 사용하죠. 3D 프린터에 USB로 연결하면, 마치 프린터의 두뇌처럼 작동하면서 웹 브라우저나 스마트폰 앱으로 모든 제어를 가능하게 해줍니다.

    OctoPi는 이런 OctoPrint를 라즈베리 파이에 쉽게 설치할 수 있도록 미리 세팅해 놓은 운영체제 이미지입니다. 라즈베리 파이 OS 위에 OctoPrint와 웹캠 스트리밍을 위한 mjpg-streamer 등이 포함되어 있어서, SD 카드에 굽기만 하면 바로 사용할 수 있어요. 저처럼 이것저것 설정하는 데 익숙한 사람에게도 편하지만, 초보자에게는 더할 나위 없이 좋은 솔루션입니다.

    OctoPrint의 주요 장점

    • 원격 제어: 웹 브라우저나 앱으로 언제 어디서든 프린터의 움직임, 온도, 팬 속도 등을 제어할 수 있습니다. G-code(3D 프린터 명령 언어)를 직접 보내는 것도 가능하죠.
    • 실시간 모니터링: 웹캠을 연결하면 실시간으로 출력 과정을 영상으로 볼 수 있습니다. 제가 가장 애용하는 기능 중 하나예요.
    • 타임랩스: 출력 과정 전체를 멋진 타임랩스 영상으로 자동 제작해 줍니다. 결과물을 보면서 뿌듯함을 느낄 수 있죠.
    • 플러그인 확장성: 수많은 플러그인이 있어서 기능을 무한히 확장할 수 있습니다. 예를 들어, AI 기반의 실패 감지 플러그인이나 Telegram 알림 플러그인 등이 있습니다.
    • 파일 관리: G-code 파일을 웹 인터페이스에서 직접 업로드하고 관리할 수 있습니다. SD 카드에 넣었다 뺐다 할 필요가 없어져요.

    실전 구현: 라즈베리 파이에 OctoPi 설치하기

    자, 이제 직접 OctoPrint를 설치해볼 차례입니다. 단계별로 차근차근 따라오시면 어렵지 않게 성공하실 수 있을 거예요. 저도 처음엔 좀 헤맸지만, 결국 해냈거든요! 💡

    준비물

    시작하기 전에 필요한 것들을 먼저 챙겨봅시다.

    • 라즈베리 파이: Raspberry Pi 3B+ 또는 Raspberry Pi 4 (2GB 이상 권장). 저는 Pi 4 4GB 모델을 쓰고 있습니다. 구형 모델은 웹캠 스트리밍 시 버벅일 수 있어요.
    • MicroSD 카드: 16GB 이상 (클래스 10 이상 권장).
    • 라즈베리 파이 전원 어댑터: 5V 3A 이상. 전원 부족은 라즈베리 파이의 가장 흔한 문제입니다. ⚠️ 정품 어댑터를 쓰시는 게 정신 건강에 좋습니다. 제가 싸구려 어댑터 썼다가 엄청 삽질했거든요.
    • USB 케이블 (Type A to B): 3D 프린터와 라즈베리 파이를 연결할 케이블.
    • USB 웹캠 (선택 사항): 모니터링을 위한 웹캠. 라즈베리 파이와 호환되는 모델인지 확인하는 게 좋아요.
    • 컴퓨터: OctoPi 이미지를 MicroSD 카드에 구울 때 사용합니다.

    단계 1: OctoPi 이미지 다운로드 및 설치

    1. OctoPi 이미지 다운로드: OctoPrint 공식 홈페이지에서 최신 OctoPi 이미지를 다운로드합니다.

    2. Raspberry Pi Imager 설치: 컴퓨터에 Raspberry Pi Imager를 설치합니다. 이 툴을 사용하면 아주 쉽게 OS 이미지를 SD 카드에 구울 수 있습니다.

    3. 이미지 굽기:

      • Imager를 실행하고 CHOOSE OS를 클릭합니다.
      • Custom을 선택한 후, 다운로드한 OctoPi 이미지를 선택합니다.
      • CHOOSE STORAGE를 클릭하여 MicroSD 카드를 선택합니다.
      • WRITE를 클릭하여 이미지를 굽습니다. 이 과정은 몇 분 정도 소요될 수 있습니다.
    4. Wi-Fi 및 SSH 설정 (강력 권장): 이미지가 성공적으로 구워지면, SD 카드가 컴퓨터에 다시 마운트됩니다. 이 SD 카드 내부에 boot 파티션이 보일 거예요. 여기에 octopi-wpa-supplicant.txt 파일을 열어서 Wi-Fi 설정을 해줍니다. 주석을 제거하고 아래와 같이 수정하세요.

      # WPA/WPA2 secured
      network={
        ssid="YOUR_WIFI_SSID"
        psk="YOUR_WIFI_PASSWORD"
      }
      

      그리고 SSH를 활성화하려면 boot 파티션에 확장자 없는 ssh라는 이름의 빈 파일을 생성합니다. 윈도우에서는 메모장으로 ssh.txt를 만든 후 확장자를 제거하면 됩니다. ⚠️ SSID나 PSK 오타 조심하세요! 제가 여기서 오타 때문에 연결이 안 돼서 한참을 헤맸습니다. ㅎㅎ

    단계 2: OctoPrint 초기 설정

    1. 라즈베리 파이 부팅: 설정이 완료된 MicroSD 카드를 라즈베리 파이에 삽입하고 전원을 연결합니다. 처음 부팅하는 데 시간이 좀 걸릴 수 있어요.

    2. OctoPrint 접속: 라즈베리 파이가 네트워크에 연결되면, 웹 브라우저를 열고 http://octopi.local 또는 라즈베리 파이의 IP 주소(예: http://192.168.1.xxx)로 접속합니다. IP 주소는 공유기 관리 페이지에서 확인하거나, nmap 같은 툴로 스캔해서 찾을 수 있습니다.

    3. 초기 설정 마법사 진행: 웹 인터페이스에 접속하면 OctoPrint 초기 설정 마법사가 시작됩니다. 사용자 이름, 비밀번호를 설정하고, 3D 프린터 프로필을 생성합니다. 프린터의 베드 사이즈, 노즐 크기 등을 입력하면 돼요. 이 과정에서 액세스 제어를 설정하여 보안을 강화하는 게 중요합니다. 외부에서 접속할 계획이라면 꼭 비밀번호를 강력하게 설정하세요!

    4. 3D 프린터 연결: 라즈베리 파이와 3D 프린터를 USB 케이블로 연결한 다음, OctoPrint 웹 인터페이스에서 Connect 버튼을 클릭합니다. 올바른 Serial Port와 Baudrate를 선택해야 합니다. 보통 자동으로 감지되지만, 안 되면 수동으로 설정해야 해요. 제 프린터는 115200 Baudrate를 썼습니다.

    OctoPrint 웹 인터페이스의 대시보드 화면, 3D 프린터 원격 제어 및 모니터링

    OctoPrint에 성공적으로 접속했을 때 볼 수 있는 대시보드 화면입니다. 제 3D 프린터가 연결되어 있고, 웹캠 스트리밍도 잘 나오고 있네요.

    단계 3: 웹캠 연결 및 설정 (선택 사항)

    실시간 모니터링의 핵심인 웹캠을 연결해봅시다.

    1. USB 웹캠 연결: 라즈베리 파이에 USB 웹캠을 연결합니다.

    2. 웹캠 스트리밍 확인: OctoPrint 웹 인터페이스의 Control 탭으로 이동하면, 웹캠 스트리밍 화면이 보일 겁니다. 만약 보이지 않으면, Settings > Webcam & Timelapse 섹션에서 Stream URL이 올바르게 설정되어 있는지 확인합니다. 보통 /webcam/?action=stream으로 되어 있을 거예요. 웹캠 호환성 문제가 있을 수 있으니, 미리 라즈베리 파이에서 잘 동작하는지 확인해두는 게 좋습니다.

    주의사항 및 삽질 해결 경험

    제가 OctoPrint를 설치하고 사용하면서 겪었던 몇 가지 문제점과 그 해결 방법을 공유해 드립니다. 여러분은 저처럼 삽질하지 마세요! 😅

    • ⚠️ 라즈베리 파이 전원 부족: 가장 흔한 문제입니다. 웹캠이나 다른 USB 장치를 연결했을 때, 라즈베리 파이의 전압이 부족하면 오작동하거나 부팅이 안 될 수 있습니다. 저는 정품 5V 3A 어댑터로 교체하고 나서 해결됐습니다. 터미널에서 dmesg | grep voltage 명령으로 전압 경고를 확인할 수 있어요.

    • ⚠️ USB 케이블 불량: 3D 프린터와 라즈베리 파이를 연결하는 USB 케이블이 불량인 경우가 의외로 많습니다. 다른 케이블로 바꿔보니 바로 연결되는 경험을 몇 번 했어요. 데이터 전송이 가능한 케이블인지 확인하세요.

    • ⚠️ Wi-Fi 연결 문제: SSID나 비밀번호에 오타가 있으면 라즈베리 파이가 Wi-Fi에 연결되지 않습니다. 특히 특수문자가 포함된 비밀번호는 더 주의해야 해요. ssh로 접속해서 sudo cat /var/log/syslog | grep wpa 명령으로 로그를 확인해보면 원인을 찾을 수 있습니다.

    • ⚠️ 웹캠 인식 문제: 일부 웹캠은 라즈베리 파이에서 제대로 인식되지 않거나, mjpg-streamer와 호환되지 않을 수 있습니다. lsusb 명령으로 웹캠이 인식되는지 확인하고, 구글에 [웹캠 모델명] Raspberry Pi OctoPrint로 검색해서 호환성 정보를 찾아보세요. 저는 로지텍 C920 모델을 사용하는데, 아무 문제 없이 잘 작동하더라고요.

    • ⚠️ 프린터 연결 오류: OctoPrint에서 프린터 연결이 안 될 때, Serial Port가 여러 개 뜨거나 Baudrate가 맞지 않는 경우가 있습니다. /dev/ttyUSB0이나 /dev/ttyACM0 같은 포트를 시도해보고, 프린터 제조사에서 권장하는 Baudrate를 찾아보세요. 보통 115200 또는 250000을 많이 써요.

    결과 확인: 따뜻한 커피와 함께하는 원격 출력!

    모든 설정이 완료되고, 드디어 OctoPrint를 통해 3D 프린터를 원격으로 제어할 수 있게 되었습니다! 🎉 이제 여러분은 웹 인터페이스에서 G-code 파일을 업로드하고, 출력을 시작하며, 웹캠으로 진행 상황을 지켜볼 수 있어요. 심지어 문제가 생기면 출력을 일시 중지하거나 취소할 수도 있죠. 이 편리함은 정말이지 겪어봐야 압니다.

    저는 이제 아침에 출근해서 사무실에 앉아 어제 자기 전에 슬라이싱해둔 G-code 파일을 OctoPrint에 업로드하고 출력을 시작합니다. 그리고 중간중간 웹캠으로 출력 상태를 확인하면서 다른 업무를 보거나, 따뜻한 커피 한 잔의 여유를 즐기죠. 예전 같으면 프린터 옆에 붙어 앉아 노심초사했을 텐데, 정말 삶의 질이 달라졌어요. 홈랩의 진정한 의미를 여기서 찾았다고 생각합니다.

    OctoPrint의 플러그인 목록 화면, 3D 프린터 기능 확장

    OctoPrint의 강력한 기능 중 하나인 플러그인 확장 기능입니다. 다양한 플러그인을 통해 기능을 무한히 확장할 수 있어요.

    마무리: 이제 당신의 3D 프린터는 스마트해졌습니다!

    오늘은 OctoPrint와 라즈베리 파이를 활용해 3D 프린터를 원격 제어하고 모니터링하는 방법에 대해 자세히 알아봤습니다. 제가 직접 경험한 삽질과 해결 과정을 공유하면서, 여러분이 좀 더 쉽고 빠르게 이 편리함을 누리시길 바라는 마음으로 글을 써봤어요.

    OctoPrint는 단순히 원격 제어를 넘어, 3D 프린팅 경험 자체를 한 단계 업그레이드 시켜주는 강력한 도구입니다. 이제 여러분의 3D 프린터도 스마트해졌으니, 더 멋진 출력물을 만드는데 집중할 수 있을 거예요. 다음 단계로는 다양한 플러그인을 활용해보시길 추천합니다. 특히 AI 기반 실패 감지 플러그인은 정말 신세계입니다. 🤩

    혹시 설치 중에 궁금한 점이나 문제가 발생하면 언제든지 댓글로 남겨주세요. 저의 13년차 인프라 경험이 여러분의 삽질을 줄여주는 데 도움이 될 수 있다면 기쁠 것 같습니다. 그럼 다음 기술 이야기에서 또 만나요! 🚀

    OctoPrint와 라즈베리 파이를 통한 3D 프린터 원격 제어 장점 인포그래픽

    OctoPrint와 라즈베리 파이의 주요 장점들을 한눈에 볼 수 있도록 요약한 인포그래픽입니다.