部署 shadowsocks-manager
Table of Contents

shadowsocks-manager 是一个 Shadowsocks 多用户及流量管理面板。

本文操作在 root 账户下进行,如使用非 root 账户请自行注意权限。

概述

shadowsocks-manager 分别有 m 和 s 两种运行模式(type),type s 运行于后端 shadowsocks 服务器,type m 运行于前端向用户及管理员提供 webgui 页面并通过与后端 type s 通讯以实现对后端 shadowsocks 服务的管理。

安装 shadowsocks-manager

前后端服务器均需安装 shadowsocks-manager,该程序依赖 Node.js 6.x 运行。

Node.js 6.x 安装

运行下面命令安装 Node.js 6.x 版本:

$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
$ apt-get install -y nodejs

shadowsocks-manager 安装

通过 npm 安装 shadowsocks-manager:

$ npm i -g shadowsocks-manager

配置后端 shadowsocks 服务

shadowsocks-manager 支援 shadowsocks-python 及 shadowsocks-libev,并强烈推荐使用 shadowsocks-libev 作为后端,下文以 shadowsocks-libev 为例。

安装 shadowsocks-libev

Ubuntu 16.10 以上用户可直接通过 apt 安装:

$ apt-get install shadowsocks-libev

Ubuntu 16.04 用户则需要通过官方 repo 脚本安装,首先获取源代码:

$ git clone https://github.com/shadowsocks/shadowsocks-libev.git
$ cd shadowsocks-libev
$ git submodule update --init --recursive

然后运行脚本:

$ mkdir -p ~/build-area/
$ cp ./scripts/build_deb.sh ~/build-area/
$ cd ~/build-area
$ ./build_deb.sh

运行 shadowsocks-libev

运行命令启动 shadowsocks-libev 的 manager API 服务:

$ ss-manager -m aes-256-cfb -u --manager-address 127.0.0.1:4000

其中 -m 参数为加密方式,--manager-address 参数为 API 监听地址。

若使用 shadowsocks-python 版本,则此处 manager API 命令可能需作修改。

运行 type s 的 shadowsocks-manager

~/.ssmgr 下建立 ss.yml 作为 type s 的配置文件:

$ mkdir ~/.ssmgr
$ vim ~/.ssmgr/ss.yml

配置内容如下:

type: s
empty: false

shadowsocks:
    address: 127.0.0.1:4000

manager:
    address: 0.0.0.0:4001
    password: 'YOURPASSWD'

db: 'ss.sqlite'

此配置文件中的 shadowsocks 部分负责与 shadowsocks-libev 的 manager API 服务进行通讯,所以其中的 address 需要与上文中的 API 监听地址保持一致。

manager 部分负责与前端的 shadowsocks-manager type m 进行通讯,若前端 type m 与后端 type s 在同一服务器上可修改 address127.0.0.1:4001 只监听本机通讯,若不在同一服务器则保持原样(端口可自行修改只需注意与后文一致);password 部分自行修改确保安全。

配置完成后运行以下命令开启 shadowsocks-manager type s:

$ ssmgr -c ss.yml

配置前端 webgui 服务

~/.ssmgr 下建立 webgui.yml 作为 type m 的配置文件:

$ mkdir ~/.ssmgr
$ vim ~/.ssmgr/webgui.yml

配置内容如下:

type: m
empty: false

manager:
    address: <后端地址>:4001
    password: 'YOURPASSWD'

plugins:
    flowSaver:
        use: true
    user:
        use: true
    account:
        use: true
        pay:
            hour:
                price: 0.03
                flow: 500000000
            day:
                price: 0.5
                flow: 7000000000
            week:
                price: 3
                flow: 50000000000
            month:
                price: 10
                flow: 200000000000
            season:
                price: 30
                flow: 200000000000
            year:
                price: 120
                flow: 200000000000
    email:
        use: true
        username: 'username'
        password: 'password'
        host: 'smtp.your-email.com'
    webgui:
        use: true
        host: '0.0.0.0'
        port: '80'
        site: '<站点地址>'
        gcmSenderId: '456102641793'
        gcmAPIKey: 'AAAAGzzdqrE:XXXXXXXXXXXXXX'
    alipay:
        use: true
        appid: <支付宝 APPID>
        notifyUrl: ''
        merchantPrivateKey: '<rsa_private_key.pem 中的私钥>'
        alipayPublicKey: '<支付宝公钥>'
        gatewayUrl: 'https://openapi.alipay.com/gateway.do'

db: 'webgui.sqlite'

其中 manager 部分负责与 type s 进行通讯,将 address 设置为运行 type s 的服务器公网地址,另外注意 address 端口部分及 password 需要与前文中 type s 部分的设置保持一致。

plugins 部分设置了站点大部分插件配置:

配置完成后运行以下命令开启 shadowsocks-manager type m:

$ ssmgr -c webgui.yml

此时已经可以通过浏览器访问 http://<前端服务器 IP>:<预设端口> 查看 shadowsocks-manager 是否部署成功,网站架设后注册的首个账户即为管理员身份。

额外

使用 MySQL 替换 SQLite

若需要使用 MySQL 替换默认的 SQLite 作为数据库使用,可在配置 ss.ymlwebgui.yml 时将 db 部分替换为:

db:
    host: '<MySQL 地址>'
    user: '<MySQL 用户>'
    password: '<MySQL 密码>'
    database: '<MySQL 库名>'

提供 HTTPS 或与其他站点共存(推荐)

前文中 webgui.ymlplugins 部分的 webgui 配置默认使用 80 端口直接对外提供 web 访问。

但若为了安全需求要提供服务器端的 HTTPS 支持,或该服务器上需同时提供其他站点的 web 访问服务,可将此处端口变更为 80443 以外的其他端口并参见通过 Apahcenginx 等架设反向代理对外提供 web 服务。

后台运行

参见使用 supervisor 守护进程或项目 Wiki 页面提供的通过 pm2 后台运行

请注意使用 supervisor 守护进程中使用的 shadowsocks-manager 为旧版,配置文件均有变化。

如发生 Cannot find module … node_sqlite3.node 错误

这是由于通过 npm 安装 shadowsocks-manager 时没有成功安装依赖的 sqlite3 所导致的,到 shadowsocks-manager 安装目录补装 sqlite3 即可解决:

$ cd /usr/lib/node_modules/shadowsocks-manager/
$ npm install sqlite3 --save