Remnawave面板搭建全流程
流量拼车的好搭档
· 4 min read
由于最近新买了一个DMIT,流量有些多所以有了拼车的需求。我之前使用的搭建节点的方式是「233boy」一键脚本或者「3-XUI」等一些面板。这些方式适合自用,对于拼车来说用户管理不方便,而且也看不到流量具体的使用情况,或者订阅到期的情况。如果使用「 Xboard 」的这些机场面板的话,又显得太重了。
在网上冲浪的时候刷到了 Remnawave。只看了一眼这个面板的外观,便被它吸引了。经过搭建使用后,发现它不仅外表美丽,并且功能也十分强大,属于是中看又中用。
它的使用场景仅限于自用或者拼车,更推荐拼车使用。

缺点 #
- 协议支持不全,这个面板是基于 「Xray」的,所以有些协议是无法支持的,例如 hy2。并且有些协议(例如 Shadowsocks-2022 ),它也暂时没有支持。
- 占用资源比较多,因为这个系统无论是面板端还是节点端,都是使用Docker部署的。节点端(也就是搭建节点的小机)需要 5GB 左右的储存空间。内存无所谓,只要能跑起来 Docker 就行。面板端需要10GB左右的储存空间。
- 上手难度比较高,不仅指的是部署难度,也指它的节点配置是需要手搓配置文件的。
优点 #
- 对于多用户支持比较好。可以针对每个用户设置以下内容:流量充值时间、流量限额、流量到期时间等,也就是说比较适合拼车
- 主从架构设计。具有一个面板端和多个节点端,可以通过面板端下发配置文件,统一修改。节点端不需要做过多操作,用来控制多台小鸡的体验十分爽。
- 手写配置更加灵活可控。
- 内置订阅转换功能。对于多个客户端,可以下发不同的订阅模板,也就是说内置了订阅转换的功能。
- 具有非常直观的统计页面,可以看到具体的统计数据。
总体来说,这个面板非常适合喜欢折腾的用户使用。最终的效果和功能还是十分令人满意的,用了之后觉得回不去之前用的 X-UI 等面板了。
到了部署的部分,其实官方的部署文档是我自部署这么多服务以来遇到的最详细的。它里面包含了非常详细的步骤,并给出了非常详细的配置模板。跟着官方文档来,基本上没有遇到什么问题,也没有踩到什么坑。
官方链接:Remnawave Documentation | quick-start
部署记录 #
首先是面板端:
- 这个面板端不是必须要搭建在节点的机器上,可以在任何机器上。
- 面板端最好是有公网 IP。如果没有公网 IP 的话,也可以尝试用其他方法,但还是建议优先使用公网 IP。
- 该面板必须通过 SSL 进行访问。
面板端搭建 #
Remnawave Panel 是 Remnawave 的核心组件,用于管理用户、节点、订阅等。
安装 Docker:
sudo curl -fsSL https://get.docker.com | sh
创建项目目录并进入:
mkdir /opt/remnawave && cd /opt/remnawave
下载 docker-compose.yml 和 .env.sample:
curl -o docker-compose.yml https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/docker-compose-prod.yml
curl -o .env https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/.env.sample
配置 .env 文件
# 以下生成的密码都是为了程序内部使用,一般是不需要记录下来的
#JWT_AUTH_SECRET 与 JWT_API_TOKENS_SECRET 用于认证与安全相关功能。建议生成安全密钥:
sed -i "s/^JWT_AUTH_SECRET=.*/JWT_AUTH_SECRET=$(openssl rand -hex 64)/" .env && \
sed -i "s/^JWT_API_TOKENS_SECRET=.*/JWT_API_TOKENS_SECRET=$(openssl rand -hex 64)/" .env
#生成 Metrics 与 Webhook 密钥:
sed -i "s/^METRICS_PASS=.*/METRICS_PASS=$(openssl rand -hex 64)/" .env && \
sed -i "s/^WEBHOOK_SECRET_HEADER=.*/WEBHOOK_SECRET_HEADER=$(openssl rand -hex 64)/" .env
#强烈建议修改默认 Postgres 密码(并同步更新 DATABASE_URL):
pw=$(openssl rand -hex 24) && \
sed -i "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$pw/" .env && \
sed -i "s|^\(DATABASE_URL=\"postgresql://postgres:\)[^\@]*\(@.*\)|\1$pw\2|" .env
然后手动打开 .env,修改以下变量:
vim .env
- FRONT_END_DOMAIN:面板访问域名(例如
panel.example.com) - SUB_PUBLIC_DOMAIN:目前填写面板域名并追加 /api/sub(例如
panel.example.com/api/sub)
启动容器:
docker compose up -d && docker compose logs -f -t
启动后稍等片刻,应看到面板相关输出。
Nginx 反向代理配置 #
关于这一部分,官方给出的实例配置文件非常详细,涵盖了各种常用的服务(例如 Nginx 和 Caddy),可以直接参考并照抄官方的配置文件。 Remnawave Documentation | reverse-proxie
针对 Nginx ,官方给出的是 Docker 运行的 Nginx 服务配置文件,我这里给出独立运行的 Nginx 配置文件供参考:
upstream remnawave {
#Change this part
server 127.0.0.1:port;
}
server {
listen 80;
listen [::]:80;
#Change this part
server_name panel.example.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
server_name panel.example.com;
listen 443 ssl http2 reuseport;
listen [::]:443 ssl http2 reuseport;
location / {
proxy_http_version 1.1;
proxy_pass http://remnawave;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# SSL Configuration (Mozilla Intermediate Guidelines)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
#Change this part
ssl_certificate "/etc/ssl/certs/panel.example.com.pem";
ssl_certificate_key "/etc/ssl/private/panel.example.com.key";
#ssl_trusted_certificate "/etc/ssl/certs/yzyy.de.pem";
# ssl_stapling on;
# ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
resolver_timeout 2s;
# Gzip Compression
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/svg+xml
text/css
text/javascript
text/plain
text/xml;
}
到这一步,访问 panel.example.com 并设置管理员账户应该就可以看到面板主页了。
Remnawave 节点安装与配置 #
Remnawave 节点的建立方式,是通过面板端下发配置文件到节点端运行的,所以我们需要在面板端设置好节点搭建所需要的配置文件。
Xray-core本身支持非常多的协议,具体需要看 Xray 的官方文档。我对这方面了解较浅,所以以下的教程就以我们最常用的的 VLESS-TCP-Reality 节点作为例子。
创建配置文件 #
在 配置文件菜单项 里新建一个配置文件,配置文件的名称可以用英文随意命名,我们就以 VLESS-TCP-Reality 作为名称。

Vless-tcp-reality配置示例:
{
"log": {
"loglevel": "info"
},
"inbounds": [
{
"tag": "VLESS_TCP_REALITY",
"port": 443,
"protocol": "vless",
"settings": {
"clients": [],
"decryption": "none"
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls",
"quic"
]
},
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"show": false,
"xver": 0,
"target": "www.cloudflare.com:443",
"shortIds": [
""
],
"privateKey": "填写生成的私钥",
"fingerprint": "chrome",
"serverNames": [
"www.cloudflare.com"
]
}
}
}
],
"outbounds": [
{
"tag": "DIRECT",
"protocol": "freedom"
},
{
"tag": "BLOCK",
"protocol": "blackhole"
}
],
"routing": {
"rules": []
}
}
填入节点配置参数:
其中节点的公钥和私钥的生成,可以利用面板中提供的生成工具。在配置文件中,只需要把生成的私钥填上去,至于公钥会自动计算并配置给节点端。
因为本教程只涉及后端的搭建,关于SNI的寻找,可以查找相关教程。
另外,一份配置文件里可以设置多个入站。也就是说,可以在一份配置文件里同时在节点机器上搭建多个不同类型的节点,让一个节点同时支持多种协议和传输方式。
例如可以将 VLESS-XHTTP-Reality、VLESS-TCP-Reality 或者 Shadowsocks 这几种协议都配置在同一个文件里。
创建节点 #
找到节点菜单下,现在创建一个节点。
在这可以首先说一下 Remnawave 面板中“节点”的概念到底是什么。其实是给系统内部看的,和我们在代理客户端中看到的Vless节点不一样,它存在的意义就是为了在面板中显示。也就是这个主从架构中的"从"。

这里要注意 Node Port 这个参数。这个参数只是为了给面板端和节点端通信使用,并不是 Vless节点 的端口,而Vless节点的端口已经是在配置文件中指明的,可以随便给。
填写相关信息后点击下一步:

选择我们刚刚创建的配置文件,并点击复制 docker-compose.yml 文件。
这是为了给我们在节点端机器上使用。
现在我们要在节点VPS上进行操作,首先,节点 VPS也需要安装 Docker。
创建目录:
mkdir /opt/remnanode && cd /opt/remnanode
创建 compose 文件,并将我们刚刚复制的 docker-compose.yml 的内容粘贴到这里。
vim docker-compose.yml
如果有使用 UFW 防火墙或者有服务器外部防火墙的话,需要注意放行两个端口:
- 节点端口
- 面板端与节点端的通信端口 Node Port,因为面板端 VPS 一般都有固定 IP ,可以只开放这个端口给固定的 IP,这样会更加安全一些。
sudo ufw allow from 1.2.3.4 to any port 2222
启动服务:
docker compose up -d
一会儿便可以看到节点列表中,该节点颜色变绿,说明已经连接成功。
现在点击这个节点可以进行管理:
可以设置该节点的流量消耗倍率,默认是一倍。值得注意的是,RW面板的流量只记录单向流量消耗。如果你的节点 VPS 是双向计费的话,可以在此把流量消耗的流量倍率设置为 2.0。
如果节点连接不上,除了网络问题外,一般是Xray-core配置有误,可以通过下面的命令来检查remnanode容器的日志:
docker compose logs -f
如果看到有类似这样的错误提示,则可以确定是Xray-core配置有误:
XML-RPC fault: SPAWN_ERROR: xray
然后使用下面的命令来查看Xray-core的日志,根据Xray-core的日志信息来解决相应的问题:
docker exec -it remnanode tail -n +1 -f /var/log/supervisor/xray.out.log
创建主机 #
关于 Remnawave 面板中主机的概念,官方是这样介绍的:
根据我的理解,主机的概念与 Remnawave 面板中节点的概念是一组对应。
- 节点(Node):是为了在面板中进行内部管理。
- 主机(Host):是为了对外进行展示。
简单来说,配置的一个“主机”就是用户未来在代理客户端(如clash party)中看到的一个具体的节点.
现在我们创建一个 VLESS TCP Reality 节点给用户使用。
进行添加一个主机:
- 备注:这就是用户在代理客户端中看到的节点名字,可以按照习惯进行填写,例如🇺🇸US01。
- 配置文件:每个主机都要选择一个配置文件,选择刚刚写的配置文件即可
- 地址:如果你在协议中带了 TLS,可以填写相应的域名;如果没有过 CDN,就填写主机的 IP 地址(节点端VPS的 IP 地址)
- 端口:一般可以通过配置文件自动填入。
- 节点:选择我们刚刚添加的节点,
- 最后点击上面的“主机可见性”,点击保存即可

订阅设置 #
这就是Remnawave 面板自带的节点转换功能,可以根据用户使用的不同客户端,下放不同的配置模板。

订阅信息这一项,每一个可配置的参数都给出了详细的解释,可以自行设置。例如“配置标题”这一个参数,就可以在 clash内核 的一些 GUI 中显示配置名称。


自定义备注这一项,可以设置在订阅过期、流量用尽或用户被禁用时,在用户代理客户端中添加一些名称为这些备注的节点。这些信息主要用来提醒客户,防止用户失联。

模板设置 #
根据用户使用的不同客户端,发放的一些模板配置。我目前只说一下关于 Clash 或者 Clash Meta(Mihomo)的配置文件:
proxies 段必须存在且为空,并且保留注入点:
proxies: # LEAVE THIS LINE!
后续 proxy-group 中的每一个组都会自动注入在 Remnawave 面板中设置的节点。
如果有分组不想注入这些节点,必须显式地写:
remnawave: include-proxies: false
其实这部分还挺复杂的,因为不同代理客户端所支持的配置文件类型或者格式也不尽相同,需要查阅不同客户端、不同内核对于配置文件格式的支持情况。
创建用户分组 #
Remnawave 面板支持两种用户分组,都是为了访问控制:
- 内部分组:为了控制用户能看到哪些节点
- 外部分组:为了控制用户能获得哪种订阅模板,例如,带精细分流和没有精细分流的
点击“内部分组”菜单项,可以在系统自带的默认分组上进行修改,也可以新建一个:
- 选择你想包含的配置文件,这样使用该配置文件创建的节点都会包含进来
- 点击保存即可

点击“外部分组”菜单项,同样的,可以使用系统自带的默认分组,也可以新建一个:
- 选择你想给这个分组使用的订阅模板
- 点击保存即可

创建用户 #
可以在此设置该用户的流量限制和重置时间。
重置时间一般是以自然月循环(例如每月重置一次)。此外,还可以设置订阅到期时间。
关于访问控制:通过刚刚设置的内部分组和外部分组,来控制该用户可以获取到的节点和订阅模板

我们再次点击该用户,就可以看到专属于这个用户的订阅URL。
至此,我们就可以获得一个非常完美的订阅链接,包含订阅转换、流量控制、到期时间等。
搭建 Subscription Page(可选) #
当我们通过浏览器打开获取到的订阅链接时,可以看到一个算得上精美的、独立的订阅页面。
并且还有一个额外的好处是隐藏我们的面板域名。
当设置这个订阅页面程序时,需要额外为此绑定一个不同于订阅面板的域名,之后获取到的订阅链接就都是这个域名了。

部署流程:
编辑Remnawave面板的.env配置文件:
cd /opt/remnawave && vim .env
把之前的这个配置:
SUB_PUBLIC_DOMAIN=remnawave.example.com/api/sub
修改为你的订阅页面域名:
SUB_PUBLIC_DOMAIN=subscription.example.com
创建compose文件:
mkdir -p /opt/remnawave/subscription && cd /opt/remnawave/subscription && nano docker-compose.yml
写入如下配置:
services:
remnawave-subscription-page:
image: remnawave/subscription-page:latest
container_name: remnawave-subscription-page
hostname: remnawave-subscription-page
restart: always
environment:
- REMNAWAVE_PANEL_URL=https://remnawave.example.com
- APP_PORT=3010
- META_TITLE="Subscription Page Title"
- META_DESCRIPTION="Subscription Page Description"
ports:
- '127.0.0.1:3010:3010'
networks:
- remnawave-network
networks:
remnawave-network:
driver: bridge
external: true
注意:REMNAWAVE_PANEL_URL这里要指向你的面板URL,但是有多种配置方法。
1、此订阅页面程序与面板不在同一台服务器部署,那么这里就填写面板的域名,并且去掉compose内的external: true配置。
2、在同一服务器部署,可以直接填面板服务的主机名:3000,例如:http://remnawave:3000,也可以直接填写域名。
启动:
docker compose up -d
配置反向代理:
我这里使用的是 Nginx。在刚刚为面板配置的 Nginx 配置文件中,添加以下 server块 即可。
upstream remnawave-subscription-page {
#Change this part
server 127.0.0.1:port;
}
server {
server_name subscription.example.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;
location / {
proxy_http_version 1.1;
proxy_pass http://remnawave-subscription-page;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# SSL Configuration (Mozilla Intermediate Guidelines)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_certificate "/etc/ssl/certs/050612.xyz.pem";
ssl_certificate_key "/etc/ssl/private/050612.xyz.key";
ssl_trusted_certificate "/etc/ssl/certs/050612.xyz.pem";
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
resolver_timeout 2s;
# Gzip Compression
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/svg+xml
text/css
text/javascript
text/plain
text/xml;
}
此外,Remnawave 具有丰富的社区生态。比如说,面板本身没有对接支付系统,但在以下链接中,有一个项目可以在 Telegram 中配置 Bot 并对接一些支付系统,只是没有中国大陆经常使用的支付方式罢了。
由于我没有用到,便在此不做过多介绍,请大家自行探索吧。