FlexPrice 运维脚本体系实战指南:从订阅批量分配、日历计费迁移到 SDK 版本流水线
【免费下载链接】flexpriceUsage-based pricing and billing for developers Cloud or self-hosted ⚙️ No-code UI Realtime usage metering Credits top-ups Control feature access项目地址https://gitcode.com/gh_mirrors/fl/flexprice点击查看免费下载本篇指南以仓库scripts/目录为核心系统讲解 FlexPrice 自带的运维与开发脚本体系如何使用go run scripts/main.go驱动订阅批量分配、价格同步、事件播种、CSV 驱动计费迁移等命令如何理解Flags → Env → os.Getenv的统一设计以及 CI 中 SDK 版本号管理三件套next-sdk-version.sh、sync-sdk-version-to-gen.sh、sync-gen-to-output.sh如何与Makefile协作。读完本文你可以直接复现所有命令用法并掌握向该脚本体系安全新增自定义脚本的完整规范。脚本目录概览FlexPrice 的脚本体系分布在三个层次scripts/main.go统一入口注册所有命令、解析共享 flag 并将其写入环境变量scripts/internal/核心脚本实现每个关注点一个文件如 assign_plan.go、seed_events.goscripts/local/未注册进main.go、或仅限特定环境运行的脚本如 migrate_subscription_line_items.go。此外还有一批 Shell/Node 脚本直接挂在scripts/根目录负责 SDK 版本流水线、白标配置生成、Swagger 修复等 CI 任务。统一入口scripts/main.go 与通用用法所有 Go 脚本共用 scripts/main.go 这一个入口程序它定义了Command结构体Name、Description、Run func() error并在commands切片中集中注册type Command struct { Name string Description string Run func() error }列出所有命令go run scripts/main.go -list会打印commands切片中注册的全部命令及描述格式为%-20s %s命令名左对齐 20 字符。从源码看当前注册的命令远多于 README 列举的 7 个完整清单包括命令名用途seed-events向 ClickHouse 播种事件数据seed-events-by-meters按 meter 向 ClickHouse 播种事件generate-apikey生成新的 API keygenerate-dev-token生成短期 JWT 供内部开发测试-expiry-hours默认 1 小时assign-tenant为用户分配租户onboard-tenant引导开通新租户migrate-subscription-line-items迁移订阅行项目注册自local包migrate-environments迁移实体以使用 environment_idsync-billing-customers同步计费客户import-pricing导入定价数据assign-plan为未订阅指定计划的客户批量创建订阅add-new-user向租户添加新用户add-environment为已有租户添加环境development/productionmigrate-invoice-sequences迁移发票序列以支持环境隔离migrate-to-addon将计划费用迁移为附加组件addonprocess-csv-features从 CSV 为 serverless 计划创建 feature 与 pricecredit-usage-report生成租户/环境内客户的积分用量报告import-features从 CSV 文件导入 featuremigrate-cga迁移存量 Credit Grant Applications补齐 environment_idsync-price-to-subscriptions通过新建行项目将价格同步到同计划同开始日期的所有订阅setup-draft-invoices从 JSON 文件为订阅创建草稿发票并触发处理工作流setup-dummy-billing-customer创建演示计费客户默认 1 个含订阅、100 美元钱包充值、500 条 meter 事件Postgres Kafkareplay-events-csv通过POST /v1/events/bulk按-batch-size批量重放 CSV 中的事件保留 event_id、时间戳、事件名、来源、属性运行指定命令go run scripts/main.go -cmd command-name [flags...]未指定-cmd时程序会以log.Fatal退出并提示使用-list查看命令名不匹配时同样会终止。Flags → Env 的桥接机制main.go中每个共享 flag 在flag.Parse()之后都会做一次os.Setenv源码中均带// #nosec G104注释标注为 seed 工具、非生产用途例如-tenant-id→TENANT_ID-environment-id→ENVIRONMENT_ID-plan-id→PLAN_ID-file-path→FILE_PATH-dry-run→DRY_RUN-worker-count→WORKER_COUNT-api-key→ 同时写入SCRIPT_FLEXPRICE_API_KEY与FLEXPRICE_API_KEY-effective-date→EFFECTIVE_DATE-failed-output→FAILED_OUTPUT_PATH-success-output→SUCCESS_OUTPUT_PATH-api-base-url→API_BASE_URL-batch-size→BATCH_SIZE默认100上限 1000因此所有脚本实现内部只通过os.Getenv读取配置而不是直接解析 flag。这意味着每个脚本既可接收命令行 flag也可直接以环境变量方式运行两种方式完全等价。命令专属 flag 同样遵循此模式。实战一assign-plan 批量分配计划assign-plan是 README 中首个详细讲解的脚本目标是把某个具体计划分配给所有尚未订阅该计划的客户。用法与示例go run scripts/main.go -cmd assign-plan -tenant-id tenant_id -environment-id environment_id -plan-id plan_id示例来自 scripts/README.mdgo run scripts/main.go -cmd assign-plan -tenant-id tenant_123 -environment-id env_456 -plan-id plan_01JV2ZF6B57XZ7MRW72Q2QWQ98执行流程对照 assign_plan.go 的实现脚本依次完成参数校验读取TENANT_ID、ENVIRONMENT_ID、PLAN_ID任一为空立即报错随后校验计划确实属于该租户p.TenantID ! tenantID时报错退出。列出全部客户通过customerRepo.ListAll配合types.NewNoLimitQueryFilter()获取租户/环境下的全部客户无分页上限。查重以PlanID过滤现有订阅仅统计Active、Trialing、Paused三种状态构建customersWithPlan映射避免重复创建。逐客户创建订阅每个客户之间time.Sleep(100 * time.Millisecond)做限速跳过不满足条件的客户不在指定租户/环境、状态非StatusPublished、已有该计划。使用默认订阅参数来自 scripts/README.md 与 assign_plan.go参数默认值CurrencyUSDusdBilling CadenceRECURRINGBilling PeriodMONTHLYBilling Period Count1Billing CycleCALENDARStart Date当前时间UTC输出日志脚本通过log.Printf输出关键统计assign_plan.go处理的客户总数Total processed成功创建的订阅数Total created跳过的客户数Total skipped原因含已订阅、状态非活跃、不属于指定租户/环境出错数Total errors例如订阅创建失败初始化链路脚本通过newAssignPlanScript()完成依赖装配这条链路代表了所有 internal 脚本的通用模式config.NewConfig()→logger.NewLogger(cfg)→clickhouse.NewClickHouseStore事件仓储→postgres.NewEntClients→postgres.NewClient→cache.NewInMemoryCache()/cache.NewRedisCache()→entRepo.New*Repository系列 → 组装service.ServiceParams→ 实例化service.NewSubscriptionService(serviceParams)。注意这里会同时初始化 ClickHouse 与 Redis 缓存客户端因此运行前需保证这些基础组件的连接配置可用。实战二同步计划价格到订阅README 记录的sync-plan-prices用于“将计划的所有价格同步到已有订阅”。在 main.go 中与之对应注册的命令名为sync-price-to-subscriptionsgo run scripts/main.go -cmd sync-price-to-subscriptions -tenant-id tenant_id -environment-id environment_id -plan-id plan_id其实现位于 sync_price_to_subscriptions.go核心思路是找到与目标计划相同、且开始日期一致的订阅通过**新建订阅行项目line items**的方式把价格同步进去命令描述原文“Sync a price to all subscriptions with the same plan and start date by creating new line items”。运行前需先通过-list确认当前版本注册的命令名避免与文档历史名称混淆。实战三migrate-calendar-billing-csv 日历计费迁移这是脚本体系中唯一直接调用 Flexprice HTTP API而非本地数据库的命令用于将 CSV 中列出的订阅迁移到“月度 日历计费calendar billing”模式。README 对其有详细说明以下完整展开。工作原理对 CSV 中的每个订阅 ID调用取消 API 安排订阅在scheduled_date取消proration none再创建一个新的月度日历计费订阅。注意两点取消与创建是两次独立请求——如果创建失败而取消已成功会留下部分完成状态客户处于取消流程但没有新订阅公开取消 API不暴露 webhook 抑制开关因此取消时会触发正常的 webhook 行为迁移过程需接受这一点。认证与基础 URL参数环境变量说明-api-key必填SCRIPT_FLEXPRICE_API_KEY或FLEXPRICE_API_KEY以x-api-key请求头发送-api-base-url可选API_BASE_URL默认https://api.cloud.flexprice.io/v1必须包含/v1-environment-id可选ENVIRONMENT_ID以X-Environment-ID请求头发送适用于 API key 未固定环境时租户与环境的归属完全来自 API key以及可选的X-Environment-ID因此 CSV 中只需包含订阅 ID不包含租户信息。CSV 格式带表头首行包含id或subscription_id列后续每行读取该列值无表头每行单列第一列即订阅 ID。完整用法go run scripts/main.go -cmd migrate-calendar-billing-csv \ -api-key api_key \ -file-path /path/to/subs.csv \ -effective-date 2026-04-01 \ -success-output /path/to/successful.csv \ -failed-output /path/to/failed.csv \ -dry-run false \ -worker-count 3参数要点EFFECTIVE_DATE必须是未来时间订阅取消校验的硬性要求格式支持 RFC3339 或YYYY-MM-DD成功行校验通过或迁移完成默认追加写入successful_calendar_billing_migration.csv可通过-success-output/SUCCESS_OUTPUT_PATH覆盖失败行写入-failed-output/FAILED_OUTPUT_PATH成功输出 CSV 的列结构为original_subscription_id, customer_id, plan_id, currency, effective_date, new_subscription_id, mode其中mode取值为dry_run或migrated-worker-count缺省时该命令默认3个并发 worker其他脚本不受影响仍使用各自默认值本地调试可指定-api-base-url http://localhost:8080/v1。等价环境变量SCRIPT_FLEXPRICE_API_KEY或FLEXPRICE_API_KEY、API_BASE_URL、FILE_PATH、EFFECTIVE_DATE、ENVIRONMENT_ID、SUCCESS_OUTPUT_PATH、FAILED_OUTPUT_PATH、DRY_RUN、WORKER_COUNT均可替代对应 flag。实战四事件播种与测试数据seed-eventsseed-events将事件数据写入 ClickHouse实现在 seed_events.go。其事件生成器EventGenerator支持两种客户来源未传入客户列表时使用内置示例 ID如cus_01HKG8QWERTY123传入客户列表时改用真实客户的ExternalID。事件生成逻辑与 meter 配置强绑定对sum/avg聚合类型的 meter会为聚合字段生成 11000 的随机数值对配置了过滤器filter的 meter会从filter.Values中随机取值时间戳则生成在最近 72 小时内。生成过程使用rate限流与并发控制代码中明确标注为 seed 工具、非生产用途。setup-dummy-billing-customer一键创建演示计费客户默认 1 个可用-customer-count调整每个客户附带一条订阅、100 美元钱包充值、500 条 meter 事件写入 Postgres Kafka。适合本地联调计费全链路。replay-events-csv将 CSV 中的历史事件通过POST /v1/events/bulk批量重放默认-batch-size 100上限 1000并完整保留event_id、timestamp、event_name、source、properties字段。可配合-external-customer-id、-event-name、-start-time、-end-time等过滤条件使用对应reprocess-events场景。其他常用运维命令速查generate-apikey生成新 API key输出原始 key、哈希后的配置片段写入config.yaml的auth.api_key.keys以及等价环境变量FLEXPRICE_AUTH_API_KEY_KEYS。可传-user-id、-tenant-id不传SCRIPT_FLEXPRICE_API_KEY时内部调用auth.GenerateAPIKey()自动生成原始 key再用auth.HashAPIKey哈希存储见 scripts.go。assign-tenant通过auth.NewProvider(cfg).AssignUserToTenant将租户绑定到用户-user-id、-tenant-id。onboard-tenant引导开通新租户涉及真实 webhook/内存 pubsub可能产生 webhook 副作用。migrate-subscription-line-items订阅行项目迁移注册自scripts/local包属于环境相关脚本。import-pricing / import-features分别从 JSON/CSV 导入定价与 feature 数据。process-csv-features按 CSV 批量创建 meter、feature、price支持 serverless/dedicated 计划见 csv_feature_processor.go。SDK 版本流水线三个脚本与 Makefile 的协作CI 与本地发布依赖三个脚本保证每次生成的 SDK 版本唯一、发布不冲突。1. next-sdk-version.sh —— 计算下一个版本./scripts/next-sdk-version.sh [major|minor|patch] [baseVersion]默认 bump 级别为patch省略baseVersion时从.speakeasy/sdk-version.json读取当前版本文件缺失时回退0.0.1CI 场景下baseVersion可来自 npm registry如npm view flexprice-ts version确保下一个版本永远高于已发布版本支持x.y.z及带预发布后缀的 semver 解析bump 前剥离后缀输出形如0.0.7只打印不写入。2. sync-sdk-version-to-gen.sh —— 写入中央版本配置./scripts/sync-sdk-version-to-gen.sh VERSION将给定版本写入.speakeasy/gen/go.yaml、.speakeasy/gen/typescript.yaml、.speakeasy/gen/python.yaml、.speakeasy/gen/mcp.yaml以sed替换首个version:行以及.speakeasy/sdk-version.json以jq更新.version字段。必须在生成generate之前执行Makefile的sdk-all目标会自动完成这一步。3. sync-gen-to-output.sh —— 分发生成配置./scripts/sync-gen-to-output.sh将中央配置.speakeasy/gen/lang.yaml复制到各目标目录api/lang/.speakeasy/gen.yaml覆盖 go、typescript、python、mcp 四种语言让 Speakeasy CLI 在每个输出目录都能找到配置。Makefile 中的完整流水线查看 Makefile 中sdk-all与相关目标约 L496-L710可看到三者的真实协作顺序sdk-all: VER$${VERSION:-$$(./scripts/next-sdk-version.sh patch)}; \ ./scripts/sync-sdk-version-to-gen.sh $$VER \ $(MAKE) speakeasy-validate speakeasy-generate merge-custom fix-mcp-package-name sync-gen-to-output: ./scripts/sync-gen-to-output.sh speakeasy-generate: speakeasy-validate filter-mcp-spec sync-gen-to-output即next-sdk-version.sh计算出新版本 →sync-sdk-version-to-gen.sh写入中央配置 →speakeasy-validate校验 →filter-mcp-spec过滤 MCP 规格使用 docs/swagger/swagger-3-0-mcp.json→sync-gen-to-output.sh分发配置 →speakeasy-generate执行生成。本地运行时优先使用make sdk-all-local它会加载.secrets中的SPEAKEASY_API_KEY后再调用sdk-all。脚本依赖装配与副作用控制所有 internal 脚本共享一套依赖装配模式以 assign_plan.go 为典型配置与基础设施config.NewConfig()→logger.NewLogger(cfg)→postgres.NewEntClientspostgres.NewClient事件相关脚本另接clickhouse.NewClickHouseStore缓存内存缓存cache.NewInMemoryCache()与cache.NewRedisCache()并存仓储按需选用如 plan/meter/feature 用内存缓存customer/subscription/price 用 Redis 缓存仓储entRepo.New*Repository系列 chRepo.New*Repository系列服务层组装service.ServiceParams较轻量脚本只填部分字段较重脚本如assign-plan会填充完整字段后实例化业务服务十租户上下文脚本内部统一通过context.WithValue(ctx, types.CtxTenantID, tenantID)与types.CtxEnvironmentID注入租户/环境上下文确保仓储层查询被正确隔离。关于副作用README 明确给出建议不应当触发 webhook 的脚本优先使用mockWebhookPublisher定义于 csv_feature_processor.go其PublishEvent/PublishWebhook/Close均为 no-op避免脚本运行时向外部发送真实 webhook只有确实需要 webhook 行为的脚本如 onboarding才使用真实 webhook/内存 pubsub。新增脚本的开发规范根据 scripts/README.md 的 Development 章节新增脚本遵循三步在scripts/internal/中实现脚本函数func MyScript() error或写成薄封装构建参数后调用私有run需要时在同一包内添加辅助函数文件按关注点拆分如 assign_plan.go、migrate_billing_cycle.go 风格。在 scripts/main.go 的commands切片中注册命令NameDescriptionRun如有新 flag在main.go中定义并通过os.Setenv映射到环境变量脚本内只读os.Getenv。更新 scripts/README.md补充用法说明若实现方式有特殊之处在How scripts are structured一节追加简短说明。对于不注册进main.go或环境专属的脚本放入 scripts/local/如 Postgres 同步脚本 posthog_sync.py 及 migrate_subscription_line_items.go。小结FlexPrice 的脚本体系设计上刻意统一单一入口、flag 与环境变量双通道、仓储与服务层直接复用、上下文统一注入租户/环境。运维人员可以据此安全执行批量订阅分配、价格同步与计费迁移开发人员则能在数分钟内新增一个与现有体系风格一致的运维命令。涉及 SDK 发布时三条 Shell 脚本 Makefile目标构成了一条可复用的版本管理流水线值得在 CI 中直接采纳。赞分享【免费下载链接】flexpriceUsage-based pricing and billing for developers Cloud or self-hosted ⚙️ No-code UI Realtime usage metering Credits top-ups Control feature access项目地址https://gitcode.com/gh_mirrors/fl/flexprice点击查看免费下载相关推荐ok-ww 鸣潮自动战斗指南3 步从安装到后台挂机ok ww 鸣潮自动战斗指南3 步从安装到后台挂机 ok ww 是一款基于图像识别的鸣潮免费自动化工具核心解决自动战斗、刷声骸、一键日常这三类每天要耗掉几十GUI 自动化计算机视觉RPA人工智能Polar TypeScript SDK 从 1.0.0 版本迁移到版本化 SDK 完整实战指南Polar TypeScript SDK 从 1.0.0 版本迁移到版本化 SDK 完整实战指南 本文面向所有依赖 polar sh/sdk1.0.0 、后端前端金融科技Flexprice Temporal 订阅计费架构实战从 Cron 任务到可观测的工作流编排Flexprice Temporal 订阅计费架构实战从 Cron 任务到可观测的工作流编排 导读 本文围绕 Flexprice 开源仓库中 temporal上一篇repo-automation-bots社区贡献指南如何参与这个Google开源项目下一篇Emscripten渐进式加载架构设计模块划分创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考