Docker Compose 文件分享&存档
太久没写文章了,要水两篇
把自己常用的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挂载的硬连接在存储服务器异常下线的情况下,依旧保持连接导致阻塞,然后炸掉服务器之类的