에이전틱 개발 파이프라인 – 02. GPU 없이 구형 Xeon으로 AI 개발 서버 구축 (Ubuntu 24)

2026.08.18

·

TL;DR — 3줄 요약

  • 구형 Xeon 워크스테이션(20코어·64GB)은 Claude Code 개발 환경으로 전혀 느리지 않다 — 코어와 메모리가 오히려 MSA 컨테이너 동시 구동의 강점이다.
  • GPU는 불필요하다. Claude Code는 클라우드 모델이라 로컬 GPU 없이 완전히 동작한다.
  • 파티션을 /app·/log·/data로 나누고 Docker data-root를 /data/docker로 두는 것이 이 환경 구성의 핵심이다.

GPU 없이 AI 개발 환경을 만든다 — 왜 구형 서버로 충분한가

“AI 개발에는 GPU 서버가 필요하다”는 말은 절반만 맞다. 로컬에서 LLM 모델을 직접 서빙(Ollama 등)할 때는 GPU가 필요하다. 하지만 우리는 그 방향을 택하지 않는다. Claude Code는 Anthropic 클라우드 모델과 통신하기 때문에 로컬 GPU가 전혀 필요 없다. 개발 환경에서 GPU의 역할은 없다.

그렇다면 구형 워크스테이션이 느리지 않을까? 결론부터 말하면 전혀 그렇지 않다. Claude Code 에이전틱 개발에서 병목은 CPU 클럭이 아니라 컨테이너 동시성과 메모리다. 20코어에 64GB 메모리가 확보된 환경은 오히려 유리하다 — MSA 구조에서 API 서버, DB, 검색 엔진, 인증 서비스 같은 컨테이너 여러 개를 실제 여러 대의 서버가 돌듯 안정적으로 동시 구동할 수 있다. 일반 개발용 노트북보다 오히려 여유가 있다.

Sponsored

실제 서버 스펙과 파이프라인 구조

주니크가 실제로 운영하는 개발 서버 스펙이다. 운영 서버와 물리적으로 완전히 분리되어 있다는 점에 주목하자.

항목개발 서버 (이 글의 대상)
CPUIntel Xeon E5-2690 v2 @3.0GHz, 20코어 (듀얼 소켓)
메모리DDR3 64GB
스토리지1TB SSD
OSUbuntu 24 Server
GPU없음
개발 환경Docker (컨테이너 기반 MSA 구동)

파이프라인 흐름은 단순하다. 개발(구형 서버·Docker) → 소스코드 커밋 → Gitea → Gitea Runner 빌드·배포 → 운영 서버(별도 Proxmox 노드)로 이어진다. 개발 서버에는 Proxmox를 올리지 않는다. Docker만으로 MSA 서비스들을 컨테이너로 구동하는 것이 전부다. Proxmox 운영 환경은 07편에서 별도로 다룬다.


파티션 설계 — 디스크를 나누는 것이 왜 첫 단계인가

Ubuntu를 설치하고 곧바로 Docker를 올리는 것은 빠르지만, 나중에 반드시 후회하게 된다. 이유는 하나다: 이미지와 볼륨이 /(루트)를 가득 채우면 서버가 통째로 멈춘다. 로그가 폭발해도 마찬가지다.

해결책은 파티션 분리다. 주니크는 파티션 설계 — /app·/log·/data 분리에서 이 원칙을 상세히 정리해뒀다. 소프트웨어 프로젝트에서 관심사와 리스크를 격리하는 것과 정확히 같은 사고다 — 한 영역의 장애가 다른 영역으로 번지지 않도록 경계를 긋는 프로젝트 관리 원칙.

실제로 적용하는 구조는 다음과 같다.

  • / — OS 전용. 고정 크기, 거의 늘지 않는다.
  • /app — 엔진·소스/빌드 산출물·설정 파일 (ext4). 읽기 집중, 쓰기 드물다.
  • /log — 로그 전용 (ext4). logrotate로 관리. 여기가 가득 찼을 때 서비스에 영향이 없다.
  • /data — DB·업로드·대용량 데이터 (XFS). I/O가 집중되는 모든 것. Docker data-root도 여기다.

각 경로를 별도 LVM 볼륨으로 분리하면 용량 조정도 유연하고, 장애 격리 범위가 명확해진다. Docker는 data-root를 /data/docker로 지정한다 — 이미지와 볼륨이 /를 위협하지 못하게 하는 것이 핵심이다.


단계별 세팅 — Ubuntu 24부터 Docker까지

① Ubuntu 24 기본 설정 — 사용자·SSH 키·방화벽

# 비root 사용자 생성 및 sudo 권한 부여
adduser devuser
usermod -aG sudo devuser

# SSH 공개키 등록
mkdir -p /home/devuser/.ssh
cat >> /home/devuser/.ssh/authorized_keys << 'KEY'
ssh-ed25519 AAAA...본인_공개키... user@host
KEY
chmod 700 /home/devuser/.ssh
chmod 600 /home/devuser/.ssh/authorized_keys
chown -R devuser:devuser /home/devuser/.ssh

# /etc/ssh/sshd_config에서 패스워드 인증 비활성화 (예시)
# PasswordAuthentication no
# PermitRootLogin no
systemctl restart ssh

# ufw 기본 방화벽
ufw allow OpenSSH
ufw enable

② LVM으로 /app·/log·/data 볼륨 분리 — 개념 예시

Ubuntu 설치 후 추가 디스크 또는 남은 파티션을 LVM으로 묶어 마운트한다. 아래는 개념 흐름 예시다. 디스크명·크기는 환경에 맞게 조정한다.

# 물리 볼륨 생성 (예시: /dev/sdb 사용)
pvcreate /dev/sdb

# 볼륨 그룹 생성
vgcreate vg_main /dev/sdb

# 논리 볼륨 생성 (크기는 환경에 맞게 조정)
lvcreate -L 50G  -n lv_app  vg_main
lvcreate -L 20G  -n lv_log  vg_main
lvcreate -L 800G -n lv_data vg_main

# 포맷
mkfs.ext4 /dev/vg_main/lv_app
mkfs.ext4 /dev/vg_main/lv_log
mkfs.xfs  /dev/vg_main/lv_data   # /data는 XFS (I/O 집중)

# 마운트 포인트 생성 후 /etc/fstab에 등록 (UUID 방식 권장)
mkdir -p /app /log /data
# /dev/vg_main/lv_app   /app   ext4  defaults  0 2
# /dev/vg_main/lv_log   /log   ext4  defaults  0 2
# /dev/vg_main/lv_data  /data  xfs   defaults  0 2
mount -a

③ Docker 설치 + data-root를 /data/docker로 지정

Docker 공식 apt 저장소로 설치하고, daemon.json으로 data-root를 반드시 /data/docker로 지정한다. 이 설정 없이 기본(/var/lib/docker)으로 두면 이미지·컨테이너·볼륨이 모두 /에 쌓인다.

# Docker 공식 저장소 추가 (Ubuntu 24 예시)
apt-get update
apt-get install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg 
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

echo 
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] 
  https://download.docker.com/linux/ubuntu 
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | 
  tee /etc/apt/sources.list.d/docker.list > /dev/null

apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io 
  docker-buildx-plugin docker-compose-plugin

# data-root 지정 + 로그 크기 제한
mkdir -p /data/docker
cat > /etc/docker/daemon.json << 'EOF'
{
  "data-root": "/data/docker",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "20m",
    "max-file": "3"
  }
}
EOF

systemctl restart docker

# 일반 사용자도 docker 명령 실행 가능하도록 그룹 추가
usermod -aG docker devuser

④ Node.js 설치 — Claude Code 실행 기반

Claude Code는 Node.js 위에서 동작하는 CLI다. nvm(Node Version Manager)으로 설치하면 버전 관리가 쉽다.

# nvm 설치 (예시 버전 — 최신은 공식 저장소 확인)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc

# Node.js LTS 설치 및 활성화
nvm install --lts
nvm use --lts

# Claude Code 설치
npm install -g @anthropic-ai/claude-code

# 설치 확인
claude --version

환경 세팅을 빠르게 — ai-os-init 특전

✦ 누스쿨(nuschool.cc) 수강생 특전 — ai-os-init

누스쿨(nuschool.cc)은 주니크가 운영하는 개발 교육 기관이다. ai-os-init은 위에서 설명한 리눅스 환경 전반(파티션 설정·Docker·Node.js·Claude Code 등 여러 툴과 OS 설정)을 반자동으로 세팅하는 도구다.

"반자동"이라는 말을 정확히 하자면, 원클릭 마법이 아니다. 개발하려는 환경에 맞춰 선택하고 설정하는 과정이 포함된다 — 실제로 선택지가 많고 중간에 설명이 필요한 부분도 있다. 그래도 명령어를 하나하나 찾아 실행하는 것보다는 훨씬 빠르게 완성된 환경을 만들 수 있다.

amd64 / arm64 지원. 사용 조건: nuschool.cc 회원가입 + 수강권(현재 3만원) 구매 → 인증 후 사용. 수강 없이 설치 파일만 원하면 문의를 남겨주면 된다.

curl -fsSL https://nuschool.cc/dl/install.sh | sudo sh

설치 후 인증 흐름이 진행되며, 인증이 완료된 이후에 실제 환경 세팅이 시작된다.

수강생이 아니더라도 이 글의 단계별 명령어로 동일하게 구성할 수 있다. 위 ①~④ 단계를 그대로 따라가면 된다.


흔한 함정 — 이것만 피하면 된다

  • 파티션을 나누지 않고 설치 — Docker 이미지가 쌓이면서 /가 100%에 도달하면 SSH 접속도 끊긴다. 처음부터 LVM으로 나눠야 한다. 나중에 이동하면 서비스 중단이 불가피하다.
  • data-root 방치/etc/docker/daemon.json"data-root"를 설정하지 않으면 이미지·볼륨 전부 /var/lib/docker에 쌓인다. 용량이 차고 나서야 알게 된다.
  • root로 docker 명령 실행usermod -aG docker를 생략하면 모든 docker 명령에 sudo가 필요하고, Claude Code가 내부에서 실행하는 컨테이너 관련 명령도 권한 오류가 발생한다.
  • SSH 키 없이 패스워드 인증만 사용 — 공개 IP가 열린 서버에는 수시간 내 브루트포스 시도가 시작된다. SSH 공개키 인증을 설정하고 패스워드 인증을 끄는 것이 최소 조치다.

주니크는 이렇게 쓴다

이 개발 서버에서 주니크는 WordPress 멀티사이트 인프라(nginx, MariaDB, 사이트별 php-fpm 컨테이너)를 Docker로 전부 구동한다. 각 사이트 컨테이너가 독립적으로 뜨는 구조라 코어와 메모리가 충분히 활용된다. 동시에 Gitea, Claude Code 에이전트, 빌드 스크립트가 돌아도 서버에 여유가 있다.

파티션 분리의 실제 효과는 로그가 갑자기 폭발했을 때 확인했다. /log가 별도 볼륨이라 가득 찼을 때 서비스 컨테이너는 전혀 영향을 받지 않았다. /data의 Docker 이미지가 늘어나도 OS와 설정 파일은 안전하다. 이런 격리가 없었다면 사소한 운영 이슈가 서버 전체를 멈추는 상황으로 이어졌을 것이다.

에이전틱 개발에서 개발 환경 안정성은 생산성과 직결된다. Claude Code가 멀티스텝 작업을 수행하는 도중 서버가 불안정하면 작업 맥락 전체가 날아간다. 처음 구성에 공을 들이는 이유다. 이것도 결국 프로젝트 관리의 관점 — 리스크를 앞에서 격리하면 뒤에서 생산성이 올라간다.


🎓 다음 편에서는 이 환경 위에 Gitea 셀프호스트 저장소를 올리고, Claude Code가 직접 이슈를 등록하고 추적하는 구조를 만든다.


FAQ

GPU가 꼭 필요한가?

Claude Code 기반 에이전틱 개발에는 필요 없다. Claude Code는 Anthropic 클라우드 모델과 통신하므로 로컬 GPU 없이 완전히 동작한다. Ollama 등 로컬 LLM을 직접 서빙하려면 GPU가 필요하지만, 이 시리즈에서는 그 방향을 택하지 않는다.

구형 서버라 느리지 않나?

아니다. Claude Code 워크플로에서 병목은 CPU 클럭이 아니다. 20코어·64GB는 MSA 컨테이너를 여러 개 동시에 안정적으로 구동하기에 충분하고, 오히려 일반 개발용 노트북보다 여유가 있다. "구형이라 느리다"는 프레이밍 자체가 잘못된 것이다.

최소 사양은 어느 정도인가?

단일 서비스 컨테이너 하나만 띄운다면 4코어·16GB도 가능하다. 하지만 MSA 서비스를 여러 개 동시에 구동하고 Claude Code 에이전트까지 돌리려면 8코어·32GB 이상을 권장한다. 메모리 부족이 가장 먼저 체감된다.

왜 파티션을 나누는가? 디스크 하나면 안 되나?

단일 파티션이면 Docker 이미지·로그·DB 중 어느 하나가 디스크를 다 쓰면 OS까지 통째로 멈춘다. 파티션을 나누면 각 영역의 장애가 다른 영역으로 번지지 않는다. 소프트웨어 설계에서 관심사를 분리하는 원칙과 같다. 자세한 근거는 파티션 설계 글에 정리했다.


에이전틱 개발 환경, 직접 구성하고 싶다면

서버 구성부터 Claude Code 연동, MSA 컨테이너 설계까지 — 개발 환경 세팅을 도와드립니다. 어떤 규모와 스택이든 먼저 이야기 나눠보세요.

→ 주니크에 문의하기


『에이전틱 개발 파이프라인』 시리즈
← 이전: 01. 에이전틱 코딩이란? AX를 개발 환경에
→ 다음: 03. Claude Code 실전 세팅 (CLAUDE.md)


MORE POSTS

다른 글 보기

테크 랩

에이전틱 개발 파이프라인 – 05. AI가 짠 코드, 어떻게 믿나: 검증 게이트 설계

AI 코드를 완전 위임하지 않고 다층 검증 게이트(셀프체크·CI·AI리뷰·사람 최종판정)로 신뢰를 확보하는 파이프라인 설계.
2026.08.21
테크 랩

에이전틱 개발 파이프라인 – 04. Claude Code로 MSA 설계·구현하기

AI에게 마이크로서비스 경계를 그리게 하는 프롬프트 패턴과, 설계 판단은 사람이 하는 오케스트레이션 방식.
2026.08.20
테크 랩

에이전틱 개발 파이프라인 – 03. Claude Code 실전 세팅: 설치부터 CLAUDE.md 컨텍스트 설계까지

Claude Code 설치·인증과, 반복 지시 없이 일관된 결과를 내는 CLAUDE.md 컨텍스트 설계·에이전틱 워크플로 습관.
2026.08.19

프로젝트 문의 환영합니다

기획부터 개발, 운영까지 함께 만들어 드립니다.

무료 3분 자가진단

우리 회사, 자체 클라우드가 답일까?

AWS vs 자체 인프라 · 11개 항목 3분 체크