<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
	<title>极客净土</title>
	<link>https://shig.wodemo.net/</link>
        <item>
        <title><![CDATA[Shadowsocks配置v2ray-plugin/套cf]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/537416]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Sat, 03 Jul 2021 16:54:12 +0800]]></pubDate>
        <description><![CDATA[Shadowsocks配置v2ray-plugin/套cloudflare
			
				2019-10-10
												分类：学无止境
				阅读(12226)				评论(11)
				
			
		
				
						首先要准备一个域名并接入到CloudFlare。这些步骤就不多BB了，省略。。。
开始我们可以先只使用CloudFlare的DNS，不开启CDN功能，即CF界面的那个云朵的图标改成灰色，显示DNS only即可。
这样做的用意是：
1.如果一开始就套CF的CDN，速度不理想，特别是晚上的时候，看个1080P估计都够呛。
2.一般需要套CDN的时候，都是小鸡的IP被墙了再开启，这样就可以救活小鸡了，说白了就是个救急的办法，不到万不得已没有必要套CDN。
利用v2ray-plugin，我们可以实现这样一套配置：shadowsocks+websocket+tls+nginx。
以下步骤Debian9/10/Ubuntu18.04/19.04通用，首先安装需要用到的软件：
apt -y install shadowsocks-libev libsodium-dev python-certbot-nginx nginx
安装v2ray-plugin：
wget https://github.com/shadowsocks/v2ray-plugin/releases/download/v1.2.0/v2ray-plugin-linux-amd64-v1.2.0.tar.gz
tar -xzvf v2ray-plugin-linux-amd64-v1.2.0.tar.gz
mv v2ray-plugin_linux_amd64 /usr/bin/v2ray-plugin
rm -rf v2ray-plugin-linux-amd64-v1.2.0.tar.gz
编辑shadowsocks-libev的配置文件：
nano /etc/shadowsocks-libev/config.json
修改为：
{
    "server":["::1", "127.0.0.1"],
    "mode":"tcp_and_udp",
    "server_port":51234, # shadowsocks服务port
    "local_port":1080,
    "password":"你的SS连接密码",
    "timeout":60,
    "method":"chacha20-ietf-poly1305",
    "plugin":"v2ray-plugin", # 加载v2ray插件
    "plugin_opts":"server;path=/woweizhangzhexu1s;loglevel=none" # v2ray插件配置
}
重启shadowsocks-libev：
systemctl restart shadowsocks-libev
systemctl enable shadowsocks-libev
接着新建一个nginx站点配置文件：
nano /etc/nginx/conf.d/shadowsocks.conf
只需写入下面的配置即可：
server {
    listen       80;
    server_name  web.sn0w.observer; # 换成你自己的域名

location /woweizhangzhexu1s { # v2ray插件配置的path
    proxy_pass                  http://127.0.0.1:51234; # shadowsocks服务port
    proxy_redirect              off;
    proxy_http_version          1.1;
    proxy_set_header Upgrade    $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host       $http_host;
    }
}
剩下的申请SSL证书/配置SSL都交给certbot帮我们自动处理：
certbot --nginx --agree-tos --no-eff-email --email xxxxx@qq.com
在certbot配置过程中提示我们是否要强制SSL的时候选择2：
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
服务端这边就配置好了，接下来是客户端，首先要下载v2ray-plgun的win版本，下载地址：
https://github.com/shadowsocks/v2ray-plugin/releases
文件解压到shadowsocks软件的根目录（运行目录），如图所示：

shadowsocks客户端配置如下：
服务器地址：你的域名
服务器端口：443（切记这里的端口是nginx监听的443端口）
密码：你在服务端上配置的密码
加密：你在服务端上配置的加密方式
插件程序：v2ray-plugin_windows_amd64
插件选项：tls;host=web.sn0w.observer;path=/woweizhangzhexu1s
注：host换成你自己的域名，path后面的路径对应nginx上面的配置以及服务端上的配置。
如图所示：

假设某一天我们小鸡的IP被墙了，此时我们只需要再多做2个步骤即可救活小鸡，首先在CloudFlare把域名接入CDN，然后在SSL/TLS界面把配置改成Full(strict)即可：

		]]></description>
    </item>
        <item>
        <title><![CDATA[部署V2Board并对接XrayR后端]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/537016]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Mon, 10 May 2021 08:52:51 +0800]]></pubDate>
        <description><![CDATA[部署v2board面板
咱用的系统是debian10，先来装v2board，建议内存至少1gb。
如果机器内存小于1gb可以尝试挂个swap上去，说不定在安装依赖的时候能够强行怼过去：
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
安装nginx/mariadb/redis和一些需要用到的工具：
apt -y update
apt -y install curl wget git unzip nginx mariadb-server redis-server supervisor
安装php：
apt -y install php7.3-common php7.3-cli php7.3-fpm \
php7.3-gd php7.3-mysql php7.3-mbstring php7.3-curl \
php7.3-xml php7.3-xmlrpc php7.3-zip php7.3-intl \
php7.3-bz2 php7.3-bcmath php-redis
安装composer：
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/bin/composer
启动所有需要用到的服务并设置开机自启：
systemctl enable --now nginx mariadb redis-server php7.3-fpm supervisor
[重要]由于之前安装了php的redis扩展，这里需要重启fpm才能生效：
systemctl restart php7.3-fpm
初始化数据库：
mysql_secure_installation
创建一个名为v2board的数据库和用户：
mysql -u root -p
CREATE DATABASE v2board CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON v2board.* TO v2board@localhost IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
quit
拉取项目源码：
cd /var/www
git clone https://github.com/v2board/v2board.git
cd v2board
安装依赖：
composer install
安装v2board：
php artisan v2board:install
按照下图来填写数据库连接信息以及设置管理员账号密码：

[重要]给予正确的权限：
chown -R www-data:www-data /var/www/v2board
chmod -R 755 /var/www/v2board
新建nginx站点配置文件：
nano /etc/nginx/conf.d/v2board.conf
写入如下配置：
server {
    listen      80;
    server_name v2board.ohshit.club;
    root        /var/www/v2board/public;
    index       index.php;
    client_max_body_size 0;

    location /downloads {
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    }
}
由于v2board的前端资源文件比较大，务必启用gzip进行压缩，不然访问的时候可能很慢：
nano /etc/nginx/nginx.conf
去掉下面这些配置的注释：
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
重载nginx使其生效：
systemctl reload nginx
安装certbot：
apt -y update
apt -y install snapd
snap install core
snap refresh core
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
使用certbot签发ssl证书：
certbot --nginx
添加计划任务：
crontab -e
写入如下配置：
* * * * * php /var/www/v2board/artisan schedule:run >> /dev/null 2>&1
新建supervisor配置文件用于守护v2board的队列任务：
nano /etc/supervisor/conf.d/v2board.conf
写入如下配置：
[program:v2board]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/v2board/artisan queue:work --queue=send_email,send_telegram,stat_server
numprocs=4
user=www-data
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/v2board/storage/logs/queue.log
启动v2board的队列任务：
supervisorctl update
查看队列任务状态：
supervisorctl status
确保全部都是运行状态：
v2board:v2board_00               RUNNING   pid 18665, uptime 7:53:33
v2board:v2board_01               RUNNING   pid 18664, uptime 7:53:33
v2board:v2board_02               RUNNING   pid 18667, uptime 7:53:33
v2board:v2board_03               RUNNING   pid 18666, uptime 7:53:33
至此，v2board面板就搭建完成了，访问你的域名应该能够打开v2board的首页，在域名后面加上/admin即可访问后台管理面板。
对接XrayR后端节点
这里先介绍比较常用的对接方法，既使用xrayr内置的tls设置。后续单独水一篇把tls交给nginx处理的文章。
xrayr内置的证书申请支持很多方法，这里我使用dns的方式，因为这个方法不需要用到80端口，如果在和v2board面板同一台机器上部署xrayr后端的话，80端口肯定是被nginx占用了的，这会导致证书申请失败。
这里我使用的dns服务商是cloudflare，假设你和我使用同一个dns服务商，你有一个node1.ohshit.club的域名。
你现在需要在cloudflare创建一个api，创建步骤可以参考：
Xray前置SNI分流/回落WebSocket+CDN

接着打开v2board面板，在“系统设置-站点”，填写好站点url和订阅url：

[重要]在“服务端”填写通讯密钥，这将是v2board和xrayr后端对接的凭据：

在“权限组管理”添加一个权限组：

在“节点管理”添加一个v2ray节点，为了避免机器被墙，这里建议添加websocket节点，并且启用tls：

关于节点添加这里有几个需要注意的事项：
1.端口是在v2board面板上指定，你指定什么端口xrayr就以什么端口监听。比如我在v2board上配置8443端口，那么xrayr就会监听8443端口。
2.没有特殊情况，连接端口和服务端口一律保持一致。（特殊情况的配置另外开一篇文章详细说明）
3.websocket节点，务必添加path：
{
  "path": "/sometimesnaive"
}
如图所示：

现在下载解压xrayr后端：
mkdir /opt/xrayr && cd /opt/xrayr
wget https://github.com/XrayR-project/XrayR/releases/download/v0.5.0/XrayR-linux-64.zip
编辑xrayr配置文件：
nano config.yml
改为如下配置，需要改动的重要部分都写了注释：
Log:
  Level: debug
  AccessPath: ./access.log
  ErrorPath: ./error.log
DnsConfigPath: ./dns.json
Nodes:
  -
    PanelType: "V2board" // 面板类型
    ApiConfig:
      ApiHost: "https://v2board.ohshit.club/" // v2board面板的地址，域名结尾一定要加/
      ApiKey: "imlalaimlalaimlala" // v2board面板内配置的通讯密钥
      NodeID: 1 // v2board面板内对应节点的id
      NodeType: V2ray // 节点类型
      Timeout: 30
      EnableVless: false
      EnableXTLS: false
    ControllerConfig:
      ListenIP: 0.0.0.0
      UpdatePeriodic: 60
      EnableDNS: false
      CertConfig:
        CertMode: dns
        CertDomain: "node1.ohshit.club" // 节点域名
        Provider: cloudflare
        Email: example@lala.im // 你的邮箱
        DNSEnv: 
          CF_DNS_API_TOKEN: cwPZEBAvIXUcxCdy4v2ib5j8uK-KwnRMDuNPxE-n // 你之前申请的cloudflare域名api
新建supervisor配置文件用于守护xrayr：
nano /etc/supervisor/conf.d/xrayr.conf
写入如下配置：
[program:xrayr]
directory=/opt/xrayr
command=/opt/xrayr/XrayR -config config.yml
autostart=true
autorestart=true
启动xrayr：
supervisorctl update
至此所有配置就全部完成了。如果部署遇到了问题，下面的这些日志可能会有帮助：
/var/www/v2board/storage/logs/laravel-xxxx-xx-xx.log
/var/www/v2board/storage/logs/queue.log
/opt/xrayr/access.log
/opt/xrayr/error.log
		
								            
            	赞(1)            	            	            
        		未经允许不得转载：荒岛 &raquo; 部署V2Board并对接XrayR后端		]]></description>
    </item>
        <item>
        <title><![CDATA[XrayR后端的TLS交给Nginx处理的配置]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/537015]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Mon, 10 May 2021 08:51:45 +0800]]></pubDate>
        <description><![CDATA[首先为了避免机器被墙，现在无一例外肯定是使用vmess+websocket+tls或者vless+xtls（xrayr是支持的）
但无论你使用上面提到的这两种方法的哪一种，都是非常依赖443端口的，如果让xrayr直接监听443的话，机器就不能再做其他事情了。比如用nginx或者caddy建站就不能https了。
用其他端口配置吧，又显得有点不伦不类。所以最好的办法是让nginx来处理tls，这样443端口就可以腾出来给nginx用了。
vless+xtls其实是目前更推荐的配置方法，但是目前v2board面板的订阅还不支持，所以下面我就用vmess+websocket+tls来演示一下配置。
首先在节点上安装需要用到的包：
apt -y update
apt -y install nginx python-certbot-nginx supervisor
启动服务并设置开机自启：
systemctl enable --now nginx supervisor
接着在v2board面板内添加一个websocket节点：

注意这里的连接端口和服务端口，连接端口配置为443，服务端口配置为4443。
连接端口就相当于是用户通过订阅连接配置在客户端上的端口，而服务端口是xrayr后端实际监听的端口。
另外别忘了配置path：

现在新建一个nginx站点配置文件：
nano /etc/nginx/conf.d/xrayr.conf
写入如下配置：
server {
    listen       80;
    server_name  rucn2.ohshit.club;

    location /sometimesnaive {
        proxy_pass                       http://127.0.0.1:4443;
        proxy_redirect                   off;
        proxy_http_version               1.1;
        proxy_set_header Upgrade         $http_upgrade;
        proxy_set_header Connection      "upgrade";
        proxy_set_header Host            $http_host;
        proxy_set_header X-Real-IP       $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
剩下给nginx配置ssl证书的这些步骤全部交给certbot自动帮我们处理即可：
certbot --nginx
现在安装xrayr：
mkdir /opt/xrayr && cd /opt/xrayr
wget https://github.com/XrayR-project/XrayR/releases/download/v0.5.0/XrayR-linux-64.zip
编辑xrayr配置文件：
nano config.yml
改为如下配置，重要部分写了注释：
Log:
  Level: debug
  AccessPath: ./access.log
  ErrorPath: ./error.log
DnsConfigPath: ./dns.json
Nodes:
  -
    PanelType: "V2board"
    ApiConfig:
      ApiHost: "https://v2board.ohshit.club/"
      ApiKey: "imlalaimlalaimlala"
      NodeID: 4 // 对应v2board面板内的节点id
      NodeType: V2ray
      Timeout: 30
      EnableVless: false
      EnableXTLS: false
    ControllerConfig:
      ListenIP: 127.0.0.1 // 仅监听在本地
      UpdatePeriodic: 60
      EnableDNS: false
      CertConfig:
        CertMode: none // 关闭证书申请
        CertDomain: "rucn2.ohshit.club" 
        Provider: cloudflare 
        Email: example@lala.im
        DNSEnv: 
          CF_DNS_API_TOKEN: cwPZEBAvIXUcxCdy4v2ib5j8uK-KwnRMDuNPxE-n
新建supervisor配置文件用于守护xrayr：
nano /etc/supervisor/conf.d/xrayr.conf
写入如下配置：
[program:xrayr]
directory=/opt/xrayr
command=/opt/xrayr/XrayR -config config.yml
autostart=true
autorestart=true
启动xrayr：
supervisorctl update
至此配置就全部完成了。对接有任何问题，查看相应的日志文件有助于排错：
/opt/xrayr/access.log
/opt/xrayr/error.log
		
								            
            	赞(0)            	            	            
        		未经允许不得转载：荒岛 &raquo; XrayR后端的TLS交给Nginx处理的配置		
				]]></description>
    </item>
        <item>
        <title><![CDATA[WARP添加ipv6]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/536676]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Sun, 04 Apr 2021 01:37:43 +0800]]></pubDate>
        <description><![CDATA[部分便宜/免费 VPS 只提供 IPv6 地址，搭建魔法工具后是无法访问大多数只提供 IPv4 地址的网站（例如 Github），我们可以通过 Cloudflare Warp 提供的 Wireguard 隧道来变相打通 v6 to v4。也可以为 IPv4 Only VPS 加上 IPv6 支持，目前（截至发布日）Warp 提供的 IPv6 地址能解锁 Netflix。

2

搭建方式
本方式基于 Debian 10 Buster 并且使用 root 用户。

0 准备工作
安装必要软件

apt update &amp;&amp; apt install wget vim lsb-release -y
1 获取 Warp 配置文件
通过 wgcf 工具获取 Warp 配置文件：

wget -O wgcf https://github.com/ViRb3/wgcf/releases/download/v2.2.2/wgcf_2.2.2_linux_amd64 &amp;&amp; chmod +x wgcf
注册账号

./wgcf register
获取配置文件

./wgcf generate
（如果提示 429 Too many requests 错误，多 gen 几次）

即会在在当前目录生成 wgcf-profile.conf 文件，根据 VPS 实际情况编辑此文件

vim wgcf-profile.conf
按 i 开始编辑文件

IPV6 Only VPS

删除 AllowedIPs = ::/0 行，仅保留 AllowedIPs = 0.0.0.0/0

最后一行 Endpoint 改为 [2606:4700:d0::a29f:c001]:2408

IPV4 Only VPS

删除 AllowedIPs = 0.0.0.0/0 行，仅保留 AllowedIPs = ::/0

最后一行 Endpoint 改为 162.159.192.1:2408

3

按 Esc 键，并输入 :wq 保存文件，将此文件复制到 Wireguard 配置文件夹

mkdir /etc/wireguard &amp;&amp; cp wgcf-profile.conf /etc/wireguard/wgcf.conf
2 安装 Wireguard
添加 backports 源

echo &quot;deb http://ftp.debian.org/debian buster-backports main&quot; &gt;&gt; /etc/apt/sources.list
安装最新内核

apt install -t $(lsb_release -sc)-backports linux-image-$(dpkg --print-architecture) linux-headers-$(dpkg --print-architecture) --install-recommends -y
安装 Wireguard

apt install wireguard openresolv -y
将 Wireguard 设置成开机启动

systemctl enable wg-quick@wgcf
重启 VPS

reboot
重启后可通过命令 wg 检查启动是否成功。

WG连接后是内核层级的软件，会建立自己的虚拟网卡，且WARP客户端均为内网NAT地址，当双栈流量均被WG接管后我们就无法再从原有的IP连接到服务器了。因此在IPv4与IPv6之间我们必须做一个取舍，以防这样的情况发生。
修改配置文件就两种情况：

①上文图中11行Endpoint修改为162.159.192.1:2408，删除掉第9行接管本地IPv4路由的配置
②上文图中11行Endpoint修改为[2606:4700:d0::a29f:c001]:2408，删除掉第10行接管本地IPv6路由的配置

接下来就是安装wireguard客户端。

centos7可以使用以下命令安装：

$ sudo yum install epel-release elrepo-release
$ sudo yum install yum-plugin-elrepo
$ sudo yum install kmod-wireguard wireguard-tools
更多命令可以参考官方网站：https://www.wireguard.com/install/

安装好以后记得重启下VPS。

把刚刚下载好的配置文件wgcf-profile.conf上传至/etc/wireguard，然后修改下配置文件，其中DNS建议同时添加上IPV4与IPV6的DNS，这里使用的Cloudflare的DNS。

For IPv4: 1.1.1.1 and 1.0.0.1
For IPv6: 2606:4700:4700::1111 and 2606:4700:4700::1001
同时记得如果需要cf warp的IPV6就删掉 AllowedIPs = 0.0.0.0/0，如果需要cf warp的ipv4就删掉 AllowedIPs = ::/0。

记住不要两个同时启用，不然会导致你vps原本的ip地址无法连接上去。博主就上了这个当。

最后保存配置文件，修改文件名为wgcf.conf 然后继续：

#加载内核模块
modprobe wireguard
#检查WG模块加载是否正常
lsmod | grep wireguard
最后开关隧道的命令为：

#开启隧道
sudo wg-quick up wgcf
#关闭隧道
sudo wg-quick down wgcf
如果VPS出口没有走ipv6的话，需要这样做

编辑  /etc/gai.conf 文件（没有的话就新建），修改为以下内容：

label ::1/128 0
label ::/0 1
label fd01::/16 1
label 2002::/16 2
label ::/96 3
label ::ffff:0:0/96 4
label fec0::/10 5
label fc00::/7 6
label 2001:0::/32 7
precedence ::1/128 50
precedence ::/0 40
precedence fd01::/16 40
precedence 2002::/16 30
precedence ::/96 20
precedence ::ffff:0:0/96 10
对了附上成功解锁NF的截图]]></description>
    </item>
        <item>
        <title><![CDATA[糖尿病医案]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/536398]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Mon, 15 Mar 2021 01:53:45 +0800]]></pubDate>
        <description><![CDATA[ 祝谌予先生医案：
朱ｘｘ，男，初诊日期： 
1973年10月27日。近几年来，善饥能吃，1972年发现糖尿病。一年来体重下降，疲乏无力，口渴思饮，一天约喝10磅水左右，多尿，控制饮食日服八两左右，时感饥饿，后背搔痒，易生疖疮。血糖240毫克％，尿糖四个加号，血压130／90毫米汞柱，舌质偏红，脉缓。证属气-阴两伤，肺胃火炽。拟益气养阴，清热为治。

处方：
1生黄芪15山药15太子参30炒芡实10。

2熟地30枸杞12。
----------------
1----？
2----？
3元参15石斛15天花粉30知母10黄柏10乌梅10天冬10麦冬10。

4​苍术        
    
    
    
    15。  
10剂。

二诊：服药后，诸症均减。口不太干，饮水减少，只觉腿软无力，唇色暗，舌胖，苔白，脉缓。前方去石斛、乌梅、枸杞子、知母、黄柏，加五味子9克，功劳叶12克。10剂。

三诊：服药后，疲乏好转，“三消”症状全减，仍控制饮食。原方继服10剂。

四诊：又服30剂，诸症显好，空腹尿糖阴性。但因饮白酒一斤，次日空腹尿糖两个加，口干思饮，大便溏，苔白，脉滑。方药：

1黄芪 太子参 山药
2熟地 肉桂 五味子 金樱子
--------------
1----？
2----?
3元参、天冬、麦冬

4​苍术。
五诊：服药后尿糖转为阴性，血糖为100毫克％，“三消”症状消失，改服丸药。（即上方加四倍量，研末，山药打糊为丸，如梧桐子大，饭后服6克）。患者服药一料后，血糖、尿糖正常，已不控制饮食，血糖、尿糖均正常。


蒲辅周弟子高辉远医案一则：
李某，女，51岁。患者于10个月前右边眼睑下缘发一疖肿，红肿痒痛。查血糖++，空腹血糖13
mmol/L，诊为糖尿病（非胰岛素依赖型）在门诊口服优降糖、达美康药量递增，迄今4个月均未获效。初诊时，空腹血糖11mmol/L，餐后血糖15.8mmol/L.但无“三多一少”症状，二便自调，纳、眠均可。舌质红，苔薄白，脉沉细（太阴亏虚）。证属气-阴两虚，燥热伤津，治拟益气-养精，清热生津之法。

1黄芪15

2熟地20
五倍子10
炙甘草5。

-------------
1----​？
2葛根10

3黄连10天花粉10石斛10

4茯苓10。

服药2周后，复查空腹血糖7.6
mmol/L，餐后2小时血糖13.9
mmol/L。右眼睑疖肿仍潮红隐痛，头晕时作，下肢微肿，舌质红，苔白腻，脉沉细，原方加木贼草10，荷叶10，守方又服2周后，眼睑疖肿消失，下肢肿退。空腹血糖6.43mmol/L，餐后2小时血糖10.8mmol/L.24小时分段尿糖测定+-
++，继照原方再连投50余剂，在两个月中连续三次复查血糖均为正常范围。病情稳定出院。
]]></description>
    </item>
        <item>
        <title><![CDATA[利用frp&#43;ss升级搭建翻墙VPN]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/535990]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Mon, 01 Feb 2021 11:01:03 +0800]]></pubDate>
        <description><![CDATA[之前直接利用ss搭建翻墙VPN已经成功被 GFW 封杀，可能是因为是建墙者可以成功检测出 利用 ss 传输协议的特征，从而利用传输协议的特征来封禁服务端的IP，最终导致我 ping 都不能ping通 服务端的机器。很是无语，最终尝试了不同地域的境外的 VPS 云服务，都以 IP 被封禁而告终。

最近朋友跟我说可以利用frp中转ss的方法避开 GFW 的检测，于是我 Google 了下关键字进行学习和尝试，用了一天时间折腾终于搭建成功了。目前该方法的流量协议未被 GFW 检测到，但不代表该方法会一直有效下去，因为GFW 流量检测协议的策略本身就是个不断升级的工作，所以我们也要不断的升级翻墙VPN的方法，这也是市面上很多卖翻墙VPN的工具帐号不能永久有效的原因。

下图给出frp+ss升级搭建中转翻墙VPN的概要原理图，由下图可知主要包含三部分的配置：客户端ss、中转服务器和ss服务器。这篇笔记首先介绍客户端ss的配置，作为用户你只需要配置客户端ss即可，其余无需关心；然后介绍中转服务器的配置；其次介绍ss服务器端的配置；最后总结并对未来针对 GFW 作一些未来应对策略。



客户端ss配置

PC客户端软件下载可到 GitHub 发布的 Releases 下载最新的版本即可（ windows版 和 Mac版 ），移动端（Android版），苹果移动端也是有的可以自己搜索下。

客户端ss大致的工作原理可以参考下以前写的 blog 。PC客户端可以结合Chrome插件 SwitchyOmega 使用，其中ss信息配置如下（不要薅我流量，黑户也不要攻击我的机器，仅供程序员学习使用）：

地   址： 39.97.122.11#12345
密法： aes-256-cfb
密   ： Dont_be_evil
备   ： Dont_be_evil


ss配置完可以用百度看下IP地址，IP地址重定向到香港的阿里云即配置正确，如下图所示方式查看测试结果：



中转服务器配置

中转服务器我是选用的是北京阿里云，成本有点高（大概60元/月，唉，只有每个月省点了）。中转服务器主要负责将请求转发到ss服务器，然后由ss服务器完成并返回至中转服务器，最后中转服务器将数据返给客户端。中转服务器的配置主要是 frps 服务端的配置，它负责请求的转发。下面就环境安装、服务端配置和启动服务作一下说明。

环境安装： frp软件可到Github 的releases 的 官方网站 进行下载解压即可。

服务端配置： 修改以上解压后目录的 frps.ini 文件，详细如下：

[common]
# 穿透服务器端监听的端口，默认7000
bind_port = 7000

# 管理日志：日志存放位置；日志记录级别（debug/info/warn/error）；保存天数
log_file = ./frps.log
log_level = debug
log_max_days = 30

# shadowsocks代理服务端配置；bind_addr为穿透服务器ip地址，或填 0.0.0.0 也行；listen_port为外部监听端口
[shadowsocks]
type = tcp
bind_addr = 0.0.0.0
listen_port = 12345


启动服务： 通过 nohup ./frps -c ./frps.ini &amp; 挂后台启动服务，通过 frps.log 文件查看日志。通过 ps aux | grep frps 查看服务是否已经起来。

注：1. 境内服务器防火墙需打开 7000 和 12345 端口；2. 境内外云产品最好用同一个商家，这样 ping 会用更少的跳数达到目的地；

境外ss服务器配置

境外服务器我是选用的是香港阿里云，大概24元/月。境外需要配置两个服务：一个是ss服务；另一个是frpc的服务。下面就这两个服务分别作一个说明。

ss服务配置

其中ss服务与正常ss配置方法完全相同（可参考之前的 blog ），这里只给出配置的结果。

$ cat /etc/shadowsocks.json
{
    &quot;server&quot;:&quot;0.0.0.0&quot;,
    &quot;server_port&quot;:8432,
    &quot;local_address&quot;: &quot;127.0.0.1&quot;,
    &quot;local_port&quot;:1080,
    &quot;password&quot;:&quot;Dont_be_evil&quot;,
    &quot;timeout&quot;:300,
    &quot;method&quot;:&quot;aes-256-cfb&quot;,
    &quot;fast_open&quot;: false
}

$ ssserver -c /etc/shadowsocks.json -d start


注：1. 可通过 ps aux | grep ssserver | grep -v grep 查看服务是否已经起来；

frpc服务配置

环境安装： frp软件可到Github 的releases 的 官方网站 进行下载解压即可，与中转服务器环境安装完全一致（同一个文件夹下同时放着 frps 和 frpc 文件）。

客户端配置： 修改以上解压后目录的 frpc.ini 文件，详细如下：

[common]
# 中转服务器的ip地址
server_addr = 39.97.122.11
# 中转服务器的监听端口
server_port = 7000

# 管理日志：日志存放位置；日志记录级别（debug/info/warn/error）；保存天数
log_file = ./frpc.log
log_level = debug
log_max_days = 30

# ss配置：访问本地ss服务的8432端口，与ss配置的 server_port 一致；remote_port与客户端访问端口一致。
[shadowsocks]
type = tcp
local_ip = 127.0.0.1
local_port = 8432
remote_port = 12345


启动服务： 通过 nohup ./frpc -c ./frpc.ini &amp; 挂后台启动服务，可通过 ./frpc.log 文件查看日志。通过 ps aux | grep frpc 查看服务是否已经起来。

注：1.境外服务器防火墙打开 7000 端口，但阿里云不打开 7000 端口也可以访问，可能是阿里云间通信通过内网的原因； 2. frp是一个可用于内网穿透的高性能的反向代理应用，对于不写服务的同学来说frp有点难以理解，可以尝试去看一下demo，关于它的应用可以参考 Github官网链接 Readme的示例，基本看第1个 SSH 示例基本可以理解其作用。

总结

这篇笔记主要介绍了利用frp+ss升级搭建翻墙VPN的方法，包含三个部分的配置：客户端配置、中转服务器配置和境外服务器配置，其中境外服务器配置包含ss服务配置和frpc服务配置。

该搭建VPN的方法目前可以绕过GFW的特征流量检测，但也并非永久有效，其实翻墙者与建墙者的攻与防本身就是一个无止境的话题。当建墙者可以检测到特征流量时，我们只有寻找下一个解决方案。就目前而言，如果该搭建方法被GFW拦截了，可以尝试 v2ray 框架来搭建VPN。

参考文献


树莓派frp内网穿透及ss配置
Github frp官网
利用开源ss工具快速搭建翻墙VPN
朋友的搭建ss笔记


]]></description>
    </item>
        <item>
        <title><![CDATA[树莓派4安装aria2]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/535977]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Sun, 31 Jan 2021 10:53:55 +0800]]></pubDate>
        <description><![CDATA[Aria2 是一个优秀的开源下载软件，本文将介绍如何利用 Aria2软件 使用树莓派搭建离线下载器 。aria2 安装与配置安装 apache 与  AriaNg 时samba参考1 aria2 安装与配置aria2 是一个功能完善的下载软件，最大的缺点是软件本身没有图形界面，大大增加了配置难度（这对玩树莓派的人应该没啥影响 LOL）。这个我们后面解决，第一步要做的肯定是安装 aria2。$ sudo apt-get install aria2建立配置文件$ mkdir ~/.config/aria2/
$ touch ~/.config/aria2/aria2.session
$ vim ~/.config/aria2/aria2.config如果不熟悉 vim，可以用 nano 替代最后一行的 vim。在新建的 aria2.config 中输入以下内容。daemon=true
rpc-secret=beekc
enable-rpc=true
rpc-allow-origin-all=true
rpc-listen-all=true
max-concurrent-downloads=5
continue=true
max-connection-per-server=5
min-split-size=10M
split=10
max-overall-download-limit=0
max-download-limit=0
dir=/home/pi/Downloads
file-allocation=prealloc
check-certificate=false
save-session=/home/pi/.config/aria2/aria2.session
input-file=/home/pi/.config/aria2/aria2.session
save-session-interval=60

enable-dht=true
bt-enable-lpd=true
enable-peer-exchange=true

bt-tracker=udp://tracker.coppersurfer.tk:6969/announce,udp://9.rarbg.to:2710/announce,udp://9.rarbg.me:2710/announce,udp://tracker.openbittorrent.com:80/announce,udp://tracker.leechers-paradise.org:6969/announce,udp://tracker.opentrackr.org:1337/announce,udp://tracker.internetwarriors.net:1337/announce,udp://exodus.desync.com:6969/announce,udp://tracker.tiny-vps.com:6969/announce,udp://retracker.lanta-net.ru:2710/announce,udp://open.demonii.si:1337/announce,udp://open.stealth.si:80/announce,udp://bt.xxx-tracker.com:2710/announce,udp://tracker.torrent.eu.org:451/announce,udp://tracker.cyberia.is:6969/announce,udp://denis.stalker.upeer.me:6969/announce,udp://torrentclub.tech:6969/announce,udp://tracker.moeking.me:6969/announce,udp://tracker3.itzmx.com:6961/announce,udp://explodie.org:6969/announce
第二行是 rpc 密码，后面在使用 AriaNg 时需要填写。最后一部分是 bt-trcker 是 tracker 服务器，用来帮助寻找做种的用户。可以使用网站 http://www.tkser.tk/ （ 备用 http://edam.top/tk/ ） 进行更新。如果使用 HTTPS，在配置文件中加入rpc-secure=true  
rpc-certificate=/path/to/cer  
rpc-private-key=/path/to/key至此已经可以使用命令行控制 aria2 进行下载操作了，但是这样不是很方便。下一节中将介绍使用 AriaNg 搭建图形化的控制界面。2 安装 apache 与  AriaNgAria 自身没有图形界面，先需要搭建一个 web 服务器。这里使用的是 apache ，如果熟悉使用其他软件也可以。首先安装 apache 软件。sudo apt-get install apache2这时打开浏览器，在地址栏输入树莓派的地址就可以看到 apache 的默认网页。这说明 web 服务器已经可以正常工作了。默认网页存储在 /var/www/html ，只要把它替换成 AriaNg 就可以了。在 https://github.com/mayswind/AriaNg/releases/ 上下载最新版本的 AriaNg，然后解压到 /var/www/html 中，并删除原来的默认网页。再在浏览器中访问时就会出现 AriaNg 的界面了。现在访问 AriaNg 会报错，因为还没有输入 rpc 密码。点击 AriaNg 设置 — RPC — Aria2 RPC 密钥 中填入上节中设定的密码。然后就可以全部的功能了。3 samba使用 samba 可以像管理本地磁盘一样管理远程设备，帮助我们将下载的文件拷到本机中。先安装 samba 软件。sudo apt-get install samba samba-common-bin配置 samba 用户密码sudo touch /etc/samba/smbpasswd
smbpasswd -a pi建立 samba配置文件sudo vim /etc/samba/smb.conf在其中输入下面内容[share]
  path = /home/pi
  available = yes
  browseable = yes
  #public = yes
  writable = yes最后重启 samba 服务，就可以通过 samba 访问树莓派了。
3.2 开机自启动

创建systemctl service文件
sudo vim /lib/systemd/system/aria2.service

User,conf-path下换成自己的username
[Unit]
Description=Aria2 Service
After=network.target

[Service]
User=ubuntu
ExecStart=/usr/bin/aria2c --enable-rpc --rpc-listen-all --rpc-allow-origin-all --save-session /home/pi/.config/aria2/aria2.session --input-file /home/pi/.config/aria2/aria2.session --conf-path=/home/pi/.config/aria2/aria2.conf

[Install]
WantedBy=default.target


重载服务并设置开机启动

sudo systemctl daemon-reload
sudo systemctl enable aria2
sudo systemctl start aria2
sudo systemctl status aria2


看到如下文字证明启动成功(记住TCP port，AiraNg配置以及公网端口映射需要)
● aria2.service - Aria2 Service
   Loaded: loaded (/lib/systemd/system/aria2.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-12-29 08:24:20 CST; 4 days ago
 Main PID: 21855 (aria2c)
   CGroup: /system.slice/aria2.service
           └─21855 /usr/bin/aria2c --conf-path=/home/ubuntu/.config/aria2/aria2.config

Dec 29 08:24:20 ubuntu systemd[1]: Started Aria2 Service.
Dec 29 08:24:20 ubuntu aria2c[21855]: 12/29 08:24:20 [NOTICE] IPv4 RPC: listening on TCP port 6800
Dec 29 08:24:20 ubuntu aria2c[21855]: 12/29 08:24:20 [NOTICE] IPv6 RPC: listening on TCP port 6800
Dec 29 08:25:21 ubuntu aria2c[21855]: 12/29 08:25:21 [NOTICE] Serialized session to '/home/ubuntu/.config/aria2/aria


4. AriaNg使用

aira2比较好的web管理界面当属AriaNg。
有网页版的AriaNg以及Windows桌面版的AriaNg-Native，推荐使用网页版的，可以部署在Raspberry Pi上。

4.1 将AriaNg部署在Raspberry Pi上

配置Tomcat服务器

首先需要一个web服务器，这里使用了Tomcat 7。（这里纯属个人喜好，用Apache或Nginx看个人需要）
wget https://www-eu.apache.org/dist/tomcat/tomcat-7/v7.0.92/bin/apache-tomcat-7.0.92.tar.gz
tar -xzvf apache-tomcat-7.0.92.tar.gz
mv apache-tomcat-7.0.92/ tomcat7
vim ./tomcat7/bin/catalina.sh


修改此启动配置文件，JAVA路径添加默认java路径，此配置中的java路径为sudo apt-get install default-jre安装的默认路径。

#   JAVA_HOME       Must point at your Java Development Kit installation.
#                   Required to run the with the "debug" argument.
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-arm64

#   JAVA_OPTS       (Optional) Java runtime options used when any command
#                   is executed.
#                   Include here and not in CATALINA_OPTS all options, that
#                   should be used by Tomcat and also by the stop process,
#                   the version command etc.
#                   Most options should go into CATALINA_OPTS.
JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:PermSize=600M -XX:MaxPermSize=600m -Dcom.sun.management.jmxremote"


修改服务器文件配置文件：
vim ./tomcat7/conf/server.xml


将
    &lt;Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" /&gt;


修改为
    &lt;Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" /&gt;

即可使用默认http 80 端口

vim ./tomcat7/bin/start.sh

在浏览器中访问http://your-ip/即可打开Apache Tomcat的默认webpage了。（如下图）



配置Tomcat自启动

vim /etc/rc.local

在文件中添加
sudo /home/ubuntu/tomcat7/bin/startup.sh


配置AriaNg

wget https://github.com/mayswind/AriaNg/releases/download/1.0.0/AriaNg-1.0.0.zip
unzip AriaNg-1.0.0.zip -d aira-ng
sudo mv aira-ng ~/tomcat7/webapps/ROOT/


在浏览器中访问http://your-ip/aira-ng即可打开AriaNg了。

4.2 本地使用AriaNg

网页版

直接下载AriaNg，打开index.html
在AiraNg Settings中，选择RPC选项卡，将Aira2 RPC Address中IP地址和端口号修改为Raspberry Pi的IP地址以及前面status中的端口号（默认6800）。

桌面版

直接下载AriaNg-Native，打开，设置同上。

5. 公网端口映射

配置好Aria2以及AriaNg后，就可以将Raspberry Pi映射到公网上来进行远程下载了。配置公网的方式有以下几种：

5.1 DMZ主机

DMZ主机是目前绝大多数路由器都会带的功能，其功能就是实现将内网设备直接暴露在公网之上。

移动光猫配置页面（需要超级帐号）：



TP-Link配置页面：



5.2 端口映射

如果不想要把所有的端口都暴露在公网上（这样做风险较大），可以只将其中的几个端口映射到公网上。
这里使用移动光猫的设置举例：



这样配置好访问路由器的公网IP地址以及绑定的端口号就可以直接访问到Raspberry Pi的相应端口。

5.3 获取公网IP地址

访问Raspberry Pi还需要获取公网IP地址，而路由的公网IP地址有可能会变化。

可以访问
https://www.ipchicken.com/
https://www.iplocation.net/find-ip-address
等网站获取本机的IP地址
这里提供一个（粗鄙）的Python获取IP地址发送邮件的脚本(Python 3.6， 2.7上没尝试过)

import requests, re
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

def _format_addr(s):
  name, addr = parseaddr(s)
  return formataddr((name, addr))

if __name__ == '__main__':
  # get webpage
  url = "https://www.ipchicken.com/"
  r = requests.get(url)

  # get IP address from webpage
  pattern = re.compile(r'((25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)')
  matchObj = pattern.search(r.text)
  IpAddress = matchObj.group(0)

  # send email

  # email (modify by yourself)
  from_addr   = Your_email_address
  password    = Your_password
  to_addr     = ['Your_another_email_address']
  smtp_server = 'your.smtp.server'
  smtp_port   = 25

  # message
  msg = MIMEText(''+IpAddress, 'plain', 'utf-8')
  msg['Subject'] = Header('Raspberry Pi Ip Address', 'utf-8').encode()
  msg['From']    = _format_addr('Raspberry Pi &lt;%s&gt;' % from_addr)
  msg['To']      = _format_addr('Raspberry Pi Manager &lt;%s&gt;' % to_addr[0])

  # send
  try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.login(from_addr, password)
    server.sendmail(from_addr, to_addr, msg.as_string())
    print("Send Email Success")
  except smtplib.SMTPException:
    print("Error: Unable to send Email")

  server.quit()


5.4 花生壳内网穿透

如果家中用的路由是二级路由，那么恭喜，无论是DMZ主机还是端口映射都没有用了。
二级路由就是说你是在内网的内网中，如果路由器的公网地址和从https://www.ipchicken.com/上获取的IP地址不一样就说明是二级路由。

这种也可以有个（不需要VPS的）方法解决，就是利用花生壳的内网穿透功能。目前这个功能需要6元钱。

花生壳官网上有详细的说明，这里就不赘述了。测试功能支持映射两个端口，这里需要将80和Aria2 RPC的端口（默认6800）映射出去即可。

花生壳会提供一个服务域名，这个域名就相当于公网IP地址。

5.5 利用Frp内网穿透

如果有条件（比如有一个VPS），可以通过Frp作反向代理实现内网穿透。
安装参见Frp 的 GitHub page，有很详细的说明，这里不赘述了。
服务器端使用frps 和配置文件frps.ini如下：

[common]
bind_addr = 0.0.0.0
bind_port = 5443
log_file = ./frps.log
log_level = info
log_max_days = 3
# auth token
token = [your token]

max_pool_count = 50
tcp_mux = true


Raspberry Pi端使用frpc 和配置文件frpc.ini如下（ip填写服务器的ip，token和服务器端保持一致）：
除了aria2的6800端口，还可以将其他端口如ssh，http映射到服务器ip上。

[common]
server_addr = [your ip]
server_port = 5443
token = [your token]
tcp_mux = true

[aria2]
type = tcp
local_ip = 127.0.0.1
local_port = 6800
remote_port = 6800

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 4022

[http]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8080


6. 硬盘挂载（可选）

Raspberry Pi虽然可以用SD卡扩展存储，但空间毕竟小，若有旧台式机、笔记本硬盘可以套个硬盘盒接在Raspberry Pi上。
3B+ USB口直接带2.5的硬盘或SSD是不需要外接电源的，3.5的没有测试过，但一般是需要的。

手动挂载的方法如下：

sudo fdisk -l


Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000d2ae0

Device     Boot Start       End   Sectors   Size Id Type
/dev/sda1        2048 976769023 976766976 465.8G  7 HPFS/NTFS/exFAT


或
sudo blkid


/dev/mmcblk0p1: SEC_TYPE="msdos" UUID="9FF3-2ADB" TYPE="vfat" PARTUUID="c2909e2d-01"
/dev/mmcblk0p2: UUID="a407e17a-e170-45d8-8fb7-dd34fe646ab9" TYPE="ext4" PARTUUID="c2909e2d-02"
/dev/mmcblk0: PTUUID="c2909e2d" PTTYPE="dos"
/dev/sda1: LABEL="New Volume" UUID="848CC9268CC91398" TYPE="ntfs" PARTUUID="000d2ae0-01"


从中可以获取到硬盘的盘符/dev/sda1

# 根据自己的需求设置挂载目录，这里这么设置是为了后续的SMB共享
sudo mkdir ~/share/disk1
sudo mount /dev/sda1 ~/share/disk1


如果需要重启机器，则需要采用自动挂载的方式：

sudo vim /etc/fstab


加入如下一条

UUID=848CC9268CC91398 /home/ubuntu/share/disk1 ntfs  defaults                0       3


执行如下命令验证

sudo mount -a


7. SMB服务（可选）

单纯的下载机是不够的，不能总是去插拔硬盘，而通过SMB服务可以用终端设备直接访问到Raspberry Pi。

需要创建一个samba帐号

sudo touch /etc/samba/smbpasswd
smbpasswd -a ubuntu


再输入两次密码后即可创建账户

sudo vim /etc/samba/smb.conf


在文件末尾加入如下信息

[share]
  path = /home/ubuntu/share
  available = yes
  browseable = yes
  #public = yes
  writable = yes


修改读写权限

sudo chown -R ubuntu:ubuntu /home/ubuntu/share
sudo chmod -R 777 /home/ubuntu/share


重启samba服务

service smbd restart


即可进行连接测试（在运行窗口中输入\\ip即可访问）



Reference
树莓派3B+ 远程下载服务器（Aria2） 作者：宁静致远kioye
抛弃迅雷，Aria2 新手入门 作者：清顺
ubuntu开机自动挂载新硬盘 作者：_iAm333]]></description>
    </item>
        <item>
        <title><![CDATA[SSPanel Uim 对接 trojan  SSPanel Uim 安装图文教程]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/535706]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Sun, 10 Jan 2021 11:17:29 +0800]]></pubDate>
        <description><![CDATA[    
    
        
            SSPanel Uim 对接 trojan - soga 后端文档
            
            
            
        @font-face {
            font-family: "Roboto";
            src: local("Roboto"), local("Roboto-Regular"), url(https://gstatic.gitbook.com/fonts/fc3d4b35e4d07d4e0485cc2db0e57c77.woff) format('woff');
            font-weight: 400;
            font-display: swap;
        }
        @font-face {
            font-family: "Roboto";
            src: local("Roboto Medium"), local("Roboto-Medium"), url(https://gstatic.gitbook.com/fonts/f4fa50c4003f87e7dc10459e500933c3.woff) format('woff');
            font-weight: 500;
            font-display: swap;
        }
        @font-face {
            font-family: "Roboto";
            src: local("Roboto Bold"), local("Roboto-Bold"), url(https://gstatic.gitbook.com/fonts/72e37e5bf95a8dba938c78b1d7d91253.woff) format('woff');
            font-weight: 700;
            font-display: swap;
        }
    
        @font-face {
            font-family: "Content-font";
            src: local("Roboto"), local("Roboto-Regular"), url(https://gstatic.gitbook.com/fonts/fc3d4b35e4d07d4e0485cc2db0e57c77.woff) format('woff');
            font-weight: 400;
            font-display: swap;
        }
        @font-face {
            font-family: "Content-font";
            src: local("Roboto Medium"), local("Roboto-Medium"), url(https://gstatic.gitbook.com/fonts/f4fa50c4003f87e7dc10459e500933c3.woff) format('woff');
            font-weight: 500;
            font-display: swap;
        }
        @font-face {
            font-family: "Content-font";
            src: local("Roboto Bold"), local("Roboto-Bold"), url(https://gstatic.gitbook.com/fonts/72e37e5bf95a8dba938c78b1d7d91253.woff) format('woff');
            font-weight: 700;
            font-display: swap;
        }
    
            
            #__GITBOOK__ROOT__SERVER__ { width: 100%; height: 100%; display: flex;}
            #__GITBOOK__ROOT__CLIENT__ { width: 100%; min-height: 100%; height: initial; display: flex;}
            html, body {
  color: #242A31;
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
  font-size: 15px;
  background: #F5F7F9;
  box-sizing: border-box;
  font-family: "Roboto", sans-serif;
  line-height: 1em;
  font-smoothing: antialiased;
  text-size-adjust: 100%;
  -ms-text-size-adjust: 100%;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  -webkit-text-size-adjust: 100%;
}
@media screen and (min-width: 768px) {
  html, body {
    text-rendering: optimizeLegibility;
  }
}
@media print {
  html, body {
    background: transparent;
  }
}
*, *:before, *:after {
  outline: none;
  box-sizing: inherit;
}
@font-face {
  font-family: "Flow-Rounded";
  src: url("https://gstatic.gitbook.com/fonts/bfc0a96537ceb0cad9e956b9f980fe88.woff") format('woff');
  font-display: block;
}
input, select, textarea {
  font-size: 16px;
}
input, select, textarea, button {
  font: inherit;
}
input[type="search"] {
  -webkit-appearance: none;
}
.draggingElement, .draggingElement *:hover {
  cursor: grabbing !important;
  pointer-events: auto !important;
}
.draggingElement .draggingHidden {
  display: none;
}

.reset-3c756112--body-68cac36c {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  width: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  background: #F5F7F9;
  min-height: 100vh;
  flex-direction: column;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--header-07037613--header-11420428 {
  display: -webkit-box;
  height: 80px;
  margin: 0;
  display: flex;
  padding: 0;
  z-index: 20;
  position: relative;
  box-shadow: 0 3px 8px 0 rgba(116, 129, 141, 0.1);
  border-bottom: 1px solid #d4dadf;
  background-color: #FFFFFF;
}
@media print {
  .reset-3c756112--header-07037613--header-11420428 {
    display: none;
  }
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--header-07037613--header-11420428 {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    top: 0;
    width: 100%;
    display: flex;
    position: fixed;
    padding-left: 16px;
    padding-right: 16px;
  }
}
@media screen and (max-width: 767px) {
  .reset-3c756112--header-07037613--header-11420428 {
    height: 60px;
    padding-left: 8px;
    padding-right: 8px;
  }
}
.reset-3c756112--headerContainer-bb8cc0bc {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 100%;
  margin: 0 auto;
  display: flex;
  padding: 0;
  max-width: 1448px;
}
.reset-3c756112--headerLeftColumn-4eae0bae--headerLeftColumn-7efc9f26 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  align-items: center;
  justify-content: space-between;
  -webkit-box-pack: justify;
  -webkit-box-align: center;
}
@media screen and (min-width: 1024px) {
  .reset-3c756112--headerLeftColumn-4eae0bae--headerLeftColumn-7efc9f26 {
    max-width: 298px;
    justify-content: center;
    -webkit-box-pack: center;
  }
  .reset-3c756112--headerLeftColumn-4eae0bae--headerLeftColumn-7efc9f26:after {
    top: 50%;
    right: 0;
    height: 40px;
    content: " ";
    position: absolute;
    transform: translateY(-50%);
    border-left: 1px solid #E6ECF1;
  }
}
.reset-3c756112--mobileButton-7a76d05f {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 0 0 auto;
  width: 30px;
  cursor: pointer;
  height: 30px;
  margin: 0;
  display: flex;
  outline: none;
  padding: 0;
  font-size: 18px;
  align-items: center;
  justify-content: center;
  -webkit-box-pack: center;
  -webkit-box-align: center;
}
@media screen and (min-width: 1024px) {
  .reset-3c756112--mobileButton-7a76d05f {
    display: none;
  }
}
.icon-7f6730be--text-3f89f380--icon-1f8349b3 {
  color: #242A31;
  width: 1em;
  height: 1em;
  vertical-align: middle;
}
.reset-3c756112--headerLogo-5c0b38e2 {
  margin: 0;
  display: block;
  padding: 0px 24px;
}
@media screen and (min-width: 1024px) {
  .reset-3c756112--headerLogo-5c0b38e2 {
    width: 250px;
    padding: 0;
  }
}
.reset-3c756112--mobileLogo-dacfd15c {
  margin: 0;
  display: none;
  padding: 0;
}
@media screen and (max-width: 767px) {
  .reset-3c756112--mobileLogo-dacfd15c {
    display: block;
  }
}
.link-a079aa82--primary-53a25e66--logoLink-10d08504 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #3884FF;
  cursor: pointer;
  display: flex;
  align-items: center;
  text-decoration: none;
  -webkit-box-align: center;
}
.reset-3c756112--tooltipContainer-7fdb9b70--small-2ec8ae1a {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 30px;
  height: 30px;
  margin: 0;
  display: flex;
  padding: 0;
  border-radius: 3px;
}
.reset-3c756112--avatarFrame-2f40cdc9--small-2ec8ae1a {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  -webkit-mask-image: -webkit-radial-gradient(white, black);
  -webkit-mask-image: -moz-radial-gradient(white, black);
  mask-image: -webkit-radial-gradient(white, black);
  mask-image: -moz-radial-gradient(white, black);
  width: 30px;
  height: 30px;
  margin: 0;
  display: flex;
  padding: 0;
  overflow: hidden;
  position: relative;
  mask-image: radial-gradient(white, black);
  align-items: center;
  border-radius: 3px;
  justify-content: center;
  -webkit-box-pack: center;
  -webkit-box-align: center;
  -webkit-mask-image: radial-gradient(white, black);
}
.image-67b14f24--avatar-1c1d03ec {
  width: 100%;
  height: 100%;
  max-width: 100%;
  background-size: cover;
  background-color: #FFFFFF;
  background-repeat: no-repeat;
}
.reset-3c756112--S100Left-7c8af13a--logoDisplayNameContainer-583bfe61--logoText-03dbe4a1 {
  flex: 1;
  color: #242A31;
  margin: 0;
  display: block;
  padding: 0;
  padding-left: 8px;
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--S100Left-7c8af13a--logoDisplayNameContainer-583bfe61--logoText-03dbe4a1 {
    overflow: hidden;
    max-width: 50vw;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
}
.reset-3c756112--S100Left-7c8af13a--logoDisplayNameContainer-583bfe61--logoText-03dbe4a1:hover {
  color: #FF4642;
}
.text-4505230f--DisplayH700-a03ad9b4--textContentFamily-49a318e1--spaceNameText-677c2969 {
  font-size: 24px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
  overflow-wrap: break-word;
}
.reset-3c756112--desktopLogo-a594db90 {
  margin: 0;
  display: block;
  padding: 0;
}
@media screen and (max-width: 767px) {
  .reset-3c756112--desktopLogo-a594db90 {
    display: none;
  }
}
.reset-3c756112--tooltipContainer-7fdb9b70--medium-296350e4 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 40px;
  height: 40px;
  margin: 0;
  display: flex;
  padding: 0;
  border-radius: 3px;
}
.reset-3c756112--avatarFrame-2f40cdc9--medium-296350e4 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  -webkit-mask-image: -webkit-radial-gradient(white, black);
  -webkit-mask-image: -moz-radial-gradient(white, black);
  mask-image: -webkit-radial-gradient(white, black);
  mask-image: -moz-radial-gradient(white, black);
  width: 40px;
  height: 40px;
  margin: 0;
  display: flex;
  padding: 0;
  overflow: hidden;
  position: relative;
  mask-image: radial-gradient(white, black);
  align-items: center;
  border-radius: 3px;
  justify-content: center;
  -webkit-box-pack: center;
  -webkit-box-align: center;
  -webkit-mask-image: radial-gradient(white, black);
}
.reset-3c756112--headerInnerWrapper-629f79d1--headerInnerWrapper-4f99acea {
  flex: 1 1 auto;
  margin: 0px 88px;
  display: block;
  padding: 0;
  overflow: hidden;
  position: relative;
  max-width: 750px;
}
.reset-3c756112--headerInnerWrapper-629f79d1--headerInnerWrapper-4f99acea:after {
  background: -webkit-linear-gradient(to right, rgba(255,255,255,0) 0%, #FFFFFF 100%);
  background: -moz-linear-gradient(to right, rgba(255,255,255,0) 0%, #FFFFFF 100%);
  top: 0;
  right: 0;
  width: 32px;
  height: 100%;
  content: " ";
  position: absolute;
  background: linear-gradient(to right, rgba(255,255,255,0) 0%, #FFFFFF 100%);
  pointer-events: none;
}
@media screen and (max-width: 1439px) {
  .reset-3c756112--headerInnerWrapper-629f79d1--headerInnerWrapper-4f99acea {
    margin: 0px 24px 0px 88px;
  }
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--headerInnerWrapper-629f79d1--headerInnerWrapper-4f99acea {
    display: none;
  }
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48 {
  display: -webkit-box;
  overflow-x: auto;
  height: 100%;
  margin: 0;
  display: flex;
  opacity: 1;
  padding: 0;
  overflow-x: overlay;
  overflow-y: hidden;
  transition: flex 250ms ease,width 250ms ease,opacity 250ms ease;
  -moz-transition: flex 250ms ease,width 250ms ease,opacity 250ms ease;
  -webkit-transition: flex 250ms ease,width 250ms ease,opacity 250ms ease;
  -webkit-overflow-scrolling: touch;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-scrollbar {
  width: 4px;
  height: 4px;
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-scrollbar-track {
  background: none;
  border-width: 0;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
  transition: background 250ms ease;
  border-radius: 2px;
  -moz-transition: background 250ms ease;
  -webkit-transition: background 250ms ease;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-scrollbar-button {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-scrollbar-track-piece {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-scrollbar-corner {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-resizer {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48:hover::-webkit-scrollbar {
  display: initial;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48:hover::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
}
.reset-3c756112--searchInputWrapper-ea7f3052--searchInputWrapper-0442d130 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  height: 80px;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  max-width: 224px;
  align-items: center;
  -webkit-box-align: center;
}
.reset-3c756112--searchInputWrapper-ea7f3052--searchInputWrapper-0442d130:before {
  top: 50%;
  left: 0;
  height: 40px;
  content: " ";
  position: absolute;
  transform: translateY(-50%);
  border-left: 1px solid #E6ECF1;
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--searchInputWrapper-ea7f3052--searchInputWrapper-0442d130 {
    display: none;
  }
}
.reset-3c756112--inputContainer-b2cb171c {
  margin: 0;
  display: block;
  padding: 0;
  padding-left: 14px;
  padding-right: 16px;
}
.inputInner-5c86b87d--medium-0bbed4bd--inputInner-4216b016--searchInputPlaceholder-936306be {
  font: inherit;
  color: #242A31;
  width: 100%;
  border: none;
  cursor: inherit;
  height: 38px;
  margin: 0;
  resize: none;
  outline: none;
  padding: 0px 8px;
  background: transparent;
  box-sizing: border-box;
  text-align: left;
  line-height: inherit;
  border-radius: 3px;
}
.inputInner-5c86b87d--medium-0bbed4bd--inputInner-4216b016--searchInputPlaceholder-936306be::placeholder {
  color: #9DAAB6;
  font-size: 16px;
  font-weight: 500;
}
.reset-3c756112--inputWrapper-63396dac--TextH400-3033861f--medium-4505230f--light-502263b4--input-6d442051--searchInput-3fa812d5 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 100%;
  border: none;
  margin: 0;
  display: flex;
  outline: none;
  padding: 0;
  font-size: 16px;
  background: #FFFFFF;
  box-sizing: border-box;
  font-weight: 400;
  line-height: 1.625;
  border-radius: 3px;
  background-color: #FFFFFF;
}
.reset-3c756112--inputInnerSizer-756c9114 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
}
.reset-3c756112--inputAddOn-45de9ec1--inputAddOnPrefix-202fa60d--icon-1f8349b3 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 0 0 auto;
  color: #242A31;
  order: -1;
  margin: 0;
  display: flex;
  padding: 0;
  align-items: center;
  line-height: 1.2;
  white-space: nowrap;
  padding-left: 8px;
  -webkit-box-align: center;
}
.icon-7f6730be--text-3f89f380 {
  width: 1em;
  height: 1em;
  vertical-align: middle;
}
.reset-3c756112--bodyContent-2f98451b {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 1;
  color: #3B454E;
  width: 100%;
  margin: 0 auto;
  display: flex;
  padding: 0;
}
.reset-3c756112--wholeContent-9fc567d4 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  min-height: 100%;
  flex-direction: column;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--wholeContentBody-554be184 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 1;
  margin: 0;
  display: flex;
  padding: 0;
  transition: margin-bottom 250ms ease;
  align-items: stretch;
  -moz-transition: margin-bottom 250ms ease;
  -webkit-box-align: stretch;
  -webkit-transition: margin-bottom 250ms ease;
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--wholeContentBody-554be184 {
    padding-top: 80px;
  }
}
@media screen and (max-width: 767px) {
  .reset-3c756112--wholeContentBody-554be184 {
    padding-top: 60px;
  }
}
@keyframes keyframes-animation-2f81d449-0-1-196 {
  0% {
    background-color: rgba(24, 48, 85, 0);
  }
  100% {
    background-color: rgba(24, 48, 85, 0.30000000000000004);
  }
}
.reset-3c756112--backdrop-1322b68a--hidden-247382c3--overlay-29559ab8 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: 0;
  display: flex;
  padding: 0;
  z-index: 29;
  position: absolute;
  transition: background-color 250ms ease-out;
  align-items: center;
  animation-name: none;
  pointer-events: none;
  -moz-transition: background-color 250ms ease-out;
  justify-content: center;
  -webkit-box-pack: center;
  background-color: rgba(24, 48, 85, 0);
  -webkit-box-align: center;
  -webkit-transition: background-color 250ms ease-out;
  animation-duration: 0.2s;
  animation-fill-mode: forwards;
  animation-timing-function: ease-out;
}
@media screen and (min-width: 1024px) {
  .reset-3c756112--backdrop-1322b68a--hidden-247382c3--overlay-29559ab8 {
    z-index: 14;
  }
}
.reset-3c756112--contentNavigation-dd3370a4 {
  margin: 0;
  display: block;
  padding: 0;
  z-index: 30;
}
@media print {
  .reset-3c756112--contentNavigation-dd3370a4 {
    display: none;
  }
}
@media screen and (min-width: 1024px) {
  .reset-3c756112--contentNavigation-dd3370a4 {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    flex: 0 0 auto;
    width: calc((100% - 1448px) / 2 + 298px);
    display: flex;
    z-index: 15;
    min-width: 298px;
    background: #F5F7F9;
    align-items: stretch;
    border-right: 1px solid #E6ECF1;
    padding-left: calc((100% - 1448px) / 2);
    flex-direction: column;
    -webkit-box-align: stretch;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
  }
}
.reset-3c756112--contentNavigationInner-205d49ea--contentNavigationInnerCollapsed-7b4aca00 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--contentNavigationInner-205d49ea--contentNavigationInnerCollapsed-7b4aca00 {
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 30;
    position: fixed;
    max-width: 298px;
    transform: translateX(-100%) !important;
    box-shadow: none;
    overflow-y: auto;
    transition: transform 250ms ease;
    border-right: 1px solid #E6ECF1;
    -moz-transition: transform 250ms ease;
    background-color: #fff;
    -webkit-transition: transform 250ms ease;
  }
}
.reset-3c756112--sidebarWrapper-84a13d8e {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: auto;
  width: 100%;
  height: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  align-items: stretch;
  flex-direction: column;
  -webkit-box-align: stretch;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112 {
  margin: 0;
  display: block;
  padding: 0;
}
.reset-3c756112--sidebar-84a13d8e {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: auto;
  width: 100%;
  height: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  align-items: stretch;
  flex-direction: column;
  -webkit-box-align: stretch;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--sidebarMain-13701e8f {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  height: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  overflow-y: hidden;
  flex-direction: column;
  background-color: #F5F7F9;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe {
  overflow-y: auto;
  flex: 1 1 auto;
  width: 100%;
  margin: 0;
  display: block;
  padding: 0;
  overflow-x: hidden;
  overflow-y: overlay;
  -webkit-overflow-scrolling: touch;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-scrollbar {
  width: 4px;
  height: 4px;
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-scrollbar-track {
  background: none;
  border-width: 0;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
  transition: background 250ms ease;
  border-radius: 2px;
  -moz-transition: background 250ms ease;
  -webkit-transition: background 250ms ease;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-scrollbar-button {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-scrollbar-track-piece {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-scrollbar-corner {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-resizer {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe:hover::-webkit-scrollbar {
  display: initial;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe:hover::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
}
.reset-3c756112--mobileHeader-4e2d4892 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #74818D;
  height: 59px;
  margin: 0;
  display: flex;
  padding: 0;
  box-shadow: 0 1px 1px 0 rgba(116, 129, 141, 0.1);
  align-items: stretch;
  border-bottom: 1px solid #d4dadf;
  background-color: #FFFFFF;
  -webkit-box-align: stretch;
}
@media screen and (min-width: 768px) {
  .reset-3c756112--mobileHeader-4e2d4892 {
    display: none;
  }
}
.reset-3c756112--mobileHeaderClose-47b8fa64 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  cursor: pointer;
  margin: 0;
  display: flex;
  padding: 8px 16px;
  font-size: 24px;
  align-items: center;
  -webkit-box-align: center;
}
.reset-3c756112--pagesTree-4b07cd56 {
  margin: 0;
  display: block;
  padding: 0;
  font-size: 15px;
  margin-top: 32px;
  padding-left: 16px;
}
@media screen and (min-width: 768px) {
  .reset-3c756112--pagesTree-4b07cd56 {
    padding-left: 24px;
  }
}
.reset-3c756112--pageItem-01e3f344 {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
  border-left: 1px solid transparent;
}
.reset-3c756112--pageComponent-7cc5301a {
  margin: 0;
  display: block;
  padding: 0;
  margin-left: -1px;
}
.navButton-94f2579c--S300Bottom-9b4658d2--navButtonClickable-161b88ca {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: inherit;
  border: 1px solid transparent;
  cursor: pointer;
  display: flex;
  padding: 7px 24px 7px 16px;
  position: relative;
  align-items: center;
  border-right: 0;
  margin-bottom: 24px;
  text-decoration: none;
  -webkit-box-align: center;
}
.navButton-94f2579c--S300Bottom-9b4658d2--navButtonClickable-161b88ca:hover {
  background-color: #E6ECF1;
}
.text-4505230f--UIH300-2063425d--textContentFamily-49a318e1--navButtonLabel-14a4968f {
  flex: 1;
  font-size: 14px;
  word-break: break-word;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
}
.reset-3c756112--pageItemWithChildren-56f27afc--S300Bottom-9b4658d2 {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
  margin-bottom: 24px;
}
.reset-3c756112--navButton-94f2579c--pageGroup-2c5d8183 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #9DAAB6;
  border: 1px solid transparent;
  margin: 0;
  display: flex;
  padding: 7px 24px 7px 16px;
  position: relative;
  align-items: center;
  border-right: 0;
  text-decoration: none;
  -webkit-box-align: center;
}
.text-4505230f--InfoH200-3a8a7a86--textContentFamily-49a318e1 {
  font-size: 12px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: 1.2px;
  text-transform: uppercase;
}
.reset-3c756112--pageChildren-56f27afc--pageGroupChildren-2d50aefa {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
  margin-left: 0;
}
.reset-3c756112--pageItemWithChildren-56f27afc {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
}
.navButton-94f2579c--navButtonClickable-161b88ca {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: inherit;
  border: 1px solid transparent;
  cursor: pointer;
  display: flex;
  padding: 7px 24px 7px 16px;
  position: relative;
  align-items: center;
  border-right: 0;
  text-decoration: none;
  -webkit-box-align: center;
}
.navButton-94f2579c--navButtonClickable-161b88ca:hover {
  background-color: #E6ECF1;
}
.navButton-94f2579c--navButtonClickable-161b88ca--navButtonOpened-6a88552e {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: inherit;
  border: 1px solid transparent;
  cursor: pointer;
  display: flex;
  padding: 7px 24px 7px 16px;
  position: relative;
  align-items: center;
  border-color: #E6ECF1 !important;
  border-right: 0;
  text-decoration: none;
  background-color: #FFFFFF;
  -webkit-box-align: center;
}
.navButton-94f2579c--navButtonClickable-161b88ca--navButtonOpened-6a88552e:hover {
  border-color: #E6ECF1;
  background-color: #FFFFFF;
}
.reset-3c756112--footer-68e6f18c {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
}
.reset-3c756112--footer-68e6f18c:before {
  background: -webkit-linear-gradient(to bottom, rgba(255,255,255,0) 0%, #F5F7F9 100%);
  background: -moz-linear-gradient(to bottom, rgba(255,255,255,0) 0%, #F5F7F9 100%);
  top: -24px;
  width: 100%;
  height: 24px;
  content: "";
  display: block;
  position: absolute;
  background: linear-gradient(to bottom, rgba(255,255,255,0) 0%, #F5F7F9 100%);
}
.reset-3c756112--trademark-a8da4b94 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #9DAAB6;
  margin: 16px;
  display: flex;
  padding: 0;
  align-items: center;
  margin-left: 32px;
  padding-top: 8px;
  padding-left: 16px;
  border-radius: 3px;
  padding-right: 16px;
  padding-bottom: 8px;
  text-decoration: none;
  background-color: #E6ECF1;
  -webkit-box-align: center;
}
.reset-3c756112--trademark-a8da4b94:hover {
  color: #3884FF;
}
.reset-3c756112--trademarkLogo-0d2d53bc {
  margin: 0;
  display: block;
  padding: 0;
  font-size: 40px;
}
.reset-3c756112--trademarkContent-04a01aea {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
  padding-left: 16px;
}
.text-4505230f--TextH200-a3425406--textUIFamily-5ebd8e40 {
  font-size: 12px;
  font-family: "Roboto", sans-serif;
  font-weight: 400;
  line-height: 1.625;
}
.reset-3c756112--wholeContentPage-6c3f1fc5 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 1 1 auto;
  margin: 0;
  display: flex;
  padding: 0;
  max-width: 100%;
  min-width: 0;
  background: #fff;
  flex-direction: column;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--wholePageSticky-f53dafd2 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 1 1 auto;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  min-width: 0;
}
.reset-3c756112--pageContainer-544d6e9c {
  flex: 1 1 auto;
  margin: 0px 16px;
  display: block;
  padding: 0;
  max-width: 750px;
  min-width: 0;
  padding-bottom: 64px;
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--pageContainer-544d6e9c {
    margin: 0px auto;
    padding: 0px 24px 24px;
  }
}
@media screen and (min-width: 1024px) {
  .reset-3c756112--pageContainer-544d6e9c {
    margin: 0px 88px;
  }
}
.reset-3c756112--pageHeader-15724735 {
  margin: 0;
  display: block;
  padding: 0;
  border-bottom: 2px solid #E6ECF1;
  margin-bottom: 32px;
}
.reset-3c756112--pageHeaderInner-7c0f0284 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: auto;
  margin: 0;
  display: flex;
  padding: 40px 0px;
}
@media screen and (min-width: 768px) {
  .reset-3c756112--pageHeaderInner-7c0f0284 {
    flex-wrap: wrap;
    align-items: baseline;
    flex-direction: row;
    -webkit-box-align: baseline;
    -webkit-box-lines: multiple;
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
  }
}
.reset-3c756112--pageHeaderWrapperContent-6897c946 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
}
.reset-3c756112--horizontalFlex-5a0077e0 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  margin: 0;
  display: flex;
  padding: 0;
  align-items: stretch;
  justify-content: space-between;
  -webkit-box-pack: justify;
  -webkit-box-align: stretch;
}
.reset-3c756112--pageHeaderIntro-0c1463da {
  flex: 1 1 auto;
  margin: 0;
  display: block;
  padding: 0;
  padding-right: 16px;
}
.reset-3c756112--pageTitle-33dc39a3 {
  color: #242A31;
  width: 100%;
  border: none;
  margin: 0;
  display: block;
  outline: none;
  padding: 0;
  background: none;
  border-radius: 3px;
}
.text-4505230f--DisplayH900-bfb998fa--textContentFamily-49a318e1 {
  font-size: 32px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
}
.reset-3c756112--toolbar-a6a9f7d2--medium-8e46b02c--pageHeaderToolbar-6457a802--withControlsClosed-3e96e46c {
  display: -ms-inline-grid;
  margin: 0;
  display: none;
  padding: 0;
  margin-top: 9px;
  -ms-grid-rows: none;
  grid-column-gap: 16px;
  grid-template-rows: none;
}
@media screen and (max-width: 1279px) {
  .reset-3c756112--toolbar-a6a9f7d2--medium-8e46b02c--pageHeaderToolbar-6457a802--withControlsClosed-3e96e46c {
    display: block;
  }
}
.button-36063075--small-30ceeddb--button-5c53d970--small-54db2a94 {
  display: -webkit-inline-box;
  display: -moz-inline-box;
  display: -ms-inline-flexbox;
  display: -webkit-inline-flex;
  color: #9DAAB6;
  width: 30px;
  border: 1px solid;
  cursor: pointer;
  height: 30px;
  display: inline-flex;
  outline: none;
  padding: 0;
  transition: all 250ms ease-out;
  align-items: center;
  line-height: 1em;
  white-space: nowrap;
  border-color: transparent;
  border-radius: 3px;
  -moz-transition: all 250ms ease-out;
  justify-content: center;
  text-decoration: none;
  -webkit-box-pack: center;
  background-color: transparent;
  -webkit-box-align: center;
  -webkit-transition: all 250ms ease-out;
}
.button-36063075--small-30ceeddb--button-5c53d970--small-54db2a94:disabled {
  opacity: 0.5;
  pointer-events: none;
}
.button-36063075--small-30ceeddb--button-5c53d970--small-54db2a94:hover {
  color: #FF4642;
}
.small-3bde6db7--iconOnly-bddce91a {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  margin: 0;
  display: flex;
  font-size: 18px;
  align-items: center;
  justify-content: center;
  -webkit-box-pack: center;
  -webkit-box-align: center;
}
.text-4505230f--UIH300-2063425d--textUIFamily-5ebd8e40--text-8ee2c8b2 {
  font-size: 14px;
  font-family: "Roboto", sans-serif;
  font-weight: 500;
  line-height: 1em;
}
.reset-3c756112--pageHeaderDescription-22970244 {
  flex: auto;
  margin: 0;
  display: block;
  padding: 0;
}
.reset-3c756112--toaster-c029690e {
  top: 16px;
  left: 50%;
  margin: 0;
  display: block;
  padding: 0;
  z-index: 160;
  position: fixed;
  transform: translateX(-50%);
}
.reset-3c756112--pageBody-a91db4ac {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  font-size: 16px;
  flex-direction: column;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--container-960c7c26 {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
  margin-bottom: -24px;
}
.blockHeading-442b4f12 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  margin: 0;
  display: flex;
  position: relative;
  margin-bottom: 24px;
}
.blockHeadingContent-756c9114 {
  flex: 1;
}
.text-4505230f--HeadingH700-04e1a2a3--textContentFamily-49a318e1 {
  font-size: 24px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 700;
  line-height: 1.5;
}
.blockHeadingAnchor-34f75d78--blockHeadingAnchorHidden-d69b5eda {
  color: #242A31;
  width: 20px;
  opacity: 0;
  transition: opacity 150ms ease;
  line-height: 1em;
  padding-left: 4px;
  -moz-transition: opacity 150ms ease;
  -webkit-transition: opacity 150ms ease;
}
.blockHeadingAnchor-34f75d78--blockHeadingAnchorHidden-d69b5eda:hover {
  color: #3884FF;
}
@media print {
  .blockHeadingAnchor-34f75d78--blockHeadingAnchorHidden-d69b5eda {
    display: none;
  }
}
.blockHeadingAnchorIcon-1c2bf3cb {
  font-size: 16px;
  vertical-align: middle;
}
.reset-3c756112--blockHeadingUp-c32402b2 {
  width: 1em;
  cursor: pointer;
  height: 1em;
  margin: 0;
  display: block;
  outline: none;
  padding: 0;
  line-height: 1em;
}
@media screen and (min-width: 768px) {
  .reset-3c756112--blockHeadingUp-c32402b2 {
    display: none;
  }
}
@media print {
  .reset-3c756112--blockHeadingUp-c32402b2 {
    display: none;
  }
}
.blockParagraph-544a408c {
  color: inherit;
  margin: 0;
  position: relative;
  margin-bottom: 24px;
}
.text-4505230f--TextH400-3033861f--textContentFamily-49a318e1 {
  font-size: 16px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 400;
  line-height: 1.625;
}
.link-a079aa82--primary-53a25e66--link-faf6c434 {
  color: #3884FF;
  cursor: pointer;
  text-decoration: none;
}
.link-a079aa82--primary-53a25e66--link-faf6c434:hover {
  text-decoration: underline;
}
.blockHeading-442b4f12--blockHeading1WithMargin-b69d755e {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  margin: 0;
  display: flex;
  position: relative;
  margin-top: 73px;
  margin-bottom: 24px;
}
.blockHeading-442b4f12--blockHeading1WithMargin-b69d755e:before {
  top: -32px;
  left: 0;
  width: 100%;
  height: 1px;
  content: " ";
  position: absolute;
  background-color: #E6ECF1;
}
.reset-3c756112--codeBlockWrapper-56f27afc {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
}
.reset-3c756112--copyButtonWrapper-ca591f6e {
  top: 16px;
  right: 16px;
  margin: 0;
  display: block;
  padding: 0;
  z-index: 1;
  position: absolute;
}
@keyframes keyframes-animation-bd7e9c6a-0-1-197 {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
.reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe {
  color: #9DAAB6;
  cursor: pointer;
  margin: 0;
  display: block;
  opacity: 0.5;
  outline: none;
  padding: 8px;
  position: relative;
  font-size: 16px;
  line-height: 1em;
}
.reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe:hover {
  opacity: 1;
}
@media print {
  .reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe {
    display: none;
  }
}
.reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe:after {
  width: -webkit-max-content;
  width: -moz-max-content;
  top: calc(100% + 16px);
  left: 50%;
  color: #FFFFFF;
  width: max-content;
  bottom: auto;
  content: attr(aria-label);
  display: none;
  opacity: 0;
  padding: 5px 8px;
  z-index: 155;
  position: absolute;
  font-size: 12px;
  max-width: 300px;
  transform: translateX(-50%);
  background: #242A31;
  font-weight: 400;
  line-height: 1.625;
  white-space: normal;
  border-radius: 3px;
  animation-name: keyframes-animation-bd7e9c6a-0-1-197;
  pointer-events: none;
  text-transform: none;
  animation-duration: 0.2s;
  animation-fill-mode: forwards;
}
.reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe:before {
  top: calc(100% + 8px);
  left: 50%;
  width: 0;
  bottom: auto;
  height: 0;
  content: "";
  display: none;
  opacity: 0;
  z-index: 156;
  position: absolute;
  transform: translateX(-50%);
  border-color: #242A31 transparent;
  border-style: solid;
  animation-name: keyframes-animation-bd7e9c6a-0-1-197;
  border-top-width: 0;
  border-left-width: 8px;
  animation-duration: 0.2s;
  border-right-width: 8px;
  animation-fill-mode: forwards;
  border-bottom-width: 8px;
}
.reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe:hover:before {
  display: block;
}
.reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe:hover:after {
  display: block;
}
.reset-3c756112--codeBlock-36378b66 {
  color: #E6ECF1;
  margin: 32px 0px;
  display: block;
  hyphens: none;
  padding: 24px 24px 24px 8px;
  overflow: auto;
  tab-size: 2;
  direction: ltr;
  font-size: 14px;
  background: #183055;
  text-align: left;
  word-break: normal;
  -ms-hyphens: none;
  font-family: "Source Code Pro", Consolas, Menlo, Monaco, Courier, monospace;
  line-height: 1.4;
  white-space: pre;
  word-spacing: normal;
  -moz-tab-size: 2;
  border-radius: 3px;
  -webkit-hyphens: none;
}
@supports (-moz-appearance:none) {
  .reset-3c756112--codeBlock-36378b66 {
    font-family: Consolas, Menlo, Monaco, Courier, monospace;
  }
}
.reset-3c756112--codeBlock-36378b66::selection {
  background: #D3DCE4;
  text-shadow: none;
}
.codeLine-a3169fbc {
  font: inherit;
  padding: 0px 0px;
  position: relative;
  word-wrap: normal;
  white-space: pre;
  padding-left: 44px;
  padding-right: 14px;
  counter-increment: line;
}
.codeLine-a3169fbc:not(:only-child):before {
  top: 2px;
  left: 4px;
  color: #5C6975;
  width: 24px;
  bottom: 0;
  content: counter(line);
  display: inline-block;
  overflow: hidden;
  position: absolute;
  font-size: 12px;
  text-align: right;
  user-select: none;
  white-space: nowrap;
  text-overflow: ellipsis;
  -ms-user-select: none;
  -moz-user-select: none;
  background-color: transparent;
  -webkit-user-select: none;
}
.codeLine-a3169fbc:only-child {
  padding-left: 30px;
}
.blockHeading-442b4f12--blockHeading2WithMargin-532d771d {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  margin: 0;
  display: flex;
  position: relative;
  margin-top: 32px;
  margin-bottom: 24px;
}
.text-4505230f--HeadingH600-23f228db--textContentFamily-49a318e1 {
  font-size: 20px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 700;
  line-height: 1.5;
}
.blockQuote-7a0db092 {
  color: #74818D;
  margin: 0;
  padding: 0;
  border-left: 4px solid;
  border-color: #E6ECF1;
  padding-left: 12px;
  margin-bottom: 24px;
}
.blockParagraph-544a408c--blockParagraphQuoted-280e03a6 {
  color: #74818D;
  margin: 0;
  position: relative;
  margin-bottom: 24px;
}
.bold-3c254bd9 {
  font-weight: 700;
}
.blockHeading-442b4f12--blockHeading3WithMargin-532d7700 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  margin: 0;
  display: flex;
  position: relative;
  margin-top: 24px;
  margin-bottom: 24px;
}
.text-4505230f--HeadingH400-686c0942--textContentFamily-49a318e1 {
  font-size: 16px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 700;
  line-height: 1.5;
}
.list-20526648 {
  color: #3B454E;
  margin: 0;
  padding: 0;
  padding-left: 2em;
  margin-bottom: 24px;
}
.reset-3c756112--listItemContent-756c9114 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
}
.blockParagraph-544a408c--noMargin-acdf7afa {
  color: inherit;
  margin: 0;
  position: relative;
  margin-bottom: 0;
}
.reset-3c756112--pageFooter-f1d5e2b0 {
  margin: 0;
  display: block;
  padding: 0;
  margin-top: 64px;
}
@media print {
  .reset-3c756112--pageFooter-f1d5e2b0 {
    display: none;
  }
}
.reset-3c756112--navPagesLinks-67bea901 {
  display: -ms-grid;
  width: auto;
  margin: 0;
  display: grid;
  padding: 0;
  -ms-grid-rows: auto;
  grid-column-gap: 24px;
  -ms-grid-columns: 1fr 1fr;
  grid-template-rows: auto;
  grid-template-areas: "previous next";
  grid-template-columns: 1fr 1fr;
}
@media screen and (max-width: 767px) {
  .reset-3c756112--navPagesLinks-67bea901 {
    grid-row-gap: 24px;
    -ms-grid-columns: 1fr;
    grid-template-areas: "next" "previous";
    grid-template-columns: 1fr;
  }
}
.reset-3c756112--card-6570f064--whiteCard-fff091a4--cardPrevious-56a5e674 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  border: 1px solid #E6ECF1;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  grid-area: previous;
  align-self: stretch;
  box-shadow: 0 3px 8px 0 rgba(116, 129, 141, 0.1);
  transition: border 250ms ease;
  align-items: center;
  justify-self: stretch;
  border-radius: 3px;
  flex-direction: row;
  -moz-transition: border 250ms ease;
  text-decoration: none;
  background-color: #FFFFFF;
  -webkit-box-align: center;
  page-break-inside: avoid;
  -ms-grid-row-align: stretch;
  -webkit-box-orient: horizontal;
  -webkit-transition: border 250ms ease;
  -ms-grid-column-align: stretch;
  -webkit-box-direction: normal;
}
.reset-3c756112--cardIcon-5b647d22 {
  flex: 0 0 auto;
  color: #9DAAB6;
  margin: 0;
  display: block;
  padding: 16px;
  font-size: 24px;
  transition: color 250ms ease;
  -moz-transition: color 250ms ease;
  -webkit-transition: color 250ms ease;
}
.reset-3c756112--cardIcon-5b647d22:first-child {
  padding-right: 0;
}
.reset-3c756112--cardIcon-5b647d22:last-child {
  padding-left: 0;
}
.reset-3c756112--cardBody-25dca3b1--cardPreviousBody-79f02c06 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 16px;
  text-align: right;
}
.reset-3c756112--cardHint-2c5d8183 {
  color: #9DAAB6;
  margin: 0;
  display: block;
  padding: 0;
}
.text-4505230f--TextH200-a3425406--textContentFamily-49a318e1 {
  font-size: 12px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 400;
  line-height: 1.625;
}
.reset-3c756112--cardTitle-32aa092e {
  margin: 0;
  display: block;
  padding: 0;
  transition: color 250ms ease;
  -moz-transition: color 250ms ease;
  -webkit-transition: color 250ms ease;
}
.text-4505230f--UIH400-4e41e82a--textContentFamily-49a318e1 {
  font-size: 16px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
}
.reset-3c756112--card-6570f064--whiteCard-fff091a4--cardNext-19241c42 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  border: 1px solid #E6ECF1;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  grid-area: next;
  align-self: stretch;
  box-shadow: 0 3px 8px 0 rgba(116, 129, 141, 0.1);
  transition: border 250ms ease;
  align-items: center;
  justify-self: stretch;
  border-radius: 3px;
  flex-direction: row;
  -moz-transition: border 250ms ease;
  text-decoration: none;
  background-color: #FFFFFF;
  -webkit-box-align: center;
  page-break-inside: avoid;
  -ms-grid-row-align: stretch;
  -webkit-box-orient: horizontal;
  -webkit-transition: border 250ms ease;
  -ms-grid-column-align: stretch;
  -webkit-box-direction: normal;
}
.reset-3c756112--cardBody-25dca3b1 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 16px;
}
.reset-3c756112--pageFooterColumns-ef8f347e {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  margin: 0;
  display: flex;
  padding: 0;
  border-top: 2px solid #E6ECF1;
  margin-top: 24px;
  align-items: center;
  padding-top: 24px;
  flex-direction: row;
  -webkit-box-align: center;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
}
@media screen and (max-width: 767px) {
  .reset-3c756112--pageFooterColumns-ef8f347e {
    align-items: stretch;
    flex-direction: column;
    -webkit-box-align: stretch;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
  }
}
.reset-3c756112--pageFooterSummary-12074aff {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
}
@media screen and (max-width: 767px) {
  .reset-3c756112--pageFooterSummary-12074aff {
    margin-bottom: 16px;
  }
}
.reset-3c756112--pageChangesSummary-08821678 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: auto;
  margin: 0;
  display: flex;
  padding: 0;
  align-items: center;
  -webkit-box-align: center;
}
.reset-3c756112--pageContributors-5c59582e {
  flex: 0 0 auto;
  margin: 0;
  display: block;
  padding: 0;
  margin-right: 8px;
}
.reset-3c756112--ownerAvatarList-696792ce {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  margin: 0;
  display: flex;
  padding: 0;
  flex-direction: row-reverse;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: reverse;
}
@keyframes keyframes-animation-bd7e9c6a-0-1-198 {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
.reset-3c756112--tooltipContainer-7fdb9b70--tooltipped-57ae51fe--bottom-f9ec01b8--small-2ec8ae1a--circle-6c5acd10--ownerAvatarStackListItem-1b188f0f--whiteOutline-6045f802 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 30px;
  height: 30px;
  margin: 0;
  display: flex;
  padding: 0;
  z-index: 0;
  position: relative;
  box-shadow: 0 0 0 2px white;
  border-radius: 128px;
}
.reset-3c756112--tooltipContainer-7fdb9b70--tooltipped-57ae51fe--bottom-f9ec01b8--small-2ec8ae1a--circle-6c5acd10--ownerAvatarStackListItem-1b188f0f--whiteOutline-6045f802:after {
  width: -webkit-max-content;
  width: -moz-max-content;
  top: calc(100% + 16px);
  left: 50%;
  color: #FFFFFF;
  width: max-content;
  bottom: auto;
  content: attr(aria-label);
  display: none;
  opacity: 0;
  padding: 5px 8px;
  z-index: 155;
  position: absolute;
  font-size: 12px;
  max-width: 300px;
  transform: translateX(-50%);
  background: #242A31;
  font-weight: 400;
  line-height: 1.625;
  white-space: normal;
  border-radius: 3px;
  animation-name: keyframes-animation-bd7e9c6a-0-1-198;
  pointer-events: none;
  text-transform: none;
  animation-duration: 0.2s;
  animation-fill-mode: forwards;
}
.reset-3c756112--tooltipContainer-7fdb9b70--tooltipped-57ae51fe--bottom-f9ec01b8--small-2ec8ae1a--circle-6c5acd10--ownerAvatarStackListItem-1b188f0f--whiteOutline-6045f802:before {
  top: calc(100% + 8px);
  left: 50%;
  width: 0;
  bottom: auto;
  height: 0;
  content: "";
  display: none;
  opacity: 0;
  z-index: 156;
  position: absolute;
  transform: translateX(-50%);
  border-color: #242A31 transparent;
  border-style: solid;
  animation-name: keyframes-animation-bd7e9c6a-0-1-198;
  border-top-width: 0;
  border-left-width: 8px;
  animation-duration: 0.2s;
  border-right-width: 8px;
  animation-fill-mode: forwards;
  border-bottom-width: 8px;
}
.reset-3c756112--tooltipContainer-7fdb9b70--tooltipped-57ae51fe--bottom-f9ec01b8--small-2ec8ae1a--circle-6c5acd10--ownerAvatarStackListItem-1b188f0f--whiteOutline-6045f802:nth-last-child(n+2) {
  margin-left: -8px;
}
.reset-3c756112--tooltipContainer-7fdb9b70--tooltipped-57ae51fe--bottom-f9ec01b8--small-2ec8ae1a--circle-6c5acd10--ownerAvatarStackListItem-1b188f0f--whiteOutline-6045f802:hover:before {
  display: block;
}
.reset-3c756112--tooltipContainer-7fdb9b70--tooltipped-57ae51fe--bottom-f9ec01b8--small-2ec8ae1a--circle-6c5acd10--ownerAvatarStackListItem-1b188f0f--whiteOutline-6045f802:hover:after {
  display: block;
}
.reset-3c756112--avatarFrame-2f40cdc9--small-2ec8ae1a--circle-6c5acd10 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  -webkit-mask-image: -webkit-radial-gradient(white, black);
  -webkit-mask-image: -moz-radial-gradient(white, black);
  mask-image: -webkit-radial-gradient(white, black);
  mask-image: -moz-radial-gradient(white, black);
  width: 30px;
  height: 30px;
  margin: 0;
  display: flex;
  padding: 0;
  overflow: hidden;
  position: relative;
  mask-image: radial-gradient(white, black);
  align-items: center;
  border-radius: 128px;
  justify-content: center;
  -webkit-box-pack: center;
  -webkit-box-align: center;
  -webkit-mask-image: radial-gradient(white, black);
}
.reset-3c756112--innerShadow-7a3a8651 {
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: 0;
  display: block;
  padding: 0;
  position: absolute;
  box-shadow: inset 0 0 1px 1px rgba(24, 48, 85, 0.1);
  border-radius: 128px;
  pointer-events: none;
}
.reset-3c756112--pageEditedDate-b805c39a {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: auto;
  color: #9DAAB6;
  margin: 0;
  display: flex;
  padding: 0;
}
.reset-3c756112--pageSide-ad9fed26 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 0 0 auto;
  width: 224px;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  margin-right: auto;
}
@media print {
  .reset-3c756112--pageSide-ad9fed26 {
    display: none;
  }
}
@media screen and (max-width: 1279px) {
  .reset-3c756112--pageSide-ad9fed26 {
    display: none;
  }
}
.reset-3c756112--stickyContainer-2bed3a82 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
  max-width: 100%;
}
.reset-3c756112--tocWrapper-506ea24c {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  height: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  padding-top: 40px;
  flex-direction: column;
  padding-bottom: 40px;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114 {
  overflow-y: auto;
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
  overflow-x: hidden;
  overflow-y: overlay;
  -webkit-overflow-scrolling: touch;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-scrollbar {
  width: 4px;
  height: 4px;
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-scrollbar-track {
  background: none;
  border-width: 0;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
  transition: background 250ms ease;
  border-radius: 2px;
  -moz-transition: background 250ms ease;
  -webkit-transition: background 250ms ease;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-scrollbar-button {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-scrollbar-track-piece {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-scrollbar-corner {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-resizer {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114:hover::-webkit-scrollbar {
  display: initial;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114:hover::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
}
.reset-3c756112--pageSideSection-542f1fd5 {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
}
.reset-3c756112--pageSideSection-542f1fd5:before {
  top: 0;
  left: 0;
  height: 100%;
  content: " ";
  position: absolute;
  border-left: 1px solid #E6ECF1;
}
.reset-3c756112--menu-5b8a7448--pageToc-16c35922--pageTocLive-542f1fd5 {
  display: -webkit-box;
  flex: 1;
  margin: 0;
  display: flex;
  padding: 0;
  overflow: hidden;
  position: relative;
  min-width: 224px;
  counter-reset: toc;
  flex-direction: column;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
@media print {
  .reset-3c756112--menu-5b8a7448--pageToc-16c35922--pageTocLive-542f1fd5 {
    display: none;
  }
}
.reset-3c756112--menu-5b8a7448--pageToc-16c35922--pageTocLive-542f1fd5:before {
  top: 0;
  left: 0;
  height: 100%;
  content: " ";
  position: absolute;
  border-left: 1px solid #E6ECF1;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496 {
  overflow-y: auto;
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
  overflow-x: hidden;
  overflow-y: overlay;
  -webkit-overflow-scrolling: touch;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-scrollbar {
  width: 4px;
  height: 4px;
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-scrollbar-track {
  background: none;
  border-width: 0;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
  transition: background 250ms ease;
  border-radius: 2px;
  -moz-transition: background 250ms ease;
  -webkit-transition: background 250ms ease;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-scrollbar-button {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-scrollbar-track-piece {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-scrollbar-corner {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-resizer {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496:hover::-webkit-scrollbar {
  display: initial;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496:hover::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
}
.reset-3c756112--menuHeader-342906de--menuHeaderLight-2c5d8183 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #9DAAB6;
  margin: 0;
  display: flex;
  padding: 0;
  padding-left: 24px;
  margin-bottom: 8px;
}
.reset-3c756112--menuHeaderIcon-0c3ed569 {
  margin: 0;
  display: block;
  padding: 0;
  margin-right: 8px;
}
.text-4505230f--InfoH100-1e92e1d1--textContentFamily-49a318e1 {
  font-size: 10px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 700;
  line-height: 1;
  letter-spacing: 1.2px;
  text-transform: uppercase;
}
.reset-3c756112--menuItem-aa02f6ec--menuItemLight-757d5235--menuItemInline-173bdf97--pageTocItem-f4427024 {
  display: -webkit-box;
  color: #74818D;
  cursor: pointer;
  margin: 0;
  display: flex;
  padding: 4px 16px;
  align-items: center;
  padding-left: 24px;
  vertical-align: middle;
  text-decoration: none;
  -webkit-box-align: center;
}
.reset-3c756112--menuItem-aa02f6ec--menuItemLight-757d5235--menuItemInline-173bdf97--pageTocItem-f4427024:hover {
  background: none;
  text-decoration: inherit;
}
.link-a079aa82--primary-53a25e66 {
  color: #3884FF;
  cursor: pointer;
  text-decoration: underline;
}
.reset-3c756112--menuItemContent-c44ec79e {
  margin: 0;
  display: block;
  padding: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.text-4505230f--UIH300-2063425d--textContentFamily-49a318e1 {
  font-size: 14px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
}
.text-4505230f--UIH200-50ead35f--textContentFamily-49a318e1 {
  font-size: 12px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
}
.text-4505230f--UIH200-50ead35f--textContentFamily-49a318e1--pageTocLinkH2-2294976c {
  font-size: 12px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
  padding-left: 16px;
}
        
        
            soga 后端文档soga 后端文档功能介绍功能介绍社区版与商业版区别获取商业版授权码前端安装选择合适的前端docker 对接Docker 对接通用教程soga 配置详细说明soga - v2ray 教程SSPanel Uim 对接 v2rayV2board 对接 v2rayVNetPanel 对接 v2rayWHMCS 对接 v2rayProxyPanel 对接 v2raysoga - trojan 教程SSPanel Uim 对接 trojanV2board 对接 trojanVNetPanel 对接 trojanProxyPanel 对接 trojansoga - ss 教程V2board 对接 ssSSPanel Uim 对接 ss 单端口SSPanel Uim 对接 ss 多端口soga - ssr 教程SSPanel Uim 对接 ssr 单端口SSPanel Uim 对接 ssr 多端口ProxyPanel 对接 ssr 单端口其它相关教程审计规则配置dns规则配置中转获取真实 IP 教程增强限制用户 IP 数/设备数不使用 docker 启动多实例VMessAEAD 说明由 GitBook 提供支持SSPanel Uim 对接 trojan详细图文教程（推荐）​https://blog.sprov.xyz/2020/06/06/sspanel-uim-v2ray-trojan/​一键安装&amp;更新bash &lt;(curl -Ls https://blog.sprov.xyz/soga.sh)或者，两个都可以bash &lt;(curl -Ls https://raw.githubusercontent.com/sprov065/soga/master/install.sh)第一步，配置前端节点地址节点地址格式：域名或IP;port=连接端口#偏移端口  (偏移端口可选)示例：未加入偏移端口，后端实际监听443端口，用户连接443端口hk.aaa.com;port=443偏移端口加入偏移端口后，后端实际监听12345端口，用户连接443端口gz.aaa.com;port=443#12345|host=hk.aaa.com中转使用场景中转机地址;port=落地机监听端口#中转机监听端口|host=证书域名第二步，配置 soga配置命令：# 输出当前配置文件内容soga config​# 对配置文件进行配置，一次可填写多个，也可以调用多次soga config xxx=xxx yyy=yyy第一次安装完成后，编辑配置文件：配置文件位置在 /etc/soga/soga.conf配置文件位置在 /etc/soga/soga.conf配置文件位置在 /etc/soga/soga.conf基础配置type=sspanel-uim                             # 必填这个server_type=trojan                           # 必填这个api=webapi                                   # webapi 或 db，表示 webapi 对接或数据库对接​# webapi 对接webapi_url=https://xxx.com/                  # webapi url，填写面板主页地址webapi_mukey=xxxx                            # webapi key​# 数据库对接db_host=db.xxx.com                           # 数据库地址db_port=3306                                 # 数据库端口db_name=name                                 # 数据库名db_user=root                                 # 数据库用户名db_password=asdasdasd                        # 数据库密码​node_id=1                                    # 节点idsoga_key=                                    # 授权key，社区版无需填写，最多支持88用户，商业版无限制user_conn_limit=0                            # 限制用户IP数，0代表无限制，默认会优先使用面板设置的限制IP数，在部分旧版面板下可能会获取不到，则使用这个值trojan_remote_addr=127.0.0.1                 # 可选功能，trojan 反代地址，防止主动探测，务必搭建一个http服务trojan_remote_port=80                        # 可选功能，trojan 反代端口，防止主动探测，务必搭建一个http服务​default_dns=8.8.8.8,1.1.1.1                  # 配置默认dns，可在此配置流媒体解锁的dns，以逗号分隔dns_cache_time=10                            # 自定义dns缓存时间，单位分钟，仅在设置了default_dns时有效，或者v2board设置了dns规则时也有效​proxy_protocol=false                         # 具体请参看中转获取真实 IP 教程auto_update=false                            # soga 自动更新，只会检测稳定版配置证书trojan 必须要配置证书soga 支持三种方式配置证书，任选其一即可① 手动指定证书路径以 / 开头的绝对路径cert_file=                                   # 手动指定证书路径key_file=                                    # 手动指定密钥路径② http 模式自动申请证书（推荐）确保服务器中没有其它程序占用 80 端口，申请和续签时需要临时使用确保域名已解析到本服务器的IP若开启CDN，则必须确保CDN不会跳转https，否则推荐dns验证cert_domain=xxx.com                          # 申请证书的域名cert_mode=http                               # 申请模式cert_key_length=ec-256                       # 留空则申请RSA证书，填写ec-256或ec-384则申请ECC证书③ dns 模式自动申请证书支持一百多种 DNS 服务商此配置方式较复杂，但最通用该页面列出了所有支持的 DNS 服务商：https://github.com/acmesh-official/acme.sh/wiki/dnsapi​CloudFlare 配置示例cert_domain=xxx.com                          # 申请证书的域名cert_mode=dns                                # 申请模式cert_key_length=ec-256                       # 留空则申请RSA证书，填写ec-256或ec-384则申请ECC证书dns_provider=dns_cf                          # DNS 提供商​DNS_CF_Email=xxx@xx.com                      # CF 邮箱DNS_CF_Key=xxxxx                             # CF API Global KeyDNSPod 配置示例cert_domain=xxx.com                          # 申请证书的域名cert_mode=dns                                # 申请模式cert_key_length=ec-256                       # 留空则申请RSA证书，填写ec-256或ec-384则申请ECC证书dns_provider=dns_dp                          # DNS 提供商​DNS_DP_Id=111                                # DNSPod 用户 idDNS_DP_Key=xxxxx                             # DNSPod API 密钥其它的 DNS 服务商都能在这个页面找到：https://github.com/acmesh-official/acme.sh/wiki/dnsapi​配置要点：搜索 DNS 提供商的名称，并找到命令中 --dns dns_xxx 的内容，这个 dns_xxx 就是你要填的再看看 DNS 提供商所需要配置的内容，区分大小写，一般都是 API 密钥之类的，注意要在 soga 配置中加上 DNS_ 前缀，防止配置冲突​第三步、启动 sogasoga start若出现启动失败的情况，使用 soga log 查看错误信息加入我们：Telegram群组​购买商业版：联系sprov​soga - v2ray 教程 - 以前ProxyPanel 对接 v2ray下一个 - soga - trojan 教程V2board 对接 trojan最近更新 3 weeks ago内容详细图文教程（推荐）一键安装&amp;更新第一步，配置前端节点地址节点地址格式：示例：偏移端口第二步，配置 soga基础配置配置证书第三步、启动 soga
            
            
            window.GITBOOK_STATE = {"state":{"database":{"orgs/staRR5J3ZDcvIq1tqGSgnQVrbOu1/infos":{"kind":"user","data":{"kind":"user","uid":"staRR5J3ZDcvIq1tqGSgnQVrbOu1","baseDomain":"sprov065","defaultSpace":null,"displayName":"sprov","photoURL":"https://avatars0.githubusercontent.com/u/47310637?v=4","deletedAt":null,"usageStatuses":{"members":"below","privateSpaces":"below","publicSpaces":"below"}}},"spaces/-M36NbxOl4nTuepXxBV1/infos":{"kind":"space","data":{"uid":"-M36NbxOl4nTuepXxBV1","name":"soga 后端文档","createdAt":1584966827865,"ownerID":"staRR5J3ZDcvIq1tqGSgnQVrbOu1","isPrivate":false,"isUnlisted":false,"hasJWT":null,"secretToken":null,"baseName":"soga","createdBy":"staRR5J3ZDcvIq1tqGSgnQVrbOu1","logoURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/spaces%2F-M36NbxOl4nTuepXxBV1%2Favatar-1592586612875.png?generation=1592586613157101\u0026alt=media","fullLogoURL":null,"emoji":null,"colorPrimary":"#FF4642","headerTheme":"light","font":null,"locale":"zh","primaryRevision":"-MQVt2SLycLgy-YrMHZP","edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1584966827865,"updatedAt":1610091165014,"count":137}},"algoliaAPIKey":"ZTlkZTlhZTQ2MThiMjlhZThmNmM5MWE3NWZiOTExMGYwNGEwMjc1OWQ4YmY5ZTBkMmRjYjA1MDdiYjgyODBhZmZpbHRlcnM9LU0zNk5ieE9sNG5UdWVwWHhCVjE=","customDomain":"soga.vaxilu.com","links":[],"hasGitHubSync":false,"editOnGitHub":null,"googleAnalyticsID":"UA-137403879-3","intercomID":null,"hasPageRating":true,"hasPDFExport":false,"indexedRevision":"-MQVt2SLycLgy-YrMHZP"}},"spaces/-M36NbxOl4nTuepXxBV1/revisions/-MQVt2SLycLgy-YrMHZP":{"kind":"revision","data":{"uid":"-MQVt2SLycLgy-YrMHZP","message":"","createdAt":1610091165013,"createdBy":"staRR5J3ZDcvIq1tqGSgnQVrbOu1","parents":["-MQVsoMNfRuSN8nACOqk"],"content":{"primaryVersion":"master","versions":{"master":{"index":0,"ref":"master","title":"1.0.0","github":{"repoID":"sprov065/soga","sha":"c06b06f3eb77d40b96ec6cb2c30dff5dfa763243","ref":null,"message":"GitBook: [master] 14 pages modified","isGitBookBot":true},"locale":null,"entryPage":"-M36NgARiREHBRhfB2kq","pages":{"-M36NgARiREHBRhfB2kq":{"uid":"-M36NgARiREHBRhfB2kq","kind":"document","title":"功能介绍","path":"master","href":null,"description":"soga 后端同时支持 V2ray、Trojan、Shadowsocks、ShadowsocksR 协议，支持多个面板对接，功能丰富","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQGgGk0K9X0nwPaGrP7%2Fmaster%2F-M36NgARiREHBRhfB2kq%2Fdocument.json?alt=media\u0026token=60bdc568-811b-41ff-982a-8a54115bb5dc","createdAt":1584966845148,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1585631740379,"updatedAt":1609835873241,"count":61}},"github":{"sha":"a8c86d19abfdb1d2cf22f12fe39fc4493a6540a5","filePath":"README.md"},"stats":{"words":624,"images":1,"codeLines":0,"revisions":0},"pages":["-MACLl6Hx7OiUD8PdImT","-MACUMQfrFB6u78Q4tcs","-MFVSfXTsIthcgXbM6Vr","-MACXckd5bgP9RWJQE15","-MACXfeOTuOfevDp_1Os","-MIxTTL126enJq7FuKy4","-MOEZ1z4ue-hchNEm6Vn","-MFP_dsx5tvb8XdzrGmk"]},"-MACLl6Hx7OiUD8PdImT":{"uid":"-MACLl6Hx7OiUD8PdImT","kind":"group","title":"功能介绍","path":"future","href":null,"description":"","documentURL":null,"createdAt":1592583197138,"edits":{},"github":null,"stats":null,"pages":["-MFPav3rQCXBSSqKxAf-","-MFPbN0L5xhn40V6pQuR"]},"-MFPav3rQCXBSSqKxAf-":{"uid":"-MFPav3rQCXBSSqKxAf-","kind":"document","title":"社区版与商业版区别","path":"community-edition-and-enterprise-edition","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MGudmPLNFXzt60_FFIk%2Fmaster%2F-MFPav3rQCXBSSqKxAf-%2Fdocument.json?alt=media\u0026token=8a85dcf5-bbd7-429c-a6ff-b07e72fade4e","createdAt":1598174245175,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598174344547,"updatedAt":1599785721136,"count":3}},"github":{"sha":"8ed754f34259753d8ef34cf952ce0ab4577b3a56","filePath":"future/community-edition-and-enterprise-edition.md"},"stats":{"words":127,"images":0,"codeLines":0,"revisions":0},"pages":null},"-MFPbN0L5xhn40V6pQuR":{"uid":"-MFPbN0L5xhn40V6pQuR","kind":"document","title":"获取商业版授权码","path":"get-license-code","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MOFRj1FtkxMoJPHSZ9K%2Fmaster%2F-MFPbN0L5xhn40V6pQuR%2Fdocument.json?alt=media\u0026token=63138b2c-cb4e-4632-a96b-73aac5ca18b8","createdAt":1598174363734,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598174448227,"updatedAt":1607671144107,"count":36}},"github":{"sha":"96d7b9ec31dd1bda7f3705be8d1aebc7f889e568","filePath":"future/get-license-code.md"},"stats":{"words":461,"images":0,"codeLines":1,"revisions":0},"pages":null},"-MACUMQfrFB6u78Q4tcs":{"uid":"-MACUMQfrFB6u78Q4tcs","kind":"group","title":"前端安装","path":"web-install","href":null,"description":"","documentURL":null,"createdAt":1592585451243,"edits":{},"github":null,"stats":null,"pages":["-MACUMQhA15g97xZfYA1"]},"-MACUMQhA15g97xZfYA1":{"uid":"-MACUMQhA15g97xZfYA1","kind":"document","title":"选择合适的前端","path":"select-web","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MPNeOgh4ox8nCe5eRj5%2Fmaster%2F-MACUMQhA15g97xZfYA1%2Fdocument.json?alt=media\u0026token=95481267-0c7e-4b43-8eaf-173f2e121489","createdAt":1592585451245,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1592586044539,"updatedAt":1608879074900,"count":8}},"github":{"sha":"6ee70fbb791d84a1a01fd5eda8a04bc89099d1e5","filePath":"web-install/select-web.md"},"stats":{"words":136,"images":0,"codeLines":0,"revisions":0},"pages":null},"-MFVSfXTsIthcgXbM6Vr":{"uid":"-MFVSfXTsIthcgXbM6Vr","kind":"group","title":"docker 对接","path":"docker","href":null,"description":"","documentURL":null,"createdAt":1598272485534,"edits":{},"github":null,"stats":null,"pages":["-MFPMYlpIAlFxWWCfAlW","-MLgrmAeebR5ZX-fVr-T"]},"-MFPMYlpIAlFxWWCfAlW":{"uid":"-MFPMYlpIAlFxWWCfAlW","kind":"document","title":"Docker 对接通用教程","path":"docker-tutorial","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MPPDyPz4xqfUWRHTfRR%2Fmaster%2F-MFPMYlpIAlFxWWCfAlW%2Fdocument.json?alt=media\u0026token=7ce4d001-fd92-402c-83f9-cdaef3be217b","createdAt":1598170217589,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598170747377,"updatedAt":1608905830096,"count":24}},"github":{"sha":"956c07e6739be29afcbaf4451926331ce1830abd","filePath":"docker/docker-tutorial.md"},"stats":{"words":1711,"images":0,"codeLines":94,"revisions":0},"pages":null},"-MLgrmAeebR5ZX-fVr-T":{"uid":"-MLgrmAeebR5ZX-fVr-T","kind":"document","title":"soga 配置详细说明","path":"soga-config","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MPPDyPz4xqfUWRHTfRR%2Fmaster%2F-MLgrmAeebR5ZX-fVr-T%2Fdocument.json?alt=media\u0026token=11f1a788-b93b-42a7-b160-41b87e1f5ef6","createdAt":1604923106026,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1604923142808,"updatedAt":1608905829652,"count":17}},"github":null,"stats":{"words":1249,"images":0,"codeLines":13,"revisions":0},"pages":null},"-MACXckd5bgP9RWJQE15":{"uid":"-MACXckd5bgP9RWJQE15","kind":"group","title":"soga - v2ray 教程","path":"soga-v2ray","href":null,"description":"","documentURL":null,"createdAt":1592586308649,"edits":{},"github":null,"stats":null,"pages":["-MFPQAheXmH-EFoZC--F","-MFPVS6Ew77-Nj86JIjw","-MFPY1Fz-hSmphdwuVNR","-MJgNW-ZEXs4qgxnV_6U","-MKtOheYP08mYjUra4YU"]},"-MFPQAheXmH-EFoZC--F":{"uid":"-MFPQAheXmH-EFoZC--F","kind":"document","title":"SSPanel Uim 对接 v2ray","path":"sspanel-v2ray","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MOoDCemjIkdeqzevuDr%2Fmaster%2F-MFPQAheXmH-EFoZC--F%2Fdocument.json?alt=media\u0026token=0e50c82f-f198-4512-a11a-846aabe98e30","createdAt":1598171167594,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598172077786,"updatedAt":1608268279681,"count":11}},"github":{"sha":"f9afcd057c29f27814c285c52ccd9ee1658a4766","filePath":"soga-v2ray/sspanel-v2ray.md"},"stats":{"words":782,"images":0,"codeLines":83,"revisions":0},"pages":null},"-MFPVS6Ew77-Nj86JIjw":{"uid":"-MFPVS6Ew77-Nj86JIjw","kind":"document","title":"V2board 对接 v2ray","path":"v2board-v2ray","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MFPVS6Ew77-Nj86JIjw%2Fdocument.json?alt=media\u0026token=9d5789f8-1ad8-4fb0-a9e6-962556e12209","createdAt":1598172549583,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598172913739,"updatedAt":1609600044359,"count":10}},"github":{"sha":"0d73b1f114a852ecc2ac5d33924d31212e2d45d0","filePath":"soga-v2ray/v2board-v2ray.md"},"stats":{"words":483,"images":0,"codeLines":69,"revisions":0},"pages":null},"-MFPY1Fz-hSmphdwuVNR":{"uid":"-MFPY1Fz-hSmphdwuVNR","kind":"document","title":"VNetPanel 对接 v2ray","path":"vnetpanel-v2ray","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MFPY1Fz-hSmphdwuVNR%2Fdocument.json?alt=media\u0026token=c7754f52-fed7-498a-b06b-f5de90733d91","createdAt":1598173226047,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598173576170,"updatedAt":1609600042693,"count":10}},"github":{"sha":"71794a866071ce21ae6b29ac191a216d560957af","filePath":"soga-v2ray/vnetpanel-v2ray.md"},"stats":{"words":471,"images":0,"codeLines":61,"revisions":0},"pages":null},"-MJgNW-ZEXs4qgxnV_6U":{"uid":"-MJgNW-ZEXs4qgxnV_6U","kind":"document","title":"WHMCS 对接 v2ray","path":"whmcs-v2ray","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MJgNW-ZEXs4qgxnV_6U%2Fdocument.json?alt=media\u0026token=ae14958e-15ca-4305-bb12-a291dd792b04","createdAt":1602767425572,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1602767737691,"updatedAt":1609600042929,"count":6}},"github":null,"stats":{"words":473,"images":0,"codeLines":68,"revisions":0},"pages":null},"-MKtOheYP08mYjUra4YU":{"uid":"-MKtOheYP08mYjUra4YU","kind":"document","title":"ProxyPanel 对接 v2ray","path":"proxypanel-v2ray","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MKtOheYP08mYjUra4YU%2Fdocument.json?alt=media\u0026token=573b96b9-c264-4744-a22f-74b9455c3332","createdAt":1604059585187,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1604059678691,"updatedAt":1609600044980,"count":6}},"github":null,"stats":{"words":467,"images":0,"codeLines":60,"revisions":0},"pages":null},"-MACXfeOTuOfevDp_1Os":{"uid":"-MACXfeOTuOfevDp_1Os","kind":"group","title":"soga - trojan 教程","path":"soga-trojan","href":null,"description":"","documentURL":null,"createdAt":1592586320537,"edits":{},"github":null,"stats":null,"pages":["-MFPU8uCnEKYZEMSvdsr","-MFPX3kwVRN7pL3S2Stx","-MFPZTu1SjuL8r3XS8yt","-MKtP48MxZ0XafSQrmw2"]},"-MFPU8uCnEKYZEMSvdsr":{"uid":"-MFPU8uCnEKYZEMSvdsr","kind":"document","title":"SSPanel Uim 对接 trojan","path":"sspanel-trojan","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MOoDCemjIkdeqzevuDr%2Fmaster%2F-MFPU8uCnEKYZEMSvdsr%2Fdocument.json?alt=media\u0026token=667e4956-0dd3-4f87-8cb6-e0fab46d0160","createdAt":1598172208781,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598172443251,"updatedAt":1608268275476,"count":12}},"github":{"sha":"6309ed93dbbcc29d01459d321ab97167fac3c78a","filePath":"soga-trojan/sspanel-trojan.md"},"stats":{"words":502,"images":0,"codeLines":57,"revisions":0},"pages":null},"-MFPX3kwVRN7pL3S2Stx":{"uid":"-MFPX3kwVRN7pL3S2Stx","kind":"document","title":"V2board 对接 trojan","path":"v2board-trojan","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MFPX3kwVRN7pL3S2Stx%2Fdocument.json?alt=media\u0026token=9e2c8cb5-41ad-48fa-9a0f-c806c7a06926","createdAt":1598172974140,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598173196810,"updatedAt":1609600042987,"count":9}},"github":{"sha":"dc19a5a68ddbe4124d54e3681b7f124fc2eb3d49","filePath":"soga-trojan/v2board-trojan.md"},"stats":{"words":446,"images":0,"codeLines":55,"revisions":0},"pages":null},"-MFPZTu1SjuL8r3XS8yt":{"uid":"-MFPZTu1SjuL8r3XS8yt","kind":"document","title":"VNetPanel 对接 trojan","path":"vnetpanel-trojan","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MFPZTu1SjuL8r3XS8yt%2Fdocument.json?alt=media\u0026token=50a09140-cee8-46fe-bb33-8264f4e5b1c4","createdAt":1598173605507,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598173820540,"updatedAt":1609600044998,"count":9}},"github":{"sha":"715602fafa7d9338e53b7e444aa04cde6c6dc854","filePath":"soga-trojan/vnetpanel-trojan.md"},"stats":{"words":430,"images":0,"codeLines":53,"revisions":0},"pages":null},"-MKtP48MxZ0XafSQrmw2":{"uid":"-MKtP48MxZ0XafSQrmw2","kind":"document","title":"ProxyPanel 对接 trojan","path":"proxypanel-trojan","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MKtP48MxZ0XafSQrmw2%2Fdocument.json?alt=media\u0026token=13bd22d3-a915-4a48-af15-8758ca3abaaf","createdAt":1604059681367,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1604059732154,"updatedAt":1609600045878,"count":5}},"github":null,"stats":{"words":430,"images":0,"codeLines":46,"revisions":0},"pages":null},"-MIxTTL126enJq7FuKy4":{"uid":"-MIxTTL126enJq7FuKy4","kind":"group","title":"soga - ss 教程","path":"soga-ss","href":null,"description":"","documentURL":null,"createdAt":1601980458371,"edits":{},"github":null,"stats":null,"pages":["-MIxTTL3EhcGK94piwBQ","-MQVsS9Y2WNuFH2dT_mH","-MQVspLpCbxAOJa5GSkF"]},"-MIxTTL3EhcGK94piwBQ":{"uid":"-MIxTTL3EhcGK94piwBQ","kind":"document","title":"V2board 对接 ss","path":"v2board-ss","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2Soy2piTseuOxLH52%2Fmaster%2F-MIxTTL3EhcGK94piwBQ%2Fdocument.json?alt=media\u0026token=1b6eac13-c9e0-4860-a4c5-3a6ede0ecbbc","createdAt":1601980458372,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1601980641173,"updatedAt":1609598000996,"count":5}},"github":null,"stats":{"words":147,"images":0,"codeLines":25,"revisions":0},"pages":null},"-MQVsS9Y2WNuFH2dT_mH":{"uid":"-MQVsS9Y2WNuFH2dT_mH","kind":"document","title":"SSPanel Uim 对接 ss 单端口","path":"sspanel-ss-single-port","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQVsPfgT5g95YbKGbKw%2Fmaster%2F-MQVsS9Y2WNuFH2dT_mH%2Fdocument.json?alt=media\u0026token=9140a8ca-326d-4fe0-b2e1-545c03196cb3","createdAt":1610090664611,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1610090753303,"updatedAt":1610090753303,"count":1}},"github":null,"stats":{"words":20,"images":0,"codeLines":0,"revisions":0},"pages":null},"-MQVspLpCbxAOJa5GSkF":{"uid":"-MQVspLpCbxAOJa5GSkF","kind":"document","title":"SSPanel Uim 对接 ss 多端口","path":"sspanel-ss-multi-port","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQVsoMNfRuSN8nACOqk%2Fmaster%2F-MQVspLpCbxAOJa5GSkF%2Fdocument.json?alt=media\u0026token=64e37460-09b2-4950-bd35-af30cc9c2140","createdAt":1610090763701,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1610090819177,"updatedAt":1610090819177,"count":1}},"github":null,"stats":{"words":20,"images":0,"codeLines":0,"revisions":0},"pages":null},"-MOEZ1z4ue-hchNEm6Vn":{"uid":"-MOEZ1z4ue-hchNEm6Vn","kind":"group","title":"soga - ssr 教程","path":"soga-ssr","href":null,"description":"","documentURL":null,"createdAt":1607652618181,"edits":{},"github":null,"stats":null,"pages":["-MOEZ1z6-hs6y0Fz8MjE","-MQ2T1B-9R57uZjCL_D-","-MQ2V8NgsYY80LjQOMmZ"]},"-MOEZ1z6-hs6y0Fz8MjE":{"uid":"-MOEZ1z6-hs6y0Fz8MjE","kind":"document","title":"SSPanel Uim 对接 ssr 单端口","path":"sspanel-ssr-single-port","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQGhNryz6CMk5zxFTbX%2Fmaster%2F-MOEZ1z6-hs6y0Fz8MjE%2Fdocument.json?alt=media\u0026token=4d008b9a-16b0-4f65-a0ab-cb96f5e3621d","createdAt":1607652618183,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1607653869371,"updatedAt":1609836183467,"count":12}},"github":null,"stats":{"words":387,"images":6,"codeLines":36,"revisions":0},"pages":null},"-MQ2T1B-9R57uZjCL_D-":{"uid":"-MQ2T1B-9R57uZjCL_D-","kind":"document","title":"SSPanel Uim 对接 ssr 多端口","path":"sspanel-ssr-multi-port","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2Soy2piTseuOxLH52%2Fmaster%2F-MQ2T1B-9R57uZjCL_D-%2Fdocument.json?alt=media\u0026token=46e787b3-cdfa-4664-86f7-a98e0705f372","createdAt":1609597199104,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1609598001089,"updatedAt":1609598001089,"count":1}},"github":null,"stats":{"words":148,"images":0,"codeLines":33,"revisions":0},"pages":null},"-MQ2V8NgsYY80LjQOMmZ":{"uid":"-MQ2V8NgsYY80LjQOMmZ","kind":"document","title":"ProxyPanel 对接 ssr 单端口","path":"proxypanel-ssr-single-port","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2Soy2piTseuOxLH52%2Fmaster%2F-MQ2V8NgsYY80LjQOMmZ%2Fdocument.json?alt=media\u0026token=d8245bad-75af-4599-9f72-df57c4c2d5ec","createdAt":1609597752876,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1609598002747,"updatedAt":1609598002747,"count":1}},"github":null,"stats":{"words":132,"images":0,"codeLines":32,"revisions":0},"pages":null},"-MFP_dsx5tvb8XdzrGmk":{"uid":"-MFP_dsx5tvb8XdzrGmk","kind":"group","title":"其它相关教程","path":"other-tutorial","href":null,"description":"","documentURL":null,"createdAt":1598173912637,"edits":{},"github":null,"stats":null,"pages":["-MJMebtCVHX9Phu27LPQ","-MJeIk7McRlvXDA7CnTS","-MFPaGHK765zEK7ckKjw","-MPNgsWYDpwZkIDuyV_6","-MFP_dsyreEmNKvYDBFV","-MH6UyTMpHwQUU9WLDwi"]},"-MJMebtCVHX9Phu27LPQ":{"uid":"-MJMebtCVHX9Phu27LPQ","kind":"document","title":"审计规则配置","path":"block-list-config","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2Yc_R4QuYZpPElQZJ%2Fmaster%2F-MJMebtCVHX9Phu27LPQ%2Fdocument.json?alt=media\u0026token=ba042bdd-069c-436d-9363-d5e0dc6da26d","createdAt":1602419850829,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1602420185285,"updatedAt":1609599357649,"count":6}},"github":null,"stats":{"words":521,"images":0,"codeLines":10,"revisions":0},"pages":null},"-MJeIk7McRlvXDA7CnTS":{"uid":"-MJeIk7McRlvXDA7CnTS","kind":"document","title":"dns规则配置","path":"dns-config","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2Yc_R4QuYZpPElQZJ%2Fmaster%2F-MJeIk7McRlvXDA7CnTS%2Fdocument.json?alt=media\u0026token=d36f2b1d-1873-454d-a7ee-6d779430cae0","createdAt":1602732622359,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1602732772496,"updatedAt":1609599357674,"count":14}},"github":null,"stats":{"words":145,"images":0,"codeLines":23,"revisions":0},"pages":null},"-MFPaGHK765zEK7ckKjw":{"uid":"-MFPaGHK765zEK7ckKjw","kind":"document","title":"中转获取真实 IP 教程","path":"forward-get-real-ip","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQP2K2955LMSpyN5E4Q%2Fmaster%2F-MFPaGHK765zEK7ckKjw%2Fdocument.json?alt=media\u0026token=ec22650a-1189-494c-8531-34e4fb9e29be","createdAt":1598174074005,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598174201457,"updatedAt":1609976114741,"count":13}},"github":{"sha":"99f1424d07bf2422115b07197e7ba3d6d4c68dcc","filePath":"other-tutorial/forward-get-real-ip.md"},"stats":{"words":137,"images":0,"codeLines":37,"revisions":0},"pages":null},"-MPNgsWYDpwZkIDuyV_6":{"uid":"-MPNgsWYDpwZkIDuyV_6","kind":"document","title":"增强限制用户 IP 数/设备数","path":"limit-ip-and-device_num","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MPOQo2rXJa5cyX7sdaa%2Fmaster%2F-MPNgsWYDpwZkIDuyV_6%2Fdocument.json?alt=media\u0026token=33db9e64-38c1-4207-88ea-a5aff897557f","createdAt":1608879671395,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1608880349594,"updatedAt":1608892071409,"count":18}},"github":null,"stats":{"words":557,"images":0,"codeLines":41,"revisions":0},"pages":null},"-MFP_dsyreEmNKvYDBFV":{"uid":"-MFP_dsyreEmNKvYDBFV","kind":"document","title":"不使用 docker 启动多实例","path":"soga-multi-instance","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MPNj8ORvkcoGSoNNh0f%2Fmaster%2F-MFP_dsyreEmNKvYDBFV%2Fdocument.json?alt=media\u0026token=241347ba-5ed4-4963-923f-b0fb772a7105","createdAt":1598173912638,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598174043225,"updatedAt":1608880351158,"count":4}},"github":{"sha":"197e58479ba69034ef640044e586f6d275a437ab","filePath":"other-tutorial/soga-multi-instance.md"},"stats":{"words":305,"images":0,"codeLines":16,"revisions":0},"pages":null},"-MH6UyTMpHwQUU9WLDwi":{"uid":"-MH6UyTMpHwQUU9WLDwi","kind":"document","title":"VMessAEAD 说明","path":"vmess-aead","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MMQpqfOocqcSKVZlXt4%2Fmaster%2F-MH6UyTMpHwQUU9WLDwi%2Fdocument.json?alt=media\u0026token=d9b4b146-9904-460a-83bc-d6eb52f67a4e","createdAt":1600001140631,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1600001763807,"updatedAt":1605788309258,"count":8}},"github":null,"stats":{"words":367,"images":1,"codeLines":1,"revisions":0},"pages":null}}}},"assets":{"-MH6WGfJXI23bLu5NBVD":{"uid":"-MH6WGfJXI23bLu5NBVD","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MH6Usvy7_9U6OxhdDQs%2F-MH6WGfJXI23bLu5NBVD%2Fimage.png?alt=media\u0026token=26635a54-6ac1-4741-9564-904a3c51ec0c","size":31637,"contentType":"image/png","createdAt":1600001481725,"github":null,"edits":{}},"-MOEbXz6dyE69DIqGenq":{"uid":"-MOEbXz6dyE69DIqGenq","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEYxqQ4vupb5Cu4W69%2F-MOEbXz6dyE69DIqGenq%2Fimage.png?alt=media\u0026token=f0e4d976-1aeb-4fad-8ddd-b625e230117b","size":46052,"contentType":"image/png","createdAt":1607653536945,"github":null,"edits":{}},"-MKtObec33sxy2W1zVyO":{"uid":"-MKtObec33sxy2W1zVyO","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MKtOCHWR4Jxv9fx_1OY%2F-MKtObec33sxy2W1zVyO%2Fimage.png?alt=media\u0026token=b812b9a7-9c27-489b-bce1-23322934fdbb","size":13826,"contentType":"image/png","createdAt":1604059560538,"github":null,"edits":{}},"-MQ2cDlSBBKHBU5FYkhp":{"uid":"-MQ2cDlSBBKHBU5FYkhp","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MQ2aGGoJ-1mE-evvXAh%2F-MQ2cDlSBBKHBU5FYkhp%2Fimage.png?alt=media\u0026token=f420759a-f874-4ba2-b547-2828d1983ec1","size":14408,"contentType":"image/png","createdAt":1609599872851,"github":null,"edits":{}},"-MH6WH-yMsspZ0vgdygb":{"uid":"-MH6WH-yMsspZ0vgdygb","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MH6Usvy7_9U6OxhdDQs%2F-MH6WH-yMsspZ0vgdygb%2Fimage.png?alt=media\u0026token=08aada52-b8bc-4cca-872b-e4a18076dbfc","size":31637,"contentType":"image/png","createdAt":1600001482748,"github":null,"edits":{}},"-MNv2n0S4Wv8eKsCIrx4":{"uid":"-MNv2n0S4Wv8eKsCIrx4","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MNv2WDNkagR-aYGcyN3%2F-MNv2n0S4Wv8eKsCIrx4%2Fimage.png?alt=media\u0026token=e141ed86-ac4e-4da0-8f1e-398dc5fe7bea","size":14222,"contentType":"image/png","createdAt":1607308620870,"github":null,"edits":{}},"-MOEiHcFKySfj8LzPB44":{"uid":"-MOEiHcFKySfj8LzPB44","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEcoYUWhRQXTNuMNee%2F-MOEiHcFKySfj8LzPB44%2Fimage.png?alt=media\u0026token=8b5de146-295e-4c19-b897-3b7be57e46b0","size":22529,"contentType":"image/png","createdAt":1607655304589,"github":null,"edits":{}},"-MOH1u1oSVvHbl2lyZBt":{"uid":"-MOH1u1oSVvHbl2lyZBt","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOH1ZcDyjkDTq3rTPXO%2F-MOH1u1oSVvHbl2lyZBt%2Fimage.png?alt=media\u0026token=4fa49b36-62d8-4d6b-82b4-10b6dcbffde8","size":14337,"contentType":"image/png","createdAt":1607694262105,"github":null,"edits":{}},"-MJbJnhB1KOjykM7XEb8":{"uid":"-MJbJnhB1KOjykM7XEb8","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MJbJ1EMWiyEhHg1kU83%2F-MJbJnhB1KOjykM7XEb8%2Fimage.png?alt=media\u0026token=603bd66c-edd1-44bb-84c7-d67f23dbd15f","size":3611,"contentType":"image/png","createdAt":1602682567975,"github":null,"edits":{}},"-MOEi-xVfe0QcTXs3uLT":{"uid":"-MOEi-xVfe0QcTXs3uLT","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEcoYUWhRQXTNuMNee%2F-MOEi-xVfe0QcTXs3uLT%2Fimage.png?alt=media\u0026token=d9ecc453-0349-45b7-85c1-437222229c55","size":7186,"contentType":"image/png","createdAt":1607655232181,"github":null,"edits":{}},"-MJgh64Ot7ywsM549FGJ":{"uid":"-MJgh64Ot7ywsM549FGJ","name":"对接对照表.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MJggUESFE05lb28tg-D%2F-MJgh64Ot7ywsM549FGJ%2F%E5%AF%B9%E6%8E%A5%E5%AF%B9%E7%85%A7%E8%A1%A8.png?alt=media\u0026token=35f9dda5-2038-4f37-9b6b-c6b2ecae6b08","size":12348,"contentType":"image/png","createdAt":1602772824588,"github":null,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1602772826045,"updatedAt":1602772826045,"count":1}}},"-MOEc4PY-Hm-_OeyXNLY":{"uid":"-MOEc4PY-Hm-_OeyXNLY","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEYxqQ4vupb5Cu4W69%2F-MOEc4PY-Hm-_OeyXNLY%2Fimage.png?alt=media\u0026token=f41baf3e-68f7-4bf3-9dfc-fdae7f07644a","size":23451,"contentType":"image/png","createdAt":1607653677891,"github":null,"edits":{}},"-MOEibgyP677B1nlIGWY":{"uid":"-MOEibgyP677B1nlIGWY","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEcoYUWhRQXTNuMNee%2F-MOEibgyP677B1nlIGWY%2Fimage.png?alt=media\u0026token=d61336c1-7a74-4a36-bf42-7573027f9f0d","size":12435,"contentType":"image/png","createdAt":1607655391167,"github":null,"edits":{}},"-MJbLzYfu-UHhh3-KJs4":{"uid":"-MJbLzYfu-UHhh3-KJs4","name":"前端对接方式对照表.jpg","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MJbJ1EMWiyEhHg1kU83%2F-MJbLzYfu-UHhh3-KJs4%2F%E5%89%8D%E7%AB%AF%E5%AF%B9%E6%8E%A5%E6%96%B9%E5%BC%8F%E5%AF%B9%E7%85%A7%E8%A1%A8.jpg?alt=media\u0026token=443d5f9f-acb7-41f1-8565-ab84c1a84d67","size":51991,"contentType":"image/jpeg","createdAt":1602683141112,"github":null,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1602683142017,"updatedAt":1602683142017,"count":1}}},"-MOEaZ5q6F31Xg1Bj3sM":{"uid":"-MOEaZ5q6F31Xg1Bj3sM","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEYxqQ4vupb5Cu4W69%2F-MOEaZ5q6F31Xg1Bj3sM%2Fimage.png?alt=media\u0026token=d2745ced-099f-4ca3-bd97-461634476755","size":45314,"contentType":"image/png","createdAt":1607653279379,"github":null,"edits":{}},"-MOEi-jVxXKlr4vLBEsO":{"uid":"-MOEi-jVxXKlr4vLBEsO","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEcoYUWhRQXTNuMNee%2F-MOEi-jVxXKlr4vLBEsO%2Fimage.png?alt=media\u0026token=bef75c7d-8b19-42f8-8bca-dd77ef61c714","size":7186,"contentType":"image/png","createdAt":1607655231577,"github":null,"edits":{}},"-MOEckEDhVFgJNvgeYOy":{"uid":"-MOEckEDhVFgJNvgeYOy","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEYxqQ4vupb5Cu4W69%2F-MOEckEDhVFgJNvgeYOy%2Fimage.png?alt=media\u0026token=67d84427-42d6-47ad-ba4f-45a3559e4a97","size":24213,"contentType":"image/png","createdAt":1607653853230,"github":null,"edits":{}}}},"github":[],"rollbackOf":null}}},"documents":{"documents":{"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MOoDCemjIkdeqzevuDr%2Fmaster%2F-MFPU8uCnEKYZEMSvdsr%2Fdocument.json?alt=media\u0026token=667e4956-0dd3-4f87-8cb6-e0fab46d0160":{"format_version":1,"document":{"kind":"document","key":"373f8fb2484a4f5f87260f7ea9168252","data":{"schema_version":6},"nodes":[{"kind":"block","type":"heading-1","key":"b8676c18b40741b2b022446def9372ea","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"b54caa88f789491396aa881c664d30af","ranges":[{"kind":"range","marks":[],"text":"详细图文教程（推荐）"}]}]},{"kind":"block","type":"paragraph","key":"4dad5d3f15394412b875c2dcb253980d","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"5e38360f4ef74a54b86e81e321f136bf","ranges":[{"kind":"range","marks":[],"text":""}]},{"kind":"inline","type":"link","key":"562ba03bfeec4da8b8f1e72e7977fdaf","isVoid":false,"data":{"href":"https://blog.sprov.xyz/2020/06/06/sspanel-uim-v2ray-trojan/"},"nodes":[{"kind":"text","key":"79a96a5f37a846b48798f0d38e6b89ff","ranges":[{"kind":"range","marks":[],"text":"https://blog.sprov.xyz/2020/06/06/sspanel-uim-v2ray-trojan/"}]}]},{"kind":"text","key":"3a8845bc83304c86be91e5c68d51785d","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"heading-1","key":"c12176775783432abd7f8dfed526db60","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"87db909bf4c44b979f289fed67b51e3d","ranges":[{"kind":"range","marks":[],"text":"一键安装\u0026更新"}]}]},{"kind":"block","type":"code","key":"28a1c36599f349c4994b2ea2aaa97beb","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"cfff95a2df334bff9865e0dc796ea956","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"ab5540ef580446b2bdc5cdb47068831a","ranges":[{"kind":"range","marks":[],"text":"bash \u003c(curl -Ls https://blog.sprov.xyz/soga.sh)"}]}]}]},{"kind":"block","type":"paragraph","key":"75c602c2f8fe4fd59089c9b1d769c3ea","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"8830ae07b4274a7bab06b5d0090f3fb1","ranges":[{"kind":"range","marks":[],"text":"或者，两个都可以"}]}]},{"kind":"block","type":"code","key":"30f8c774c1764e1bbe8e902614049baa","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"f7812183f49d4385ad866480de4efdb6","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"120305206d204238a183da73171fca3d","ranges":[{"kind":"range","marks":[],"text":"bash \u003c(curl -Ls https://raw.githubusercontent.com/sprov065/soga/master/install.sh)"}]}]}]},{"kind":"block","type":"heading-1","key":"0cd8e23922f84e7ba2422ffe7708166e","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"0b13a69c36194012b4be7a8cdd453b7d","ranges":[{"kind":"range","marks":[],"text":"第一步，配置前端节点地址"}]}]},{"kind":"block","type":"heading-2","key":"1a626a37d39d4d80bba5dc6975b5c29c","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f57f0671a02c41bf849ed1e4faf2b032","ranges":[{"kind":"range","marks":[],"text":"节点地址格式："}]}]},{"kind":"block","type":"code","key":"f28fe13721b0475a89b713b25f944f3c","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"1feeed9d31c34d69854e25686e0309f3","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"6127bc613d1944e7b2e84d9c15e086fa","ranges":[{"kind":"range","marks":[],"text":"域名或IP;port=连接端口#偏移端口  (偏移端口可选)"}]}]}]},{"kind":"block","type":"heading-2","key":"cd9949b2c30e4c3d84259bf43a0f8332","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"74e6f474e75a48598daf306739c3ce8e","ranges":[{"kind":"range","marks":[],"text":"示例："}]}]},{"kind":"block","type":"blockquote","key":"4ac476d4864c46349208d9ff68e979a7","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"70e605a312af438c930e32963c7603f6","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"6e69bb84db0b4073a5819824d1525a8a","ranges":[{"kind":"range","marks":[],"text":"未加入偏移端口，后端实际监听443端口，用户连接443端口"}]}]}]},{"kind":"block","type":"code","key":"4b6607a5b567412dad6befc2e95c787c","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"1e0557ccb3c14c3c925939bcb52b43c6","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"ce8af8a510b2495ebf7ba239824f6e8d","ranges":[{"kind":"range","marks":[],"text":"hk.aaa.com;port=443"}]}]}]},{"kind":"block","type":"heading-2","key":"cd67572bea2c4deea5de5e48da4f8c6f","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"6c05a6cba2b448f4beb9598227687d69","ranges":[{"kind":"range","marks":[],"text":"偏移端口"}]}]},{"kind":"block","type":"blockquote","key":"9930e9a3e5f345989ab1e0580cd18529","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"f849147b172c41ee841b9809b909bbfe","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"b5fbee171d0d44169ef72f379e17b5d4","ranges":[{"kind":"range","marks":[],"text":"加入偏移端口后，后端实际监听12345端口，用户连接443端口"}]}]}]},{"kind":"block","type":"code","key":"c18e3e51b9c142a28ede0182b0eebe98","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"e5d970fe779344f686d653034c6002df","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"ddbc4b971b6049b6af1c10628e5e10c2","ranges":[{"kind":"range","marks":[],"text":"gz.aaa.com;port=443#12345|host=hk.aaa.com"}]}]}]},{"kind":"block","type":"paragraph","key":"6a282d8d37df42e0af1d816f77ada756","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"0298b320c3304f7fa93fb3b7649c70c1","ranges":[{"kind":"range","marks":[],"text":"中转使用场景"}]}]},{"kind":"block","type":"code","key":"9ba2cd0ac93f4cada2b5e2795f21a333","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"deb83a191fb9408082fc8ba1ed4d554c","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"949b91741e8042139eac38da721277bb","ranges":[{"kind":"range","marks":[],"text":"中转机地址;port=落地机监听端口#中转机监听端口|host=证书域名"}]}]}]},{"kind":"block","type":"heading-1","key":"e28c44a6ea8c4f47a937d10bc1d695fc","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"11a7128e93b9429f9742071b0a3fd065","ranges":[{"kind":"range","marks":[],"text":"第二步，配置 soga"}]}]},{"kind":"block","type":"paragraph","key":"ebe3193fe71d4d0eabb45bb6186219c0","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"932aa4db88cf43039202d3d155794253","ranges":[{"kind":"range","marks":[],"text":"配置命令："}]}]},{"kind":"block","type":"code","key":"a65764926b854ec1bab171a12efee3e8","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"40bda80e9f9145bb9411d71fbc6fb9c8","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"d7754a23cfbe4e65980a2b61f81faa08","ranges":[{"kind":"range","marks":[],"text":"# 输出当前配置文件内容"}]}]},{"kind":"block","type":"code-line","key":"029e658c80984070b442f73d7e6a4150","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"6345e8ff106f4c1b955ff6a06ce50f93","ranges":[{"kind":"range","marks":[],"text":"soga config"}]}]},{"kind":"block","type":"code-line","key":"7ea41349a7bb4c8ea3526076aa41b696","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"1bfd83d12b7d47ffbf6199057a4290a7","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"8e56e003161d4ae3a4d02936b6629a5c","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"0e88563719bf43d7b4506e3a3dca2641","ranges":[{"kind":"range","marks":[],"text":"# 对配置文件进行配置，一次可填写多个，也可以调用多次"}]}]},{"kind":"block","type":"code-line","key":"36a94c28c2954caeb932fbf936aa7985","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"b6f10181be8548318e64553027e44c92","ranges":[{"kind":"range","marks":[],"text":"soga config xxx=xxx yyy=yyy"}]}]}]},{"kind":"block","type":"paragraph","key":"8bae35b2962b4fb884de0040f528842b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"a58a001796224ee48b30648e883583ac","ranges":[{"kind":"range","marks":[],"text":"第一次安装完成后，编辑配置文件："}]}]},{"kind":"block","type":"paragraph","key":"12b1afe5cc1849a786469ccdb73305ae","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"79bdd6019cf94455945fd24488cfd3e5","ranges":[{"kind":"range","marks":[],"text":"配置文件位置在 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"/etc/soga/soga.conf"}]}]},{"kind":"block","type":"paragraph","key":"d2cd5d65b8ca47c38c58cc6f89926510","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"7301de40caf34eccba2d542860001a26","ranges":[{"kind":"range","marks":[],"text":"配置文件位置在 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"/etc/soga/soga.conf"}]}]},{"kind":"block","type":"paragraph","key":"6fcaf29ccfc24c55b0967691558332ca","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"121f1ff4574c499da2d2fd28a642e135","ranges":[{"kind":"range","marks":[],"text":"配置文件位置在 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"/etc/soga/soga.conf"}]}]},{"kind":"block","type":"heading-2","key":"0f4c50a941784e3fb46dad78bff23b0b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"23b335195461409a9afc7a346750ae50","ranges":[{"kind":"range","marks":[],"text":"基础配置"}]}]},{"kind":"block","type":"code","key":"0693d712721b442698415f4cfcdd016a","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"9be74f500cde4a5bb293063b17d11986","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"81d9052709154edc9e0a8e174f1b49e9","ranges":[{"kind":"range","marks":[],"text":"type=sspanel-uim                             # 必填这个"}]}]},{"kind":"block","type":"code-line","key":"25177a657735427ba12df0debc691596","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"d7ba25a71ccf4e7cba3ad64deca94490","ranges":[{"kind":"range","marks":[],"text":"server_type=trojan                           # 必填这个"}]}]},{"kind":"block","type":"code-line","key":"7cc678b824954c968aaacf4736331b34","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"756d4c491601402da8b4edd18e24ba71","ranges":[{"kind":"range","marks":[],"text":"api=webapi                                   # webapi 或 db，表示 webapi 对接或数据库对接"}]}]},{"kind":"block","type":"code-line","key":"899587b072714f1293cc04608991d6f5","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"ea6ff8cf2cbe435490feedbfcfe15450","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"ad880f740ebc401892f9830f3e27904d","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"de86e586039545daa2cc9515f06433bf","ranges":[{"kind":"range","marks":[],"text":"# webapi 对接"}]}]},{"kind":"block","type":"code-line","key":"2a62c27fd95e4a1eb595255c9ee0984e","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"6cd2d8b0e5ea435c932249ef1c50bec8","ranges":[{"kind":"range","marks":[],"text":"webapi_url=https://xxx.com/                  # webapi url，填写面板主页地址"}]}]},{"kind":"block","type":"code-line","key":"da8d8ca53b0d4fb2b6eb0d456df6c36b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"1ef415ddfa6c44398fbd1cc5cd45e740","ranges":[{"kind":"range","marks":[],"text":"webapi_mukey=xxxx                            # webapi key"}]}]},{"kind":"block","type":"code-line","key":"403b8b49191e48009641568cf100c1b7","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"be4febfe2c634f0aafb11509a6879736","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"1849a2f65fa844378a0dcb4e88c55f1b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"b2d69e65e1df4a278cde16253d6a898e","ranges":[{"kind":"range","marks":[],"text":"# 数据库对接"}]}]},{"kind":"block","type":"code-line","key":"63313f05c5494c36a64e579fb2a058df","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"51432afc51ce411b8c31fd37bf07869d","ranges":[{"kind":"range","marks":[],"text":"db_host=db.xxx.com                           # 数据库地址"}]}]},{"kind":"block","type":"code-line","key":"f76a3f821ac144349e406d56fed97258","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"db80b515af754eabbf3d616f5251f661","ranges":[{"kind":"range","marks":[],"text":"db_port=3306                                 # 数据库端口"}]}]},{"kind":"block","type":"code-line","key":"752beb4778d241ed85c8f5a72933e7c1","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"39ab3f87f38b4169802c3bf7bffd62b4","ranges":[{"kind":"range","marks":[],"text":"db_name=name                                 # 数据库名"}]}]},{"kind":"block","type":"code-line","key":"8259cd1ff0f6415088a5fecab54efb4f","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"869a81ae33ac40f2a6939fd1e9a741ca","ranges":[{"kind":"range","marks":[],"text":"db_user=root                                 # 数据库用户名"}]}]},{"kind":"block","type":"code-line","key":"b68b2f63301e450dac44edc93b223444","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"1ef15a775d6244a1b3a06af56ef0f10d","ranges":[{"kind":"range","marks":[],"text":"db_password=asdasdasd                        # 数据库密码"}]}]},{"kind":"block","type":"code-line","key":"1c1dc0b2b43941318817e216dc19969f","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"9c401852c6dd4476b6f81e7b78fb6d17","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"cd32344cde084bdbbe7ccfb10484d75f","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"b240f19c5b9445608cab75cf5d0b5c56","ranges":[{"kind":"range","marks":[],"text":"node_id=1                                    # 节点id"}]}]},{"kind":"block","type":"code-line","key":"ddda15b37df543b7b90c47cfd88c7c2c","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"89eac3a98cde4892a29ec53b30e69f8f","ranges":[{"kind":"range","marks":[],"text":"soga_key=                                    # 授权key，社区版无需填写，最多支持88用户，商业版无限制"}]}]},{"kind":"block","type":"code-line","key":"3058e9eafd46453d9acaa5c6bf34c162","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f3dbbe4616a345e8a916af9ab99a88f8","ranges":[{"kind":"range","marks":[],"text":"user_conn_limit=0                            # 限制用户IP数，0代表无限制，默认会优先使用面板设置的限制IP数，在部分旧版面板下可能会获取不到，则使用这个值"}]}]},{"kind":"block","type":"code-line","key":"e31d5597d1584996bde86a998e772fe5","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"ba774be846e9410ebb92112dbbff3c27","ranges":[{"kind":"range","marks":[],"text":"trojan_remote_addr=127.0.0.1                 # 可选功能，trojan 反代地址，防止主动探测，务必搭建一个http服务"}]}]},{"kind":"block","type":"code-line","key":"8f32879a07224cadb03631fa744a6269","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"65511c92e69548b9a4250b2268309466","ranges":[{"kind":"range","marks":[],"text":"trojan_remote_port=80                        # 可选功能，trojan 反代端口，防止主动探测，务必搭建一个http服务"}]}]},{"kind":"block","type":"code-line","key":"af17c5cd777e47a3a565a4391a49a1ed","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"b4ca5c478240450084625e0be7c6768a","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"1f0f941ea0454d14b78f11b5503062ad","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"2c7a4187e1684e06903d80cbb851dd80","ranges":[{"kind":"range","marks":[],"text":"default_dns=8.8.8.8,1.1.1.1                  # 配置默认dns，可在此配置流媒体解锁的dns，以逗号分隔"}]}]},{"kind":"block","type":"code-line","key":"a916b9ced7b24edbb441857c0d99fe21","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"c25edbaafa8c4ae08de313024c2039fc","ranges":[{"kind":"range","marks":[],"text":"dns_cache_time=10                            # 自定义dns缓存时间，单位分钟，仅在设置了default_dns时有效，或者v2board设置了dns规则时也有效"}]}]},{"kind":"block","type":"code-line","key":"dca5ead6926b4e248542c40c8bbf37f6","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"ec76d7c4056347a5a8f69f7ab580ac33","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"4b6adaf1e06d4d4096ff18e22f66447d","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"20a6d7cb995d46d49bf1e390513f3c50","ranges":[{"kind":"range","marks":[],"text":"proxy_protocol=false                         # 具体请参看中转获取真实 IP 教程"}]}]},{"kind":"block","type":"code-line","key":"38be2dd0f1f24b54b22279b3dfaa027b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"6d2c8804e6e24667ae00ec4f7f065399","ranges":[{"kind":"range","marks":[],"text":"auto_update=false                            # soga 自动更新，只会检测稳定版"}]}]}]},{"kind":"block","type":"heading-2","key":"6d5bdb227bef46bca52a817c709d7c7d","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"9b8e9f9eae14466bb9e1fd63fbedf9c7","ranges":[{"kind":"range","marks":[],"text":"配置证书"}]}]},{"kind":"block","type":"blockquote","key":"59251026f43e4c21a3346c26f7ee54d9","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"f50710ff5b744f9c9060913fe039de13","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"2ffba059d02c48f2891a31f495dd5d81","ranges":[{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"trojan 必须要配置证书"}]}]}]},{"kind":"block","type":"paragraph","key":"7a78323753f743a2b77741f46873c036","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"416eb8ce67f34335a5285d714d10da46","ranges":[{"kind":"range","marks":[],"text":"soga 支持三种方式配置证书，任选其一即可"}]}]},{"kind":"block","type":"heading-3","key":"f453ee836c6c4e088b4a841145354de5","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"8a7fc791df774ad2b18d64bb54993f6c","ranges":[{"kind":"range","marks":[],"text":"① 手动指定证书路径"}]}]},{"kind":"block","type":"list-unordered","key":"2969bb20339c421a92d8dfbacc499348","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"list-item","key":"e60bbf89d303417d9f42373d6fde882b","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"765ee4851c0646f893469df6e03d92fc","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"35e91d72e7eb49bfba7c2294d1136501","ranges":[{"kind":"range","marks":[],"text":"以 / 开头的绝对路径"}]}]},{"kind":"block","type":"code","key":"4e6bafecf5104578aba933d5119c7d9b","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"a90e9e57e08e456b8107159ac6f87877","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"1192709ba1f343368fd0ec191593f636","ranges":[{"kind":"range","marks":[],"text":"cert_file=                                   # 手动指定证书路径"}]}]},{"kind":"block","type":"code-line","key":"e242265886404158abdd8e90292b8f4a","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"5f6008a8af0c47ea887078946224576e","ranges":[{"kind":"range","marks":[],"text":"key_file=                                    # 手动指定密钥路径"}]}]}]}]}]},{"kind":"block","type":"heading-3","key":"a81e4d9409f441b9b842833841bde083","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"d4caf161946b4a4691e400ac8ec45308","ranges":[{"kind":"range","marks":[],"text":"② http 模式自动申请证书（推荐）"}]}]},{"kind":"block","type":"list-unordered","key":"0864ef48bb2c4a9cb971ad2b9f970abe","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"list-item","key":"bf660051d17b4558be7060061b59349c","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"7001f69e1cea44dc8242abcbe790e5a2","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"969e6098db394efb8c5ced37ef6d7cca","ranges":[{"kind":"range","marks":[],"text":"确保服务器中没有其它程序占用 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"80"},{"kind":"range","marks":[],"text":" 端口，申请和续签时需要临时使用"}]}]}]},{"kind":"block","type":"list-item","key":"15152082564e4e108dd19868c896859c","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"af8ad854b8e546d7a7da7f1b870f6292","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"8808b0bd20844ab1aea75073a1626573","ranges":[{"kind":"range","marks":[],"text":"确保域名已解析到本服务器的IP"}]}]}]},{"kind":"block","type":"list-item","key":"ffc340308c574a9cba36f76e978a68a9","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"f064c2fea7d14dfeacda84d73ee09d30","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"aadeee334a2d42cda220f981319e8fa8","ranges":[{"kind":"range","marks":[],"text":"若开启CDN，则必须确保CDN不会跳转https，否则推荐dns验证"}]}]},{"kind":"block","type":"code","key":"272f0eb7af9d45cd8ac2c42cdd995ad3","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"8f27f61252c94528a6ad9428eb718b88","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"eabd574db7de4469b83e19f60be8aced","ranges":[{"kind":"range","marks":[],"text":"cert_domain=xxx.com                          # 申请证书的域名"}]}]},{"kind":"block","type":"code-line","key":"58fddf885a94495da742223d87009af8","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"9733fcd9f2084c7d9f74b79948bebe60","ranges":[{"kind":"range","marks":[],"text":"cert_mode=http                               # 申请模式"}]}]},{"kind":"block","type":"code-line","key":"051e562c36aa4abbadbba3873cbc6cbe","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"193fe069e8e147679ba9e7d95968d57c","ranges":[{"kind":"range","marks":[],"text":"cert_key_length=ec-256                       # 留空则申请RSA证书，填写ec-256或ec-384则申请ECC证书"}]}]}]}]}]},{"kind":"block","type":"heading-3","key":"033f59d8e329465e8dfdadf1eacfd149","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"583899e9a4654d75a18aa75ada7e19d5","ranges":[{"kind":"range","marks":[],"text":"③ dns 模式自动申请证书"}]}]},{"kind":"block","type":"list-unordered","key":"e2044e1df2c244d891d5dc0b27fb2273","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"list-item","key":"47e86e7bb60342698bb346a4fec42db7","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"596199056c6f4e8ca235a094a29db147","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"60844234df634e31bd82f7db8457b4f2","ranges":[{"kind":"range","marks":[],"text":"支持一百多种 DNS 服务商"}]}]}]},{"kind":"block","type":"list-item","key":"f505d937434941c4926de016a306a01e","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"1f34897df351487097c91b98c269994b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"4d22efe9bac04d279f03b721ca0e9e45","ranges":[{"kind":"range","marks":[],"text":"此配置方式较复杂，但最通用"}]}]}]},{"kind":"block","type":"list-item","key":"390dddd24515448591059fda4ea0ff6b","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"477e144108d246ff92668c7a929bbe98","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"654c3129b9954cfb892cc9ed7a82bc88","ranges":[{"kind":"range","marks":[],"text":"该页面列出了所有支持的 DNS 服务商："}]},{"kind":"inline","type":"link","key":"69c36de6b21b4ba3b28b6ec1bbbeaa13","isVoid":false,"data":{"href":"https://github.com/acmesh-official/acme.sh/wiki/dnsapi"},"nodes":[{"kind":"text","key":"b12143de229343d98c54c653418941c2","ranges":[{"kind":"range","marks":[],"text":"https://github.com/acmesh-official/acme.sh/wiki/dnsapi"}]}]},{"kind":"text","key":"206baf430cbb42f28c6c17a5ffd8b872","ranges":[{"kind":"range","marks":[],"text":""}]}]}]}]},{"kind":"block","type":"blockquote","key":"20f4d89a98994a5d8a6cd00d98687226","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"b3fdc3c0455c4e43838a336105723d91","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f9bb85d959e54f7bb23358a0121ef8b9","ranges":[{"kind":"range","marks":[],"text":"CloudFlare 配置示例"}]}]}]},{"kind":"block","type":"code","key":"e30949d83da34262afffb382adef061a","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"8ec08d86c09246eba750393e50cb83e4","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f1585fff66f24722acf6dce261618b0b","ranges":[{"kind":"range","marks":[],"text":"cert_domain=xxx.com                          # 申请证书的域名"}]}]},{"kind":"block","type":"code-line","key":"e233c41f61f94d96a21f02dbe4f1bfed","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"77ae3c85d1ad4ca288dea9cc47258219","ranges":[{"kind":"range","marks":[],"text":"cert_mode=dns                                # 申请模式"}]}]},{"kind":"block","type":"code-line","key":"7045b74de7db46f681667150ef1e4faf","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f692904b220b42afa195360a119e494a","ranges":[{"kind":"range","marks":[],"text":"cert_key_length=ec-256                       # 留空则申请RSA证书，填写ec-256或ec-384则申请ECC证书"}]}]},{"kind":"block","type":"code-line","key":"99c3d34308f440a09cf1e95b4739f32b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"6a9b11910eab4df7a32786398eca2901","ranges":[{"kind":"range","marks":[],"text":"dns_provider=dns_cf                          # DNS 提供商"}]}]},{"kind":"block","type":"code-line","key":"60230ff50ca84cc4a0caeb708afd9460","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"0790d20030ab4109a8617aa689dbf5d8","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"5771ecb8299249929528e08a9f4dc731","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"edd9657e5500446e810ad718aefe7ed4","ranges":[{"kind":"range","marks":[],"text":"DNS_CF_Email=xxx@xx.com                      # CF 邮箱"}]}]},{"kind":"block","type":"code-line","key":"6944fffcb743458485266046fce926e3","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"a25ba5987ede42c08605d3822339e626","ranges":[{"kind":"range","marks":[],"text":"DNS_CF_Key=xxxxx                             # CF API Global Key"}]}]}]},{"kind":"block","type":"blockquote","key":"83b70560e3454dcea966b1f58c374046","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"00cc71b3ae66483895eae794e5f2e0b3","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"0ba462ea2b144587864f0630406b6241","ranges":[{"kind":"range","marks":[],"text":"DNSPod 配置示例"}]}]}]},{"kind":"block","type":"code","key":"6b3441b952b24b6d87b2804bcfc9e942","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"a0605841156b4f65a96a8e3d738c03ee","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"fe70e38aaba340b7985a264b54181594","ranges":[{"kind":"range","marks":[],"text":"cert_domain=xxx.com                          # 申请证书的域名"}]}]},{"kind":"block","type":"code-line","key":"7f9795624aac4f2f85fb522ef531712d","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"b75839b55a32484b89c9190fea5c7757","ranges":[{"kind":"range","marks":[],"text":"cert_mode=dns                                # 申请模式"}]}]},{"kind":"block","type":"code-line","key":"d2c9d90d61d7469fa503ba76b436d866","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"a962153904334c6ebcc0577272a00898","ranges":[{"kind":"range","marks":[],"text":"cert_key_length=ec-256                       # 留空则申请RSA证书，填写ec-256或ec-384则申请ECC证书"}]}]},{"kind":"block","type":"code-line","key":"b1f7b8d1435c4a1996156cfc12984e9a","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"3ca696e4d7374b44af7f4a773a366082","ranges":[{"kind":"range","marks":[],"text":"dns_provider=dns_dp                          # DNS 提供商"}]}]},{"kind":"block","type":"code-line","key":"bc2febc8f7674eebaadf316404c1e627","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"7835b1fe79d54c2d9cb663947bd89267","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"6769fdfd161e4a0f8f06a823338d856f","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"2bca848debcc414a9b1d43c6e732435c","ranges":[{"kind":"range","marks":[],"text":"DNS_DP_Id=111                                # DNSPod 用户 id"}]}]},{"kind":"block","type":"code-line","key":"1fcd9af452d846a3a14ed6bbf433a117","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"b3ac2791e180415cbb8fa634b32bde1e","ranges":[{"kind":"range","marks":[],"text":"DNS_DP_Key=xxxxx                             # DNSPod API 密钥"}]}]}]},{"kind":"block","type":"paragraph","key":"4a2923162d1d4182b68e6f7937030ab0","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"6e607678438540309502e2bd312db6cd","ranges":[{"kind":"range","marks":[],"text":"其它的 DNS 服务商都能在这个页面找到："}]},{"kind":"inline","type":"link","key":"b46a0488baa844da958d7b493a4f7dd5","isVoid":false,"data":{"href":"https://github.com/acmesh-official/acme.sh/wiki/dnsapi"},"nodes":[{"kind":"text","key":"c9c67128366349dc96b4bb0adac8bed7","ranges":[{"kind":"range","marks":[],"text":"https://github.com/acmesh-official/acme.sh/wiki/dnsapi"}]}]},{"kind":"text","key":"f511a7bce732421db8c82b3eb2b5ae84","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"paragraph","key":"617a2d08c8fb4e989a8f2c019e11e402","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"bb9ad14f10134343b1fa70ae0de7a0d1","ranges":[{"kind":"range","marks":[],"text":"配置要点："}]}]},{"kind":"block","type":"list-unordered","key":"a433e43b59604df383dd3cd907bb9382","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"list-item","key":"b299c51311734777923ac72e6347dbf9","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"79a67cb80c014ea7a08d704b94715885","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"8763d1f8f0f9469084948f9f923d66be","ranges":[{"kind":"range","marks":[],"text":"搜索 DNS 提供商的名称，并找到命令中 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"--dns dns_xxx"},{"kind":"range","marks":[],"text":" 的内容，这个 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"dns_xxx "},{"kind":"range","marks":[],"text":"就是你要填的"}]}]}]},{"kind":"block","type":"list-item","key":"8461c8cdd1b24e27bec87e027a51df83","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"ca707cfb77754a14a5eb0ceab8f7ae37","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"36613e06051a40a387be6ae584ad3d49","ranges":[{"kind":"range","marks":[],"text":"再看看 DNS 提供商所需要配置的内容，"},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"区分大小写"},{"kind":"range","marks":[],"text":"，一般都是 API 密钥之类的，注意要在 soga 配置中加上 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"DNS_"},{"kind":"range","marks":[],"text":" 前缀，防止配置冲突"}]}]}]}]},{"kind":"block","type":"heading-1","key":"834944a2930b482b8bfc91adf4bd0421","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"21ff2295c74d4427a2656a41060beecd","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"heading-1","key":"ad81010a1d1f41e2b6abcc017765c2ac","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f09c1336265449e495c5f2d69e9c1de1","ranges":[{"kind":"range","marks":[],"text":"第三步、启动 soga"}]}]},{"kind":"block","type":"code","key":"3c3a6b72218a4653bef10bed9a6d43d8","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"939876f2a3fe4089a7fc3719de629d6e","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"8d04f0936529466897450a9b51ba8567","ranges":[{"kind":"range","marks":[],"text":"soga start"}]}]}]},{"kind":"block","type":"paragraph","key":"50072e7b4edc41f9a6cece245cb3d237","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"e3846deee4e84a7ebfbdd884fa898c22","ranges":[{"kind":"range","marks":[],"text":"若出现启动失败的情况，使用 soga log 查看错误信息"}]}]},
        
    
    ]]></description>
    </item>
        <item>
        <title><![CDATA[SSPanel Uim 对接 v2ray  SSPanel Uim 安装图文教程]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/535705]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Sun, 10 Jan 2021 11:16:24 +0800]]></pubDate>
        <description><![CDATA[    
    
        
            SSPanel Uim 对接 v2ray - soga 后端文档
            

            
        @font-face {
            font-family: "Roboto";
            src: local("Roboto"), local("Roboto-Regular"), url(https://gstatic.gitbook.com/fonts/fc3d4b35e4d07d4e0485cc2db0e57c77.woff) format('woff');
            font-weight: 400;
            font-display: swap;
        }
        @font-face {
            font-family: "Roboto";
            src: local("Roboto Medium"), local("Roboto-Medium"), url(https://gstatic.gitbook.com/fonts/f4fa50c4003f87e7dc10459e500933c3.woff) format('woff');
            font-weight: 500;
            font-display: swap;
        }
        @font-face {
            font-family: "Roboto";
            src: local("Roboto Bold"), local("Roboto-Bold"), url(https://gstatic.gitbook.com/fonts/72e37e5bf95a8dba938c78b1d7d91253.woff) format('woff');
            font-weight: 700;
            font-display: swap;
        }
    
        @font-face {
            font-family: "Content-font";
            src: local("Roboto"), local("Roboto-Regular"), url(https://gstatic.gitbook.com/fonts/fc3d4b35e4d07d4e0485cc2db0e57c77.woff) format('woff');
            font-weight: 400;
            font-display: swap;
        }
        @font-face {
            font-family: "Content-font";
            src: local("Roboto Medium"), local("Roboto-Medium"), url(https://gstatic.gitbook.com/fonts/f4fa50c4003f87e7dc10459e500933c3.woff) format('woff');
            font-weight: 500;
            font-display: swap;
        }
        @font-face {
            font-family: "Content-font";
            src: local("Roboto Bold"), local("Roboto-Bold"), url(https://gstatic.gitbook.com/fonts/72e37e5bf95a8dba938c78b1d7d91253.woff) format('woff');
            font-weight: 700;
            font-display: swap;
        }
    
            
            #__GITBOOK__ROOT__SERVER__ { width: 100%; height: 100%; display: flex;}
            #__GITBOOK__ROOT__CLIENT__ { width: 100%; min-height: 100%; height: initial; display: flex;}
            html, body {
  color: #242A31;
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
  font-size: 15px;
  background: #F5F7F9;
  box-sizing: border-box;
  font-family: "Roboto", sans-serif;
  line-height: 1em;
  font-smoothing: antialiased;
  text-size-adjust: 100%;
  -ms-text-size-adjust: 100%;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  -webkit-text-size-adjust: 100%;
}
@media screen and (min-width: 768px) {
  html, body {
    text-rendering: optimizeLegibility;
  }
}
@media print {
  html, body {
    background: transparent;
  }
}
*, *:before, *:after {
  outline: none;
  box-sizing: inherit;
}
@font-face {
  font-family: "Flow-Rounded";
  src: url("https://gstatic.gitbook.com/fonts/bfc0a96537ceb0cad9e956b9f980fe88.woff") format('woff');
  font-display: block;
}
input, select, textarea {
  font-size: 16px;
}
input, select, textarea, button {
  font: inherit;
}
input[type="search"] {
  -webkit-appearance: none;
}
.draggingElement, .draggingElement *:hover {
  cursor: grabbing !important;
  pointer-events: auto !important;
}
.draggingElement .draggingHidden {
  display: none;
}

.reset-3c756112--body-68cac36c {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  width: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  background: #F5F7F9;
  min-height: 100vh;
  flex-direction: column;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--header-07037613--header-11420428 {
  display: -webkit-box;
  height: 80px;
  margin: 0;
  display: flex;
  padding: 0;
  z-index: 20;
  position: relative;
  box-shadow: 0 3px 8px 0 rgba(116, 129, 141, 0.1);
  border-bottom: 1px solid #d4dadf;
  background-color: #FFFFFF;
}
@media print {
  .reset-3c756112--header-07037613--header-11420428 {
    display: none;
  }
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--header-07037613--header-11420428 {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    top: 0;
    width: 100%;
    display: flex;
    position: fixed;
    padding-left: 16px;
    padding-right: 16px;
  }
}
@media screen and (max-width: 767px) {
  .reset-3c756112--header-07037613--header-11420428 {
    height: 60px;
    padding-left: 8px;
    padding-right: 8px;
  }
}
.reset-3c756112--headerContainer-bb8cc0bc {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 100%;
  margin: 0 auto;
  display: flex;
  padding: 0;
  max-width: 1448px;
}
.reset-3c756112--headerLeftColumn-4eae0bae--headerLeftColumn-7efc9f26 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  align-items: center;
  justify-content: space-between;
  -webkit-box-pack: justify;
  -webkit-box-align: center;
}
@media screen and (min-width: 1024px) {
  .reset-3c756112--headerLeftColumn-4eae0bae--headerLeftColumn-7efc9f26 {
    max-width: 298px;
    justify-content: center;
    -webkit-box-pack: center;
  }
  .reset-3c756112--headerLeftColumn-4eae0bae--headerLeftColumn-7efc9f26:after {
    top: 50%;
    right: 0;
    height: 40px;
    content: " ";
    position: absolute;
    transform: translateY(-50%);
    border-left: 1px solid #E6ECF1;
  }
}
.reset-3c756112--mobileButton-7a76d05f {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 0 0 auto;
  width: 30px;
  cursor: pointer;
  height: 30px;
  margin: 0;
  display: flex;
  outline: none;
  padding: 0;
  font-size: 18px;
  align-items: center;
  justify-content: center;
  -webkit-box-pack: center;
  -webkit-box-align: center;
}
@media screen and (min-width: 1024px) {
  .reset-3c756112--mobileButton-7a76d05f {
    display: none;
  }
}
.icon-7f6730be--text-3f89f380--icon-1f8349b3 {
  color: #242A31;
  width: 1em;
  height: 1em;
  vertical-align: middle;
}
.reset-3c756112--headerLogo-5c0b38e2 {
  margin: 0;
  display: block;
  padding: 0px 24px;
}
@media screen and (min-width: 1024px) {
  .reset-3c756112--headerLogo-5c0b38e2 {
    width: 250px;
    padding: 0;
  }
}
.reset-3c756112--mobileLogo-dacfd15c {
  margin: 0;
  display: none;
  padding: 0;
}
@media screen and (max-width: 767px) {
  .reset-3c756112--mobileLogo-dacfd15c {
    display: block;
  }
}
.link-a079aa82--primary-53a25e66--logoLink-10d08504 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #3884FF;
  cursor: pointer;
  display: flex;
  align-items: center;
  text-decoration: none;
  -webkit-box-align: center;
}
.reset-3c756112--tooltipContainer-7fdb9b70--small-2ec8ae1a {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 30px;
  height: 30px;
  margin: 0;
  display: flex;
  padding: 0;
  border-radius: 3px;
}
.reset-3c756112--avatarFrame-2f40cdc9--small-2ec8ae1a {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  -webkit-mask-image: -webkit-radial-gradient(white, black);
  -webkit-mask-image: -moz-radial-gradient(white, black);
  mask-image: -webkit-radial-gradient(white, black);
  mask-image: -moz-radial-gradient(white, black);
  width: 30px;
  height: 30px;
  margin: 0;
  display: flex;
  padding: 0;
  overflow: hidden;
  position: relative;
  mask-image: radial-gradient(white, black);
  align-items: center;
  border-radius: 3px;
  justify-content: center;
  -webkit-box-pack: center;
  -webkit-box-align: center;
  -webkit-mask-image: radial-gradient(white, black);
}
.image-67b14f24--avatar-1c1d03ec {
  width: 100%;
  height: 100%;
  max-width: 100%;
  background-size: cover;
  background-color: #FFFFFF;
  background-repeat: no-repeat;
}
.reset-3c756112--S100Left-7c8af13a--logoDisplayNameContainer-583bfe61--logoText-03dbe4a1 {
  flex: 1;
  color: #242A31;
  margin: 0;
  display: block;
  padding: 0;
  padding-left: 8px;
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--S100Left-7c8af13a--logoDisplayNameContainer-583bfe61--logoText-03dbe4a1 {
    overflow: hidden;
    max-width: 50vw;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
}
.reset-3c756112--S100Left-7c8af13a--logoDisplayNameContainer-583bfe61--logoText-03dbe4a1:hover {
  color: #FF4642;
}
.text-4505230f--DisplayH700-a03ad9b4--textContentFamily-49a318e1--spaceNameText-677c2969 {
  font-size: 24px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
  overflow-wrap: break-word;
}
.reset-3c756112--desktopLogo-a594db90 {
  margin: 0;
  display: block;
  padding: 0;
}
@media screen and (max-width: 767px) {
  .reset-3c756112--desktopLogo-a594db90 {
    display: none;
  }
}
.reset-3c756112--tooltipContainer-7fdb9b70--medium-296350e4 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 40px;
  height: 40px;
  margin: 0;
  display: flex;
  padding: 0;
  border-radius: 3px;
}
.reset-3c756112--avatarFrame-2f40cdc9--medium-296350e4 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  -webkit-mask-image: -webkit-radial-gradient(white, black);
  -webkit-mask-image: -moz-radial-gradient(white, black);
  mask-image: -webkit-radial-gradient(white, black);
  mask-image: -moz-radial-gradient(white, black);
  width: 40px;
  height: 40px;
  margin: 0;
  display: flex;
  padding: 0;
  overflow: hidden;
  position: relative;
  mask-image: radial-gradient(white, black);
  align-items: center;
  border-radius: 3px;
  justify-content: center;
  -webkit-box-pack: center;
  -webkit-box-align: center;
  -webkit-mask-image: radial-gradient(white, black);
}
.reset-3c756112--headerInnerWrapper-629f79d1--headerInnerWrapper-4f99acea {
  flex: 1 1 auto;
  margin: 0px 88px;
  display: block;
  padding: 0;
  overflow: hidden;
  position: relative;
  max-width: 750px;
}
.reset-3c756112--headerInnerWrapper-629f79d1--headerInnerWrapper-4f99acea:after {
  background: -webkit-linear-gradient(to right, rgba(255,255,255,0) 0%, #FFFFFF 100%);
  background: -moz-linear-gradient(to right, rgba(255,255,255,0) 0%, #FFFFFF 100%);
  top: 0;
  right: 0;
  width: 32px;
  height: 100%;
  content: " ";
  position: absolute;
  background: linear-gradient(to right, rgba(255,255,255,0) 0%, #FFFFFF 100%);
  pointer-events: none;
}
@media screen and (max-width: 1439px) {
  .reset-3c756112--headerInnerWrapper-629f79d1--headerInnerWrapper-4f99acea {
    margin: 0px 24px 0px 88px;
  }
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--headerInnerWrapper-629f79d1--headerInnerWrapper-4f99acea {
    display: none;
  }
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48 {
  display: -webkit-box;
  overflow-x: auto;
  height: 100%;
  margin: 0;
  display: flex;
  opacity: 1;
  padding: 0;
  overflow-x: overlay;
  overflow-y: hidden;
  transition: flex 250ms ease,width 250ms ease,opacity 250ms ease;
  -moz-transition: flex 250ms ease,width 250ms ease,opacity 250ms ease;
  -webkit-transition: flex 250ms ease,width 250ms ease,opacity 250ms ease;
  -webkit-overflow-scrolling: touch;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-scrollbar {
  width: 4px;
  height: 4px;
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-scrollbar-track {
  background: none;
  border-width: 0;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
  transition: background 250ms ease;
  border-radius: 2px;
  -moz-transition: background 250ms ease;
  -webkit-transition: background 250ms ease;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-scrollbar-button {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-scrollbar-track-piece {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-scrollbar-corner {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48::-webkit-resizer {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48:hover::-webkit-scrollbar {
  display: initial;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisX-bf86cd6c--headerInner-c872fc48:hover::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
}
.reset-3c756112--searchInputWrapper-ea7f3052--searchInputWrapper-0442d130 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  height: 80px;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  max-width: 224px;
  align-items: center;
  -webkit-box-align: center;
}
.reset-3c756112--searchInputWrapper-ea7f3052--searchInputWrapper-0442d130:before {
  top: 50%;
  left: 0;
  height: 40px;
  content: " ";
  position: absolute;
  transform: translateY(-50%);
  border-left: 1px solid #E6ECF1;
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--searchInputWrapper-ea7f3052--searchInputWrapper-0442d130 {
    display: none;
  }
}
.reset-3c756112--inputContainer-b2cb171c {
  margin: 0;
  display: block;
  padding: 0;
  padding-left: 14px;
  padding-right: 16px;
}
.inputInner-5c86b87d--medium-0bbed4bd--inputInner-4216b016--searchInputPlaceholder-936306be {
  font: inherit;
  color: #242A31;
  width: 100%;
  border: none;
  cursor: inherit;
  height: 38px;
  margin: 0;
  resize: none;
  outline: none;
  padding: 0px 8px;
  background: transparent;
  box-sizing: border-box;
  text-align: left;
  line-height: inherit;
  border-radius: 3px;
}
.inputInner-5c86b87d--medium-0bbed4bd--inputInner-4216b016--searchInputPlaceholder-936306be::placeholder {
  color: #9DAAB6;
  font-size: 16px;
  font-weight: 500;
}
.reset-3c756112--inputWrapper-63396dac--TextH400-3033861f--medium-4505230f--light-502263b4--input-6d442051--searchInput-3fa812d5 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 100%;
  border: none;
  margin: 0;
  display: flex;
  outline: none;
  padding: 0;
  font-size: 16px;
  background: #FFFFFF;
  box-sizing: border-box;
  font-weight: 400;
  line-height: 1.625;
  border-radius: 3px;
  background-color: #FFFFFF;
}
.reset-3c756112--inputInnerSizer-756c9114 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
}
.reset-3c756112--inputAddOn-45de9ec1--inputAddOnPrefix-202fa60d--icon-1f8349b3 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 0 0 auto;
  color: #242A31;
  order: -1;
  margin: 0;
  display: flex;
  padding: 0;
  align-items: center;
  line-height: 1.2;
  white-space: nowrap;
  padding-left: 8px;
  -webkit-box-align: center;
}
.icon-7f6730be--text-3f89f380 {
  width: 1em;
  height: 1em;
  vertical-align: middle;
}
.reset-3c756112--bodyContent-2f98451b {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 1;
  color: #3B454E;
  width: 100%;
  margin: 0 auto;
  display: flex;
  padding: 0;
}
.reset-3c756112--wholeContent-9fc567d4 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  min-height: 100%;
  flex-direction: column;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--wholeContentBody-554be184 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 1;
  margin: 0;
  display: flex;
  padding: 0;
  transition: margin-bottom 250ms ease;
  align-items: stretch;
  -moz-transition: margin-bottom 250ms ease;
  -webkit-box-align: stretch;
  -webkit-transition: margin-bottom 250ms ease;
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--wholeContentBody-554be184 {
    padding-top: 80px;
  }
}
@media screen and (max-width: 767px) {
  .reset-3c756112--wholeContentBody-554be184 {
    padding-top: 60px;
  }
}
@keyframes keyframes-animation-2f81d449-0-1-1667 {
  0% {
    background-color: rgba(24, 48, 85, 0);
  }
  100% {
    background-color: rgba(24, 48, 85, 0.30000000000000004);
  }
}
.reset-3c756112--backdrop-1322b68a--hidden-247382c3--overlay-29559ab8 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: 0;
  display: flex;
  padding: 0;
  z-index: 29;
  position: absolute;
  transition: background-color 250ms ease-out;
  align-items: center;
  animation-name: none;
  pointer-events: none;
  -moz-transition: background-color 250ms ease-out;
  justify-content: center;
  -webkit-box-pack: center;
  background-color: rgba(24, 48, 85, 0);
  -webkit-box-align: center;
  -webkit-transition: background-color 250ms ease-out;
  animation-duration: 0.2s;
  animation-fill-mode: forwards;
  animation-timing-function: ease-out;
}
@media screen and (min-width: 1024px) {
  .reset-3c756112--backdrop-1322b68a--hidden-247382c3--overlay-29559ab8 {
    z-index: 14;
  }
}
.reset-3c756112--contentNavigation-dd3370a4 {
  margin: 0;
  display: block;
  padding: 0;
  z-index: 30;
}
@media print {
  .reset-3c756112--contentNavigation-dd3370a4 {
    display: none;
  }
}
@media screen and (min-width: 1024px) {
  .reset-3c756112--contentNavigation-dd3370a4 {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    flex: 0 0 auto;
    width: calc((100% - 1448px) / 2 + 298px);
    display: flex;
    z-index: 15;
    min-width: 298px;
    background: #F5F7F9;
    align-items: stretch;
    border-right: 1px solid #E6ECF1;
    padding-left: calc((100% - 1448px) / 2);
    flex-direction: column;
    -webkit-box-align: stretch;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
  }
}
.reset-3c756112--contentNavigationInner-205d49ea--contentNavigationInnerCollapsed-7b4aca00 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--contentNavigationInner-205d49ea--contentNavigationInnerCollapsed-7b4aca00 {
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 30;
    position: fixed;
    max-width: 298px;
    transform: translateX(-100%) !important;
    box-shadow: none;
    overflow-y: auto;
    transition: transform 250ms ease;
    border-right: 1px solid #E6ECF1;
    -moz-transition: transform 250ms ease;
    background-color: #fff;
    -webkit-transition: transform 250ms ease;
  }
}
.reset-3c756112--sidebarWrapper-84a13d8e {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: auto;
  width: 100%;
  height: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  align-items: stretch;
  flex-direction: column;
  -webkit-box-align: stretch;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112 {
  margin: 0;
  display: block;
  padding: 0;
}
.reset-3c756112--sidebar-84a13d8e {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: auto;
  width: 100%;
  height: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  align-items: stretch;
  flex-direction: column;
  -webkit-box-align: stretch;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--sidebarMain-13701e8f {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  height: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  overflow-y: hidden;
  flex-direction: column;
  background-color: #F5F7F9;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe {
  overflow-y: auto;
  flex: 1 1 auto;
  width: 100%;
  margin: 0;
  display: block;
  padding: 0;
  overflow-x: hidden;
  overflow-y: overlay;
  -webkit-overflow-scrolling: touch;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-scrollbar {
  width: 4px;
  height: 4px;
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-scrollbar-track {
  background: none;
  border-width: 0;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
  transition: background 250ms ease;
  border-radius: 2px;
  -moz-transition: background 250ms ease;
  -webkit-transition: background 250ms ease;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-scrollbar-button {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-scrollbar-track-piece {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-scrollbar-corner {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe::-webkit-resizer {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe:hover::-webkit-scrollbar {
  display: initial;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--sidebarInner-18a1e7fe:hover::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
}
.reset-3c756112--mobileHeader-4e2d4892 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #74818D;
  height: 59px;
  margin: 0;
  display: flex;
  padding: 0;
  box-shadow: 0 1px 1px 0 rgba(116, 129, 141, 0.1);
  align-items: stretch;
  border-bottom: 1px solid #d4dadf;
  background-color: #FFFFFF;
  -webkit-box-align: stretch;
}
@media screen and (min-width: 768px) {
  .reset-3c756112--mobileHeader-4e2d4892 {
    display: none;
  }
}
.reset-3c756112--mobileHeaderClose-47b8fa64 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  cursor: pointer;
  margin: 0;
  display: flex;
  padding: 8px 16px;
  font-size: 24px;
  align-items: center;
  -webkit-box-align: center;
}
.reset-3c756112--pagesTree-4b07cd56 {
  margin: 0;
  display: block;
  padding: 0;
  font-size: 15px;
  margin-top: 32px;
  padding-left: 16px;
}
@media screen and (min-width: 768px) {
  .reset-3c756112--pagesTree-4b07cd56 {
    padding-left: 24px;
  }
}
.reset-3c756112--pageItem-01e3f344 {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
  border-left: 1px solid transparent;
}
.reset-3c756112--pageComponent-7cc5301a {
  margin: 0;
  display: block;
  padding: 0;
  margin-left: -1px;
}
.navButton-94f2579c--S300Bottom-9b4658d2--navButtonClickable-161b88ca {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: inherit;
  border: 1px solid transparent;
  cursor: pointer;
  display: flex;
  padding: 7px 24px 7px 16px;
  position: relative;
  align-items: center;
  border-right: 0;
  margin-bottom: 24px;
  text-decoration: none;
  -webkit-box-align: center;
}
.navButton-94f2579c--S300Bottom-9b4658d2--navButtonClickable-161b88ca:hover {
  background-color: #E6ECF1;
}
.text-4505230f--UIH300-2063425d--textContentFamily-49a318e1--navButtonLabel-14a4968f {
  flex: 1;
  font-size: 14px;
  word-break: break-word;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
}
.reset-3c756112--pageItemWithChildren-56f27afc--S300Bottom-9b4658d2 {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
  margin-bottom: 24px;
}
.reset-3c756112--navButton-94f2579c--pageGroup-2c5d8183 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #9DAAB6;
  border: 1px solid transparent;
  margin: 0;
  display: flex;
  padding: 7px 24px 7px 16px;
  position: relative;
  align-items: center;
  border-right: 0;
  text-decoration: none;
  -webkit-box-align: center;
}
.text-4505230f--InfoH200-3a8a7a86--textContentFamily-49a318e1 {
  font-size: 12px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: 1.2px;
  text-transform: uppercase;
}
.reset-3c756112--pageChildren-56f27afc--pageGroupChildren-2d50aefa {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
  margin-left: 0;
}
.reset-3c756112--pageItemWithChildren-56f27afc {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
}
.navButton-94f2579c--navButtonClickable-161b88ca {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: inherit;
  border: 1px solid transparent;
  cursor: pointer;
  display: flex;
  padding: 7px 24px 7px 16px;
  position: relative;
  align-items: center;
  border-right: 0;
  text-decoration: none;
  -webkit-box-align: center;
}
.navButton-94f2579c--navButtonClickable-161b88ca:hover {
  background-color: #E6ECF1;
}
.navButton-94f2579c--navButtonClickable-161b88ca--navButtonOpened-6a88552e {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: inherit;
  border: 1px solid transparent;
  cursor: pointer;
  display: flex;
  padding: 7px 24px 7px 16px;
  position: relative;
  align-items: center;
  border-color: #E6ECF1 !important;
  border-right: 0;
  text-decoration: none;
  background-color: #FFFFFF;
  -webkit-box-align: center;
}
.navButton-94f2579c--navButtonClickable-161b88ca--navButtonOpened-6a88552e:hover {
  border-color: #E6ECF1;
  background-color: #FFFFFF;
}
.reset-3c756112--footer-68e6f18c {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
}
.reset-3c756112--footer-68e6f18c:before {
  background: -webkit-linear-gradient(to bottom, rgba(255,255,255,0) 0%, #F5F7F9 100%);
  background: -moz-linear-gradient(to bottom, rgba(255,255,255,0) 0%, #F5F7F9 100%);
  top: -24px;
  width: 100%;
  height: 24px;
  content: "";
  display: block;
  position: absolute;
  background: linear-gradient(to bottom, rgba(255,255,255,0) 0%, #F5F7F9 100%);
}
.reset-3c756112--trademark-a8da4b94 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #9DAAB6;
  margin: 16px;
  display: flex;
  padding: 0;
  align-items: center;
  margin-left: 32px;
  padding-top: 8px;
  padding-left: 16px;
  border-radius: 3px;
  padding-right: 16px;
  padding-bottom: 8px;
  text-decoration: none;
  background-color: #E6ECF1;
  -webkit-box-align: center;
}
.reset-3c756112--trademark-a8da4b94:hover {
  color: #3884FF;
}
.reset-3c756112--trademarkLogo-0d2d53bc {
  margin: 0;
  display: block;
  padding: 0;
  font-size: 40px;
}
.reset-3c756112--trademarkContent-04a01aea {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
  padding-left: 16px;
}
.text-4505230f--TextH200-a3425406--textUIFamily-5ebd8e40 {
  font-size: 12px;
  font-family: "Roboto", sans-serif;
  font-weight: 400;
  line-height: 1.625;
}
.reset-3c756112--wholeContentPage-6c3f1fc5 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 1 1 auto;
  margin: 0;
  display: flex;
  padding: 0;
  max-width: 100%;
  min-width: 0;
  background: #fff;
  flex-direction: column;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--wholePageSticky-f53dafd2 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 1 1 auto;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  min-width: 0;
}
.reset-3c756112--pageContainer-544d6e9c {
  flex: 1 1 auto;
  margin: 0px 16px;
  display: block;
  padding: 0;
  max-width: 750px;
  min-width: 0;
  padding-bottom: 64px;
}
@media screen and (max-width: 1023px) {
  .reset-3c756112--pageContainer-544d6e9c {
    margin: 0px auto;
    padding: 0px 24px 24px;
  }
}
@media screen and (min-width: 1024px) {
  .reset-3c756112--pageContainer-544d6e9c {
    margin: 0px 88px;
  }
}
.reset-3c756112--pageHeader-15724735 {
  margin: 0;
  display: block;
  padding: 0;
  border-bottom: 2px solid #E6ECF1;
  margin-bottom: 32px;
}
.reset-3c756112--pageHeaderInner-7c0f0284 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: auto;
  margin: 0;
  display: flex;
  padding: 40px 0px;
}
@media screen and (min-width: 768px) {
  .reset-3c756112--pageHeaderInner-7c0f0284 {
    flex-wrap: wrap;
    align-items: baseline;
    flex-direction: row;
    -webkit-box-align: baseline;
    -webkit-box-lines: multiple;
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
  }
}
.reset-3c756112--pageHeaderWrapperContent-6897c946 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
}
.reset-3c756112--horizontalFlex-5a0077e0 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  margin: 0;
  display: flex;
  padding: 0;
  align-items: stretch;
  justify-content: space-between;
  -webkit-box-pack: justify;
  -webkit-box-align: stretch;
}
.reset-3c756112--pageHeaderIntro-0c1463da {
  flex: 1 1 auto;
  margin: 0;
  display: block;
  padding: 0;
  padding-right: 16px;
}
.reset-3c756112--pageTitle-33dc39a3 {
  color: #242A31;
  width: 100%;
  border: none;
  margin: 0;
  display: block;
  outline: none;
  padding: 0;
  background: none;
  border-radius: 3px;
}
.text-4505230f--DisplayH900-bfb998fa--textContentFamily-49a318e1 {
  font-size: 32px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
}
.reset-3c756112--toolbar-a6a9f7d2--medium-8e46b02c--pageHeaderToolbar-6457a802--withControlsClosed-3e96e46c {
  display: -ms-inline-grid;
  margin: 0;
  display: none;
  padding: 0;
  margin-top: 9px;
  -ms-grid-rows: none;
  grid-column-gap: 16px;
  grid-template-rows: none;
}
@media screen and (max-width: 1279px) {
  .reset-3c756112--toolbar-a6a9f7d2--medium-8e46b02c--pageHeaderToolbar-6457a802--withControlsClosed-3e96e46c {
    display: block;
  }
}
.button-36063075--small-30ceeddb--button-5c53d970--small-54db2a94 {
  display: -webkit-inline-box;
  display: -moz-inline-box;
  display: -ms-inline-flexbox;
  display: -webkit-inline-flex;
  color: #9DAAB6;
  width: 30px;
  border: 1px solid;
  cursor: pointer;
  height: 30px;
  display: inline-flex;
  outline: none;
  padding: 0;
  transition: all 250ms ease-out;
  align-items: center;
  line-height: 1em;
  white-space: nowrap;
  border-color: transparent;
  border-radius: 3px;
  -moz-transition: all 250ms ease-out;
  justify-content: center;
  text-decoration: none;
  -webkit-box-pack: center;
  background-color: transparent;
  -webkit-box-align: center;
  -webkit-transition: all 250ms ease-out;
}
.button-36063075--small-30ceeddb--button-5c53d970--small-54db2a94:disabled {
  opacity: 0.5;
  pointer-events: none;
}
.button-36063075--small-30ceeddb--button-5c53d970--small-54db2a94:hover {
  color: #FF4642;
}
.small-3bde6db7--iconOnly-bddce91a {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  margin: 0;
  display: flex;
  font-size: 18px;
  align-items: center;
  justify-content: center;
  -webkit-box-pack: center;
  -webkit-box-align: center;
}
.text-4505230f--UIH300-2063425d--textUIFamily-5ebd8e40--text-8ee2c8b2 {
  font-size: 14px;
  font-family: "Roboto", sans-serif;
  font-weight: 500;
  line-height: 1em;
}
.reset-3c756112--pageHeaderDescription-22970244 {
  flex: auto;
  margin: 0;
  display: block;
  padding: 0;
}
.reset-3c756112--toaster-c029690e {
  top: 16px;
  left: 50%;
  margin: 0;
  display: block;
  padding: 0;
  z-index: 160;
  position: fixed;
  transform: translateX(-50%);
}
.reset-3c756112--pageBody-a91db4ac {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  font-size: 16px;
  flex-direction: column;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--container-960c7c26 {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
  margin-bottom: -24px;
}
.blockHeading-442b4f12 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  margin: 0;
  display: flex;
  position: relative;
  margin-bottom: 24px;
}
.blockHeadingContent-756c9114 {
  flex: 1;
}
.text-4505230f--HeadingH700-04e1a2a3--textContentFamily-49a318e1 {
  font-size: 24px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 700;
  line-height: 1.5;
}
.blockHeadingAnchor-34f75d78--blockHeadingAnchorHidden-d69b5eda {
  color: #242A31;
  width: 20px;
  opacity: 0;
  transition: opacity 150ms ease;
  line-height: 1em;
  padding-left: 4px;
  -moz-transition: opacity 150ms ease;
  -webkit-transition: opacity 150ms ease;
}
.blockHeadingAnchor-34f75d78--blockHeadingAnchorHidden-d69b5eda:hover {
  color: #3884FF;
}
@media print {
  .blockHeadingAnchor-34f75d78--blockHeadingAnchorHidden-d69b5eda {
    display: none;
  }
}
.blockHeadingAnchorIcon-1c2bf3cb {
  font-size: 16px;
  vertical-align: middle;
}
.reset-3c756112--blockHeadingUp-c32402b2 {
  width: 1em;
  cursor: pointer;
  height: 1em;
  margin: 0;
  display: block;
  outline: none;
  padding: 0;
  line-height: 1em;
}
@media screen and (min-width: 768px) {
  .reset-3c756112--blockHeadingUp-c32402b2 {
    display: none;
  }
}
@media print {
  .reset-3c756112--blockHeadingUp-c32402b2 {
    display: none;
  }
}
.blockParagraph-544a408c {
  color: inherit;
  margin: 0;
  position: relative;
  margin-bottom: 24px;
}
.text-4505230f--TextH400-3033861f--textContentFamily-49a318e1 {
  font-size: 16px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 400;
  line-height: 1.625;
}
.link-a079aa82--primary-53a25e66--link-faf6c434 {
  color: #3884FF;
  cursor: pointer;
  text-decoration: none;
}
.link-a079aa82--primary-53a25e66--link-faf6c434:hover {
  text-decoration: underline;
}
.blockHeading-442b4f12--blockHeading1WithMargin-b69d755e {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  margin: 0;
  display: flex;
  position: relative;
  margin-top: 73px;
  margin-bottom: 24px;
}
.blockHeading-442b4f12--blockHeading1WithMargin-b69d755e:before {
  top: -32px;
  left: 0;
  width: 100%;
  height: 1px;
  content: " ";
  position: absolute;
  background-color: #E6ECF1;
}
.reset-3c756112--codeBlockWrapper-56f27afc {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
}
.reset-3c756112--copyButtonWrapper-ca591f6e {
  top: 16px;
  right: 16px;
  margin: 0;
  display: block;
  padding: 0;
  z-index: 1;
  position: absolute;
}
@keyframes keyframes-animation-bd7e9c6a-0-1-1668 {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
.reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe {
  color: #9DAAB6;
  cursor: pointer;
  margin: 0;
  display: block;
  opacity: 0.5;
  outline: none;
  padding: 8px;
  position: relative;
  font-size: 16px;
  line-height: 1em;
}
.reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe:hover {
  opacity: 1;
}
@media print {
  .reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe {
    display: none;
  }
}
.reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe:after {
  width: -webkit-max-content;
  width: -moz-max-content;
  top: calc(100% + 16px);
  left: 50%;
  color: #FFFFFF;
  width: max-content;
  bottom: auto;
  content: attr(aria-label);
  display: none;
  opacity: 0;
  padding: 5px 8px;
  z-index: 155;
  position: absolute;
  font-size: 12px;
  max-width: 300px;
  transform: translateX(-50%);
  background: #242A31;
  font-weight: 400;
  line-height: 1.625;
  white-space: normal;
  border-radius: 3px;
  animation-name: keyframes-animation-bd7e9c6a-0-1-1668;
  pointer-events: none;
  text-transform: none;
  animation-duration: 0.2s;
  animation-fill-mode: forwards;
}
.reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe:before {
  top: calc(100% + 8px);
  left: 50%;
  width: 0;
  bottom: auto;
  height: 0;
  content: "";
  display: none;
  opacity: 0;
  z-index: 156;
  position: absolute;
  transform: translateX(-50%);
  border-color: #242A31 transparent;
  border-style: solid;
  animation-name: keyframes-animation-bd7e9c6a-0-1-1668;
  border-top-width: 0;
  border-left-width: 8px;
  animation-duration: 0.2s;
  border-right-width: 8px;
  animation-fill-mode: forwards;
  border-bottom-width: 8px;
}
.reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe:hover:before {
  display: block;
}
.reset-3c756112--touchableView-a079aa82--copyButton-4f9a9412--tooltipped-57ae51fe:hover:after {
  display: block;
}
.reset-3c756112--codeBlock-36378b66 {
  color: #E6ECF1;
  margin: 32px 0px;
  display: block;
  hyphens: none;
  padding: 24px 24px 24px 8px;
  overflow: auto;
  tab-size: 2;
  direction: ltr;
  font-size: 14px;
  background: #183055;
  text-align: left;
  word-break: normal;
  -ms-hyphens: none;
  font-family: "Source Code Pro", Consolas, Menlo, Monaco, Courier, monospace;
  line-height: 1.4;
  white-space: pre;
  word-spacing: normal;
  -moz-tab-size: 2;
  border-radius: 3px;
  -webkit-hyphens: none;
}
@supports (-moz-appearance:none) {
  .reset-3c756112--codeBlock-36378b66 {
    font-family: Consolas, Menlo, Monaco, Courier, monospace;
  }
}
.reset-3c756112--codeBlock-36378b66::selection {
  background: #D3DCE4;
  text-shadow: none;
}
.codeLine-a3169fbc {
  font: inherit;
  padding: 0px 0px;
  position: relative;
  word-wrap: normal;
  white-space: pre;
  padding-left: 44px;
  padding-right: 14px;
  counter-increment: line;
}
.codeLine-a3169fbc:not(:only-child):before {
  top: 2px;
  left: 4px;
  color: #5C6975;
  width: 24px;
  bottom: 0;
  content: counter(line);
  display: inline-block;
  overflow: hidden;
  position: absolute;
  font-size: 12px;
  text-align: right;
  user-select: none;
  white-space: nowrap;
  text-overflow: ellipsis;
  -ms-user-select: none;
  -moz-user-select: none;
  background-color: transparent;
  -webkit-user-select: none;
}
.codeLine-a3169fbc:only-child {
  padding-left: 30px;
}
.blockQuote-7a0db092 {
  color: #74818D;
  margin: 0;
  padding: 0;
  border-left: 4px solid;
  border-color: #E6ECF1;
  padding-left: 12px;
  margin-bottom: 24px;
}
.blockParagraph-544a408c--blockParagraphQuoted-280e03a6 {
  color: #74818D;
  margin: 0;
  position: relative;
  margin-bottom: 24px;
}
.list-20526648 {
  color: #3B454E;
  margin: 0;
  padding: 0;
  padding-left: 2em;
  margin-bottom: 24px;
}
.reset-3c756112--listItemContent-756c9114 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
}
.blockParagraph-544a408c--noMargin-acdf7afa {
  color: inherit;
  margin: 0;
  position: relative;
  margin-bottom: 0;
}
.bold-3c254bd9 {
  font-weight: 700;
}
.blockHeading-442b4f12--blockHeading2WithMargin-532d771d {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  margin: 0;
  display: flex;
  position: relative;
  margin-top: 32px;
  margin-bottom: 24px;
}
.text-4505230f--HeadingH600-23f228db--textContentFamily-49a318e1 {
  font-size: 20px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 700;
  line-height: 1.5;
}
.blockHeading-442b4f12--blockHeading3WithMargin-532d7700 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  margin: 0;
  display: flex;
  position: relative;
  margin-top: 24px;
  margin-bottom: 24px;
}
.text-4505230f--HeadingH400-686c0942--textContentFamily-49a318e1 {
  font-size: 16px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 700;
  line-height: 1.5;
}
.reset-3c756112--pageFooter-f1d5e2b0 {
  margin: 0;
  display: block;
  padding: 0;
  margin-top: 64px;
}
@media print {
  .reset-3c756112--pageFooter-f1d5e2b0 {
    display: none;
  }
}
.reset-3c756112--navPagesLinks-67bea901 {
  display: -ms-grid;
  width: auto;
  margin: 0;
  display: grid;
  padding: 0;
  -ms-grid-rows: auto;
  grid-column-gap: 24px;
  -ms-grid-columns: 1fr 1fr;
  grid-template-rows: auto;
  grid-template-areas: "previous next";
  grid-template-columns: 1fr 1fr;
}
@media screen and (max-width: 767px) {
  .reset-3c756112--navPagesLinks-67bea901 {
    grid-row-gap: 24px;
    -ms-grid-columns: 1fr;
    grid-template-areas: "next" "previous";
    grid-template-columns: 1fr;
  }
}
.reset-3c756112--card-6570f064--whiteCard-fff091a4--cardPrevious-56a5e674 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  border: 1px solid #E6ECF1;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  grid-area: previous;
  align-self: stretch;
  box-shadow: 0 3px 8px 0 rgba(116, 129, 141, 0.1);
  transition: border 250ms ease;
  align-items: center;
  justify-self: stretch;
  border-radius: 3px;
  flex-direction: row;
  -moz-transition: border 250ms ease;
  text-decoration: none;
  background-color: #FFFFFF;
  -webkit-box-align: center;
  page-break-inside: avoid;
  -ms-grid-row-align: stretch;
  -webkit-box-orient: horizontal;
  -webkit-transition: border 250ms ease;
  -ms-grid-column-align: stretch;
  -webkit-box-direction: normal;
}
.reset-3c756112--cardIcon-5b647d22 {
  flex: 0 0 auto;
  color: #9DAAB6;
  margin: 0;
  display: block;
  padding: 16px;
  font-size: 24px;
  transition: color 250ms ease;
  -moz-transition: color 250ms ease;
  -webkit-transition: color 250ms ease;
}
.reset-3c756112--cardIcon-5b647d22:first-child {
  padding-right: 0;
}
.reset-3c756112--cardIcon-5b647d22:last-child {
  padding-left: 0;
}
.reset-3c756112--cardBody-25dca3b1--cardPreviousBody-79f02c06 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 16px;
  text-align: right;
}
.reset-3c756112--cardHint-2c5d8183 {
  color: #9DAAB6;
  margin: 0;
  display: block;
  padding: 0;
}
.text-4505230f--TextH200-a3425406--textContentFamily-49a318e1 {
  font-size: 12px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 400;
  line-height: 1.625;
}
.reset-3c756112--cardTitle-32aa092e {
  margin: 0;
  display: block;
  padding: 0;
  transition: color 250ms ease;
  -moz-transition: color 250ms ease;
  -webkit-transition: color 250ms ease;
}
.text-4505230f--UIH400-4e41e82a--textContentFamily-49a318e1 {
  font-size: 16px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
}
.reset-3c756112--card-6570f064--whiteCard-fff091a4--cardNext-19241c42 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #242A31;
  border: 1px solid #E6ECF1;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  grid-area: next;
  align-self: stretch;
  box-shadow: 0 3px 8px 0 rgba(116, 129, 141, 0.1);
  transition: border 250ms ease;
  align-items: center;
  justify-self: stretch;
  border-radius: 3px;
  flex-direction: row;
  -moz-transition: border 250ms ease;
  text-decoration: none;
  background-color: #FFFFFF;
  -webkit-box-align: center;
  page-break-inside: avoid;
  -ms-grid-row-align: stretch;
  -webkit-box-orient: horizontal;
  -webkit-transition: border 250ms ease;
  -ms-grid-column-align: stretch;
  -webkit-box-direction: normal;
}
.reset-3c756112--cardBody-25dca3b1 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 16px;
}
.reset-3c756112--pageFooterColumns-ef8f347e {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  margin: 0;
  display: flex;
  padding: 0;
  border-top: 2px solid #E6ECF1;
  margin-top: 24px;
  align-items: center;
  padding-top: 24px;
  flex-direction: row;
  -webkit-box-align: center;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
}
@media screen and (max-width: 767px) {
  .reset-3c756112--pageFooterColumns-ef8f347e {
    align-items: stretch;
    flex-direction: column;
    -webkit-box-align: stretch;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
  }
}
.reset-3c756112--pageFooterSummary-12074aff {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
}
@media screen and (max-width: 767px) {
  .reset-3c756112--pageFooterSummary-12074aff {
    margin-bottom: 16px;
  }
}
.reset-3c756112--pageChangesSummary-08821678 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: auto;
  margin: 0;
  display: flex;
  padding: 0;
  align-items: center;
  -webkit-box-align: center;
}
.reset-3c756112--pageContributors-5c59582e {
  flex: 0 0 auto;
  margin: 0;
  display: block;
  padding: 0;
  margin-right: 8px;
}
.reset-3c756112--ownerAvatarList-696792ce {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  margin: 0;
  display: flex;
  padding: 0;
  flex-direction: row-reverse;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: reverse;
}
@keyframes keyframes-animation-bd7e9c6a-0-1-1669 {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
.reset-3c756112--tooltipContainer-7fdb9b70--tooltipped-57ae51fe--bottom-f9ec01b8--small-2ec8ae1a--circle-6c5acd10--ownerAvatarStackListItem-1b188f0f--whiteOutline-6045f802 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  width: 30px;
  height: 30px;
  margin: 0;
  display: flex;
  padding: 0;
  z-index: 0;
  position: relative;
  box-shadow: 0 0 0 2px white;
  border-radius: 128px;
}
.reset-3c756112--tooltipContainer-7fdb9b70--tooltipped-57ae51fe--bottom-f9ec01b8--small-2ec8ae1a--circle-6c5acd10--ownerAvatarStackListItem-1b188f0f--whiteOutline-6045f802:after {
  width: -webkit-max-content;
  width: -moz-max-content;
  top: calc(100% + 16px);
  left: 50%;
  color: #FFFFFF;
  width: max-content;
  bottom: auto;
  content: attr(aria-label);
  display: none;
  opacity: 0;
  padding: 5px 8px;
  z-index: 155;
  position: absolute;
  font-size: 12px;
  max-width: 300px;
  transform: translateX(-50%);
  background: #242A31;
  font-weight: 400;
  line-height: 1.625;
  white-space: normal;
  border-radius: 3px;
  animation-name: keyframes-animation-bd7e9c6a-0-1-1669;
  pointer-events: none;
  text-transform: none;
  animation-duration: 0.2s;
  animation-fill-mode: forwards;
}
.reset-3c756112--tooltipContainer-7fdb9b70--tooltipped-57ae51fe--bottom-f9ec01b8--small-2ec8ae1a--circle-6c5acd10--ownerAvatarStackListItem-1b188f0f--whiteOutline-6045f802:before {
  top: calc(100% + 8px);
  left: 50%;
  width: 0;
  bottom: auto;
  height: 0;
  content: "";
  display: none;
  opacity: 0;
  z-index: 156;
  position: absolute;
  transform: translateX(-50%);
  border-color: #242A31 transparent;
  border-style: solid;
  animation-name: keyframes-animation-bd7e9c6a-0-1-1669;
  border-top-width: 0;
  border-left-width: 8px;
  animation-duration: 0.2s;
  border-right-width: 8px;
  animation-fill-mode: forwards;
  border-bottom-width: 8px;
}
.reset-3c756112--tooltipContainer-7fdb9b70--tooltipped-57ae51fe--bottom-f9ec01b8--small-2ec8ae1a--circle-6c5acd10--ownerAvatarStackListItem-1b188f0f--whiteOutline-6045f802:nth-last-child(n+2) {
  margin-left: -8px;
}
.reset-3c756112--tooltipContainer-7fdb9b70--tooltipped-57ae51fe--bottom-f9ec01b8--small-2ec8ae1a--circle-6c5acd10--ownerAvatarStackListItem-1b188f0f--whiteOutline-6045f802:hover:before {
  display: block;
}
.reset-3c756112--tooltipContainer-7fdb9b70--tooltipped-57ae51fe--bottom-f9ec01b8--small-2ec8ae1a--circle-6c5acd10--ownerAvatarStackListItem-1b188f0f--whiteOutline-6045f802:hover:after {
  display: block;
}
.reset-3c756112--avatarFrame-2f40cdc9--small-2ec8ae1a--circle-6c5acd10 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  -webkit-mask-image: -webkit-radial-gradient(white, black);
  -webkit-mask-image: -moz-radial-gradient(white, black);
  mask-image: -webkit-radial-gradient(white, black);
  mask-image: -moz-radial-gradient(white, black);
  width: 30px;
  height: 30px;
  margin: 0;
  display: flex;
  padding: 0;
  overflow: hidden;
  position: relative;
  mask-image: radial-gradient(white, black);
  align-items: center;
  border-radius: 128px;
  justify-content: center;
  -webkit-box-pack: center;
  -webkit-box-align: center;
  -webkit-mask-image: radial-gradient(white, black);
}
.reset-3c756112--innerShadow-7a3a8651 {
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: 0;
  display: block;
  padding: 0;
  position: absolute;
  box-shadow: inset 0 0 1px 1px rgba(24, 48, 85, 0.1);
  border-radius: 128px;
  pointer-events: none;
}
.reset-3c756112--pageEditedDate-b805c39a {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: auto;
  color: #9DAAB6;
  margin: 0;
  display: flex;
  padding: 0;
}
.reset-3c756112--pageSide-ad9fed26 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  flex: 0 0 auto;
  width: 224px;
  margin: 0;
  display: flex;
  padding: 0;
  position: relative;
  margin-right: auto;
}
@media print {
  .reset-3c756112--pageSide-ad9fed26 {
    display: none;
  }
}
@media screen and (max-width: 1279px) {
  .reset-3c756112--pageSide-ad9fed26 {
    display: none;
  }
}
.reset-3c756112--stickyContainer-2bed3a82 {
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
  max-width: 100%;
}
.reset-3c756112--tocWrapper-506ea24c {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  height: 100%;
  margin: 0;
  display: flex;
  padding: 0;
  padding-top: 40px;
  flex-direction: column;
  padding-bottom: 40px;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114 {
  overflow-y: auto;
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
  overflow-x: hidden;
  overflow-y: overlay;
  -webkit-overflow-scrolling: touch;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-scrollbar {
  width: 4px;
  height: 4px;
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-scrollbar-track {
  background: none;
  border-width: 0;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
  transition: background 250ms ease;
  border-radius: 2px;
  -moz-transition: background 250ms ease;
  -webkit-transition: background 250ms ease;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-scrollbar-button {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-scrollbar-track-piece {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-scrollbar-corner {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114::-webkit-resizer {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114:hover::-webkit-scrollbar {
  display: initial;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--scrollableContainer-756c9114:hover::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
}
.reset-3c756112--pageSideSection-542f1fd5 {
  margin: 0;
  display: block;
  padding: 0;
  position: relative;
}
.reset-3c756112--pageSideSection-542f1fd5:before {
  top: 0;
  left: 0;
  height: 100%;
  content: " ";
  position: absolute;
  border-left: 1px solid #E6ECF1;
}
.reset-3c756112--menu-5b8a7448--pageToc-16c35922--pageTocLive-542f1fd5 {
  display: -webkit-box;
  flex: 1;
  margin: 0;
  display: flex;
  padding: 0;
  overflow: hidden;
  position: relative;
  min-width: 224px;
  counter-reset: toc;
  flex-direction: column;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
}
@media print {
  .reset-3c756112--menu-5b8a7448--pageToc-16c35922--pageTocLive-542f1fd5 {
    display: none;
  }
}
.reset-3c756112--menu-5b8a7448--pageToc-16c35922--pageTocLive-542f1fd5:before {
  top: 0;
  left: 0;
  height: 100%;
  content: " ";
  position: absolute;
  border-left: 1px solid #E6ECF1;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496 {
  overflow-y: auto;
  flex: 1;
  margin: 0;
  display: block;
  padding: 0;
  overflow-x: hidden;
  overflow-y: overlay;
  -webkit-overflow-scrolling: touch;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-scrollbar {
  width: 4px;
  height: 4px;
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-scrollbar-track {
  background: none;
  border-width: 0;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
  transition: background 250ms ease;
  border-radius: 2px;
  -moz-transition: background 250ms ease;
  -webkit-transition: background 250ms ease;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-scrollbar-button {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-scrollbar-track-piece {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-scrollbar-corner {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496::-webkit-resizer {
  display: none;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496:hover::-webkit-scrollbar {
  display: initial;
}
.reset-3c756112--withScrollbar-39338630--scrollAxisY-7680295e--menuItems-2e6f017b--pageTocLiveItems-67c61496:hover::-webkit-scrollbar-thumb {
  background: rgba(0,0,0,.16);
}
.reset-3c756112--menuHeader-342906de--menuHeaderLight-2c5d8183 {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  color: #9DAAB6;
  margin: 0;
  display: flex;
  padding: 0;
  padding-left: 24px;
  margin-bottom: 8px;
}
.reset-3c756112--menuHeaderIcon-0c3ed569 {
  margin: 0;
  display: block;
  padding: 0;
  margin-right: 8px;
}
.text-4505230f--InfoH100-1e92e1d1--textContentFamily-49a318e1 {
  font-size: 10px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 700;
  line-height: 1;
  letter-spacing: 1.2px;
  text-transform: uppercase;
}
.reset-3c756112--menuItem-aa02f6ec--menuItemLight-757d5235--menuItemInline-173bdf97--pageTocItem-f4427024 {
  display: -webkit-box;
  color: #74818D;
  cursor: pointer;
  margin: 0;
  display: flex;
  padding: 4px 16px;
  align-items: center;
  padding-left: 24px;
  vertical-align: middle;
  text-decoration: none;
  -webkit-box-align: center;
}
.reset-3c756112--menuItem-aa02f6ec--menuItemLight-757d5235--menuItemInline-173bdf97--pageTocItem-f4427024:hover {
  background: none;
  text-decoration: inherit;
}
.link-a079aa82--primary-53a25e66 {
  color: #3884FF;
  cursor: pointer;
  text-decoration: underline;
}
.reset-3c756112--menuItemContent-c44ec79e {
  margin: 0;
  display: block;
  padding: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.text-4505230f--UIH300-2063425d--textContentFamily-49a318e1 {
  font-size: 14px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
}
.text-4505230f--UIH200-50ead35f--textContentFamily-49a318e1 {
  font-size: 12px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
}
.text-4505230f--UIH200-50ead35f--textContentFamily-49a318e1--pageTocLinkH2-2294976c {
  font-size: 12px;
  font-family: Content-font, Roboto, sans-serif;
  font-weight: 500;
  line-height: 1.5;
  padding-left: 16px;
}
        
        
            soga 后端文档soga 后端文档功能介绍功能介绍社区版与商业版区别获取商业版授权码前端安装选择合适的前端docker 对接Docker 对接通用教程soga 配置详细说明soga - v2ray 教程SSPanel Uim 对接 v2rayV2board 对接 v2rayVNetPanel 对接 v2rayWHMCS 对接 v2rayProxyPanel 对接 v2raysoga - trojan 教程SSPanel Uim 对接 trojanV2board 对接 trojanVNetPanel 对接 trojanProxyPanel 对接 trojansoga - ss 教程V2board 对接 ssSSPanel Uim 对接 ss 单端口SSPanel Uim 对接 ss 多端口soga - ssr 教程SSPanel Uim 对接 ssr 单端口SSPanel Uim 对接 ssr 多端口ProxyPanel 对接 ssr 单端口其它相关教程审计规则配置dns规则配置中转获取真实 IP 教程增强限制用户 IP 数/设备数不使用 docker 启动多实例VMessAEAD 说明由 GitBook 提供支持SSPanel Uim 对接 v2raySSPanel Uim 安装图文教程​https://blog.sprov.xyz/2020/06/06/sspanel-uim-v2ray-trojan/​一键安装&amp;更新bash &lt;(curl -Ls https://blog.sprov.xyz/soga.sh)或者，两个都可以bash &lt;(curl -Ls https://raw.githubusercontent.com/sprov065/soga/master/install.sh)同步时间（重要）v2ray 节点需要进行时间同步，时间若与客户端相差太大则无法连接CentOS 7yum install -y ntpsystemctl enable ntpdntpdate -q 0.rhel.pool.ntp.orgsystemctl restart ntpdDebian 9 / Ubuntu 16apt-get install -y ntpsystemctl enable ntpsystemctl restart ntp第一步，配置前端节点地址假设有域名 hk.domain.com，根据具体示例开启或未开启 CDN，服务器 IP 为 1.3.5.7path 参数需以 / 开头server 参数是显示给用户连接的地址，在开启 CDN 的情况下一定要填 CDN 域名，否则将无法使用 CDNNAT 时使用 inside_port，inside_port 表示节点内部监听的端口，当 NAT 商家提供给你的外部端口和你服务器监听的内部端口不一致时使用节点地址格式：IP;用户连接的端口;alterId;(tcp或ws);(tls或不填);path=/xxx|host=xxxx.com|server=xxx.com|inside_port=xxxtcp 示例，请注意 tcp 后面有两个分号ip;12345;2;tcp;;server=域名示例：1.3.5.7;12345;2;tcp;;server=hk.domain.comtcp + tls 示例ip;12345;2;tcp;tls;server=域名|host=域名示例：1.3.5.7;12345;2;tcp;tls;server=hk.domain.com|host=hk.domain.comws 示例，若不用CDN，可以去掉host，注意ws后面有两个分号ip;80;2;ws;;path=/xxx|server=域名|host=CDN域名示例：1.3.5.7;80;2;ws;;path=/v2ray|server=hk.domain.com|host=hk.domain.comws + tls 示例，若不用CDN，可以去掉hostip;443;2;ws;tls;path=/xxx|server=域名|host=CDN域名示例：1.3.5.7;443;2;ws;tls;path=/v2ray|server=hk.domain.com|host=hk.domain.com偏移端口 ws当用户连接端口与程序监听端口不一致时使用，例如，中转机器连接端口与后端监听端口不同时ip;监听端口;2;ws;;path=/xxx|server=域名|host=CDN域名|outside_port=用户连接端口中转使用场景解释落地服务器IP;落地服务器监听端口;2;ws;;path=/xxx|server=转发服务器IP或域名|host=CDN域名|outside_port=转发服务器监听端口示例：1.3.5.7;80;2;ws;;path=/v2ray|server=hk.domain.com|host=hk.domain.com|outside_port=34567偏移端口 ws + tls当用户连接端口与程序监听端口不一致时使用，例如，中转机器连接端口与后端监听端口不同时ip;监听端口;2;ws;tls;path=/xxx|server=域名|host=CDN域名|outside_port=用户连接端口中转使用场景解释落地服务器IP;落地服务器监听端口;2;ws;tls;path=/xxx|server=转发服务器IP或域名|host=CDN域名|outside_port=转发服务器监听端口示例：1.3.5.7;443;2;ws;tls;path=/v2ray|server=hk.domain.com|host=hk.domain.com|outside_port=34567tcp 模式也是同理，这里不再举例。第二步，配置 soga配置命令：# 输出当前配置文件内容soga config​# 对配置文件进行配置，一次可填写多个，也可以调用多次soga config xxx=xxx yyy=yyy第一次安装完成后，编辑配置文件：配置文件位置在 /etc/soga/soga.conf配置文件位置在 /etc/soga/soga.conf配置文件位置在 /etc/soga/soga.conf基础配置type=sspanel-uim                             # 必填这个server_type=v2ray                            # 必填这个api=webapi                                   # webapi 或 db，表示 webapi 对接或数据库对接​# webapi 对接webapi_url=https://xxx.com/                  # webapi url，填写面板主页地址webapi_mukey=xxxx                            # webapi key​# 数据库对接db_host=db.xxx.com                           # 数据库地址db_port=3306                                 # 数据库端口db_name=name                                 # 数据库名db_user=root                                 # 数据库用户名db_password=asdasdasd                        # 数据库密码​node_id=1                                    # 节点idsoga_key=                                    # 授权key，社区版无需填写，最多支持88用户，商业版无限制user_conn_limit=0                            # 限制用户IP数，0代表无限制，默认会优先使用面板设置的限制IP数，在部分旧版面板下可能会获取不到，则使用这个值​force_close_ssl=false                        # 设为true可强制关闭tls，即使前端开启tls，soga也不会开启tls，方便用户自行使用nginx、caddy等反代​default_dns=8.8.8.8,1.1.1.1                  # 配置默认dns，可在此配置流媒体解锁的dns，以逗号分隔dns_cache_time=10                            # 自定义dns缓存时间，单位分钟，仅在设置了default_dns时有效，或者v2board设置了dns规则时也有效​v2ray_reduce_memory=false                    # VMess 下有效，在已降低内存的基础上进一步降低内存使用，启用后客户端时间误差要求不超过15秒​proxy_protocol=false                         # 具体请参看中转获取真实 IP 教程v2ray_fallback_addr=                         # v2ray fallback 地址，仅 tcp+tls 可使用v2ray_fallback_port=0                        # v2ray fallback 端口，仅 tcp+tls 可使用auto_update=false                            # soga 自动更新，只会检测稳定版​vless=false                                  # 设为 true 可切换为 VLESS 协议，目前 VLESS 协议未完全开发完成，仅供测试vless_flow=                                  # vless 流控，具体请参考 v2ray 官方文档xtls=false                                   # 设为 true 即可开启 xtls，仅支持 tcp + tls 时开启配置证书若未开启 tls，则无需配置证书soga 支持三种方式配置证书，任选其一即可① 手动指定证书路径以 / 开头的绝对路径cert_file=                                   # 手动指定证书路径key_file=                                    # 手动指定密钥路径② http 模式自动申请证书（推荐）确保服务器中没有其它程序占用 80 端口，申请和续签时需要临时使用确保域名已解析到本服务器的IP若开启CDN，则必须确保CDN不会跳转https，否则推荐dns验证cert_domain=xxx.com                          # 申请证书的域名cert_mode=http                               # 申请模式cert_key_length=ec-256                       # 留空则申请RSA证书，填写ec-256或ec-384则申请ECC证书③ dns 模式自动申请证书支持一百多种 DNS 服务商此配置方式较复杂，但最通用该页面列出了所有支持的 DNS 服务商：https://github.com/acmesh-official/acme.sh/wiki/dnsapi​CloudFlare 配置示例cert_domain=xxx.com                          # 申请证书的域名cert_mode=dns                                # 申请模式cert_key_length=ec-256                       # 留空则申请RSA证书，填写ec-256或ec-384则申请ECC证书dns_provider=dns_cf                          # DNS 提供商​DNS_CF_Email=xxx@xx.com                      # CF 邮箱DNS_CF_Key=xxxxx                             # CF API Global KeyDNSPod 配置示例cert_domain=xxx.com                          # 申请证书的域名cert_mode=dns                                # 申请模式cert_key_length=ec-256                       # 留空则申请RSA证书，填写ec-256或ec-384则申请ECC证书dns_provider=dns_dp                          # DNS 提供商​DNS_DP_Id=111                                # DNSPod 用户 idDNS_DP_Key=xxxxx                             # DNSPod API 密钥其它的 DNS 服务商都能在这个页面找到：https://github.com/acmesh-official/acme.sh/wiki/dnsapi​配置要点：搜索 DNS 提供商的名称，并找到命令中 --dns dns_xxx 的内容，这个 dns_xxx 就是你要填的再看看 DNS 提供商所需要配置的内容，区分大小写，一般都是 API 密钥之类的，注意要在 soga 配置中加上 DNS_ 前缀，防止配置冲突​第三步、启动 sogasoga start若出现启动失败的情况，使用 soga log 查看错误信息加入我们：Telegram群组​购买商业版：联系sprov​docker 对接 - 以前soga 配置详细说明下一个 - soga - v2ray 教程V2board 对接 v2ray最近更新 3 weeks ago内容SSPanel Uim 安装图文教程一键安装&amp;更新同步时间（重要）第一步，配置前端节点地址节点地址格式：tcp 示例，请注意 tcp 后面有两个分号tcp + tls 示例ws 示例，若不用CDN，可以去掉host，注意ws后面有两个分号ws + tls 示例，若不用CDN，可以去掉host偏移端口 ws偏移端口 ws + tls第二步，配置 soga基础配置配置证书第三步、启动 soga
            
            
            window.GITBOOK_STATE = {"state":{"database":{"orgs/staRR5J3ZDcvIq1tqGSgnQVrbOu1/infos":{"kind":"user","data":{"kind":"user","uid":"staRR5J3ZDcvIq1tqGSgnQVrbOu1","baseDomain":"sprov065","defaultSpace":null,"displayName":"sprov","photoURL":"https://avatars0.githubusercontent.com/u/47310637?v=4","deletedAt":null,"usageStatuses":{"members":"below","privateSpaces":"below","publicSpaces":"below"}}},"spaces/-M36NbxOl4nTuepXxBV1/infos":{"kind":"space","data":{"uid":"-M36NbxOl4nTuepXxBV1","name":"soga 后端文档","createdAt":1584966827865,"ownerID":"staRR5J3ZDcvIq1tqGSgnQVrbOu1","isPrivate":false,"isUnlisted":false,"hasJWT":null,"secretToken":null,"baseName":"soga","createdBy":"staRR5J3ZDcvIq1tqGSgnQVrbOu1","logoURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/spaces%2F-M36NbxOl4nTuepXxBV1%2Favatar-1592586612875.png?generation=1592586613157101\u0026alt=media","fullLogoURL":null,"emoji":null,"colorPrimary":"#FF4642","headerTheme":"light","font":null,"locale":"zh","primaryRevision":"-MQVt2SLycLgy-YrMHZP","edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1584966827865,"updatedAt":1610091165014,"count":137}},"algoliaAPIKey":"ZTlkZTlhZTQ2MThiMjlhZThmNmM5MWE3NWZiOTExMGYwNGEwMjc1OWQ4YmY5ZTBkMmRjYjA1MDdiYjgyODBhZmZpbHRlcnM9LU0zNk5ieE9sNG5UdWVwWHhCVjE=","customDomain":"soga.vaxilu.com","links":[],"hasGitHubSync":false,"editOnGitHub":null,"googleAnalyticsID":"UA-137403879-3","intercomID":null,"hasPageRating":true,"hasPDFExport":false,"indexedRevision":"-MQVt2SLycLgy-YrMHZP"}},"spaces/-M36NbxOl4nTuepXxBV1/revisions/-MQVt2SLycLgy-YrMHZP":{"kind":"revision","data":{"uid":"-MQVt2SLycLgy-YrMHZP","message":"","createdAt":1610091165013,"createdBy":"staRR5J3ZDcvIq1tqGSgnQVrbOu1","parents":["-MQVsoMNfRuSN8nACOqk"],"content":{"primaryVersion":"master","versions":{"master":{"index":0,"ref":"master","title":"1.0.0","github":{"repoID":"sprov065/soga","sha":"c06b06f3eb77d40b96ec6cb2c30dff5dfa763243","ref":null,"message":"GitBook: [master] 14 pages modified","isGitBookBot":true},"locale":null,"entryPage":"-M36NgARiREHBRhfB2kq","pages":{"-M36NgARiREHBRhfB2kq":{"uid":"-M36NgARiREHBRhfB2kq","kind":"document","title":"功能介绍","path":"master","href":null,"description":"soga 后端同时支持 V2ray、Trojan、Shadowsocks、ShadowsocksR 协议，支持多个面板对接，功能丰富","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQGgGk0K9X0nwPaGrP7%2Fmaster%2F-M36NgARiREHBRhfB2kq%2Fdocument.json?alt=media\u0026token=60bdc568-811b-41ff-982a-8a54115bb5dc","createdAt":1584966845148,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1585631740379,"updatedAt":1609835873241,"count":61}},"github":{"sha":"a8c86d19abfdb1d2cf22f12fe39fc4493a6540a5","filePath":"README.md"},"stats":{"words":624,"images":1,"codeLines":0,"revisions":0},"pages":["-MACLl6Hx7OiUD8PdImT","-MACUMQfrFB6u78Q4tcs","-MFVSfXTsIthcgXbM6Vr","-MACXckd5bgP9RWJQE15","-MACXfeOTuOfevDp_1Os","-MIxTTL126enJq7FuKy4","-MOEZ1z4ue-hchNEm6Vn","-MFP_dsx5tvb8XdzrGmk"]},"-MACLl6Hx7OiUD8PdImT":{"uid":"-MACLl6Hx7OiUD8PdImT","kind":"group","title":"功能介绍","path":"future","href":null,"description":"","documentURL":null,"createdAt":1592583197138,"edits":{},"github":null,"stats":null,"pages":["-MFPav3rQCXBSSqKxAf-","-MFPbN0L5xhn40V6pQuR"]},"-MFPav3rQCXBSSqKxAf-":{"uid":"-MFPav3rQCXBSSqKxAf-","kind":"document","title":"社区版与商业版区别","path":"community-edition-and-enterprise-edition","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MGudmPLNFXzt60_FFIk%2Fmaster%2F-MFPav3rQCXBSSqKxAf-%2Fdocument.json?alt=media\u0026token=8a85dcf5-bbd7-429c-a6ff-b07e72fade4e","createdAt":1598174245175,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598174344547,"updatedAt":1599785721136,"count":3}},"github":{"sha":"8ed754f34259753d8ef34cf952ce0ab4577b3a56","filePath":"future/community-edition-and-enterprise-edition.md"},"stats":{"words":127,"images":0,"codeLines":0,"revisions":0},"pages":null},"-MFPbN0L5xhn40V6pQuR":{"uid":"-MFPbN0L5xhn40V6pQuR","kind":"document","title":"获取商业版授权码","path":"get-license-code","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MOFRj1FtkxMoJPHSZ9K%2Fmaster%2F-MFPbN0L5xhn40V6pQuR%2Fdocument.json?alt=media\u0026token=63138b2c-cb4e-4632-a96b-73aac5ca18b8","createdAt":1598174363734,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598174448227,"updatedAt":1607671144107,"count":36}},"github":{"sha":"96d7b9ec31dd1bda7f3705be8d1aebc7f889e568","filePath":"future/get-license-code.md"},"stats":{"words":461,"images":0,"codeLines":1,"revisions":0},"pages":null},"-MACUMQfrFB6u78Q4tcs":{"uid":"-MACUMQfrFB6u78Q4tcs","kind":"group","title":"前端安装","path":"web-install","href":null,"description":"","documentURL":null,"createdAt":1592585451243,"edits":{},"github":null,"stats":null,"pages":["-MACUMQhA15g97xZfYA1"]},"-MACUMQhA15g97xZfYA1":{"uid":"-MACUMQhA15g97xZfYA1","kind":"document","title":"选择合适的前端","path":"select-web","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MPNeOgh4ox8nCe5eRj5%2Fmaster%2F-MACUMQhA15g97xZfYA1%2Fdocument.json?alt=media\u0026token=95481267-0c7e-4b43-8eaf-173f2e121489","createdAt":1592585451245,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1592586044539,"updatedAt":1608879074900,"count":8}},"github":{"sha":"6ee70fbb791d84a1a01fd5eda8a04bc89099d1e5","filePath":"web-install/select-web.md"},"stats":{"words":136,"images":0,"codeLines":0,"revisions":0},"pages":null},"-MFVSfXTsIthcgXbM6Vr":{"uid":"-MFVSfXTsIthcgXbM6Vr","kind":"group","title":"docker 对接","path":"docker","href":null,"description":"","documentURL":null,"createdAt":1598272485534,"edits":{},"github":null,"stats":null,"pages":["-MFPMYlpIAlFxWWCfAlW","-MLgrmAeebR5ZX-fVr-T"]},"-MFPMYlpIAlFxWWCfAlW":{"uid":"-MFPMYlpIAlFxWWCfAlW","kind":"document","title":"Docker 对接通用教程","path":"docker-tutorial","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MPPDyPz4xqfUWRHTfRR%2Fmaster%2F-MFPMYlpIAlFxWWCfAlW%2Fdocument.json?alt=media\u0026token=7ce4d001-fd92-402c-83f9-cdaef3be217b","createdAt":1598170217589,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598170747377,"updatedAt":1608905830096,"count":24}},"github":{"sha":"956c07e6739be29afcbaf4451926331ce1830abd","filePath":"docker/docker-tutorial.md"},"stats":{"words":1711,"images":0,"codeLines":94,"revisions":0},"pages":null},"-MLgrmAeebR5ZX-fVr-T":{"uid":"-MLgrmAeebR5ZX-fVr-T","kind":"document","title":"soga 配置详细说明","path":"soga-config","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MPPDyPz4xqfUWRHTfRR%2Fmaster%2F-MLgrmAeebR5ZX-fVr-T%2Fdocument.json?alt=media\u0026token=11f1a788-b93b-42a7-b160-41b87e1f5ef6","createdAt":1604923106026,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1604923142808,"updatedAt":1608905829652,"count":17}},"github":null,"stats":{"words":1249,"images":0,"codeLines":13,"revisions":0},"pages":null},"-MACXckd5bgP9RWJQE15":{"uid":"-MACXckd5bgP9RWJQE15","kind":"group","title":"soga - v2ray 教程","path":"soga-v2ray","href":null,"description":"","documentURL":null,"createdAt":1592586308649,"edits":{},"github":null,"stats":null,"pages":["-MFPQAheXmH-EFoZC--F","-MFPVS6Ew77-Nj86JIjw","-MFPY1Fz-hSmphdwuVNR","-MJgNW-ZEXs4qgxnV_6U","-MKtOheYP08mYjUra4YU"]},"-MFPQAheXmH-EFoZC--F":{"uid":"-MFPQAheXmH-EFoZC--F","kind":"document","title":"SSPanel Uim 对接 v2ray","path":"sspanel-v2ray","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MOoDCemjIkdeqzevuDr%2Fmaster%2F-MFPQAheXmH-EFoZC--F%2Fdocument.json?alt=media\u0026token=0e50c82f-f198-4512-a11a-846aabe98e30","createdAt":1598171167594,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598172077786,"updatedAt":1608268279681,"count":11}},"github":{"sha":"f9afcd057c29f27814c285c52ccd9ee1658a4766","filePath":"soga-v2ray/sspanel-v2ray.md"},"stats":{"words":782,"images":0,"codeLines":83,"revisions":0},"pages":null},"-MFPVS6Ew77-Nj86JIjw":{"uid":"-MFPVS6Ew77-Nj86JIjw","kind":"document","title":"V2board 对接 v2ray","path":"v2board-v2ray","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MFPVS6Ew77-Nj86JIjw%2Fdocument.json?alt=media\u0026token=9d5789f8-1ad8-4fb0-a9e6-962556e12209","createdAt":1598172549583,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598172913739,"updatedAt":1609600044359,"count":10}},"github":{"sha":"0d73b1f114a852ecc2ac5d33924d31212e2d45d0","filePath":"soga-v2ray/v2board-v2ray.md"},"stats":{"words":483,"images":0,"codeLines":69,"revisions":0},"pages":null},"-MFPY1Fz-hSmphdwuVNR":{"uid":"-MFPY1Fz-hSmphdwuVNR","kind":"document","title":"VNetPanel 对接 v2ray","path":"vnetpanel-v2ray","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MFPY1Fz-hSmphdwuVNR%2Fdocument.json?alt=media\u0026token=c7754f52-fed7-498a-b06b-f5de90733d91","createdAt":1598173226047,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598173576170,"updatedAt":1609600042693,"count":10}},"github":{"sha":"71794a866071ce21ae6b29ac191a216d560957af","filePath":"soga-v2ray/vnetpanel-v2ray.md"},"stats":{"words":471,"images":0,"codeLines":61,"revisions":0},"pages":null},"-MJgNW-ZEXs4qgxnV_6U":{"uid":"-MJgNW-ZEXs4qgxnV_6U","kind":"document","title":"WHMCS 对接 v2ray","path":"whmcs-v2ray","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MJgNW-ZEXs4qgxnV_6U%2Fdocument.json?alt=media\u0026token=ae14958e-15ca-4305-bb12-a291dd792b04","createdAt":1602767425572,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1602767737691,"updatedAt":1609600042929,"count":6}},"github":null,"stats":{"words":473,"images":0,"codeLines":68,"revisions":0},"pages":null},"-MKtOheYP08mYjUra4YU":{"uid":"-MKtOheYP08mYjUra4YU","kind":"document","title":"ProxyPanel 对接 v2ray","path":"proxypanel-v2ray","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MKtOheYP08mYjUra4YU%2Fdocument.json?alt=media\u0026token=573b96b9-c264-4744-a22f-74b9455c3332","createdAt":1604059585187,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1604059678691,"updatedAt":1609600044980,"count":6}},"github":null,"stats":{"words":467,"images":0,"codeLines":60,"revisions":0},"pages":null},"-MACXfeOTuOfevDp_1Os":{"uid":"-MACXfeOTuOfevDp_1Os","kind":"group","title":"soga - trojan 教程","path":"soga-trojan","href":null,"description":"","documentURL":null,"createdAt":1592586320537,"edits":{},"github":null,"stats":null,"pages":["-MFPU8uCnEKYZEMSvdsr","-MFPX3kwVRN7pL3S2Stx","-MFPZTu1SjuL8r3XS8yt","-MKtP48MxZ0XafSQrmw2"]},"-MFPU8uCnEKYZEMSvdsr":{"uid":"-MFPU8uCnEKYZEMSvdsr","kind":"document","title":"SSPanel Uim 对接 trojan","path":"sspanel-trojan","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MOoDCemjIkdeqzevuDr%2Fmaster%2F-MFPU8uCnEKYZEMSvdsr%2Fdocument.json?alt=media\u0026token=667e4956-0dd3-4f87-8cb6-e0fab46d0160","createdAt":1598172208781,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598172443251,"updatedAt":1608268275476,"count":12}},"github":{"sha":"6309ed93dbbcc29d01459d321ab97167fac3c78a","filePath":"soga-trojan/sspanel-trojan.md"},"stats":{"words":502,"images":0,"codeLines":57,"revisions":0},"pages":null},"-MFPX3kwVRN7pL3S2Stx":{"uid":"-MFPX3kwVRN7pL3S2Stx","kind":"document","title":"V2board 对接 trojan","path":"v2board-trojan","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MFPX3kwVRN7pL3S2Stx%2Fdocument.json?alt=media\u0026token=9e2c8cb5-41ad-48fa-9a0f-c806c7a06926","createdAt":1598172974140,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598173196810,"updatedAt":1609600042987,"count":9}},"github":{"sha":"dc19a5a68ddbe4124d54e3681b7f124fc2eb3d49","filePath":"soga-trojan/v2board-trojan.md"},"stats":{"words":446,"images":0,"codeLines":55,"revisions":0},"pages":null},"-MFPZTu1SjuL8r3XS8yt":{"uid":"-MFPZTu1SjuL8r3XS8yt","kind":"document","title":"VNetPanel 对接 trojan","path":"vnetpanel-trojan","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MFPZTu1SjuL8r3XS8yt%2Fdocument.json?alt=media\u0026token=50a09140-cee8-46fe-bb33-8264f4e5b1c4","createdAt":1598173605507,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598173820540,"updatedAt":1609600044998,"count":9}},"github":{"sha":"715602fafa7d9338e53b7e444aa04cde6c6dc854","filePath":"soga-trojan/vnetpanel-trojan.md"},"stats":{"words":430,"images":0,"codeLines":53,"revisions":0},"pages":null},"-MKtP48MxZ0XafSQrmw2":{"uid":"-MKtP48MxZ0XafSQrmw2","kind":"document","title":"ProxyPanel 对接 trojan","path":"proxypanel-trojan","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2cGnlfBB7Yfxr1DFk%2Fmaster%2F-MKtP48MxZ0XafSQrmw2%2Fdocument.json?alt=media\u0026token=13bd22d3-a915-4a48-af15-8758ca3abaaf","createdAt":1604059681367,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1604059732154,"updatedAt":1609600045878,"count":5}},"github":null,"stats":{"words":430,"images":0,"codeLines":46,"revisions":0},"pages":null},"-MIxTTL126enJq7FuKy4":{"uid":"-MIxTTL126enJq7FuKy4","kind":"group","title":"soga - ss 教程","path":"soga-ss","href":null,"description":"","documentURL":null,"createdAt":1601980458371,"edits":{},"github":null,"stats":null,"pages":["-MIxTTL3EhcGK94piwBQ","-MQVsS9Y2WNuFH2dT_mH","-MQVspLpCbxAOJa5GSkF"]},"-MIxTTL3EhcGK94piwBQ":{"uid":"-MIxTTL3EhcGK94piwBQ","kind":"document","title":"V2board 对接 ss","path":"v2board-ss","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2Soy2piTseuOxLH52%2Fmaster%2F-MIxTTL3EhcGK94piwBQ%2Fdocument.json?alt=media\u0026token=1b6eac13-c9e0-4860-a4c5-3a6ede0ecbbc","createdAt":1601980458372,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1601980641173,"updatedAt":1609598000996,"count":5}},"github":null,"stats":{"words":147,"images":0,"codeLines":25,"revisions":0},"pages":null},"-MQVsS9Y2WNuFH2dT_mH":{"uid":"-MQVsS9Y2WNuFH2dT_mH","kind":"document","title":"SSPanel Uim 对接 ss 单端口","path":"sspanel-ss-single-port","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQVsPfgT5g95YbKGbKw%2Fmaster%2F-MQVsS9Y2WNuFH2dT_mH%2Fdocument.json?alt=media\u0026token=9140a8ca-326d-4fe0-b2e1-545c03196cb3","createdAt":1610090664611,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1610090753303,"updatedAt":1610090753303,"count":1}},"github":null,"stats":{"words":20,"images":0,"codeLines":0,"revisions":0},"pages":null},"-MQVspLpCbxAOJa5GSkF":{"uid":"-MQVspLpCbxAOJa5GSkF","kind":"document","title":"SSPanel Uim 对接 ss 多端口","path":"sspanel-ss-multi-port","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQVsoMNfRuSN8nACOqk%2Fmaster%2F-MQVspLpCbxAOJa5GSkF%2Fdocument.json?alt=media\u0026token=64e37460-09b2-4950-bd35-af30cc9c2140","createdAt":1610090763701,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1610090819177,"updatedAt":1610090819177,"count":1}},"github":null,"stats":{"words":20,"images":0,"codeLines":0,"revisions":0},"pages":null},"-MOEZ1z4ue-hchNEm6Vn":{"uid":"-MOEZ1z4ue-hchNEm6Vn","kind":"group","title":"soga - ssr 教程","path":"soga-ssr","href":null,"description":"","documentURL":null,"createdAt":1607652618181,"edits":{},"github":null,"stats":null,"pages":["-MOEZ1z6-hs6y0Fz8MjE","-MQ2T1B-9R57uZjCL_D-","-MQ2V8NgsYY80LjQOMmZ"]},"-MOEZ1z6-hs6y0Fz8MjE":{"uid":"-MOEZ1z6-hs6y0Fz8MjE","kind":"document","title":"SSPanel Uim 对接 ssr 单端口","path":"sspanel-ssr-single-port","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQGhNryz6CMk5zxFTbX%2Fmaster%2F-MOEZ1z6-hs6y0Fz8MjE%2Fdocument.json?alt=media\u0026token=4d008b9a-16b0-4f65-a0ab-cb96f5e3621d","createdAt":1607652618183,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1607653869371,"updatedAt":1609836183467,"count":12}},"github":null,"stats":{"words":387,"images":6,"codeLines":36,"revisions":0},"pages":null},"-MQ2T1B-9R57uZjCL_D-":{"uid":"-MQ2T1B-9R57uZjCL_D-","kind":"document","title":"SSPanel Uim 对接 ssr 多端口","path":"sspanel-ssr-multi-port","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2Soy2piTseuOxLH52%2Fmaster%2F-MQ2T1B-9R57uZjCL_D-%2Fdocument.json?alt=media\u0026token=46e787b3-cdfa-4664-86f7-a98e0705f372","createdAt":1609597199104,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1609598001089,"updatedAt":1609598001089,"count":1}},"github":null,"stats":{"words":148,"images":0,"codeLines":33,"revisions":0},"pages":null},"-MQ2V8NgsYY80LjQOMmZ":{"uid":"-MQ2V8NgsYY80LjQOMmZ","kind":"document","title":"ProxyPanel 对接 ssr 单端口","path":"proxypanel-ssr-single-port","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2Soy2piTseuOxLH52%2Fmaster%2F-MQ2V8NgsYY80LjQOMmZ%2Fdocument.json?alt=media\u0026token=d8245bad-75af-4599-9f72-df57c4c2d5ec","createdAt":1609597752876,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1609598002747,"updatedAt":1609598002747,"count":1}},"github":null,"stats":{"words":132,"images":0,"codeLines":32,"revisions":0},"pages":null},"-MFP_dsx5tvb8XdzrGmk":{"uid":"-MFP_dsx5tvb8XdzrGmk","kind":"group","title":"其它相关教程","path":"other-tutorial","href":null,"description":"","documentURL":null,"createdAt":1598173912637,"edits":{},"github":null,"stats":null,"pages":["-MJMebtCVHX9Phu27LPQ","-MJeIk7McRlvXDA7CnTS","-MFPaGHK765zEK7ckKjw","-MPNgsWYDpwZkIDuyV_6","-MFP_dsyreEmNKvYDBFV","-MH6UyTMpHwQUU9WLDwi"]},"-MJMebtCVHX9Phu27LPQ":{"uid":"-MJMebtCVHX9Phu27LPQ","kind":"document","title":"审计规则配置","path":"block-list-config","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2Yc_R4QuYZpPElQZJ%2Fmaster%2F-MJMebtCVHX9Phu27LPQ%2Fdocument.json?alt=media\u0026token=ba042bdd-069c-436d-9363-d5e0dc6da26d","createdAt":1602419850829,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1602420185285,"updatedAt":1609599357649,"count":6}},"github":null,"stats":{"words":521,"images":0,"codeLines":10,"revisions":0},"pages":null},"-MJeIk7McRlvXDA7CnTS":{"uid":"-MJeIk7McRlvXDA7CnTS","kind":"document","title":"dns规则配置","path":"dns-config","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQ2Yc_R4QuYZpPElQZJ%2Fmaster%2F-MJeIk7McRlvXDA7CnTS%2Fdocument.json?alt=media\u0026token=d36f2b1d-1873-454d-a7ee-6d779430cae0","createdAt":1602732622359,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1602732772496,"updatedAt":1609599357674,"count":14}},"github":null,"stats":{"words":145,"images":0,"codeLines":23,"revisions":0},"pages":null},"-MFPaGHK765zEK7ckKjw":{"uid":"-MFPaGHK765zEK7ckKjw","kind":"document","title":"中转获取真实 IP 教程","path":"forward-get-real-ip","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MQP2K2955LMSpyN5E4Q%2Fmaster%2F-MFPaGHK765zEK7ckKjw%2Fdocument.json?alt=media\u0026token=ec22650a-1189-494c-8531-34e4fb9e29be","createdAt":1598174074005,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598174201457,"updatedAt":1609976114741,"count":13}},"github":{"sha":"99f1424d07bf2422115b07197e7ba3d6d4c68dcc","filePath":"other-tutorial/forward-get-real-ip.md"},"stats":{"words":137,"images":0,"codeLines":37,"revisions":0},"pages":null},"-MPNgsWYDpwZkIDuyV_6":{"uid":"-MPNgsWYDpwZkIDuyV_6","kind":"document","title":"增强限制用户 IP 数/设备数","path":"limit-ip-and-device_num","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MPOQo2rXJa5cyX7sdaa%2Fmaster%2F-MPNgsWYDpwZkIDuyV_6%2Fdocument.json?alt=media\u0026token=33db9e64-38c1-4207-88ea-a5aff897557f","createdAt":1608879671395,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1608880349594,"updatedAt":1608892071409,"count":18}},"github":null,"stats":{"words":557,"images":0,"codeLines":41,"revisions":0},"pages":null},"-MFP_dsyreEmNKvYDBFV":{"uid":"-MFP_dsyreEmNKvYDBFV","kind":"document","title":"不使用 docker 启动多实例","path":"soga-multi-instance","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MPNj8ORvkcoGSoNNh0f%2Fmaster%2F-MFP_dsyreEmNKvYDBFV%2Fdocument.json?alt=media\u0026token=241347ba-5ed4-4963-923f-b0fb772a7105","createdAt":1598173912638,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1598174043225,"updatedAt":1608880351158,"count":4}},"github":{"sha":"197e58479ba69034ef640044e586f6d275a437ab","filePath":"other-tutorial/soga-multi-instance.md"},"stats":{"words":305,"images":0,"codeLines":16,"revisions":0},"pages":null},"-MH6UyTMpHwQUU9WLDwi":{"uid":"-MH6UyTMpHwQUU9WLDwi","kind":"document","title":"VMessAEAD 说明","path":"vmess-aead","href":null,"description":"","documentURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MMQpqfOocqcSKVZlXt4%2Fmaster%2F-MH6UyTMpHwQUU9WLDwi%2Fdocument.json?alt=media\u0026token=d9b4b146-9904-460a-83bc-d6eb52f67a4e","createdAt":1600001140631,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1600001763807,"updatedAt":1605788309258,"count":8}},"github":null,"stats":{"words":367,"images":1,"codeLines":1,"revisions":0},"pages":null}}}},"assets":{"-MH6WGfJXI23bLu5NBVD":{"uid":"-MH6WGfJXI23bLu5NBVD","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MH6Usvy7_9U6OxhdDQs%2F-MH6WGfJXI23bLu5NBVD%2Fimage.png?alt=media\u0026token=26635a54-6ac1-4741-9564-904a3c51ec0c","size":31637,"contentType":"image/png","createdAt":1600001481725,"github":null,"edits":{}},"-MOEbXz6dyE69DIqGenq":{"uid":"-MOEbXz6dyE69DIqGenq","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEYxqQ4vupb5Cu4W69%2F-MOEbXz6dyE69DIqGenq%2Fimage.png?alt=media\u0026token=f0e4d976-1aeb-4fad-8ddd-b625e230117b","size":46052,"contentType":"image/png","createdAt":1607653536945,"github":null,"edits":{}},"-MKtObec33sxy2W1zVyO":{"uid":"-MKtObec33sxy2W1zVyO","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MKtOCHWR4Jxv9fx_1OY%2F-MKtObec33sxy2W1zVyO%2Fimage.png?alt=media\u0026token=b812b9a7-9c27-489b-bce1-23322934fdbb","size":13826,"contentType":"image/png","createdAt":1604059560538,"github":null,"edits":{}},"-MQ2cDlSBBKHBU5FYkhp":{"uid":"-MQ2cDlSBBKHBU5FYkhp","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MQ2aGGoJ-1mE-evvXAh%2F-MQ2cDlSBBKHBU5FYkhp%2Fimage.png?alt=media\u0026token=f420759a-f874-4ba2-b547-2828d1983ec1","size":14408,"contentType":"image/png","createdAt":1609599872851,"github":null,"edits":{}},"-MH6WH-yMsspZ0vgdygb":{"uid":"-MH6WH-yMsspZ0vgdygb","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MH6Usvy7_9U6OxhdDQs%2F-MH6WH-yMsspZ0vgdygb%2Fimage.png?alt=media\u0026token=08aada52-b8bc-4cca-872b-e4a18076dbfc","size":31637,"contentType":"image/png","createdAt":1600001482748,"github":null,"edits":{}},"-MNv2n0S4Wv8eKsCIrx4":{"uid":"-MNv2n0S4Wv8eKsCIrx4","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MNv2WDNkagR-aYGcyN3%2F-MNv2n0S4Wv8eKsCIrx4%2Fimage.png?alt=media\u0026token=e141ed86-ac4e-4da0-8f1e-398dc5fe7bea","size":14222,"contentType":"image/png","createdAt":1607308620870,"github":null,"edits":{}},"-MOEiHcFKySfj8LzPB44":{"uid":"-MOEiHcFKySfj8LzPB44","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEcoYUWhRQXTNuMNee%2F-MOEiHcFKySfj8LzPB44%2Fimage.png?alt=media\u0026token=8b5de146-295e-4c19-b897-3b7be57e46b0","size":22529,"contentType":"image/png","createdAt":1607655304589,"github":null,"edits":{}},"-MOH1u1oSVvHbl2lyZBt":{"uid":"-MOH1u1oSVvHbl2lyZBt","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOH1ZcDyjkDTq3rTPXO%2F-MOH1u1oSVvHbl2lyZBt%2Fimage.png?alt=media\u0026token=4fa49b36-62d8-4d6b-82b4-10b6dcbffde8","size":14337,"contentType":"image/png","createdAt":1607694262105,"github":null,"edits":{}},"-MJbJnhB1KOjykM7XEb8":{"uid":"-MJbJnhB1KOjykM7XEb8","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MJbJ1EMWiyEhHg1kU83%2F-MJbJnhB1KOjykM7XEb8%2Fimage.png?alt=media\u0026token=603bd66c-edd1-44bb-84c7-d67f23dbd15f","size":3611,"contentType":"image/png","createdAt":1602682567975,"github":null,"edits":{}},"-MOEi-xVfe0QcTXs3uLT":{"uid":"-MOEi-xVfe0QcTXs3uLT","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEcoYUWhRQXTNuMNee%2F-MOEi-xVfe0QcTXs3uLT%2Fimage.png?alt=media\u0026token=d9ecc453-0349-45b7-85c1-437222229c55","size":7186,"contentType":"image/png","createdAt":1607655232181,"github":null,"edits":{}},"-MJgh64Ot7ywsM549FGJ":{"uid":"-MJgh64Ot7ywsM549FGJ","name":"对接对照表.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MJggUESFE05lb28tg-D%2F-MJgh64Ot7ywsM549FGJ%2F%E5%AF%B9%E6%8E%A5%E5%AF%B9%E7%85%A7%E8%A1%A8.png?alt=media\u0026token=35f9dda5-2038-4f37-9b6b-c6b2ecae6b08","size":12348,"contentType":"image/png","createdAt":1602772824588,"github":null,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1602772826045,"updatedAt":1602772826045,"count":1}}},"-MOEc4PY-Hm-_OeyXNLY":{"uid":"-MOEc4PY-Hm-_OeyXNLY","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEYxqQ4vupb5Cu4W69%2F-MOEc4PY-Hm-_OeyXNLY%2Fimage.png?alt=media\u0026token=f41baf3e-68f7-4bf3-9dfc-fdae7f07644a","size":23451,"contentType":"image/png","createdAt":1607653677891,"github":null,"edits":{}},"-MOEibgyP677B1nlIGWY":{"uid":"-MOEibgyP677B1nlIGWY","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEcoYUWhRQXTNuMNee%2F-MOEibgyP677B1nlIGWY%2Fimage.png?alt=media\u0026token=d61336c1-7a74-4a36-bf42-7573027f9f0d","size":12435,"contentType":"image/png","createdAt":1607655391167,"github":null,"edits":{}},"-MJbLzYfu-UHhh3-KJs4":{"uid":"-MJbLzYfu-UHhh3-KJs4","name":"前端对接方式对照表.jpg","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MJbJ1EMWiyEhHg1kU83%2F-MJbLzYfu-UHhh3-KJs4%2F%E5%89%8D%E7%AB%AF%E5%AF%B9%E6%8E%A5%E6%96%B9%E5%BC%8F%E5%AF%B9%E7%85%A7%E8%A1%A8.jpg?alt=media\u0026token=443d5f9f-acb7-41f1-8565-ab84c1a84d67","size":51991,"contentType":"image/jpeg","createdAt":1602683141112,"github":null,"edits":{"staRR5J3ZDcvIq1tqGSgnQVrbOu1":{"createdAt":1602683142017,"updatedAt":1602683142017,"count":1}}},"-MOEaZ5q6F31Xg1Bj3sM":{"uid":"-MOEaZ5q6F31Xg1Bj3sM","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEYxqQ4vupb5Cu4W69%2F-MOEaZ5q6F31Xg1Bj3sM%2Fimage.png?alt=media\u0026token=d2745ced-099f-4ca3-bd97-461634476755","size":45314,"contentType":"image/png","createdAt":1607653279379,"github":null,"edits":{}},"-MOEi-jVxXKlr4vLBEsO":{"uid":"-MOEi-jVxXKlr4vLBEsO","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEcoYUWhRQXTNuMNee%2F-MOEi-jVxXKlr4vLBEsO%2Fimage.png?alt=media\u0026token=bef75c7d-8b19-42f8-8bca-dd77ef61c714","size":7186,"contentType":"image/png","createdAt":1607655231577,"github":null,"edits":{}},"-MOEckEDhVFgJNvgeYOy":{"uid":"-MOEckEDhVFgJNvgeYOy","name":"image.png","downloadURL":"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-M36NbxOl4nTuepXxBV1%2F-MOEYxqQ4vupb5Cu4W69%2F-MOEckEDhVFgJNvgeYOy%2Fimage.png?alt=media\u0026token=67d84427-42d6-47ad-ba4f-45a3559e4a97","size":24213,"contentType":"image/png","createdAt":1607653853230,"github":null,"edits":{}}}},"github":[],"rollbackOf":null}}},"documents":{"documents":{"https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/documents%2F-M36NbxOl4nTuepXxBV1%2F-MOoDCemjIkdeqzevuDr%2Fmaster%2F-MFPQAheXmH-EFoZC--F%2Fdocument.json?alt=media\u0026token=0e50c82f-f198-4512-a11a-846aabe98e30":{"format_version":1,"document":{"kind":"document","key":"373f8fb2484a4f5f87260f7ea9168252","data":{"schema_version":6},"nodes":[{"kind":"block","type":"heading-1","key":"65709c2476ae4a24be644f1bc599fd18","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f3344523168a4f8fb1e1685ae9c293bb","ranges":[{"kind":"range","marks":[],"text":"SSPanel Uim 安装图文教程"}]}]},{"kind":"block","type":"paragraph","key":"f824a3359ac24b109da3ea54666e1db2","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"181ae279bc184ff790bc8bec3da839ea","ranges":[{"kind":"range","marks":[],"text":""}]},{"kind":"inline","type":"link","key":"9c4a464d7d204606ae4ba304acdada9f","isVoid":false,"data":{"href":"https://blog.sprov.xyz/2020/06/06/sspanel-uim-v2ray-trojan/"},"nodes":[{"kind":"text","key":"c115f86973ff43f3b93831ab70f5786d","ranges":[{"kind":"range","marks":[],"text":"https://blog.sprov.xyz/2020/06/06/sspanel-uim-v2ray-trojan/"}]}]},{"kind":"text","key":"a0a7fd125ea9413094b773e651ca3ccd","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"heading-1","key":"8a3ef6aecfc84b50a8fa44df88eb4897","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"89d3a2d79c054ed9bb6b2c57edcf1f85","ranges":[{"kind":"range","marks":[],"text":"一键安装\u0026更新"}]}]},{"kind":"block","type":"code","key":"57325b3faee3411f822b60631e03daa1","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"c370aa0381c34fdb97bfb7ac60c4094e","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"220fb41af74846ba9c4006c7b3c761fc","ranges":[{"kind":"range","marks":[],"text":"bash \u003c(curl -Ls https://blog.sprov.xyz/soga.sh)"}]}]}]},{"kind":"block","type":"paragraph","key":"82166a680b35428aac36d93c668128d1","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"5ebdcb35e2044bd9a547bb60d0d1c967","ranges":[{"kind":"range","marks":[],"text":"或者，两个都可以"}]}]},{"kind":"block","type":"code","key":"8ec8ef877d074965b8239481d1990485","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"6ffee94c3f33449e859d73158683996c","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"a45808262a6148cfa136f9d8bc251c56","ranges":[{"kind":"range","marks":[],"text":"bash \u003c(curl -Ls https://raw.githubusercontent.com/sprov065/soga/master/install.sh)"}]}]}]},{"kind":"block","type":"heading-1","key":"5b455818c65a4e6a8dccb49061e2934b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"bd65f7a5c2904ff28865a10b97febea4","ranges":[{"kind":"range","marks":[],"text":"同步时间（重要）"}]}]},{"kind":"block","type":"blockquote","key":"90ce3c9952d94e5e9a80539976ac4441","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"9fe2f02f3a24454181e17d34053e3846","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"c471210226c849119f3c4bed8bcc42d3","ranges":[{"kind":"range","marks":[],"text":"v2ray 节点需要进行时间同步，时间若与客户端相差太大则无法连接"}]}]}]},{"kind":"block","type":"paragraph","key":"4bc52a8a0afb407d8a6b4763e45b5262","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"ae07192f94ec44afae020098dce5b853","ranges":[{"kind":"range","marks":[],"text":"CentOS 7"}]}]},{"kind":"block","type":"code","key":"b5160473023f46d0bd27736f66be9bd1","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"7c52151f3453440ba73d914b81639364","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"e10963d88a5f49908336715bdec130a7","ranges":[{"kind":"range","marks":[],"text":"yum install -y ntp"}]}]},{"kind":"block","type":"code-line","key":"cf9f5e53457040c9bc1148812b448501","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"dab5de8081504fd684ff51c203714231","ranges":[{"kind":"range","marks":[],"text":"systemctl enable ntpd"}]}]},{"kind":"block","type":"code-line","key":"dcc1365ce52646b1a91146efa4c54e3f","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f12500cba3d244bca2858030b56a193f","ranges":[{"kind":"range","marks":[],"text":"ntpdate -q 0.rhel.pool.ntp.org"}]}]},{"kind":"block","type":"code-line","key":"a7ba3da186db40adadd6cc4592921c68","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"47f2bfec078a465a8900fce14a963af1","ranges":[{"kind":"range","marks":[],"text":"systemctl restart ntpd"}]}]}]},{"kind":"block","type":"paragraph","key":"0db2918478604e0ca9ac6e5187d2ab5b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"2e18f6ece0364a9e8504f720774487db","ranges":[{"kind":"range","marks":[],"text":"Debian 9 / Ubuntu 16"}]}]},{"kind":"block","type":"code","key":"b42eaae09906404a84071bc21f987e37","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"e8e2538d2c574075953a52dfe8d3c022","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"817b541a14304a08af1ce9e3c6e58135","ranges":[{"kind":"range","marks":[],"text":"apt-get install -y ntp"}]}]},{"kind":"block","type":"code-line","key":"d819972e46e64095b3026590a6e8a230","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"b62d236434db4c6a8488acb07ebf765d","ranges":[{"kind":"range","marks":[],"text":"systemctl enable ntp"}]}]},{"kind":"block","type":"code-line","key":"0ca2c0931246440c98410dd9eaafbd23","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"54a7619ed80246f2a935361bc6e4df6a","ranges":[{"kind":"range","marks":[],"text":"systemctl restart ntp"}]}]}]},{"kind":"block","type":"heading-1","key":"fb0427ad901f4dc995410e9a843e7cdf","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"2e6b5ec8df414caa866aab95f7a9c474","ranges":[{"kind":"range","marks":[],"text":"第一步，配置前端节点地址"}]}]},{"kind":"block","type":"list-unordered","key":"5f705d98af5d47b596af06bf07365ba0","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"list-item","key":"0a634878ccfa4f55a94ae5503e7b9fb9","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"2c23879833bf4ac4b2632b41d12b33e2","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"8be77e0c8bdd4990a22a1779db1fad63","ranges":[{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"假设有域名 hk.domain.com，根据具体示例开启或未开启 CDN，服务器 IP 为 1.3.5.7"}]}]}]},{"kind":"block","type":"list-item","key":"d8dcba88b067447ba99071b4a44ef2f3","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"f49e2beb8610488f8492fe2f9bfb792c","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"7b0de183928747228f70c09c345caaf0","ranges":[{"kind":"range","marks":[],"text":"path 参数需以 / 开头"}]}]}]},{"kind":"block","type":"list-item","key":"38a0a34b36e4469aa11b86683d387ebb","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"5187bcf72dd04e16acc74a054bbecc18","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"877edc57ae9f4e44b9f12d5fb4a48597","ranges":[{"kind":"range","marks":[],"text":"server 参数是显示给用户连接的地址，在开启 CDN 的情况下一定要填 CDN 域名，否则将无法使用 CDN"}]}]}]},{"kind":"block","type":"list-item","key":"a45e0bda243444d0afaf7fa38764a309","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"f65200fcbc3144bf9c26652b53372268","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"416a33db774249fdb9cfb5dcbdfc20f3","ranges":[{"kind":"range","marks":[],"text":"NAT 时使用 inside_port，inside_port 表示节点内部监听的端口，当 NAT 商家提供给你的外部端口和你服务器监听的内部端口不一致时使用"}]}]}]}]},{"kind":"block","type":"heading-2","key":"06f2c54e392d4893b665187ec1ab3fea","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f4a7a218576044eca6b764a49310e702","ranges":[{"kind":"range","marks":[],"text":"节点地址格式："}]}]},{"kind":"block","type":"code","key":"2c9e36bfaa9049f7922d341266fb9cab","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"ecc7043e730541c990d9d63a1e96bdb3","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"0c9cdbf147d0471fb6a8d5b606e9b792","ranges":[{"kind":"range","marks":[],"text":"IP;用户连接的端口;alterId;(tcp或ws);(tls或不填);path=/xxx|host=xxxx.com|server=xxx.com|inside_port=xxx"}]}]}]},{"kind":"block","type":"heading-2","key":"80333ac6ae6641e9974bc7b4294c87c7","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"38ca10ceb26a43ca901f1f0639550bae","ranges":[{"kind":"range","marks":[],"text":"tcp 示例，请注意 tcp 后面有两个分号"}]}]},{"kind":"block","type":"code","key":"9a6e5d8130d148a5bed4e6ca201128e1","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"d6377f32f57c4385a83e4e945f086718","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"12dd9fbabffe4fe2a7ddb4bd5090fe6d","ranges":[{"kind":"range","marks":[],"text":"ip;12345;2;tcp;;server=域名"}]}]}]},{"kind":"block","type":"code","key":"f225545e029542d4a8ff1a7425e86aec","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"f62d4d855fad484390093fdfc90440ec","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"3d7eea1c1b494e38808f8e8935d05e49","ranges":[{"kind":"range","marks":[],"text":"示例：1.3.5.7;12345;2;tcp;;server=hk.domain.com"}]}]}]},{"kind":"block","type":"heading-2","key":"89f2c21020f4447e9384611975915ee3","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"984af2f0351d4210ac6f0d6b5bffeba0","ranges":[{"kind":"range","marks":[],"text":"tcp + tls 示例"}]}]},{"kind":"block","type":"code","key":"73701f6f65df4d80a2e65c24d9dab3f6","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"d10cefb616ce498892fae78cbc695186","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"d55a61f2d9834ff2af0d5073bd4deb58","ranges":[{"kind":"range","marks":[],"text":"ip;12345;2;tcp;tls;server=域名|host=域名"}]}]}]},{"kind":"block","type":"code","key":"c66e05b3ca664e98b0166f7e2a08e4f1","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"9065fe70b2024c929294760a56faf7fc","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"aabaee544c974c8abdc7bd530b3fb501","ranges":[{"kind":"range","marks":[],"text":"示例：1.3.5.7;12345;2;tcp;tls;server=hk.domain.com|host=hk.domain.com"}]}]}]},{"kind":"block","type":"heading-2","key":"feca3a6a353e4e6e845fbd4a49c5efae","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"7348e41be0244e53b7cd48134036fe42","ranges":[{"kind":"range","marks":[],"text":"ws 示例，若不用CDN，可以去掉host，注意ws后面有两个分号"}]}]},{"kind":"block","type":"code","key":"a8fddb7e5049498d89f4b2068666a865","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"da032b7d9bd347a2976fd92fa2e3f673","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"0b2acb4c3af2494b908781126d83f59b","ranges":[{"kind":"range","marks":[],"text":"ip;80;2;ws;;path=/xxx|server=域名|host=CDN域名"}]}]}]},{"kind":"block","type":"code","key":"3b3c3f8962a64b6484ac42a76f2a2423","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"149b20fbc3f04e68a35863449437d509","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"92380df53c7c4e3ea1d06a520cc89de1","ranges":[{"kind":"range","marks":[],"text":"示例：1.3.5.7;80;2;ws;;path=/v2ray|server=hk.domain.com|host=hk.domain.com"}]}]}]},{"kind":"block","type":"heading-2","key":"970d128a91614e999d45a908d240e749","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"ccc9bdf647e3420586dc7f7bca3eb430","ranges":[{"kind":"range","marks":[],"text":"ws + tls 示例，若不用CDN，可以去掉host"}]}]},{"kind":"block","type":"code","key":"5f34d648853b49929507a92e61befb2a","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"49af838cdf6d4b6cbac3e644e85c42b2","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"a69afab3f033486eafa8890f048dd982","ranges":[{"kind":"range","marks":[],"text":"ip;443;2;ws;tls;path=/xxx|server=域名|host=CDN域名"}]}]}]},{"kind":"block","type":"code","key":"2052f4efaeda4aaf8e0d1414a88e6728","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"c799775272c2475890d70b2e3cc1c8c0","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"69ca2429f4fd438889b9f76af823792f","ranges":[{"kind":"range","marks":[],"text":"示例：1.3.5.7;443;2;ws;tls;path=/v2ray|server=hk.domain.com|host=hk.domain.com"}]}]}]},{"kind":"block","type":"heading-2","key":"6a33de2f174141049d5c25fbc1cab53b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"c186a3b1abe2441f97672a32a2523e03","ranges":[{"kind":"range","marks":[],"text":"偏移端口 ws"}]}]},{"kind":"block","type":"blockquote","key":"8ff7526459b94d138495992a1df838ae","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"bc5fb781a6044eafa8bdca51aea6bdd3","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"bfdf13e0833f411f80fbc483d742adc8","ranges":[{"kind":"range","marks":[],"text":"当用户连接端口与程序监听端口不一致时使用，例如，中转机器连接端口与后端监听端口不同时"}]}]}]},{"kind":"block","type":"code","key":"ea9b63619f6546b1a1b3c3851914d530","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"43b13c76dfa24be69b1238504b5382e3","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"2a3b72f612a149fbb32f389aae2eee40","ranges":[{"kind":"range","marks":[],"text":"ip;监听端口;2;ws;;path=/xxx|server=域名|host=CDN域名|outside_port=用户连接端口"}]}]}]},{"kind":"block","type":"blockquote","key":"ffa0be8124e141b898b6e25801af2f84","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"b973429587884081b6a8c06ddb843011","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"3091705533bb48cfbde61a4ff3c8a940","ranges":[{"kind":"range","marks":[],"text":"中转使用场景解释"}]}]}]},{"kind":"block","type":"code","key":"1060c60756604e5fb1324d81102b09ce","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"9768980fee9542f7b9bc5d9b23b55620","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"af0c00dcda3b478ca50ce20bec611ce6","ranges":[{"kind":"range","marks":[],"text":"落地服务器IP;落地服务器监听端口;2;ws;;path=/xxx|server=转发服务器IP或域名|host=CDN域名|outside_port=转发服务器监听端口"}]}]}]},{"kind":"block","type":"code","key":"2f661a825d1a43bda788792585c1a85a","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"e9a13042e8774f8fbc796eaad6deac09","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"51d8be33a8e7453ab4d553d2f452102c","ranges":[{"kind":"range","marks":[],"text":"示例：1.3.5.7;80;2;ws;;path=/v2ray|server=hk.domain.com|host=hk.domain.com|outside_port=34567"}]}]}]},{"kind":"block","type":"heading-2","key":"0c41f8a9ac0948b9888f01ca431614d2","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"23adfd7f5dd74f10ab869cd487da353b","ranges":[{"kind":"range","marks":[],"text":"偏移端口 ws + tls"}]}]},{"kind":"block","type":"blockquote","key":"e1b78b1174b942e68078f837eda4901a","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"0087c54c5d054db192d72991f83eb9c5","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"7c460c1e74654ec0b1081a8ac9954294","ranges":[{"kind":"range","marks":[],"text":"当用户连接端口与程序监听端口不一致时使用，例如，中转机器连接端口与后端监听端口不同时"}]}]}]},{"kind":"block","type":"code","key":"a1a220646a6f4ead97e5d2320eec4d4e","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"15a6d63e61844d20a365e101b27a9e3c","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"1f607837160c434dbbe8f1376f5e6e22","ranges":[{"kind":"range","marks":[],"text":"ip;监听端口;2;ws;tls;path=/xxx|server=域名|host=CDN域名|outside_port=用户连接端口"}]}]}]},{"kind":"block","type":"blockquote","key":"c23d548aa70e4ccd885f9119c811ff6c","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"ddd3710856ef4d6db46ce8e213426c92","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"3fb1bf1f29cc41d3890a2d5282cda9d9","ranges":[{"kind":"range","marks":[],"text":"中转使用场景解释"}]}]}]},{"kind":"block","type":"code","key":"cae12c05949c40ef9b30aaec683ec96a","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"8fede680c59449e393057d43f001b976","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"cc17b56ac5884bdb9dc5261ce59c0d84","ranges":[{"kind":"range","marks":[],"text":"落地服务器IP;落地服务器监听端口;2;ws;tls;path=/xxx|server=转发服务器IP或域名|host=CDN域名|outside_port=转发服务器监听端口"}]}]}]},{"kind":"block","type":"code","key":"1be13d86163941b0aa15c078ff2af234","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"9e032dab1c6f48f083337c6380e66e8b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"927c4443a9df4530b07830c5a838acab","ranges":[{"kind":"range","marks":[],"text":"示例：1.3.5.7;443;2;ws;tls;path=/v2ray|server=hk.domain.com|host=hk.domain.com|outside_port=34567"}]}]}]},{"kind":"block","type":"paragraph","key":"1559ad0b9b5049f0a651a7f03890a889","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"65681dc6c68a47a2916a9e5747af2e66","ranges":[{"kind":"range","marks":[],"text":"tcp 模式也是同理，这里不再举例。"}]}]},{"kind":"block","type":"heading-1","key":"a964228c23794611b6bd3e03f2af4c9e","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"653bcfbf81154236b5580ff5949549ba","ranges":[{"kind":"range","marks":[],"text":"第二步，配置 soga"}]}]},{"kind":"block","type":"paragraph","key":"ec1e17982a1440e38c7fb113b9891e62","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"9bf4334636964fd2bcc79a934f4b8ee7","ranges":[{"kind":"range","marks":[],"text":"配置命令："}]}]},{"kind":"block","type":"code","key":"94d0453c76824cbd85462339b8c7a4bd","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"b32142a455a44dcaae779ab0faca8186","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"48f9eb860a724457bc0cd25aa7a56ee0","ranges":[{"kind":"range","marks":[],"text":"# 输出当前配置文件内容"}]}]},{"kind":"block","type":"code-line","key":"a223f45297e14945a540d4a37aa85e56","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"8344f73eab5e49a48d58a334df7d2eb3","ranges":[{"kind":"range","marks":[],"text":"soga config"}]}]},{"kind":"block","type":"code-line","key":"90e6c4a45d1d454b897f00971a96a8a3","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"5b0cf824bf1c470098e4779d4d526134","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"3fa9e83036da46d4bcc11352bd59d521","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f86364e711db46f58fb6a280966bf7aa","ranges":[{"kind":"range","marks":[],"text":"# 对配置文件进行配置，一次可填写多个，也可以调用多次"}]}]},{"kind":"block","type":"code-line","key":"5b901f6c7abc41ca9815ccdb740e190f","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"5d832a42ded34b09b3a907d2eaab98f1","ranges":[{"kind":"range","marks":[],"text":"soga config xxx=xxx yyy=yyy"}]}]}]},{"kind":"block","type":"paragraph","key":"64821dd85dfe4327a7ed890ad845dab3","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"80a3b015a2554dde887ab443d219d8e1","ranges":[{"kind":"range","marks":[],"text":"第一次安装完成后，编辑配置文件："}]}]},{"kind":"block","type":"paragraph","key":"0d5b3a11f9774b8db5f8bee0cb4abd7d","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"17ab9c7c12754286b4af5fc9d58e16c0","ranges":[{"kind":"range","marks":[],"text":"配置文件位置在 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"/etc/soga/soga.conf"}]}]},{"kind":"block","type":"paragraph","key":"b576738e6bee49e49d7b0fd5f9504448","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"092fab0a730840309d73a0139eb74587","ranges":[{"kind":"range","marks":[],"text":"配置文件位置在 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"/etc/soga/soga.conf"}]}]},{"kind":"block","type":"paragraph","key":"64d6f98917dd40f39947d32fa43df978","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"ae54b31b0d9f4325aaea20f5c1be2c55","ranges":[{"kind":"range","marks":[],"text":"配置文件位置在 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"/etc/soga/soga.conf"}]}]},{"kind":"block","type":"heading-2","key":"0097a7764ac14a1a933b1086f180a455","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"e4410564298c4b34afcd1b9c30d549e5","ranges":[{"kind":"range","marks":[],"text":"基础配置"}]}]},{"kind":"block","type":"code","key":"dd2b815a0aee40eaa12f22a1e0251dba","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"96a92b862ab74ef8a8e59f34bef2d780","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"8f134e47940e44c6b3567b4b665ddec7","ranges":[{"kind":"range","marks":[],"text":"type=sspanel-uim                             # 必填这个"}]}]},{"kind":"block","type":"code-line","key":"7e1c533be3574e518ea30cd8bcd2344c","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"78e4196f84af4ba0b5b447cd1abe360c","ranges":[{"kind":"range","marks":[],"text":"server_type=v2ray                            # 必填这个"}]}]},{"kind":"block","type":"code-line","key":"c8715ac0cfad4773bea83e50d42de384","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"95609bc775af44a1a56e5485a354394a","ranges":[{"kind":"range","marks":[],"text":"api=webapi                                   # webapi 或 db，表示 webapi 对接或数据库对接"}]}]},{"kind":"block","type":"code-line","key":"24e317dd0a5d4a91a1045c70b49bc0d8","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"5828b131ea934ddb8a5ad6f0bc6a8802","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"13376d0710fc4f8f87c2351145b4b7a1","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"b6e628fa55804b77a9bc3d9e0a374941","ranges":[{"kind":"range","marks":[],"text":"# webapi 对接"}]}]},{"kind":"block","type":"code-line","key":"5dbf4474a32f43418be779d75e44b153","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"0e34f337126044fea3624547de30a708","ranges":[{"kind":"range","marks":[],"text":"webapi_url=https://xxx.com/                  # webapi url，填写面板主页地址"}]}]},{"kind":"block","type":"code-line","key":"1e13b5b955f64decbeb27cd771ca46c3","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"a1024127d9d3415f8d3c4aa0ef9b4a24","ranges":[{"kind":"range","marks":[],"text":"webapi_mukey=xxxx                            # webapi key"}]}]},{"kind":"block","type":"code-line","key":"ac6cfd617935433c8e1f039bce930ebc","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"b53c1e2d5b0d4c3ea7c6219988eef79c","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"ab842b633e86473191d189bab003d8da","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"0ec2aed61c6b4d3691fbb25af060ab0a","ranges":[{"kind":"range","marks":[],"text":"# 数据库对接"}]}]},{"kind":"block","type":"code-line","key":"d5b98fef9fcb422cbe1db34f739dfbc1","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"c86383758a78437f8d9280f261585b85","ranges":[{"kind":"range","marks":[],"text":"db_host=db.xxx.com                           # 数据库地址"}]}]},{"kind":"block","type":"code-line","key":"2bad8b502dd84083b7c3d1a0ffda753a","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"baa8e4fcc7124e5d8c34a352fe00d857","ranges":[{"kind":"range","marks":[],"text":"db_port=3306                                 # 数据库端口"}]}]},{"kind":"block","type":"code-line","key":"89a1aa4efe7b4e2391fee4819c7db50b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"e52f2c9780e3403d9d4bbb84af976bd8","ranges":[{"kind":"range","marks":[],"text":"db_name=name                                 # 数据库名"}]}]},{"kind":"block","type":"code-line","key":"893da52bb4394427a9db37a9d0e79de5","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"d802901b3407480a8517a0b698ce4511","ranges":[{"kind":"range","marks":[],"text":"db_user=root                                 # 数据库用户名"}]}]},{"kind":"block","type":"code-line","key":"87ee73dd90754e0da5602a8e6b7a3707","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"1aeebf6355924862940427f378b9c9ad","ranges":[{"kind":"range","marks":[],"text":"db_password=asdasdasd                        # 数据库密码"}]}]},{"kind":"block","type":"code-line","key":"21d126d74f004dbc958b09f4c167b25d","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"6dcb71c9fcef42f3ad25bde428752759","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"908fec4dbbd4459c9a7df974e629fe5d","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"8befb27c06ff46e09dc532aae18cbc79","ranges":[{"kind":"range","marks":[],"text":"node_id=1                                    # 节点id"}]}]},{"kind":"block","type":"code-line","key":"596d6163fc0b44f4ad32f11348eac4f6","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"265f7a035e5f4274b39e6d0a878c033d","ranges":[{"kind":"range","marks":[],"text":"soga_key=                                    # 授权key，社区版无需填写，最多支持88用户，商业版无限制"}]}]},{"kind":"block","type":"code-line","key":"605786affe4047ceb66a726952b79e02","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"91477b199540493db146a3c3e7240fca","ranges":[{"kind":"range","marks":[],"text":"user_conn_limit=0                            # 限制用户IP数，0代表无限制，默认会优先使用面板设置的限制IP数，在部分旧版面板下可能会获取不到，则使用这个值"}]}]},{"kind":"block","type":"code-line","key":"ee9ebaa4910b4798ae80388495fbbfbd","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"12973ad90b3f463a9b3edc49577a5d93","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"cc3295c2689340e4b5982fec0349d26f","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"d2845000ef614d7eba94b61203eb3062","ranges":[{"kind":"range","marks":[],"text":"force_close_ssl=false                        # 设为true可强制关闭tls，即使前端开启tls，soga也不会开启tls，方便用户自行使用nginx、caddy等反代"}]}]},{"kind":"block","type":"code-line","key":"657bdb5ab7b640a9b58205b15148a007","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"7a637cd5c4df4d1dac2a6e50d6e48ec3","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"e5dd1278912a40f8bf9cff86b8971a3b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"e1d0052a90aa48de807a309b826c94be","ranges":[{"kind":"range","marks":[],"text":"default_dns=8.8.8.8,1.1.1.1                  # 配置默认dns，可在此配置流媒体解锁的dns，以逗号分隔"}]}]},{"kind":"block","type":"code-line","key":"82423d821178418a8249edf4a03261cd","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"4a474375c4aa4803be794eab4c8a0ccf","ranges":[{"kind":"range","marks":[],"text":"dns_cache_time=10                            # 自定义dns缓存时间，单位分钟，仅在设置了default_dns时有效，或者v2board设置了dns规则时也有效"}]}]},{"kind":"block","type":"code-line","key":"3dccf54126a845348d509b1f7e5ff531","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f10185c0f6794d33b670b03024b9ec39","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"d00cf3f5b2434b04a29f09869d4e78e4","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"e307a90087124346a8c096acaf1e7756","ranges":[{"kind":"range","marks":[],"text":"v2ray_reduce_memory=false                    # VMess 下有效，在已降低内存的基础上进一步降低内存使用，启用后客户端时间误差要求不超过15秒"}]}]},{"kind":"block","type":"code-line","key":"84516c045f144b73813981016ab04d01","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"87dc62b9381d4316ad9ee3f06b9cd39f","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"eec4e77b9c0f4a589189e5935d867fc8","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"91c0fcf296344d72a1d86019f2826a1e","ranges":[{"kind":"range","marks":[],"text":"proxy_protocol=false                         # 具体请参看中转获取真实 IP 教程"}]}]},{"kind":"block","type":"code-line","key":"13c442e981dd4df487fa72c4123a4717","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"cdcbb46a51b947aa9543345bd03db5b1","ranges":[{"kind":"range","marks":[],"text":"v2ray_fallback_addr=                         # v2ray fallback 地址，仅 tcp+tls 可使用"}]}]},{"kind":"block","type":"code-line","key":"a3060eb33b204126a40a778886bf3343","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"390a2f64350c40b8884407acd4d5132c","ranges":[{"kind":"range","marks":[],"text":"v2ray_fallback_port=0                        # v2ray fallback 端口，仅 tcp+tls 可使用"}]}]},{"kind":"block","type":"code-line","key":"e424540f97194735b5dade53a5271d24","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"e7bdea3bf7574f80b9732bc4715e4766","ranges":[{"kind":"range","marks":[],"text":"auto_update=false                            # soga 自动更新，只会检测稳定版"}]}]},{"kind":"block","type":"code-line","key":"c5860ec8fcad443e9e5c4ea6ecd4827a","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"2db2af1014e04b5ea46b999114f4a179","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"aa82de5e25b44dc58a38a04d79e48bb3","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"184c25f1dce147c2b6b34d103ed77574","ranges":[{"kind":"range","marks":[],"text":"vless=false                                  # 设为 true 可切换为 VLESS 协议，目前 VLESS 协议未完全开发完成，仅供测试"}]}]},{"kind":"block","type":"code-line","key":"458be29e07214b8898c5860a9e8fa7bd","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"3b8e6a9f14c74177a9e5b33838cb6e4c","ranges":[{"kind":"range","marks":[],"text":"vless_flow=                                  # vless 流控，具体请参考 v2ray 官方文档"}]}]},{"kind":"block","type":"code-line","key":"150479b0339f4ec485ff17947a8b6c8e","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"653aeede91e044d286d36bec3d10a295","ranges":[{"kind":"range","marks":[],"text":"xtls=false                                   # 设为 true 即可开启 xtls，仅支持 tcp + tls 时开启"}]}]}]},{"kind":"block","type":"heading-2","key":"f250f684bff84171ad55af2dcf2ff6ea","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"1aaf5480185b43b68b3214e8a5017c05","ranges":[{"kind":"range","marks":[],"text":"配置证书"}]}]},{"kind":"block","type":"blockquote","key":"f37c684939f74eea9b366c76c40bdd22","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"74a438c240cb4e3b8443cf0ddc12071e","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"00be512f583b419699cda6cc6dfa3a4e","ranges":[{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"若未开启 tls，则无需配置证书"}]}]}]},{"kind":"block","type":"paragraph","key":"cef1b81de0484d1789dedf2cdb349b94","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"1dc9735ef0ad4cdc841372c208c46e0f","ranges":[{"kind":"range","marks":[],"text":"soga 支持三种方式配置证书，任选其一即可"}]}]},{"kind":"block","type":"heading-3","key":"8525cf84b6d44282a5f876e13d824a5c","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"6acacb8ac3c44a61900e14904a53cb3f","ranges":[{"kind":"range","marks":[],"text":"① 手动指定证书路径"}]}]},{"kind":"block","type":"list-unordered","key":"bbe402ca63b14210b71ed731cc91beea","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"list-item","key":"de1bcb10a96c41d8a28bbe4bf57cfd18","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"1e288f6458b04d7a91766c454b55aa53","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"82be3c17312449f3b0a7870288061e6a","ranges":[{"kind":"range","marks":[],"text":"以 / 开头的绝对路径"}]}]},{"kind":"block","type":"code","key":"e2bd6f800539436bb648bb4315019855","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"4b7d165a667b4471be7b57f9fa98d083","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"09df4a88bcf04e4e9db393b56038fc60","ranges":[{"kind":"range","marks":[],"text":"cert_file=                                   # 手动指定证书路径"}]}]},{"kind":"block","type":"code-line","key":"cd75689c8e16485a9d85ff71de01b9ce","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"1f002b899ccd44eaac090d833b9ff8d1","ranges":[{"kind":"range","marks":[],"text":"key_file=                                    # 手动指定密钥路径"}]}]}]}]}]},{"kind":"block","type":"heading-3","key":"b4cec72ddeba4b5fa714c7a53b3f8b35","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"a3479099bb6e486883e0168468b46337","ranges":[{"kind":"range","marks":[],"text":"② http 模式自动申请证书（推荐）"}]}]},{"kind":"block","type":"list-unordered","key":"d600c8a4ccb94cf3940aa9d217c45ac4","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"list-item","key":"4520a14cbc604e43be34e94e3f475732","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"071cc1b070544f6ca233142e30cf7c47","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"7614128b495a4f84a59254608c21b8ff","ranges":[{"kind":"range","marks":[],"text":"确保服务器中没有其它程序占用 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"80"},{"kind":"range","marks":[],"text":" 端口，申请和续签时需要临时使用"}]}]}]},{"kind":"block","type":"list-item","key":"8f1ae9bcf6c1409e908abad97daca732","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"156b3a330c09402d808c864352a33826","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"1e68d9a7c3054afa91ccebb7b9b88908","ranges":[{"kind":"range","marks":[],"text":"确保域名已解析到本服务器的IP"}]}]}]},{"kind":"block","type":"list-item","key":"5ee12e76192e4455a8d7442313cd3fab","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"080b40f0f6004c59ac67c54774c3485c","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"46e09ba49dff4ccc98d1bb54aaabbdff","ranges":[{"kind":"range","marks":[],"text":"若开启CDN，则必须确保CDN不会跳转https，否则推荐dns验证"}]}]},{"kind":"block","type":"code","key":"0b0e6494fbfe4387a6732af3ae7b2942","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"f4505384aab24dcda835b3319d5f934d","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"9cdc9316de744029879b3b14112628e4","ranges":[{"kind":"range","marks":[],"text":"cert_domain=xxx.com                          # 申请证书的域名"}]}]},{"kind":"block","type":"code-line","key":"a8303623b32949ac95fc20a9ed90bf51","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"86d9cdbb6eec4b0f95578beaabc1a6a9","ranges":[{"kind":"range","marks":[],"text":"cert_mode=http                               # 申请模式"}]}]},{"kind":"block","type":"code-line","key":"04891d495ba94d2c9c126e2cd0f74c27","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"6b1fe1bf7e1941fea7fe96b0b0b5c693","ranges":[{"kind":"range","marks":[],"text":"cert_key_length=ec-256                       # 留空则申请RSA证书，填写ec-256或ec-384则申请ECC证书"}]}]}]}]}]},{"kind":"block","type":"heading-3","key":"51c1e3849a4b46a5a210b53600128bdb","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"87ccaf125d6a4164b971647daa1c5a75","ranges":[{"kind":"range","marks":[],"text":"③ dns 模式自动申请证书"}]}]},{"kind":"block","type":"list-unordered","key":"e8765614f2de463c9f9ad27cf7af2d78","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"list-item","key":"fd1b5f7d4ae146368506cb92bc39968e","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"fee7d2e62842420aa542e82027ac398d","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"24e7684bf04a4988b3390019d6d01a83","ranges":[{"kind":"range","marks":[],"text":"支持一百多种 DNS 服务商"}]}]}]},{"kind":"block","type":"list-item","key":"61ab648db1d24b5e9fc2e839d9cee47d","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"779bb754a5da4ac3a4693e4c022eee36","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f5a4cb61b5b344f886b0c71cd536c0a2","ranges":[{"kind":"range","marks":[],"text":"此配置方式较复杂，但最通用"}]}]}]},{"kind":"block","type":"list-item","key":"fdd7a4af5e034aeaa9b79d6c118e9fbb","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"ad04a06fe176449a8cdc4f93d8ee1b5b","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"bf741cfd83de45129f0f16dffa9add23","ranges":[{"kind":"range","marks":[],"text":"该页面列出了所有支持的 DNS 服务商："}]},{"kind":"inline","type":"link","key":"f44841c5cdbd48f2b14ffc9ba9dfe035","isVoid":false,"data":{"href":"https://github.com/acmesh-official/acme.sh/wiki/dnsapi"},"nodes":[{"kind":"text","key":"d5821639ad9e47c3b4ff6c28ff9337c7","ranges":[{"kind":"range","marks":[],"text":"https://github.com/acmesh-official/acme.sh/wiki/dnsapi"}]}]},{"kind":"text","key":"d28c948d5a9e4501948585fc5cd7f64b","ranges":[{"kind":"range","marks":[],"text":""}]}]}]}]},{"kind":"block","type":"blockquote","key":"105bb0c5ab04409ca6e40d8d32c9b3f3","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"a97dfd1d01d346cd82cd076886f37a63","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"3c313bf0bcd247609226a9d929d3ca9b","ranges":[{"kind":"range","marks":[],"text":"CloudFlare 配置示例"}]}]}]},{"kind":"block","type":"code","key":"a983dce4eb754c90a38155e50f6b77f2","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"9c6dfa0109b34148bd4e795df427cc6f","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"ad09f13029e24766be587d59722a130d","ranges":[{"kind":"range","marks":[],"text":"cert_domain=xxx.com                          # 申请证书的域名"}]}]},{"kind":"block","type":"code-line","key":"e5fbd4ef5cd94dc0831e9a8ad016f5ac","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"73fb7f1225a54e8eb2ce36e66b6dfd2a","ranges":[{"kind":"range","marks":[],"text":"cert_mode=dns                                # 申请模式"}]}]},{"kind":"block","type":"code-line","key":"3facd2ffb744458981241c8d9a691d4f","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"fc4dd08b01974c8bb74c0763c13ba66e","ranges":[{"kind":"range","marks":[],"text":"cert_key_length=ec-256                       # 留空则申请RSA证书，填写ec-256或ec-384则申请ECC证书"}]}]},{"kind":"block","type":"code-line","key":"6a1e97e16d1c4fa9a5ba6e59aff49cf1","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"78346247c9be482bb164c10ab2c546ea","ranges":[{"kind":"range","marks":[],"text":"dns_provider=dns_cf                          # DNS 提供商"}]}]},{"kind":"block","type":"code-line","key":"d009bde04afc417d87881cc532c19036","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"0f797b83a456478c8a2744b675665166","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"3cb952835ca343fbad59fe377ee9a7b9","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"c1f3c2a67949435985f30876d04b8b87","ranges":[{"kind":"range","marks":[],"text":"DNS_CF_Email=xxx@xx.com                      # CF 邮箱"}]}]},{"kind":"block","type":"code-line","key":"2d44acf87cdc431f838ec0437a7484f3","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"9da062c7b1a244fe9bc361a28cff1d58","ranges":[{"kind":"range","marks":[],"text":"DNS_CF_Key=xxxxx                             # CF API Global Key"}]}]}]},{"kind":"block","type":"blockquote","key":"9037f4828e384f888761620ee7df1142","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"364f6de64617403b85715a0c3852a863","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f18a0ece35f742ceaaf7c44c99e3b24b","ranges":[{"kind":"range","marks":[],"text":"DNSPod 配置示例"}]}]}]},{"kind":"block","type":"code","key":"9d36e6adcb344576b5a52be6b49f401e","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"0b446fe25efa468f8fa3705ccb47f170","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"a9e06105dda34c17b2e3fe8ea8c2b3cc","ranges":[{"kind":"range","marks":[],"text":"cert_domain=xxx.com                          # 申请证书的域名"}]}]},{"kind":"block","type":"code-line","key":"40d57ddf19194db5a15b95685b099973","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"6cf362ee72f74294b12aa064a379c398","ranges":[{"kind":"range","marks":[],"text":"cert_mode=dns                                # 申请模式"}]}]},{"kind":"block","type":"code-line","key":"a8f257ce7caa45d38acb94a5a748623c","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"ba4b2048c65042169b643826c2dec902","ranges":[{"kind":"range","marks":[],"text":"cert_key_length=ec-256                       # 留空则申请RSA证书，填写ec-256或ec-384则申请ECC证书"}]}]},{"kind":"block","type":"code-line","key":"0bcc96bbe0e24db6b6e0a6ba74ea16ff","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"c247426027284d7b8a5ed098188770b1","ranges":[{"kind":"range","marks":[],"text":"dns_provider=dns_dp                          # DNS 提供商"}]}]},{"kind":"block","type":"code-line","key":"012b4d069a584f4ba7ff506b98af18ef","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"3111ea4306c346728918b1b0a9724542","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"code-line","key":"31c66f73504643418c108f5c611a59e9","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"79f21e98fb7145ceaa58f662d5242b30","ranges":[{"kind":"range","marks":[],"text":"DNS_DP_Id=111                                # DNSPod 用户 id"}]}]},{"kind":"block","type":"code-line","key":"7fd00f5d66f84fcf8d1aba8f72ef81dc","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"e7c8b1e213084c67b8bbdb9aeb4c2318","ranges":[{"kind":"range","marks":[],"text":"DNS_DP_Key=xxxxx                             # DNSPod API 密钥"}]}]}]},{"kind":"block","type":"paragraph","key":"c7036c30751b439baf7c63c54671e9cb","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"66ec171deb3143d2bdc1573c21a11fad","ranges":[{"kind":"range","marks":[],"text":"其它的 DNS 服务商都能在这个页面找到："}]},{"kind":"inline","type":"link","key":"aa28afff9f3149729d5f501a938e2623","isVoid":false,"data":{"href":"https://github.com/acmesh-official/acme.sh/wiki/dnsapi"},"nodes":[{"kind":"text","key":"859ca2695c6c4bef9901b707ece76a3a","ranges":[{"kind":"range","marks":[],"text":"https://github.com/acmesh-official/acme.sh/wiki/dnsapi"}]}]},{"kind":"text","key":"beb528d167d94f9f86b39678371907a9","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"paragraph","key":"bbf2ba696182450a8cbf6d9ffd5688c7","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"3c52ee8c9c9e499a8847f92122efb30d","ranges":[{"kind":"range","marks":[],"text":"配置要点："}]}]},{"kind":"block","type":"list-unordered","key":"65ffbdaf2a50453c8f63f91f22ae7d4a","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"list-item","key":"243f158168e14405b8319be8a3e144e7","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"66e01685424f40e6bc21938290a89d60","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"f93f1b9c9b4c4390adfd361cb7ba8756","ranges":[{"kind":"range","marks":[],"text":"搜索 DNS 提供商的名称，并找到命令中 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"--dns dns_xxx"},{"kind":"range","marks":[],"text":" 的内容，这个 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"dns_xxx "},{"kind":"range","marks":[],"text":"就是你要填的"}]}]}]},{"kind":"block","type":"list-item","key":"71cb69d495af40bf826a182ce9501ca7","isVoid":false,"data":{},"nodes":[{"kind":"block","type":"paragraph","key":"310379628883482ea7f7672c77bf6690","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"73835f7fe48c40d7868d3626cca7c858","ranges":[{"kind":"range","marks":[],"text":"再看看 DNS 提供商所需要配置的内容，"},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"区分大小写"},{"kind":"range","marks":[],"text":"，一般都是 API 密钥之类的，注意要在 soga 配置中加上 "},{"kind":"range","marks":[{"kind":"mark","data":{},"type":"bold"}],"text":"DNS_"},{"kind":"range","marks":[],"text":" 前缀，防止配置冲突"}]}]}]}]},{"kind":"block","type":"paragraph","key":"b480128f45f14008bbbe83b9a09ff827","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"c9d57f6d6d354dc385906abf07c62a4d","ranges":[{"kind":"range","marks":[],"text":""}]}]},{"kind":"block","type":"heading-1","key":"aa013472e11a4e749dcd71a444d077aa","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"928d364b35e64f46a0a7cd1cdf533802","ranges":[{"kind":"range","marks":[],"text":"第三步、启动 soga"}]}]},{"kind":"block","type":"code","key":"737c171cc5794609b8526dbee8f39731","isVoid":false,"data":{"syntax":"text"},"nodes":[{"kind":"block","type":"code-line","key":"bb30ebb6c60c4b0bbb5087d729c70079","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"79485d6ddb124425979ae7b5882401e1","ranges":[{"kind":"range","marks":[],"text":"soga start"}]}]}]},{"kind":"block","type":"paragraph","key":"c9c13c28530c4e708772f528243bdc85","isVoid":false,"data":{},"nodes":[{"kind":"text","key":"8f5279fb7f29450b8a1058996fc390e3","ranges":[{"kind":"range","marks":[],"text":"若出现启动失败的情况，使用 soga log 查看错误信息"}]}]},

    
    ]]></description>
    </item>
        <item>
        <title><![CDATA[使用 Docker 安装 V2Board]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/535411]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Wed, 02 Dec 2020 01:44:44 +0800]]></pubDate>
        <description><![CDATA[使用 Docker 安装 V2Board
安装 Docker
curl -fsSL https://get.docker.com | bash
curl -L &quot;https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose
# 创建个软链接，以后用 dc 命令来代替 docker-compose
rm -rf which dc  # 若系统中存在 dc 则删除，这个 dc 就是个计算器，完全没有用
ln -s /usr/local/bin/docker-compose /usr/bin/dc
克隆代码
git clone https://github.com/v2board/v2board-docker.git
cd v2board-docker/
git submodule update --init
echo '  branch = dev' &gt;&gt; .gitmodules
git submodule update --remote
启动环境
dc up -d
安装配置 V2Board
dc exec www bash
bash-5.0# wget https://getcomposer.org/download/1.9.0/composer.phar
bash-5.0# php composer.phar install
bash-5.0# php artisan v2board:install

数据库地址： mysql
数据库名：v2board
数据库用户名：root
数据库密码：v2boardisbest]]></description>
    </item>
        <item>
        <title><![CDATA[metron安装教程关键在php7.2or7.3才能安装扩展重启以及数据库导入以及xcat变化]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/535410]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Wed, 02 Dec 2020 01:22:27 +0800]]></pubDate>
        <description><![CDATA[



html {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:"Lucida Console",Consolas,"Courier",monospace; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 40px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
@media screen and (max-width: 500px) {
  body.typora-export { padding-left: 0px; padding-right: 0px; }
  #write { padding-left: 20px; padding-right: 20px; }
  .CodeMirror-sizer { margin-left: 0px !important; }
  .CodeMirror-gutters { display: none !important; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; image-orientation: from-image; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-diagram-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
  body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
  #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
  .typora-export * { -webkit-print-color-adjust: exact; }
  html.blink-to-pdf { font-size: 13px; }
  .typora-export #write { padding-left: 32px; padding-right: 32px; padding-bottom: 0px; break-after: avoid; }
  .typora-export #write::after { height: 0px; }
  .is-mac table { break-inside: avoid; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
  .md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
  .md-toc-h4 .md-toc-inner { margin-left: 5em; }
  .md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
  .md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }
.md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: hidden; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; zoom: 90%; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }
.MathJax_SVG * { transition: none 0s ease 0s; }
.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
svg[id^="mermaidChart"] { line-height: 1em; }
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
mark .md-meta { color: rgb(0, 0, 0); opacity: 0.3 !important; }


.CodeMirror { height: auto; }
.CodeMirror.cm-s-inner { background: inherit; }
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
.cm-negative { color: rgb(221, 68, 68); }
.cm-positive { color: rgb(34, 153, 34); }
.cm-header, .cm-strong { font-weight: 700; }
.cm-del { text-decoration: line-through; }
.cm-em { font-style: italic; }
.cm-link { text-decoration: underline; }
.cm-error { color: red; }
.cm-invalidchar { color: red; }
.cm-constant { color: rgb(38, 139, 210); }
.cm-defined { color: rgb(181, 137, 0); }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
.CodeMirror { position: relative; overflow: hidden; }
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
.CodeMirror-sizer { position: relative; }
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; }
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: hidden; }
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 30px; z-index: 3; }
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
.CodeMirror-lines { cursor: text; }
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
.CodeMirror-linebackground { position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 0; }
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
.cm-searching { background: rgba(255, 255, 0, 0.4); }
@media print {
  .CodeMirror div.CodeMirror-cursor { visibility: hidden; }
}


/* Flowchart variables */
/* Sequence Diagram variables */
/* Gantt chart variables */
/* state colors */
.label {
  
  color: #333; }

.label text {
  fill: #333; }

.node rect,
.node circle,
.node ellipse,
.node polygon {
  fill: #BDD5EA;
  stroke: #9370DB;
  stroke-width: 1px; }

.node .label {
  text-align: center; }

.node.clickable {
  cursor: pointer; }

.arrowheadPath {
  fill: lightgrey; }

.edgePath .path {
  stroke: lightgrey;
  stroke-width: 1.5px; }

.edgeLabel {
  background-color: #e8e8e8;
  text-align: center; }

.cluster rect {
  fill: #6D6D65;
  stroke: rgba(255, 255, 255, 0.25);
  stroke-width: 1px; }

.cluster text {
  fill: #F9FFFE; }

div.mermaidTooltip {
  position: absolute;
  text-align: center;
  max-width: 200px;
  padding: 2px;
  
  font-size: 12px;
  background: #6D6D65;
  border: 1px solid rgba(255, 255, 255, 0.25);
  border-radius: 2px;
  pointer-events: none;
  z-index: 100; }

.actor {
  stroke: #81B1DB;
  fill: #BDD5EA; }

text.actor {
  fill: black;
  stroke: none; }

.actor-line {
  stroke: lightgrey; }

.messageLine0 {
  stroke-width: 1.5;
  stroke-dasharray: '2 2';
  stroke: lightgrey; }

.messageLine1 {
  stroke-width: 1.5;
  stroke-dasharray: '2 2';
  stroke: lightgrey; }

#arrowhead {
  fill: lightgrey; }

.sequenceNumber {
  fill: white; }

#sequencenumber {
  fill: lightgrey; }

#crosshead path {
  fill: lightgrey !important;
  stroke: lightgrey !important; }

.messageText {
  fill: lightgrey;
  stroke: none; }

.labelBox {
  stroke: #81B1DB;
  fill: #BDD5EA; }

.labelText {
  fill: #323D47;
  stroke: none; }

.loopText {
  fill: lightgrey;
  stroke: none; }

.loopLine {
  stroke-width: 2;
  stroke-dasharray: '2 2';
  stroke: #81B1DB; }

.note {
  stroke: rgba(255, 255, 255, 0.25);
  fill: #fff5ad; }

.noteText {
  fill: black;
  stroke: none;
  
  font-size: 14px; }

.activation0 {
  fill: #f4f4f4;
  stroke: #666; }

.activation1 {
  fill: #f4f4f4;
  stroke: #666; }

.activation2 {
  fill: #f4f4f4;
  stroke: #666; }

/** Section styling */
.section {
  stroke: none;
  opacity: 0.2; }

.section0 {
  fill: rgba(255, 255, 255, 0.3); }

.section2 {
  fill: #EAE8B9; }

.section1,
.section3 {
  fill: white;
  opacity: 0.2; }

.sectionTitle0 {
  fill: #F9FFFE; }

.sectionTitle1 {
  fill: #F9FFFE; }

.sectionTitle2 {
  fill: #F9FFFE; }

.sectionTitle3 {
  fill: #F9FFFE; }

.sectionTitle {
  text-anchor: start;
  font-size: 11px;
  text-height: 14px;
   }

/* Grid and axis */
.grid .tick {
  stroke: lightgrey;
  opacity: 0.3;
  shape-rendering: crispEdges; }

.grid path {
  stroke-width: 0; }

/* Today line */
.today {
  fill: none;
  stroke: #DB5757;
  stroke-width: 2px; }

/* Task styling */
/* Default task */
.task {
  stroke-width: 2; }

.taskText {
  text-anchor: middle;
   }

.taskText:not([font-size]) {
  font-size: 11px; }

.taskTextOutsideRight {
  fill: #323D47;
  text-anchor: start;
  font-size: 11px;
   }

.taskTextOutsideLeft {
  fill: #323D47;
  text-anchor: end;
  font-size: 11px; }

/* Special case clickable */
.task.clickable {
  cursor: pointer; }

.taskText.clickable {
  cursor: pointer;
  fill: #003163 !important;
  font-weight: bold; }

.taskTextOutsideLeft.clickable {
  cursor: pointer;
  fill: #003163 !important;
  font-weight: bold; }

.taskTextOutsideRight.clickable {
  cursor: pointer;
  fill: #003163 !important;
  font-weight: bold; }

/* Specific task settings for the sections*/
.taskText0,
.taskText1,
.taskText2,
.taskText3 {
  fill: #323D47; }

.task0,
.task1,
.task2,
.task3 {
  fill: #BDD5EA;
  stroke: rgba(255, 255, 255, 0.5); }

.taskTextOutside0,
.taskTextOutside2 {
  fill: lightgrey; }

.taskTextOutside1,
.taskTextOutside3 {
  fill: lightgrey; }

/* Active task */
.active0,
.active1,
.active2,
.active3 {
  fill: #81B1DB;
  stroke: rgba(255, 255, 255, 0.5); }

.activeText0,
.activeText1,
.activeText2,
.activeText3 {
  fill: #323D47 !important; }

/* Completed task */
.done0,
.done1,
.done2,
.done3 {
  stroke: grey;
  fill: lightgrey;
  stroke-width: 2; }

.doneText0,
.doneText1,
.doneText2,
.doneText3 {
  fill: #323D47 !important; }

/* Tasks on the critical line */
.crit0,
.crit1,
.crit2,
.crit3 {
  stroke: #E83737;
  fill: #E83737;
  stroke-width: 2; }

.activeCrit0,
.activeCrit1,
.activeCrit2,
.activeCrit3 {
  stroke: #E83737;
  fill: #81B1DB;
  stroke-width: 2; }

.doneCrit0,
.doneCrit1,
.doneCrit2,
.doneCrit3 {
  stroke: #E83737;
  fill: lightgrey;
  stroke-width: 2;
  cursor: pointer;
  shape-rendering: crispEdges; }

.milestone {
  transform: rotate(45deg) scale(0.8, 0.8); }

.milestoneText {
  font-style: italic; }

.doneCritText0,
.doneCritText1,
.doneCritText2,
.doneCritText3 {
  fill: #323D47 !important; }

.activeCritText0,
.activeCritText1,
.activeCritText2,
.activeCritText3 {
  fill: #323D47 !important; }

.titleText {
  text-anchor: middle;
  font-size: 18px;
  fill: #323D47;
   }

g.classGroup text {
  fill: #9370DB;
  stroke: none;
  
  font-size: 10px; }
  g.classGroup text .title {
    font-weight: bolder; }

g.classGroup rect {
  fill: #BDD5EA;
  stroke: #9370DB; }

g.classGroup line {
  stroke: #9370DB;
  stroke-width: 1; }

.classLabel .box {
  stroke: none;
  stroke-width: 0;
  fill: #BDD5EA;
  opacity: 0.5; }

.classLabel .label {
  fill: #9370DB;
  font-size: 10px; }

.relation {
  stroke: #9370DB;
  stroke-width: 1;
  fill: none; }

#compositionStart {
  fill: #9370DB;
  stroke: #9370DB;
  stroke-width: 1; }

#compositionEnd {
  fill: #9370DB;
  stroke: #9370DB;
  stroke-width: 1; }

#aggregationStart {
  fill: #BDD5EA;
  stroke: #9370DB;
  stroke-width: 1; }

#aggregationEnd {
  fill: #BDD5EA;
  stroke: #9370DB;
  stroke-width: 1; }

#dependencyStart {
  fill: #9370DB;
  stroke: #9370DB;
  stroke-width: 1; }

#dependencyEnd {
  fill: #9370DB;
  stroke: #9370DB;
  stroke-width: 1; }

#extensionStart {
  fill: #9370DB;
  stroke: #9370DB;
  stroke-width: 1; }

#extensionEnd {
  fill: #9370DB;
  stroke: #9370DB;
  stroke-width: 1; }

.commit-id,
.commit-msg,
.branch-label {
  fill: lightgrey;
  color: lightgrey;
   }

.pieTitleText {
  text-anchor: middle;
  font-size: 25px;
  fill: #eee;
}

g.stateGroup text {
  stroke: none;
  font-size: 10px;
}

g.stateGroup circle {
  fill: white !important;
  stroke: white !important;
}

g.stateGroup .state-title {
  font-weight: bolder;
  fill: black; }

g.stateGroup rect {
  fill: #ececff;
  stroke: #9370DB; }

g.stateGroup line {
  stroke: #9370DB;
  stroke-width: 1; }

.transition {
  stroke: #9370DB;
  stroke-width: 1;
  fill: none; }

.stateGroup .composit {
  fill: #555;
  border-bottom: 1px; }

.state-note {
  stroke: rgba(255, 255, 255, 0.25);
  fill: #fff5ad; }
  .state-note text {
    fill: black;
    stroke: none;
    font-size: 10px; }

.stateLabel .box {
  stroke: none;
  stroke-width: 0;
  fill: #BDD5EA;
  opacity: 0.5; }

.stateLabel text {
  fill: black;
  font-size: 10px;
  font-weight: bold;
}

.cluster-label {
  color:black;
}

.statediagram-cluster rect {
  fill: #BDD5EA;
  stroke: #9370DB; 
  stroke-width: 1px;
}
.statediagram-cluster rect.outer {
  rx: 5px;
  ry: 5px;
}
.statediagram-state .divider {
  stroke: #9370DB; 
}

.statediagram-state .title-state {
  rx: 5px;
  ry: 5px;
}
.statediagram-cluster.statediagram-cluster .inner {
  fill: white;
}
.statediagram-cluster.statediagram-cluster-alt .inner {
  fill: #e0e0e0;
}

.statediagram-cluster .inner {
  rx:0;
  ry:0;
}

.statediagram-state rect.basic {
  rx: 5px;
  ry: 5px;
}
.statediagram-state rect.divider {
  stroke-dasharray: 10,10;
  fill: #efefef;
}

.note-edge {
  stroke-dasharray: 5;
}

.statediagram-note rect {
  stroke: var(--cluster-border);
  fill: #fff5ad;
  stroke-width: 1px;
  rx: 0;
  ry: 0;
}

.node circle.state-start {
  fill: black;
  stroke: black;
}
.node circle.state-end {
  fill: black;
  stroke: white;
  stroke-width: 1.5
}
#statediagram-barbEnd {
  fill: #9370DB; 
}

/* CSS Document */

/** code highlight */

.cm-s-inner .cm-variable,
.cm-s-inner .cm-operator,
.cm-s-inner .cm-property {
    color: #b8bfc6;
}

.cm-s-inner .cm-keyword {
    color: #C88FD0;
}

.cm-s-inner .cm-tag {
    color: #7DF46A;
}

.cm-s-inner .cm-attribute {
    color: #7575E4;
}

.CodeMirror div.CodeMirror-cursor {
    border-left: 1px solid #b8bfc6;
    z-index: 3;
}

.cm-s-inner .cm-string {
    color: #D26B6B;
}

.cm-s-inner .cm-comment,
.cm-s-inner.cm-comment {
    color: #DA924A;
}

.cm-s-inner .cm-header,
.cm-s-inner .cm-def,
.cm-s-inner.cm-header,
.cm-s-inner.cm-def {
    color: #8d8df0;
}

.cm-s-inner .cm-quote,
.cm-s-inner.cm-quote {
    color: #57ac57;
}

.cm-s-inner .cm-hr {
    color: #d8d5d5;
}

.cm-s-inner .cm-link {
    color: #d3d3ef;
}

.cm-s-inner .cm-negative {
    color: #d95050;
}

.cm-s-inner .cm-positive {
    color: #50e650;
}

.cm-s-inner .cm-string-2 {
    color: #f50;
}

.cm-s-inner .cm-meta,
.cm-s-inner .cm-qualifier {
    color: #b7b3b3;
}

.cm-s-inner .cm-builtin {
    color: #f3b3f8;
}

.cm-s-inner .cm-bracket {
    color: #997;
}

.cm-s-inner .cm-atom,
.cm-s-inner.cm-atom {
    color: #84B6CB;
}

.cm-s-inner .cm-number {
    color: #64AB8F;
}

.cm-s-inner .cm-variable {
    color: #b8bfc6;
}

.cm-s-inner .cm-variable-2 {
    color: #9FBAD5;
}

.cm-s-inner .cm-variable-3 {
    color: #1cc685;
}

.CodeMirror-selectedtext,
.CodeMirror-selected {
    background: #4a89dc;
    color: #fff !important;
    text-shadow: none;
}

.CodeMirror-gutters {
    border-right: none;
}

/* CSS Document */

/** markdown source **/
.cm-s-typora-default .cm-header, 
.cm-s-typora-default .cm-property
{
    color: #cebcca;
}

.CodeMirror.cm-s-typora-default div.CodeMirror-cursor{
    border-left: 3px solid #b8bfc6;
}

.cm-s-typora-default .cm-comment {
    color: #9FB1FF;
}

.cm-s-typora-default .cm-string {
    color: #A7A7D9
}

.cm-s-typora-default .cm-atom, .cm-s-typora-default .cm-number {
    color: #848695;
    font-style: italic;
}

.cm-s-typora-default .cm-link {
    color: #95B94B;
}

.cm-s-typora-default .CodeMirror-activeline-background {
    background: rgba(51, 51, 51, 0.72);
}

.cm-s-typora-default .cm-comment, .cm-s-typora-default .cm-code {
	color: #8aa1e1;
}@import "";
@import "";
@import "";

:root {
    --bg-color:  #363B40;
    --side-bar-bg-color: #2E3033;
    --text-color: #b8bfc6;

    --select-text-bg-color:#4a89dc;

    --item-hover-bg-color: #0a0d16;
    --control-text-color: #b7b7b7;
    --control-text-hover-color: #eee;
    --window-border: 1px solid #555;

    --active-file-bg-color: rgb(34, 34, 34);
    --active-file-border-color: #8d8df0;

    --primary-color: #a3d5fe;

    --active-file-text-color: white;
    --item-hover-bg-color: #70717d;
    --item-hover-text-color: white;
    --primary-color: #6dc1e7;

    --rawblock-edit-panel-bd: #333;

    --search-select-bg-color: #428bca;
}

html {
    font-size: 16px;
}

html,
body {
    -webkit-text-size-adjust: 100%;
    -ms-text-size-adjust: 100%;
    background: #363B40;
    background: var(--bg-color);
    fill: currentColor;
    line-height: 1.625rem;
}

#write {
    max-width: 914px;
}


@media only screen and (min-width: 1400px) {
	#write {
		max-width: 1024px;
	}
}

@media only screen and (min-width: 1800px) {
	#write {
		max-width: 1200px;
	}
}

html,
body,
button,
input,
select,
textarea,
div.code-tooltip-content {
    color: #b8bfc6;
    border-color: transparent;
}

div.code-tooltip,
.md-hover-tip .md-arrow:after {
    background: #333;
}

.popover.bottom > .arrow:after {
    border-bottom-color: #333;
}

html,
body,
button,
input,
select,
textarea {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}

hr {
    height: 2px;
    border: 0;
    margin: 24px 0 !important;
}

h1,
h2,
h3,
h4,
h5,
h6 {
    font-family: "Lucida Grande", "Corbel", sans-serif;
    font-weight: normal;
    clear: both;
    -ms-word-wrap: break-word;
    word-wrap: break-word;
    margin: 0;
    padding: 0;
    color: #DEDEDE
}

h1 {
    font-size: 2.5rem;
    /* 36px */
    line-height: 2.75rem;
    /* 40px */
    margin-bottom: 1.5rem;
    /* 24px */
    letter-spacing: -1.5px;
}

h2 {
    font-size: 1.63rem;
    /* 24px */
    line-height: 1.875rem;
    /* 30px */
    margin-bottom: 1.5rem;
    /* 24px */
    letter-spacing: -1px;
    font-weight: bold;
}

h3 {
    font-size: 1.17rem;
    /* 18px */
    line-height: 1.5rem;
    /* 24px */
    margin-bottom: 1.5rem;
    /* 24px */
    letter-spacing: -1px;
    font-weight: bold;
}

h4 {
    font-size: 1.12rem;
    /* 16px */
    line-height: 1.375rem;
    /* 22px */
    margin-bottom: 1.5rem;
    /* 24px */
    color: white;
}

h5 {
    font-size: 0.97rem;
    /* 16px */
    line-height: 1.25rem;
    /* 22px */
    margin-bottom: 1.5rem;
    /* 24px */
    font-weight: bold;
}

h6 {
    font-size: 0.93rem;
    /* 16px */
    line-height: 1rem;
    /* 16px */
    margin-bottom: 0.75rem;
    color: white;
}

@media (min-width: 980px) {
    h3.md-focus:before,
    h4.md-focus:before,
    h5.md-focus:before,
    h6.md-focus:before {
        color: #ddd;
        border: 1px solid #ddd;
        border-radius: 3px;
        position: absolute;
        left: -1.642857143rem;
        top: .357142857rem;
        float: left;
        font-size: 9px;
        padding-left: 2px;
        padding-right: 2px;
        vertical-align: bottom;
        font-weight: normal;
        line-height: normal;
    }

    h3.md-focus:before {
        content: 'h3';
    }

    h4.md-focus:before {
        content: 'h4';
    }

    h5.md-focus:before {
        content: 'h5';
        top: 0px;
    }

    h6.md-focus:before {
        content: 'h6';
        top: 0px;
    }
}

a {
    text-decoration: none;
    outline: 0;
}

a:hover {
    outline: 0;
}

a:focus {
    outline: thin dotted;
}

sup.md-footnote {
    background-color: #555;
    color: #ddd;
}

p {
    -ms-word-wrap: break-word;
    word-wrap: break-word;
}

p,
ul,
dd,
ol,
hr,
address,
pre,
table,
iframe,
.wp-caption,
.wp-audio-shortcode,
.wp-video-shortcode {
    margin-top: 0;
    margin-bottom: 1.5rem;
    /* 24px */
}

li > blockquote {
	margin-bottom: 0;
}

audio:not([controls]) {
    display: none;
}

[hidden] {
    display: none;
}

::-moz-selection {
    background: #4a89dc;
    color: #fff;
    text-shadow: none;
}

*.in-text-selection,
::selection {
    background: #4a89dc;
    color: #fff;
    text-shadow: none;
}

ul,
ol {
    padding: 0 0 0 1.875rem;
    /* 30px */
}

ul {
    list-style: square;
}

ol {
    list-style: decimal;
}

ul ul,
ol ol,
ul ol,
ol ul {
    margin: 0;
}

b,
th,
dt,
strong {
    font-weight: bold;
}

i,
em,
dfn,
cite {
    font-style: italic;
}

blockquote {
    padding-left: 1.875rem;
    margin: 0 0 1.875rem 1.875rem;
    border-left: solid 2px #474d54;
    padding-left: 30px;
    margin-top: 35px;
}

pre,
code,
kbd,
tt,
var {
    font-size: 0.875rem;
    font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace;
}

code,
tt,
var {
    background: rgba(0, 0, 0, 0.05);
}

kbd {
    padding: 2px 4px;
    font-size: 90%;
    color: #fff;
    background-color: #333;
    border-radius: 3px;
    box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
}

pre.md-fences {
    padding: 10px 10px 10px 30px;
    margin-bottom: 20px;
    background: #333;
}

.CodeMirror-gutters {
    background: #333;
    border-right: 1px solid transparent;
}

.enable-diagrams pre.md-fences[lang="sequence"] .code-tooltip,
.enable-diagrams pre.md-fences[lang="flow"] .code-tooltip,
.enable-diagrams pre.md-fences[lang="mermaid"] .code-tooltip {
    bottom: -2.2em;
    right: 4px;
}

code,
kbd,
tt,
var {
    padding: 2px 5px;
}

table {
    max-width: 100%;
    width: 100%;
    border-collapse: collapse;
    border-spacing: 0;
}

th,
td {
    padding: 5px 10px;
    vertical-align: top;
}

a {
    -webkit-transition: all .2s ease-in-out;
    transition: all .2s ease-in-out;
}

hr {
    background: #474d54;
    /* variable */
}

h1 {
    margin-top: 2em;
}

a {
    color: #e0e0e0;
    text-decoration: underline;
}

a:hover {
    color: #fff;
}

.md-inline-math script {
    color: #81b1db;
}

b,
th,
dt,
strong {
    color: #DEDEDE;
    /* variable */
}

mark {
    background: #D3D40E;
}

blockquote {
    color: #9DA2A6;
}

table a {
    color: #DEDEDE;
    /* variable */
}

th,
td {
    border: solid 1px #474d54;
    /* variable */
}

.task-list {
    padding-left: 0;
}

.md-task-list-item {
    padding-left: 1.25rem;
}

.md-task-list-item > input {
    top: auto;
}

.md-task-list-item > input:before {
    content: "";
    display: inline-block;
    width: 0.875rem;
    height: 0.875rem;
    vertical-align: middle;
    text-align: center;
    border: 1px solid #b8bfc6;
    background-color: #363B40;
    margin-top: -0.4rem;
}

.md-task-list-item > input:checked:before,
.md-task-list-item > input[checked]:before {
    content: '\221A';
    /*◘*/
    font-size: 0.625rem;
    line-height: 0.625rem;
    color: #DEDEDE;
}

/** quick open **/
.auto-suggest-container {
    border: 0px;
    background-color: #525C65;
}

#typora-quick-open {
    background-color: #525C65;
}

#typora-quick-open input{
    background-color: #525C65;
    border: 0;
    border-bottom: 1px solid grey;
}

.typora-quick-open-item {
    background-color: inherit;
    color: inherit;
}

.typora-quick-open-item.active,
.typora-quick-open-item:hover {
    background-color: #4D8BDB;
    color: white;
}

.typora-quick-open-item:hover {
    background-color: rgba(77, 139, 219, 0.8);
}

.typora-search-spinner > div {
  background-color: #fff;
}

#write pre.md-meta-block {
    border-bottom: 1px dashed #ccc;
    background: transparent;
    padding-bottom: 0.6em;
    line-height: 1.6em;
}

.btn,
.btn .btn-default {
    background: transparent;
    color: #b8bfc6;
}

.ty-table-edit {
    border-top: 1px solid gray;
    background-color: #363B40;
}

.popover-title {
    background: transparent;
}

.md-image>.md-meta {
    color: #BBBBBB;
    background: transparent;
}

.md-expand.md-image>.md-meta {
    color: #DDD;
}

#write>h3:before,
#write>h4:before,
#write>h5:before,
#write>h6:before {
    border: none;
    border-radius: 0px;
    color: #888;
    text-decoration: underline;
    left: -1.4rem;
    top: 0.2rem;
}

#write>h3.md-focus:before {
    top: 2px;
}

#write>h4.md-focus:before {
    top: 2px;
}

.md-toc-item {
    color: #A8C2DC;
}

#write div.md-toc-tooltip {
    background-color: #363B40;
}

.dropdown-menu .btn:hover,
.dropdown-menu .btn:focus,
.md-toc .btn:hover,
.md-toc .btn:focus {
    color: white;
    background: black;
}

#toc-dropmenu {
    background: rgba(50, 54, 59, 0.93);
    border: 1px solid rgba(253, 253, 253, 0.15);
}

#toc-dropmenu .divider {
    background-color: #9b9b9b;
}

.outline-expander:before {
    top: 2px;
}

#typora-sidebar {
    box-shadow: none;
    border-right: 1px dashed;
    border-right: none;
}

.sidebar-tabs {
    border-bottom:0;
}

#typora-sidebar:hover .outline-title-wrapper {
    border-left: 1px dashed;
}

.outline-title-wrapper .btn {
    color: inherit;
}

.outline-item:hover {
    border-color: #363B40;
    background-color: #363B40;
    color: white;
}

h1.md-focus .md-attr,
h2.md-focus .md-attr,
h3.md-focus .md-attr,
h4.md-focus .md-attr,
h5.md-focus .md-attr,
h6.md-focus .md-attr,
.md-header-span .md-attr {
    color: #8C8E92;
    display: inline;
}

.md-comment {
    color: #5a95e3;
    opacity: 1;
}

.md-inline-math svg {
    color: #b8bfc6;
}

#math-inline-preview .md-arrow:after {
    background: black;
}

.modal-content {
    background: var(--bg-color);
    border: 0;
}

.modal-title {
    font-size: 1.5em;
}

.modal-content input {
    background-color: rgba(26, 21, 21, 0.51);
    color: white;
}

.modal-content .input-group-addon {
    color: white;
}

.modal-backdrop {
    background-color: rgba(174, 174, 174, 0.7);
}

.modal-content .btn-primary {
    border-color: var(--primary-color);
}

.md-table-resize-popover {
    background-color: #333;
}

.form-inline .input-group .input-group-addon {
    color: white;
}

#md-searchpanel {
    border-bottom: 1px dashed grey;
}

/** UI for electron */

.context-menu,
#spell-check-panel,
#footer-word-count-info {
    background-color: #42464A;
}

.context-menu.dropdown-menu .divider,
.dropdown-menu .divider {
    background-color: #777777;
}

footer {
    color: inherit;
}

@media (max-width: 1000px) {
    footer {
        border-top: none;
    }
    footer:hover {
        color: inherit;
    }
}

#file-info-file-path .file-info-field-value:hover {
    background-color: #555;
    color: #dedede;
}

.megamenu-content,
.megamenu-opened header {
    background: var(--bg-color);
}

.megamenu-menu-panel h2,
.megamenu-menu-panel h1,
.long-btn {
    color: inherit;
}

.megamenu-menu-panel input[type='text'] {
    background: inherit;
    border: 0;
    border-bottom: 1px solid;
}

#recent-file-panel-action-btn {
    background: inherit;
    border: 1px grey solid;
}

.megamenu-menu-panel .dropdown-menu > li > a {
    color: inherit;
    background-color: #2F353A;
    text-decoration: none;
}

.megamenu-menu-panel table td:nth-child(1) {
    color: inherit;
    font-weight: bold;
}

.megamenu-menu-panel tbody tr:hover td:nth-child(1) {
    color: white;
}

.modal-footer .btn-default, 
.modal-footer .btn-primary,
.modal-footer .btn-default:not(:hover) {
    border: 1px solid;
    border-color: transparent;
}

.btn-default:hover, .btn-default:focus, .btn-default.focus, .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default {
    color: white;
    border: 1px solid #ddd;
    background-color: inherit;
}

.modal-header {
    border-bottom: 0;
}

.modal-footer {
    border-top: 0;
}

#recent-file-panel tbody tr:nth-child(2n-1) {
    background-color: transparent !important;
}

.megamenu-menu-panel tbody tr:hover td:nth-child(2) {
    color: inherit;
}

.megamenu-menu-panel .btn {
    border: 1px solid #eee;
    background: transparent;
}

.mouse-hover .toolbar-icon.btn:hover,
#w-full.mouse-hover,
#w-pin.mouse-hover {
    background-color: inherit;
}

.typora-node::-webkit-scrollbar {
    width: 5px;
}

.typora-node::-webkit-scrollbar-thumb:vertical {
    background: rgba(250, 250, 250, 0.3);
}

.typora-node::-webkit-scrollbar-thumb:vertical:active {
    background: rgba(250, 250, 250, 0.5);
}

#w-unpin {
    background-color: #4182c4;
}

#top-titlebar, #top-titlebar * {
    color: var(--item-hover-text-color);
}

.typora-sourceview-on #toggle-sourceview-btn,
#footer-word-count:hover,
.ty-show-word-count #footer-word-count {
    background: #333333;
}

#toggle-sourceview-btn:hover {
    color: #eee;
    background: #333333;
}

/** focus mode */
.on-focus-mode .md-end-block:not(.md-focus):not(.md-focus-container) * {
    color: #686868 !important;
}

.on-focus-mode .md-end-block:not(.md-focus) img,
.on-focus-mode .md-task-list-item:not(.md-focus-container)>input {
    opacity: #686868 !important;
}

.on-focus-mode li[cid]:not(.md-focus-container){
    color: #686868;
}

.on-focus-mode .md-fences.md-focus .CodeMirror-code>*:not(.CodeMirror-activeline) *,
.on-focus-mode .CodeMirror.cm-s-inner:not(.CodeMirror-focused) * {
    color: #686868 !important;
}

.on-focus-mode .md-focus,
.on-focus-mode .md-focus-container {
    color: #fff;
}

.on-focus-mode #typora-source .CodeMirror-code>*:not(.CodeMirror-activeline) * {
    color: #686868 !important;
}


/*diagrams*/
#write .md-focus .md-diagram-panel {
    border: 1px solid #ddd;
    margin-left: -1px;
    width: calc(100% + 2px);
}

/*diagrams*/
#write .md-focus.md-fences-with-lineno .md-diagram-panel {
    margin-left: auto;
}

.md-diagram-panel-error {
    color: #f1908e;
}

.active-tab-files #info-panel-tab-file,
.active-tab-files #info-panel-tab-file:hover,
.active-tab-outline #info-panel-tab-outline,
.active-tab-outline #info-panel-tab-outline:hover {
    color: #eee;
}

.sidebar-footer-item:hover,
.footer-item:hover {
    background: inherit;
    color: white;
}

.ty-side-sort-btn.active,
.ty-side-sort-btn:hover,
.selected-folder-menu-item a:after {
    color: white;
}

#sidebar-files-menu {
    border:solid 1px;
    box-shadow: 4px 4px 20px rgba(0, 0, 0, 0.79);
    background-color: var(--bg-color);
}

.file-list-item {
    border-bottom:none;
}

.file-list-item-summary {
    opacity: 1;
}

.file-list-item.active:first-child {
    border-top: none;
}

.file-node-background {
    height: 32px;
}

.file-library-node.active>.file-node-content,
.file-list-item.active {
    color: white;
    color: var(--active-file-text-color);
}

.file-library-node.active>.file-node-background{
    background-color: rgb(34, 34, 34);
    background-color: var(--active-file-bg-color);
}
.file-list-item.active {
    background-color: rgb(34, 34, 34);
    background-color: var(--active-file-bg-color);
}

#ty-tooltip {
    background-color: black;
    color: #eee;
}

.md-task-list-item>input {
    margin-left: -1.3em;
    margin-top: 0.3rem;
    -webkit-appearance: none;
}

.md-mathjax-midline {
    background-color: #57616b;
    border-bottom: none;
}

footer.ty-footer {
    border-color: #656565;
}

.ty-preferences .btn-default {
    background: transparent;
}
.ty-preferences .btn-default:hover {
    background: #57616b;
}

.ty-preferences select {
    border: 1px solid #989698;
    height: 21px;
}

.ty-preferences .nav-group-item.active {
    background: var(--item-hover-bg-color);
}

.ty-preferences input[type="search"] {
    border-color: #333;
    background: #333;
    line-height: 22px;
    border-radius: 6px;
    color: white;
}

.ty-preferences input[type="search"]:focus {
    box-shadow: none;
}

[data-is-directory="true"] .file-node-content {
    margin-bottom: 0;
}

.file-node-title {
    line-height: 22px;
}

.html-for-mac .file-node-open-state, .html-for-mac .file-node-icon {
    line-height: 26px;
}

::-webkit-scrollbar-thumb {
    background: rgba(230, 230, 230, 0.30);
}

::-webkit-scrollbar-thumb:active {
    background: rgba(230, 230, 230, 0.50);
}

#typora-sidebar:hover div.sidebar-content-content::-webkit-scrollbar-thumb:horizontal {
    background: rgba(230, 230, 230, 0.30);
}

.nav-group-item:active {
    background-color: #474d54;
}

.md-search-hit {
    background: rgba(199, 140, 60, 0.81);
    color: #eee;
}

.md-search-hit * {
    color: #eee;
}

#md-searchpanel input {
    color: white;
}





1.连接 SSH 安装宝塔面板&nbsp;2.宝塔面板安装环境, 推荐使用 PHP 7.2、MySQL 5.6、Nginx 1.16&nbsp;3.宝塔面板创建网站, 域名等信息自行填写&nbsp;4.连接 SSH 下载源码&nbsp;xxxxxxxxxxcd /www/wwwroot/你的网站文件夹名&nbsp;xxxxxxxxxxgit clone -b master https://gitlab.com/leeze/metron-for-sspanel.git tmp &amp;&amp; mv tmp/.git . &amp;&amp; rm -rf tmp &amp;&amp; git reset --hard&nbsp;输入 Gitlab 账号,密码&nbsp;5.使用composer安装依赖&nbsp;xxxxxxxxxxgit config core.filemode false &amp;&amp; wget https://getcomposer.org/installer -O composer.phar &amp;&amp; php composer.phar &amp;&amp; php composer.phar install&nbsp;6.复制配置文件 cp config/.config.example.php config/.config.php cp config/.metron_setting.example.php config/.metron_setting.php cp config/appprofile.example.php config/appprofile.php .config.php设置后执行php xcat initQQWry 下载IP解析库 7.php扩展设置 复制扩展文件 cp -r /www/wwwroot/你的网站文件夹名/extension /www/extension 打开 宝塔面版 &gt; 软件商店 &gt; 你安装的PHP &gt; 设置， 在禁用函数一栏删除 system、proc_open、proc_get_status、putenv、pcntl_signal; 配置文件一栏, 在最底下加入xxxxxxxxxxextension=/www/extension/metron-7.1.so注意:根据你的php版本选择,比如你是php7.2版本就填metron-7.2.so, 点击保存后重启PHP目前仅支持 PHP 7.1, 7.2, 7.3 8.网站设置 打开 宝塔面版 &gt; 网站 &gt; 你的网站 在 网站目录 里取消勾选 防跨站攻击，运行目录里面选择 /public，点击保存。 在 伪静态 中填入下面内容，然后保存&nbsp;location / { &nbsp;  try_files $uri /index.php$is_args$args;}9.在SSH里的网站目录下执行，给网站文件755权限&nbsp;xxxxxxxxxxcd ../chmod -R 755 你的文件夹名/chown -R www:www 你的文件夹名/10.数据库操作 首次迁移: 导入网站目录下的sql/metron.sql 文件 将数据库user表里的全部用户的theme列改为metron，使用phpmyadmin执行这条sql语句: UPDATE user SET theme=&#39;metron&#39; 11.自行编辑config文件 .metron_setting.php 中务必设置授权码 (从bot获取)
 .config.php 中设置 $_ENV[&#39;theme&#39;] = &#39;metron&#39;;一、 使用宝塔面板的计划任务配置  ​x首先在 宝塔面板 - 网站 - PHP命令行版本 需要修改成有加载 metron.so 扩展的PHP版本, 如果后续有安装新的PHP, 需要重新修改保存每日任务 (必须)​任务类型：Shell 脚本任务名称：自行填写执行周期：每天 0 小时 0 分钟脚本内容：php /www/wwwroot/你的网站目录/xcat Job DailyJob检测任务 (必须)​任务类型：Shell 脚本任务名称：自行填写执行周期：N分钟 1 分钟脚本内容：php /www/wwwroot/你的网站目录/xcat Job CheckJob每日流量报告 (给开启每日邮件的用户发送邮件)​任务类型：Shell 脚本任务名称：自行填写执行周期：每天 0 小时 0 分钟脚本内容：php /www/wwwroot/你的网站目录/xcat SendDiaryMail审计封禁 (建议设置)​任务类型：Shell 脚本任务名称：自行填写执行周期：N分钟 1 分钟脚本内容：php /www/wwwroot/你的网站目录/xcat DetectBan检测被墙 (可选)​任务类型：Shell 脚本任务名称：自行填写执行周期：N分钟 1 分钟脚本内容：php /www/wwwroot/你的网站目录/xcat DetectGFWRadius (可选) synclogin任务类型：Shell 脚本任务名称：自行填写执行周期：N分钟 1 分钟脚本内容：php /www/wwwroot/你的网站目录/xcat SyncRadius synclogin​syncvpn任务类型：Shell 脚本任务名称：自行填写执行周期：N分钟 1 分钟脚本内容：php /www/wwwroot/你的网站目录/xcat SyncRadius syncvpn​syncnas任务类型：Shell 脚本任务名称：自行填写执行周期：N分钟 1 分钟脚本内容：php /www/wwwroot/你的网站目录/xcat SyncRadius syncnas自动备份 (可选) 整体备份任务类型：Shell 脚本任务名称：自行填写执行周期：自己设置, 可以设置每30分钟左右脚本内容：php /www/wwwroot/你的网站目录/xcat Backup full​只备份核心数据任务类型：Shell 脚本任务名称：自行填写执行周期：自己设置, 可以设置每30分钟左右脚本内容：php /www/wwwroot/你的网站目录/xcat Backup simple财务报表 (可选) 日报任务类型：Shell 脚本任务名称：自行填写执行周期：每天 0 小时 0 分钟脚本内容：php /www/wwwroot/你的网站目录/xcat FinanceMail day​周报任务类型：Shell 脚本任务名称：自行填写执行周期：每星期 周日 0 小时 0 分钟脚本内容：php /www/wwwroot/你的网站目录/xcat FinanceMail week​月报任务类型：Shell 脚本任务名称：自行填写执行周期：每月 1 日 0 小时 0 分钟脚本内容：php /www/wwwroot/你的网站目录/xcat FinanceMail month

]]></description>
    </item>
        <item>
        <title><![CDATA[阿里云/VPS/云主机使用DD命令一键安装RouterOS-ROS系统]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/533857]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Sun, 19 Jul 2020 23:55:08 +0800]]></pubDate>
        <description><![CDATA[阿里云/VPS/云主机使用DD命令一键安装RouterOS-ROS系统




这个ros chr版本支持  Virtio network device，当然也可以是别的网卡型号，
但必需routeros镜像有对应网卡驱动，不然安装后，找不到网卡。centos系统可以通过 pci 命令查看相应的网卡驱动。
1、阿里云环境centos6.9 x64：
内网网卡为eth0
阿里云的linux下硬盘名称为/dev/vda
注意阿里云的安全组建议开放任意协议和端口，任意IP允许访问

2、安装完ROS：chr-6.39.2.img版本
内网网卡为ether1
上面描述的很重要，你要根据你的VPS实际网卡情况，来设定脚本。

wget http://download2.mikrotik.com/routeros/6.39.2/chr-6.39.2.img.zip -O chr.img.zip &amp;&amp; \
gunzip -c chr.img.zip &gt; chr.img &amp;&amp; \
mount -o loop,offset=33554944 chr.img /mnt &amp;&amp; \
ADDRESS0=`ip addr show eth0 | grep global | cut -d' ' -f 6 | head -n 1` &amp;&amp; \
GATEWAY0=`ip route list | grep default | cut -d' ' -f 3` &amp;&amp; \
echo &quot;/ip address add address=$ADDRESS0 interface=[/interface ethernet find where name=ether1]
/ip route add gateway=$GATEWAY0
&quot; &gt; /mnt/rw/autorun.scr &amp;&amp; \
umount /mnt &amp;&amp; \
echo u &gt; /proc/sysrq-trigger &amp;&amp; \
dd if=chr.img bs=1024 of=/dev/vda &amp;&amp; \
reboot

命令说明:
1、wget从ros官方下载CHR镜像到本地目录，并命名为chr.img.zip；
这个版本支持Ethernet controller: Red Hat, Inc. Virtio network device，当然也可以是别的网卡型号，
但必需routeros镜像有对应网卡驱动，不然安装后，找不到网卡。
centos系统可以通过 pci 命令查看相应的网卡驱动。
[root@iZj6c38tf0alwq9klk2aweZ ~]# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Cirrus Logic GD 5446
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:04.0 Communication controller: Red Hat, Inc. Virtio console
00:05.0 SCSI storage controller: Red Hat, Inc. Virtio block device
00:06.0 Unclassified device [00ff]: Red Hat, Inc. Virtio memory balloon 



2、gunzip把chr.img.zip解压为chr.img
3、把chr.img镜像释放到/mnt目录下
4、抓取eth0的IP地址，并赋值参数为ADDRESS0
7、抓取ip route里的默认网关，并赋值参数为GATEWAY0
8、echo后面的为ros里的命令，ROS的内网网卡赋值内网IP，并设置默认网关，
并赋值给/mnt/rw/autorun.scr，这里可以干好多事情，大家自由发挥
9、umount /mnt,卸载已经加载的文件系统/mnt
10、echo u &gt; /proc/sysrq-trigger 立即重新挂载所有的文件系统为只读
11、dd：用指定大小的块拷贝一个文件，并在拷贝的同时进行指定的转换。
if=文件名：输入文件名，缺省为标准输入。即指定源文件。
of=文件名：输出文件名，缺省为标准输出。即指定目的文件。
12、reboot重启机器


阿里云aliyun主机ECS快速安装搭建配置install MikroTik RouterOS/ROS
*以下内容转自https://www.cnblogs.com/itfat/p/8183644.html

*注意阿里云的安全组建议开放任意协议和端口，任意IP允许访问
*今天测试阿里云2C4G的死活失败，但是1C1G就OK。大家注意下。

阿里云环境centos6.9 x64：
内网网卡为eth0
外网网卡为eth1
阿里云的linux下硬盘名称为/dev/vda

安装ROS：chr-6.39.2.img版本
内网网卡为ether1
外网网卡为ether2
上面描述的很重要，你要根据你的VPS实际网卡情况，来设定脚本。

脚本内容：

wget http://download2.mikrotik.com/routeros/6.39.2/chr-6.39.2.img.zip -O chr.img.zip &amp;&amp; \
gunzip -c chr.img.zip &gt; chr.img &amp;&amp; \
mount -o loop,offset=33554944 chr.img /mnt &amp;&amp; \
ADDRESS0=`ip addr show eth0 | grep global | cut -d' ' -f 6 | head -n 1` &amp;&amp; \
ADDRESS1=`ip addr show eth1 | grep global | cut -d' ' -f 6 | head -n 1` &amp;&amp; \
GATEWAY0=`ip route list | grep '10.0.0.0/8' | cut -d' ' -f 3` &amp;&amp; \
GATEWAY1=`ip route list | grep default | cut -d' ' -f 3` &amp;&amp; \
echo &quot;/ip address add address=$ADDRESS0 interface=[/interface ethernet find where name=ether1]
/ip address add address=$ADDRESS1 interface=[/interface ethernet find where name=ether2]
/ip route add dst-address=10.0.0.0/8 gateway=$GATEWAY0
/ip route add dst-address=100.64.0.0/10 gateway=$GATEWAY0
/ip route add dst-address=172.16.0.0/12 gateway=$GATEWAY0
/ip route add gateway=$GATEWAY1
&quot; &gt; /mnt/rw/autorun.scr &amp;&amp; \
umount /mnt &amp;&amp; \
echo u &gt; /proc/sysrq-trigger &amp;&amp; \
dd if=chr.img bs=1024 of=/dev/vda &amp;&amp; \
reboot

命令说明:

1、wget从ros官方下载CHR镜像到本地目录，并命名为chr.img.zip；建议wget下载。自己搭建http下载的地址，比如可以放到阿里云的oss下载路径。
http://lbros.oss-cn-hangzhou.aliyuncs.com
2、gunzip把chr.img.zip解压为chr.img
3、把chr.img镜像释放到/mnt目录下
4、抓取eth0的IP地址，并赋值参数为ADDRESS0
5、抓取eth1的IP地址，并赋值参数为ADDRESS1
6、抓取ip route里的10.0.0.0/8网关，并赋值参数为GATEWAY0
7、抓取ip route里的默认网关，并赋值参数为GATEWAY1
8、echo后面的为ros里的命令，ROS的内网网卡赋值内网IP，外网网卡赋值外网IP，并设置默认网关以及到阿里云的局域网段的网关，阿里云的局域网有三个段分别是10.0.0.0/8,100.64.0.0/10,172.16.0.0/12并赋值给/mnt/rw/autorun.scr，这里可以干好多事情，大家自由发挥
9、umount /mnt,卸载已经加载的文件系统/mnt
10、echo u &gt; /proc/sysrq-trigger 立即重新挂载所有的文件系统为只读
11、dd：用指定大小的块拷贝一个文件，并在拷贝的同时进行指定的转换。
if=文件名：输入文件名，缺省为标准输入。即指定源文件。
of=文件名：输出文件名，缺省为标准输出。即指定目的文件。
12、reboot重启机器]]></description>
    </item>
        <item>
        <title><![CDATA[SSPanel-Uim 限制可选择的加密方式]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/533789]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Sat, 18 Jul 2020 02:41:56 +0800]]></pubDate>
        <description><![CDATA[## 开工
首先通过 DevTools 找到修改加密方式的API /user/method
然后在路由 config/routes.php 中找到 UserController
接下来直接去修改 

app/Controllers/UserController.php 即可 代码 添加在updateMethod里的$user-&gt;method = $method;后即可 以下代码添加前建议适当修改  禁止用户选择非AEAD加密方式  if (!in_array($method, array('aes-128-gcm', 'aes-192-gcm', 'aes-256-gcm', 'chacha20-ietf-poly1305', 'xchacha20-ietf-poly1305'))) {
    $res['ret'] = 0;
    $res['msg'] = '为确保安全，您仅可使用AEAD加密算法，请在以下加密方式中选择：aes-128-gcm， aes-192-gcm， aes-256-gcm， chacha20-ietf-poly1305， xchacha20-ietf-poly1305';
    return $this-&gt;echoJson($response, $res);
}
]]></description>
    </item>
        <item>
        <title><![CDATA[malio授权教程]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/533732]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Wed, 15 Jul 2020 13:10:04 +0800]]></pubDate>
        <description><![CDATA[



















授权说明 · Wiki · Masivro / Malio Theme for SSPANEL · GitLab








//









//



















//


.tour-item.active[data-v-068086ea] {
  background: #f6fafe;
}
.tour-item.active .tour-title[data-v-068086ea] {
  font-weight: bold;
}





//




Skip to content





  
  
  
  
  
  
  









Projects






Your projects
Starred projects
Explore projects









Groups






Your groups
Explore groups










More





Groups

Activity
Milestones
Snippets


Environments
Operations
Security







Projects













This project

New issue
New merge request

GitLab
New project
New group
New snippet















Loading...
























0



0



0







See what's new at GitLab



Help


Support



Keyboard shortcuts
?





Submit feedback


Contribute to GitLab





Switch to GitLab Next













Liuker sun

@kelene



Set status


Profile



Start a Gold trial
🚀



Settings





Help


Support



Submit feedback


Contribute to GitLab





Switch to GitLab Next



Sign out








Toggle navigation













M


Malio Theme for SSPANEL







Project overview



Project overview


Details
Activity
Releases





Repository



Repository


Files
Commits
Branches
Tags
Contributors
Graph
Compare






Issues


37



Issues


37



List


Boards


Labels



Milestones






Merge Requests


0



Merge Requests


0







CI / CD



CI / CD



Pipelines


Jobs


Schedules







Operations



Operations



Metrics



Environments


Error Tracking







Packages &amp; Registries



Packages &amp; Registries


Container Registry






Analytics



Analytics


CI / CD
Repository
Value Stream






Wiki



Wiki






Members



Members





Collapse sidebar


Close sidebar



Activity



Graph


Create a new issue


Jobs


Commits


Issue Boards




















Open sidebar



Masivro Malio Theme for SSPANEL
Wiki


授权说明














Project 'maxitio/malio-theme-for-sspanel' was moved to 'masivro/malio-theme-for-sspanel'. Please update any links and bookmarks that may still have the old path.











授权说明

Last edited by Max
4 months ago



Page history





本主题使用 TG bot (@malio_theme_bot)分发授权文件，请联系 @editXY 将你加入bot的数据库
当你加入bot的数据后，给bot发送 /help 即可获取全部命令。

开始授权
先使用 /add_domain 命令可以绑定一个授权域名
授权域名必须跟浏览器上显示的域名完全一样，不支持泛域名。比如 www.sspanel.com 和 sspanel.com 是两个域名，需要占用两个授权，其他子域名也同理。
然后使用 /getjs 命令可以获取到授权js文件
将js授权文件上传到指定目录👉 /public/theme/malio/js/malio.js （别忘记重命名js文件名为malio.js）

更换域名
先用bot的 /del_domain 命令解绑旧域名 （⚠️每个域名只能绑定一次，解绑后再也无法再次绑定，请谨慎操作）
再通过bot的 /add_domain 命令绑定新域名
然后重新 /getjs 获取包含新域名的js授权文件
将js授权文件上传到指定目录👉 /public/theme/malio/js/malio.js （别忘记重命名js文件名为malio.js）
然后编辑 .malio_config.php 里面的 malio_js_version 的值，随意更改这个值，只要跟之前的字符不一样即可
如果套了CDN的话记得刷新CDN缓存

域名不够用咋办
加钱买额外授权， 150元/个

怎么判断有没有授权成功
当你做完上面的操作后，如果手机访问用户中心页面侧边栏没有收起来的话就是授权没有成功。









Clone repository





Malio 聚合支付接口



Home



malio.js 更新记录



对接 Stripe 支付接口



常见问题解答



授权说明



更新i18n需要做的事情



详细安装教程



邮箱黑名单参考列表























]]></description>
    </item>
        <item>
        <title><![CDATA[malio安装教程]]></title>
		<link><![CDATA[https://shig.wodemo.net/entry/533731]]></link>
		<dc:creator><![CDATA[bright (@shig)]]></dc:creator>
		<pubDate><![CDATA[Wed, 15 Jul 2020 13:08:01 +0800]]></pubDate>
        <description><![CDATA[



















详细安装教程 · Wiki · Masivro / Malio Theme for SSPANEL · GitLab








//









//



















//


.tour-item.active[data-v-068086ea] {
  background: #f6fafe;
}
.tour-item.active .tour-title[data-v-068086ea] {
  font-weight: bold;
}





//




Skip to content





  
  
  
  
  
  
  









Projects






Your projects
Starred projects
Explore projects









Groups






Your groups
Explore groups










More





Groups

Activity
Milestones
Snippets


Environments
Operations
Security







Projects













This project

New issue
New merge request

GitLab
New project
New group
New snippet















Loading...
























0



0



0







See what's new at GitLab



Help


Support



Keyboard shortcuts
?





Submit feedback


Contribute to GitLab





Switch to GitLab Next













Liuker sun

@kelene



Set status


Profile



Start a Gold trial
🚀



Settings





Help


Support



Submit feedback


Contribute to GitLab





Switch to GitLab Next



Sign out








Toggle navigation













M


Malio Theme for SSPANEL







Project overview



Project overview


Details
Activity
Releases





Repository



Repository


Files
Commits
Branches
Tags
Contributors
Graph
Compare






Issues


37



Issues


37



List


Boards


Labels



Milestones






Merge Requests


0



Merge Requests


0







CI / CD



CI / CD



Pipelines


Jobs


Schedules







Operations



Operations



Metrics



Environments


Error Tracking







Packages &amp; Registries



Packages &amp; Registries


Container Registry






Analytics



Analytics


CI / CD
Repository
Value Stream






Wiki



Wiki






Members



Members





Collapse sidebar


Close sidebar



Activity



Graph


Create a new issue


Jobs


Commits


Issue Boards




















Open sidebar



Masivro Malio Theme for SSPANEL
Wiki


详细安装教程














Project 'maxitio/malio-theme-for-sspanel' was moved to 'masivro/malio-theme-for-sspanel'. Please update any links and bookmarks that may still have the old path.











详细安装教程

Last edited by Max
4 months ago



Page history






安装宝塔面板
使用SSH登录你的VPS，根据你VPS的系统选择下面的安装命令
宝塔面板 Centos 一键安装脚本👇
yum install -y wget &amp;&amp; wget -O install.sh http://download.bt.cn/install/install_6.0.sh &amp;&amp; sh install.sh
宝塔面板 Ubuntu/Debian 一键安装脚本👇
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh &amp;&amp; sudo bash install.sh
输入 y 回车安装
执行完毕后，会显示类似下面的宝塔面板的登录信息，请保存好此信息
Bt-Panel: http://xxx.xxx.xx.xx:8888/xxxxxxx
username: xxxxxxx
password: xxxxxxxx

安装LNMP
登录宝塔面板后，宝塔面板会提示你安装 PHP, MySQL, Nginx 等环境。
推荐使用 PHP 7.1、MySQL 5.6、Nginx任意版本。
需要一段时间才能安装完成，请等待完成。

配置PHP
打开 宝塔面版 &gt; 软件商店 &gt; 你安装的PHP &gt; 设置，在禁用函数一栏删除 system、proc_open、proc_get_status、putenv、pcntl_signal。

安装Malio主题
打开 宝塔面版 &gt; 网站 &gt; 添加站点，输入你的域名，点击提交

在SSH里执行下面命令👇👇👇
下载SSPANEL+Malio的代码。如果你的这个网站文件夹包含原版的SSPANEL代码，请删除原版SSPANEL代码或者换个目录
cd /www/wwwroot/你的网站文件夹名
git clone -b malio https://gitlab.com/maxitio/malio-theme-for-sspanel.git tmp &amp;&amp; mv tmp/.git . &amp;&amp; rm -rf tmp &amp;&amp; git reset --hard
然后Git会要求你输入Gitlab的账号密码
使用composer安装依赖
wget https://getcomposer.org/installer -O composer.phar
php composer.phar
php composer.phar install
用composer安装依赖时如果内存不够的话，可以使用 宝塔面版 &gt; 首页 &gt; Linux工具箱 &gt; Swap/虚拟内存 增加虚拟内存
复制配置文件
cp config/.malio_config.example.php config/.malio_config.php
cp config/.config.example.php config/.config.php
cp config/.i18n.example.php config/.i18n.php

打开 宝塔面版 &gt; 网站 &gt; 你的网站
在 网站目录 里取消勾选 防跨站攻击，运行目录里面选择 /public，点击保存。
在 伪静态 中填入下面内容，然后保存
location / {
    try_files $uri /index.php$is_args$args;
}

在SSH里的网站目录下执行，给网站文件755权限
cd ../
chmod -R 755 你的文件夹名/
chown -R www:www 你的文件夹名/

数据库操作
打开 宝塔面版 &gt; 数据库，选择添加数据库，数据库名字和用户名任意写，密码建议使用随机生成的密码，点击提交即可添加数据库
点击数据库名字旁边的 导入 &gt; 本地上传，即可上传并导入sql文件到数据库
如果你是全新安装面板，请上传并导入网站目录下的 /sql/glzjin_all.sql、/sql/malio_all.sql
如果你是从其他主题迁移到Malio主题，请上传并导入网站目录下的 /sql/malio_all.sql、/sql/user_subscribe_log.sql、/sql/detect_ban_log.sql
如果没有导入 /sql/malio_all.sql 的话会导致无法注册新用户
将数据库user表里的全部用户的theme列改为malio，使用phpmyadmin执行这条sql语句👉 UPDATE user SET theme='malio'

编辑 config.php
将你的数据库名字，用户名和密码填入.config.php里，类似下面这样
$_ENV['db_database'] = 'sspanel';			//数据库名
$_ENV['db_username'] = 'sspanel';		//数据库用户名
$_ENV['db_password'] = 'sspanel_password';			//用户名对应的密码

其他操作
在SSH里的网站目录下执行 php xcat createAdmin，即可创建管理员用户。（如果你已经有了管理员用户就不用创建了）
在SSH里的网站目录下执行 php xcat initQQWry ，即可下载IP数据库（必须要执行这个）
下载通知频道里的 GeoLite2-City.mmdb 文件放入网站目录下的 /storage/ 目录下
为Crisp和Chatra的跨设备恢复会话功能生成UUID，在SSH里网站目录下执行👉 php xcat GenerateUUIDforAllUsers

配置定时任务
执行 crontab -e 命令，添加以下：
0 0 * * * php -n /www/wwwroot/你的文件夹名/xcat dailyjob
*/1 * * * * php /www/wwwroot/你的文件夹名/xcat checkjob
*/1 * * * * php /www/wwwroot/你的文件夹名/xcat syncnode

客户端下载
客户端的安装包需要自行下载到 /public/client-download/ 目录，安装包名字参考同目录下的 apps.txt 文件
另外在此目录下还提供了 download.sh 脚本，可自动下载部分客户端。

请仔细阅读 .malio_config.php 和 .config.php 的全部注释，进一步了解SSPANEL

本教程已经写得很详细了，安装还出问题的话请自行解决，或者联系我付费解决

继续看 授权说明👉

参考：sspanel 原版安装教程









Clone repository





Malio 聚合支付接口



Home



malio.js 更新记录



对接 Stripe 支付接口



常见问题解答



授权说明



更新i18n需要做的事情



详细安装教程



邮箱黑名单参考列表























]]></description>
    </item>
    </channel>
</rss>
