Docker 应用分享

一些 Docker 应用分享及使用配置附录,包含远程控制(RustDesk),PT 一体化工具(MoviePilot, Qbittorrent, Transmission, Audiobookshelf)和内网浏览器(Firefox)。

提示:根据个人的实际情况,自行替换配置文件中的路径、端口、口令等内容。

远程控制

  • rustdesk-server:官方原版镜像,独立运行 hbbs(ID 服务器)和 hbbr(中继服务器)。
  • rustdesk-server-s6:使用 s6-overlay 将 hbbs 和 hbbr 运行到同一个容器中。
  • rustdesk-api:第三方社区实现的 Api 工具,提供网页控制台。

考虑到单机部署,独立运行 hbbs, hbbr 意义不大,使用 rustdesk-server-s6 镜像即可。如果有访问网页端的需求,可再同时部署 rustdesk-api 镜像,一定程度上代替官方镜像的 21114 网页控制台的作用。

Docker Compose

rustdesk-s6
version: '3'
services:
rustdesk-server:
container_name: rustdesk-s6
ports:
- 36011:36011
- 36012:36012
- 36012:36012/udp
- 36013:36013
image: rustdesk/rustdesk-server-s6:latest
environment:
- RELAY=<指向服务器的域名>:36013
- ENCRYPTED_ONLY=1
- PORT=36012
volumes:
- /opt/docker/rustdesk-s6:/data
restart: unless-stopped
network_mode: bridge
rustdesk-s6 + rustdesk-api
version: '3'
services:
rustdesk-server:
container_name: rustdesk-s6
image: rustdesk/rustdesk-server-s6:latest
restart: unless-stopped
networks:
- rustdesk-network
ports:
- 36601-36605:36601-36605
- 36602:36602/udp
environment:
- TZ=Asia/Shanghai
- RELAY=<指向服务器的域名>:36603
- ENCRYPTED_ONLY=1
- PORT=36602
volumes:
- /opt/docker/rustdesk-s6:/data
rustdesk-api:
container_name: rustdesk-api
image: lejianwen/rustdesk-api:latest
restart: unless-stopped
networks:
- rustdesk-network
ports:
- 36600:21114
environment:
- TZ=Asia/Shanghai
- RUSTDESK_API_RUSTDESK_ID_SERVER=rustdesk-s6:36602
- RUSTDESK_API_RUSTDESK_RELAY_SERVER=rustdesk-s6:36603
- RUSTDESK_API_RUSTDESK_API_SERVER=https://<启用反代的Nginx域名>
- RUSTDESK_API_RUSTDESK_WS_HOST=wss://<启用反代的Nginx域名>
- RUSTDESK_API_RUSTDESK_KEY_FILE=./conf/data/id_ed25519.pub
volumes:
- /opt/docker/rustdesk-api/:/app/data
- /opt/docker/rustdesk-s6:/app/conf/data
networks:
rustdesk-network:
driver: bridge
enable_ipv6: true
ipam:
config:
- subnet: 172.19.0.0/16
- subnet: "2001:db8:2::/64"

Nginx 配置
server {
listen 443 ssl http2 ;
listen [::]:443 ssl http2 ;
server_name <启用反代的Nginx域名>;
access_log /www/sites/rustdesk/log/access.log main;
error_log /www/sites/rustdesk/log/error.log;

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_http_version 1.1;

location / {
proxy_pass http://127.0.0.1:36600;
}

location /ws/id {
proxy_pass http://127.0.0.1:36604;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_read_timeout 86400s;
}

location /ws/relay {
proxy_pass http://127.0.0.1:36605;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_read_timeout 86400s;
}

ssl_certificate /www/sites/rustdesk/ssl/fullchain.pem;
ssl_certificate_key /www/sites/rustdesk/ssl/privkey.pem;
ssl_protocols TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
add_header Strict-Transport-Security "max-age=31536000";
}

附录

  • 关于 ID 服务器

    • 如果输入的是 IP,RustDesk 只会按照 IP (V4/V6)类型进行 NAT 检测。
    • 所以建议输入双栈域名,同时解析 AAAA 和 A,让客户端自行选择。
    • 推荐使用:Free dynamic DNS for IPv6
  • 关于环境变量 RELAY

    • 用于 ID 服务器通知客户端中继服务器的地址。

    • 当然你也可以不配置该变量,而是在客户端手动输入中继服务器的值。

  • 关于客户端配置

客户端配置
项目内容
ID 服务器服务器:21116(自定义端口需明确指出)。
中继服务器环境变量配置 RELAY 后可置空。
API 服务器如果未部署 rustdesk-api 镜像可置空。
key输入公钥文件id_ed25519.pub的内容(也可在日志中找到)。
  • 关于默认端口
默认端口
端口协议服务用途
21114TCPhbbs网页控制台(仅专业版可用)。
21115TCPhbbsNAT类型检测和在线状态查询。
21116TCP/UDPhbbs打洞与连接服务/ID注册与心跳服务。
21117TCPhbbr中继服务。
21118TCPhbbs网页客户端(RustDesk Web Client)。
21119TCPhbbr网页客户端(RustDesk Web Client)。
  • 关于自定义端口

    • 综上,Rustdesk 正常运行的最小端口为 21115,21116,21117。

    • 环境变量PORT定义的是打洞端口(21116),其余端口通过该端口自动计算得出[1]

    • 桥接模式下,务必保持映射前后的端口一致。

  • 关于防火墙

    • 至少需要放行最小运行端口(21115-21117)。

    • 如果使用官方的 Web Client 还需要放行 21118,但在连接时需要在该网站 ID, IP, Key 等信息:

      • <ID>@<服务器地址>?key=<密钥>[2]
  • 关于 rustdesk-api

    • 聊胜于无,更适合当个自部署的 WebClient 使用。

    • 存在一个极其影响使用的 BUG:关于PC端链接超时或者链接不上的问题以及解决方案 · Issue #92

      • 登录账户时且使用原版客户端,容易出现链接超时或者链接不上。
        • 解决方案一:登录账户同步信息后,使用前退出登录。
        • 解决方案二:修改部分代码,自编译一个客户端。
  • 碎碎念

    • Rustdesk 的文档稀烂,关于自定义端口的描述是翻阅 issue 得知的。
    • 中国反诈中心似乎在扫描部署了 RustDesk 的境内服务器,进而封禁 IP,不建议使用默认端口。

PT 一体化工具

  • MoviePilot:自动订阅、整理。
  • Audiobookshelf:自托管有声书架。
  • QBittorrent:常见 PT 站所允许的下载器。
  • Transmission:带快校的下载(保种)器。
  • iyuuplus:辅种、转种。

Docker Compose

moviepilot-v2、qbittorrent、transmission、audiobookshelf、iyuuplus
version: "3.8"
services:
moviepilot:
stdin_open: true
tty: true
image: jxxghp/moviepilot-v2:latest
container_name: moviepilot-v2
restart: always
networks:
- pt-network
ports:
- "23301:3000"
- "23302:3001"
volumes:
- "/opt/Docker/moviepilot-v2/config:/config"
- "/opt/Docker/moviepilot-v2/core:/moviepilot/.cache/ms-playwright"
- "/媒体库目录:/媒体库目录"
environment:
- "NGINX_PORT=3000"
- "PORT=3001"
- "PUID=0"
- "PGID=0"
- "UMASK=000"
- "TZ=Asia/Shanghai"
- "SUPERUSER=admin" # 管理员账户
# - "PROXY_HOST=http://10.0.10.3:1080" # 代理
qbittorrent:
image: linuxserver/qbittorrent:latest
container_name: qbittorrent
restart: always
networks:
- pt-network
volumes:
- "/opt/Docker/qBittorrent:/config"
- "/媒体库目录:/媒体库目录"
ports:
- "23303:8080"
- "23304:6881"
- "23304:6881/udp"
environment:
- "PUID=0"
- "PGID=0"
- "TZ=Asia/Shanghai"
- "WEBUI_PORT=8080"
- "TORRENTING_PORT=6881"
transmission:
image: linuxserver/transmission:4.0.5
container_name: transmission
restart: always
networks:
- pt-network
volumes:
- "/opt/Docker/transmission:/config"
- "/媒体库目录:/媒体库目录"
ports:
- "23305:9091"
- "23306:51413"
- "23306:51413/udp"
environment:
- "PUID=0"
- "PGID=0"
- "TZ=Asia/Shanghai"
- "PEERPORT=9091"
- "RPCPORT=51413"
- "USER=username"
- "PASS=password"
# https://github.com/ronggang/transmission-web-control
- "TRANSMISSION_WEB_HOME=/config/web-control/"
audiobookshelf:
image: advplyr/audiobookshelf:latest
container_name: audiobookshelf
restart: always
networks:
- pt-network
volumes:
- "/opt/Docker/audiobook/metadata:/metadata"
- "/opt/Docker/audiobook/podcasts:/podcasts"
- "/opt/Docker/audiobook/config:/config"
- "/有声资源:/audiobooks"
ports:
- "23307:80"
environment:
- "TZ=Asia/Shanghai"
iyuuplus-dev:
image: iyuucn/iyuuplus-dev:latest
container_name: IYUUPlus
stdin_open: true
tty: true
restart: always
networks:
- pt-network
volumes:
- "/opt/Docker/iyuu/iyuu:/iyuu"
- "/opt/Docker/iyuu/data:/data"
- "/opt/Docker/qBittorrent/qBittorrent/BT_backup:/qb_torrent"
- "/opt/Docker/transmission/torrents:/tr_torrent"
ports:
- "23308:8780"

networks:
pt-network:
driver: bridge
enable_ipv6: true
ipam:
config:
- subnet: "172.19.0.0/16"
gateway: "172.19.0.1"
- subnet: "fd00:db8::/48"
gateway: "fd00:db8::1"

附录

  • 使用指南

内网浏览器

  • Firefox:火狐🦊。

Docker Compose

jlesage/firefox:latest
version: '3.8'
services:
firefox:
image: jlesage/firefox
container_name: firefox
network_mode: bridge
ports:
- "5800:5800"
environment:
- LANG=zh_CN.UTF-8
- ENABLE_CJK_FONT=1
- TZ=Asia/Shanghai
- KEEP_APP_RUNNING=1
- WEB_AUDIO=1
- WEB_AUTHENTICATION=1
- WEB_AUTHENTICATION_USERNAME=username
- WEB_AUTHENTICATION_PASSWORD=password
- VNC_PASSWORD=vnc_password
- SECURE_CONNECTION=1
- BASE_URL=https://反代用域名
volumes:
- /opt/Docker/firefox:/config
restart: unless-stopped

附录

  • 为了开启前端账户和 VNC 密码,就需要开启 WEB_AUTHENTICATION

    • 开启 WEB_AUTHENTICATION 后,必须得以 https 连接服务,即使证书不正确。
    • Nginx 反代配置时,就需要不验证证书:proxy_ssl_verify off
  • Nginx 反代配置,另如需在 CDN 中使用,请关闭回源跟随301/302配置

Nginx 反代配置(局部)
"Firefox_IP:指向部署容器的 IP 地址。
location / {
proxy_pass https://Firefox_IP:5800;
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_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_ssl_verify off;
}
location /websockify {
proxy_pass https://Firefox_IP:5800;
proxy_ssl_verify off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
location /websockify-audio {
proxy_pass https://Firefox_IP:5800;
proxy_ssl_verify off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
  • 如需在 Uptime Kuma 中配置检测,需在请求头中主动指定 Cookie:
{
"Cookie": "login_success_url=https://域名/;login_failure_url=https://域名/login/"
}

  1. 信息来源:rustdesk-server/issues/191#issuecomment-1942185062 ↩︎

  2. 个人不习惯这种行为,如果有使用网页客户端需求,不如部署 rustdesk-api。 ↩︎

评论