삽질 끝에 찾은 해답: Jetson Orin Nano와 Ollama로 구축한 로컬 AI 서버 생존기
2026. 6. 21.
삽질 끝에 찾은 해답: Jetson Orin Nano와 Ollama로 구축한 로컬 AI 서버 생존기
어디서부터 이야기를 시작해야 할지 모르겠네요. 긴 이야기지만, 모든 것은 DEV에서 열린 'finish-it-up-a-thon' 챌린지를 보고 시작됐습니다. 특정 프로젝트 하나가 머릿속에 번뜩이면서 단숨에 흥미가 돋았죠. 저는 2024년부터 govend라는 프로젝트를 틈틈이 작업하고 있었어요. 웹 개발 견습생 시절에 시작한 작업물인데, 이 '최소 기능 제품(MVP)'을 처음 '출시'했을 때 정말 뿌듯했습니다. AI의 도움 없이 제가 직접 루비 코드를 한 줄 한 줄 써 내려갔으니까요. 노코기리(Nokogiri) 웹 스크래퍼 구현도 오롯이 제 힘으로 해냈죠.
물론, 솔직히 말하면 좀 엉성했고, 스크래퍼로 가져온 날짜 데이터가 데이터베이스에 제대로 저장되지 않는 문제도 있었습니다. 이 문제를 해결하기로 마음먹은 건 최근에서야 가능했죠. 제가 아는 한도 내에서, 그리고 제 능력껏 할 수 있는 일이라면 대충 만들어서 배포하는 건 정말 용납할 수 없었어요. 아래는 작업 전후의 최신 모습입니다.

요구사항 파악하기: 로컬 AI 서버가 필요해!
저는 정말 엄청난 일을 스스로에게 떠넘겼더군요. 남아있는 작업량이 이렇게 많을 줄은 미처 몰랐습니다. 다른 우선순위 때문에 아쉽게도 DEV 챌린지에는 참여할 수 없었지만, 그 덕분에 필요했던 동기 부여를 얻었어요. 이 챌린지의 가장 큰 목표는 제 앱을 로컬에서 성공적으로 자가 호스팅하는 것이었습니다. 아시다시피, 저는 앱에 AI를 활용하고 있었는데, 개인 로컬 네트워크에 자체 '서버'가 없었거든요. 모든 게 Render, Neon, Vercel, Heroku, GitHub Pages 같은 외부 서비스에 의존하고 있었죠.
앱에 AI 기능을 추가하고 싶고, 사용자들이 그 AI를 활용하도록 하고 싶으니 곧바로 문제가 발생했습니다. 첫째, AI 클라우드 서버는 비용이 너무 비쌌어요. 둘째, 클라우드 서비스를 로컬 에이전트에 연결하는 것도 만만치 않았죠. 제 govend 앱에는 사용자들이 Ollama와 대화하며 특정 날짜의 행사나 위치별 행사를 검색할 수 있는 채팅 인터페이스를 오래전에 만들어뒀습니다. 로컬에서는 Ollama가 사용자 요청을 받아 Algolia에 문의하고 관련 행사를 가져오는 방식으로 쉽게 작동했죠. 하지만 이걸 제 개인 컴퓨터가 아닌 다른 곳에서 돌리고 싶었던 겁니다.
솔직히 이 모든 과정이 저에게는 무서운 도전이었지만, 꼭 필요한 단계였습니다. 저렴한 자가 호스팅 방법을 이리저리 찾아봤고, 며칠간의 탐색 끝에 Jetson Orin Nano가 답이라는 확신이 들었습니다. 작은 모델의 AI 작업을 처리하도록 설계된 녀석이니, 제 사용 사례에는 충분했죠. 게다가 이것저것 외부 장치를 따로 살 필요 없이 한 번에 해결되는 '원앤던(one-and-done)' 솔루션이라는 점이 마음에 들었습니다. 이미 큰 도전을 시작했는데, 더 복잡하게 만들고 싶지 않았거든요. 월 100달러(또는 그 이상)를 AI 클라우드 서버에 쓰는 대신, 몇백 달러를 투자해서 한 번에 끝내버리겠다고 생각했습니다. (당분간은요, 😈)
제가 실제로 구매한 품목은 다음과 같습니다.
- Nvidia Jetson Orin Nano 개발자 키트
- USB 팩
- NVMe 하드 드라이브

꿀팁 방출
- 온라인 게시물들을 보고 몇몇 사람들과 이야기를 나눈 결과, SD 카드에 미련조차 갖지 않았습니다. 이 길로 가시겠다면 저와 똑같이 하시라고 강력히 추천드려요. 후회는 1도 없습니다.
- 설치 관련해서는 온라인에 훌륭한 문서들이 많고, 모든 조건이 잘 맞으면 꽤 직관적으로 진행됩니다. 하지만 저의 경우는 그렇지 않았다는 걸 미리 말씀드릴게요.
- Nano의 현재 구성에 따라 부팅 시 업데이트가 필요할 수 있습니다. 호환성을 위해 업데이트는 반드시 실행되어야 합니다. 여기까지는 문제없었죠. 하지만 제가 설치에 사용한 모니터는 그야말로 고물이었습니다...
본격적인 드라마의 시작

'계속하려면 'yes'를 입력하세요'라는 작은 메시지가 첫 시도에서는 도통 보이지 않았습니다. 계속해서 재시도했지만, 필요한 화면은 나타나지 않더군요.
왜 그랬는지 말씀드리죠.
- 모니터가 이미 켜진 상태에서 Nano를 연결하면, 화면이 1초 안에 절전 모드로 진입하고 대기 상태가 됩니다. Nano가 부팅 중인데 말이죠.
- 제가 모니터 전원 버튼을 눌러 화면을 다시 켜는 순간에는 이미 Nano의 중요한 입력 타이밍이 지나버린 뒤였습니다. 그래서 필요한 화면을 한 번도 보지 못했던 거죠!
- 이 사실을 알게 된 건, 트러블슈팅 문서를 아주 꼼꼼하게 읽어 내려가기 시작했을 때였습니다. 타이밍 문제 때문에 제가 결코 볼 수 없을 입력 화면을 기다리고 있었다는 걸 깨달았죠. 모니터 설정도 살펴봤지만, 거기서는 답이 없었습니다. 하드웨어 초기 설정은 늘 예상치 못한 변수로 가득하죠. 예전에 저도 디스플레이 케이블 불량 때문에 반나절을 날린 적이 있는데, 별거 아닌 것 같으면서도 사람을 미치게 하는 부분이에요.
결국 어느 순간, Orin Nano를 연결하고 동시에 모니터 전원 버튼을 누르는 방식으로 부팅에 성공했습니다. 화면에 패키지들이 빠르게 지나가고, 전반적인 흥분감이 감돌았죠. 그리고… 기다렸습니다. 족히 30분은 기다린 것 같아요. 망가진 건가? 무슨 일이지? 온몸에 패닉이 찾아왔습니다.
거의 45분에서 한 시간쯤 지나서, 결국 전원 플러그를 뽑았습니다. 뭔가 잘못된 게 분명했어요. 조심스럽게 Nano를 다시 연결하고 동시에 모니터 전원 버튼을 눌렀습니다. 부팅이 되더니, 로그인을 요청하더군요. 로그인? 무슨 로그인? 저는 로그인을 만든 적이 없는데? 그 USB는 이후 읽기 전용으로 바뀌어서 정상적으로 포맷할 수도 없었습니다. 결국 다른 USB를 설치 프로그램용으로 사용해야 했죠.
이제 저의 개인적인 문제 범위에 대한 지식을 무장하고, 새로운 USB를 만들며 주변기기들과의 싸움에 나설 준비를 마쳤습니다. 자신의 문제가 무엇인지, 그리고 어떻게 다뤄야 하는지 알게 되면 비로소 모든 것이 제대로 작동하기 시작하는 법이죠.
<hr>
자가 호스팅 배우기
며칠(혹은 몇 주?)이 흐른 뒤, 모든 것을 설정했습니다. Nano에 제 앱들을 자가 호스팅하는 방법을 익혔죠. Heroku와 Render에 있던 모든 앱들을 정리하면서, 작은 도메인 풀도 마음대로 사용할 수 있게 되었습니다. 며칠 동안 govend를 제대로 된 상태로 만들기 위해 매달렸습니다. 이 앱으로 판매자와 아티스트들이 행사장을 찾고, 행사 관리를 한곳에서 할 수 있도록 돕고 싶었거든요. 5년간 판매자로 활동하면서 이런 도구가 절실하다는 걸 잘 알고 있습니다. 소상공인 시장은 그야말로 와일드 웨스트와 같아서 전문적인 도구가 많지 않죠. 이 앱이 정말 살아 움직이는 것을 보고 싶었습니다. 영원히 매달릴 수도 있었겠지만, 어느 시점에는 공개해야 했죠.
두 앱을 위한 하나의 Ollama
저는 플래시카드 생성, 기억력 게임, 자체 퀴즈에 Ollama를 사용하는 제 flippy card 앱도 손봤습니다. 두 앱에서 하나의 Ollama 인스턴스를 사용할 수 있게 된 거죠. 정말 멋지지 않나요? 기본적으로 제 데이터베이스가 지원 서비스와 분리되어 있기 때문에, 웹 서버는 앱과 서비스를 연결하는 작은 허브 역할만 하면 됩니다. 꽤 괜찮죠! 여기서 AI가 제대로 단속하지 않으면 보안 악몽이 될 수 있다는 점을 언급하는 것이 중요하다고 생각해요. 마이크로서비스 아키텍처에서 리소스 최적화는 늘 고민인데, Ollama 인스턴스 하나로 여러 앱을 돌리는 건 정말 효율적인 접근이라고 생각해요. 실무에서도 이런 유연한 설계가 비용 절감에 큰 도움이 되거든요.
보안 배우기
저는 보안 설정, 프록시 사용, 사용하지 않는 포트 닫기 등 보안에 대해 배웠습니다. 신뢰하는 몇몇 사람들에게 제 앱을 살펴보아 달라고 요청했고, 보안 조치로 그들의 봇으로 스캔을 돌려달라고 부탁하기도 했습니다. 솔직히 AI 보안을 너무 깊이 고려하지 않았다는 점을 인정합니다. 그 결과, 몇 가지 문제점이 발견되었고 해결했습니다. 앱에 대해 꽤 자신감이 있었는데 AI가 모든 것을 뒤집어버리는 건 흥미로운 경험이었습니다. 보안에 이렇게 많은 시간을 할애해야 할 줄은 예상하지 못했죠. 엄청난 학습 경험이었고, 막바지에는 서버를 향해 신음 소리를 내게 만들었습니다.
경험에서 우러나온 빠른 개발
Claude Code를 설치하고 이를 활용해 서버 '허브' 페이지를 빠르게 구축했습니다. 이곳에서 몇몇 라이브 앱, 블로그 게시물, 관련 링크들을 공유하고 있죠. 신중하게 프롬프트를 선택했더니, 제 미적 감각을 반영한 페이지가 빠르게 만들어졌습니다. 저는 이후 이를 다듬었고, 아래 블로그 섹션과 다르게 보이도록 프로젝트 섹션 상단에 캐러셀을 추가했습니다. Claude에게 제가 무엇을 하려는지 알려주기 위해 이전에 사용했던 코드를 가져오기도 했죠. 그전에 수많은 것들을 만들어본 경험 덕분에 이 페이지를 만드는 것이 놀라울 정도로 간단했습니다.

보안, 또 보안!
- Hermes의 피드백을 Claude에게 전달해서 Rate Limiting, 엔드포인트 보안 같은 해결책을 빠르게 구현했습니다. 너무 많은 시도가 있을 경우, 계정이 일정 시간 잠기도록 했죠. 솔직히 말하기 부끄러울 정도로 많은 보안 취약점을 발견했습니다. 그래도 부끄럽지 않은 부분은, 공유하기 전에 스스로 점검할 만큼 똑똑했다는 점입니다.
- 이 글에서 정말 강조하고 싶었던 앱은
govend였지만, 솔직히 이 모든 과정을 통해 만들어진 저의 '서버 허브 페이지'에 푹 빠져 있습니다. 저는 오랜 시간 동안 크고 작은 '프로필' 앱들을 만들어왔는데, 매번 이전보다 더 나은 결과물을 내놨죠. 이젠 단순한 프로필 페이지가 아니라, 개발자인 저와 관련된 모든 것을 찾을 수 있는 중앙 허브를 원했습니다. 이력서나 프로필이 아닌, 그저 '허브' 말이죠. 저의 마이크로 서버입니다. 오신 것을 환영하며, 봐주셔서 감사합니다. 이 모든 것을 제가 만들었습니다. - AI는 기본적인 보호 장치를 구현하고 식별하는 데 도움을 주었고, 저는 보안 검토를 필수적인 과정으로 여겼습니다. 버그 보고를 위한
security.txt파일을 포함하는 것도 배웠죠. 동료 개발자 한 분이security.txt에 대한 좋은 글을 써두셨으니 참고하시면 좋습니다: security.txt article
정말이지, 대부분의 정리 작업은 모든 것이 최대한 안전한지 확인하는 것이었습니다.
보안 조치 내역은 다음과 같습니다.
- Rate Limiting, 점진적 잠금(Progressive Lockouts), CAPTCHA 훅 추가.
- 보안 헤더(Security Headers) 추가.
- 콘텐츠 보안 정책(Content Security Policy) 추가,
script-src에서unsafe-inline및unsafe-eval지시어 제거, 아키텍처 유출 방지. - 책임 있는 공개(Responsible Disclosure) – 연락처 이메일이 포함된
/.well-known/security.txt생성. - 서버 방화벽 설정. 초기에는 작동에 문제가 있었는데, 테이블 호환성 문제를 해결해야 한다는 것을 발견했습니다. 보안 문제만 해결하는 데 며칠이 더 걸렸죠.
어떻게 보셨나요?
원문: https://dev.to/annavi11arrea1/self-hosting-experience-with-jetson-orin-nano-and-ollama-5a9c 수집일: 2026-06-21 00:25:49