Firebase 的 Spark 免费档是静态托管里最大方的之一,但 Google 自己的文档把流量额度拆成两个数字——每月 10 GB 总量,再加每天 360 MB 软上限——这正是大家搞不清自己的站够不够用的原因。这篇把这些数字翻译成真实 PV,教你怎么测自己的出流量,并给出 Blaze 不被意外扣费的预算配置。
一句话结论
截至 2026 年 6 月,Spark 档给你 10 GB 文件存储 和 每月 10 GB 流量,在此之上还有 每天 360 MB 的软上限。自定义域名、免费 SSL、全球 CDN、preview channel 全都含在里面。日 PV 在约 1 万以下、资源大小正常的内容站,Spark 可以一直用下去。只有当你加 Cloud Functions、Cloud Run rewrite,或者流量长期顶破每日上限时,才需要 Blaze。唯一的”免费”陷阱:任何一天都别超过 360 MB,因为每日和每月两个数字同时生效。
让所有人犯迷糊的两个数字
Firebase 把 Spark 的流量额度用两种方式表述,而且两个都会被强制执行:
| 上限 | 数值(2026 年 6 月) | 重置 | 谁会先撞上 |
|---|---|---|---|
| 存储 | 共 10 GB | 无 | 大型媒体库、未压缩图片 |
| 流量(月) | 每月 10 GB | 按月 | 整月的稳定流量 |
| 流量(日) | 每天 360 MB | 每日,UTC 0 点 | 某一天突然爆量 |
在 Spark 下超额不会扣你钱——它会直接断你。撞到每日上限,Hosting 返回 quota 错误,到 UTC 0 点重置;月流量总量用完,站点会被停用到下个月。几乎所有”我火了一下就被扣 400 美金”的故事,都是 Blaze 上的 Cloud Functions 或 Firestore,跟 Spark 上的 Hosting 没关系。
快速判断:Spark 适合你吗?
下面几条都成立,你就用得很宽松:
- 日 PV 在约 1 万以下,资源大小正常。
- 站点总大小不超过 10 GB(内容站基本都满足)。
- 没有哪一天会把流量顶到 360 MB 以上。
- 你不需要 rewrite 到 Cloud Run / Cloud Functions(那些必须 Blaze)。
- 首访的平均单页重量在 ~500 KB 以下(文本 + 已缓存图片 + 已缓存字体)。
- 某一天反常爆量、站点临时返回 quota 错误,你也能接受。
对绝大多数独立内容站和 SaaS 落地页来说,这几条会一直成立。需要 Cloud Functions、Cloud Run rewrite,或预期流量长期超过每日上限时,再升 Blaze。
开始前准备
- Firebase Console 打开项目,能看到当前计划。
- 装好
firebase-tools,方便从 CLI 拉用量:npm install -g firebase-tools。 - 测量前先知道 build 输出大小(
du -sh dist/)。
实操步骤
1. 测量平均单页重量
Chrome DevTools → Network → 刷新,看底部的传输总和。或者用 curl 估算 HTML 加关键资源:
curl -sL -o /tmp/page.html https://yourdomain.com/articles/some-slug/
wc -c /tmp/page.html
# 45000 (45 KB HTML)
# 加上 immutable 的缓存部分(一个访客只付一次):
curl -sIL https://yourdomain.com/_astro/index.abc123.css | grep -i content-length
curl -sIL https://yourdomain.com/_astro/main.def456.js | grep -i content-length
内容站带 hash 资源时,回头客单页重量常在 30-80 KB;首访在 200-500 KB。
2. 同时算日流量和月流量
粗公式:
daily_MB = (first_visits * first_visit_KB + repeat_visits * cached_visit_KB) / 1024
+ sitemap_等杂项
500 PV / 天的博客举例:
first_visits = 300 * 400 KB = 120000 KB ≈ 117 MB
repeat = 200 * 60 KB = 12000 KB ≈ 12 MB
日合计 ≈ 129 MB/天 ← 远低于 360 MB/天
月合计(x30) ≈ 3.9 GB/月 ← 远低于 10 GB/月
两条轴都要看。日均 200 MB 的站对每日上限很宽松,但折算到月是 ~6 GB——仍然舒适。而某天突然冲到 400 MB 的站,即便月总量很小,也会撞破每日上限。
3. 一周后看真实数字
Firebase Console → Hosting → Usage,或者用 CLI:
firebase hosting:sites:list
# 列出你的 site,仪表盘 URL 里有每日带宽
# 或直接拉 Cloud Monitoring 指标:
gcloud monitoring time-series list \
--filter='metric.type="firebasehosting.googleapis.com/network/sent_bytes_count"' \
--interval-start-time=-P7D --format=json | jq '.[].points'
4. 开预算告警
Firebase Console → Project Settings → Usage and billing → Details & Settings → 设 $1 预算,50% / 90% / 100% 告警。Spark 也建议加,将来升级了不至于裸奔。
5. 升 Blaze 后设真正的花费上限
GCP Console → Budgets & alerts → Create budget。Alert thresholds 不会自动断流,只会发邮件。要真正断流,用 Google 文档里公布的”Pub/Sub topic + Cloud Function 关闭计费”配方:
# budget-action.yaml 示例
budget:
displayName: hosting-cap
amount:
specifiedAmount: { currencyCode: USD, units: 10 }
thresholdRules:
- thresholdPercent: 0.5
- thresholdPercent: 0.9
- thresholdPercent: 1.0
notificationsRule:
pubsubTopic: projects/your-project/topics/billing-alerts
disableDefaultIamRecipients: false
6. 大批量发内容前审一次 build 大小
CI 里加个守卫:
TOTAL=$(du -sb dist/ | cut -f1)
LIMIT=$((10 * 1024 * 1024 * 1024)) # 10 GB
if [ "$TOTAL" -gt "$LIMIT" ]; then
echo "build 输出超过 Spark 10 GB 天花板"; exit 1
fi
7. 图片打包前先压缩
一张 2 MB 头图大约 180 次访问就能吃光 360 MB 的每日上限:
# sharp 通过 Node 脚本或 astro-imagetools
npx sharp-cli --input "public/raw/**/*.{jpg,png}" \
--output "public/img/" \
--resize 1600 \
--format webp \
--quality 82
Blaze 上 Hosting 到底多少钱
怕账单失控,让很多人在 Spark 上待得比实际需要的久。Blaze 上 Hosting 这一项其实很小。截至 2026 年 6 月:
| 资源 | 免费额度(Blaze) | 超额单价 |
|---|---|---|
| 存储 | 10 GB | $0.026 / GB |
| 数据传输 | 每月 10 GB | $0.15 / GB |
Blaze 的免费月额度(10 GB 流量)和 Spark 是同一个数字,所以单看 Hosting 这个产品,升到 Blaze 在你跨过 10 GB/月之前不会改变账单。一个月出流量 30 GB 的站,只为超出额度的 20 GB 付费:20 × $0.15 = $3.00/月。Blaze 上真正的风险从来不是 Hosting,而是忘了同一个项目里的 Cloud Functions、Firestore、Cloud Run 现在都按用量计费。
执行检查清单
du -sh dist/输出远低于 10 GB。- 首访和回头客的单页重量都测过。
- 日流量估算低于 360 MB 的 50%,月流量低于 10 GB 的 50%。
- Spark 阶段也配好预算告警。
- 图片流水线产出压缩过的
.webp/.avif头图。
上线后验证
- 7 天后 Firebase Console → Hosting → Usage 与估算误差 ~25% 以内。
- 项目日志没有 “Quota exceeded” 事件。
- 模拟触发 50% 阈值时收到告警邮件。
容易踩的坑
- 把 Hosting 流量和 Firestore / Functions 流量混在一起算——它们是分开计费的。
- 只盯着月总量,漏了每天 360 MB 的上限。月用量不大也可能在尖峰当天撞破每日上限。
- 没压缩的大图几个小时就把每日额度吃光。
- 在 Spark 下加 rewrite 到 Cloud Functions——那些调用会失败,Functions 要求 Blaze。检测:被重写的路径返回 500。
- 直接 hot-link 大视频到 bundle,而不是用 YouTube/Vimeo。视频是最快炸掉额度的方式。
- 忘了 preview channel 和所有 site 共享同一份项目级配额——Firebase 按项目计流量,不是按 site,也不是按 channel。
FAQ
- Spark 上免费额度超了会怎样?: 撞到每天 360 MB 上限,站点返回 quota 错误,到 UTC 0 点重置;用完每月 10 GB 流量总量,站点会被停用到下个月。两种都不会自动扣钱——Spark 是直接断流而不是计费。
- 免费档包含自定义域名和 SSL 吗?: 包含。自定义域名、自动免费 SSL 证书(Spark 用 GROUPED 证书类型)、全球 CDN 在 Spark 下都不要钱。
- 免费档能用 preview channel 吗?: 能,包括独立 URL。它们和正式站点共享同一份项目级的存储和流量配额。
- 到底是每天 360 MB 还是每月 10 GB?: 两个都是,而且都会被强制执行。每日上限挡的是某一天突然爆量;每月总量管的是整月稳定流量。两个都遵守,你才一直免费。
- 什么时候该升 Blaze?: 需要 Cloud Functions 或 Cloud Run rewrite,或者稳定流量顶破每日上限的时候。Blaze 按用量付费,Hosting 部分本身很便宜。
- Blaze 上 Hosting 单价多少?: 流量在每月 10 GB 免费额度之外是 $0.15/GB;存储在 10 GB 免费之外是 $0.026/GB。每月出流量不到 10 GB 的站还在免费额度内,所以 Hosting 这一项实际上是 $0。