跳到主内容

独立开发者的第一台服务器:我把 11 个服务塞进一台 4 美元 VPS

从域名解析到监控告警,用一台年付 48 美元的 VPS 跑完独立站的全套后端。本文包含完整配置清单与踩坑记录。

林 林一 · 11 分钟
服务器控制台与部署流程配图

利益披露: 本文含联盟链接。通过这些链接购买,我会获得佣金,你的成交价不变。这篇文章的结论和推荐顺序不受佣金影响。

做这个站的第一件事不是写代码,是算账。数据库、对象存储、邮件、监控、域名、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 SSD4 美元档
内存策略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 服务VPSNode + Fastify
数据库VPSSQLite,够用到 10 万行
定时任务VPScron,每日备份
对象存储VPS数字产品文件,本地磁盘
邮件托管免费额度 1000 封/月
CDNCloudflare免费
DNSCloudflare免费,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 垃圾邮件。

订阅即表示同意接收邮件,可随时点击邮件底部链接退订。