베이스 티어 서버(AWS t2 micro, 1GB RAM)에서 웹 앱을 배포하는 데 어려움을 겪었고, 그 결과 Graft를 만들게 되었다

발행: (2026년 1월 14일 오후 08:50 GMT+9)
3 min read
원문: Dev.to

Source: Dev.to

컨텍스트

앱과 CI/CD를 효율화하기 위해 Dokploy 같은 도구를 많이 사용하고 있었습니다. 하지만 예산이 부족하고 수익이 없어서 웹 앱을 더 약한 서버(AWS t2.micro, 1 GB RAM)로 옮겨야 했습니다. Dokploy 자체가 1 GB가 넘는 RAM을 소비해 버려, 앱을 배포하기도 전에 서버가 다운되었습니다. 작은 서버에 얼마나 많은 부하가 추가되는지 직접 확인하게 되었습니다.

해결책

매 배포마다 서버에 SSH로 접속하는 것은 너무 번거로웠기 때문에, Graft라는 자체 배포 도구를 만들었습니다.

개념

서버에 에이전트를 두는 대신, 에이전트를 로컬에서 실행합니다. 로컬에서 서버에 SSH로 접속해 모든 설정(Traefik을 이용한 게이트웨이 리버스 프록시, 소스 코드 푸시, 빌드 및 배포)을 수행합니다. 이것이 초기 Graft였습니다.

현재 버전 (v2.2.3)

  • CI/CD with graft‑hook (Rust 웹훅 수신기)

    • 1.7 MB 유휴 메모리 사용량
    • 활성 배포 중 ~15 MB RAM 사용 (Dokploy의 >1 GB와 비교)
  • 자동 백업 및 롤백 (간단한 명령)

  • DNS 자동화 (Cloudflare 통합)

  • Docker Compose 패스스루 (원격에서 docker compose 명령을 실행)

Graft는 간단한 명령으로 백업·롤백을 수행하고, 한 번의 명령으로 Cloudflare DNS 레코드를 마이그레이션할 수 있습니다.

결과

Docker Compose 설정이 로컬에서 정상적으로 동작한다면, Graft를 이용한 웹 앱 배포는 대략 15 분 정도 걸립니다. 또한 로컬 터미널에서 바로 원격 서버에 Docker Compose 명령을 실행할 수 있습니다.

워크플로우

# One-time setup
graft init

# Deploy
graft sync

# Manage like localhost
graft logs backend
graft restart frontend
graft ps

설치

Graft는 이제 여러 패키지 매니저를 통해 제공됩니다:

  • Homebrew
  • Winget
  • apt, dnf, yay, paru
  • 직접 sh 스크립트

문서

https://graftdocs.vercel.app

기여

관심이 있다면 먼저 테스트 서버에서 Graft를 사용해 보세요. 제가 필요했던 모든 기능을 추가했지만, 커뮤니티를 위해 제품을 개선할 아이디어와 기여를 언제든 환영합니다.

GitHub

https://github.com/skssmd/Graft

Graft 스크린샷

Back to Blog

관련 글

더 보기 »

기술은 구원자가 아니라 촉진자다

왜 사고의 명확성이 사용하는 도구보다 더 중요한가? Technology는 종종 마법 스위치처럼 취급된다—켜기만 하면 모든 것이 개선된다. 새로운 software, ...

에이전틱 코딩에 입문하기

Copilot Agent와의 경험 나는 주로 GitHub Copilot을 사용해 인라인 편집과 PR 리뷰를 수행했으며, 대부분의 사고는 내 머리로 했습니다. 최근 나는 t...