记录一下在用或用过的一些 Docker 程序,方便下次需要的时候复制粘贴。

这里把重复使用的变量写成了 .env 配置项,将其放在 compose.yml 同路径即可生效,可以在需要变更的时候批量修改。

PUID=1000
PGID=1000
TZ=Asia/Shanghai
NETWORK=caddy

另外,使用 Caddy 或 Nginx 配置反向代理时,可以直接利用 docker 内网寻址的方式获取容器地址。因此默认注释掉了端口映射,有需要的话可以自行开启。

外部网络使用以下命令创建,例如创建一个名为 caddy 的网络:

docker network create caddy

然后需要在 compose.yml 文件末尾指定这个网络,例如:

networks:
  caddy: 
    external: true

文件

h5ai

h5ai 是个我年轻的时候比较流行的 PHP 文件列表程序,现在有容器版本倒是方便了不少。因为 h5ai 需要开启很多 PHP 环境变量,似乎现在比较少见到大家用这个了。以前还有过内置 Dplayer 的版本。

h5ai is a modern file indexer for HTTP web servers with focus on your files. Directories are displayed in a appealing way and browsing them is enhanced by different views, a breadcrumb and a tree overview. Initially h5ai was an acronym for HTML5 Apache Index but now it supports other web servers too.

h5ai 是一款现代化的 HTTP Web 服务器文件索引器,专注于您的文件。目录以美观的方式呈现,并通过不同的视图、面包屑导航和树形概览增强了浏览体验。h5ai 最初是 HTML5 Apache Index 的缩写,但现在也支持其他 Web 服务器。

另外 h5ai 还有很多可自定义的配置项,有需要请参考:《H5AI 部署、配置与美化》。

services:

  h5ai:
    image: awesometic/h5ai
    container_name: h5ai
    # ports:
    #   - 80:80
    environment:
      - TZ=${TZ}
      - PUID=${PUID}
      - PGID=${PGID}
    volumes:
      - ./h5ai:/config
      - /your/shared/dir:/h5ai
    restart: unless-stopped
    networks:
      - ${NETWORK}

File Browser

File Browser 要比 h5ai 强悍许多,不仅可以直接编辑文件、创建分享链接,还支持多用户。功能上更接近「个人云盘」,因此可以当作轻量云盘使用。

File Browser provides a file managing interface within a specified directory and it can be used to upload, delete, preview and edit your files. It is a create-your-own-cloud-kind of software where you can just install it on your server, direct it to a path and access your files through a nice web interface.

File Browser 可以在指定目录中提供文件管理界面,支持上传、删除、预览和编辑文件。它是一款类似于 “个人云盘” 的软件,您只需将其安装在服务器上,指定路径,然后即可通过美观的 Web 界面访问文件。

我这里的配置和官方有些许不同。官方需要挂载两处文件,而我统一挂载为 /config

services:

  filebrowser:
    image: filebrowser/filebrowser:s6
    container_name: filebrowser
    volumes:
      - ./config:/config
      - ./srv:/srv
    environment:
      - TZ=${TZ}
      - PUID=${PUID}
      - PGID=${PGID}
    # ports:
    #   - "80:80"
    restart: unless-stopped
    networks:
      - ${NETWORK}

只是需要在 /config 文件夹中手动创建两个文件。一个是数据库文件 filebrowser.db ,另一个则是 settings.json

{
  "port": 80,
  "baseURL": "",
  "address": "",
  "log": "stdout",
  "database": "/config/filebrowser.db",
  "root": "/srv"
} 

如果对 root 根目录的路径有自定义的需求,可以在 settings.json 中修改,只是相应地也要修改挂载的路径,不要忘了。

Cloudreve

Cloudreve 和前面俩不一样,是真正意义上的云盘,可以通过多种存储策略构建兼备自用或公用的网盘服务。存在付费功能,但个人版够用。

  • ☁️ 支持本机、从机、七牛、阿里云 OSS、腾讯云 COS、华为云 OBS、又拍云、OneDrive (包括世纪互联版) 、S3 兼容协议 作为存储端
  • 📤 上传/下载 支持客户端直传,支持下载限速
  • 💾 可对接 Aria2 离线下载,可使用多个从机节点分担下载任务
  • 📚 在线 压缩/解压缩、多文件打包下载
  • 💻 覆盖全部存储策略的 WebDAV 协议支持
  • 👩‍👧‍👦 多用户、用户组、多存储策略
  • 🔗 创建文件、目录的分享链接,可设定自动过期
  • 🌈 ... ...

在没有配置数据库的情况下,Cloudreve 会使用 SQLite 存储数据。但 SQLite 不支持高并发,官方建议在生产环境中使用其他数据库。

同时,Cloudreve 支持使用 Redis 作为键值缓存,但 Redis 不是必须的,在没有配置 Redis 的情况下,Cloudreve 会使用内存缓存,并在正常退出前将内存缓存的数据持久化到 cache_persist.bin 文件中。

另外,虽然官方文档写着「其中默认包含并启用了 Aria2」,但我没找到 Aria2 相关的配置,比如后台秘钥。

因此,下面的 compose.yml 增加了 Aria2 容器,配置了 PostgreSQL 数据库,并将 Cloudreve 和 Aria2 的下载目录映射至同一路径。

services:
  cloudreve:
    image: cloudreve/cloudreve:latest
    container_name: cloudreve
    depends_on:
      - postgresql
      - redis
    # ports:
    #   - 5212:5212
    environment:
      - CR_CONF_Database.Type=postgres
      - CR_CONF_Database.Host=postgresql
      - CR_CONF_Database.User=cloudreve
      - CR_CONF_Database.Name=cloudreve
      - CR_CONF_Database.Port=5432
      - CR_CONF_Redis.Server=redis:6379
    volumes:
      - ./cloudreve:/cloudreve/data
      - ./downloads:/downloads
    restart: unless-stopped
    networks:
      - ${NETWORK}


  postgresql:
    image: postgres:latest
    container_name: postgresql
    environment:
      - POSTGRES_USER=cloudreve
      - POSTGRES_DB=cloudreve
      - POSTGRES_HOST_AUTH_METHOD=trust
    volumes:
      - ./postgresql:/var/lib/postgresql/data
    restart: unless-stopped
    networks:
      - ${NETWORK}
      
  aria2:
    image: p3terx/aria2-pro
    container_name: aria2
    # ports:
    #   - 6888:6888
    #   - 6888:6888/udp
    volumes:
      - ./downloads:/downloads
      - ./aria2:/config
    environment:
      - TZ=${TZ}
      - PUID=${PUID}
      - PGID=${PGID}
      - RPC_SECRET=your_secret_here
    restart: unless-stopped
    networks:
      - ${NETWORK}
      

  redis:
    image: redis:latest
    container_name: redis
    volumes:
      - ./redis:/data
    restart: unless-stopped
    networks:
      - ${NETWORK}   

Zfile

ZFile 是一个基于 Java 的在线网盘程序,功能上大体和 Cloudreve 类似,不过不支持离线下载。

  • 支持 S3 协议, 阿里云 OSS, FTP, 华为云 OBS, 本地存储, MINIO, OneDrive 国际/家庭/个人版/世纪互联版/SharePoint, , 七牛云 KODO, 腾讯云 COS, 又拍云 USS.
  • 支持文件操作:上传、下载、重命名、删除、新建文件夹等
  • 图片画廊模式,且支持自定义列数,间距等信息。
  • 文件/文件夹加密、隐藏
  • 目录 readme 文档
  • 支持在线浏览文本文件、PDF、图片、音乐、视频(支持 mp4、flv、hls)
  • 文件直链和二维码
  • 同时挂载多个存储策略
services:

  zfile:
    image: zhaojun1998/zfile:latest
    # ports:
    #   - 8080:8080
    volumes:
      - ./db:/root/.zfile-v4/db
      - ./logs:/root/.zfile-v4/logs
    restart: unless-stopped
    container_name: zfile
    networks:
      - ${NETWORK}

Caddy

Caddy 也能快速搭建一个文件管理列表出来,对于只是浏览和下载来说非常方便,界面也比较美观。

只需要在反代的时候加上 file_server browse,例如:

example.com {
    encode zstd gzip
    root * /home/wwwroot/file
    file_server browse
}

同步

Syncthing

Syncthing 是一个全平台的同步工具,可以在两台或多台设备之间即时同步文件,保证文件的一致性。

Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers. We strive to fulfill the goals below. The goals are listed in order of importance, the most important ones first.

Syncthing 是一款持续文件同步程序 。它可以在两台或多台计算机之间同步文件。我们致力于实现以下目标。这些目标按重要性排序,最重要的放在最前面。

这里使用的是 LinuxServer.io⁠ 的镜像。另外由于 Syncthing 连接的需求,需要映射 22000 端口。

services:
  syncthing:
    image: linuxserver/syncthing:latest
    container_name: syncthing
    # hostname: syncthing #optional
    environment:
      - TZ=${TZ}
      - PUID=${PUID}
      - PGID=${PGID}
    volumes:
      - ./config:/config
      - ./data:/data
    ports:
    #   - 8384:8384
      - 22000:22000/tcp
      - 22000:22000/udp
      - 21027:21027/udp
    restart: unless-stopped
    networks:
      - ${NETWORK} 

监控

Uptime Kuma

Uptime Kuma 是一款易于使用的自托管监控工具。

Github:https://github.com/louislam/uptime-kuma

  • Monitoring uptime for HTTP(s) / TCP / HTTP(s) Keyword / HTTP(s) Json Query / Ping / DNS Record / Push / Steam Game Server / Docker Containers

    监控 HTTP(s) / TCP / HTTP(s) 关键字 / HTTP(s) Json 查询 / Ping / DNS 记录 / 推送 / Steam 游戏服务器 / Docker 容器的正常运行时间

  • Notifications via Telegram, Discord, Gotify, Slack, Pushover, Email (SMTP), and 90+ notification services, click here for the full list
    通过 Telegram、Discord、Gotify、Slack、Pushover、电子邮件 (SMTP) 和 90 多种通知服务发送通知
  • Multi Languages

    多语言

  • Multiple status pages

    多个状态页面

不过 uptime-kuma 包含 Chromium,不仅占空间,还吃内存,需要一定配置的设备运行。

services:

  uptimekuma:
    image: louislam/uptime-kuma:beta
    container_name: uptimekuma
    volumes:
      - ./uptimekuma:/app/data
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=${TZ}
    restart: unless-stopped
    networks:
      - ${NETWORK} 

Nezha

开源、轻量、易用的服务器监控与运维工具。

一键安装:支持一键安装面板和监控服务,操作便捷。兼容主流系统,包括 Linux、Windows、macOS、OpenWRT 以及群晖。

实时监控:支持同时监控多个服务器的状态,提供历史网络状态和延迟图表,监控网页、端口可用性和 SSL 证书状态。支持故障和流量等状态告警,可通过 Telegram、邮件、微信等多种方式提醒。

轻松运维:提供 API 获取服务器状态,支持WebSSH、DDNS 和流量监控。可设置定时和触发任务,并批量执行服务器任务。

可以不用脚本安装面板端:

  nezha:
    image: ghcr.io/nezhahq/nezha
    container_name: nezha
    volumes:
      - ./nezha:/dashboard/data
    environment:
      - TZ=${TZ}
    # ports:
    #   - "8008:8008"
    restart: unless-stopped
    networks:
      - ${NETWORK} 

参考官方文档使用 Nginx 反代即可用 443 端口连接。需要在面板后台设置中勾选「Agent 使用 TLS 连接」,「Agent对接地址」填写「域名:端口」,例如 example.com:443 ,然后就可以在安装监控端的时候正常连接了。

信息

RSSTT

基于 Telegram 机器人创建的 RSS 通知。利用通讯工具的即时属性,可以用来订阅某些重要的通知。

Github:https://github.com/Rongronggg9/RSS-to-Telegram-Bot

这里只列出了必须的环境变量,其他变量如有需求请自行参考官方文档。

services:

  rsstt:
    image: rongronggg9/rss-to-telegram:dev  # stable image: rongronggg9/rss-to-telegram
    container_name: rsstt
    volumes:
      - ./data:/app/config
    environment:
      - TOKEN=xxxx  #访问 @BotFather 获取
      - MANAGER=xxxx  # 访问 @userinfobot 获取,使用;分隔多用户。例如 1234567890;987654321
# ↓------ To disable sending via Telegraph, comment out this area ------↓ #
# 访问以下链接获取 Telegraph API access tokens: https://api.telegra.ph/createAccount?short_name=RSStT&author_name=Generated%20by%20RSStT&author_url=https%3A%2F%2Fgithub.com%2FRongronggg9%2FRSS-to-Telegram-Bot
# 刷新页面即可获取新的 token,如果你有一堆订阅,请至少使用5个token 
#                            ↓ Replace with your access tokens ↓
      - TELEGRAPH_TOKEN=
        xxx
        xxx
      - MULTIUSER=1  #多用户模式,0关闭,1启用,默认为1
      - TZ=${TZ}
    restart: unless-stopped
    networks:
      - ${NETWORK} 

RSSHub

万物皆可 RSS,世界上最大的 RSS 网络。

由于配置了 browserless,因此 RSSHub 非常吃配置,需要部署在稍微给力点的机子上。

services:

  rsshub:
    image: diygod/rsshub:latest
    container_name: rsshub
    # ports:
    #   - '1200:1200'
    environment:
      - NODE_ENV=production
      - CACHE_TYPE=redis
      - REDIS_URL=redis://redis:6379/
      # - PIXIV_REFRESHTOKEN=
      # - PIXIV_IMG_PROXY=
      # - PIXIV_BYPASS_DOH=https://dns.google/dns-query
      # - PIXIV_BYPASS_CDN=true
      - PUPPETEER_WS_ENDPOINT=ws://browserless:3000  # marked
      # - PROXY_URI='socks5h://warp-socks:9091'
    restart: unless-stopped
    depends_on:
    #   - redis
      - browserless
    networks:
      - ${NETWORK} 

  browserless:  # marked
    image: browserless/chrome  # marked
    container_name: browserless
    restart: unless-stopped  # marked
    ulimits:  # marked
      core:  # marked
        hard: 0  # marked
        soft: 0  # marked
    networks:
      - ${NETWORK} 

FreshRSS

自托管 RSS 信息流聚合器。

这里使用的是 LinuxServer.io⁠ 的镜像,另外配置了两个插件。时间久远我也不记得这俩咋用了,如有需要请自行研究。

services:

  freshrss:
    image: linuxserver/freshrss:latest
    container_name: freshrss
    # ports:
    #   - 80:80
    volumes:
      - ./config:/config
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TZ}
      - CRON_MIN=*/20
    logging:
      options:
        max-size: 10m
    restart: unless-stopped
    networks:
      - ${NETWORK} 

  read:
    image: phpdockerio/readability-js-server
    container_name: read
    restart: unless-stopped
    networks:
      - ${NETWORK} 

  merc:
    image: wangqiru/mercury-parser-api
    container_name: merc
    restart: unless-stopped
    networks:
      - ${NETWORK} 

工具

Vaultwarden

自托管密码管理器。

services:

  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    volumes:
      - ./data:/data
    environment:
      - WEBSOCKET_ENABLED=true
      # - ADMIN_TOKEN=
      - SMTP_HOST=
      - SMTP_FROM=
      - SMTP_PORT=
      - SMTP_SECURITY=starttls
      - SMTP_USERNAME=
      - SMTP_PASSWORD=
      - SMTP_AUTH_MECHANISM="Login"
      - DOMAIN=https://
      - SIGNUPS_ALLOWED=false
    restart: unless-stopped
    networks:
      - ${NETWORK} 

Nazurin

帮助你从各种网站收集 ACG 插画的 Telegram 机器人。

这个工具对于我这种收图党来说非常好用,有空水一下用法。

services:
  nazurin:
    image: ghcr.io/y-young/nazurin:latest
    container_name: nazurin
    user: ${PUID}:${PGID}
    # build: .
    env_file:
      - ".env"
    volumes:
      - ./data:/app/data
      - ./Nazurin:/Nazurin
    # ports:
    #   - "80"
    environment:
      - TZ=${TZ}
    restart: unless-stopped
    networks:
      - ${NETWORK} 

由于包含了所有存储配置,默认的环境变量非常长。如果你像我一样也将图片保存在本地,且服务不想对外,可以试试这么写:

# 访问以下链接获取更多信息:https://nazurin.readthedocs.io/getting-started/configuration/

# ---------- Required ----------
# Telegram bot token
TOKEN = xx

# 默认选项(production)使用 Webhook 模式,你可以设置为 development 以使用轮询模式。
ENV = development

# 发送到 Telegram 服务器的 Webhook URL,机器人的服务器应能通过此 URL 访问,应以 / 结尾,例如 https://xxx.fly.dev/。
# 如使用 Webhook 模式则必需
# WEBHOOK_URL = 

# 要绑定到的主机地址,默认为 0.0.0.0。使用反向代理时请设置为 127.0.0.1。
# 如使用 Webhook 模式则必需
HOST = 0.0.0.0

# Webhook 端口,使用 Heroku 时自动设定。
# 如使用 Webhook 模式则必需
PORT = 8080

# 存储类型
STORAGE = Local

# 数据库类型
DATABASE = Local

# 管理员用户的 Telegram 用户 ID(不是用户名),机器人的一些功能仅限管理员用户使用。
ADMIN_ID = xx

# ---------- Optional ----------
# 本地或远程存储的目录路径,如不存在则自动创建。
STORAGE_DIR = /Nazurin

# 同时下载的最大文件数。
MAX_PARALLEL_DOWNLOAD = 6

# 临时目录清理的间隔时间,单位为天。每次清理时将删除访问时间在一天前的文件。设置为 0 时将禁用自动清理。
CLEANUP_INTERVAL = 7

# 图片收藏成功后的反馈方式,可选值如下:
# reply:回复原消息
# reaction: 在原消息上添加表情回应
# both:回复并添加表情回应
FEEDBACK_TYPE = reaction

# ---------- 站点 ----------

# ----- Bilibili -----
# 存储路径
BILIBILI_FILE_PATH = Bilibili

# 文件名称
# BILIBILI_FILE_NAME = {id_str}_{index} - {user[name]}({user[mid]}) 


# ----- Pixiv 配置项-----
# Refresh token
PIXIV_TOKEN = xx

# 浏览作品时的图片代理,用于帮助 Telegram 服务器更稳定地获取图片,下载作品时仍然会使用 Pixiv 服务器。
# PIXIV_MIRROR = 

# 标签的显示语言,如果没有可用翻译则使用日语原文。默认使用原文,配置值将设置在 HTTP Header 的 Accept-Language 选项中。例如:zh-CN, en-US
PIXIV_TRANSLATION = zh-CN

# 收藏可见性 (public/private)
# PIXIV_BOOKMARK_PRIVACY = public

# 存储路径
PIXIV_FILE_PATH = Pixiv/{user[id]}

# 文件名称
PIXIV_FILE_NAME = {filename}

# ----- Twitter 配置项-----
# 要使用的 API,web 或 syndication。Web API 来自网页应用,而 Syndication API 来自 https://publish.twitter.com。
# Syndication API 无法获取被标记为敏感内容的推文,但如果设置了 TWITTER_AUTH_TOKEN,则可以通过 Web API 获取。
# 当 Web API 不可用时,你可以选择切换到 Syndication API。
TWITTER_API = web

# Web API 的授权令牌
TWITTER_AUTH_TOKEN = xx

# 存储路径
TWITTER_FILE_PATH = Twitter

# 文件名称
TWITTER_FILE_NAME = {id_str}_{index} - {user[name]}({user[id_str]})

其他

gh-proxy-go

gh-proxy 的 Go 语言版本。

Github:https://github.com/Xm798/gh-proxy-go

默认的配置文件 config.json 支持自定义以下选项,挂载 /app/config 即可:

  • host: 默认 "0.0.0.0",服务器监听地址
  • port: 默认 8080,服务器监听端口
  • whiteList: 允许访问的 GitHub 用户/组织列表,配置后将拒绝所有未在列表中的请求
  • blackList: 禁止访问的 GitHub 用户/组织列表,配置后将拒绝所有在列表中的请求
  • forceEnUSForRaw: 默认 false,是否强制使用 en-US 语言访问 raw.githubusercontent.com,以规避中文用户可能的 429 错误
  • sizeLimit: 默认 10240,文件大小限制(单位:MB)

注意:hostport 配置不支持热重载,需要重启服务才能生效。其他配置项支持热重载。

services:
  ghproxy:
    image: xm798/gh-proxy-go:latest
    container_name: ghproxy
    # ports:
    #   - 8080:8080
    # volumes:
    #   - ./ghproxy:/app/config
    environment:
      - TZ=${TZ}
    restart: unless-stopped
    networks:
      - ${NETWORK} 

hubproxy

一个轻量级、高性能的多功能镜像服务。

Github:https://github.com/sky22333/hubproxy

services:

  hubproxy:
    container_name: hubproxy
    image: ghcr.io/sky22333/hubproxy
    restart: always
    # ports:
    #   - 5000:5000
    networks:
      - ${NETWORK} 

最后

还有啥等想起来再加进来。