太久没写文章了,要水两篇
把自己常用的Docker Compose文件做下存档,方便All in Boom炸了还能恢复。

以前用UnRaid的时候倒是没怎么在意这些,炸了一次后就感觉比较麻烦了。
转用Debian用Docker的时候一次性把要用到的都写了下来。

但是实际上要恢复的话,Docker的持久化数据备份也是必要的,
要是没有持久化数据的话,单用Docker存储卷,我也不知道要怎么保存下来。
以下所有的Docker Compose都做了持久化存储

请忽略没什么美感的命名

NetWork-Web

services:

  lucky:
    container_name: Net_Lucky
    image: gdy666/lucky
    network_mode: host
    restart: always
    volumes:
      - ./Lucky_file:/goodluck

  sun-panel:
    container_name: Net_SUN-Panel
    image: hslr/sun-panel
    network_mode: bridge
    restart: always
    ports:
      - 10001:3002
    volumes:
      - ./SUN-Panel_file:/app/conf

  speedtest-x:
    container_name: Net_SpeedTest-X
    image: badapple9/speedtest-x
    network_mode: bridge
    restart: always
    ports:
      - 10003:80
    environment:
      - WEBPORT=80
      - MAX_LOG_COUNT=100
      - IP_SERVICE=ip.sb
      - SAME_IP_MULTI_LOGS=true

简要的说明:
Lucky:很好用的综合反向代理软件,包含反向代理,端口转发,DDNS,证书续签,还有网络唤醒,功能超级多。
Sun-Panel:一个网页主页/收藏页,可以比较容易的做出简约的主页。
SpeedTest-X:测速软件,可能有用,总是有想知道自己战斗力的时候。


Remote-File

services:

  openlist:
    container_name: Fil_OpenList
    image: openlistteam/openlist:latest-aio
    network_mode: bridge
    restart: unless-stopped
    ports:
      - 10010:5244
    volumes:
      - ./OpenList_file:/opt/openlist/data
      - /mnt/share:/mnt/data #数据目录

  taosync:
    container_name: Fil_TaoSync
    image: dr34m/tao-sync:latest
    network_mode: bridge
    restart: unless-stopped
    ports:
      - 10011:8023
    volumes:
      - ./TaoSync_file:/app/data #数据目录

  filebrowser:
    container_name: Fil_FileBrowser
    image: filebrowser/filebrowser
    network_mode: bridge
    restart: unless-stopped
    ports:
      - 10020:80
    volumes:
      - ./FileBrowser_file/database:/database
      - ./FileBrowser_file/config:/config
      - /mnt/share:/srv #数据目录

  qbittorrent:
    container_name: Fil_Qbittorrent
    image: lscr.io/linuxserver/qbittorrent
    network_mode: bridge
    restart: unless-stopped
    ports:
      - 10030:8080
      - 10031:6881/tcp
      - 10031:6881/udp
    volumes:
      - ./Qbittorrent_file:/config
      - /mnt/share/8_下载:/Download #下载目录
      - /mnt/share/3_影视:/Media #这是为了ANI-RSS的影视移动

简要的说明:
OpenList:Alist出现数据危险后的后继者,可以把网盘全部合并在一起显示和使用,很强。
TaoSync:用于Alist/OpenList的同步/备份软件,可以选择OpenList里的源与目的地同步,我用于将本地同步至网盘。
FileBrowser:老牌网页文件浏览器,最近停止功能性更新了,但还在维护,主要用于OpenList没法用的情况下。
Qbittorrent:老牌种子下载器,没什么特别可以说的,就是个种子下载器。


User-Service

services:

  ani-rss:
    container_name: Usr_ANI-RSS
    image: wushuo894/ani-rss
    network_mode: bridge
    restart: unless-stopped
    ports:
      - 11010:7789
    volumes:
      - ./ANI-RSS_file:/config
      - /mnt/share/3_影视:/Media #为了配合Qbittorrent,可以将下载后的影视自动归类
    environment:
      - PORT=7789
      - CONFIG=/config
      - TZ=Asia/Shanghai

  suwayomi:
    container_name: Usr_Suwayomi
    image: ghcr.io/suwayomi/tachidesk
    network_mode: bridge
    restart: always
    ports:
      - 11020:4567
    volumes:
      - ./Suwayomi_file:/home/suwayomi/.local/share/Tachidesk

  jellyfin:
    container_name: Usr_Jellyfin
    image: nyanmisaka/jellyfin
    network_mode: bridge
    restart: unless-stopped
    ports:
      - 11030:8096
    volumes:
      - ./Jellyfin_file/config:/config
      - ./Jellyfin_file/cache:/cache
      - ./Jellyfin_file/fonts:/usr/share/fonts #特殊情况下要用的字体
      - /mnt/share/3_影视:/media
    #devices:
      #- /dev/dri:/dev/dri #PVE环境下因为显卡炸了几次,怕了

  immich-server:
    container_name: Usr_Immich_Server
    image: ghcr.io/immich-app/immich-server:release
    #extends:
      #file: hwaccel.transcoding.yml
      #service: quicksync #这是immich用于转码调用的显卡,我用不了,每次都炸
    volumes:
      - /mnt/share/2_照片/immich:/data
      - /mnt/share/2_照片/外部图库:/import
      - /etc/localtime:/etc/localtime:ro
    environment:
      DB_PASSWORD: #数据库密码
    ports:
      - '11040:2283'
    depends_on:
      - redis
      - database
    restart: unless-stopped
    healthcheck:
      disable: false

  #immich-machine-learning: #immich的机器学习服务器,我暂时没用
    #container_name: Usr_Immich_Machine_Learning
    #image: ghcr.io/immich-app/immich-machine-learning:release
    #extends:
      #file: hwaccel.ml.yml
      #service: openvino
    #volumes:
      #- ./Immich_file/model_cache:/cache
    #env_file:
      #- 1panel.env
    #restart: always
    #healthcheck:
      #disable: false

  redis:
    container_name: Usr_Immich_Redis
    image: docker.io/valkey/valkey:8-bookworm@sha256:fec42f399876eb6faf9e008570597741c87ff7662a54185593e74b09ce83d177
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always

  database:
    container_name: Usr_Immich_Postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
    environment:
      POSTGRES_PASSWORD: #数据库密码,和上面的要一致
      POSTGRES_USER: postgres
      POSTGRES_DB: immich
      POSTGRES_INITDB_ARGS: '--data-checksums'
    volumes:
      - ./Immich_file/postgres:/var/lib/postgresql/data
    restart: always

  vaultwarden:
    image: vaultwarden/server:latest
    container_name: Usr_VaultWarden
    network_mode: bridge
    restart: always
    ports:
      - 11050:80
    volumes:
      - ./VaultWarden_File:/data
    environment:
      - WEBSOCKET_ENABLED=true
      # - ADMIN_TOKEN=
      - SMTP_HOST=#邮件发信服务器
      - SMTP_FROM=#邮件发信账号
      - SMTP_PORT=#邮件发信服务器端口
      - SMTP_SECURITY=starttls
      - SMTP_USERNAME=#邮件发信用户
      - SMTP_PASSWORD=#邮件发信密码
      - DOMAIN=#主机域名
      - SIGNUPS_ALLOWED=false

简要的说明:
ANI-RSS:番剧下载器,可以自动移动到你指定的文件夹,还可以在页面里调用播放器直接看,很爽。
Suwayomi:漫画服务器,需要配合拷贝漫画的拓展使用,相当与网页版的Tachiyomi/Mihon,当时装这个主要是苹果没有好用的漫画软件)
Jellyfin:经典影视服务器,需要自己搞影视的刮削数据,有些小众的很难整理好,暂时不想管了。
Immich-server:照片服务,手机上有APP,可以自动上传保存,相当于私有化的Google相册,还在频繁更新,挺好的。
Redis:Immich的附属服务
Database:Immich的附属服务
Immich-machine-learning:immch的机器学习服务器,但是我的PVE一调用显卡就崩,现在已经换成用游戏机的3070来跑了。
Vaultwarden:私有密码管理器,挺好用,但是和浏览器自动填充还有些细微的问题,Win7的chrome就没法正常用。


#!/bin/sh
set -eu

# 配置变量
MOUNT_POINT="/mnt/share"
COMPOSE_REMOTE="/opt/1panel/docker/compose/remote-file"
COMPOSE_USER="/opt/1panel/docker/compose/user-service"
REMOTE_SERVICES="openlist filebrowser qbittorrent"
USER_SERVICES="ani-rss jellyfin immich-server"

# 日志函数
log() {
  printf '[%s] %s\n' "$(date '+%F %T')" "$*"
}

# 1. 获取 NFS 服务端 IP
log "正在检测 NFS 挂载点 $MOUNT_POINT 的状态..."
SERVER_IP=$(findmnt -n -o SOURCE --target "$MOUNT_POINT" | awk -F: '{print $1}')

if [ -z "$SERVER_IP" ]; then
  log "错误:无法获取 NFS 服务端 IP,挂载点可能未正确挂载或已失效。"
  log "正在停止所有依赖服务..."
  (cd "$COMPOSE_REMOTE" && docker compose stop $REMOTE_SERVICES)
  (cd "$COMPOSE_USER"   && docker compose stop $USER_SERVICES)
  exit 1
fi

log "已获取 NFS 服务端 IP: $SERVER_IP"

# 2. 检查服务端网络可达性
log "正在检测 NFS 服务端 $SERVER_IP 的网络连通性..."
if ! ping -c 1 -W 3 "$SERVER_IP" > /dev/null 2>&1; then
  log "警告:NFS 服务端 $SERVER_IP 网络不可达。"
  log "正在停止所有依赖服务..."
  (cd "$COMPOSE_REMOTE" && docker compose stop $REMOTE_SERVICES)
  (cd "$COMPOSE_USER"   && docker compose stop $USER_SERVICES)
  exit 1
fi

log "NFS 服务端 $SERVER_IP 网络连通性正常。"

# 3. 使用 timeout 限制 mountpoint 的执行,检测挂载状态
log "正在检测挂载点 $MOUNT_POINT 的响应状态..."
if timeout 5s mountpoint -q "$MOUNT_POINT"; then
  log "NFS 挂载点 $MOUNT_POINT 状态正常。"
  exit 0
else
  # timeout 返回非零状态码,可能是超时(124)或 mountpoint 本身返回错误
  if [ $? -eq 124 ]; then
    log "错误:检测挂载点 $MOUNT_POINT 状态超时(5秒),NFS 服务可能无响应。"
  else
    log "错误:挂载点 $MOUNT_POINT 状态异常。"
  fi
  log "正在停止所有依赖服务..."
  (cd "$COMPOSE_REMOTE" && docker compose stop $REMOTE_SERVICES)
  (cd "$COMPOSE_USER"   && docker compose stop $USER_SERVICES)
  exit 1
fi

检测NFS通讯的脚本,检测不到就关闭需要用到共享的Docker,很简单
本意是为了防止NFS挂载的硬连接在存储服务器异常下线的情况下,依旧保持连接导致阻塞,然后炸掉服务器之类的

标签: Docker

添加新评论