运维与安全
v1.2 起基座内置以下运维能力,全部可选:不配置对应变量就自动关闭,不影响现有站点。
定时任务调度
后台「定时任务」里配置的任务按 cron 表达式自动执行,由 POST /api/cron/dispatch 统一调度。
NUXT_CRON_SECRET=<随机长字符串> # 调度接口的 Bearer 令牌
NUXT_CRON_TZ_OFFSET=480 # 排期时区(分钟),默认北京时间
谁来唤醒调度器:
| 部署形态 | 方式 |
|---|---|
| Cloudflare Pages | 部署 deploy/cron-worker(复制 wrangler.toml.example,wrangler secret put CRON_SECRET,wrangler deploy),默认每 5 分钟 |
| Linux / 宝塔 | crontab 或宝塔「计划任务」:curl -fsS -X POST -H "Authorization: Bearer $NUXT_CRON_SECRET" https://站点/api/cron/dispatch |
| 手动补跑 | 同一命令加 ?all=1,忽略排期把启用的任务全跑一遍 |
每次调度还会顺带做维护:任务日志只保留最近 500 条,清理过期的限流记录。
内置任务接口
在后台新建任务时,URL 填下面的地址,请求头填 {"Authorization":"Bearer <NUXT_CRON_SECRET>"}:
| 接口 | 作用 | 需要的设置项 |
|---|---|---|
/api/cron/send-contact-emails | 把新的联系表单发邮件给站长 | contactNotifyEmail(缺省用 companyEmail),并在「邮件配置」里配好发信 |
/api/cron/push-search-engines | 主动推送 URL 给 IndexNow(Bing、Yandex 等)和百度 | indexNowKey、baiduPushToken,没填的渠道跳过;/{indexNowKey}.txt 自动提供 |
健康检查
GET /api/health 做一次数据库往返,返回驱动、存储、版本与耗时;数据库不可用时返回 503。适合接入 Uptime Kuma、宝塔监控或 Cloudflare 健康检查。
人机验证(Cloudflare Turnstile)
NUXT_TURNSTILE_SECRET_KEY=...
NUXT_PUBLIC_TURNSTILE_SITE_KEY=...
两个都设置后,联系表单会显示验证组件,服务端校验失败返回 400。站点自定义表单可以使用 useTurnstile() 组合式函数与 assertTurnstile(event, token)。
限流
登录、联系表单、安装、浏览量接口带限流。计数存放在 rate_limits 表里,多个 Worker 实例、多个 Node 进程共享同一份计数;表不存在时退化为单实例内存计数。
浏览量
GET /api/views?kind=post&id=1 读取,POST /api/views 计数一次(每 IP 每分钟最多 60 次)。数据存放在 content_views 表,不改动文章与产品表。页面里用 useViewCounter('post', () => id),基座的资讯和产品详情页已经接入。
访问统计
NUXT_PUBLIC_CF_ANALYTICS_TOKEN=... # Cloudflare Web Analytics,无 Cookie,不需要同意弹窗
后台页面不统计。
启动环境检查
启动时检查密钥缺失、示例值、成对配置只配了一半(Turnstile、对象存储)等问题,默认只打警告日志;设置 NUXT_STRICT_ENV=1 后生产环境直接启动失败。
数据库迁移
v1.2 新增 0013_rate_limits、0014_content_views 两个 SQLite 迁移(均为 IF NOT EXISTS,可重复执行),PostgreSQL 与 MySQL 有对应迁移。站点部署时使用 pnpm deploy:migrate,或对 D1 直接执行这两个 SQL 文件。