베이스 티어 서버(AWS t2 micro, 1GB RAM)에서 웹 앱을 배포하는 데 어려움을 겪었고, 그 결과 Graft를 만들게 되었다
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스크립트
문서
기여
관심이 있다면 먼저 테스트 서버에서 Graft를 사용해 보세요. 제가 필요했던 모든 기능을 추가했지만, 커뮤니티를 위해 제품을 개선할 아이디어와 기여를 언제든 환영합니다.
GitHub
https://github.com/skssmd/Graft
