部署 shadowsocks-manager

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 在同一服务器上可修改 address 为 127.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 部分设置了站点大部分插件配置:
  • account 中的 pay 用于设置定价。
  • email 负责发送验证及密码找回邮件,可使用 Mailgun 服务配置
  • webgui 负责 webgui 的输出,site 设置为本站点地址,如果没有特别需求可直接按配置中的 80 端口直接对外提供访问。
  • alipay 为支付宝商家当面付接口,可按照 V2EX 贴文指引进行申请签约。签约完成后到蚂蚁金服开放平台密钥页面按照指示完成「RSA(SHA1) 密钥」的设置,将生成的 rsa_private_key.pem 中的私钥填入 merchantPrivateKey,网页中提供的「支付宝公钥」填入 alipayPublicKey,并将 APPID 填入 appid
配置完成后运行以下命令开启 shadowsocks-manager type m:
$ ssmgr -c webgui.yml
此时已经可以通过浏览器访问 http://<前端服务器 IP>:<预设端口> 查看 shadowsocks-manager 是否部署成功,网站架设后注册的首个账户即为管理员身份。

额外

使用 MySQL 替换 SQLite

若需要使用 MySQL 替换默认的 SQLite 作为数据库使用,可在配置 ss.yml 及 webgui.yml 时将 db 部分替换为:
db:
    host: '<MySQL 地址>'
    user: '<MySQL 用户>'
    password: '<MySQL 密码>'
    database: '<MySQL 库名>'

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

前文中 webgui.yml 的 plugins 部分的 webgui 配置默认使用 80 端口直接对外提供 web 访问。
但若为了安全需求要提供服务器端的 HTTPS 支持,或该服务器上需同时提供其他站点的 web 访问服务,可将此处端口变更为 80 及 443 以外的其他端口并参见通过 Apahce 或 nginx 等架设反向代理对外提供 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

评论

此博客中的热门博文

如何讓 Firefox 有不同的設定檔,並讓它們能同時執行,實現帳號多開、區隔不同用途的瀏覽環境?

使用 shadowsocks Manager 搭建 SS 多人管理平台 Debian/Ubuntu