部署与维护 · Navigation
部署与常见问题
包含 PostgreSQL / SQLite docker-compose 步骤、FeiNiu NAS 说明,以及升级重置与常见错误排查。
主要功能
- 高音质播放:支持 DTS/DSD/APE/WMA 等高码率,自动转码边播边转。
- 媒体库管理:音乐、视频、有声书统一目录,自动封面缩略图生成。
- 多端访问:提供前端 Web 与移动端下载入口,适配个人与私有部署。
- 插件扩展:支持自定义插件目录与元数据服务,灵活拓展能力。
演示内容
最近更新
- 0.2.1:修复同名专辑合并
- 播放问题:修复播放列表同首歌添加多次不能播放的问题
- 新增:新增对已入库资源快速校验不需要重新入库
- 新增:新增一些api业务接口
PostgreSQL 版部署
services:
postgres:
image: postgres:16-alpine
container_name: daoliyu-postgres
restart: unless-stopped
environment:
POSTGRES_DB: "daoliyu"
POSTGRES_USER: "daoliyu"
POSTGRES_PASSWORD: "daoliyupassword"
PGDATA: "/var/lib/postgresql/data/pgdata"
command:
- "postgres"
- "-c"
- "max_connections=200"
- "-c"
- "shared_buffers=256MB"
- "-c"
- "work_mem=32MB"
- "-c"
- "maintenance_work_mem=256MB"
- "-c"
- "checkpoint_completion_target=0.9"
- "-c"
- "wal_buffers=16MB"
- "-c"
- "port=5433"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U daoliyu -d daoliyu -p 5433"]
interval: 10s
timeout: 5s
retries: 6
start_period: 30s
ports:
- "5433:5433"
volumes:
- ./docker-data/postgres:/var/lib/postgresql/data
redis:
image: redis:7-alpine
container_name: daoliyu-redis
restart: unless-stopped
command: ["redis-server", "--appendonly", "yes"]
volumes:
- ./docker-data/redis:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
backend:
image: msmkls/daoliyu-backend:0.2.0
build:
context: ./backend
dockerfile: Dockerfile
container_name: daoliyu-backend
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
environment:
NODE_ENV: production
DATABASE_URL: "postgresql://daoliyu:daoliyupassword@postgres:5433/daoliyu?schema=public&connection_limit=25&pool_timeout=10&statement_timeout=60000&idle_in_transaction_session_timeout=60000"
APP_PORT: 4000
LIBRARY_ROOT: "/data/media"
AUDIOBOOK_LIBRARY_ROOT: "/data/audiobooks"
VIDEO_LIBRARY_ROOT: "/data/music-videos"
VIDEO_TRANSCODE_CACHE: "/app/storage/transcoded/videos"
VIDEO_THUMBNAIL_CACHE: "/app/storage/thumbnails/videos"
PLAYLISTS_IMPORT_ROOT: "/data/playlists"
REGISTRATION_OPEN: "${REGISTRATION_OPEN:-true}"
PLUGINS_DIR: "/plugins"
REDIS_URL: "redis://redis:6379/0"
LOG_LEVEL: "${LOG_LEVEL:-info}"
DEBUG: "${DEBUG:-true}"
volumes:
- ./backend-storage:/app/storage
- ./media:/data/media
- ./audiobooks:/data/audiobooks
- ./music-videos:/data/music-videos
- ./playlists:/data/playlists
- ./plugins:/plugins
networks:
default:
aliases:
- backend
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:4000/health"]
interval: 30s
timeout: 5s
retries: 5
frontend:
image: msmkls/daoliyu-frontend:0.2.0
build:
context: ./frontend
dockerfile: Dockerfile
container_name: daoliyu-frontend
restart: unless-stopped
depends_on:
backend:
condition: service_healthy
ports:
- "5173:8080"
- 确保 5433 端口未被占用;如冲突可在 compose 中修改对外映射。
- 首启后等待后端健康检查通过,再访问前端(默认 5173)。
SQLite 轻量版部署
services:
redis:
image: redis:7-alpine
container_name: daoliyu-redis-sqlite
restart: unless-stopped
# 轻量模式:关闭持久化,内存占用最低
command: ["redis-server", "--save", "", "--appendonly", "no"]
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
backend:
image: msmkls/daoliyu-backend-sqlite:0.2.1
build:
context: ./backend
dockerfile: Dockerfile
args:
PRISMA_SCHEMA: "${PRISMA_SCHEMA-prisma/schema.sqlite.prisma}"
container_name: daoliyu-backend-sqlite
restart: unless-stopped
depends_on:
redis:
condition: service_healthy
environment:
NODE_ENV: production
DATABASE_URL: "file:/app/backend-data/dev.db"
SQLITE_DATABASE_URL: "file:/app/backend-data/dev.db"
PRISMA_SCHEMA: "${PRISMA_SCHEMA-prisma/schema.sqlite.prisma}"
APP_PORT: 4000
LIBRARY_ROOT: "/data/media"
AUDIOBOOK_LIBRARY_ROOT: "/data/audiobooks"
VIDEO_LIBRARY_ROOT: "/data/music-videos"
VIDEO_TRANSCODE_CACHE: "/app/storage/transcoded/videos"
VIDEO_THUMBNAIL_CACHE: "/app/storage/thumbnails/videos"
PLAYLISTS_IMPORT_ROOT: "/data/playlists"
REGISTRATION_OPEN: "${REGISTRATION_OPEN:-true}"
PLUGINS_DIR: "/plugins"
REDIS_URL: "redis://redis:6379/0"
LOG_LEVEL: "${LOG_LEVEL:-info}"
DEBUG: "${DEBUG:-true}"
volumes:
- ./backend-storage:/app/storage
- ./backend-data:/app/backend-data
- ./media:/data/media
- ./audiobooks:/data/audiobooks
- ./music-videos:/data/music-videos
- ./playlists:/data/playlists
- ./plugins:/plugins
networks:
default:
aliases:
- backend
command: >
sh -c "
PRISMA_SCHEMA=prisma/schema.sqlite.prisma &&
npx prisma generate --schema $PRISMA_SCHEMA &&
npx prisma db push --schema $PRISMA_SCHEMA --skip-generate --accept-data-loss &&
node scripts/manage-system-version.js post || true &&
node dist/index.js
"
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:4000/health"]
interval: 30s
timeout: 5s
retries: 5
frontend:
image: msmkls/daoliyu-frontend-sqlite:0.2.1
build:
context: ./frontend
dockerfile: Dockerfile
container_name: daoliyu-frontend-sqlite
restart: unless-stopped
depends_on:
backend:
condition: service_healthy
ports:
- "5173:8080"
- 轻量版内置 Redis 轻量模式,无需独立数据库服务。
- 若看到 PRISMA_SCHEMA 警告,可忽略;已在 compose 默认指向 sqlite schema。
SQLite ARM 版部署
services:
redis:
image: redis:7-alpine
platform: linux/arm64
container_name: daoliyu-redis-sqlite-arm
restart: unless-stopped
command: ["redis-server", "--ignore-warnings", "ARM64-COW-BUG", "--save", "900", "1", "--appendonly", "yes"]
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
backend:
image: msmkls/daoliyu-backend-sqlite:arm-0.2.1
platform: linux/arm64
build:
context: ./backend
dockerfile: Dockerfile
args:
PRISMA_SCHEMA: "${PRISMA_SCHEMA-prisma/schema.sqlite.prisma}"
container_name: daoliyu-backend-sqlite-arm
restart: unless-stopped
depends_on:
redis:
condition: service_healthy
environment:
NODE_ENV: production
DATABASE_URL: "file:/app/backend-data/dev.db"
SQLITE_DATABASE_URL: "file:/app/backend-data/dev.db"
PRISMA_SCHEMA: "${PRISMA_SCHEMA-prisma/schema.sqlite.prisma}"
APP_PORT: 4000
LIBRARY_ROOT: "/data/media"
AUDIOBOOK_LIBRARY_ROOT: "/data/audiobooks"
VIDEO_LIBRARY_ROOT: "/data/music-videos"
VIDEO_TRANSCODE_CACHE: "/app/storage/transcoded/videos"
VIDEO_THUMBNAIL_CACHE: "/app/storage/thumbnails/videos"
PLAYLISTS_IMPORT_ROOT: "/data/playlists"
REGISTRATION_OPEN: "${REGISTRATION_OPEN:-true}"
PLUGINS_DIR: "/plugins"
REDIS_URL: "redis://redis:6379/0"
LOG_LEVEL: "${LOG_LEVEL:-info}"
DEBUG: "${DEBUG:-true}"
volumes:
- ./backend-storage:/app/storage
- ./backend-data:/app/backend-data
- ./media:/data/media
- ./audiobooks:/data/audiobooks
- ./music-videos:/data/music-videos
- ./playlists:/data/playlists
- ./plugins:/plugins
networks:
default:
aliases:
- backend
command: >
sh -c "
PRISMA_SCHEMA=prisma/schema.sqlite.prisma &&
npx prisma generate --schema $PRISMA_SCHEMA &&
npx prisma db push --schema $PRISMA_SCHEMA --skip-generate --accept-data-loss &&
node scripts/manage-system-version.js post || true &&
node dist/index.js
"
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:4000/health"]
interval: 30s
timeout: 5s
retries: 5
frontend:
image: msmkls/daoliyu-frontend-sqlite:arm-0.2.1
platform: linux/arm64
build:
context: ./frontend
dockerfile: Dockerfile
container_name: daoliyu-frontend-sqlite-arm
restart: unless-stopped
depends_on:
backend:
condition: service_healthy
ports:
- "5173:8080"
- 已指定
platform: linux/arm64,适配树莓派、arm64 NAS 等设备;若镜像多架构可直接使用。 - 保持卷与端口与 x86 配置一致,可与上方轻量版互换使用。
在飞牛 NAS 部署
飞牛 FPK 安装
在应用商店搜索 “道理鱼音乐” 按照向导安装即可。对应的数据目录在「文件管理 - 应用文件 - daoliyu-msuic」下,将音乐文件放入即可。 若需卸载重装,卸载后直接删除该目录全部内容,再重新安装即可。 若通过网盘下载 FPK 安装包,根据飞牛官方设定不允许覆盖商店版本,需先卸载官方应用再手动安装,数据不会丢失(只要不删除「文件管理 - 应用文件 - daoliyu-msuic」)。
『来自123云盘用户的分享』道理鱼音乐应用版
链接:https://www.123865.com/s/8sh9-0aXsh?pwd=azjo
提取码:azjo
升级 / 重置指引
- FPK 升级方式 1:商店版本按商店提示更新即可。
- FPK 升级方式 2:直接下载最新 FPK 手动安装即可。
- Docker compose:默认仅需修改前后端镜像版本号(如 0.1.9 → 0.2.0)并重新拉起,无需额外改动。
常见问题排查
目录映射
- ./backend-storage:/app/storage
- ./backend-data:/app/backend-data
- ./media:/data/media # 音乐目录
- ./media1:/data/media1 # 自定义音乐目录(映射到 /data/ 下,记得对应类型)
- ./audiobooks:/data/audiobooks # 有声书
- ./audiobooks1:/data/audiobooks1 # 自定义有声书(映射到 /data/ 下,记得对应类型)
- ./music-videos:/data/music-videos # 音乐视频
- ./playlists:/data/playlists # 歌单目录
- ./plugins:/plugins