部署与维护 · 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