50줄 스크립트를 컨테이너화하지 마세요
Source: Dev.to

소개
우리는 모두 그런 경험이 있습니다. 간단한 웹훅 핸들러—아마 50줄 정도의 코드—를 배포해야 할 때, 여러분은 무엇을 할까요?
- Dockerfile 작성
docker‑compose.yml설정- 500 MB 규모의 Node.js 베이스 이미지 다운로드
- 의존성 설치
- 환경 변수 구성
- 리버스 프록시 설정
단 50줄의 코드를 위해서요.
VPS가 컨테이너 레이어로 부풀어 오릅니다. 각 마이크로‑작업이 별도의 Node.js 프로세스로 실행돼 메모리를 잡아먹습니다. 한 줄만 수정해도 배포 의식처럼 느껴집니다.
좀 더 간단한 방법이 있다면 어떨까요?
M3M (Mini Services Manager)은 단일 Go 바이너리로, 여러분의 JavaScript 서비스를 위한 전용 런타임 역할을 합니다. 컨테이너가 없습니다. npm 의존성 지옥도 없습니다. $5 VPS에서 실행되어야 할 서비스에 대한 클라우드 비용도 없습니다.
코드를 보여 주세요
$service.boot(() => {
const users = $database.collection('users');
// HTTP Endpoint
$router.get('/users', (ctx) => {
return { users: users.find({}) };
});
$router.post('/users', (ctx) => {
const user = users.insert(ctx.body);
return { user };
});
// Cron Task (Every hour)
$schedule.every('1h', () => {
$logger.info('Total users:', users.count({}));
});
});
$service.start(() => {
$logger.info('Service is ready!');
});
그게 전부입니다. import도 없고, package.json도 없습니다. 빌드 단계도 필요 없습니다. 브라우저에서 코드를 작성하고 Save를 누르면 바로 실행됩니다.
내장 배터리
모든 서비스는 $ 접두사를 통해 강력한 모듈에 접근할 수 있습니다:
| 카테고리 | 모듈 |
|---|---|
| 코어 | $service, $router, $schedule, $logger, $env |
| 데이터 | $database, $storage, $goals |
| 네트워크 | $http, $mail |
| 유틸 | $crypto, $encoding, $utils, $validator |
| 미디어 | $image, $draw |
미들웨어를 이용한 라우팅
$service.boot(() => {
// Auth middleware
const auth = (ctx) => {
const token = ctx.header('Authorization');
if (!token) {
ctx.status(401);
return { error: 'Unauthorized' };
}
};
// Protected routes
const api = $router.group('/api', auth);
api.get('/profile', (ctx) => {
return { user: ctx.get('user') };
});
});
MongoDB 스타일 쿼리를 사용한 데이터베이스
const posts = $database.collection('posts');
// Insert
const post = posts.insert({
title: 'Hello World',
views: 0,
tags: ['intro', 'first']
});
// Query with operators
const popular = posts.find({
views: { $gte: 100 },
tags: { $contains: 'featured' }
});
// Update
posts.update(
{ _id: post._id },
{ $inc: { views: 1 } }
);
스케줄된 작업
// Every 5 minutes
$schedule.every('5m', () => {
$logger.info('Checking for updates...');
});
// Cron expression
$schedule.cron('0 9 * * *', () => {
// Every day at 9 AM
sendDailyReport();
});
// One‑time delayed execution
$schedule.after('30s', () => {
$logger.info('30 seconds have passed!');
});
HTTP 클라이언트
const response = $http.post(
'https://api.example.com/webhook',
{
event: 'user_signup',
data: { email: 'user@example.com' }
},
{
headers: { 'X-API-Key': $env.get('API_KEY') }
}
);
if (response.ok) {
$logger.info('Webhook sent successfully');
}
서비스 라이프사이클
M3M 서비스는 세 가지 라이프사이클 단계가 있습니다:
// 1. Boot: Initialize routes, schedules, connections
$service.boot(() => {
$router.get('/health', () => ({ status: 'ok' }));
});
// 2. Start: Service is ready, load initial data
$service.start(() => {
$logger.info('Service started!');
});
// 3. Shutdown: Clean up before stopping
$service.shutdown(() => {
$logger.info('Goodbye!');
});
의미 있는 성능
M3M은 512 MB RAM을 가진 월 $5 VPS에서도 편안히 실행됩니다 — 활성 서비스가 20개 이상이어도 말이죠. 전체 바이너리(웹 UI 포함)는 약 30 MB 정도입니다.
각 Node.js 컨테이너가 최소 100–200 MB를 차지하는 일반적인 설정과 비교해 보세요.
시작하기
설치
# Clone
git clone https://github.com/levskiy0/m3m.git
cd m3m
# Build (requires Go 1.24+, Node.js 20+)
make build
# Create first admin user
./build/m3m new-admin admin@example.com yourpassword
# Run
./build/m3m serve
실제 사용 사례
- Webhook 핸들러 – Stripe, GitHub 등에서 오는 웹훅을 수신하고 처리합니다.
- Telegram/Discord 봇 – 컨테이너 비용 없이 자체 호스팅 봇을 운영합니다.
- 내부 API – 도구들을 위한 빠른 REST API를 제공합니다.
- 예약 작업 – 깔끔한 UI를 갖춘 크론 작업을 설정합니다.
- 데이터 프로세서 – ETL 파이프라인, 스크레이퍼, 집계기 등을 구현합니다.
- 모니터링 – 상태 확인, 알림, 메트릭 수집을 수행합니다.
Claude 코드 통합
M3M은 Claude Code용 MCP 서버를 포함합니다. 연결되면 Claude는 전체 M3M API를 알고 서비스 작성을 도와줄 수 있습니다:
make build-mcp
claude mcp add m3m-api ./build/m3m-mcp
이제 Claude에게 “모니터링하는 M3M 서비스를 작성해 주세요 …” 라고 물어보면 바로 실행 가능한 구현을 얻을 수 있습니다.
**M3M** – *“Make My Monitor”* – 은(는) 작고 단일 파일 Node.js 유틸리티로:
- **웹사이트를 모니터링**하고 다운될 경우 이메일로 알림을 보냅니다.
- 올바른 `$http`, `$schedule`, `$mail` 모듈을 사용해 동작하는 코드를 생성합니다.
철학
M3M은 다음을 원하는 개발자를 위한 도구입니다:
- 브라우저에서 로직을 작성하고 Save를 눌러 바로 떠난다.
- 50줄짜리 스크립트마다 Docker를 관리하는 일을 피한다.
- 서버 자원을 실제 작업에 남겨 둔다.
- 마이크로 작업을 위해 npm 의존성 지옥을 피한다.
Kubernetes를 대체하거나 서버리스 플랫폼과 경쟁하려는 것이 아닙니다.
M3M은 Dockerfile을 작성하는 것보다 더 할 일이 많은 실용적인 개발자를 위한 실용적인 도구입니다.
