RootPanel icon indicating copy to clipboard operation
RootPanel copied to clipboard

想把服务插件所提供的「资源」抽象一下

Open jysperm opened this issue 11 years ago • 5 comments

现在例如 shadowsocks 的帐号,Nginx 的站点,都是插件自行维护的。最好可以将这种东西抽象出来,名字我还没想好。总之这种东西和账户是多对一的关系,未来可以运行账户之间共享它,或在账户和节点间进行转移所有权。

jysperm avatar Nov 09 '14 22:11 jysperm

重新梳理一下我的思路,这次重构也是之后实现多节点的一个重要基础。

将计费的功能完全移到 plan 上,让 plan 成为一个重量级的东西。按时长计费的套餐不需要修改,按量计费的套餐改成:plugin 来发送用量消息,plan 通过 hook 来捕捉用量消息并进行计费。

将插件提供的服务抽象为一个 ... 暂时用「元件(component)」这个词好了。元件可以是一个 shadowsocks 帐号,一个 Nginx 站点,一个 PHP-FPM 进程等等。元件可以在用户之间被交叉授权,即一个用户建立了一个元件,他可以将这个元件授权给其他用户来操作。元件实际运行于一台物理服务器上,但可以在不同的物理服务器上进行转移,例如一个 shadowsocks 帐号可以被从美国节点移到日本节点。

jysperm avatar Nov 10 '14 03:11 jysperm

~~多节点支持:~~

~~面板位于主节点,主节点通过 SSH 连接到从节点的 agent 上,然后通过 stdin 和 stdout 传输 JSON 格式的数据。~~

jysperm avatar Nov 10 '14 06:11 jysperm

配置文件:

# 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 

jysperm avatar Nov 20 '14 06:11 jysperm

可以在安装文档上面加上注释吗?有点不懂

forestzhang945 avatar Feb 03 '15 08:02 forestzhang945

会的,不过需要点时间

jysperm avatar Feb 03 '15 09:02 jysperm