diff --git a/docusaurus.config.js b/docusaurus.config.js
index 989e3213..f5a52730 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -45,7 +45,11 @@ const config = {
//lastVersion: versions[0],
versions: {
current: {
- label: `6.0 (Unstable) 🚧`,
+ label: `7.0 (Unstable) 🚧`,
+ path: 'v7',
+ },
+ '6.0': {
+ label: '6.0 (Alpha) 🚀',
path: 'v6',
},
'5.0': {
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0.json b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0.json
new file mode 100644
index 00000000..38ea900f
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0.json
@@ -0,0 +1,26 @@
+{
+ "sidebar.docsSidebar.category.Getting Started": {
+ "message": "起步"
+ },
+ "sidebar.docsSidebar.category.Main Protocols": {
+ "message": "核心协议"
+ },
+ "sidebar.docsSidebar.category.Main Features": {
+ "message": "核心功能"
+ },
+ "sidebar.docsSidebar.category.OpenAPI": {
+ "message": "开放接口"
+ },
+ "sidebar.docsSidebar.category.Clusters": {
+ "message": "集群"
+ },
+ "sidebar.docsSidebar.category.DevOps": {
+ "message": "运维"
+ },
+ "sidebar.docsSidebar.category.Advanced Guides": {
+ "message": "高级指引"
+ },
+ "sidebar.docsSidebar.category.Others": {
+ "message": "其他"
+ }
+}
\ No newline at end of file
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/arm.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/arm.md
new file mode 100644
index 00000000..d692f1eb
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/arm.md
@@ -0,0 +1,245 @@
+---
+title: ARM and CrossBuild
+sidebar_label: ARM和交叉编译
+hide_title: false
+hide_table_of_contents: false
+---
+
+# SRS for linux-arm
+
+注意:一般情况下,直接在ARM
下是可以编译SRS的,参考官网正常的编译方法就可以,不需要交叉编译。
+
+!!! 注意,请先确认是否需要交叉编译
,一般可以直接编译,除非极少数情况。
+
+> 翁晓晶:看来很多人误解了交叉编译的意思了,异构平台编译才要,比如编译平台跟运行平台是异构的,才需要,都是同一个平台不需要。
+
+> 翁晓晶:最常见的场景就是玩网络设备的,因为网络设备的u都很弱,编译很慢,所以才在pc上做交叉编译,因为pc的u是x86,网络设备的u基本上都是mips或者arm的低频率的,属于异构,x86的u编译速度明显快于它们,所以大家都在pc上做交叉编译,然后把结果拷贝进网络设备,这样编译速度快很多,当然你有时间也可以直接在网络设备上正常编译也是可以的,就是慢很多。
+
+> 翁晓晶:我看到有个朋友提到arm的服务器比如鲲鹏,那就直接在arm的服务器上编译就好了,没必要再交叉编译了,arm服务器又不是网络设备,U编译个程序还是没问题的,不要走弯路了。
+
+## Why run SRS on ARM?
+
+ARM跑SRS主要原因:
+
+* ARM服务器越来越多了,可以直接编译和运行SRS,参考 [#1282](https://github.com/ossrs/srs/issues/1282#issue-386077124)。
+* ARM嵌入式设备上用SRS,会比较难,但可以交叉编译,参考 [#1547](https://github.com/ossrs/srs/issues/1547#issue-543780097)。
+
+## RaspberryPi
+
+SRS可以直接在`RespberryPI`上编译和运行,不用交叉编译。参考 [#1282](https://github.com/ossrs/srs/issues/1282#issue-386077124)。
+
+
+
+## ARM Server: armv7, armv8(aarch64)
+
+SRS可以直接在ARM Server上编译和运行,不用交叉编译。参考 [#1282](https://github.com/ossrs/srs/issues/1282#issue-386077124)。
+
+```
+./configure && make
+```
+
+如果想编译出arm的二进制,在arm服务器上运行,比如在mac上编译出二进制后放在鲲鹏服务器上跑,也可以用arm docker编译,参考[aarch64](https://github.com/ossrs/dev-docker/tree/aarch64#usage)。
+
+```
+docker run -it --rm -v `pwd`:/srs -w /srs ossrs/srs:aarch64 \
+ bash -c "./configure && make"
+```
+
+对于龙芯和鲲鹏等armv8平台,可能无法识别出来CPU,可以指定为armv8,参考[#1282](https://github.com/ossrs/srs/issues/1282#issuecomment-568891854):
+
+```bash
+./configure --extra-flags='-D__aarch64__' && make
+```
+
+直接运行SRS:
+
+```
+./objs/srs -c conf/console.conf
+```
+
+推流到这个docker:
+
+```
+ffmpeg -re -i doc/source.flv -c copy -f flv rtmp://127.0.0.1:1935/live/livestream
+```
+
+播放:[http://localhost:8080/live/livestream.flv](http://localhost:8080/players/srs_player.html?autostart=true&stream=livestream.flv&port=8080&schema=http)
+
+![image](https://user-images.githubusercontent.com/2777660/72774670-7108c980-3c46-11ea-9e8b-d4fb3a475ea2.png)
+
+
+
+## Ubuntu Cross Build SRS: ARMv8(aarch64)
+
+!!! 注意,请先确认是否需要交叉编译,一般可以直接编译,除非极少数情况,参考[#1547](https://github.com/ossrs/srs/issues/1547#issue-543780097)。
+
+启动容器Ubuntu20(xenial),主目录为SRS:
+
+```
+cd ~/git/srs/trunk
+docker run --rm -it -v `pwd`:/srs -w /srs \
+ registry.cn-hangzhou.aliyuncs.com/ossrs/srs:ubuntu20 bash
+```
+
+> 推荐使用阿里云的容器,下载的速度比较快,也可以使用docker官方容器:`ossrs/srs:ubuntu20`
+
+安装toolchain(容器已经安装好了):
+
+```
+apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
+```
+
+交叉编译SRS:
+
+```
+./configure --cross-build --cross-prefix=aarch64-linux-gnu-
+make
+```
+
+> 编译时,默认会重新交叉编译OpenSSL,而不会使用系统的SSL,如果需要强制使用系统的SSL,可以用`--use-sys-ssl`。
+
+> 若编译时无法识别出aarch64,可以在configure时加编译选项`--extra-flags='-D__aarch64__'`,一般没有这个问题。
+
+在ARMv8(aarch64)的docker上跑SRS:https://hub.docker.com/r/arm64v8/ubuntu
+
+```
+cd ~/git/srs/trunk && docker run --rm -it -v `pwd`:/srs -w /srs \
+ -p 1935:1935 -p 1985:1985 -p 8080:8080 arm64v8/ubuntu \
+ ./objs/srs -c conf/console.conf
+```
+
+推流到这个docker:
+
+```
+ffmpeg -re -i doc/source.flv -c copy -f flv rtmp://127.0.0.1:1935/live/livestream
+```
+
+播放:[http://localhost:8080/live/livestream.flv](http://localhost:8080/players/srs_player.html?autostart=true&stream=livestream.flv&port=8080&schema=http)
+
+## Ubuntu Cross Build SRS: ARMv7
+
+!!! 注意,请先确认是否需要交叉编译,一般可以直接编译,除非极少数情况,参考[#1547](https://github.com/ossrs/srs/issues/1547#issue-543780097)。
+
+启动容器Ubuntu20(xenial),主目录为SRS:
+
+```
+cd ~/git/srs/trunk
+docker run --rm -it -v `pwd`:/srs -w /srs \
+ registry.cn-hangzhou.aliyuncs.com/ossrs/srs:ubuntu20 bash
+```
+
+> 推荐使用阿里云的容器,下载的速度比较快,也可以使用docker官方容器:`ossrs/srs:ubuntu20`
+
+安装toolchain(容器已经安装好了),例如[Acqua or RoadRunner board](https://www.acmesystems.it/arm9_toolchain)
+
+```
+apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
+```
+
+交叉编译SRS:
+
+```
+./configure --cross-build --cross-prefix=arm-linux-gnueabihf-
+make
+```
+
+> 编译时,默认会重新交叉编译OpenSSL,而不会使用系统的SSL,如果需要强制使用系统的SSL,可以用`--use-sys-ssl`。
+
+在ARMv7的docker上跑SRS:https://hub.docker.com/r/armv7/armhf-ubuntu
+
+```
+cd ~/git/srs/trunk && docker run --rm -it -v `pwd`:/srs -w /srs \
+ -p 1935:1935 -p 1985:1985 -p 8080:8080 armv7/armhf-ubuntu \
+ ./objs/srs -c conf/console.conf
+```
+
+推流到这个docker:
+
+```
+ffmpeg -re -i doc/source.flv -c copy -f flv rtmp://127.0.0.1:1935/live/livestream
+```
+
+播放:[http://localhost:8080/live/livestream.flv](http://localhost:8080/players/srs_player.html?autostart=true&stream=livestream.flv&port=8080&schema=http)
+
+## Ubuntu Cross Build SRS: ARMv7(hisiv500)
+
+首先,找一台Ubuntu20的虚拟机,或者启动Docker:
+
+```bash
+docker run --rm -it -v $(pwd):/srs -w /srs/trunk \
+ registry.cn-hangzhou.aliyuncs.com/ossrs/srs:ubuntu20 bash
+```
+
+宿主机是64位的,而编译工具是32位的,所以需要安装一个工具:
+
+```bash
+apt-get -y install lib32z1-dev
+```
+
+然后,从[海思](https://www.hisilicon.com/)下载交叉编译工具,或者从网上找地方下载。解压后安装:
+
+```bash
+chmod +x arm-hisiv500-linux.install
+./arm-hisiv500-linux.install
+source /etc/profile
+```
+
+验证环境, 执行`which arm-hisiv500-linux-g++`能成功找到编译器,就安装成功了:
+
+```bash
+which arm-hisiv500-linux-g++
+# /opt/hisi-linux/x86-arm/arm-hisiv500-linux/target/bin/arm-hisiv500-linux-g++
+```
+
+编译SRS,命令如下:
+
+```bash
+./configure --cross-build --cross-prefix=arm-hisiv500-linux-
+make
+```
+
+在海思的板子启动SRS就可以了:
+
+```bash
+./objs/srs -c conf/console.conf
+```
+
+## Use Other Cross build tools
+
+!!! 注意,请先确认是否需要交叉编译,一般可以直接编译,除非极少数情况,参考[#1547](https://github.com/ossrs/srs/issues/1547#issue-543780097)。
+
+SRS相关的参数如下:
+
+```bash
+./configure -h
+
+Presets:
+ --cross-build Enable cross-build, please set bellow Toolchain also. Default: off
+
+Cross Build options: @see https://ossrs.net/lts/zh-cn/docs/v6/doc/arm#ubuntu-cross-build-srs
+ --cpu= Toolchain: Select the minimum required CPU. For example: --cpu=24kc
+ --arch= Toolchain: Select architecture. For example: --arch=aarch64
+ --host= Toolchain: Build programs to run on HOST. For example: --host=aarch64-linux-gnu
+ --cross-prefix= Toolchain: Use PREFIX for tools. For example: --cross-prefix=aarch64-linux-gnu-
+
+Toolchain options:
+ --static=on|off Whether add '-static' to link options. Default: off
+ --cc= Toolchain: Use c compiler CC. Default: gcc
+ --cxx= Toolchain: Use c++ compiler CXX. Default: g++
+ --ar= Toolchain: Use archive tool AR. Default: g++
+ --ld= Toolchain: Use linker tool LD. Default: g++
+ --randlib= Toolchain: Use randlib tool RANDLIB. Default: g++
+ --extra-flags= Set EFLAGS as CFLAGS and CXXFLAGS. Also passed to ST as EXTRA_CFLAGS.
+```
+
+具体使用例子参考[这里](#ubuntu-cross-build-srs)
+
+**--extra-flags**
+
+之前在支持ARM时,新增过一个Flags的选项( https://github.com/ossrs/srs/issues/1282#issuecomment-568891854 ),会设置`CFLAGS and CXXFLAGS`,也会将这个设置传递到ST设置`EXTRA_CFLAGS`。同样,对于交叉编译,这个选项也是有效的。
+
+Winlin 2014.2
+
+![](https://ossrs.net/gif/v1/sls.gif?site=ossrs.net&path=/lts/doc/zh/v6/arm)
+
+
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/client-sdk.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/client-sdk.md
new file mode 100644
index 00000000..8e9d2746
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/client-sdk.md
@@ -0,0 +1,52 @@
+---
+title: Client SDK
+sidebar_label: Client SDK
+hide_title: false
+hide_table_of_contents: false
+---
+
+# Client SDK
+
+整个直播的业务架构是:
+
+```
++---------+ +-----------------+ +---------+
+| Encoder +-->---+ SRS/CDN Network +--->---+ Player |
++---------+ +-----------------+ +---------+
+```
+
+## EXOPlayer
+
+[EXOPlayer](https://github.com/google/ExoPlayer)是基于Android新的播放器框架的新播放器,支持众多的协议,包括HTTP-FLV和HLS。虽然不支持RTMP,但是支持FLV,因此延迟可以比HLS低很多。
+
+## IJKPlayer
+
+[ijkplayer](https://github.com/Bilibili/ijkplayer)是[B站](http://www.bilibili.com/)出的一个播放器,基于FFMPEG软件解码,可以在Android和iOS上用。
+
+## FFmpeg
+
+[FFmpeg](https://ffmpeg.org) is a complete, cross-platform solution to record, convert and stream audio and video.
+
+## WebRTC
+
+[WebRTC](https://webrtc.org/) is Real-time communication for the web.
+
+## LIBRTMP
+
+[LIBRTMP](https://github.com/ossrs/librtmp)或者[SRS-LIBRTMP](https://github.com/ossrs/srs-librtmp),只是提供了Transport(RTMP)的功能,用于只需要做传输的场景,比如一些安防摄像头厂商,Transport之前是用RTSP/RTP做的,如果需要接入互联网,将流送到CDN给PC和移动端观看,直接使用H5或者Flash,不需要装插件时,可以用librtmp将已经编码的流MUX成FLV(RTMP传输实际上用的是FLV格式),然后通过librtmp发送出去。
+
+## PC
+
+有些应用场景,还是会用PC端推流,当然是用[OBS](https://obsproject.com/)。
+
+> 注意:OBS推流时,流名称的翻译有问题,**流名称**是要写在**流密钥**这里的,如下图所示。
+
+![OBS](/img/doc-integration-client-sdk-001.png)
+
+![OBS](/img/doc-integration-client-sdk-002.png)
+
+Winlin 2017.4
+
+![](https://ossrs.net/gif/v1/sls.gif?site=ossrs.net&path=/lts/doc/zh/v6/client-sdk)
+
+
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/cloud.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/cloud.md
new file mode 100644
index 00000000..ccb23c6f
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/cloud.md
@@ -0,0 +1,12 @@
+---
+title: Cloud
+sidebar_label: 云服务
+hide_title: false
+hide_table_of_contents: false
+---
+
+# Docker
+
+迁移到了[Cloud](/cloud)
+
+![](https://ossrs.net/gif/v1/sls.gif?site=ossrs.net&path=/lts/doc/zh/v6/cloud)
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/delivery-hds.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/delivery-hds.md
new file mode 100644
index 00000000..2bc34341
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/delivery-hds.md
@@ -0,0 +1,61 @@
+---
+title: HDS 分发
+sidebar_label: HDS 分发
+hide_title: false
+hide_table_of_contents: false
+---
+
+# HDS 分发
+
+HDS指Adobe的Http Dynamic Stream,和Apple的[HLS](./hls.md)类似。
+
+HDS规范参考:http://www.adobe.com/devnet/hds.html
+
+## Build
+
+编译SRS时可以打开或者关闭HDS,详细参考:[Build](./install.md)
+
+```
+./configure --hds=on
+```
+
+## Player
+
+Adobe的HDS可以在Flash播放器中,使用[OSMF播放器](http://www.ossrs.net/players/osmf.html)打开。
+
+输入地址:`http://ossrs.net:8081/live/livestream.f4m`
+
+## HDS Config
+
+conf/full.conf中hds.srs.com是HDS的配置实例:
+
+```
+vhost __defaultVhost__ {
+ hds {
+ # whether hds enabled
+ # default: off
+ enabled on;
+ # the hds fragment in seconds.
+ # default: 10
+ hds_fragment 10;
+ # the hds window in seconds, erase the segment when exceed the window.
+ # default: 60
+ hds_window 60;
+ # the path to store the hds files.
+ # default: ./objs/nginx/html
+ hds_path ./objs/nginx/html;
+ }
+}
+```
+
+配置项的意义和HLS类似,参考[HLS config](./hls.md#hls-config)
+
+## Why HDS
+
+为何SRS要在SRS2引入HDS?主要是SRS的HTTP服务器重写,以及文杰哥对于HDS很熟悉。另外,加入HDS不会对SRS现有结构有影响。
+
+Winlin 2015.3
+
+![](https://ossrs.net/gif/v1/sls.gif?site=ossrs.net&path=/lts/doc/zh/v6/delivery-hds)
+
+
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/delivery-hls.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/delivery-hls.md
new file mode 100644
index 00000000..0d8e3449
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/delivery-hls.md
@@ -0,0 +1,14 @@
+---
+title: HLS 分发
+sidebar_label: HLS 分发
+hide_title: false
+hide_table_of_contents: false
+---
+
+# HLS 分发
+
+迁移到了[HLS](./hls.md).
+
+![](https://ossrs.net/gif/v1/sls.gif?site=ossrs.net&path=/lts/doc/zh/v6/delivery-hls)
+
+
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/delivery-http-flv.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/delivery-http-flv.md
new file mode 100644
index 00000000..cf358762
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/delivery-http-flv.md
@@ -0,0 +1,14 @@
+---
+title: HTTP-FLV 分发
+sidebar_label: HTTP-FLV 分发
+hide_title: false
+hide_table_of_contents: false
+---
+
+# HTTP FLV 分发
+
+迁移到了[HTTP-FLV](./flv.md).
+
+![](https://ossrs.net/gif/v1/sls.gif?site=ossrs.net&path=/lts/doc/zh/v6/delivery-http-flv)
+
+
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/delivery-rtmp.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/delivery-rtmp.md
new file mode 100644
index 00000000..51814721
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/delivery-rtmp.md
@@ -0,0 +1,14 @@
+---
+title: RTMP 分发
+sidebar_label: RTMP 分发
+hide_title: false
+hide_table_of_contents: false
+---
+
+# RTMP Delivery
+
+迁移到了[RTMP](./rtmp.md).
+
+![](https://ossrs.net/gif/v1/sls.gif?site=ossrs.net&path=/lts/doc/zh/v6/delivery-rtmp)
+
+
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/drm.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/drm.md
new file mode 100644
index 00000000..45432171
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/drm.md
@@ -0,0 +1,136 @@
+---
+title: DRM防盗链
+sidebar_label: DRM防盗链
+hide_title: false
+hide_table_of_contents: false
+---
+
+# DRM
+
+DRM重要的功能就是防盗链,只有允许的用户,才能访问服务器的流。有多种DRM的方式:
+* referer防盗链:检查用户从哪个网站过来的。譬如不是从公司的页面过来的人都不让看。
+* token防盗链:用户在播放时,必须先申请token,SRS会回调http检查这个token合法性。
+* FMS token tranverse:边缘RTMP服务器收到每个连接,都去上行节点验证,即token穿越认证。
+* Access服务器:专门的access服务器负责DRM。譬如adobe的access服务器。
+* 推流认证:adobe的RTMP推流时,支持几种认证方式,这个也可以归于防盗链概念。
+
+
+
+
+## Referer Anti-suck
+
+SRS支持referer防盗链,adobe的flash在播放RTMP流时,会把页面的http url放在请求中,
+as客户端代码不可以更改。当然如果用自己的客户端,不用flash播放流,就可以随意伪造了;
+尽管如此,referer防盗链还是能防住相当一部分盗链。
+
+配置Referer防盗链,在vhost中开启referer即可,可以指定publish和play的referer:
+
+```bash
+# the vhost for anti-suck.
+vhost refer.anti_suck.com {
+ # refer hotlink-denial.
+ refer {
+ # whether enable the refer hotlink-denial.
+ # default: off.
+ enabled on;
+ # the common refer for play and publish.
+ # if the page url of client not in the refer, access denied.
+ # if not specified this field, allow all.
+ # default: not specified.
+ all github.com github.io;
+ # refer for publish clients specified.
+ # the common refer is not overrided by this.
+ # if not specified this field, allow all.
+ # default: not specified.
+ publish github.com github.io;
+ # refer for play clients specified.
+ # the common refer is not overrided by this.
+ # if not specified this field, allow all.
+ # default: not specified.
+ play github.com github.io;
+ }
+}
+```
+
+> Remark: SRS1/2的Referer配置方法和SRS3不一致,SRS3兼容SRS1/2的配置方法。
+
+支持Referer防盗链的协议包括:
+
+* RTMP:推流和拉流。
+
+## Token Authentication
+
+token类似于referer,不过是放在URL中,在请求参数中,譬如:
+
+```
+rtmp://vhost/app/stream?token=xxxx
+http://vhost/app/stream.flv?token=xxxx
+http://vhost/app/stream.m3u8?token=xxxx
+http://vhost/rtc/v1/whip/?app=live&stream=livestream&token=xxx
+http://vhost/rtc/v1/whep/?app=live&stream=livestream&token=xxx
+```
+
+这样服务器在`on_publish`或`on_play`回调接口中, 就会把url带过去验证。参考:[HTTP callback](./http-callback.md)
+
+token比referer更强悍,可以指定超时时间,可以变更token之类。可惜就是需要服务器端做定制,做验证。
+SRS提供http回调来做验证,已经有人用这种方式做了,比较简单靠谱。
+
+举个常用的token认证的例子:
+
+1. 用户在web页面登录,服务器可以生成一个token,譬如:`token=md5(time+id+私钥+有效期)=88195f8943e5c944066725df2b1706f8`
+1. 服务器返回给用户一个地址,带token,譬如:`rtmp://192.168.1.10/live/livestream?time=1402307089&expire=3600&token=88195f8943e5c944066725df2b1706f8`
+1. 配置srs的http回调,`on_publish http://127.0.0.1:8085/api/v1/streams;` ,参考:[HTTP callback](./http-callback.md#config-srs)
+1. 用户推流时,srs会回调那个地址,解析请求的内容,里面的params就有那些认证信息。
+1. 按同样的算法验证,如果md5变了就返回错误,srs就会拒绝连接。如果返回0就会接受连接。
+
+> Note: 这是验证推流的,也可以验证播放。
+
+## TokenTraverse
+
+Token防盗链的穿越,指的是在origin-edge集群中,客户播放edge边缘服务器的流时,
+边缘将认证的token发送给源站进行验证,即token穿越。
+
+FMS的edge和FMS的origin使用私有协议,使用一个连接回源取数据,一个连接回源传输控制命令,
+譬如token穿越就是在这个连接做的。参考:https://github.com/ossrs/srs/issues/104
+
+token认证建议使用http方式,也就是说客户端连接到边缘时,边缘使用http回调方式验证token。
+像fms那种token穿越,是需要走RTMP协议,其他开源服务器一般都不支持这种方式(中国特色)。
+
+SRS可以支持类似fms的token穿越,不过实现方式稍微有区别,不是采用fms edge的私有协议,
+而是每次新开一个连接回源验证,验证通过后边缘才提供服务。也就是边缘先做一个完全的代理。
+
+SRS这种方式的特点是:
+* 在token认证上,能和fms源站对接,fms源站感觉不到什么区别。
+* 每次边缘都会新开连接去验证,开销会大一些;而且只限于connect事件验证,马上验证过后就会收到disconnect事件。
+* 会导致源站的短连接过多(连接验证token,断开),不过可以加一层fms edge解决,这样比所有都是fms edge要好。
+
+对于源站短连接过多的问题,可以加一层fms边缘缓解,假设1000个客户端连接到边缘:
+* srs => 客户fms 这种方案,会有1000个连接去回源验证,然后断开。
+* srs => cdn-fms => 客户fms 这种方案,会有1000个连接去cdn的fms去验证,只有1个连接去客户那边验证。
+
+SRS的token穿越(traverse)的配置,参考`edge.token.traverse.conf`:
+
+```bash
+listen 1935;
+vhost __defaultVhost__ {
+ cluster {
+ mode remote;
+ origin 127.0.0.1:19350;
+ token_traverse on;
+ }
+}
+```
+
+## Access服务器
+
+SRS暂时不支持。
+
+## 推流认证
+
+SRS暂时不支持,是RTMP特殊的握手协议。
+
+Winlin 2015.8
+
+![](https://ossrs.net/gif/v1/sls.gif?site=ossrs.net&path=/lts/doc/zh/v6/drm)
+
+
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/dvr.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/dvr.md
new file mode 100644
index 00000000..e1b4cc54
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/dvr.md
@@ -0,0 +1,266 @@
+---
+title: DVR
+sidebar_label: DVR
+hide_title: false
+hide_table_of_contents: false
+---
+
+# DVR
+
+SRS支持将RTMP流录制成FLV或MP4文件。下面的描述以FLV为例,但是对MP4也是一样的。
+
+当 FFmpeg/OBS 将 RTMP 流发布到 SRS 时,SRS 将把流写入 FLV/MP4 文件。工作流程是:
+
+```text
++------------+ +-------+ +---------------+
++ FFmpeg/OBS +---RTMP-->--+ SRS +---DVR-->--+ FLV/MP4 File +
++------------+ +-------+ +---------------+
+```
+
+许多用户希望 DVR 提供更多功能,请考虑使用 [Oryx](./getting-started-oryx.md#dvr) 替代, 例如:
+
+* Oryx 支持 S3 云存储,将最终的 MP4 文件移动到 S3 云存储。
+* Oryx 支持全局过滤器,仅记录指定的流,而不是所有流。
+* Oryx 支持将多个发布会话合并到一个 MP4 文件中。
+
+实际上,DVR 功能可能非常复杂,SRS 只支持基本的 DVR 功能,而 Oryx 将继续改进 DVR 功能。
+
+## Build
+
+DVR作为SRS3的核心功能,永远开启DVR。
+
+参考:[Build](./install.md)
+
+## Config
+
+DVR的难点在于写入flv和文件命名,SRS的做法是随机生成文件名,用户可以使用http-callback方式,使用外部程序记录这个文件名,或者改成自己要的文件命名方式。
+
+当然也可以修改SRS代码,这种做法不推荐,c操作文件名比较麻烦。还是用外部辅助系统做会很方便。
+
+DVR的配置文件说明:
+
+```bash
+vhost your_vhost {
+ # DVR RTMP stream to file,
+ # start to record to file when encoder publish,
+ # reap flv/mp4 according by specified dvr_plan.
+ dvr {
+ # whether enabled dvr features
+ # default: off
+ enabled on;
+ # the filter for dvr to apply to.
+ # all, dvr all streams of all apps.
+ # /, apply to specified stream of app.
+ # for example, to dvr the following two streams:
+ # live/stream1 live/stream2
+ # default: all
+ dvr_apply all;
+ # the dvr plan. canbe:
+ # session reap flv/mp4 when session end(unpublish).
+ # segment reap flv/mp4 when flv duration exceed the specified dvr_duration.
+ # @remark The plan append is removed in SRS3+, for it's no use.
+ # default: session
+ dvr_plan session;
+ # the dvr output path, *.flv or *.mp4.
+ # we supports some variables to generate the filename.
+ # [vhost], the vhost of stream.
+ # [app], the app of stream.
+ # [stream], the stream name of stream.
+ # [2006], replace this const to current year.
+ # [01], replace this const to current month.
+ # [02], replace this const to current date.
+ # [15], replace this const to current hour.
+ # [04], replace this const to current minute.
+ # [05], replace this const to current second.
+ # [999], replace this const to current millisecond.
+ # [timestamp],replace this const to current UNIX timestamp in ms.
+ # @remark we use golang time format "2006-01-02 15:04:05.999" as "[2006]-[01]-[02]_[15].[04].[05]_[999]"
+ # for example, for url rtmp://ossrs.net/live/livestream and time 2015-01-03 10:57:30.776
+ # 1. No variables, the rule of SRS1.0(auto add [stream].[timestamp].flv as filename):
+ # dvr_path ./objs/nginx/html;
+ # =>
+ # dvr_path ./objs/nginx/html/live/livestream.1420254068776.flv;
+ # 2. Use stream and date as dir name, time as filename:
+ # dvr_path /data/[vhost]/[app]/[stream]/[2006]/[01]/[02]/[15].[04].[05].[999].flv;
+ # =>
+ # dvr_path /data/ossrs.net/live/livestream/2015/01/03/10.57.30.776.flv;
+ # 3. Use stream and year/month as dir name, date and time as filename:
+ # dvr_path /data/[vhost]/[app]/[stream]/[2006]/[01]/[02]-[15].[04].[05].[999].flv;
+ # =>
+ # dvr_path /data/ossrs.net/live/livestream/2015/01/03-10.57.30.776.flv;
+ # 4. Use vhost/app and year/month as dir name, stream/date/time as filename:
+ # dvr_path /data/[vhost]/[app]/[2006]/[01]/[stream]-[02]-[15].[04].[05].[999].flv;
+ # =>
+ # dvr_path /data/ossrs.net/live/2015/01/livestream-03-10.57.30.776.flv;
+ # 5. DVR to mp4:
+ # dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].mp4;
+ # =>
+ # dvr_path ./objs/nginx/html/live/livestream.1420254068776.mp4;
+ # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/dvr#custom-path
+ # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/dvr#custom-path
+ # segment,session apply it.
+ # default: ./objs/nginx/html/[app]/[stream].[timestamp].flv
+ dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].flv;
+ # the duration for dvr file, reap if exceed, in seconds.
+ # segment apply it.
+ # session,append ignore.
+ # default: 30
+ dvr_duration 30;
+ # whether wait keyframe to reap segment,
+ # if off, reap segment when duration exceed the dvr_duration,
+ # if on, reap segment when duration exceed and got keyframe.
+ # segment apply it.
+ # session,append ignore.
+ # default: on
+ dvr_wait_keyframe on;
+ # about the stream monotonically increasing:
+ # 1. video timestamp is monotonically increasing,
+ # 2. audio timestamp is monotonically increasing,
+ # 3. video and audio timestamp is interleaved monotonically increasing.
+ # it's specified by RTMP specification, @see 3. Byte Order, Alignment, and Time Format
+ # however, some encoder cannot provides this feature, please set this to off to ignore time jitter.
+ # the time jitter algorithm:
+ # 1. full, to ensure stream start at zero, and ensure stream monotonically increasing.
+ # 2. zero, only ensure stream start at zero, ignore timestamp jitter.
+ # 3. off, disable the time jitter algorithm, like atc.
+ # apply for all dvr plan.
+ # default: full
+ time_jitter full;
+
+ # on_dvr, never config in here, should config in http_hooks.
+ # for the dvr http callback, @see http_hooks.on_dvr of vhost hooks.callback.srs.com
+ # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/dvr#http-callback
+ # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/dvr#http-callback
+ }
+}
+```
+
+DVR的计划即决定什么时候关闭flv文件,打开新的flv文件,主要的录制计划包括:
+
+* session:按照session来关闭flv文件,即编码器停止推流时关闭flv,整个session录制为一个flv。
+* segment:按照时间分段录制,flv文件时长配置为dvr_duration和dvr_wait_keyframe。注意:若不按关键帧切flv(即dvr_wait_keyframe配置为off),所以会导致后面的flv启动时会花屏。
+* time_jitter: 时间戳抖动算法。full使用完全的时间戳矫正;zero只是保证从0开始;off不矫正时间戳。
+* dvr_path: 录制的路径,规则参考下一章。
+
+参考`conf/dvr.segment.conf`和`conf/dvr.session.conf`配置实例。
+
+## Apply
+
+DVR的apply决定了是否对某个流开启dvr,默认的all是对所有开启。
+这个功能是SRS实现nginx提供的control module的一个基础,而且更丰富。
+也就是可以支持用户调用[http raw api](./http-api.md)控制是否以及何时DVR。
+参考[351](https://github.com/ossrs/srs/issues/459#issuecomment-134983742)
+
+Apply可以对多个流进行录制,譬如对`live/stream1`和`live/stream2`录制,可以配置成:
+```
+vhost xxx {
+ dvr {
+ dvr_apply live/stream1 live/stream2;
+ }
+}
+```
+
+可以使用RAW API控制DVR,参考[319](https://github.com/ossrs/srs/issues/319)和[wiki](./http-api.md#raw-dvr).
+
+## Custom Path
+
+我们可以自定义DVR的路径和文件名,规则如下:
+
+* 按年月日以及流信息生成子目录。便于做软链,或者避免一个目录的文件太多(貌似超过几万linux会支持不了)。
+* 按日期和时间以及流信息生成文件名。便于搜索。
+* 提供日期和时间,以及流信息的变量,以中括号代表变量。
+* 保留目前的方式,按照时间戳生成文件名,保存在一个文件夹。若没有指定文件名(只指定了目录),则默认使用`[stream].[timestamp].flv`作为文件名,和目前保持一致。
+
+关于日期和时间的变量,参考了GO的时间格式化字符串,譬如2006代表YYYY这种,比较方便:
+
+```
+2006-01-02 15:04:05.999
+```
+
+DVR支持的变量包括:
+
+1. 年:[2006],将这个字符串替换为年份。
+1. 月:[01],将这个字符串替换成月份。
+1. 日:[02],将这个字符串替换成日期。
+1. 时:[15],将这个字符串替换成小时。
+1. 分:[04],将这个字符串替换成分。
+1. 秒:[05),将这个字符串替换成秒。
+1. 毫秒:[999],将这个字符串替换成毫秒。
+1. 时间戳:[timestamp],将这个字符串替换成UNIX时间戳,单位是毫秒。
+1. 流相关变量,参考转码:[vhost], [app], [stream]
+
+下面的例子说明了替换方式, url是`rtmp://ossrs.net/live/livestream`,time是`2015-01-03 10:57:30.776`
+
+1. 没有变量,SRS1.0方式(自动添加`[stream].[timestamp].flv`作为文件名):
+ * dvr_path ./objs/nginx/html;
+ * =>
+ * dvr_path ./objs/nginx/html/live/livestream.1420254068776.flv;
+
+1. 按流和年月日分目录,时间作为文件名:
+ * dvr_path /data/[vhost]/[app]/[stream]/[2006]/[01]/[02]/[15].[04].[05].[999].flv;
+ * =>
+ * dvr_path /data/ossrs.net/live/livestream/2015/01/03/10.57.30.776.flv;
+
+1. 按流和年月分目录,日和时间作为文件名:
+ * dvr_path /data/[vhost]/[app]/[stream]/[2006]/[01]/[02]-[15].[04].[05].[999].flv;
+ * =>
+ * dvr_path /data/ossrs.net/live/livestream/2015/01/03-10.57.30.776.flv;
+
+1. 按vhost/app和年月分目录,流名称、日和时间作为文件名:
+ * dvr_path /data/[vhost]/[app]/[2006]/[01]/[stream]-[02]-[15].[04].[05].[999].flv;
+ * =>
+ * dvr_path /data/ossrs.net/live/2015/01/livestream-03-10.57.30.776.flv;
+
+1. 按app分目录,流和时间戳作为文件名(SRS1.0方式):
+ * dvr_path /data/[app]/[stream].[timestamp].flv;
+ * =>
+ * dvr_path /data/live/livestream.1420254068776.flv;
+
+## Http Callback
+
+打开`http_hooks`的`on_dvr`配置:
+
+```
+vhost your_vhost {
+ dvr {
+ enabled on;
+ dvr_path ./objs/nginx/html/[app]/[stream]/[2006]/[01]/[02]/[15].[04].[05].[999].flv;
+ dvr_plan segment;
+ dvr_duration 30;
+ dvr_wait_keyframe on;
+ }
+ http_hooks {
+ enabled on;
+ on_dvr http://127.0.0.1:8085/api/v1/dvrs;
+ }
+}
+```
+
+api-server的日志:
+
+```
+[2015-01-03 15:25:48][trace] post to dvrs, req={"action":"on_dvr","client_id":108,"ip":"127.0.0.1","vhost":"__defaultVhost__","app":"live","stream":"livestream","cwd":"/home/winlin/git/srs/trunk","file":"./objs/nginx/html/live/livestream/2015/1/3/15.25.18.442.flv"}
+[2015-01-03 15:25:48][trace] srs on_dvr: client id=108, ip=127.0.0.1, vhost=__defaultVhost__, app=live, stream=livestream, cwd=/home/winlin/git/srs/trunk, file=./objs/nginx/html/live/livestream/2015/1/3/15.25.18.442.flv
+127.0.0.1 - - [03/Jan/2015:15:25:48] "POST /api/v1/dvrs HTTP/1.1" 200 1 "" "SRS(Simple RTMP Server)2.0.88"
+```
+
+更多HTTP回调的信息,请参考 [HttpCallback](./http-callback.md)
+
+## Bug
+
+关于DVR的bug:
+
+* 文件名规则:[#179](https://github.com/ossrs/srs/issues/179)
+* DVR时HTTP回调:[#274](https://github.com/ossrs/srs/issues/274)
+* DVR支持MP4格式:[#738](https://github.com/ossrs/srs/issues/738)
+* 如何录制成一个文件:[#776](https://github.com/ossrs/srs/pull/776)
+
+## Reload
+
+改变dvr配置后reload,会导致dvr重启,即关闭当前dvr文件后重新应用dvr配置。
+
+Winlin 2015.1
+
+![](https://ossrs.net/gif/v1/sls.gif?site=ossrs.net&path=/lts/doc/zh/v6/dvr)
+
+
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/edge.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/edge.md
new file mode 100644
index 00000000..263f85b7
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/edge.md
@@ -0,0 +1,211 @@
+---
+title: Edge Cluster
+sidebar_label: Edge Cluster
+hide_title: false
+hide_table_of_contents: false
+---
+
+# Edge Server
+
+SRS的Edge主要解决几条流有大量播放请求的场景,比如一个流有上万人观看。SRS的Edge能对接所有的标准RTMP源站服务器。
+
+![](/img/doc-main-concepts-edge-001.png)
+
+> 备注:Edge一般负载高,SRS支持的并发足够跑满千兆网带宽了。
+
+> Remark: SRS Edge does not support Transcoding, DVR and HLS, which is supported by SRS Origin Server.
+
+Edge的主要应用场景:
+* CDN/VDN大规模集群,客户众多流众多需要按需回源。
+* 小规模集群,但是流比较多,需要按需回源。
+* 骨干带宽低,边缘服务器强悍,可以使用多层edge,降低上层BGP带宽。
+
+注意:edge可以从源站拉流,也可以将流转发给源站。也就是说,播放edge上的流时,edge会
+回源拉流;推流到edge上时,edge会直接将流转发给源站。
+
+注意:若只需要中转流给源站,不必用forward,直接使用edge模式即可。可以直接支持推流
+和拉流的中转,简单快捷。Forward应用于目标服务器是多个,譬如将一路流主动送给多路服务
+器;edge虽然配置了多台服务器,但是只用了一台,有故障时才切换。
+
+注意:优先使用edge,除非知道必须用forward,才使用forward。
+
+## 概念
+
+所谓边缘edge服务器,就是边缘直播缓存服务器,配置时指定为remote模式和origin(指定一
+个或多个源站IP),这个边缘edge服务器就是源站的缓存了。
+
+当用户推流到边缘服务器时,边缘直接将流转发给源站。譬如源站在北京BGP机房,湖南有个
+电信ADSL用户要推流发布自己的直播流,要是直接推流到北京BGP可能效果不是很好,可以在
+湖南电信机房部署一个边缘,用户推流到湖南边缘,边缘转发给北京源站BGP。
+
+当用户播放边缘服务器的流时,边缘服务器看有没有缓存,若缓存了就直接将流发给客户端。
+若没有缓存,则发起一路回源链接,从源站取数据源源不断放到自己的缓存队列。也就是说,
+多个客户端连接到边缘时,只有一路回源。这种结构在CDN是最典型的部署结构。譬如北京源站,
+在全国32个省每个省都部署了10台服务器,一共就有320台边缘,假设每个省1台边缘服务器都有
+2000用户观看,那么就有64万用户,每秒钟集群发送640Gbps数据;而回源链接只有320个,
+实现了大规模分发。
+
+边缘edge服务器,实际上是解决大并发问题产生的分布式集群结构。SRS的边缘可以指定多个源站,
+在源站出现故障时会自动切换到下一个源站,不影响用户观看,具有最佳的容错性,用户完全不会觉察。
+
+## Config
+
+edge属于vhost的配置,将某个vhost配置为edge后,该vhost会回源取流(播放时)或者将流转发
+给源站(发布时)。
+
+```bash
+vhost __defaultVhost__ {
+ # The config for cluster.
+ cluster {
+ # The cluster mode, local or remote.
+ # local: It's an origin server, serve streams itself.
+ # remote: It's an edge server, fetch or push stream to origin server.
+ # default: local
+ mode remote;
+
+ # For edge(mode remote), user must specifies the origin server
+ # format as: [:port]
+ # @remark user can specifies multiple origin for error backup, by space,
+ # for example, 192.168.1.100:1935 192.168.1.101:1935 192.168.1.102:1935
+ origin 127.0.0.1:1935 localhost:1935;
+
+ # For edge(mode remote), whether open the token traverse mode,
+ # if token traverse on, all connections of edge will forward to origin to check(auth),
+ # it's very important for the edge to do the token auth.
+ # the better way is use http callback to do the token auth by the edge,
+ # but if user prefer origin check(auth), the token_traverse if better solution.
+ # default: off
+ token_traverse off;
+
+ # For edge(mode remote), the vhost to transform for edge,
+ # to fetch from the specified vhost at origin,
+ # if not specified, use the current vhost of edge in origin, the variable [vhost].
+ # default: [vhost]
+ vhost same.edge.srs.com;
+
+ # For edge(mode remote), when upnode(forward to, edge push to, edge pull from) is srs,
+ # it's strongly recommend to open the debug_srs_upnode,
+ # when connect to upnode, it will take the debug info,
+ # for example, the id, source id, pid.
+ # please see https://ossrs.net/lts/zh-cn/docs/v4/doc/log
+ # default: on
+ debug_srs_upnode on;
+ }
+}
+```
+
+可配置`多个`源站,在故障时会切换到下一个源站。
+
+## 集群配置
+
+下面举例说明如何配置一个源站和集群。
+
+源站配置,参考`origin.conf`:
+
+```bash
+listen 19350;
+pid objs/origin.pid;
+srs_log_file ./objs/origin.log;
+vhost __defaultVhost__ {
+}
+```
+
+边缘配置,参考`edge.conf`:
+
+```bash
+listen 1935;
+pid objs/edge.pid;
+srs_log_file ./objs/edge.log;
+vhost __defaultVhost__ {
+ cluster {
+ mode remote;
+ origin 127.0.0.1:19350;
+ }
+}
+```
+
+## HLS边缘
+
+Edge指的是RTMP边缘,也就是说,配置为Edge后,流推送到源站(Origin)时,Edge不会切片生成HLS。
+
+HLS切片配置在源站,只有源站会在推流上来就产生HLS切片。边缘只有在访问时才会回源(这个时候
+也会生成HLS,但单独访问边缘的HLS是不行的)。
+
+也就是说,HLS的边缘需要使用WEB服务器缓存,譬如nginx反向代理,squid,或者traffic server等。
+
+## 下行边缘结构设计
+
+下行边缘指的是下行加速边缘,即客户端播放边缘服务器的流,边缘服务器从上层或源站取流。
+
+SRS下行边缘是非常重要的功能,需要考虑以下因素:
+* 以后支持多进程时结构变动最小。
+* 和目前所有功能的对接良好。
+* 支持平滑切换,源站和边缘两种角色。
+
+权衡后,SRS下行边缘的结构设计如下:
+* 客户端连接到SRS
+* 开始播放SRS的流
+* 若流存在则直接播放。
+* 若流不存在,则从源站开始取流。
+* 其他其他流的功能,譬如转码/转发/采集等等。
+
+核心原则是:
+* 边缘服务器在没有流时,向源站拉取流。
+* 当流建立起来后,边缘完全变成源站服务器,对流的处理逻辑保持一致。
+* 支持回多个源站,错误时切换。这样可以支持上层服务器热备。
+
+备注:RTMP多进程(计划中)的核心原则是用多进程作为完全镜像代理,连接到本地的服务器
+(源站或边缘),完全不考虑其他业务因素,透明代理。这样可以简单,而且利用多CPU能力。
+HTTP多进程是不考虑支持的,用NGINX是最好选择,SRS的HTTP服务器只是用在嵌入式设备中,
+没有性能要求的场合。
+
+## 上行边缘结构设计
+
+上行边缘指的是上行推流加速,客户端推流到边缘服务器,边缘将流转发给源站服务器。
+
+考虑到下行和上行可能同时发生在一台边缘服务器,所以上行边缘只能用最简单的代理方式,
+完全将流代理到上层或源站服务器。也就是说,只有在下行边缘时,边缘服务器才会启用其他
+的功能,譬如HLS转发等等。
+
+上行边缘主要流程是:
+* 客户端连接到SRS
+* 开始推流到SRS。
+* 开始转发到源站服务器。
+
+## EdgeState
+
+边缘的状态图分析如下:
+
+![RTMP-HLS-latency](/img/doc-main-concepts-edge-002.jpg)
+
+注意:这种细节的文档很难保持不变,以代码为准。
+
+## 边缘的难点
+
+RTMP边缘对于SRS来讲问题不大,主要是混合了reload和HLS功能的边缘服务器,会是一个难点。
+
+譬如,用户在访问边缘上的HLS流时,是使用nginx反向代理回源,还是使用RTMP回源后在边缘切片?
+对于前者,需要部署srs作为RTMP边缘,nginx作为HLS边缘,管理两个服务器自然是比一个要费劲。
+若使用后者,即RTMP回源后边缘切片,能节省骨干带宽,只有一路回源,难点在于访问HLS时要发起
+RTMP回源连接。
+
+正因为业务逻辑会是边缘服务器的难点,所以SRS对于上行边缘,采取直接代理方式,并没有采取
+边缘缓存方式。所谓边缘缓存方式,即推流到边缘时边缘也会当作源站直接缓存(作为源站),
+然后转发给源站。边缘缓存方式看起来先进,这个边缘节点不必回源,实际上加大了集群的逻辑难度,
+不如直接作为代理方式简单。
+
+## Transform Vhost
+
+一般CDN都支持上行和下行边缘加速,上行和下行的域名是分开的,譬如上行使用`up.srs.com`,下行使用`down.srs.com`,这样可以使用不同的设备组,避免下行影响下行之类。
+
+用户在推流到`up.srs.com`时,边缘使用edge模式,回源时也是用的`up.srs.com`,到源站还是`up.srs.com`,所以播放`down.srs.com`这个vhost的流时就播放不了用户推的那个流。因此需要edge在回源时transform vhost,也就是转换vhost。
+
+解决方案:在最上层edge,可以配置回源的vhost,默认使用当前的vhost。譬如上行`up.srs.com`,可以指定回源`down.srs.com`;配置时指定`vhost down.srs.com;`就可以了。
+
+具体配置参考上面的Config。
+
+Winlin 2015.4
+
+![](https://ossrs.net/gif/v1/sls.gif?site=ossrs.net&path=/lts/doc/zh/v6/edge)
+
+
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/exporter.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/exporter.md
new file mode 100644
index 00000000..fb96aed4
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/exporter.md
@@ -0,0 +1,183 @@
+---
+title: Prometheus Exporter
+sidebar_label: Exporter
+hide_title: false
+hide_table_of_contents: false
+---
+
+# Prometheus Exporter
+
+SRS的可观测性是支撑业务的运营的能力,主要指监控(Prometheus Exporter)、分布式链路追踪(APM)、上下文日志(Cloud Logging)三个核心能力,以及基于这些能力的运营大盘、监控系统、问题排查、日志收集和分析等功能。
+
+## Introduction
+
+可观测性,在云原生中有详细的定义,参考[OpenTelemetry.io](https://opentelemetry.io),从可观测性上看其实就是三个问题:
+
+* [监控指标(Metrics)](https://opentelemetry.io/docs/concepts/observability-primer/#reliability--metrics):就是我们一般所理解的监控告警。监控一般是将一些数据聚合,体现系统在不同层面的状态,当达到某个状态后告警。比如区域的水位值,达到一定水位后就需要自动或人工扩容,或者调整调度降低这个区域的负载。
+* [分布式跟踪(Tracing)](https://opentelemetry.io/docs/concepts/observability-primer/#distributed-traces):我们排查问题时,一般是按照会话或请求维度排查,在系统中会涉及多个服务器,比如播放一个流会经过API、调度、边缘、上游服务器、源站等,如何把这个全链路的信息给出来,就是分布式追踪(Tracing)。明显这是非常高效的解决问题的方法,问题迟迟得不到解决甚至不了了之,迟早会失去用户。
+* [日志(Logging)](https://opentelemetry.io/docs/concepts/observability-primer/#logs): 就是我们一般所理解的日志,也是一般研发所依赖的排查问题的几乎唯一的方法。其实日志是最低效的方法,因为日志没有上下文,无法在分布式系统中分离出某个会话的多个日志。日志只有具备追踪的能力,或者在关联到Traceing中,这样才能更高效。
+
+![](/img/doc-2022-10-30-001.png)
+
+> Note: 上图请参考[Metrics, tracing, and logging](https://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html)
+
+针对上面的问题,SRS的运营能力分成几个独立的部分,首先是提供了Prometheus可以对接的Exporter,Prometheus可以直接从SRS拉取监控数据,而不依赖外部第三方服务,如下图所示:
+
+```
++-----+ +-----------+ +---------+
+| SRS +--Exporter-->--| Promethus +-->--+ Grafana +
++-----+ (HTTP) +-----------+ +---------+
+```
+
+> Note: Promethus是云原生的标准监控系统,在K8s中部署也可以使用这个能力,比如通过Pod发现和采集数据。
+
+下面是关于Exporter的配置。
+
+## Config
+
+Exporter的配置如下,推荐使用环境变量方式开启配置:
+
+```bash
+# Prometheus exporter config.
+# See https://prometheus.io/docs/instrumenting/exporters
+exporter {
+ # Whether exporter is enabled.
+ # Overwrite by env SRS_EXPORTER_ENABLED
+ # Default: off
+ enabled off;
+ # The http api listen port for exporter metrics.
+ # Overwrite by env SRS_EXPORTER_LISTEN
+ # Default: 9972
+ # See https://github.com/prometheus/prometheus/wiki/Default-port-allocations
+ listen 9972;
+ # The logging label to category the cluster servers.
+ # Overwrite by env SRS_EXPORTER_LABEL
+ label cn-beijing;
+ # The logging tag to category the cluster servers.
+ # Overwrite by env SRS_EXPORTER_TAG
+ tag cn-edge;
+}
+```
+
+下面是详细的使用说明。
+
+## Usage for SRS Exporter
+
+首先,编译和启动SRS,要求`SRS 5.0.86+`:
+
+```bash
+./configure && make
+env SRS_ENV_ONLY=on SRS_EXPORTER_ENABLED=on SRS_LISTEN=1935 \
+ ./objs/srs -e
+```
+
+> Note: 我们使用环境变量方式配置SRS,不依赖配置文件。当然使用`conf/prometheus.conf`启动也可以。
+
+> Note: SRS启动成功后,可以打开[http://localhost:9972/metrics](http://localhost:9972/metrics)验证,能看到返回指标数据就是成功了。
+
+接着,我们启动FFmpeg推流:
+
+```bash
+docker run --rm -it registry.cn-hangzhou.aliyuncs.com/ossrs/srs:encoder ffmpeg -stream_loop -1 -re -i doc/source.flv \
+ -c copy -f flv rtmp://host.docker.internal/live/livestream
+```
+
+然后,启动[node_exporter](https://github.com/prometheus/node_exporter),收集节点的数据,这样和SRS的服务器数据可以形成完整的监控数据:
+
+```bash
+docker run --rm -p 9100:9100 prom/node-exporter
+```
+
+> Note: 用Docker启动node_exporter数据不准,需要特殊的权限而mac不支持。实际场景请使用二进制直接在主机上启动,可以从[这里](https://github.com/prometheus/node_exporter/releases)下载对应系统的二进制。
+
+> Note: node_exporter启动后,可以打开[http://localhost:9100/metrics](http://localhost:9100/metrics)验证,能看到返回指标数据就是成功了。
+
+最后,编写配置文件`prometheus.yml`,内容如下:
+
+```yml
+scrape_configs:
+ - job_name: "node"
+ metrics_path: "/metrics"
+ scrape_interval: 5s
+ static_configs:
+ - targets: ["host.docker.internal:9100"]
+ - job_name: "srs"
+ metrics_path: "/metrics"
+ scrape_interval: 5s
+ static_configs:
+ - targets: ["host.docker.internal:9972"]
+```
+
+> Note: 默认`scrape_interval`是1m即一分钟,为了测试方便我们设置为`5s`。
+
+启动Prometheus:
+
+```bash
+docker run --rm -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
+ -p 9090:9090 prom/prometheus
+```
+
+打开[Prometheus: Targets](http://localhost:9090/targets),可以看到抓取数据的状态。打开[Prometheus: Graph](http://localhost:9090/graph),输入一下语句,可以验证是否正常:
+
+```sql
+rate(srs_receive_bytes_total[10s])*8
+```
+
+这个语句是计算输入的带宽,也就是直播流的码率,如下图所示:
+
+![](/img/doc-2022-10-30-002.png)
+
+虽然Prometheus也能生成图,不过一般是使用Grafana对接Prometheus展示图表。
+
+## Usage for Grafana
+
+首先启动Grafana:
+
+```bash
+docker run --rm -it -p 3000:3000 \
+ -e GF_SECURITY_ADMIN_USER=admin \
+ -e GF_SECURITY_ADMIN_PASSWORD=12345678 \
+ -e GF_USERS_DEFAULT_THEME=light \
+ grafana/grafana
+```
+
+然后打开Grafana页面:[http://localhost:3000/](http://localhost:3000/)
+
+输入用户名`admin`,以及密码`12345678`就可以进入Grafana后台了。
+
+执行命令[添加](https://grafana.com/docs/grafana/latest/developers/http_api/data_source/#create-a-data-source)Prometheus的DataSource:
+
+```bash
+curl -s -H "Content-Type: application/json" \
+ -XPOST http://admin:12345678@localhost:3000/api/datasources \
+ -d '{
+ "name": "prometheus",
+ "type": "prometheus",
+ "access": "proxy", "isDefault": true,
+ "url": "http://host.docker.internal:9090"
+}'
+```
+
+执行命令[导入](https://grafana.com/docs/grafana/latest/developers/http_api/dashboard/#create--update-dashboard)HelloWorld图表:
+
+```bash
+data=$(curl https://raw.githubusercontent.com/ossrs/srs-grafana/main/dashboards/helloworld-import.json 2>/dev/null)
+curl -s -H "Content-Type: application/json" \
+ -XPOST http://admin:12345678@localhost:3000/api/dashboards/db \
+ --data-binary "{\"dashboard\":${data},\"overwrite\":true,\"inputs\":[],\"folderId\":0}"
+```
+
+> Note: 这里[srs-grafana](https://github.com/ossrs/srs-grafana/tree/main/dashboards)有更丰富的仪表盘,可以选择手动导入,或者修改上面的导入命令。
+
+导入后就可以在[仪表盘中](http://localhost:3000/dashboards)看到了,如下图所示:
+
+![](/img/doc-2022-10-30-003.png)
+
+我们还提供了更加完整的仪表盘,可以在[srs-grafana](https://github.com/ossrs/srs-grafana/tree/main/dashboards)中看到,如下图所示:
+
+![](/img/doc-2022-10-30-004.png)
+
+欢迎一起来完善SRS仪表盘。
+
+![](https://ossrs.net/gif/v1/sls.gif?site=ossrs.net&path=/lts/doc/zh/v6/exporter)
+
diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/ffmpeg.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/ffmpeg.md
new file mode 100644
index 00000000..e1914347
--- /dev/null
+++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-6.0/doc/ffmpeg.md
@@ -0,0 +1,388 @@
+---
+title: FFMPEG
+sidebar_label: FFMPEG
+hide_title: false
+hide_table_of_contents: false
+---
+
+# Live Streaming Transcode
+
+SRS可以对推送到SRS的RTMP流进行转码,然后输出到RTMP服务器(也可以是SRS自己)。
+
+## Use Scenario
+
+FFMPEG的重要应用场景包括:
+* 推送一路高码率,转多路输出。譬如:游戏直播中,推送一路1080p流到SRS,SRS可以转码输出1080p/720p/576p多路,低码率可以给移动设备观看。这样节省了推流带宽(一般源站为BGP带宽,很贵),也减轻了客户端压力(譬如客户端边玩游戏边直播)。
+* 支持多屏输出。譬如:网页推流(主播)编码为vp6/mp3或speex,推流到SRS后无法支持HLS(要求h264+aac),可以转码成h264+aac后切片成HLS或者推送到其他服务器再分发。
+* 加水印。适用于需要对流进行加水印的情况,譬如打上自己的logo。SRS支持文字水印和图片水印,也可以支持视频作为水印,或者将两路流叠加(参考ffmpeg的用法)。
+* 截图:参考[使用Transcoder截图](./snapshot.md#transcoder)
+* 其他滤镜:SRS支持所有ffmpeg的滤镜。
+
+## Workflow
+
+SRS转码的主要流程包括:
+
+1. 编码器推送RTMP流到SRS的vhost。
+1. SRS的vhost若配置了转码,则进行转码。
+1. 转码后,按照配置,推送到SRS本身或者其他RTMP服务器。
+
+## Transcode Config
+
+SRS可以对vhost的所有的流转码,或者对某些app的流转码,或者对某些流转码。
+
+```bash
+listen 1935;
+vhost __defaultVhost__ {
+ # the streaming transcode configs.
+ transcode {
+ # whether the transcode enabled.
+ # if off, donot transcode.
+ # default: off.
+ enabled on;
+ # the ffmpeg
+ ffmpeg ./objs/ffmpeg/bin/ffmpeg;
+ # the transcode engine for matched stream.
+ # all matched stream will transcoded to the following stream.
+ # the transcode set name(ie. hd) is optional and not used.
+ # we will build the parameters to fork ffmpeg:
+ # ffmpeg
+ # -i
+ #
+ # -vcodec -b:v -r -s x -profile:v -preset
+ #
+ # -acodec -b:a -ar -ac
+ #
+ # -f
+ # -y