Skip to content

INFO

以下示例 Docker Compose 文件中的一些定义采用了我的习惯和风格。不必和我相同,按自己的需要定义即可

一些:端口映射的的外部端口、数据存储路径

docker-wechat

Compose
yml
name: wechat
services:
  wechat:
    image: ricwang/docker-wechat:latest
    container_name: wechat
    volumes:
      - /app/WeChat/.xwechat:/root/.xwechat # 程序配置
      - /app/WeChat/xwechat_files:/root/xwechat_files # 聊天记录
      - /app/WeChat/downloads:/root/downloads # 文件交互
      - /dev/snd:/dev/snd
    ports:
      - 5800:5800
      - 5900:5900
    environment:
      - LANG=zh_CN.UTF-8
      - USER_ID=0
      - GROUP_ID=0
      - WEB_AUDIO=1
      - TZ=Asia/Shanghai
    privileged: true

SyncThing

Compose
yml
name: "syncthing"
services:
  Syncthing:
    image: lscr.io/linuxserver/syncthing
    container_name: syncthing
    hostname: syncthing # 可选
    network_mode: host
    environment:
      - PUID=3000 # NAS中的用户名和用户组
      - PGID=950
      - TZ=Asia/Shanghai
    volumes:
      - /app/syncthing/config:/config
      - mynfs:/mnt/nfs

    # ports:
    #   - 8384:8384
    #   - 22000:22000/tcp
    #   - 22000:22000/udp
    #   - 21027:21027/udp

    restart: always

volumes:
  mynfs:
    external: true

安装完成后,管理页在服务器的端口8384

Vault Wardens

更多提示可参考 Vaultwarden Wiki 中文版

创建管理员令牌。该令牌可以是任何字符,但建议使用随机生成的长字符串。

shell
openssl rand -base64 48 # 生成随机的长字符串

示例

Compose
yml
# 密码管理器

services:
  Vaultwarden:
    image: vaultwarden/server:latest
    container_name: Vaultwarden
    restart: always

    environment:
      # 管理
      SIGNUPS_ALLOWED: "true" # 创建账户后,使用 "false" 停用此选项,这样就不会有陌生人注册了
      ADMIN_TOKEN: XXX
      DOMAIN: "https://pwd.example.com:80" # 使用反向代理时必填;您的域名;Vaultwarden 需要知道它是 https 才能正确处理附件

      # 电子邮件 用于通知
      SMTP_HOST: smtp.qq.com
      SMTP_PORT: 465
      SMTP_FROM: xxx@qq.com
      SMTP_SECURITY: force_tls
      SMTP_USERNAME: xxx@qq.com
      SMTP_PASSWORD: xxx

      # # 移动客户端推送通知
      # PUSH_ENABLED: true
      # PUSH_INSTALLATION_ID: xxx
      # PUSH_INSTALLATION_KEY: xxx

    volumes:
      - /app/Vaultwarden:/data # 数据挂载路径
    ports:
      - 5053:80

meTube

Compose
yml
name: metube

services:
    metube:
        image: ghcr.io/alexta69/metube
        container_name: metube
        restart: unless-stopped
        ports:
            - "5039:8081"
        volumes:
            - mysmb:/downloads
            - /app/MeTube/cookie.txt:/cookies/cookies.txt
        environment:
            - DEFAULT_THEMEDEFAULT_THEME=Dark
            # - DOWNLOAD_DIR=/mnt/nas/Download/Video
            - DOWNLOAD_DIRS_INDEXABLE=true
            - CUSTOM_DIRS=true
            - YTDL_OPTIONS={"cookiefile":"/cookies/cookies.txt"}

volumes:
    mysmb:
        driver_opts:
            type: "cifs"
            o: "addr=192.168.5.25,username=用户,password=密码,dir_mode=0777,file_mode=0777,vers=3.0"
            device: "//192.168.5.25/pool_1/Download/Video"

获取Cookie

YouTube禁止未登录用户的限制较多,需要先登录。

简单的方式是,让metube 使用使用已有的凭证。

  1. 打开浏览器
  2. 安装Cookie Editor
  3. 在YT界面,点击Cookie Editor的导出,选择格式Netscape
  4. 粘贴到/app/MeTube/cookie.txt

Open Speed Test

Compose
yml
name: open-speed-test
version: '3.3'
services:
    speedtest:
        restart: unless-stopped
        container_name: openspeedtest
        ports:
            - '5029:3000'
            - '5030:3001'
        image: openspeedtest/latest

航海机场 在线音乐平台

Compose
yml
name: "navidrome"
services:
  navidrome:
    image: deluan/navidrome:latest
    ports:
      - "5037:4533"
    environment:
      # Optional: put your config options customization here. Examples:
      ND_LASTFM_LANGUAGE: zh-Hans
      ND_COVERJPEGQUALITY: 100 # 封面Jpeg质量
      ND_ENABLECOVERANIMATION: false # 启用封面动画
      ND_ENABLESTARRATING: false # 在 UI 中启用 5 星评级
      ND_ENABLETRANSCODINGCONFIG: true # 在 UI 中启用转码配置
      # ND_CONFIGFILE: "/config/navidrome.toml"

    volumes:
      - "/app/Navidrome/data:/data"
      - "/app/Navidrome/config:/config"
      - "/mnt/NAS/Music:/music:ro" # 你的音乐文件夹


  # music-tag:
  #   image: xhongc/music_tag_web:latest
  #   container_name: music-tag-web
  #   ports:
  #     - "5036:8001"
  #   volumes:
  #     - /mnt/NAS/Music:/app/media:rw
  #     - /app/music-tag-web/data:/app/data
  #   command: /start
  #   restart: always

bili-sync

同步 bilibili 中的收藏夹、视频列表、稍后再看到本地
详见bili-sync 文档

Compose
yml
name: bili-sync
services:
  bili-sync-rs:
    image: amtoaer/bili-sync-rs:latest
    restart: always
    network_mode: bridge
    # 该选项请仅在日志终端支持彩色输出时启用,否则日志中可能会出现乱码
    tty: true
    # 非必需设置项,推荐设置为宿主机用户的 uid 及 gid (`$uid:$gid`)
    # 可以执行 `id ${user}` 获取 `user` 用户的 uid 及 gid
    # 程序下载的所有文件权限将与此处的用户保持一致,不设置默认为 Root
    # user: 3000:950
    hostname: bili-sync-rs
    container_name: bili-sync-rs
    volumes:
      - /app/bili-sync:/app/.config/bili-sync
      
      - /app/jellyfin/config/metadata/People:/app/.config/bili-sync/upper_face # Jellyfin的演员信息的保存位置

      - my_smb:/mnt/nas 
      # 还需要有一些其它必要的挂载,包括 up 主信息位置、视频下载位置
      # 这些目录不是固定的,只需要确保此处的挂载与 bili-sync-rs 的配置文件相匹配
      # ...
    # environment:
    #   - RUST_BACKTRACE=full
    #   - PUID=3000 # NAS中的用户名和用户组
    #   - PGID=950

    logging:
      driver: "local"

volumes:
  my_smb:
    external: true

安装应用后,按文档修改 配置文件 即可。

Suwayomi

浏览器看漫画

Compose
yml
name: suwayomi

services:

  suwayomi:
    image: ghcr.io/suwayomi/tachidesk:latest
    environment:
      - TZ=Asia/Shanghai # 使用TZ数据库中的时区名称,详见https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
      # 如果不使用本文件底部的flaresolverr容器,可以注释掉下面两行
      - FLARESOLVERR_ENABLED=true
      - FLARESOLVERR_URL=http://flaresolverr:8191
#  ###################################################################################################
#    !!! 重要 !!!
#     - 服务器设置可以在WebUI中运行时更改
#     - 提供环境变量将在启动容器时覆盖当前设置值
#  ###################################################################################################
#    设置环境变量的示例:
#      - BIND_IP=0.0.0.0
#      - BIND_PORT=4567
#      - SOCKS_PROXY_ENABLED=false
#      - DOWNLOAD_AS_CBZ=true
#      - BASIC_AUTH_ENABLED=true
#      - BASIC_AUTH_USERNAME=manga
#      - BASIC_AUTH_PASSWORD=hello123
#      - EXTENSION_REPOS=["http://github.com/orginazation-name/repo-name", "http://github.com/orginazation-name-2/repo-name-2"]
    volumes:
      - /app/suwayomi/data:/home/suwayomi/.local/share/Tachidesk
      # - /app/suwayomi/sources:/home/suwayomi/.local/share/Tachidesk/my_sources
    # chown 1000:1000 /app/suwayomi/data # suwayomi 默认不以用户 root 运行。需要修改宿主机上的文件属主,以允许程序访问。
    ports:
      - "4567:4567"
    restart: on-failure:3
  flaresolverr:
    image: ghcr.io/flaresolverr/flaresolverr:latest
    container_name: flaresolverr
    environment:
      - TZ=Asia/Shanghai # 使用TZ数据库中的时区名称,详见https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
    ports:
      - "8191:8191"
    restart: unless-stopped

WebUI > 设置 > 语言 :选择中文

WebUI > 设置 > 浏览 > 扩展库 :添加漫画源。

text
https://github.com/keiyoushi/extensions/raw/refs/heads/repo/index.min.json
https://raw.githubusercontent.com/stevenyomi/copymanga/repo/index.min.json

WebUI > 浏览 > 插件 :在右上角选择需要的语言,安装需要的插件
WebUI > 浏览 > 图源 :在右上角选择需要的语言。

INFO

部分网站需要科学上网

MCSManager

纯Docker部署

Compose
yml
name: mcsmanager
services:
  web:
    image: githubyumao/mcsmanager-web:latest
    ports:
      - 23333:23333
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /app/MCSManager/web/data:/opt/mcsmanager/web/data
      - /app/MCSManager/web/logs:/opt/mcsmanager/web/logs

  daemon:
    image: githubyumao/mcsmanager-daemon:latest
    restart: unless-stopped
    network_mode: host
    ports:
      - 24444:24444
    environment:
      - MCSM_DOCKER_WORKSPACE_PATH=/app/MCSManager/daemon/data/InstanceData
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /app/MCSManager/daemon/data:/opt/mcsmanager/daemon/data
      - /app/MCSManager/daemon/logs:/opt/mcsmanager/daemon/logs
      - /var/run/docker.sock:/var/run/docker.sock

MCSManager 分为前端、后端,前者用于展示管理页,后者用于控制MC的进程。使用Docker安装,须修改后端的地址。 webUI > 节点 > 本地远程节点 IP 地址为宿主机的IP,如 192.168.7.32

MC Java 版服务端 运行在 容器

webUI > 应用实例 > 新建应用 > 您想部署一个什么应用实例? > Minecraft Java版游戏服务器 > .. > 请选择部署应用实例的方式? > Minecraft 快速部署:选择服务端版本,前往实例控制台。

webUI > 应用实例 > 某实例 > 功能组 > 应用实例设置 > 容器化 :启用 Docker 容器:开 ;Docker 镜像:新建镜像 > 新增镜像 > 创建 OpenJDK 17 环境镜像
webUI > 应用实例 > 某实例 > 功能组 > 应用实例设置 > 容器化:选择刚刚创建的镜像。建议设置一个容器名,如mc-java
默认情况下,外部不能主动连接容器。有2个解决方案:

  • 网络模式:host
  • 开放端口:19132:19132/TCP

至此,可以启动MC服务端了。在游戏中,可以用宿主机的IP+端口19132来连接。MC服务端运行在名为mc-java的容器中。

UpSnap

Compose
yml
name: upsnap
ervices:
  upsnap:
    container_name: upsnap
    image: ghcr.io/seriousm4x/upsnap:4
    network_mode: host
    restart: unless-stopped
    volumes:
      - /app/UpSnap/data:/app/pb_data
    environment:
      - TZ=Asia/Shanghai # 设置容器的时区以便于 cron 调度
    #   - UPSNAP_INTERVAL=@every 10s # 设置设备 ping 的间隔时间
    #   - UPSNAP_SCAN_RANGE=192.168.5.0/24 # 扫描范围,用于本地网络上的设备发现
    #   - UPSNAP_SCAN_TIMEOUT=500ms # 扫描超时是 nmap 的 --host-timeout 值,用于等待设备响应 (https://nmap.org/book/man-performance.html)
    #   - UPSNAP_PING_PRIVILEGED=true # 如果没有 root 用户权限,请设置为 false
    #   - UPSNAP_WEBSITE_TITLE=Custom name # 自定义网站标题
    # # dns 用于网络扫描期间的名称解析
    # dns:
    #   - 192.18.0.1
    #   - 192.18.0.2
    # # 可以像这样更改容器内的监听 ip、port
    # entrypoint: /bin/sh -c "./upsnap serve --http 0.0.0.0:5037" 
    # healthcheck:
    #   test: curl -fs "http://localhost:5037/api/health" || exit 1
    #   interval: 10s
    # # 或者安装自定义包以便于关闭
    # entrypoint: /bin/sh -c "apk update && apk add --no-cache <YOUR_PACKAGE> && rm -rf /var/cache/apk/* && ./upsnap serve --http 0.0.0.0:8090"

Sub Store

yaml
name: sub-store
services:
    sub-store:
        restart: unless-stopped
        environment:
            - SUB_STORE_CRON=55 23 * * *
            - SUB_STORE_FRONTEND_BACKEND_PATH=/4GWP5NSloOA1EgS
        ports:
            - 3001:3001
        volumes:
            - /app/sub-store:/opt/app/data
        container_name: sub-store
        image: xream/sub-store

通过此格式的链接访问管理面板

html
http://<机器IP>:3001?api=http://<机器IP>:3001/<入口>

例子

yaml
http://192.168.1.7:3001?api=http://192.168.1.7:3001/4GWP5NSloOA1EgS # 内网访问
https://sub.example.com?api=https://sub.example.com/4GWP5NSloOA1EgS # 公网访问

以下是2套预设,可以节省一些时间。保存此内容为文件,然后在左上角导入,即可。
白嫖付费

节点可用性测试

可以使用一个脚本,来剔除不可用的节点。
用法:在某个订阅的管理页面添加一个“操作”:脚本操作。链接为此脚本
可以在链接的末尾添加一个#,然后写参数。参数间用&连接。更多用法可以查阅脚本的开头和在TG的说明

绕过代理

如果机器处于代理下(如软路由),可能导致结果不准。如果能绕过代理,就能解决这个问题。
一个方法是 MACvLAN。即让此应用的流量拥有自己的MAC地址,就能让OpenClash绕过此MAC地址(此应用)的流量。

Compose
yml
name: sub-store
services:
    sub-store:
        restart: unless-stopped
        environment:
            - SUB_STORE_CRON=55 * * * *
            - SUB_STORE_FRONTEND_BACKEND_PATH=/4GWP5NSloOA1EgS
        ports:
            - 3001:3001
        volumes:
            - /app/sub-store:/opt/app/data
        container_name: sub-store
        image: xream/sub-store:http-meta
        
        networks:
            my-macvlan:
                ipv4_address: 192.168.5.30
networks:
  my-macvlan:
    external: true

WARNING

如果你曾用过我编写的 qbittorrent的 Docker Compose,那么网络的名称就不是这个。

绕过软路由的代理 有更多的细节。