[Bug]: [podcastUtils] getPodcastFeed Error Error: getaddrinfo EAI_AGAIN feeds.lagedernation.org #2215

Closed
opened 2026-04-25 00:05:04 +02:00 by adam · 8 comments
Owner

Originally created by @ego1105 on GitHub (Aug 30, 2024).

What happened?

The podcast "Lage der Nation" stopped working in abs. I deleted it and tried to re-add it without success. Either by searching for "lage der nation" or by adding "https://feeds.lagedernation.org/feeds/ldn-mp3.xml".

The logs say:
ERROR [podcastUtils] getPodcastFeed Error Error: getaddrinfo EAI_AGAIN feeds.lagedernation.org

What did you expect to happen?

This podcast can be added and episodes are downloaded.

Steps to reproduce the issue

  1. Try to add "lage der nation" podcast
  2. "Failed to get podcast feed" message appears
  3. log messageg appears.

Audiobookshelf version

2.12.3

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?

None

Logs

{"timestamp":"2024-08-30 09:09:35.347","source":"podcastUtils.js:229","message":"[podcastUtils] getPodcastFeed for \"https://feeds.lagedernation.org/feeds/ldn-mp3.xml\"","levelName":"DEBUG","level":1}

{"timestamp":"2024-08-30 09:09:40.352","source":"podcastUtils.js:269","message":"[podcastUtils] getPodcastFeed Error Error: getaddrinfo EAI_AGAIN feeds.lagedernation.org","levelName":"ERROR","level":4}

Additional Notes

Delete and re-add of podcast.
docker compose down and up.

Originally created by @ego1105 on GitHub (Aug 30, 2024). ### What happened? The podcast "Lage der Nation" stopped working in abs. I deleted it and tried to re-add it without success. Either by searching for "lage der nation" or by adding "https://feeds.lagedernation.org/feeds/ldn-mp3.xml". The logs say: ERROR [podcastUtils] getPodcastFeed Error Error: getaddrinfo EAI_AGAIN feeds.lagedernation.org ### What did you expect to happen? This podcast can be added and episodes are downloaded. ### Steps to reproduce the issue 1. Try to add "lage der nation" podcast 2. "Failed to get podcast feed" message appears 3. log messageg appears. ### Audiobookshelf version 2.12.3 ### 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? None ### Logs ```shell {"timestamp":"2024-08-30 09:09:35.347","source":"podcastUtils.js:229","message":"[podcastUtils] getPodcastFeed for \"https://feeds.lagedernation.org/feeds/ldn-mp3.xml\"","levelName":"DEBUG","level":1} {"timestamp":"2024-08-30 09:09:40.352","source":"podcastUtils.js:269","message":"[podcastUtils] getPodcastFeed Error Error: getaddrinfo EAI_AGAIN feeds.lagedernation.org","levelName":"ERROR","level":4} ``` ### Additional Notes Delete and re-add of podcast. docker compose down and up.
adam added the bug label 2026-04-25 00:05:04 +02:00
adam closed this issue 2026-04-25 00:05:04 +02:00
Author
Owner

@advplyr commented on GitHub (Aug 30, 2024):

I tested that podcast and had no issue adding it and downloading episode. So far the EAI_AGAIN issue has been brought up many times and every time it is an issue with the users network.
We can re-open this is if it is shown to be a bug with Abs. Users in the Discord may be able help troubleshoot a network issue.

@advplyr commented on GitHub (Aug 30, 2024): I tested that podcast and had no issue adding it and downloading episode. So far the `EAI_AGAIN` issue has been brought up many times and every time it is an issue with the users network. We can re-open this is if it is shown to be a bug with Abs. Users in the Discord may be able help troubleshoot a network issue.
Author
Owner

@BorisWilhelms commented on GitHub (Sep 6, 2024):

I have the same error on the same feed. DNS seems to work. I am running ABS in a docker container. I am able to curl the feed inside the container, but ABS seems not be able to download the feed.

@BorisWilhelms commented on GitHub (Sep 6, 2024): I have the same error on the same feed. DNS seems to work. I am running ABS in a docker container. I am able to curl the feed inside the container, but ABS seems not be able to download the feed.
Author
Owner

@BorisWilhelms commented on GitHub (Sep 6, 2024):

I did some more testing. I am using the offical docker container running on Raspberry PI. I can resolve the hostname on the PI directly and also inside the container. A curl inside the container also works.

Screenshot from 2024-09-06 14-10-31

So DNS in general seems to work.

Full error

ERROR: [podcastUtils] getPodcastFeed Error AxiosError: getaddrinfo EAI_AGAIN feeds.lagedernation.org
    at GetAddrInfoReqWrap.onlookupall [as oncomplete] (node:dns:120:26) {
  hostname: 'feeds.lagedernation.org',
  syscall: 'getaddrinfo',
  code: 'EAI_AGAIN',
  errno: -3001,
  config: {
    transitional: {
      silentJSONParsing: true,
      forcedJSONParsing: true,
      clarifyTimeoutError: false
    },
    adapter: [Function: httpAdapter],
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 12000,
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    env: { FormData: [Function] },
    validateStatus: [Function: validateStatus],
    headers: {
      Accept: 'application/rss+xml, application/xhtml+xml, application/xml, */*;q=0.8',
      'User-Agent': 'audiobookshelf (+https://audiobookshelf.org; like iTMS)'
    },
    url: 'https://feeds.lagedernation.org/feeds/ldn-mp3.xml',
    method: 'get',
    responseType: 'arraybuffer',
    httpAgent: Agent {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object: null prototype],
      requests: [Object: null prototype] {},
      sockets: [Object: null prototype] {},
      freeSockets: [Object: null prototype] {},
      keepAliveMsecs: 1000,
      keepAlive: false,
      maxSockets: Infinity,
      maxFreeSockets: 256,
      scheduling: 'lifo',
      maxTotalSockets: Infinity,
      totalSocketCount: 0,
      maxCachedSessions: 100,
      _sessionCache: [Object],
      createConnection: [Function (anonymous)],
      [Symbol(shapeMode)]: false,
      [Symbol(kCapture)]: false,
      [Symbol(active)]: true
    },
    httpsAgent: Agent {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object: null prototype],
      requests: [Object: null prototype] {},
      sockets: [Object: null prototype],
      freeSockets: [Object: null prototype] {},
      keepAliveMsecs: 1000,
      keepAlive: false,
      maxSockets: Infinity,
      maxFreeSockets: 256,
      scheduling: 'lifo',
      maxTotalSockets: Infinity,
      totalSocketCount: 1,
      maxCachedSessions: 100,
      _sessionCache: [Object],
      createConnection: [Function (anonymous)],
      [Symbol(shapeMode)]: false,
      [Symbol(kCapture)]: false,
      [Symbol(active)]: true
    },
    data: undefined
  },
  request: <ref *1> Writable {
    _events: {
      close: undefined,
      error: [Function: handleRequestError],
      prefinish: undefined,
      finish: undefined,
      drain: undefined,
      response: [Function: handleResponse],
      socket: [Array],
      timeout: undefined,
      abort: undefined
    },
    _writableState: WritableState {
      highWaterMark: 16384,
      length: 0,
      corked: 0,
      onwrite: [Function: bound onwrite],
      writelen: 0,
      bufferedIndex: 0,
      pendingcb: 0,
      [Symbol(kState)]: 17580812,
      [Symbol(kBufferedValue)]: null
    },
    _maxListeners: undefined,
    _options: {
      maxRedirects: 21,
      maxBodyLength: 10485760,
      protocol: 'https:',
      path: '/feeds/ldn-mp3.xml',
      method: 'GET',
      headers: [Object],
      agent: [Agent],
      agents: [Object],
      auth: undefined,
      hostname: 'feeds.lagedernation.org',
      port: null,
      nativeProtocols: [Object],
      pathname: '/feeds/ldn-mp3.xml'
    },
    _ended: true,
    _ending: true,
    _redirectCount: 0,
    _redirects: [],
    _requestBodyLength: 0,
    _requestBodyBuffers: [],
    _eventsCount: 3,
    _onNativeResponse: [Function (anonymous)],
    _currentRequest: ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 7,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: false,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: false,
      maxRequestsOnConnectionReached: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: false,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      strictContentLength: false,
      _contentLength: 0,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      _closed: false,
      socket: [TLSSocket],
      _header: 'GET /feeds/ldn-mp3.xml HTTP/1.1\r\n' +
        'Accept: application/rss+xml, application/xhtml+xml, application/xml, */*;q=0.8\r\n' +
        'User-Agent: audiobookshelf (+https://audiobookshelf.org; like iTMS)\r\n' +
        'Host: feeds.lagedernation.org\r\n' +
        'Connection: close\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: nop],
      agent: [Agent],
      socketPath: undefined,
      method: 'GET',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      joinDuplicateHeaders: undefined,
      path: '/feeds/ldn-mp3.xml',
      _ended: false,
      res: null,
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'feeds.lagedernation.org',
      protocol: 'https:',
      _redirectable: [Circular *1],
      [Symbol(shapeMode)]: false,
      [Symbol(kCapture)]: false,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kOutHeaders)]: [Object: null prototype],
      [Symbol(errored)]: null,
      [Symbol(kHighWaterMark)]: 16384,
      [Symbol(kRejectNonStandardBodyWrites)]: false,
      [Symbol(kUniqueHeaders)]: null
    },
    _currentUrl: 'https://feeds.lagedernation.org/feeds/ldn-mp3.xml',
    _timeout: null,
    [Symbol(shapeMode)]: true,
    [Symbol(kCapture)]: false
  }
} (podcastUtils.js:269)
@BorisWilhelms commented on GitHub (Sep 6, 2024): I did some more testing. I am using the offical docker container running on Raspberry PI. I can resolve the hostname on the PI directly and also inside the container. A curl inside the container also works. ![Screenshot from 2024-09-06 14-10-31](https://github.com/user-attachments/assets/fc3c341a-c79f-4d83-bc57-0a811cbb1396) So DNS in general seems to work. Full error ``` ERROR: [podcastUtils] getPodcastFeed Error AxiosError: getaddrinfo EAI_AGAIN feeds.lagedernation.org at GetAddrInfoReqWrap.onlookupall [as oncomplete] (node:dns:120:26) { hostname: 'feeds.lagedernation.org', syscall: 'getaddrinfo', code: 'EAI_AGAIN', errno: -3001, config: { transitional: { silentJSONParsing: true, forcedJSONParsing: true, clarifyTimeoutError: false }, adapter: [Function: httpAdapter], transformRequest: [ [Function: transformRequest] ], transformResponse: [ [Function: transformResponse] ], timeout: 12000, xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, maxBodyLength: -1, env: { FormData: [Function] }, validateStatus: [Function: validateStatus], headers: { Accept: 'application/rss+xml, application/xhtml+xml, application/xml, */*;q=0.8', 'User-Agent': 'audiobookshelf (+https://audiobookshelf.org; like iTMS)' }, url: 'https://feeds.lagedernation.org/feeds/ldn-mp3.xml', method: 'get', responseType: 'arraybuffer', httpAgent: Agent { _events: [Object: null prototype], _eventsCount: 2, _maxListeners: undefined, defaultPort: 443, protocol: 'https:', options: [Object: null prototype], requests: [Object: null prototype] {}, sockets: [Object: null prototype] {}, freeSockets: [Object: null prototype] {}, keepAliveMsecs: 1000, keepAlive: false, maxSockets: Infinity, maxFreeSockets: 256, scheduling: 'lifo', maxTotalSockets: Infinity, totalSocketCount: 0, maxCachedSessions: 100, _sessionCache: [Object], createConnection: [Function (anonymous)], [Symbol(shapeMode)]: false, [Symbol(kCapture)]: false, [Symbol(active)]: true }, httpsAgent: Agent { _events: [Object: null prototype], _eventsCount: 2, _maxListeners: undefined, defaultPort: 443, protocol: 'https:', options: [Object: null prototype], requests: [Object: null prototype] {}, sockets: [Object: null prototype], freeSockets: [Object: null prototype] {}, keepAliveMsecs: 1000, keepAlive: false, maxSockets: Infinity, maxFreeSockets: 256, scheduling: 'lifo', maxTotalSockets: Infinity, totalSocketCount: 1, maxCachedSessions: 100, _sessionCache: [Object], createConnection: [Function (anonymous)], [Symbol(shapeMode)]: false, [Symbol(kCapture)]: false, [Symbol(active)]: true }, data: undefined }, request: <ref *1> Writable { _events: { close: undefined, error: [Function: handleRequestError], prefinish: undefined, finish: undefined, drain: undefined, response: [Function: handleResponse], socket: [Array], timeout: undefined, abort: undefined }, _writableState: WritableState { highWaterMark: 16384, length: 0, corked: 0, onwrite: [Function: bound onwrite], writelen: 0, bufferedIndex: 0, pendingcb: 0, [Symbol(kState)]: 17580812, [Symbol(kBufferedValue)]: null }, _maxListeners: undefined, _options: { maxRedirects: 21, maxBodyLength: 10485760, protocol: 'https:', path: '/feeds/ldn-mp3.xml', method: 'GET', headers: [Object], agent: [Agent], agents: [Object], auth: undefined, hostname: 'feeds.lagedernation.org', port: null, nativeProtocols: [Object], pathname: '/feeds/ldn-mp3.xml' }, _ended: true, _ending: true, _redirectCount: 0, _redirects: [], _requestBodyLength: 0, _requestBodyBuffers: [], _eventsCount: 3, _onNativeResponse: [Function (anonymous)], _currentRequest: ClientRequest { _events: [Object: null prototype], _eventsCount: 7, _maxListeners: undefined, outputData: [], outputSize: 0, writable: true, destroyed: false, _last: true, chunkedEncoding: false, shouldKeepAlive: false, maxRequestsOnConnectionReached: false, _defaultKeepAlive: true, useChunkedEncodingByDefault: false, sendDate: false, _removedConnection: false, _removedContLen: false, _removedTE: false, strictContentLength: false, _contentLength: 0, _hasBody: true, _trailer: '', finished: true, _headerSent: true, _closed: false, socket: [TLSSocket], _header: 'GET /feeds/ldn-mp3.xml HTTP/1.1\r\n' + 'Accept: application/rss+xml, application/xhtml+xml, application/xml, */*;q=0.8\r\n' + 'User-Agent: audiobookshelf (+https://audiobookshelf.org; like iTMS)\r\n' + 'Host: feeds.lagedernation.org\r\n' + 'Connection: close\r\n' + '\r\n', _keepAliveTimeout: 0, _onPendingData: [Function: nop], agent: [Agent], socketPath: undefined, method: 'GET', maxHeaderSize: undefined, insecureHTTPParser: undefined, joinDuplicateHeaders: undefined, path: '/feeds/ldn-mp3.xml', _ended: false, res: null, aborted: false, timeoutCb: null, upgradeOrConnect: false, parser: null, maxHeadersCount: null, reusedSocket: false, host: 'feeds.lagedernation.org', protocol: 'https:', _redirectable: [Circular *1], [Symbol(shapeMode)]: false, [Symbol(kCapture)]: false, [Symbol(kBytesWritten)]: 0, [Symbol(kNeedDrain)]: false, [Symbol(corked)]: 0, [Symbol(kOutHeaders)]: [Object: null prototype], [Symbol(errored)]: null, [Symbol(kHighWaterMark)]: 16384, [Symbol(kRejectNonStandardBodyWrites)]: false, [Symbol(kUniqueHeaders)]: null }, _currentUrl: 'https://feeds.lagedernation.org/feeds/ldn-mp3.xml', _timeout: null, [Symbol(shapeMode)]: true, [Symbol(kCapture)]: false } } (podcastUtils.js:269) ```
Author
Owner

@BorisWilhelms commented on GitHub (Sep 7, 2024):

Going down the rabbithole. I captured DNS traffic of the container. DNS query from ABS is successful, but seems to prefer AAAA (IPv6), as it continues to try to get the AAAA record.

image

Here in example of DNS requests, that are made by curl (within the container)
image

There might be something in the HTTP library, that is used by ABS. I will check if I find something

@BorisWilhelms commented on GitHub (Sep 7, 2024): Going down the rabbithole. I captured DNS traffic of the container. DNS query from ABS is successful, but seems to prefer AAAA (IPv6), as it continues to try to get the AAAA record. ![image](https://github.com/user-attachments/assets/079a252c-9b25-454c-b51b-8c4905c78651) Here in example of DNS requests, that are made by curl (within the container) ![image](https://github.com/user-attachments/assets/02ae0c91-5f5f-4ca4-a94f-7885929e1a81) There might be something in the HTTP library, that is used by ABS. I will check if I find something
Author
Owner

@BorisWilhelms commented on GitHub (Sep 7, 2024):

Ok, I really went down the rabbit hole. The issue is a combination of DNS responses from feeds.lagedernation.org DNS server and the DNS resolver used in Alpine. To be clear: This is NOT an issue with ABS.

The issue happens only in Alpine based images, since the DNS resolver seems to be very strict (https://gitlab.alpinelinux.org/alpine/aports/-/issues/15762). When the domain is resolved the DNS resolver asks for A (ipv4) and AAAA (ipv6) records. The DNS server of feeds.lagedernation.org responses with SERVFAIL for the AAAA records, which causes the Alpine DNS resolver to abort the resolving process.

DNS resolvers in NON Alpine based images are more "relaxed" and it works.

Possible solutions:

  • Provide a non Alpine based image (e.g. bookworm-slim)
  • Disable IPv6 on the container adding the following to my docker-compose.yml worked for me
    sysctls:
      net.ipv6.conf.all.disable_ipv6: 1

btw @advplyr thank you for your greate work with ABS!

@BorisWilhelms commented on GitHub (Sep 7, 2024): Ok, I really went down the rabbit hole. The issue is a combination of DNS responses from feeds.lagedernation.org DNS server and the DNS resolver used in Alpine. **To be clear: This is NOT an issue with ABS.** The issue happens only in Alpine based images, since the DNS resolver seems to be very strict (https://gitlab.alpinelinux.org/alpine/aports/-/issues/15762). When the domain is resolved the DNS resolver asks for A (ipv4) and AAAA (ipv6) records. The DNS server of feeds.lagedernation.org responses with SERVFAIL for the AAAA records, which causes the Alpine DNS resolver to abort the resolving process. DNS resolvers in NON Alpine based images are more "relaxed" and it works. Possible solutions: - Provide a non Alpine based image (e.g. bookworm-slim) - Disable IPv6 on the container adding the following to my docker-compose.yml worked for me ``` sysctls: net.ipv6.conf.all.disable_ipv6: 1 ``` btw @advplyr thank you for your greate work with ABS!
Author
Owner

@ego1105 commented on GitHub (Sep 7, 2024):

Thanks Boris,
great that you found two possible solutions. Meanwhile I switched from Docker to LXC on my Proxmox for ABS, which doesn't have the DNS issues.

@ego1105 commented on GitHub (Sep 7, 2024): Thanks Boris, great that you found two possible solutions. Meanwhile I switched from Docker to LXC on my Proxmox for ABS, which doesn't have the DNS issues.
Author
Owner

@Smith4545 commented on GitHub (Oct 19, 2024):

The following patch would be the alternative solution (to @BorisWilhelms solution of switching off IPv6), by switching to a Debian-based node image:

diff --git a/Dockerfile b/Dockerfile
index 0d4629f8..e9638eb0 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,17 +1,17 @@
 ### STAGE 0: Build client ###
-FROM node:20-alpine AS build
+FROM node:20-bookworm-slim AS build
 WORKDIR /client
 COPY /client /client
 RUN npm ci && npm cache clean --force
 RUN npm run generate
 
 ### STAGE 1: Build server ###
-FROM node:20-alpine
+FROM node:20-bookworm-slim
 
 ENV NODE_ENV=production
 
-RUN apk update && \
-  apk add --no-cache --update \
+RUN apt update && \
+  apt install -y \
   curl \
   tzdata \
   ffmpeg \
@@ -32,9 +32,9 @@ ENV NUSQLITE3_PATH="${NUSQLITE3_DIR}/libnusqlite3.so"
 
 RUN case "$TARGETPLATFORM" in \
   "linux/amd64") \
-  curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-musl-x64.zip" ;; \
+  curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-x64.zip" ;; \
   "linux/arm64") \
-  curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-musl-arm64.zip" ;; \
+  curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-arm64.zip" ;; \
   *) echo "Unsupported platform: $TARGETPLATFORM" && exit 1 ;; \
   esac && \
   unzip /tmp/library.zip -d $NUSQLITE3_DIR && \
@@ -42,7 +42,12 @@ RUN case "$TARGETPLATFORM" in \
 
 RUN npm ci --only=production
 
-RUN apk del make python3 g++
+RUN apt purge -y \
+  make \
+  python3 \
+  g++ && \
+  apt autopurge -y && \
+  apt clean
 
 EXPOSE 80

Build with something like: docker build -t audiobookshelf/audiobookshelf-local:latest .

@Smith4545 commented on GitHub (Oct 19, 2024): The following patch would be the alternative solution (to @BorisWilhelms solution of switching off IPv6), by switching to a Debian-based node image: ```diff diff --git a/Dockerfile b/Dockerfile index 0d4629f8..e9638eb0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,17 @@ ### STAGE 0: Build client ### -FROM node:20-alpine AS build +FROM node:20-bookworm-slim AS build WORKDIR /client COPY /client /client RUN npm ci && npm cache clean --force RUN npm run generate ### STAGE 1: Build server ### -FROM node:20-alpine +FROM node:20-bookworm-slim ENV NODE_ENV=production -RUN apk update && \ - apk add --no-cache --update \ +RUN apt update && \ + apt install -y \ curl \ tzdata \ ffmpeg \ @@ -32,9 +32,9 @@ ENV NUSQLITE3_PATH="${NUSQLITE3_DIR}/libnusqlite3.so" RUN case "$TARGETPLATFORM" in \ "linux/amd64") \ - curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-musl-x64.zip" ;; \ + curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-x64.zip" ;; \ "linux/arm64") \ - curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-musl-arm64.zip" ;; \ + curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-arm64.zip" ;; \ *) echo "Unsupported platform: $TARGETPLATFORM" && exit 1 ;; \ esac && \ unzip /tmp/library.zip -d $NUSQLITE3_DIR && \ @@ -42,7 +42,12 @@ RUN case "$TARGETPLATFORM" in \ RUN npm ci --only=production -RUN apk del make python3 g++ +RUN apt purge -y \ + make \ + python3 \ + g++ && \ + apt autopurge -y && \ + apt clean EXPOSE 80 ``` Build with something like: `docker build -t audiobookshelf/audiobookshelf-local:latest .`
Author
Owner

@PassionateBytes commented on GitHub (Dec 14, 2025):

Hey all, just want to highlight that I've been able to address this issue in #4885, by manually handling DNS resolution (and partial errors thereoff), rather than relying on axios' (and under the hood node's) built-in name resolution.

My PR is not yet accepted, but I would like to ask people to build and test my fix (using EXP_DNS_RESOLUTION=1), to validate that this works reliably, then leave feedback on the PR page itself.

Thanks all!

@PassionateBytes commented on GitHub (Dec 14, 2025): Hey all, just want to highlight that I've been able to address this issue in #4885, by manually handling DNS resolution (and partial errors thereoff), rather than relying on axios' (and under the hood node's) built-in name resolution. My PR is not yet accepted, but I would like to ask people to build and test my fix (using `EXP_DNS_RESOLUTION=1`), to validate that this works reliably, then leave feedback on the PR page itself. Thanks all!
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/audiobookshelf#2215