Synology NAS Docker + ofelia 설치 가이드: AI 자동화 서버 운영

TL;DR

Synology NAS AI 자동화는 GPU 없이 월 1만 원 미만으로 24시간 AI 파이프라인을 운영하는 현실적인 방법이다. DS923+ 기준 Docker Compose + ofelia 스케줄러로 Python AI 앱을 돌리고, NVIDIA API(DeepSeek + GLM-5.1)를 외부 추론 엔진으로 연결하면 클라우드 서버 대비 80% 이상 비용을 절감할 수 있다.


왜 NAS인가: 홈서버 AI 파이프라인의 현실적 선택

AI 파이프라인을 24시간 돌리는 데 클라우드 VM을 쓰면 월 3~5만 원 이상이 나온다. 반면 이미 구비된 Synology NAS는 상시 가동 중이고, 전력 소비는 20~40W에 불과하다. 월 전기세로 환산하면 약 2,000원이다.

Synology DS923+는 AMD Ryzen R1600, 최대 32GB RAM, Docker 완전 지원이라는 스펙을 갖춰 Python 기반 AI 자동화 앱을 구동하기에 충분하다. GPU는 없지만, LLM 추론은 NVIDIA API(DeepSeek V4 Pro, GLM-5.1)에 위임하면 된다. NAS는 오케스트레이션과 스케줄링만 담당한다.

항목 Synology NAS AWS t3.small
월 인프라 비용 ~2,000원 ~25,000원
API 비용 (LLM) $3~5 $3~5
GPU 필요 여부 불필요 불필요
관리 복잡도 낮음 (DSM GUI) 중간
데이터 주권 로컬 보관 클라우드

설치 및 설정

1. Container Manager 설치

Synology DSM → 패키지 센터 → Container Manager 설치. DSM 7.2 이상에서 Docker Compose v2를 기본 지원한다.

2. 볼륨 경로 준비

# NAS SSH 접속 후
mkdir -p /volume1/docker/ai-pipeline/{data,logs,posts}

NAS의 공유 폴더 /volume1/docker/를 프로젝트 루트로 사용한다. 이 경로는 DSM 파일 스테이션에서도 접근 가능해 수동 파일 관리가 편하다. 모델에 따라 volume1 대신 volume2, volume3일 수 있으니 DSM에서 실제 공유 폴더 경로를 확인한다.

3. docker-compose.yml 구성

ofelia는 scheduler.ini 마운트 방식과 docker-compose label 방식 두 가지를 지원한다. 스케줄이 고정적이고 설정 파일을 분리해 관리하고 싶다면 ini 방식이, docker-compose 한 파일로 모든 것을 관리하고 싶다면 label 방식이 낫다.

scheduler.ini 마운트 방식 (권장):

services:
  pipeline:
    build: .
    container_name: ai-blog-pipeline
    restart: unless-stopped
    env_file: .env           # docker-compose.yml 과 같은 디렉터리의 .env
    volumes:
      - /volume1/docker/ai-pipeline/data:/app/data
      - /volume1/docker/ai-pipeline/logs:/app/logs
      - /volume1/docker/ai-pipeline/posts:/app/posts
    networks:
      - blog-net

  scheduler:
    image: mcuadros/ofelia:latest
    container_name: blog-scheduler
    restart: unless-stopped
    depends_on:
      - pipeline
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./scheduler.ini:/etc/ofelia/config.ini
    networks:
      - blog-net

networks:
  blog-net:

scheduler.ini:

[job-exec "daily-pipeline"]
schedule  = 0 21 * * *        ; UTC 21:00 = KST 06:00
container = ai-blog-pipeline
command   = python -m pipeline.main

ofelia의 schedule은 표준 5필드 cron 문법(분 시 일 월 요일)이 아닌 6필드(초 분 시 일 월 요일)도 지원한다. 위 예시는 5필드(0 21 * * * = 매일 21:00 UTC)로, ofelia가 자동 감지한다.

4. .env 파일 설정

# /volume1/docker/ai-pipeline/.env
NVIDIA_API_KEY=nvapi-xxxxxxxxxxxx
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxx   # NVIDIA 429 소진 시 폴백

WORDPRESS_URL=https://yourblog.com
WORDPRESS_USERNAME=admin
WORDPRESS_APP_PASSWORD=xxxx xxxx xxxx xxxx

SLACK_WEBHOOK_URL=https://hooks.slack.com/services/xxx/yyy/zzz

BASE_DIR=/app
DAILY_POST_COUNT=2
AUTO_PUBLISH=false

env_file: .env의 경로는 docker compose 실행 위치 기준 상대경로다. NAS에서 DSM의 Task Scheduler로 실행할 경우 절대경로를 명시하는 편이 안전하다.

5. 빌드 및 실행

cd /volume1/docker/ai-pipeline
docker compose build
docker compose up -d

실무 패턴: 스케줄 관리와 장애 대응

로그 확인

# NAS SSH에서 실시간 로그
docker logs ai-blog-pipeline --tail 50 -f

# 또는 마운트된 볼륨에서
tail -f /volume1/docker/ai-pipeline/logs/pipeline.log

DSM의 Container Manager GUI에서도 실시간 로그를 확인할 수 있어 터미널 없이도 상태 파악이 가능하다. 아침에 일어나면 Slack으로 전날 밤 자동 작성된 포스트 결과가 전송되어 있는 구조다.

장애 대응: NVIDIA API 429

DeepSeek/GLM-5.1 NVIDIA API 한도 소진 시 Claude API(Anthropic)로 자동 폴백되도록 pipeline/llm.py에 재시도 로직이 구현되어 있다. .envANTHROPIC_API_KEY를 설정해두면 NAS는 인터넷 연결만 유지되면 별도 조작 없이 복구된다.


주의사항

항목 내용
Docker 지원 모델 DS923+, DS720+, DS920+ 등 x86 모델 권장. 일부 ARM 모델(DS223 등)도 Container Manager 지원하나 패키지 호환성 제한
메모리 32GB 상한으로 로컬 LLM 실행 불가. 7B 이상 모델은 외부 API 필수
env_file 경로 docker compose 실행 디렉터리 기준 상대경로. DSM Task Scheduler 사용 시 절대경로 권장
DSM 업데이트 DSM 업데이트 시 Container Manager가 재시작될 수 있음 — restart: unless-stopped 필수
볼륨 백업 Synology Hyper Backup으로 /volume1/docker/ai-pipeline/data 정기 백업 권장
포트포워딩 외부 API 호출만 하는 경우 불필요. WordPress가 외부 서버라면 아웃바운드 443만 허용하면 됨

결론

Synology NAS AI 자동화는 월 1만 원 미만으로 24시간 AI 파이프라인 서버를 운영하는 현실적인 선택이다. Docker Compose + ofelia로 스케줄을 관리하고, NVIDIA API로 LLM 추론을 위임하면 NAS의 CPU 한계를 우회할 수 있다. 별도 클라우드 서버 없이 집 안에서 자동화 파이프라인을 돌릴 수 있다는 것이 이 스택의 핵심 가치다.

참고: Synology DS923+ 공식 스펙 / ofelia GitHub / NVIDIA Build API

댓글 남기기