停止容器化你的 50 行脚本

发布: (2025年12月25日 GMT+8 18:00)
6 分钟阅读
原文: Dev.to

Source: Dev.to

封面图片:停止容器化你的 50 行脚本

Levskiy

介绍

我们都经历过这种情况。你需要部署一个简单的 webhook 处理器——可能只有 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!');
});

就这么简单。没有导入。没有 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 多个活跃服务。整个二进制文件(包括 Web 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

实际使用案例

M3M 的优势体现在:

  • Webhook 处理程序 – 接收并处理来自 Stripe、GitHub 等的 webhook。
  • Telegram/Discord 机器人 – 自托管机器人,无需容器开销
  • 内部 API – 为你的工具快速构建 REST API
  • 计划任务 – 带有友好 UI 的 Cron 任务
  • 数据处理器 – 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 适用于想要:

  • 在浏览器中编写逻辑,点击 保存,然后离开。
  • 避免为每个 50 行脚本都管理 Docker。
  • 将服务器资源留给真正的工作。
  • 为微任务摆脱 npm 依赖地狱。

不是 要取代 Kubernetes 或与无服务器平台竞争。
M3M 是为那些宁愿不写 Dockerfile、而有更重要事情要做的实用开发者准备的实用工具。

Back to Blog

相关文章

阅读更多 »