[Bug]: Server crashes when visiting a specific series #2685

Closed
opened 2026-04-25 00:09:35 +02:00 by adam · 9 comments
Owner

Originally created by @Entepotenz on GitHub (Mar 23, 2025).

What happened?

Hello everyone,

When visiting a specific audiobook series in the "series" view the server crashes immediately.
This error is 100% reproducible with this specific series.

I am running audiobookshelf in this environment:
Docker (ghcr.io/advplyr/audiobookshelf:latest)

What did you expect to happen?

The server keeps running and if there is a problem I get an error message instead of a crashing server.

Steps to reproduce the issue

  1. Open this specific series

Audiobookshelf version

v2.20.0

How are you running audiobookshelf?

Docker

What OS is your Audiobookshelf server hosted from?

Linux

If the issue is being seen in the UI, what browsers are you seeing the problem on?

Other (list in "Additional Notes" box)

Logs

Options: CONFIG_PATH=/config, METADATA_PATH=/metadata, PORT=8080, HOST=undefined, SOURCE=docker, ROUTER_BASE_PATH=/audiobookshelf
[2025-03-23 17:37:14.002] INFO: === Starting Server ===
[2025-03-23 17:37:14.016] INFO: [Server] Init v2.20.0
[2025-03-23 17:37:14.017] INFO: [Server] Node.js Version: v20.19.0
[2025-03-23 17:37:14.017] INFO: [Server] Platform: linux
[2025-03-23 17:37:14.017] INFO: [Server] Arch: x64
[2025-03-23 17:37:14.023] INFO: [Database] Initializing db at "/config/absdatabase.sqlite"
[2025-03-23 17:37:14.061] INFO: [Database] Loading extension /usr/local/lib/nusqlite3/libnusqlite3.so
[2025-03-23 17:37:14.062] INFO: [Database] Successfully loaded extension /usr/local/lib/nusqlite3/libnusqlite3.so
[2025-03-23 17:37:14.063] INFO: [Database] Db supports unaccent and unicode foldings
[2025-03-23 17:37:14.063] INFO: [Database] Db connection was successful
[2025-03-23 17:37:14.076] INFO: [MigrationManager] Database is already up to date.
[2025-03-23 17:37:14.412] INFO: [Database] Db initialized with models: user, library, libraryFolder, book, podcast, podcastEpisode, libraryItem, mediaProgress, series, bookSeries, author, bookAuthor, collection, collectionBook, playlist, playlistMediaItem, device, playbackSession, feed, feedEpisode, setting, customMetadataProvider, mediaItemShare
[2025-03-23 17:37:14.501] INFO: [Database] running ANALYZE
[2025-03-23 17:37:14.513] INFO: [Database] ANALYZE completed
[2025-03-23 17:37:14.516] INFO: [LogManager] Init current daily log filename: 2025-03-23.txt
[2025-03-23 17:37:14.580] INFO: [BackupManager] 2 Backups Found
[2025-03-23 17:37:14.614] INFO: [Watcher] Initializing watcher for "All".
[2025-03-23 17:37:14.637] INFO: Listening on port :8080
[2025-03-23 17:37:15.636] INFO: [Watcher] "All" Ready
[2025-03-23 17:59:26.925] INFO: [SocketAuthority] Socket Connected to /socket.io EjFobYIG46TjiY9DAAAB
[2025-03-23 18:05:13.830] INFO: [SocketAuthority] Socket EjFobYIG46TjiY9DAAAB disconnected from client "USERNAME" after 346904ms (Reason: ping timeout)
[2025-03-23 18:32:56.472] INFO: [SocketAuthority] Socket Connected to /socket.io Kiswahz_67SWHPrpAAAD
[2025-03-23 18:38:17.427] INFO: [SocketAuthority] Socket Kiswahz_67SWHPrpAAAD disconnected from client "USERNAME" after 320956ms (Reason: ping timeout)
[2025-03-23 22:08:31.488] INFO: [SocketAuthority] Socket Connected to /socket.io RPfADcBr8GWdCZwyAAAF
[2025-03-23 22:08:59.942] FATAL: [Server] Unhandled rejection: Error
    at Database.<anonymous> (/node_modules/sequelize/lib/dialects/sqlite/query.js:185:27)
    at /node_modules/sequelize/lib/dialects/sqlite/query.js:183:50
    at new Promise (<anonymous>)
    at Query.run (/node_modules/sequelize/lib/dialects/sqlite/query.js:183:12)
    at /node_modules/sequelize/lib/sequelize.js:315:28
    at async SQLiteQueryInterface.select (/node_modules/sequelize/lib/dialects/abstract/query-interface.js:407:12)
    at async book.findAll (/node_modules/sequelize/lib/model.js:1140:21)
    at async Promise.all (index 1)
    at async book.findAndCountAll (/node_modules/sequelize/lib/model.js:1322:27)
    at async findAndCountAll (/server/utils/queries/libraryItemsBookFilters.js:368:12) {
  name: 'SequelizeDatabaseError',
  parent: [Error: SQLITE_IOERR: disk I/O error] {
    errno: 10,
    code: 'SQLITE_IOERR',
    sql: "SELECT `book`.`id`, `book`.`title`, `book`.`titleIgnorePrefix`, `book`.`subtitle`, `book`.`publishedYear`, `book`.`publishedDate`, `book`.`publisher`, `book`.`description`, `book`.`isbn`, `book`.`asin`, `book`.`language`, `book`.`explicit`, `book`.`abridged`, `book`.`coverPath`, `book`.`duration`, `book`.`narrators`, `book`.`audioFiles`, `book`.`ebookFile`, `book`.`chapters`, `book`.`tags`, `book`.`genres`, `book`.`createdAt`, `book`.`updatedAt`, `libraryItem`.`id` AS `libraryItem.id`, `libraryItem`.`ino` AS `libraryItem.ino`, `libraryItem`.`path` AS `libraryItem.path`, `libraryItem`.`relPath` AS `libraryItem.relPath`, `libraryItem`.`mediaId` AS `libraryItem.mediaId`, `libraryItem`.`mediaType` AS `libraryItem.mediaType`, `libraryItem`.`isFile` AS `libraryItem.isFile`, `libraryItem`.`isMissing` AS `libraryItem.isMissing`, `libraryItem`.`isInvalid` AS `libraryItem.isInvalid`, `libraryItem`.`mtime` AS `libraryItem.mtime`, `libraryItem`.`ctime` AS `libraryItem.ctime`, `libraryItem`.`birthtime` AS `libraryItem.birthtime`, `libraryItem`.`size` AS `libraryItem.size`, `libraryItem`.`lastScan` AS `libraryItem.lastScan`, `libraryItem`.`lastScanVersion` AS `libraryItem.lastScanVersion`, `libraryItem`.`libraryFiles` AS `libraryItem.libraryFiles`, `libraryItem`.`extraData` AS `libraryItem.extraData`, `libraryItem`.`title` AS `libraryItem.title`, `libraryItem`.`titleIgnorePrefix` AS `libraryItem.titleIgnorePrefix`, `libraryItem`.`authorNamesFirstLast` AS `libraryItem.authorNamesFirstLast`, `libraryItem`.`authorNamesLastFirst` AS `libraryItem.authorNamesLastFirst`, `libraryItem`.`createdAt` AS `libraryItem.createdAt`, `libraryItem`.`updatedAt` AS `libraryItem.updatedAt`, `libraryItem`.`libraryId` AS `libraryItem.libraryId`, `libraryItem`.`libraryFolderId` AS `libraryItem.libraryFolderId`, `series`.`id` AS `series.id`, `series`.`name` AS `series.name`, `series->bookSeries`.`id` AS `series.bookSeries.id`, `series->bookSeries`.`sequence` AS `series.bookSeries.sequence` FROM `books` AS `book` INNER JOIN `libraryItems` AS `libraryItem` ON `book`.`id` = `libraryItem`.`mediaId` AND (`libraryItem`.`libraryId` = '51a80cca-290f-478d-8292-a7cbe8fab5f7' AND `libraryItem`.`mediaType` = 'book') INNER JOIN ( `bookSeries` AS `series->bookSeries` INNER JOIN `series` AS `series` ON `series`.`id` = `series->bookSeries`.`seriesId`) ON `book`.`id` = `series->bookSeries`.`bookId` AND `series`.`id` = 'eb1cf90b-22a3-40ac-9261-9126c24c5adf' WHERE (`book`.`explicit` = 0) ORDER BY CAST(`series.bookSeries.sequence` AS FLOAT) ASC NULLS LAST;"
  },
  original: [Error: SQLITE_IOERR: disk I/O error] {
    errno: 10,
    code: 'SQLITE_IOERR',
    sql: "SELECT `book`.`id`, `book`.`title`, `book`.`titleIgnorePrefix`, `book`.`subtitle`, `book`.`publishedYear`, `book`.`publishedDate`, `book`.`publisher`, `book`.`description`, `book`.`isbn`, `book`.`asin`, `book`.`language`, `book`.`explicit`, `book`.`abridged`, `book`.`coverPath`, `book`.`duration`, `book`.`narrators`, `book`.`audioFiles`, `book`.`ebookFile`, `book`.`chapters`, `book`.`tags`, `book`.`genres`, `book`.`createdAt`, `book`.`updatedAt`, `libraryItem`.`id` AS `libraryItem.id`, `libraryItem`.`ino` AS `libraryItem.ino`, `libraryItem`.`path` AS `libraryItem.path`, `libraryItem`.`relPath` AS `libraryItem.relPath`, `libraryItem`.`mediaId` AS `libraryItem.mediaId`, `libraryItem`.`mediaType` AS `libraryItem.mediaType`, `libraryItem`.`isFile` AS `libraryItem.isFile`, `libraryItem`.`isMissing` AS `libraryItem.isMissing`, `libraryItem`.`isInvalid` AS `libraryItem.isInvalid`, `libraryItem`.`mtime` AS `libraryItem.mtime`, `libraryItem`.`ctime` AS `libraryItem.ctime`, `libraryItem`.`birthtime` AS `libraryItem.birthtime`, `libraryItem`.`size` AS `libraryItem.size`, `libraryItem`.`lastScan` AS `libraryItem.lastScan`, `libraryItem`.`lastScanVersion` AS `libraryItem.lastScanVersion`, `libraryItem`.`libraryFiles` AS `libraryItem.libraryFiles`, `libraryItem`.`extraData` AS `libraryItem.extraData`, `libraryItem`.`title` AS `libraryItem.title`, `libraryItem`.`titleIgnorePrefix` AS `libraryItem.titleIgnorePrefix`, `libraryItem`.`authorNamesFirstLast` AS `libraryItem.authorNamesFirstLast`, `libraryItem`.`authorNamesLastFirst` AS `libraryItem.authorNamesLastFirst`, `libraryItem`.`createdAt` AS `libraryItem.createdAt`, `libraryItem`.`updatedAt` AS `libraryItem.updatedAt`, `libraryItem`.`libraryId` AS `libraryItem.libraryId`, `libraryItem`.`libraryFolderId` AS `libraryItem.libraryFolderId`, `series`.`id` AS `series.id`, `series`.`name` AS `series.name`, `series->bookSeries`.`id` AS `series.bookSeries.id`, `series->bookSeries`.`sequence` AS `series.bookSeries.sequence` FROM `books` AS `book` INNER JOIN `libraryItems` AS `libraryItem` ON `book`.`id` = `libraryItem`.`mediaId` AND (`libraryItem`.`libraryId` = '51a80cca-290f-478d-8292-a7cbe8fab5f7' AND `libraryItem`.`mediaType` = 'book') INNER JOIN ( `bookSeries` AS `series->bookSeries` INNER JOIN `series` AS `series` ON `series`.`id` = `series->bookSeries`.`seriesId`) ON `book`.`id` = `series->bookSeries`.`bookId` AND `series`.`id` = 'eb1cf90b-22a3-40ac-9261-9126c24c5adf' WHERE (`book`.`explicit` = 0) ORDER BY CAST(`series.bookSeries.sequence` AS FLOAT) ASC NULLS LAST;"
  },
  sql: "SELECT `book`.`id`, `book`.`title`, `book`.`titleIgnorePrefix`, `book`.`subtitle`, `book`.`publishedYear`, `book`.`publishedDate`, `book`.`publisher`, `book`.`description`, `book`.`isbn`, `book`.`asin`, `book`.`language`, `book`.`explicit`, `book`.`abridged`, `book`.`coverPath`, `book`.`duration`, `book`.`narrators`, `book`.`audioFiles`, `book`.`ebookFile`, `book`.`chapters`, `book`.`tags`, `book`.`genres`, `book`.`createdAt`, `book`.`updatedAt`, `libraryItem`.`id` AS `libraryItem.id`, `libraryItem`.`ino` AS `libraryItem.ino`, `libraryItem`.`path` AS `libraryItem.path`, `libraryItem`.`relPath` AS `libraryItem.relPath`, `libraryItem`.`mediaId` AS `libraryItem.mediaId`, `libraryItem`.`mediaType` AS `libraryItem.mediaType`, `libraryItem`.`isFile` AS `libraryItem.isFile`, `libraryItem`.`isMissing` AS `libraryItem.isMissing`, `libraryItem`.`isInvalid` AS `libraryItem.isInvalid`, `libraryItem`.`mtime` AS `libraryItem.mtime`, `libraryItem`.`ctime` AS `libraryItem.ctime`, `libraryItem`.`birthtime` AS `libraryItem.birthtime`, `libraryItem`.`size` AS `libraryItem.size`, `libraryItem`.`lastScan` AS `libraryItem.lastScan`, `libraryItem`.`lastScanVersion` AS `libraryItem.lastScanVersion`, `libraryItem`.`libraryFiles` AS `libraryItem.libraryFiles`, `libraryItem`.`extraData` AS `libraryItem.extraData`, `libraryItem`.`title` AS `libraryItem.title`, `libraryItem`.`titleIgnorePrefix` AS `libraryItem.titleIgnorePrefix`, `libraryItem`.`authorNamesFirstLast` AS `libraryItem.authorNamesFirstLast`, `libraryItem`.`authorNamesLastFirst` AS `libraryItem.authorNamesLastFirst`, `libraryItem`.`createdAt` AS `libraryItem.createdAt`, `libraryItem`.`updatedAt` AS `libraryItem.updatedAt`, `libraryItem`.`libraryId` AS `libraryItem.libraryId`, `libraryItem`.`libraryFolderId` AS `libraryItem.libraryFolderId`, `series`.`id` AS `series.id`, `series`.`name` AS `series.name`, `series->bookSeries`.`id` AS `series.bookSeries.id`, `series->bookSeries`.`sequence` AS `series.bookSeries.sequence` FROM `books` AS `book` INNER JOIN `libraryItems` AS `libraryItem` ON `book`.`id` = `libraryItem`.`mediaId` AND (`libraryItem`.`libraryId` = '51a80cca-290f-478d-8292-a7cbe8fab5f7' AND `libraryItem`.`mediaType` = 'book') INNER JOIN ( `bookSeries` AS `series->bookSeries` INNER JOIN `series` AS `series` ON `series`.`id` = `series->bookSeries`.`seriesId`) ON `book`.`id` = `series->bookSeries`.`bookId` AND `series`.`id` = 'eb1cf90b-22a3-40ac-9261-9126c24c5adf' WHERE (`book`.`explicit` = 0) ORDER BY CAST(`series.bookSeries.sequence` AS FLOAT) ASC NULLS LAST;",
  parameters: {}
} 
promise: Promise {
  <rejected> Error
      at Database.<anonymous> (/node_modules/sequelize/lib/dialects/sqlite/query.js:185:27)
      at /node_modules/sequelize/lib/dialects/sqlite/query.js:183:50
      at new Promise (<anonymous>)
      at Query.run (/node_modules/sequelize/lib/dialects/sqlite/query.js:183:12)
      at /node_modules/sequelize/lib/sequelize.js:315:28
      at async SQLiteQueryInterface.select (/node_modules/sequelize/lib/dialects/abstract/query-interface.js:407:12)
      at async book.findAll (/node_modules/sequelize/lib/model.js:1140:21)
      at async Promise.all (index 1)
      at async book.findAndCountAll (/node_modules/sequelize/lib/model.js:1322:27)
      at async findAndCountAll (/server/utils/queries/libraryItemsBookFilters.js:368:12) {
    name: 'SequelizeDatabaseError',
    parent: [Error: SQLITE_IOERR: disk I/O error] {
      errno: 10,
      code: 'SQLITE_IOERR',
      sql: "SELECT `book`.`id`, `book`.`title`, `book`.`titleIgnorePrefix`, `book`.`subtitle`, `book`.`publishedYear`, `book`.`publishedDate`, `book`.`publisher`, `book`.`description`, `book`.`isbn`, `book`.`asin`, `book`.`language`, `book`.`explicit`, `book`.`abridged`, `book`.`coverPath`, `book`.`duration`, `book`.`narrators`, `book`.`audioFiles`, `book`.`ebookFile`, `book`.`chapters`, `book`.`tags`, `book`.`genres`, `book`.`createdAt`, `book`.`updatedAt`, `libraryItem`.`id` AS `libraryItem.id`, `libraryItem`.`ino` AS `libraryItem.ino`, `libraryItem`.`path` AS `libraryItem.path`, `libraryItem`.`relPath` AS `libraryItem.relPath`, `libraryItem`.`mediaId` AS `libraryItem.mediaId`, `libraryItem`.`mediaType` AS `libraryItem.mediaType`, `libraryItem`.`isFile` AS `libraryItem.isFile`, `libraryItem`.`isMissing` AS `libraryItem.isMissing`, `libraryItem`.`isInvalid` AS `libraryItem.isInvalid`, `libraryItem`.`mtime` AS `libraryItem.mtime`, `libraryItem`.`ctime` AS `libraryItem.ctime`, `libraryItem`.`birthtime` AS `libraryItem.birthtime`, `libraryItem`.`size` AS `libraryItem.size`, `libraryItem`.`lastScan` AS `libraryItem.lastScan`, `libraryItem`.`lastScanVersion` AS `libraryItem.lastScanVersion`, `libraryItem`.`libraryFiles` AS `libraryItem.libraryFiles`, `libraryItem`.`extraData` AS `libraryItem.extraData`, `libraryItem`.`title` AS `libraryItem.title`, `libraryItem`.`titleIgnorePrefix` AS `libraryItem.titleIgnorePrefix`, `libraryItem`.`authorNamesFirstLast` AS `libraryItem.authorNamesFirstLast`, `libraryItem`.`authorNamesLastFirst` AS `libraryItem.authorNamesLastFirst`, `libraryItem`.`createdAt` AS `libraryItem.createdAt`, `libraryItem`.`updatedAt` AS `libraryItem.updatedAt`, `libraryItem`.`libraryId` AS `libraryItem.libraryId`, `libraryItem`.`libraryFolderId` AS `libraryItem.libraryFolderId`, `series`.`id` AS `series.id`, `series`.`name` AS `series.name`, `series->bookSeries`.`id` AS `series.bookSeries.id`, `series->bookSeries`.`sequence` AS `series.bookSeries.sequence` FROM `books` AS `book` INNER JOIN `libraryItems` AS `libraryItem` ON `book`.`id` = `libraryItem`.`mediaId` AND (`libraryItem`.`libraryId` = '51a80cca-290f-478d-8292-a7cbe8fab5f7' AND `libraryItem`.`mediaType` = 'book') INNER JOIN ( `bookSeries` AS `series->bookSeries` INNER JOIN `series` AS `series` ON `series`.`id` = `series->bookSeries`.`seriesId`) ON `book`.`id` = `series->bookSeries`.`bookId` AND `series`.`id` = 'eb1cf90b-22a3-40ac-9261-9126c24c5adf' WHERE (`book`.`explicit` = 0) ORDER BY CAST(`series.bookSeries.sequence` AS FLOAT) ASC NULLS LAST;"
    },
    original: [Error: SQLITE_IOERR: disk I/O error] {
      errno: 10,
      code: 'SQLITE_IOERR',
      sql: "SELECT `book`.`id`, `book`.`title`, `book`.`titleIgnorePrefix`, `book`.`subtitle`, `book`.`publishedYear`, `book`.`publishedDate`, `book`.`publisher`, `book`.`description`, `book`.`isbn`, `book`.`asin`, `book`.`language`, `book`.`explicit`, `book`.`abridged`, `book`.`coverPath`, `book`.`duration`, `book`.`narrators`, `book`.`audioFiles`, `book`.`ebookFile`, `book`.`chapters`, `book`.`tags`, `book`.`genres`, `book`.`createdAt`, `book`.`updatedAt`, `libraryItem`.`id` AS `libraryItem.id`, `libraryItem`.`ino` AS `libraryItem.ino`, `libraryItem`.`path` AS `libraryItem.path`, `libraryItem`.`relPath` AS `libraryItem.relPath`, `libraryItem`.`mediaId` AS `libraryItem.mediaId`, `libraryItem`.`mediaType` AS `libraryItem.mediaType`, `libraryItem`.`isFile` AS `libraryItem.isFile`, `libraryItem`.`isMissing` AS `libraryItem.isMissing`, `libraryItem`.`isInvalid` AS `libraryItem.isInvalid`, `libraryItem`.`mtime` AS `libraryItem.mtime`, `libraryItem`.`ctime` AS `libraryItem.ctime`, `libraryItem`.`birthtime` AS `libraryItem.birthtime`, `libraryItem`.`size` AS `libraryItem.size`, `libraryItem`.`lastScan` AS `libraryItem.lastScan`, `libraryItem`.`lastScanVersion` AS `libraryItem.lastScanVersion`, `libraryItem`.`libraryFiles` AS `libraryItem.libraryFiles`, `libraryItem`.`extraData` AS `libraryItem.extraData`, `libraryItem`.`title` AS `libraryItem.title`, `libraryItem`.`titleIgnorePrefix` AS `libraryItem.titleIgnorePrefix`, `libraryItem`.`authorNamesFirstLast` AS `libraryItem.authorNamesFirstLast`, `libraryItem`.`authorNamesLastFirst` AS `libraryItem.authorNamesLastFirst`, `libraryItem`.`createdAt` AS `libraryItem.createdAt`, `libraryItem`.`updatedAt` AS `libraryItem.updatedAt`, `libraryItem`.`libraryId` AS `libraryItem.libraryId`, `libraryItem`.`libraryFolderId` AS `libraryItem.libraryFolderId`, `series`.`id` AS `series.id`, `series`.`name` AS `series.name`, `series->bookSeries`.`id` AS `series.bookSeries.id`, `series->bookSeries`.`sequence` AS `series.bookSeries.sequence` FROM `books` AS `book` INNER JOIN `libraryItems` AS `libraryItem` ON `book`.`id` = `libraryItem`.`mediaId` AND (`libraryItem`.`libraryId` = '51a80cca-290f-478d-8292-a7cbe8fab5f7' AND `libraryItem`.`mediaType` = 'book') INNER JOIN ( `bookSeries` AS `series->bookSeries` INNER JOIN `series` AS `series` ON `series`.`id` = `series->bookSeries`.`seriesId`) ON `book`.`id` = `series->bookSeries`.`bookId` AND `series`.`id` = 'eb1cf90b-22a3-40ac-9261-9126c24c5adf' WHERE (`book`.`explicit` = 0) ORDER BY CAST(`series.bookSeries.sequence` AS FLOAT) ASC NULLS LAST;"
    },
    sql: "SELECT `book`.`id`, `book`.`title`, `book`.`titleIgnorePrefix`, `book`.`subtitle`, `book`.`publishedYear`, `book`.`publishedDate`, `book`.`publisher`, `book`.`description`, `book`.`isbn`, `book`.`asin`, `book`.`language`, `book`.`explicit`, `book`.`abridged`, `book`.`coverPath`, `book`.`duration`, `book`.`narrators`, `book`.`audioFiles`, `book`.`ebookFile`, `book`.`chapters`, `book`.`tags`, `book`.`genres`, `book`.`createdAt`, `book`.`updatedAt`, `libraryItem`.`id` AS `libraryItem.id`, `libraryItem`.`ino` AS `libraryItem.ino`, `libraryItem`.`path` AS `libraryItem.path`, `libraryItem`.`relPath` AS `libraryItem.relPath`, `libraryItem`.`mediaId` AS `libraryItem.mediaId`, `libraryItem`.`mediaType` AS `libraryItem.mediaType`, `libraryItem`.`isFile` AS `libraryItem.isFile`, `libraryItem`.`isMissing` AS `libraryItem.isMissing`, `libraryItem`.`isInvalid` AS `libraryItem.isInvalid`, `libraryItem`.`mtime` AS `libraryItem.mtime`, `libraryItem`.`ctime` AS `libraryItem.ctime`, `libraryItem`.`birthtime` AS `libraryItem.birthtime`, `libraryItem`.`size` AS `libraryItem.size`, `libraryItem`.`lastScan` AS `libraryItem.lastScan`, `libraryItem`.`lastScanVersion` AS `libraryItem.lastScanVersion`, `libraryItem`.`libraryFiles` AS `libraryItem.libraryFiles`, `libraryItem`.`extraData` AS `libraryItem.extraData`, `libraryItem`.`title` AS `libraryItem.title`, `libraryItem`.`titleIgnorePrefix` AS `libraryItem.titleIgnorePrefix`, `libraryItem`.`authorNamesFirstLast` AS `libraryItem.authorNamesFirstLast`, `libraryItem`.`authorNamesLastFirst` AS `libraryItem.authorNamesLastFirst`, `libraryItem`.`createdAt` AS `libraryItem.createdAt`, `libraryItem`.`updatedAt` AS `libraryItem.updatedAt`, `libraryItem`.`libraryId` AS `libraryItem.libraryId`, `libraryItem`.`libraryFolderId` AS `libraryItem.libraryFolderId`, `series`.`id` AS `series.id`, `series`.`name` AS `series.name`, `series->bookSeries`.`id` AS `series.bookSeries.id`, `series->bookSeries`.`sequence` AS `series.bookSeries.sequence` FROM `books` AS `book` INNER JOIN `libraryItems` AS `libraryItem` ON `book`.`id` = `libraryItem`.`mediaId` AND (`libraryItem`.`libraryId` = '51a80cca-290f-478d-8292-a7cbe8fab5f7' AND `libraryItem`.`mediaType` = 'book') INNER JOIN ( `bookSeries` AS `series->bookSeries` INNER JOIN `series` AS `series` ON `series`.`id` = `series->bookSeries`.`seriesId`) ON `book`.`id` = `series->bookSeries`.`bookId` AND `series`.`id` = 'eb1cf90b-22a3-40ac-9261-9126c24c5adf' WHERE (`book`.`explicit` = 0) ORDER BY CAST(`series.bookSeries.sequence` AS FLOAT) ASC NULLS LAST;",
    parameters: {}
  }
}
Running in production mode.

Additional Notes

Happens in the app and on the website.
I tested Android and a Chromium based browser.

Originally created by @Entepotenz on GitHub (Mar 23, 2025). ### What happened? Hello everyone, When visiting a specific audiobook series in the "series" view the server crashes immediately. This error is 100% reproducible with this specific series. I am running audiobookshelf in this environment: Docker (ghcr.io/advplyr/audiobookshelf:latest) ### What did you expect to happen? The server keeps running and if there is a problem I get an error message instead of a crashing server. ### Steps to reproduce the issue 1. Open this specific series ### Audiobookshelf version v2.20.0 ### How are you running audiobookshelf? Docker ### What OS is your Audiobookshelf server hosted from? Linux ### If the issue is being seen in the UI, what browsers are you seeing the problem on? Other (list in "Additional Notes" box) ### Logs ```shell Options: CONFIG_PATH=/config, METADATA_PATH=/metadata, PORT=8080, HOST=undefined, SOURCE=docker, ROUTER_BASE_PATH=/audiobookshelf [2025-03-23 17:37:14.002] INFO: === Starting Server === [2025-03-23 17:37:14.016] INFO: [Server] Init v2.20.0 [2025-03-23 17:37:14.017] INFO: [Server] Node.js Version: v20.19.0 [2025-03-23 17:37:14.017] INFO: [Server] Platform: linux [2025-03-23 17:37:14.017] INFO: [Server] Arch: x64 [2025-03-23 17:37:14.023] INFO: [Database] Initializing db at "/config/absdatabase.sqlite" [2025-03-23 17:37:14.061] INFO: [Database] Loading extension /usr/local/lib/nusqlite3/libnusqlite3.so [2025-03-23 17:37:14.062] INFO: [Database] Successfully loaded extension /usr/local/lib/nusqlite3/libnusqlite3.so [2025-03-23 17:37:14.063] INFO: [Database] Db supports unaccent and unicode foldings [2025-03-23 17:37:14.063] INFO: [Database] Db connection was successful [2025-03-23 17:37:14.076] INFO: [MigrationManager] Database is already up to date. [2025-03-23 17:37:14.412] INFO: [Database] Db initialized with models: user, library, libraryFolder, book, podcast, podcastEpisode, libraryItem, mediaProgress, series, bookSeries, author, bookAuthor, collection, collectionBook, playlist, playlistMediaItem, device, playbackSession, feed, feedEpisode, setting, customMetadataProvider, mediaItemShare [2025-03-23 17:37:14.501] INFO: [Database] running ANALYZE [2025-03-23 17:37:14.513] INFO: [Database] ANALYZE completed [2025-03-23 17:37:14.516] INFO: [LogManager] Init current daily log filename: 2025-03-23.txt [2025-03-23 17:37:14.580] INFO: [BackupManager] 2 Backups Found [2025-03-23 17:37:14.614] INFO: [Watcher] Initializing watcher for "All". [2025-03-23 17:37:14.637] INFO: Listening on port :8080 [2025-03-23 17:37:15.636] INFO: [Watcher] "All" Ready [2025-03-23 17:59:26.925] INFO: [SocketAuthority] Socket Connected to /socket.io EjFobYIG46TjiY9DAAAB [2025-03-23 18:05:13.830] INFO: [SocketAuthority] Socket EjFobYIG46TjiY9DAAAB disconnected from client "USERNAME" after 346904ms (Reason: ping timeout) [2025-03-23 18:32:56.472] INFO: [SocketAuthority] Socket Connected to /socket.io Kiswahz_67SWHPrpAAAD [2025-03-23 18:38:17.427] INFO: [SocketAuthority] Socket Kiswahz_67SWHPrpAAAD disconnected from client "USERNAME" after 320956ms (Reason: ping timeout) [2025-03-23 22:08:31.488] INFO: [SocketAuthority] Socket Connected to /socket.io RPfADcBr8GWdCZwyAAAF [2025-03-23 22:08:59.942] FATAL: [Server] Unhandled rejection: Error at Database.<anonymous> (/node_modules/sequelize/lib/dialects/sqlite/query.js:185:27) at /node_modules/sequelize/lib/dialects/sqlite/query.js:183:50 at new Promise (<anonymous>) at Query.run (/node_modules/sequelize/lib/dialects/sqlite/query.js:183:12) at /node_modules/sequelize/lib/sequelize.js:315:28 at async SQLiteQueryInterface.select (/node_modules/sequelize/lib/dialects/abstract/query-interface.js:407:12) at async book.findAll (/node_modules/sequelize/lib/model.js:1140:21) at async Promise.all (index 1) at async book.findAndCountAll (/node_modules/sequelize/lib/model.js:1322:27) at async findAndCountAll (/server/utils/queries/libraryItemsBookFilters.js:368:12) { name: 'SequelizeDatabaseError', parent: [Error: SQLITE_IOERR: disk I/O error] { errno: 10, code: 'SQLITE_IOERR', sql: "SELECT `book`.`id`, `book`.`title`, `book`.`titleIgnorePrefix`, `book`.`subtitle`, `book`.`publishedYear`, `book`.`publishedDate`, `book`.`publisher`, `book`.`description`, `book`.`isbn`, `book`.`asin`, `book`.`language`, `book`.`explicit`, `book`.`abridged`, `book`.`coverPath`, `book`.`duration`, `book`.`narrators`, `book`.`audioFiles`, `book`.`ebookFile`, `book`.`chapters`, `book`.`tags`, `book`.`genres`, `book`.`createdAt`, `book`.`updatedAt`, `libraryItem`.`id` AS `libraryItem.id`, `libraryItem`.`ino` AS `libraryItem.ino`, `libraryItem`.`path` AS `libraryItem.path`, `libraryItem`.`relPath` AS `libraryItem.relPath`, `libraryItem`.`mediaId` AS `libraryItem.mediaId`, `libraryItem`.`mediaType` AS `libraryItem.mediaType`, `libraryItem`.`isFile` AS `libraryItem.isFile`, `libraryItem`.`isMissing` AS `libraryItem.isMissing`, `libraryItem`.`isInvalid` AS `libraryItem.isInvalid`, `libraryItem`.`mtime` AS `libraryItem.mtime`, `libraryItem`.`ctime` AS `libraryItem.ctime`, `libraryItem`.`birthtime` AS `libraryItem.birthtime`, `libraryItem`.`size` AS `libraryItem.size`, `libraryItem`.`lastScan` AS `libraryItem.lastScan`, `libraryItem`.`lastScanVersion` AS `libraryItem.lastScanVersion`, `libraryItem`.`libraryFiles` AS `libraryItem.libraryFiles`, `libraryItem`.`extraData` AS `libraryItem.extraData`, `libraryItem`.`title` AS `libraryItem.title`, `libraryItem`.`titleIgnorePrefix` AS `libraryItem.titleIgnorePrefix`, `libraryItem`.`authorNamesFirstLast` AS `libraryItem.authorNamesFirstLast`, `libraryItem`.`authorNamesLastFirst` AS `libraryItem.authorNamesLastFirst`, `libraryItem`.`createdAt` AS `libraryItem.createdAt`, `libraryItem`.`updatedAt` AS `libraryItem.updatedAt`, `libraryItem`.`libraryId` AS `libraryItem.libraryId`, `libraryItem`.`libraryFolderId` AS `libraryItem.libraryFolderId`, `series`.`id` AS `series.id`, `series`.`name` AS `series.name`, `series->bookSeries`.`id` AS `series.bookSeries.id`, `series->bookSeries`.`sequence` AS `series.bookSeries.sequence` FROM `books` AS `book` INNER JOIN `libraryItems` AS `libraryItem` ON `book`.`id` = `libraryItem`.`mediaId` AND (`libraryItem`.`libraryId` = '51a80cca-290f-478d-8292-a7cbe8fab5f7' AND `libraryItem`.`mediaType` = 'book') INNER JOIN ( `bookSeries` AS `series->bookSeries` INNER JOIN `series` AS `series` ON `series`.`id` = `series->bookSeries`.`seriesId`) ON `book`.`id` = `series->bookSeries`.`bookId` AND `series`.`id` = 'eb1cf90b-22a3-40ac-9261-9126c24c5adf' WHERE (`book`.`explicit` = 0) ORDER BY CAST(`series.bookSeries.sequence` AS FLOAT) ASC NULLS LAST;" }, original: [Error: SQLITE_IOERR: disk I/O error] { errno: 10, code: 'SQLITE_IOERR', sql: "SELECT `book`.`id`, `book`.`title`, `book`.`titleIgnorePrefix`, `book`.`subtitle`, `book`.`publishedYear`, `book`.`publishedDate`, `book`.`publisher`, `book`.`description`, `book`.`isbn`, `book`.`asin`, `book`.`language`, `book`.`explicit`, `book`.`abridged`, `book`.`coverPath`, `book`.`duration`, `book`.`narrators`, `book`.`audioFiles`, `book`.`ebookFile`, `book`.`chapters`, `book`.`tags`, `book`.`genres`, `book`.`createdAt`, `book`.`updatedAt`, `libraryItem`.`id` AS `libraryItem.id`, `libraryItem`.`ino` AS `libraryItem.ino`, `libraryItem`.`path` AS `libraryItem.path`, `libraryItem`.`relPath` AS `libraryItem.relPath`, `libraryItem`.`mediaId` AS `libraryItem.mediaId`, `libraryItem`.`mediaType` AS `libraryItem.mediaType`, `libraryItem`.`isFile` AS `libraryItem.isFile`, `libraryItem`.`isMissing` AS `libraryItem.isMissing`, `libraryItem`.`isInvalid` AS `libraryItem.isInvalid`, `libraryItem`.`mtime` AS `libraryItem.mtime`, `libraryItem`.`ctime` AS `libraryItem.ctime`, `libraryItem`.`birthtime` AS `libraryItem.birthtime`, `libraryItem`.`size` AS `libraryItem.size`, `libraryItem`.`lastScan` AS `libraryItem.lastScan`, `libraryItem`.`lastScanVersion` AS `libraryItem.lastScanVersion`, `libraryItem`.`libraryFiles` AS `libraryItem.libraryFiles`, `libraryItem`.`extraData` AS `libraryItem.extraData`, `libraryItem`.`title` AS `libraryItem.title`, `libraryItem`.`titleIgnorePrefix` AS `libraryItem.titleIgnorePrefix`, `libraryItem`.`authorNamesFirstLast` AS `libraryItem.authorNamesFirstLast`, `libraryItem`.`authorNamesLastFirst` AS `libraryItem.authorNamesLastFirst`, `libraryItem`.`createdAt` AS `libraryItem.createdAt`, `libraryItem`.`updatedAt` AS `libraryItem.updatedAt`, `libraryItem`.`libraryId` AS `libraryItem.libraryId`, `libraryItem`.`libraryFolderId` AS `libraryItem.libraryFolderId`, `series`.`id` AS `series.id`, `series`.`name` AS `series.name`, `series->bookSeries`.`id` AS `series.bookSeries.id`, `series->bookSeries`.`sequence` AS `series.bookSeries.sequence` FROM `books` AS `book` INNER JOIN `libraryItems` AS `libraryItem` ON `book`.`id` = `libraryItem`.`mediaId` AND (`libraryItem`.`libraryId` = '51a80cca-290f-478d-8292-a7cbe8fab5f7' AND `libraryItem`.`mediaType` = 'book') INNER JOIN ( `bookSeries` AS `series->bookSeries` INNER JOIN `series` AS `series` ON `series`.`id` = `series->bookSeries`.`seriesId`) ON `book`.`id` = `series->bookSeries`.`bookId` AND `series`.`id` = 'eb1cf90b-22a3-40ac-9261-9126c24c5adf' WHERE (`book`.`explicit` = 0) ORDER BY CAST(`series.bookSeries.sequence` AS FLOAT) ASC NULLS LAST;" }, sql: "SELECT `book`.`id`, `book`.`title`, `book`.`titleIgnorePrefix`, `book`.`subtitle`, `book`.`publishedYear`, `book`.`publishedDate`, `book`.`publisher`, `book`.`description`, `book`.`isbn`, `book`.`asin`, `book`.`language`, `book`.`explicit`, `book`.`abridged`, `book`.`coverPath`, `book`.`duration`, `book`.`narrators`, `book`.`audioFiles`, `book`.`ebookFile`, `book`.`chapters`, `book`.`tags`, `book`.`genres`, `book`.`createdAt`, `book`.`updatedAt`, `libraryItem`.`id` AS `libraryItem.id`, `libraryItem`.`ino` AS `libraryItem.ino`, `libraryItem`.`path` AS `libraryItem.path`, `libraryItem`.`relPath` AS `libraryItem.relPath`, `libraryItem`.`mediaId` AS `libraryItem.mediaId`, `libraryItem`.`mediaType` AS `libraryItem.mediaType`, `libraryItem`.`isFile` AS `libraryItem.isFile`, `libraryItem`.`isMissing` AS `libraryItem.isMissing`, `libraryItem`.`isInvalid` AS `libraryItem.isInvalid`, `libraryItem`.`mtime` AS `libraryItem.mtime`, `libraryItem`.`ctime` AS `libraryItem.ctime`, `libraryItem`.`birthtime` AS `libraryItem.birthtime`, `libraryItem`.`size` AS `libraryItem.size`, `libraryItem`.`lastScan` AS `libraryItem.lastScan`, `libraryItem`.`lastScanVersion` AS `libraryItem.lastScanVersion`, `libraryItem`.`libraryFiles` AS `libraryItem.libraryFiles`, `libraryItem`.`extraData` AS `libraryItem.extraData`, `libraryItem`.`title` AS `libraryItem.title`, `libraryItem`.`titleIgnorePrefix` AS `libraryItem.titleIgnorePrefix`, `libraryItem`.`authorNamesFirstLast` AS `libraryItem.authorNamesFirstLast`, `libraryItem`.`authorNamesLastFirst` AS `libraryItem.authorNamesLastFirst`, `libraryItem`.`createdAt` AS `libraryItem.createdAt`, `libraryItem`.`updatedAt` AS `libraryItem.updatedAt`, `libraryItem`.`libraryId` AS `libraryItem.libraryId`, `libraryItem`.`libraryFolderId` AS `libraryItem.libraryFolderId`, `series`.`id` AS `series.id`, `series`.`name` AS `series.name`, `series->bookSeries`.`id` AS `series.bookSeries.id`, `series->bookSeries`.`sequence` AS `series.bookSeries.sequence` FROM `books` AS `book` INNER JOIN `libraryItems` AS `libraryItem` ON `book`.`id` = `libraryItem`.`mediaId` AND (`libraryItem`.`libraryId` = '51a80cca-290f-478d-8292-a7cbe8fab5f7' AND `libraryItem`.`mediaType` = 'book') INNER JOIN ( `bookSeries` AS `series->bookSeries` INNER JOIN `series` AS `series` ON `series`.`id` = `series->bookSeries`.`seriesId`) ON `book`.`id` = `series->bookSeries`.`bookId` AND `series`.`id` = 'eb1cf90b-22a3-40ac-9261-9126c24c5adf' WHERE (`book`.`explicit` = 0) ORDER BY CAST(`series.bookSeries.sequence` AS FLOAT) ASC NULLS LAST;", parameters: {} } promise: Promise { <rejected> Error at Database.<anonymous> (/node_modules/sequelize/lib/dialects/sqlite/query.js:185:27) at /node_modules/sequelize/lib/dialects/sqlite/query.js:183:50 at new Promise (<anonymous>) at Query.run (/node_modules/sequelize/lib/dialects/sqlite/query.js:183:12) at /node_modules/sequelize/lib/sequelize.js:315:28 at async SQLiteQueryInterface.select (/node_modules/sequelize/lib/dialects/abstract/query-interface.js:407:12) at async book.findAll (/node_modules/sequelize/lib/model.js:1140:21) at async Promise.all (index 1) at async book.findAndCountAll (/node_modules/sequelize/lib/model.js:1322:27) at async findAndCountAll (/server/utils/queries/libraryItemsBookFilters.js:368:12) { name: 'SequelizeDatabaseError', parent: [Error: SQLITE_IOERR: disk I/O error] { errno: 10, code: 'SQLITE_IOERR', sql: "SELECT `book`.`id`, `book`.`title`, `book`.`titleIgnorePrefix`, `book`.`subtitle`, `book`.`publishedYear`, `book`.`publishedDate`, `book`.`publisher`, `book`.`description`, `book`.`isbn`, `book`.`asin`, `book`.`language`, `book`.`explicit`, `book`.`abridged`, `book`.`coverPath`, `book`.`duration`, `book`.`narrators`, `book`.`audioFiles`, `book`.`ebookFile`, `book`.`chapters`, `book`.`tags`, `book`.`genres`, `book`.`createdAt`, `book`.`updatedAt`, `libraryItem`.`id` AS `libraryItem.id`, `libraryItem`.`ino` AS `libraryItem.ino`, `libraryItem`.`path` AS `libraryItem.path`, `libraryItem`.`relPath` AS `libraryItem.relPath`, `libraryItem`.`mediaId` AS `libraryItem.mediaId`, `libraryItem`.`mediaType` AS `libraryItem.mediaType`, `libraryItem`.`isFile` AS `libraryItem.isFile`, `libraryItem`.`isMissing` AS `libraryItem.isMissing`, `libraryItem`.`isInvalid` AS `libraryItem.isInvalid`, `libraryItem`.`mtime` AS `libraryItem.mtime`, `libraryItem`.`ctime` AS `libraryItem.ctime`, `libraryItem`.`birthtime` AS `libraryItem.birthtime`, `libraryItem`.`size` AS `libraryItem.size`, `libraryItem`.`lastScan` AS `libraryItem.lastScan`, `libraryItem`.`lastScanVersion` AS `libraryItem.lastScanVersion`, `libraryItem`.`libraryFiles` AS `libraryItem.libraryFiles`, `libraryItem`.`extraData` AS `libraryItem.extraData`, `libraryItem`.`title` AS `libraryItem.title`, `libraryItem`.`titleIgnorePrefix` AS `libraryItem.titleIgnorePrefix`, `libraryItem`.`authorNamesFirstLast` AS `libraryItem.authorNamesFirstLast`, `libraryItem`.`authorNamesLastFirst` AS `libraryItem.authorNamesLastFirst`, `libraryItem`.`createdAt` AS `libraryItem.createdAt`, `libraryItem`.`updatedAt` AS `libraryItem.updatedAt`, `libraryItem`.`libraryId` AS `libraryItem.libraryId`, `libraryItem`.`libraryFolderId` AS `libraryItem.libraryFolderId`, `series`.`id` AS `series.id`, `series`.`name` AS `series.name`, `series->bookSeries`.`id` AS `series.bookSeries.id`, `series->bookSeries`.`sequence` AS `series.bookSeries.sequence` FROM `books` AS `book` INNER JOIN `libraryItems` AS `libraryItem` ON `book`.`id` = `libraryItem`.`mediaId` AND (`libraryItem`.`libraryId` = '51a80cca-290f-478d-8292-a7cbe8fab5f7' AND `libraryItem`.`mediaType` = 'book') INNER JOIN ( `bookSeries` AS `series->bookSeries` INNER JOIN `series` AS `series` ON `series`.`id` = `series->bookSeries`.`seriesId`) ON `book`.`id` = `series->bookSeries`.`bookId` AND `series`.`id` = 'eb1cf90b-22a3-40ac-9261-9126c24c5adf' WHERE (`book`.`explicit` = 0) ORDER BY CAST(`series.bookSeries.sequence` AS FLOAT) ASC NULLS LAST;" }, original: [Error: SQLITE_IOERR: disk I/O error] { errno: 10, code: 'SQLITE_IOERR', sql: "SELECT `book`.`id`, `book`.`title`, `book`.`titleIgnorePrefix`, `book`.`subtitle`, `book`.`publishedYear`, `book`.`publishedDate`, `book`.`publisher`, `book`.`description`, `book`.`isbn`, `book`.`asin`, `book`.`language`, `book`.`explicit`, `book`.`abridged`, `book`.`coverPath`, `book`.`duration`, `book`.`narrators`, `book`.`audioFiles`, `book`.`ebookFile`, `book`.`chapters`, `book`.`tags`, `book`.`genres`, `book`.`createdAt`, `book`.`updatedAt`, `libraryItem`.`id` AS `libraryItem.id`, `libraryItem`.`ino` AS `libraryItem.ino`, `libraryItem`.`path` AS `libraryItem.path`, `libraryItem`.`relPath` AS `libraryItem.relPath`, `libraryItem`.`mediaId` AS `libraryItem.mediaId`, `libraryItem`.`mediaType` AS `libraryItem.mediaType`, `libraryItem`.`isFile` AS `libraryItem.isFile`, `libraryItem`.`isMissing` AS `libraryItem.isMissing`, `libraryItem`.`isInvalid` AS `libraryItem.isInvalid`, `libraryItem`.`mtime` AS `libraryItem.mtime`, `libraryItem`.`ctime` AS `libraryItem.ctime`, `libraryItem`.`birthtime` AS `libraryItem.birthtime`, `libraryItem`.`size` AS `libraryItem.size`, `libraryItem`.`lastScan` AS `libraryItem.lastScan`, `libraryItem`.`lastScanVersion` AS `libraryItem.lastScanVersion`, `libraryItem`.`libraryFiles` AS `libraryItem.libraryFiles`, `libraryItem`.`extraData` AS `libraryItem.extraData`, `libraryItem`.`title` AS `libraryItem.title`, `libraryItem`.`titleIgnorePrefix` AS `libraryItem.titleIgnorePrefix`, `libraryItem`.`authorNamesFirstLast` AS `libraryItem.authorNamesFirstLast`, `libraryItem`.`authorNamesLastFirst` AS `libraryItem.authorNamesLastFirst`, `libraryItem`.`createdAt` AS `libraryItem.createdAt`, `libraryItem`.`updatedAt` AS `libraryItem.updatedAt`, `libraryItem`.`libraryId` AS `libraryItem.libraryId`, `libraryItem`.`libraryFolderId` AS `libraryItem.libraryFolderId`, `series`.`id` AS `series.id`, `series`.`name` AS `series.name`, `series->bookSeries`.`id` AS `series.bookSeries.id`, `series->bookSeries`.`sequence` AS `series.bookSeries.sequence` FROM `books` AS `book` INNER JOIN `libraryItems` AS `libraryItem` ON `book`.`id` = `libraryItem`.`mediaId` AND (`libraryItem`.`libraryId` = '51a80cca-290f-478d-8292-a7cbe8fab5f7' AND `libraryItem`.`mediaType` = 'book') INNER JOIN ( `bookSeries` AS `series->bookSeries` INNER JOIN `series` AS `series` ON `series`.`id` = `series->bookSeries`.`seriesId`) ON `book`.`id` = `series->bookSeries`.`bookId` AND `series`.`id` = 'eb1cf90b-22a3-40ac-9261-9126c24c5adf' WHERE (`book`.`explicit` = 0) ORDER BY CAST(`series.bookSeries.sequence` AS FLOAT) ASC NULLS LAST;" }, sql: "SELECT `book`.`id`, `book`.`title`, `book`.`titleIgnorePrefix`, `book`.`subtitle`, `book`.`publishedYear`, `book`.`publishedDate`, `book`.`publisher`, `book`.`description`, `book`.`isbn`, `book`.`asin`, `book`.`language`, `book`.`explicit`, `book`.`abridged`, `book`.`coverPath`, `book`.`duration`, `book`.`narrators`, `book`.`audioFiles`, `book`.`ebookFile`, `book`.`chapters`, `book`.`tags`, `book`.`genres`, `book`.`createdAt`, `book`.`updatedAt`, `libraryItem`.`id` AS `libraryItem.id`, `libraryItem`.`ino` AS `libraryItem.ino`, `libraryItem`.`path` AS `libraryItem.path`, `libraryItem`.`relPath` AS `libraryItem.relPath`, `libraryItem`.`mediaId` AS `libraryItem.mediaId`, `libraryItem`.`mediaType` AS `libraryItem.mediaType`, `libraryItem`.`isFile` AS `libraryItem.isFile`, `libraryItem`.`isMissing` AS `libraryItem.isMissing`, `libraryItem`.`isInvalid` AS `libraryItem.isInvalid`, `libraryItem`.`mtime` AS `libraryItem.mtime`, `libraryItem`.`ctime` AS `libraryItem.ctime`, `libraryItem`.`birthtime` AS `libraryItem.birthtime`, `libraryItem`.`size` AS `libraryItem.size`, `libraryItem`.`lastScan` AS `libraryItem.lastScan`, `libraryItem`.`lastScanVersion` AS `libraryItem.lastScanVersion`, `libraryItem`.`libraryFiles` AS `libraryItem.libraryFiles`, `libraryItem`.`extraData` AS `libraryItem.extraData`, `libraryItem`.`title` AS `libraryItem.title`, `libraryItem`.`titleIgnorePrefix` AS `libraryItem.titleIgnorePrefix`, `libraryItem`.`authorNamesFirstLast` AS `libraryItem.authorNamesFirstLast`, `libraryItem`.`authorNamesLastFirst` AS `libraryItem.authorNamesLastFirst`, `libraryItem`.`createdAt` AS `libraryItem.createdAt`, `libraryItem`.`updatedAt` AS `libraryItem.updatedAt`, `libraryItem`.`libraryId` AS `libraryItem.libraryId`, `libraryItem`.`libraryFolderId` AS `libraryItem.libraryFolderId`, `series`.`id` AS `series.id`, `series`.`name` AS `series.name`, `series->bookSeries`.`id` AS `series.bookSeries.id`, `series->bookSeries`.`sequence` AS `series.bookSeries.sequence` FROM `books` AS `book` INNER JOIN `libraryItems` AS `libraryItem` ON `book`.`id` = `libraryItem`.`mediaId` AND (`libraryItem`.`libraryId` = '51a80cca-290f-478d-8292-a7cbe8fab5f7' AND `libraryItem`.`mediaType` = 'book') INNER JOIN ( `bookSeries` AS `series->bookSeries` INNER JOIN `series` AS `series` ON `series`.`id` = `series->bookSeries`.`seriesId`) ON `book`.`id` = `series->bookSeries`.`bookId` AND `series`.`id` = 'eb1cf90b-22a3-40ac-9261-9126c24c5adf' WHERE (`book`.`explicit` = 0) ORDER BY CAST(`series.bookSeries.sequence` AS FLOAT) ASC NULLS LAST;", parameters: {} } } Running in production mode. ``` ### Additional Notes Happens in the app and on the website. I tested Android and a Chromium based browser.
adam added the bug label 2026-04-25 00:09:35 +02:00
adam closed this issue 2026-04-25 00:09:36 +02:00
Author
Owner

@nichwall commented on GitHub (Mar 24, 2025):

Looks like there is an issue with your database or disk.

Can you run PRAGMA integrity_check on the database?

Is your database stored on a network drive?

@nichwall commented on GitHub (Mar 24, 2025): Looks like there is an issue with your database or disk. Can you run `PRAGMA integrity_check` on the database? Is your database stored on a network drive?
Author
Owner

@Entepotenz commented on GitHub (Mar 24, 2025):

Thanks for checking my report :-)

The database seems to be fine.

Image

The database sqlite is on a USB SSD attached to my NAS. It is permanently connected.

@Entepotenz commented on GitHub (Mar 24, 2025): Thanks for checking my report :-) The database seems to be fine. <img width="389" alt="Image" src="https://github.com/user-attachments/assets/d63bf00d-d01b-45e0-844a-4be546ddded0" /> The database sqlite is on a USB SSD attached to my NAS. It is permanently connected.
Author
Owner

@Vito0912 commented on GitHub (Mar 25, 2025):

Do you run abs on that NAS?
But in general this error sounds like a SQLite error and not an error ABS would produce. Maybe the USB controller had some problems while performing the write.

What you also could try is to upload the db to an editor and download it. Sometimes it fixes it, although then the error should be a different. But one user said, it fixed it-

@Vito0912 commented on GitHub (Mar 25, 2025): Do you run abs on that NAS? But in general this error sounds like a SQLite error and not an error ABS would produce. Maybe the USB controller had some problems while performing the write. What you also could try is to upload the db to an editor and download it. Sometimes it fixes it, although then the error should be a different. But one user said, it fixed it-
Author
Owner

@Entepotenz commented on GitHub (Mar 30, 2025):

Do you have any suggestion which editor I should use to automagically fix the sqlite database?

@Entepotenz commented on GitHub (Mar 30, 2025): Do you have any suggestion which editor I should use to automagically fix the sqlite database?
Author
Owner

@Vito0912 commented on GitHub (Mar 30, 2025):

I always used https://sqliteonline.com/. But I am not sure if it supports the newest SQLite-Version ABS uses now

@Vito0912 commented on GitHub (Mar 30, 2025): I always used `https://sqliteonline.com/`. But I am not sure if it supports the newest SQLite-Version ABS uses now
Author
Owner

@nichwall commented on GitHub (Mar 31, 2025):

Looks like sqlite online is using SQLite 3.49.1, which is new enough to support the new GROUP_CONCAT usage (see https://github.com/advplyr/audiobookshelf/issues/4134 for more information)

@nichwall commented on GitHub (Mar 31, 2025): Looks like sqlite online is using SQLite 3.49.1, which is new enough to support the new `GROUP_CONCAT` usage (see https://github.com/advplyr/audiobookshelf/issues/4134 for more information)
Author
Owner

@advplyr commented on GitHub (Apr 4, 2025):

Is this resolved?

@advplyr commented on GitHub (Apr 4, 2025): Is this resolved?
Author
Owner

@Entepotenz commented on GitHub (Apr 5, 2025):

At the moment I am on vacation. I will follow up on this topic as soon as I am back :-)

@Entepotenz commented on GitHub (Apr 5, 2025): At the moment I am on vacation. I will follow up on this topic as soon as I am back :-)
Author
Owner

@Entepotenz commented on GitHub (Apr 18, 2025):

Hello everyone,

I am able to reproduce the problem with a complete fresh system.
Turns out the problem is that I am running this container as "read_only" without a mounted tempfs. Sequelize seems to use some tempfs space for some queries.

This is my currently working setup:

---

services:
  audiobookshelf:
    image: ghcr.io/advplyr/audiobookshelf:latest
    read_only: true
    cap_drop:
      - ALL
    security_opt:
      - no-new-privileges:true
    # without tmpfs you will experience SQL errors
    tmpfs:
      - /tmp
    ports:
       - 8080:8080
    environment:
      PORT: 8080
    volumes:
      - /audiobooks/:/audiobooks:rw
      - /docker/audiobookshelf/podcasts:/podcasts:rw
      - /docker/audiobookshelf/metadata:/metadata:rw
      - /docker/audiobookshelf/config:/config:rw
    restart: unless-stopped
    user: 1000:1000
    deploy:
      resources:
        limits:
          memory: 256M
@Entepotenz commented on GitHub (Apr 18, 2025): Hello everyone, I am able to reproduce the problem with a complete fresh system. Turns out the problem is that I am running this container as "read_only" without a mounted tempfs. Sequelize seems to use some tempfs space for some queries. This is my currently working setup: ```yaml --- services: audiobookshelf: image: ghcr.io/advplyr/audiobookshelf:latest read_only: true cap_drop: - ALL security_opt: - no-new-privileges:true # without tmpfs you will experience SQL errors tmpfs: - /tmp ports: - 8080:8080 environment: PORT: 8080 volumes: - /audiobooks/:/audiobooks:rw - /docker/audiobookshelf/podcasts:/podcasts:rw - /docker/audiobookshelf/metadata:/metadata:rw - /docker/audiobookshelf/config:/config:rw restart: unless-stopped user: 1000:1000 deploy: resources: limits: memory: 256M ```
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/audiobookshelf#2685