想把服务插件所提供的「资源」抽象一下
现在例如 shadowsocks 的帐号,Nginx 的站点,都是插件自行维护的。最好可以将这种东西抽象出来,名字我还没想好。总之这种东西和账户是多对一的关系,未来可以运行账户之间共享它,或在账户和节点间进行转移所有权。
重新梳理一下我的思路,这次重构也是之后实现多节点的一个重要基础。
将计费的功能完全移到 plan 上,让 plan 成为一个重量级的东西。按时长计费的套餐不需要修改,按量计费的套餐改成:plugin 来发送用量消息,plan 通过 hook 来捕捉用量消息并进行计费。
将插件提供的服务抽象为一个 ... 暂时用「元件(component)」这个词好了。元件可以是一个 shadowsocks 帐号,一个 Nginx 站点,一个 PHP-FPM 进程等等。元件可以在用户之间被交叉授权,即一个用户建立了一个元件,他可以将这个元件授权给其他用户来操作。元件实际运行于一台物理服务器上,但可以在不同的物理服务器上进行转移,例如一个 shadowsocks 帐号可以被从美国节点移到日本节点。
~~多节点支持:~~
~~面板位于主节点,主节点通过 SSH 连接到从节点的 agent 上,然后通过 stdin 和 stdout 传输 JSON 格式的数据。~~
配置文件:
# plan 将转为一个重量级的概念,在代码中会抽象名为 `billing.Plan` 的对象
plan:
rpvhost:
# 被允许的元件
available_components:
linux:
# 限制:只能创建一个 linux 帐号
limit: 1
# 默认创建一个和用户名同名的帐号
default: (account) ->
return username: account.username
# 计费方式
billing:
# 按时间计费
time:
# 每 24 小时计费一次
interval: 24 * 3600 * 1000
price: 10 / 30
# 预付费
prepaid: true
# 资源限制
resource_limit:
memory: 50
shadowsocks:
available_components:
shadowsocks:
limit: 1
billing:
# 根据 shadowsocks 的元件发送的流量消息,每 100M 扣 0.06 元
'shadowsocks.traffic':
bucket: 100 * 1000 * 1000
price: 0.06
# node 用于配置多节点,在代码中抽象为 `clusters.Node` 对象
node:
us1:
ip: 'us1.rpvhost.net'
master: true
# 这个节点只能运行这些元件
available_components: ['linux']
jp1:
ip: 'jp1.rpvhost.net'
available_components: ['shadowsocks']
component 信息由插件注册到 RootPanel 中:
shadowsocks:
# Shadowsocks 不允许授权给其他账户
coworker_limit: 0
supervisor:
# Supervisor 必须依赖于一个 Linux 元件
depend_on: ['linux']
数据库中的 components 集合:
component_name: 'shadowsocks'
# 用户自定义的用于显示的名字
name: ''
account_id: ObjectID
# 用户可以将元件授权给其他用户
coworkers: [
account_id: ObjectID
role: 'readonly' or 'readwrite'
]
# 元件本身的信息
payload: {}
# 所在的物理节点
physical_node: 'us1'
# 该元件的依赖
dependencies:
linux: ObjectID
可以在安装文档上面加上注释吗?有点不懂
会的,不过需要点时间