标签 Render 下的文章

项目地址

V2 版本

  • 改用 KV 管理账号
  • 自带简易保活

V1 版本

一键部署

点击下方按钮快速部署:

Render 服务管理面板 V2 版本,重大更新2

Render 服务管理系统

一个现代化的 Render 服务管理面板,让你能够集中管理多个 Render 账户中的 WEB_SERVICE 服务。提供账户管理、服务监控、部署控制、环境变量管理、日志查看和实例管理等完整功能。

特性

账户管理

  • 通过 Web 界面动态添加、编辑、删除 Render 账户
  • API Key 添加前自动验证有效性
  • 账户信息安全存储在 Cloudflare KV 中
  • API Key 仅显示预览(前 8 位… 后 4 位)

安全登录

  • 提供密码保护的登录页面
  • 基于 Cookie 的会话管理(24 小时过期,滑动刷新)
  • CSRF Token 双提交 Cookie 模式保护
  • IP + 用户名双重登录失败锁定(指数退避)
  • 时序安全的密码比较(防止时序攻击)
  • HSTS 安全头强制 HTTPS
  • 登录状态持久化

服务监控面板

  • 实时显示服务状态(运行中 / 已暂停)
  • 服务统计信息(总数、运行中数量、账户数)
  • 服务搜索和账户过滤功能
  • 智能缓存机制(15 分钟新鲜 / 24 小时过期)
  • 手动刷新按钮和缓存时间显示

部署管理

  • 一键触发部署
  • 查看部署历史记录
  • 取消进行中的部署
  • 回滚到历史版本

服务控制

  • 暂停 / 恢复服务
  • 重启服务
  • 服务状态实时更新

环境变量管理

  • 查看所有环境变量
  • 在线编辑环境变量值
  • 添加新的环境变量
  • 删除现有环境变量
  • 值的复制功能

日志与监控

  • 查看服务运行日志
  • 日志级别筛选(error/warn/info/debug)
  • 终端风格深色主题日志查看器
  • 查看服务实例状态
  • 扩缩容服务实例

事件日志

  • 查看最近事件日志
  • 显示部署开始 / 结束状态
  • 部署成功 / 失败状态标识
  • 显示触发原因和用户信息

现代化 UI

  • 响应式设计,支持移动端
  • 漂亮的卡片式布局
  • 流畅的交互动画
  • 一致的设计风格

自动保活(Cron)

  • 定时 Ping 所有运行中的 Web 服务
  • 并发批处理(每批 10 个服务)
  • 指数退避重试机制
  • 智能利用缓存减少 API 调用

快速开始

方式 1: 通过 Wrangler CLI 部署(推荐)

  1. 克隆仓库

    git clone https://github.com/ssfun/render-service-manager.git
    cd render-service-manager
    
  2. 安装 Wrangler CLI

    npm install -g wrangler
    
  3. 创建 KV 命名空间

    npx wrangler kv:namespace create RENDER_KV
    

    将返回的 ID 复制备用。

  4. 配置 wrangler.toml
    编辑 wrangler.toml 文件:

    name = "render-service-manager" main = "src/index.js" compatibility_date = "2025-10-01" [observability] enabled = true [[kv_namespaces]] binding = "RENDER_KV" id = "你的KV_ID" # 替换为上一步获取的 ID [triggers] crons = ["*/5 * * * *"]  # 每5分钟执行一次保活任务 [vars] ADMIN_USERNAME = "admin" ADMIN_PASSWORD = "your-strong-password" # 请修改为强密码 
  5. 登录并部署

    npx wrangler login
    npx wrangler deploy
    
  6. 添加 Render 账户

    • 访问部署后的 URL
    • 使用配置的用户名密码登录
    • 点击右上角 "账户管理"
    • 点击 "添加账户",输入名称和 Render API Key

方式 2: 手动部署(无需 Wrangler CLI)

  1. 登录 Cloudflare 账户

  2. 创建 KV 命名空间

    • 导航到 “Workers” > “KV”。
    • 点击 “Create a namespace”。
    • 输入名称(如 “RENDER_KV”),复制生成的 ID 备用。
  3. 创建 Worker

    • 导航到 “Workers” > “Overview”。
    • 点击 “Create a Worker”。
    • 输入 Worker 名称(如 “render-service-manager”)。
  4. 上传代码

    • 在 Worker 编辑器中,上传本项目的源代码。
  5. 配置环境变量

    • 点击 “Settings” > “Variables”。
    • 添加以下环境变量:
      变量名
      ADMIN_USERNAMEadmin
      ADMIN_PASSWORDyour-strong-password
  6. 绑定 KV 命名空间

    • 在 “Settings” > “Bindings” > “KV Namespace Bindings” 部分。
    • 点击 “Add binding”。
    • 变量名称输入 RENDER_KV
    • 选择步骤 2 中创建的 KV 命名空间。
  7. 部署 Worker

    • 点击 “Save and Deploy”。
    • 通过提供的 URL 访问(例如: render-service-manager.your-subdomain.workers.dev)。
  8. 添加 Render 账户

    • 登录后点击 "账户管理" 添加你的 Render 账户。

环境变量

变量名说明必填
ADMIN_USERNAME管理员登录用户名
ADMIN_PASSWORD管理员登录密码

致谢

许可证

本项目采用 MIT 许可证. 版权所有 © 2025 sfun


📌 转载信息
转载时间:
2026/1/23 11:58:16

CLI Proxy API 的核动力驴一天 3 个小版本,每天打开电脑都是打开 render 更新部署。
于是搓了这样一个用 Deno Deploy 的 cron 触发 Render deploy hook 的小工具
每天凌晨 4 点自动更新 render 部署的 cpa(你也可以用来更新其他 render 项目)


去这里复制一下 Deploy Hook 就好了,改一下代码里面占位的 RENDER_HOOK_URL
非常简单的小工具

/**
 * Project: render-auto-deploy (sanitized, hardcoded URL version)
 * Purpose: 用 Deno Deploy Cron 定时触发 Render Deploy Hook(自动 redeploy)
 *
 * ✅ 你需要改的地方(部署时只改这两处):
 * 1) 把 RENDER_HOOK_URL 改成你自己的 Render Deploy Hook URL(包含 service id + key)
 * 2) 如果想换时间,把 CRON_SCHEDULE 改成你要的 cron(注意:Deno.cron 用 UTC)
 *
 * ✅ 验证方法:
 * - 打开 "/":看到 running + 当前 UTC 时间 + schedule
 * - 打开 "/trigger":立刻触发一次 Render 部署(返回 deploy.id)
 * - 去 Render Events:会出现 “Triggered via Deploy Hook”
 *
 * 🔥 时区提醒:
 * - Deno.cron 的 cron 表达式按 UTC 解释
 * - 例:UTC 20:00 = 北京时间次日 04:00
 */

// ======================【部署时改这里 1】======================
// Render Deploy Hook(占位符,换成你自己的)
// 形如:https://api.render.com/deploy/<YOUR_SERVICE_ID>?key=<YOUR_DEPLOY_KEY>
const RENDER_HOOK_URL =
  "https://api.render.com/deploy/<YOUR_SERVICE_ID>?key=<YOUR_DEPLOY_KEY>";

// ======================【部署时改这里 2】======================
// Cron 表达式按 UTC 解释:
// - "0 20 * * *" => 每天 UTC 20:00(北京时间次日 04:00)
// - 测试用: "*/1 * * * *" => 每分钟触发一次(用来验证 cron 是否生效)
const CRON_SCHEDULE = "0 20 * * *";

function nowIso() {
  return new Date().toISOString();
}

async function triggerRenderDeploy(source: "cron" | "http") {
  const runId = crypto.randomUUID();
  console.log(`[${nowIso()}] [${source}] runId=${runId} ⏰ trigger start`);

  // 超时:避免网络卡住导致任务悬挂
  const controller = new AbortController();
  const timeout = setTimeout(() => controller.abort(), 30_000);

  try {
    const resp = await fetch(RENDER_HOOK_URL, {
      method: "POST", // Render deploy hook 通常 GET/POST 都可,这里用 POST
      signal: controller.signal,
      headers: { "user-agent": "render-auto-deploy/deno" },
    });

    const text = await resp.text().catch(() => "");

    if (!resp.ok) {
      // 抛错 => 让 cron 的 backoffSchedule 生效,自动重试
      throw new Error(
        `Render hook failed: ${resp.status} ${resp.statusText} body=${text.slice(0, 500)}`,
      );
    }

    console.log(
      `[${nowIso()}] [${source}] runId=${runId} ✅ trigger ok body=${text.slice(0, 500)}`,
    );

    return { ok: true, runId, status: resp.status, body: text };
  } finally {
    clearTimeout(timeout);
  }
}

// ====== 定时任务(必须在模块顶层定义,Deno Deploy 才会识别为 Cron)======
Deno.cron(
  "Daily Render Auto Deploy",
  CRON_SCHEDULE,
  // 失败重试节奏(毫秒):1s, 5s, 10s
  { backoffSchedule: [1000, 5000, 10000] },
  async () => {
    try {
      await triggerRenderDeploy("cron");
    } catch (e) {
      console.error(`[${nowIso()}] [cron] ❌`, e);
      throw e; // 继续抛出以触发重试
    }
  },
);

// ====== Web:健康检查 + 手动触发(方便部署后立即验证)======
Deno.serve(async (req) => {
  const url = new URL(req.url);

  // 健康检查:确认服务活着
  if (url.pathname === "/") {
    return new Response(
      `Auto-Deploy is running.\nUTC now: ${nowIso()}\nSchedule(UTC): ${CRON_SCHEDULE}\n`,
      { headers: { "content-type": "text/plain; charset=utf-8" } },
    );
  }

  // 手动触发:GET /trigger
  // 部署完立刻访问一次,看返回里有没有 deploy.id
  if (url.pathname === "/trigger") {
    try {
      const result = await triggerRenderDeploy("http");
      return new Response(JSON.stringify(result, null, 2), {
        headers: { "content-type": "application/json; charset=utf-8" },
      });
    } catch (e) {
      const msg = e instanceof Error ? e.message : String(e);
      return new Response(JSON.stringify({ ok: false, error: msg }, null, 2), {
        status: 500,
        headers: { "content-type": "application/json; charset=utf-8" },
      });
    }
  }

  return new Response("Not found", { status: 404 });
});


📌 转载信息
原作者:
sssun
转载时间:
2026/1/20 10:04:34

缘起

只用服务器搭建 memos 未免太大材小用了,而且也浪费钱。所以就想尽量用无服务器部署 memos。

render

render 由于免费存储空间过低,不是优选。

  • 使用 render 创建 Web Service
  • Image:填写为 neosmemo/memos:stable
  • Environment Variables 分别填入:
    • Key、port
    • Value、5230

保活方式: https://github.com/hoochanlon/keep-alive

zeabur

memos 官方镜像按照如图所示填写相关参数

🖼️ 图片加载失败

使用 hu3rror/memos-litestream (该项目解决了备份换机迁移数据的痛点)项目镜像的填写方式

S3 配置如图及相关解答(建议看完该 issue 链接内容): https://github.com/hu3rror/memos-litestream/issues/67

  • b2

  • memos

CF 代理 B2 配置见(适用于图床、文件管理免流服务): https://github.com/hoochanlon/CF-Proxy-B2

只用 Render 部署 One-API 又没做持久化的话,重启会把配置弄丢,所以最好接个外部 MySQL;SQLPub 提供免费的 MySQL,可以拿来先用


SQLPub 免费 MySQL 可以获得最大 36000 次 / 小时的请求、同时 30 个连接、5GB 公网流量 / 月和 0.5GB 存储空间


部署教程

1. 访问 SQLPub 获取 MySQL 数据库,版本选择 8.0
SQLPub:https://sqlpub.com/


2. 登录 github 后 for 项目 one-api

one-api:GitHub - songquanpeng/one-api: LLM API 管理 & 分发系统,支持 OpenAI、Azure、Anthropic Claude、Google Gemini、DeepSeek、字节豆包、ChatGLM、文心一言、讯飞星火、通义千问、360 智脑、腾讯混元等主流模型,统一 API 适配,可用于 key 管理与二次分发。单可执行文件,提供 Docker 镜像,一键部署,开箱即用。LLM API management & key redistribution system, unifying multiple providers under a single API. Single binary, Docker-ready, with an English UI.


3.github 登录 Render
Render:Render · The Easiest Cloud For All Your Apps


4. 选择 Add new 的 Web Service


5. 选择 for 的 one-api 项目


6. 选择免费计划


7. 环境变量需要填两个参数,一个是端口,一个是连接 MySQL 数据库
PORT=3000

SQL_DSN=:***@tcp(:)/

这是我 MySQL 的信息,按图里这组值,环境变量可填:``

<username> :用户名

*** :密码

@tcp( :TCP 协议标识

<host> :服务器地址

<port> :端口号

)/<database> :数据库名


填入


8. 点击 Deploy web service 开始部署,看我的成品效果


📌 转载信息
原作者:
user554
转载时间:
2026/1/3 11:53:39