50줄 스크립트를 컨테이너화하지 마세요

발행: (2025년 12월 25일 오후 07:00 GMT+9)
7 분 소요
원문: Dev.to

Source: Dev.to

Stop Containerizing Your 50-Line Scripts 표지 이미지

Levskiy

소개

우리는 모두 그런 경험이 있습니다. 간단한 웹훅 핸들러—아마 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을 작성하는 것보다 더 할 일이 많은 실용적인 개발자를 위한 실용적인 도구입니다.

Back to Blog

관련 글

더 보기 »