利益披露: 本文含联盟链接。通过这些链接购买,我会获得佣金,你的成交价不变。这篇文章的结论和推荐顺序不受佣金影响。
做这个站的第一件事不是写代码,是算账。数据库、对象存储、邮件、监控、域名、CDN——拆成六七条账单,每条都是月付,最低配也要二三十美元。对一个还没赚到钱的人来说,这笔钱花得很心虚。
最后我的方案是:一台 4 美元/月的 VPS 跑全部服务,前面挂 Cloudflare 做 CDN 和 DNS,域名用最便宜的那档。 年成本压到 48 美元,静态站的部分完全免费。
为什么不是全托管
先说我试过和放弃的路径。
完全托管(Vercel + Railway + Sentry + Resend + Upstash)确实省心,加起来月付大概 20 美元,零运维。但问题在于:费用随用户量增长的部分,你没法预测。 一个跑得好 的独立站,流量涨十倍的时候数据库账单会跟着涨,而那时候你的收入可能还没跟上。
自托管的问题反过来:固定成本,可预测,但要你自己兜底。磁盘满了、证书过期了、进程被 OOM Killer 杀了——都得有人管。
我的取舍是:流量敏感的部分走托管,成本敏感的部分走自托管。 静态资源和 CDN 走 Cloudflare(免费且不怕流量涨),应用服务走单台 VPS(月付固定),邮件这种低频的用免费额度。
具体的机器配置
| 项目 | 配置 | 说明 |
|---|---|---|
| 系统 | Debian 12 | 稳定,apt 生态干净 |
| 规格 | 1 vCPU / 1GB / 25GB SSD | 4 美元档 |
| 内存策略 | 1GB swap | 避免小进程 OOM 直接死 |
| 反代 | Caddy | 自动续证书,比 Nginx 省心 |
| 进程管理 | systemd + 一个编排脚本 | 没有上 Docker |
| 监控 | 自写脚本 + 邮件告警 | 不依赖外部服务 |
4GB 内存的机器我不推荐。跑两个 Node 服务加上数据库就开始 swap,出问题的时候排查很痛苦。1GB 能扛住的前提是你只有一个主力服务,其余的尽量做成静态或定时任务。
内存是最容易踩的坑
我第一次部署的时候,Node 进程莫名其妙被杀了,dmesg 里能看到 OOM Killer 的记录。原因是同时跑了三个服务,其中一个内存泄漏。
现在我的启动脚本里固定加了 swap,并且给每个服务设了内存上限:
# /etc/systemd/system/app.service
[Service]
MemoryMax=350M
MemoryHigh=280M
Restart=always
RestartSec=3
MemoryHigh 让系统在接近上限时先回收缓存而不是直接杀进程,MemoryMax 才是硬限制。超过软限制会先触发 GC,超过硬限制才会被 kill。这一个配置项救了我一晚上。
为什么没有上 Docker
在 1GB 内存的机器上跑 Docker daemon 本身就要吃掉 150–200MB。装了之后剩下的空间给不了你什么。
我用的是更原始的方式:一个 deploy.sh 负责拉代码、装依赖、重启服务。
#!/usr/bin/env bash
set -euo pipefail
APP_DIR=/srv/makekit
cd "$APP_DIR"
git pull --ff-only origin main
npm ci --omit=dev
npm run build
# 零停机:先起新的,等健康检查通过再切流量
systemctl restart makekit-api
sleep 3
curl -fsS http://127.0.0.1:3000/health || { echo "health check failed"; exit 1; }
echo "deploy ok"
Caddy 前面做健康检查,失败会自动切回旧实例。这套流程在 1GB 机器上跑得比 K8s 稳得多——当然,K8s 根本不该出现在这个规格的机器上。
反向代理和证书
Caddy 的配置文件只有六行,这是我喜欢它的主要原因:
makekit.dev {
encode zstd gzip
reverse_proxy 127.0.0.1:3000
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
Referrer-Policy "strict-origin-when-cross-origin"
}
}
证书自动申请和续期,HTTP 到 HTTPS 自动跳转,HSTS 顺手就加了。Compare 一下 Nginx 那一堆 certbot --renew 的定时任务,Caddy 省下的心智负担比省下的 CPU 值钱。
监控:只告警该告警的
新手最常见的错误是告警太多,最后全部忽略。我的规则是只有需要人立刻动手的才发邮件,其余进日志。
必须告警的:
- 磁盘使用率超过 85%
- 站点健康检查连续失败 3 次
- 内存使用率超过 92%
- SSL 证书剩余天数少于 7 天
不告警的:CPU 偶尔跑高、某个请求 500(除非连续)、磁盘 IO 波动。
告警脚本用 cron 跑,每 5 分钟一次:
#!/bin/bash
DISK=$(df -h / | awk 'NR==2 {gsub("%","",$5); print $5}')
MEM=$(free | awk '/Mem:/ {printf "%.0f", $3/$2*100}')
HEALTH=$(curl -fsS -o /dev/null -w "%{http_code}" http://127.0.0.1:3000/health 2>/dev/null || echo "000")
if [ "$DISK" -gt 85 ] || [ "$MEM" -gt 92 ] || [ "$HEALTH" != "200" ]; then
curl -fsS -X POST "$ALERT_WEBHOOK" \
-H "Content-Type: application/json" \
-d "{\"text\":\"⚠️ makekit: disk=${DISK}% mem=${MEM}% health=${HEALTH}\"}" || true
fi
用 Telegram Bot 或者 Discord Webhook 都能收到,比邮件快——手机推送几秒就到。
11 个服务具体是什么
| 服务 | 跑在哪 | 备注 |
|---|---|---|
| 静态站 | Cloudflare Pages | 独立于 VPS,构建后推 CDN |
| API 服务 | VPS | Node + Fastify |
| 数据库 | VPS | SQLite,够用到 10 万行 |
| 定时任务 | VPS | cron,每日备份 |
| 对象存储 | VPS | 数字产品文件,本地磁盘 |
| 邮件 | 托管 | 免费额度 1000 封/月 |
| CDN | Cloudflare | 免费 |
| DNS | Cloudflare | 免费,NS 托管 |
| 监控 | VPS | 自写脚本 |
| 备份 | VPS → 对象存储 | 每日异地 |
| 域名 | 托管 | 首年最便宜档 |
备份这件小事救过我一次
有一次误删了一个产品目录,当天有 11 笔订单。备份脚本每晚 3 点跑,当天早上 3:15 就能恢复。
#!/bin/bash
set -euo pipefail
STAMP=$(date +%Y%m%d-%H%M)
tar -czf /tmp/backup-$STAMP.tar.gz /srv/makekit/data
# 保留最近 14 天
find /tmp -name 'backup-*.tar.gz' -mtime +14 -delete
# 同步到异地
rclone sync /tmp makekit-offsite:backups
异地同步是关键。备份放在同一台机器上,机器挂了备份一起没。
一年下来花了多少
| 项目 | 年成本 |
|---|---|
| VPS(4 美元/月) | $48 |
| 域名(首年) | $9 |
| 邮件服务(免费档) | $0 |
| Cloudflare | $0 |
| 合计 | 约 $57 |
对比完全托管方案,月付 20 美元起,一年 240 美元。差出来的 180 多块,正好是我第一年的域名和联盟注册成本。
什么情况下你不该这么做
别学我,如果你符合下面任意一条:
- 你完全不懂 Linux 和命令行
- 你的服务需要频繁扩缩容
- 你的收入不确定,且现金流紧张
- 你没有备份和恢复演练的习惯
托管服务花的钱买的是你不用半夜起来修服务器。如果你的时间成本高于每月 20 美元,直接托管,别折腾。
我的判断标准很简单:当你开始为了省钱而花超过一小时排障时,托管就已经更便宜了。
如果你也想试试
服务器的话,我用的是 Vultr ,选 4 美元那档就够了,创建的时候记得选 Amsterdam 或 Seattle 机房(离用户近一点延迟低)。静态资源的 CDN 和 DNS 都在 Cloudflare ,免费额度完全够个人站。
域名我在 Namecheap 买的,首年 .com 大概 9 美元,注意首年便宜但续费贵,域名买之前想清楚要不要长期持有。
想把这套部署流程固化成脚本,我把自己用的 前端代码片段库 里的部署相关部分整理成了一套模板。
关于日志与配置管理:上面所有配置我都用 Notion 记了一份对照表,包括「改了哪个文件、为什么改、怎么回滚」。服务器配置最容易出问题的不是写错,而是半年后忘了当初为什么这么写。
Newsletter
每周一封,只发有用的
新素材上架、踩坑复盘、以及一篇值得读的深度文章。免费订阅,随时退订,0 垃圾邮件。
订阅即表示同意接收邮件,可随时点击邮件底部链接退订。