단 한 번의 명령어로 새로운 Ubuntu 서버를 24/7 AI 개발 머신으로 변신시키기
요약
AI 코딩 에이전트를 24/7 안정적으로 활용하기 위해 Ubuntu 서버를 즉시 개발 환경으로 구축하는 자동화 스크립트를 소개합니다. GNU Stow와 bash를 활용하여 에디터, 런타임, AI 툴체인을 단 한 번의 명령어로 프로비저닝할 수 있습니다.
핵심 포인트
- 노트북의 불안정성을 극복하기 위한 서버 기반 AI 개발 환경 구축
- 단 한 번의 명령어로 zsh, Neovim, Docker 등 AI 툴체인 자동 설치
- GNU Stow와 멱등성 bash를 이용한 효율적인 dotfiles 관리
- 사용자 생성 및 프로필 선택 기능을 통한 맞춤형 서버 설정
AI 코딩 에이전트(AI coding agents)는 나의 개발 일과를 바꾸어 놓았습니다. Claude Code와의 세션은 더 이상 타이핑을 몰아서 하는 작업이 아닙니다. 에이전트가 조사하고, 구현하고, 테스트를 실행하며, 내가 확인하는 동안 반복 작업을 수행하는 장기적인 대화입니다. 그리고 이 과정에서 내 설정의 가장 취약한 연결 고리가 드러났습니다. 바로 노트북입니다. 노트북 덮개를 닫으면 세션이 끊깁니다. 카페의 불안정한 Wi-Fi를 만나면 세션이 끊깁니다. 에이전트가 밤새 마이그레이션 작업을 수행하기를 원하시나요? 노트북을 주방 카운터 위에 계속 열어두어야 합니다.
해결책은 오래되었고 지루합니다. 서버에서 작업을 수행하고, 세션을 tmux에 유지하며, 어디서든 접속하는 것입니다. 부족했던 점은 설정 비용이었습니다. 새로운 VPS는 빈 껍데기일 뿐이며, zsh, Neovim, Node, Rust, Docker, 그리고 AI 툴체인(AI toolchain) 전체를 수동으로 프로비저닝(provisioning)하는 것은 첫 프롬프트를 입력하기도 전에 반나절 동안 쓸데없는 일(yak-shaving)을 하는 것과 같습니다.
그래서 저는 이를 단 한 번의 명령어로 만들었습니다. 이 포스트는 ubuntu-server-dotfiles (v1.3.0)의 developer profile에 관한 것입니다. 무엇을 설치하는지, AI 레이어(AI layer)가 어떻게 설정되는지, 그리고 이를 통해 가능해지는 실제 24/7 작업 패턴에 대해 다룹니다. 기반이 되는 GNU Stow + 멱등성 bash(idempotent-bash) 메커니즘은 이전 포스트에서 다루었으며, 이번 포스트는 이것이 '무엇을 위한 것인지'에 대해 다룹니다.
단 한 번의 명령
sudo 권한이 있는 non-root 사용자로 어떤 새로운 Ubuntu 24.04 서버에서든 다음을 실행하십시오:
f=$(mktemp) && curl -fsSL https://raw.githubusercontent.com/VimukthiShohan/ubuntu-server-dotfiles/main/bootstrap.sh -o "$f" && bash "$f"
(curl | bash 대신 다운로드 후 실행 방식을 사용하여, 다운로드가 중간에 끊기더라도 불완전한 스크립트가 실행되는 것을 방지합니다.)
두 가지 질문에 답하고 나면 완료됩니다:
- 이 설정을 위한 새 사용자를 생성하시겠습니까? (Create a new user for this setup?) — 클라우드 이미지에 접속하면
ubuntu또는root의 친척 격인 계정으로 로그인하게 됩니다.y를 입력하고 사용자 이름을 지정하면, bootstrap이 사용자를 생성하고, sudo 권한을 부여하며, 귀하의authorized_keys를 복사합니다(심볼릭 링크를 거부하고 정확한 모드와 함께install을 사용하는 강화된 방식입니다). 그 후 전체 설치 과정을 해당 계정으로 넘깁니다. 귀하의 일상적인 메인 사용자(daily-driver user)는 클라우드 기본 계정과 상태를 절대 공유하지 않습니다. - 프로필 선택 (Select a profile) — 이것이 v1.3.0의 새로운 기능입니다:
Select a profile:
1) minimal — 서버 필수 요소만 포함
2) developer — 모든 것 (에디터 스택, 런타임, AI CLI)
...
2를 선택하고 커피를 만들러 가세요. 선택 사항은 ~/.config/dotf/profile에 저장되므로, 재실행 시 다시 묻지 않습니다.
"developer" 프로필이 실제로 설치하는 것
일반 텍스트 매니페스트(manifests)를 기반으로 의존성 순서에 따라 모든 것을 설치합니다:
| 계층 (Layer) | 설치 항목 |
|---|---|
| Shell | zsh (로그인 쉘) + powerlevel10k, tmux + TPM, fzf, zoxide, direnv |
| ... |
핵심은 AI 행(row)입니다. claude, opencode, codex는 다른 모든 항목과 동일한 매니페스트 규율에 따라 설치됩니다 — 공식 설치 프로그램을 사용하며, 보호되고, 멱등성(idempotent)을 보장합니다. rtk(에이전트 세션을 위한 토큰 최적화 CLI 프록시)는 cargo를 통해 함께 설치됩니다.
그다음 상단의 선택적 계층인 **AI 스킬 프레임워크 (AI skill frameworks)**가 이어집니다. 툴체인(toolchain) 설치가 완료되면, dotf skills가 선택기를 제공합니다:
AI skill frameworks (comma-separated numbers, empty for none):
1) SuperClaude Framework
2) Superpowers (obra)
...
각 프레임워크는 사용자 전역(user-globally)에 설치되며, 무인 설치(unattended-safe)가 가능합니다(이 부분은 실제 디버깅이 꽤 필요했습니다 — 특정 CLI가 대화형 스코프 프롬프트에서 멈추는 현상이 있었습니다). 재실행은 언제나 안전합니다. 설치 프로그램은 단순히 설치 여부를 확인하고 건너뛰는 대신 각 프레임워크의 공식 설치 명령을 다시 실행하므로, 업데이트가 자동으로 적용됩니다.
24/7 작업 패턴
Ubuntu 24.04를 실행하는 신규 EC2 인스턴스에서 현장 테스트를 거친 실제 세션 예시입니다.
프로비저닝(provision) 시점에 한 번:
# 위의 bootstrap 한 줄 명령어 실행, y 답변 → 사용자 이름 → 프로필 2 선택
# ...커피 타임...
ssh dev@your-server # 새 사용자로 접속
...
그 이후의 모든 작업 세션:
ssh dev@your-server
tmx # 리포지토리에 포함된 tmux 워크스페이스 부트스트래퍼 (bootstrapper)
claude # 당신이 구축 중인 작업에 대해 에이전트 (agent) 시작
tmx (scripts/tmx/main.sh의 저장된 별칭 (stowed alias))는 에디터 창, 에이전트 창, 셸로 구성된 저만의 이름이 지정된 tmux 개발 워크스페이스를 실행합니다. 모든 것을 바꿔놓는 부분은 다음과 같습니다:
Ctrl-Space d # 분리 (detach) — 에이전트는 작업을 계속 수행함
(Ctrl-Space는 이 리포지토리의 .tmux.conf에 포함된 접두사 (prefix)입니다. 기본 tmux는 Ctrl-b를 사용합니다.)
노트북을 닫으세요. 세션은 상관하지 않습니다. Claude Code는 여전히 테스트 스위트 (test suite)를 실행 중이며, opencode는 여전히 리팩터링 (refactor) 중간 단계에 있습니다. 어디에서든 다시 연결 (reattach) 하세요:
ssh dev@your-server -t tmux attach
집에 있는 동일한 노트북에서, 사무실의 다른 기기에서, 혹은 줄을 서서 기다리는 동안 휴대폰의 SSH 클라이언트에서 접속해도 됩니다. 세션은 스크롤백 (scrollback), 에이전트 컨텍스트 (agent context), 실행 중인 프로세스 등 당신이 남겨둔 상태 그대로 유지됩니다. 저녁에 긴 에이전트 작업을 시작해 두고, 아침 식사를 하며 결과를 확인하세요.
SSH 없는 휴대폰: 원격 제어 (Remote Control). 휴대폰에서 SSH를 사용하는 것도 가능하지만, 6인치 화면에서 터미널을 사용하는 것은 고집스러운 행위입니다. Claude Code는 더 나은 해답을 제시합니다. 원격 제어 (Remote Control)를 활성화하여 에이전트를 시작하세요:
claude --remote-control
세션은 휴대폰의 Claude 앱과 페어링되며, 그곳에서 제어할 수 있습니다. 에이전트가 수행한 내용을 읽고, 질문에 답하고, 다음 단계를 승인하고, 후속 프롬프트 (prompt)를 보내는 등, 눈을 가늘게 뜨고 봐야 하는 터미널 대신 네이티브 모바일 UI를 사용할 수 있습니다. tmux 워크스페이스 내부에서 이를 실행하면 두 세계를 모두 누릴 수 있습니다. 키보드 앞에 있을 때는 전체 터미널을, 그렇지 않을 때는 앱을 사용하는 것입니다. 이것이 에이전트 작업을 위해 '항상 켜져 있는 서버 (always-on server)'가 강력한 이유입니다. 당신이 점심을 먹으러 나간 사이 에이전트가 "이 호출 지점 (call sites)들도 리팩터링할까요?"라고 물으면, 오후의 흐름을 놓치는 대신 주머니 속에서 바로 답할 수 있습니다. 세션은 기본적으로 호스트 이름 (hostname)에 따라 이름이 지정되므로, 여러 대의 서버를 실행하더라도 앱에서 각각을 명확하게 구분하여 볼 수 있습니다.
그리고 머신을 최신 상태로 유지하는 데는 두 가지 명령어가 필요합니다:
dotf update # git pull --ff-only 실행 후, 변경 사항 반영 (converge)
dotf doctor # 읽기 전용 드리프트(drift) 체크 — 설정이 어긋난 경우 1을 반환하며 종료
서버 사양 결정 (Sizing the server)
주관적이고 간결하게 말씀드리자면: 개발자 프로필을 기준으로 2 vCPU와 4 GB RAM이 쾌적하게 사용할 수 있는 최소 사양입니다. 가장 무거운 작업은 cargo를 통해 yazi를 소스에서 컴파일하는 것(2 vCPU 기준 몇 분 소요)이며, 그 외의 모든 작업은 다운로드입니다. 스왑(swap)을 추가하면 2 GB로도 작동은 하지만, 첫 번째 cargo install을 실행할 때 후회하게 될 것입니다. 디스크는 Docker 이미지가 들어오기 시작하면 25 GB 이상이 필요합니다. AI CLI 자체는 가볍습니다. _에이전트(agents)_의 무거운 작업은 사용자의 로컬 머신이 아닌 제공자(provider) 측에서 이루어지기 때문입니다.
에이전트를 위해 과도하게 프로비저닝(overprovision)하지 마세요. 사용자의 빌드와 컨테이너를 위해 프로비저닝하세요.
이 리포지토리(repo)가 의도적으로 설정하지 않는 것들
SSH 개인 키, GitHub 인증 상태, API 토큰 등은 절대 설정하지 않습니다. 이 리포지토리는 공개되어 있지만, 머신의 정체성(identity)은 그렇지 않습니다. 또한 정적 가드 테스트(static guard test)를 통해 추적되는 파일에 금지된 패턴이 몰래 포함될 경우 빌드가 실패하도록 설계되었습니다. 인증은 머신당 정확히 한 번, 사용자에 의해 수행됩니다:
claude auth login/ 에이전트를 위한codex첫 실행 인증- GitHub를 위한
gh auth login - git 정체성을 위한
~/.gitconfig.local, 머신 로컬 환경을 위한~/.config/zsh/local.zsh— 두 파일 모두 추적되지 않으며(untracked), stowed 설정에 의해 자동으로 포함됩니다.
이것이 바로 신규 사용자 단계가 중요한 이유이기도 합니다. 사용자의 AI 개발 정체성은 클라우드 이미지에 포함되어 있던 것이 아니라, 사용자가 직접 생성한 깨끗한 계정에 존재하기 때문입니다.
FAQ
왜 노트북에서 에이전트를 그냥 실행하지 않고 서버를 사용하나요?
지속성(Persistence)과 대칭성(Symmetry) 때문입니다. 에이전트 세션은 오래 유지되지만, 노트북은 그렇지 않습니다. 서버를 사용하면 노트북, 데스크톱, 휴대폰 등 사용자가 소유한 모든 기기에서 동일한 세션에 대한 동일한 뷰를 가질 수 있습니다. 터미널을 위한 tmux, Claude 앱을 위한 claude --remote-control이 그 예입니다. 절전 모드/복귀, 네트워크 전환, 그리고 "지금 당장 나가야 해"와 같은 상황들이 더 이상 세션을 끊어버리는 요인이 되지 않습니다.
왜 Codespaces / devcontainers를 사용하지 않나요?
그것들은 종료되는 프로젝트별 워크스페이스 (workspaces)입니다. 반면 이것은 당신 소유의 지속적인 _머신 (machine)_입니다. 용도가 다릅니다. 저는 몇 주 동안 유지되는 tmux 세션, 계속 실행 중인 Docker 서비스, 그리고 dotf doctor를 실행하는 cron이 필요합니다. 또한, 일반적인 VPS는 제공업체에 종속되지 않으며 (provider-agnostic), 항상 켜져 있는 클라우드 IDE보다 저렴한 경우가 많습니다.
전체 개발자 프로필 (developer profile)을 원하지 않는다면 어떻게 하나요?
그것이 바로 프로필 (profiles)이 존재하는 이유입니다. minimal은 더 이상의 기능이 필요 없는 환경에 작동 가능한 셸 (shell) + git + dotf CLI를 제공합니다. custom을 사용하면 그룹을 직접 선택할 수 있습니다. 의존성 (dependencies)은 자동으로 해결됩니다 (예를 들어 nvim을 선택하면 build와 node가 함께 설치됩니다. 선택기 (picker)가 각 그룹의 내용을 보여주므로 무엇이 설치되는지 알 수 있습니다).
다시 실행해도 안전한가요?
네 — 그것이 핵심 설계 제약 사항 (design constraint)입니다. apply.sh는 수렴 (converges)합니다. 즉, 모든 단계는 실행 전에 확인 과정을 거칩니다. 부트스트랩 (Bootstrap)은 이 저장소 (repo)가 아닌 ~/.dotfiles는 건드리지 않으며, 아무것도 실행하기 전에 클론 (clone)이 업스트림 (upstream)과 일치하는지 확인하고, 이미 답변한 내용에 대해서는 다시 묻지 않습니다.
이 저장소를 직접 사용할 수 있나요?
네 — 클론 (clone)한 뒤, 제 설정 (configs)은 제거하고 뼈대 (skeleton)만 유지하셔도 됩니다. 매니페스트 (manifests)와 프로필 메커니즘 (profile machinery)은 home/에 누구의 dotfiles가 들어있는지는 상관하지 않습니다.
전체 설정은 github.com/VimukthiShohan/ubuntu-server-dotfiles에서 확인할 수 있으며, v1.3.0으로 릴리스되었습니다. 단 한 번의 명령어, 커피 한 잔이면 당신이 소유한 모든 기기가 잠들지 않는 개발 머신을 위한 씬 클라이언트 (thin client)가 됩니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기