停止容器化你的 50 行脚本
Source: Dev.to

介绍
我们都经历过这种情况。你需要部署一个简单的 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、而有更重要事情要做的实用开发者准备的实用工具。
